[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#925513: marked as done (unblock: python-numpy/1:1.16.2-1)



Your message dated Wed, 27 Mar 2019 06:44:00 +0000
with message-id <0a22746e-e83a-fcf8-b20c-3f5c57a45835@thykier.net>
and subject line Re: Bug#925513: unblock: python-numpy/1:1.16.2-1
has caused the Debian Bug report #925513,
regarding unblock: python-numpy/1:1.16.2-1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
925513: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=925513
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Usertags: unblock

Please unblock package python-numpy

it looks like i missed the deadline for an automatic transition to testing by a
few hours with the latest upload of numpy, hence opening this ticket (with
attached debdiff). it's a patch release, with only bugfixes (which you can find
documented in the debdiff as part of the upstream changes).

unblock python-numpy/1:1.16.2-1

-- System Information:
Debian Release: buster/sid
  APT prefers unstable-debug
  APT policy: (500, 'unstable-debug'), (500, 'unstable'), (1, 'experimental-debug'), (1, 'experimental')
Architecture: amd64 (x86_64)
Foreign Architectures: i386

Kernel: Linux 4.14.0-3-amd64 (SMP w/8 CPU cores)
Kernel taint flags: TAINT_PROPRIETARY_MODULE, TAINT_WARN, TAINT_OOT_MODULE
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8), LANGUAGE= (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
LSM: AppArmor: enabled
diff -Nru python-numpy-1.16.1/debian/changelog python-numpy-1.16.2/debian/changelog
--- python-numpy-1.16.1/debian/changelog	2019-01-31 22:21:17.000000000 -0500
+++ python-numpy-1.16.2/debian/changelog	2019-03-02 11:30:12.000000000 -0500
@@ -1,3 +1,9 @@
+python-numpy (1:1.16.2-1) unstable; urgency=medium
+
+  * New upstream release
+
+ -- Sandro Tosi <morph@debian.org>  Sat, 02 Mar 2019 11:30:12 -0500
+
 python-numpy (1:1.16.1-1) unstable; urgency=medium
 
   * New upstream release
diff -Nru python-numpy-1.16.1/doc/changelog/1.16.2-changelog.rst python-numpy-1.16.2/doc/changelog/1.16.2-changelog.rst
--- python-numpy-1.16.1/doc/changelog/1.16.2-changelog.rst	1969-12-31 19:00:00.000000000 -0500
+++ python-numpy-1.16.2/doc/changelog/1.16.2-changelog.rst	2019-02-26 09:33:38.000000000 -0500
@@ -0,0 +1,25 @@
+
+Contributors
+============
+
+A total of 5 people contributed to this release.  People with a "+" by their
+names contributed a patch for the first time.
+
+* Charles Harris
+* Eric Wieser
+* Matti Picus
+* Tyler Reddy
+* Tony LaTorre +
+
+Pull requests merged
+====================
+
+A total of 7 pull requests were merged for this release.
+
+* `#12909 <https://github.com/numpy/numpy/pull/12909>`__: TST: fix vmImage dispatch in Azure
+* `#12923 <https://github.com/numpy/numpy/pull/12923>`__: MAINT: remove complicated test of multiarray import failure mode
+* `#13020 <https://github.com/numpy/numpy/pull/13020>`__: BUG: fix signed zero behavior in npy_divmod
+* `#13026 <https://github.com/numpy/numpy/pull/13026>`__: MAINT: Add functions to parse shell-strings in the platform-native...
+* `#13028 <https://github.com/numpy/numpy/pull/13028>`__: BUG: Fix regression in parsing of F90 and F77 environment variables
+* `#13038 <https://github.com/numpy/numpy/pull/13038>`__: BUG: parse shell escaping in extra_compile_args and extra_link_args
+* `#13041 <https://github.com/numpy/numpy/pull/13041>`__: BLD: Windows absolute path DLL loading
diff -Nru python-numpy-1.16.1/doc/release/1.16.2-notes.rst python-numpy-1.16.2/doc/release/1.16.2-notes.rst
--- python-numpy-1.16.1/doc/release/1.16.2-notes.rst	1969-12-31 19:00:00.000000000 -0500
+++ python-numpy-1.16.2/doc/release/1.16.2-notes.rst	2019-02-26 09:33:38.000000000 -0500
@@ -0,0 +1,70 @@
+==========================
+NumPy 1.16.2 Release Notes
+==========================
+
+NumPy 1.16.2 is a quick release fixing several problems encountered on Windows.
+The Python versions supported are 2.7 and 3.5-3.7. The Windows problems
+addressed are:
+
+- DLL load problems for NumPy wheels on Windows,
+- distutils command line parsing on Windows.
+
+There is also a regression fix correcting signed zeros produced by divmod, see
+below for details.
+
+Downstream developers building this release should use Cython >= 0.29.2 and, if
+using OpenBLAS, OpenBLAS > v0.3.4.
+
+If you are installing using pip, you may encounter a problem with older
+installed versions of NumPy that pip did not delete becoming mixed with the
+current version, resulting in an ``ImportError``. That problem is particularly
+common on Debian derived distributions due to a modified pip.  The fix is to
+make sure all previous NumPy versions installed by pip have been removed. See
+`#12736 <https://github.com/numpy/numpy/issues/12736>`__ for discussion of the
+issue.
+
+
+Compatibility notes
+===================
+
+Signed zero when using divmod
+-----------------------------
+Starting in version 1.12.0, numpy incorrectly returned a negatively signed zero
+when using the ``divmod`` and ``floor_divide`` functions when the result was
+zero. For example::
+
+   >>> np.zeros(10)//1
+   array([-0., -0., -0., -0., -0., -0., -0., -0., -0., -0.])
+
+With this release, the result is correctly returned as a positively signed
+zero::
+
+   >>> np.zeros(10)//1
+   array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
+
+
+Contributors
+============
+
+A total of 5 people contributed to this release.  People with a "+" by their
+names contributed a patch for the first time.
+
+* Charles Harris
+* Eric Wieser
+* Matti Picus
+* Tyler Reddy
+* Tony LaTorre +
+
+
+Pull requests merged
+====================
+
+A total of 7 pull requests were merged for this release.
+
+* `#12909 <https://github.com/numpy/numpy/pull/12909>`__: TST: fix vmImage dispatch in Azure
+* `#12923 <https://github.com/numpy/numpy/pull/12923>`__: MAINT: remove complicated test of multiarray import failure mode
+* `#13020 <https://github.com/numpy/numpy/pull/13020>`__: BUG: fix signed zero behavior in npy_divmod
+* `#13026 <https://github.com/numpy/numpy/pull/13026>`__: MAINT: Add functions to parse shell-strings in the platform-native...
+* `#13028 <https://github.com/numpy/numpy/pull/13028>`__: BUG: Fix regression in parsing of F90 and F77 environment variables
+* `#13038 <https://github.com/numpy/numpy/pull/13038>`__: BUG: parse shell escaping in extra_compile_args and extra_link_args
+* `#13041 <https://github.com/numpy/numpy/pull/13041>`__: BLD: Windows absolute path DLL loading
diff -Nru python-numpy-1.16.1/numpy/core/__init__.py python-numpy-1.16.2/numpy/core/__init__.py
--- python-numpy-1.16.1/numpy/core/__init__.py	2019-01-31 10:31:08.000000000 -0500
+++ python-numpy-1.16.2/numpy/core/__init__.py	2019-02-26 07:03:30.000000000 -0500
@@ -3,9 +3,33 @@
 from .info import __doc__
 from numpy.version import version as __version__
 
+import os
+
+# on Windows NumPy loads an important OpenBLAS-related DLL
+# and the code below aims to alleviate issues with DLL
+# path resolution portability with an absolute path DLL load
+if os.name == 'nt':
+    from ctypes import WinDLL
+    import glob
+    # convention for storing / loading the DLL from
+    # numpy/.libs/, if present
+    libs_path = os.path.abspath(os.path.join(os.path.dirname(__file__),
+                                             '..', '.libs'))
+    DLL_filenames = []
+    if os.path.isdir(libs_path):
+        for filename in glob.glob(os.path.join(libs_path, '*openblas*dll')):
+            # NOTE: would it change behavior to load ALL
+            # DLLs at this path vs. the name restriction?
+            WinDLL(os.path.abspath(filename))
+            DLL_filenames.append(filename)
+    if len(DLL_filenames) > 1:
+        import warnings
+        warnings.warn("loaded more than 1 DLL from .libs:\n%s" %
+                      "\n".join(DLL_filenames),
+                      stacklevel=1)
+
 # disables OpenBLAS affinity setting of the main thread that limits
 # python threads or processes to one core
-import os
 env_added = []
 for envkey in ['OPENBLAS_MAIN_FREE', 'GOTOBLAS_MAIN_FREE']:
     if envkey not in os.environ:
diff -Nru python-numpy-1.16.1/numpy/core/setup.py python-numpy-1.16.2/numpy/core/setup.py
--- python-numpy-1.16.1/numpy/core/setup.py	2019-01-31 13:36:54.000000000 -0500
+++ python-numpy-1.16.2/numpy/core/setup.py	2019-02-25 17:31:02.000000000 -0500
@@ -962,14 +962,6 @@
     config.add_extension('_operand_flag_tests',
                     sources=[join('src', 'umath', '_operand_flag_tests.c.src')])
 
-    #######################################################################
-    #                        _multiarray_module_test module               #
-    #######################################################################
-
-    config.add_extension('_multiarray_module_test',
-                    sources=[join('src', 'multiarray',
-                                         '_multiarray_module_test.c')])
-
     config.add_data_dir('tests')
     config.add_data_dir('tests/data')
 
diff -Nru python-numpy-1.16.1/numpy/core/src/multiarray/_multiarray_module_test.c python-numpy-1.16.2/numpy/core/src/multiarray/_multiarray_module_test.c
--- python-numpy-1.16.1/numpy/core/src/multiarray/_multiarray_module_test.c	2019-01-31 10:31:08.000000000 -0500
+++ python-numpy-1.16.2/numpy/core/src/multiarray/_multiarray_module_test.c	1969-12-31 19:00:00.000000000 -0500
@@ -1,129 +0,0 @@
-#include "Python.h"
-
-/*
- * This is a dummy module. It will be used to ruin the import of multiarray
- * during testing. It exports two entry points, one to make the build happy,
- * and a multiarray one for the actual test. The content of the module is
- * irrelevant to the test.
- *
- * The code is from
- * https://docs.python.org/3/howto/cporting.html
- * or
- * https://github.com/python/cpython/blob/v3.7.0/Doc/howto/cporting.rst
- */
-
-#if defined _WIN32 || defined __CYGWIN__ || defined __MINGW32__
-  #if defined __GNUC__ || defined __clang__
-    #define DLL_PUBLIC __attribute__ ((dllexport))
-  #else
-    #define DLL_PUBLIC __declspec(dllexport)
-  #endif
-#elif defined __GNUC__  || defined __clang__
-  #define DLL_PUBLIC __attribute__ ((visibility ("default")))
-#else
-    /* Enhancement: error now instead ? */
-    #define DLL_PUBLIC
-#endif
-
-struct module_state {
-    PyObject *error;
-};
-
-#if PY_MAJOR_VERSION >= 3
-#define GETSTATE(m) ((struct module_state*)PyModule_GetState(m))
-#else
-#define GETSTATE(m) (&_state)
-static struct module_state _state;
-#endif
-
-static PyObject *
-error_out(PyObject *m) {
-    struct module_state *st = GETSTATE(m);
-    PyErr_SetString(st->error, "something bad happened");
-    return NULL;
-}
-
-static PyMethodDef multiarray_methods[] = {
-    {"error_out", (PyCFunction)error_out, METH_NOARGS, NULL},
-    {NULL, NULL}
-};
-
-#if PY_MAJOR_VERSION >= 3
-
-static int multiarray_traverse(PyObject *m, visitproc visit, void *arg) {
-    Py_VISIT(GETSTATE(m)->error);
-    return 0;
-}
-
-static int multiarray_clear(PyObject *m) {
-    Py_CLEAR(GETSTATE(m)->error);
-    return 0;
-}
-
-
-static struct PyModuleDef moduledef = {
-        PyModuleDef_HEAD_INIT,
-        "multiarray",
-        NULL,
-        sizeof(struct module_state),
-        multiarray_methods,
-        NULL,
-        multiarray_traverse,
-        multiarray_clear,
-        NULL
-};
-
-#define INITERROR return NULL
-
-DLL_PUBLIC PyObject *
-PyInit_multiarray(void)
-
-#else
-#define INITERROR return
-
-void
-DLL_PUBLIC initmultiarray(void)
-#endif
-{
-#if PY_MAJOR_VERSION >= 3
-    PyObject *module = PyModule_Create(&moduledef);
-#else
-    PyObject *module = Py_InitModule("multiarray", multiarray_methods);
-#endif
-    struct module_state *st;
-    if (module == NULL)
-        INITERROR;
-    st = GETSTATE(module);
-
-    st->error = PyErr_NewException("multiarray.Error", NULL, NULL);
-    if (st->error == NULL) {
-        Py_DECREF(module);
-        INITERROR;
-    }
-
-#if PY_MAJOR_VERSION >= 3
-    return module;
-#endif
-}
-
-/*
- * Define a dummy entry point to make MSVC happy
- * Python's build system will export this function automatically
- */
-#if PY_MAJOR_VERSION >= 3
-
-PyObject *
-PyInit__multiarray_module_test(void)
-{
-    return PyInit_multiarray();
-}
-
-#else
-
-void
-init_multiarray_module_test(void)
-{
-    initmultiarray();
-}
-
-#endif                                                    
diff -Nru python-numpy-1.16.1/numpy/core/src/npymath/npy_math_internal.h.src python-numpy-1.16.2/numpy/core/src/npymath/npy_math_internal.h.src
--- python-numpy-1.16.1/numpy/core/src/npymath/npy_math_internal.h.src	2019-01-05 15:25:48.000000000 -0500
+++ python-numpy-1.16.2/numpy/core/src/npymath/npy_math_internal.h.src	2019-02-24 14:52:22.000000000 -0500
@@ -654,7 +654,7 @@
     }
     else {
         /* if mod is zero ensure correct sign */
-        mod = (b > 0) ? 0.0@c@ : -0.0@c@;
+        mod = npy_copysign@c@(0, b);
     }
 
     /* snap quotient to nearest integral value */
