]> granicus.if.org Git - python/commitdiff
Issue #23426: run_setup was broken in distutils.
authorRobert Collins <rbtcollins@hp.com>
Tue, 28 Jul 2015 03:55:07 +0000 (15:55 +1200)
committerRobert Collins <rbtcollins@hp.com>
Tue, 28 Jul 2015 03:55:07 +0000 (15:55 +1200)
Patch from Alexander Belopolsky.

Lib/distutils/core.py
Lib/distutils/tests/test_core.py
Misc/NEWS

index f05b34b295d177cd215081a60502772ba8d38fd9..d603d4a45a73ee4f373fbd1ef934738bda0a1991 100644 (file)
@@ -204,16 +204,15 @@ def run_setup (script_name, script_args=None, stop_after="run"):
     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
index 41321f7db4eee64affcd2692175350498ff85918..57856f19b6545e9b53beab8e6acc361b2cd250b0 100644 (file)
@@ -28,6 +28,21 @@ from distutils.core import setup
 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 @@ class CoreTestCase(support.EnvironGuard, unittest.TestCase):
         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
index 22323577c53ba5bc52652f911272cf2335448263..30045398531338cd1f24cab2a1b25579a4e1b07c 100644 (file)
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -13,6 +13,9 @@ Core and Builtins
 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.