Hello community,

here is the log from the commit of package python-subprocess32 for 
openSUSE:Factory checked in at 2019-05-28 09:41:43
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-subprocess32 (Old)
 and      /work/SRC/openSUSE:Factory/.python-subprocess32.new.5148 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-subprocess32"

Tue May 28 09:41:43 2019 rev:5 rq:705298 version:3.5.4

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-subprocess32/python-subprocess32.changes  
2019-01-15 09:13:04.766419040 +0100
+++ 
/work/SRC/openSUSE:Factory/.python-subprocess32.new.5148/python-subprocess32.changes
        2019-05-28 09:41:44.949875770 +0200
@@ -1,0 +2,9 @@
+Fri May 24 19:34:16 UTC 2019 - Tomáš Chvátal <tchva...@suse.com>
+
+- Update to 3.5.4:
+  * TimeoutExpired and CalledProcessError exceptions can now
+    be unpickled.
+  * Backport the fixes for https://bugs.python.org/issue10963,
+  https://bugs.python.org/issue19612, and https://bugs.python.org/issue30418.
+
+-------------------------------------------------------------------

Old:
----
  subprocess32-3.5.3.tar.gz

New:
----
  subprocess32-3.5.4.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-subprocess32.spec ++++++
--- /var/tmp/diff_new_pack.of5qVJ/_old  2019-05-28 09:41:45.817875469 +0200
+++ /var/tmp/diff_new_pack.of5qVJ/_new  2019-05-28 09:41:45.817875469 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-subprocess32
 #
-# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany.
+# Copyright (c) 2019 SUSE LINUX GmbH, Nuernberg, Germany.
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -12,7 +12,7 @@
 # license that conforms to the Open Source Definition (Version 1.9)
 # published by the Open Source Initiative.
 
-# Please submit bugfixes or comments via http://bugs.opensuse.org/
+# Please submit bugfixes or comments via https://bugs.opensuse.org/
 #
 
 
@@ -20,7 +20,7 @@
 # Note: this package is python 2.x-only.
 %define skip_python3 1
 Name:           python-subprocess32
-Version:        3.5.3
+Version:        3.5.4
 Release:        0
 Summary:        A backport of the subprocess module from Python 3.2/3.3 for 
use on 2.x
 License:        Python-2.0
@@ -29,10 +29,10 @@
 Source:         
https://files.pythonhosted.org/packages/source/s/subprocess32/subprocess32-%{version}.tar.gz
 BuildRequires:  %{python_module devel}
 BuildRequires:  %{python_module setuptools}
+BuildRequires:  python-rpm-macros
 %if 0%{?rhel} || 0%{?fedora}
 BuildRequires:  python-test
 %endif
-BuildRequires:  python-rpm-macros
 %python_subpackages
 
 %description

++++++ subprocess32-3.5.3.tar.gz -> subprocess32-3.5.4.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/subprocess32-3.5.3/ChangeLog 
new/subprocess32-3.5.4/ChangeLog
--- old/subprocess32-3.5.3/ChangeLog    2018-10-10 00:12:07.000000000 +0200
+++ new/subprocess32-3.5.4/ChangeLog    2019-05-21 00:08:37.000000000 +0200
@@ -1,7 +1,28 @@
 -----------------