@@ -665,7 +665,7 @@
     }
     else {
         /* if div is zero ensure correct sign */
-        floordiv = (a / b > 0) ?  0.0@c@ : -0.0@c@;
+        floordiv = npy_copysign@c@(0, a/b);
     }
 
     *modulus = mod;
diff -Nru python-numpy-1.16.1/numpy/core/tests/test_multiarray.py python-numpy-1.16.2/numpy/core/tests/test_multiarray.py
--- python-numpy-1.16.1/numpy/core/tests/test_multiarray.py	2019-01-31 13:36:54.000000000 -0500
+++ python-numpy-1.16.2/numpy/core/tests/test_multiarray.py	2019-02-25 17:31:02.000000000 -0500
@@ -8093,43 +8093,3 @@
     pytest.raises(ValueError, a.getfield, 'uint8', -1)
     pytest.raises(ValueError, a.getfield, 'uint8', 16)
     pytest.raises(ValueError, a.getfield, 'uint64', 0)
-
-def test_multiarray_module():
-    # gh-12736
-    # numpy 1.16 replaced the multiarray and umath c-extension modules with
-    # a single _multiarray_umath one. For backward compatibility, it added a
-    # pure-python multiarray.py and umath.py shim so people can still do
-    # from numpy.core.multirarray import something-public-api
-    # It turns out pip can leave old pieces of previous versions of numpy
-    # around when installing a newer version. If the old c-extension modules
-    # are found, they will be given precedence over the new pure-python ones.
-    #
-    # This test copies a multiarray c-extension in parallel with the pure-
-    # python one, and starts another python interpreter to load multiarray.
-    # The expectation is that import will fail.
-    import subprocess, shutil
-    core_dir = os.path.dirname(np.core.multiarray.__file__)
-    cextension = np.core._multiarray_umath.__file__
-    testfile = cextension.replace('_multiarray_umath', '_multiarray_module_test')
-    badfile = cextension.replace('_multiarray_umath', 'multiarray')
-    assert not os.path.exists(badfile), '%s exists, this numpy ' \
-                                    'installation is faulty' % badfile
-    try:
-        shutil.copy(testfile, badfile)
-        p = subprocess.Popen([sys.executable, '-c', 'import numpy' ],
-                stdout=subprocess.PIPE, stderr=subprocess.PIPE,
-                env=os.environ.copy())
-        stdout, stderr = p.communicate()
-        r = p.wait()
-        #print(stdout.decode())
-        #print(stderr.decode())
-        assert r != 0
-        assert b'ImportError' in stderr
-    finally:
-        if os.path.exists(badfile):
-            try:
-                # can this fail?
-                os.remove(badfile)
-            except:
-                print("Could not remove %s, remove it by hand" % badfile)
-                raise
diff -Nru python-numpy-1.16.1/numpy/core/tests/test_umath.py python-numpy-1.16.2/numpy/core/tests/test_umath.py
--- python-numpy-1.16.1/numpy/core/tests/test_umath.py	2019-01-31 13:36:54.000000000 -0500
+++ python-numpy-1.16.2/numpy/core/tests/test_umath.py	2019-02-25 17:31:02.000000000 -0500
@@ -273,6 +273,12 @@
         y = np.floor_divide(x**2, x)
         assert_equal(y, [1.e+110, 0], err_msg=msg)
 
