[Python-checkins] cpython: Issue #23426: run_setup was broken in distutils.

robert.collins python-checkins at python.org
Tue Jul 28 05:55:16 CEST 2015


https://hg.python.org/cpython/rev/d8950778e3c2
changeset:   97096:d8950778e3c2
user:        Robert Collins <rbtcollins at hp.com>
date:        Tue Jul 28 15:55:07 2015 +1200
summary:
  Issue #23426: run_setup was broken in distutils.
Patch from Alexander Belopolsky.

files:
  Lib/distutils/core.py            |   5 +--
  Lib/distutils/tests/test_core.py |  30 ++++++++++++++++++++
  Misc/NEWS                        |   3 ++
  3 files changed, 35 insertions(+), 3 deletions(-)


diff --git a/Lib/distutils/core.py b/Lib/distutils/core.py
--- a/Lib/distutils/core.py
+++ b/Lib/distutils/core.py
@@ -204,16 +204,15 @@
     global _setup_stop_after, _setup_distribution
     _setup_stop_after = stop_after
 
-    save_argv = sys.argv
+    save_argv = sys.argv.copy()
     g = {'__file__': script_name}
-    l = {}
     try:
         try:
             sys.argv[0] = script_name
             if script_args is not None:
                 sys.argv[1:] = script_args
             with open(script_name, 'rb') as f:
-                exec(f.read(), g, l)
+                exec(f.read(), g)
         finally:
             sys.argv = save_argv
             _setup_stop_after = None
diff --git a/Lib/distutils/tests/test_core.py b/Lib/distutils/tests/test_core.py
--- a/Lib/distutils/tests/test_core.py
+++ b/Lib/distutils/tests/test_core.py
@@ -28,6 +28,21 @@
 setup()
 """
 
+setup_does_nothing = """\
+from distutils.core import setup
+setup()
+"""
+
+
+setup_defines_subclass = """\
+from distutils.core import setup
+from distutils.command.install import install as _install
+
+class install(_install):
+    sub_commands = _install.sub_commands + ['cmd']
+
+setup(cmdclass={'install': install})
+"""
 
 class CoreTestCase(support.EnvironGuard, unittest.TestCase):
 
@@ -65,6 +80,21 @@
         distutils.core.run_setup(
             self.write_setup(setup_using___file__))
 
+    def test_run_setup_preserves_sys_argv(self):
+        # Make sure run_setup does not clobber sys.argv
+        argv_copy = sys.argv.copy()
+        distutils.core.run_setup(
+            self.write_setup(setup_does_nothing))
+        self.assertEqual(sys.argv, argv_copy)
+
+    def test_run_setup_defines_subclass(self):
+        # Make sure the script can use __file__; if that's missing, the test
+        # setup.py script will raise NameError.
+        dist = distutils.core.run_setup(
+            self.write_setup(setup_defines_subclass))
+        install = dist.get_command_obj('install')
+        self.assertIn('cmd', install.sub_commands)
+
     def test_run_setup_uses_current_dir(self):
         # This tests that the setup script is run with the current directory
         # as its own current directory; this was temporarily broken by a
diff --git a/Misc/NEWS b/Misc/NEWS
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,6 +13,9 @@
 Library
 -------
 
+- Issue #23426: run_setup was broken in distutils.
+  Patch from Alexander Belopolsky.
+
 - Issue #17527: Add PATCH to wsgiref.validator. Patch from Luca Sbardella.
 
 - Issue #13938: 2to3 converts StringTypes to a tuple. Patch from Mark Hammond.

-- 
Repository URL: https://hg.python.org/cpython


More information about the Python-checkins mailing list