+2019-05-20 3.5.4
+-----------------
+ * Promoted 3.5.4rc2 to become 3.5.4.
+
+-----------------
+2019-05-13 3.5.4rc2
+-----------------
+ * GitHub [#57]: TimeoutExpired and CalledProcessError exceptions can now
+   be unpickled.
+
+-----------------
+2019-05-10 3.5.4rc1
+-----------------
+* GitHub [#61]: Backport the fixes for https://bugs.python.org/issue10963,
+  https://bugs.python.org/issue19612, and https://bugs.python.org/issue30418.
+  When a child process was so short lived it dies or closes its pipes before
+  you call communicate().  When supplying stdin or reading its output in
+  this scenario, do not raise an unexpected broken pipe or interrupted
+  system call exception.
+
+-----------------
 2018-10-09 3.5.3
 -----------------
-* Disallow rediculiously large numbers (millions) of arguments.  [#54]
+* Disallow ridiculously large numbers (millions) of arguments.  [#54]
 
 -----------------
 2018-06-07 3.5.2
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/subprocess32-3.5.3/PKG-INFO 
new/subprocess32-3.5.4/PKG-INFO
--- old/subprocess32-3.5.3/PKG-INFO     2018-10-10 00:13:43.000000000 +0200
+++ new/subprocess32-3.5.4/PKG-INFO     2019-05-21 00:10:13.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: subprocess32
-Version: 3.5.3
+Version: 3.5.4
 Summary: A backport of the subprocess module from Python 3 for use on 2.x.
 Home-page: https://github.com/google/python-subprocess32
 Maintainer: Gregory P. Smith
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/subprocess32-3.5.3/setup.py 
new/subprocess32-3.5.4/setup.py
--- old/subprocess32-3.5.3/setup.py     2018-10-10 00:12:07.000000000 +0200
+++ new/subprocess32-3.5.4/setup.py     2019-05-21 00:08:37.000000000 +0200
@@ -66,7 +66,7 @@
 
     setup(
       name='subprocess32',
-      version='3.5.3',
+      version='3.5.4',
       description='A backport of the subprocess module from Python 3 for use 
on 2.x.',
       long_description="""\
 This is a backport of the subprocess standard library module from
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/subprocess32-3.5.3/subprocess32.egg-info/PKG-INFO 
new/subprocess32-3.5.4/subprocess32.egg-info/PKG-INFO
--- old/subprocess32-3.5.3/subprocess32.egg-info/PKG-INFO       2018-10-10 
00:13:43.000000000 +0200
+++ new/subprocess32-3.5.4/subprocess32.egg-info/PKG-INFO       2019-05-21 
00:10:13.000000000 +0200
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: subprocess32
-Version: 3.5.3
+Version: 3.5.4
 Summary: A backport of the subprocess module from Python 3 for use on 2.x.
 Home-page: https://github.com/google/python-subprocess32
 Maintainer: Gregory P. Smith
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/subprocess32-3.5.3/subprocess32.py 
new/subprocess32-3.5.4/subprocess32.py
--- old/subprocess32-3.5.3/subprocess32.py      2018-10-10 00:12:07.000000000 
+0200
+++ new/subprocess32-3.5.4/subprocess32.py      2019-05-21 00:08:37.000000000 
+0200
@@ -41,6 +41,7 @@
 mswindows = (sys.platform == "win32")
 
 import os
+import errno
 import exceptions
 import types
 import time
@@ -64,6 +65,8 @@
         self.cmd = cmd
         self.output = output
         self.stderr = stderr
+        super(CalledProcessError, self).__init__(returncode, cmd,
+                                                 output, stderr)
 
     def __str__(self):
         if self.returncode and self.returncode < 0:
@@ -99,6 +102,7 @@
         self.timeout = timeout
         self.output = output
         self.stderr = stderr
+        super(TimeoutExpired, self).__init__(cmd, timeout, output, stderr)
 
     def __str__(self):
         return ("Command '%s' timed out after %s seconds" %
@@ -132,7 +136,6 @@
 else:
     import select
     _has_poll = hasattr(select, 'poll')
-    import errno
     import fcntl
     import pickle
 
@@ -682,6 +685,29 @@
             self._devnull = os.open(os.devnull, os.O_RDWR)
         return self._devnull
 
+    def _stdin_write(self, input):
+        if input:
+            try:
+                self.stdin.write(input)
+            except EnvironmentError as e:
+                if e.errno == errno.EPIPE:
+                    # communicate() must ignore broken pipe error
+                    pass
+                elif e.errno == errno.EINVAL :
+                    # bpo-19612, bpo-30418: On Windows, stdin.write() fails
+                    # with EINVAL if the child process exited or if the child
+                    # process is still running but closed the pipe.
+                    pass
+                else:
+                    raise
+
+        try:
+            self.stdin.close()
+        except EnvironmentError as e:
+            if e.errno in (errno.EPIPE, errno.EINVAL):
+                pass
+            else:
+                raise
 
     def communicate(self, input=None, timeout=None):
         """Interact with process: Send data to stdin.  Read data from
@@ -708,9 +734,7 @@
             stdout = None
             stderr = None
             if self.stdin:
-                if input:
-                    self.stdin.write(input)
-                self.stdin.close()
+                self._stdin_write(input)
             elif self.stdout:
                 stdout = _eintr_retry_call(self.stdout.read)
                 self.stdout.close()
@@ -983,9 +1007,7 @@
                 self.stderr_thread.start()
 
             if self.stdin:
-                if input is not None:
-                    self.stdin.write(input)
-                self.stdin.close()
+                self._stdin_write(input)
 
             # Wait for the reader threads, or time out.  If we time out, the
             # threads remain reading and the fds left open in case the user
@@ -1681,11 +1703,19 @@
                 if self.stdin in wlist:
                     chunk = self._input[self._input_offset :
                                         self._input_offset + _PIPE_BUF]
-                    bytes_written = os.write(self.stdin.fileno(), chunk)
-                    self._input_offset += bytes_written
-                    if self._input_offset >= len(self._input):
-                        self.stdin.close()
-                        self._write_set.remove(self.stdin)
+                    try:
+                        bytes_written = os.write(self.stdin.fileno(), chunk)
+                    except EnvironmentError as e:
+                        if e.errno == errno.EPIPE:
+                            self._write_set.remove(self.stdin)
+                            self.stdin.close()
+                        else:
+                            raise
+                    else:
+                        self._input_offset += bytes_written
+                        if self._input_offset >= len(self._input):
+                            self.stdin.close()
+                            self._write_set.remove(self.stdin)
 
                 if self.stdout in rlist:
                     data = os.read(self.stdout.fileno(), 1024)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/subprocess32-3.5.3/test_subprocess32.py 
new/subprocess32-3.5.4/test_subprocess32.py
--- old/subprocess32-3.5.3/test_subprocess32.py 2018-10-10 00:12:07.000000000 
+0200
+++ new/subprocess32-3.5.4/test_subprocess32.py 2019-05-21 00:08:37.000000000 
+0200
@@ -27,6 +27,7 @@
     import gc
 except ImportError:
     gc = None
+import pickle
 
 mswindows = (sys.platform == "win32")
 
@@ -999,6 +1000,25 @@
         output = subprocess.check_output([sys.executable, '-c', code])
         self.assert_(output.startswith('Hello World!'), output)
 
+    def test_communicate_epipe(self):
+        # Issue 10963: communicate() should hide EPIPE
+        p = subprocess.Popen([sys.executable, "-c", 'pass'],
+                             stdin=subprocess.PIPE,
+                             stdout=subprocess.PIPE,
+                             stderr=subprocess.PIPE)
+        self.addCleanup(p.stdout.close)
+        self.addCleanup(p.stderr.close)
+        self.addCleanup(p.stdin.close)
+        p.communicate(b"x" * 2**20)
+
+    def test_communicate_epipe_only_stdin(self):
+        # Issue 10963: communicate() should hide EPIPE
+        p = subprocess.Popen([sys.executable, "-c", 'pass'],
+                             stdin=subprocess.PIPE)
+        self.addCleanup(p.stdin.close)
+        p.wait()
+        p.communicate(b"x" * 2**20)
+
     if not mswindows:  # Signal tests are POSIX specific.
         def test_communicate_eintr(self):
             # Issue #12493: communicate() should handle EINTR
@@ -2340,6 +2360,28 @@
         args_list = subprocess32._args_from_interpreter_flags()
         self.assertTrue(isinstance(args_list, list), msg=repr(args_list))
 
+    def test_timeout_expired_unpickling(self):
+        """https://github.com/google/python-subprocess32/issues/57""";
+        t = subprocess32.TimeoutExpired(['command', 'arg1'], 5,
+                                        output='stdout!', stderr='err')
+        t_pickled = pickle.dumps(t)
+        t2 = pickle.loads(t_pickled)
+        self.assertEqual(t.cmd, t2.cmd)
+        self.assertEqual(t.timeout, t2.timeout)
+        self.assertEqual(t.output, t2.output)
+        self.assertEqual(t.stderr, t2.stderr)
+
+    def test_called_process_error_unpickling(self):
+        """https://github.com/google/python-subprocess32/issues/57""";
+        e = subprocess32.CalledProcessError(
+                2, ['command', 'arg1'], output='stdout!', stderr='err')
+        e_pickled = pickle.dumps(e)
+        e2 = pickle.loads(e_pickled)
+        self.assertEqual(e.returncode, e2.returncode)
+        self.assertEqual(e.cmd, e2.cmd)
+        self.assertEqual(e.output, e2.output)
+        self.assertEqual(e.stderr, e2.stderr)
+
 
 def reap_children():
     """Use this function at the end of test_main() whenever sub-processes


Reply via email to