+    def test_floor_division_signed_zero(self):
+        # Check that the sign bit is correctly set when dividing positive and
+        # negative zero by one.
+        x = np.zeros(10)
+        assert_equal(np.signbit(x//1), 0)
+        assert_equal(np.signbit((-x)//1), 1)
 
 def floor_divide_and_remainder(x, y):
     return (np.floor_divide(x, y), np.remainder(x, y))
diff -Nru python-numpy-1.16.1/numpy/distutils/fcompiler/__init__.py python-numpy-1.16.2/numpy/distutils/fcompiler/__init__.py
--- python-numpy-1.16.1/numpy/distutils/fcompiler/__init__.py	2019-01-31 10:31:08.000000000 -0500
+++ python-numpy-1.16.2/numpy/distutils/fcompiler/__init__.py	2019-02-25 14:31:08.000000000 -0500
@@ -22,7 +22,6 @@
 import sys
 import re
 import types
-import shlex
 
 from numpy.compat import open_latin1
 
@@ -38,6 +37,7 @@
     make_temp_file, get_shared_lib_extension
 from numpy.distutils.exec_command import find_executable
 from numpy.distutils.compat import get_exception
+from numpy.distutils import _shell_utils
 
 from .environment import EnvironmentConfig
 
@@ -475,10 +475,10 @@
         fixflags = []
 
         if f77:
-            f77 = shlex.split(f77, posix=(os.name == 'posix'))
+            f77 = _shell_utils.NativeParser.split(f77)
             f77flags = self.flag_vars.f77
         if f90:
-            f90 = shlex.split(f90, posix=(os.name == 'posix'))
+            f90 = _shell_utils.NativeParser.split(f90)
             f90flags = self.flag_vars.f90
             freeflags = self.flag_vars.free
         # XXX Assuming that free format is default for f90 compiler.
@@ -491,7 +491,7 @@
         # should perhaps eventually be more throughly tested and more
         # robustly handled
         if fix:
-            fix = shlex.split(fix, posix=(os.name == 'posix'))
+            fix = _shell_utils.NativeParser.split(fix)
             fixflags = self.flag_vars.fix + f90flags
 
         oflags, aflags, dflags = [], [], []
diff -Nru python-numpy-1.16.1/numpy/distutils/_shell_utils.py python-numpy-1.16.2/numpy/distutils/_shell_utils.py
--- python-numpy-1.16.1/numpy/distutils/_shell_utils.py	1969-12-31 19:00:00.000000000 -0500
+++ python-numpy-1.16.2/numpy/distutils/_shell_utils.py	2019-02-24 14:52:22.000000000 -0500
@@ -0,0 +1,91 @@
+"""
+Helper functions for interacting with the shell, and consuming shell-style
+parameters provided in config files.
+"""
+import os
+import shlex
+import subprocess
+try:
+    from shlex import quote
+except ImportError:
+    from pipes import quote
+
+__all__ = ['WindowsParser', 'PosixParser', 'NativeParser']
+
+
+class CommandLineParser:
+    """
+    An object that knows how to split and join command-line arguments.
+
+    It must be true that ``argv == split(join(argv))`` for all ``argv``.
+    The reverse neednt be true - `join(split(cmd))` may result in the addition
+    or removal of unnecessary escaping.
+    """
+    @staticmethod
+    def join(argv):
+        """ Join a list of arguments into a command line string """
+        raise NotImplemented
+
+    @staticmethod
+    def split(cmd):
+        """ Split a command line string into a list of arguments """
+        raise NotImplemented
+
+
+class WindowsParser:
+    """
+    The parsing behavior used by `subprocess.call("string")` on Windows, which
+    matches the Microsoft C/C++ runtime.
+
+    Note that this is _not_ the behavior of cmd.
+    """
+    @staticmethod
+    def join(argv):
+        # note that list2cmdline is specific to the windows syntax
+        return subprocess.list2cmdline(argv)
+
+    @staticmethod
+    def split(cmd):
+        import ctypes  # guarded import for systems without ctypes
+        try:
+            ctypes.windll
+        except AttributeError:
+            raise NotImplementedError
+
+        # Windows has special parsing rules for the executable (no quotes),
+        # that we do not care about - insert a dummy element
+        if not cmd:
+            return []
+        cmd = 'dummy ' + cmd
+
+        CommandLineToArgvW = ctypes.windll.shell32.CommandLineToArgvW
+        CommandLineToArgvW.restype = ctypes.POINTER(ctypes.c_wchar_p)
+        CommandLineToArgvW.argtypes = (ctypes.c_wchar_p, ctypes.POINTER(ctypes.c_int))
+
+        nargs = ctypes.c_int()
+        lpargs = CommandLineToArgvW(cmd, ctypes.byref(nargs))
+        args = [lpargs[i] for i in range(nargs.value)]
+        assert not ctypes.windll.kernel32.LocalFree(lpargs)
+
+        # strip the element we inserted
+        assert args[0] == "dummy"
+        return args[1:]
+
+
+class PosixParser:
+    """
+    The parsing behavior used by `subprocess.call("string", shell=True)` on Posix.
+    """
+    @staticmethod
+    def join(argv):
+        return ' '.join(quote(arg) for arg in argv)
+
+    @staticmethod
+    def split(cmd):
+        return shlex.split(cmd, posix=True)
+
+
+if os.name == 'nt':
+    NativeParser = WindowsParser
+elif os.name == 'posix':
+    NativeParser = PosixParser
diff -Nru python-numpy-1.16.1/numpy/distutils/system_info.py python-numpy-1.16.2/numpy/distutils/system_info.py
--- python-numpy-1.16.1/numpy/distutils/system_info.py	2019-01-31 10:31:08.000000000 -0500
+++ python-numpy-1.16.2/numpy/distutils/system_info.py	2019-02-25 17:30:54.000000000 -0500
@@ -153,6 +153,7 @@
 from numpy.distutils.command.config import config as cmd_config
 from numpy.distutils.compat import get_exception
 from numpy.distutils import customized_ccompiler
+from numpy.distutils import _shell_utils
 import distutils.ccompiler
 import tempfile
 import shutil
@@ -619,8 +620,9 @@
         for key in ['extra_compile_args', 'extra_link_args']:
             # Get values
             opt = self.cp.get(self.section, key)
+            opt = _shell_utils.NativeParser.split(opt)
             if opt:
-                tmp = {key : [opt]}
+                tmp = {key: opt}
                 dict_append(info, **tmp)
         return info
 
diff -Nru python-numpy-1.16.1/numpy/distutils/tests/test_shell_utils.py python-numpy-1.16.2/numpy/distutils/tests/test_shell_utils.py
--- python-numpy-1.16.1/numpy/distutils/tests/test_shell_utils.py	1969-12-31 19:00:00.000000000 -0500
+++ python-numpy-1.16.2/numpy/distutils/tests/test_shell_utils.py	2019-02-24 14:52:22.000000000 -0500
@@ -0,0 +1,79 @@
+from __future__ import division, absolute_import, print_function
+
+import pytest
+import subprocess
+import os
+import json
+import sys
+
+from numpy.distutils import _shell_utils
+
+argv_cases = [
+    [r'exe'],
+    [r'path/exe'],
+    [r'path\exe'],
+    [r'\\server\path\exe'],
+    [r'path to/exe'],
+    [r'path to\exe'],
+
+    [r'exe', '--flag'],
+    [r'path/exe', '--flag'],
+    [r'path\exe', '--flag'],
+    [r'path to/exe', '--flag'],
+    [r'path to\exe', '--flag'],
+
+    # flags containing literal quotes in their name
+    [r'path to/exe', '--flag-"quoted"'],
+    [r'path to\exe', '--flag-"quoted"'],
+    [r'path to/exe', '"--flag-quoted"'],
+    [r'path to\exe', '"--flag-quoted"'],
+]
+
+
+@pytest.fixture(params=[
+    _shell_utils.WindowsParser,
+    _shell_utils.PosixParser
+])
+def Parser(request):
+    return request.param
+
+
+@pytest.fixture
+def runner(Parser):
+    if Parser != _shell_utils.NativeParser:
+        pytest.skip('Unable to run with non-native parser')
+
+    if Parser == _shell_utils.WindowsParser:
+        return lambda cmd: subprocess.check_output(cmd)
+    elif Parser == _shell_utils.PosixParser:
+        # posix has no non-shell string parsing
+        return lambda cmd: subprocess.check_output(cmd, shell=True)
+    else:
+        raise NotImplementedError
+
+
+@pytest.mark.parametrize('argv', argv_cases)
+def test_join_matches_subprocess(Parser, runner, argv):
+    """
+    Test that join produces strings understood by subprocess
+    """
+    # invoke python to return its arguments as json
+    cmd = [
+        sys.executable, '-c',
+        'import json, sys; print(json.dumps(sys.argv[1:]))'
+    ]
+    joined = Parser.join(cmd + argv)
+    json_out = runner(joined).decode()
+    assert json.loads(json_out) == argv
+
+
+@pytest.mark.parametrize('argv', argv_cases)
+def test_roundtrip(Parser, argv):
+    """
+    Test that split is the inverse operation of join
+    """
+    try:
+        joined = Parser.join(argv)
+        assert argv == Parser.split(joined)
+    except NotImplementedError:
+        pytest.skip("Not implemented")
diff -Nru python-numpy-1.16.1/numpy/distutils/tests/test_system_info.py python-numpy-1.16.2/numpy/distutils/tests/test_system_info.py
--- python-numpy-1.16.1/numpy/distutils/tests/test_system_info.py	2019-01-05 15:25:48.000000000 -0500
+++ python-numpy-1.16.2/numpy/distutils/tests/test_system_info.py	2019-02-25 17:30:54.000000000 -0500
@@ -11,6 +11,7 @@
 from numpy.testing import assert_, assert_equal
 from numpy.distutils.system_info import system_info, ConfigParser
 from numpy.distutils.system_info import default_lib_dirs, default_include_dirs
+from numpy.distutils import _shell_utils
 
 
 def get_class(name, notfound_action=1):
@@ -29,7 +30,7 @@
 [ALL]
 library_dirs = {dir1:s}{pathsep:s}{dir2:s}
 libraries = {lib1:s},{lib2:s}
-extra_compile_args = -I/fake/directory
+extra_compile_args = -I/fake/directory -I"/path with/spaces" -Os
 runtime_library_dirs = {dir1:s}
 
 [temp1]
@@ -40,7 +41,7 @@
 [temp2]
 library_dirs = {dir2:s}
 libraries = {lib2:s}
-extra_link_args = -Wl,-rpath={lib2:s}
+extra_link_args = -Wl,-rpath={lib2_escaped:s}
 rpath = {dir2:s}
 """
 site_cfg = simple_site
@@ -137,7 +138,8 @@
             'lib1': self._lib1,
             'dir2': self._dir2,
             'lib2': self._lib2,
-            'pathsep': os.pathsep
+            'pathsep': os.pathsep,
+            'lib2_escaped': _shell_utils.NativeParser.join([self._lib2])
         })
         # Write site.cfg
         fd, self._sitecfg = mkstemp()
@@ -181,7 +183,7 @@
         assert_equal(tsi.get_libraries(), [self._lib1, self._lib2])
         assert_equal(tsi.get_runtime_lib_dirs(), [self._dir1])
         extra = tsi.calc_extra_info()
-        assert_equal(extra['extra_compile_args'], ['-I/fake/directory'])
+        assert_equal(extra['extra_compile_args'], ['-I/fake/directory', '-I/path with/spaces', '-Os'])
 
     def test_temp1(self):
         # Read in all information in the temp1 block
diff -Nru python-numpy-1.16.1/numpy/version.py python-numpy-1.16.2/numpy/version.py
--- python-numpy-1.16.1/numpy/version.py	2019-01-31 14:13:32.000000000 -0500
+++ python-numpy-1.16.2/numpy/version.py	2019-02-26 09:57:36.000000000 -0500
@@ -2,10 +2,10 @@
 # THIS FILE IS GENERATED FROM NUMPY SETUP.PY
 #
 # To compare versions robustly, use `numpy.lib.NumpyVersion`
-short_version = '1.16.1'
-version = '1.16.1'
-full_version = '1.16.1'
-git_revision = '685b9ace06f1dc50e2698099d7a2b6a241379318'
+short_version = '1.16.2'
+version = '1.16.2'
+full_version = '1.16.2'
+git_revision = '0eeb158ead494e130a25239ac8473a06451b1072'
 release = True
 
 if not release:
diff -Nru python-numpy-1.16.1/PKG-INFO python-numpy-1.16.2/PKG-INFO
--- python-numpy-1.16.1/PKG-INFO	2019-01-31 14:13:34.000000000 -0500
+++ python-numpy-1.16.2/PKG-INFO	2019-02-26 09:57:38.000000000 -0500
@@ -1,6 +1,6 @@
 Metadata-Version: 1.2
 Name: numpy
-Version: 1.16.1
+Version: 1.16.2
 Summary:  NumPy is the fundamental package for array computing with Python.
 Home-page: https://www.numpy.org
 Author: NumPy Developers
diff -Nru python-numpy-1.16.1/setup.py python-numpy-1.16.2/setup.py
--- python-numpy-1.16.1/setup.py	2019-01-31 13:53:14.000000000 -0500
+++ python-numpy-1.16.2/setup.py	2019-02-26 09:42:00.000000000 -0500
@@ -61,7 +61,7 @@
 
 MAJOR               = 1
 MINOR               = 16
-MICRO               = 1
+MICRO               = 2
 ISRELEASED          = True
 VERSION             = '%d.%d.%d' % (MAJOR, MINOR, MICRO)
 
diff -Nru python-numpy-1.16.1/site.cfg.example python-numpy-1.16.2/site.cfg.example
--- python-numpy-1.16.1/site.cfg.example	2019-01-25 14:02:02.000000000 -0500
+++ python-numpy-1.16.2/site.cfg.example	2019-02-25 17:31:02.000000000 -0500
@@ -64,14 +64,14 @@
 #
 #   extra_compile_args
 #       Add additional arguments to the compilation of sources.
-#       Simple variable with no parsing done. 
+#       Split into arguments in a platform-appropriate way.
 #       Provide a single line with all complete flags.
 #           extra_compile_args = -g -ftree-vectorize
 #
 #   extra_link_args
 #       Add additional arguments when libraries/executables
 #       are linked.
-#       Simple variable with no parsing done. 
+#       Split into arguments in a platform-appropriate way.
 #       Provide a single line with all complete flags.
 #           extra_link_args = -lgfortran
 #

--- End Message ---
--- Begin Message ---
Sandro Tosi:
> Package: release.debian.org
> Severity: normal
> User: release.debian.org@packages.debian.org
> Usertags: unblock
> 
> Please unblock package python-numpy
> 
> it looks like i missed the deadline for an automatic transition to testing by a
> few hours with the latest upload of numpy, hence opening this ticket (with
> attached debdiff). it's a patch release, with only bugfixes (which you can find
> documented in the debdiff as part of the upstream changes).
> 
> unblock python-numpy/1:1.16.2-1
> 
> [...]

Unblocked, thanks.
~Niels

--- End Message ---

Reply to: