diff --git a/exclude-eof-from-result.patch b/exclude-eof-from-result.patch deleted file mode 100644 index fecb494..0000000 --- a/exclude-eof-from-result.patch +++ /dev/null @@ -1,40 +0,0 @@ ---- delegator.py-0.1.1/delegator.py.orig 2018-09-18 02:35:34.000000000 +0700 -+++ delegator.py-0.1.1/delegator.py 2019-03-08 00:53:35.605573650 +0700 -@@ -7,6 +7,8 @@ - import errno - - from pexpect.popen_spawn import PopenSpawn -+import pexpect -+pexpect.EOF.__module__ = "pexpect.exceptions" - - # Include `unicode` in STR_TYPES for Python 2.X - try: -@@ -110,7 +112,7 @@ - if self.subprocess.before: - result += self.subprocess.before - -- if self.subprocess.after: -+ if self.subprocess.after and self.subprocess.after is not pexpect.EOF: - result += self.subprocess.after - - result += self.subprocess.read() -@@ -205,7 +207,10 @@ - if self.blocking: - raise RuntimeError("expect can only be used on non-blocking commands.") - -- self.subprocess.expect(pattern=pattern, timeout=timeout) -+ try: -+ self.subprocess.expect(pattern=pattern, timeout=timeout) -+ except pexpect.EOF: -+ pass - - def send(self, s, end=os.linesep, signal=False): - """Sends the given string or signal to std_in.""" -@@ -263,7 +268,6 @@ - c.run(block=False, cwd=cwd) - if data: - c.send(data) -- c.subprocess.sendeof() - c.block() - return c - diff --git a/merged_pr_62.patch b/merged_pr_62.patch new file mode 100644 index 0000000..2714404 --- /dev/null +++ b/merged_pr_62.patch @@ -0,0 +1,157 @@ +From 9bb7790d6ad54a238f57cce8ad93a811ef302268 Mon Sep 17 00:00:00 2001 +From: Dan Ryan +Date: Mon, 22 Oct 2018 09:42:40 -0400 +Subject: [PATCH 1/3] Explicitly close file handles on block + +- Fixes #61 + +Signed-off-by: Dan Ryan +--- + delegator.py | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/delegator.py b/delegator.py +index d15aeb9..9eb430d 100644 +--- a/delegator.py ++++ b/delegator.py +@@ -233,6 +233,8 @@ def kill(self): + def block(self): + """Blocks until process is complete.""" + if self._uses_subprocess: ++ # Close open file handles to prevent leaking them ++ self.subprocess.stdout.close() + # consume stdout and stderr + try: + stdout, stderr = self.subprocess.communicate() +@@ -241,6 +243,8 @@ def block(self): + except ValueError: + pass # Don't read from finished subprocesses. + else: ++ self.subprocess.sendeof() ++ self.subprocess.proc.stdout.close() + self.subprocess.wait() + + def pipe(self, command, timeout=None, cwd=None): + +From eddd9d14e50f7945faf99cac92ef33ab18b1342b Mon Sep 17 00:00:00 2001 +From: Dan Ryan +Date: Mon, 22 Oct 2018 10:04:15 -0400 +Subject: [PATCH 2/3] Don't pass `subprocess.PIPE` to blocking Popen calls + +Signed-off-by: Dan Ryan +--- + delegator.py | 23 ++++++++++++++--------- + 1 file changed, 14 insertions(+), 9 deletions(-) + +diff --git a/delegator.py b/delegator.py +index 9eb430d..3ffb2e3 100644 +--- a/delegator.py ++++ b/delegator.py +@@ -178,6 +178,7 @@ def run(self, block=True, binary=False, cwd=None, env=None): + # Use subprocess. + if self.blocking: + popen_kwargs = self._default_popen_kwargs.copy() ++ del popen_kwargs["stdin"] + popen_kwargs["universal_newlines"] = not binary + if cwd: + popen_kwargs["cwd"] = cwd +@@ -233,19 +234,23 @@ def kill(self): + def block(self): + """Blocks until process is complete.""" + if self._uses_subprocess: +- # Close open file handles to prevent leaking them +- self.subprocess.stdout.close() + # consume stdout and stderr +- try: +- stdout, stderr = self.subprocess.communicate() +- self.__out = stdout +- self.__err = stderr +- except ValueError: +- pass # Don't read from finished subprocesses. ++ if self.blocking: ++ try: ++ stdout, stderr = self.subprocess.communicate() ++ self.__out = stdout ++ self.__err = stderr ++ except ValueError: ++ pass # Don't read from finished subprocesses. ++ else: ++ self.subprocess.stdin.close() ++ self.std_out.close() ++ self.std_err.close() ++ self.subprocess.wait() + else: + self.subprocess.sendeof() +- self.subprocess.proc.stdout.close() + self.subprocess.wait() ++ self.subprocess.proc.stdout.close() + + def pipe(self, command, timeout=None, cwd=None): + """Runs the current command and passes its output to the next + +From d07d065ef3ae5f7b637214a9fe193a4c642126cb Mon Sep 17 00:00:00 2001 +From: Dan Ryan +Date: Tue, 23 Oct 2018 18:53:27 -0400 +Subject: [PATCH 3/3] Don't pass `EOF` to the caller + +Signed-off-by: Dan Ryan +--- + delegator.py | 17 ++++++++++++----- + 1 file changed, 12 insertions(+), 5 deletions(-) + +diff --git a/delegator.py b/delegator.py +index 3ffb2e3..56d1245 100644 +--- a/delegator.py ++++ b/delegator.py +@@ -7,6 +7,8 @@ + import errno + + from pexpect.popen_spawn import PopenSpawn ++import pexpect ++pexpect.EOF.__module__ = "pexpect.exceptions" + + # Include `unicode` in STR_TYPES for Python 2.X + try: +@@ -110,7 +112,7 @@ def _pexpect_out(self): + if self.subprocess.before: + result += self.subprocess.before + +- if self.subprocess.after: ++ if self.subprocess.after and self.subprocess.after is not pexpect.EOF: + result += self.subprocess.after + + result += self.subprocess.read() +@@ -206,7 +208,10 @@ def expect(self, pattern, timeout=-1): + if self.blocking: + raise RuntimeError("expect can only be used on non-blocking commands.") + +- self.subprocess.expect(pattern=pattern, timeout=timeout) ++ try: ++ self.subprocess.expect(pattern=pattern, timeout=timeout) ++ except pexpect.EOF: ++ pass + + def send(self, s, end=os.linesep, signal=False): + """Sends the given string or signal to std_in.""" +@@ -249,8 +254,11 @@ def block(self): + self.subprocess.wait() + else: + self.subprocess.sendeof() +- self.subprocess.wait() +- self.subprocess.proc.stdout.close() ++ try: ++ self.subprocess.wait() ++ finally: ++ if self.subprocess.proc.stdout: ++ self.subprocess.proc.stdout.close() + + def pipe(self, command, timeout=None, cwd=None): + """Runs the current command and passes its output to the next +@@ -272,7 +280,6 @@ def pipe(self, command, timeout=None, cwd=None): + c.run(block=False, cwd=cwd) + if data: + c.send(data) +- c.subprocess.sendeof() + c.block() + return c + diff --git a/python-delegator.py.changes b/python-delegator.py.changes index 433c450..a52b7da 100644 --- a/python-delegator.py.changes +++ b/python-delegator.py.changes @@ -1,3 +1,8 @@ +------------------------------------------------------------------- +Sun Oct 23 09:43:15 UTC 2022 - John Vandenberg + +- Replace custom exclude-eof-from-result.patch with merged_pr_62.patch + ------------------------------------------------------------------- Fri Mar 15 18:51:31 UTC 2019 - Jan Engelhardt diff --git a/python-delegator.py.spec b/python-delegator.py.spec index db4c921..868873d 100644 --- a/python-delegator.py.spec +++ b/python-delegator.py.spec @@ -1,7 +1,7 @@ # # spec file for package python-delegator.py # -# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -23,10 +23,10 @@ Release: 0 Summary: Python library for dealing with subprocesses License: MIT Group: Development/Languages/Python -Url: https://github.com/kennethreitz/delegator.py +URL: https://github.com/kennethreitz/delegator.py Source: https://files.pythonhosted.org/packages/source/d/delegator.py/delegator.py-%{version}.tar.gz Source1: https://raw.githubusercontent.com/kennethreitz/delegator.py/master/tests/test_chain.py -Patch0: exclude-eof-from-result.patch +Patch0: merged_pr_62.patch BuildRequires: %{python_module pexpect >= 4.1.0} BuildRequires: %{python_module pytest} BuildRequires: %{python_module setuptools}