summaryrefslogtreecommitdiffstats
path: root/Lib/distutils
diff options
context:
space:
mode:
authorRobert Collins <rbtcollins@hp.com>2015-07-28 03:55:07 (GMT)
committerRobert Collins <rbtcollins@hp.com>2015-07-28 03:55:07 (GMT)
commitc6d9228290c1635588d8edddc04f2b2278705867 (patch)
treef17f4ee2072cfe550286b26501fc5e33fe75eb89 /Lib/distutils
parent9c11d91b5089bba386751a9d0ba88377f5b4321f (diff)
downloadcpython-c6d9228290c1635588d8edddc04f2b2278705867.zip
cpython-c6d9228290c1635588d8edddc04f2b2278705867.tar.gz
cpython-c6d9228290c1635588d8edddc04f2b2278705867.tar.bz2
Issue #23426: run_setup was broken in distutils.
Patch from Alexander Belopolsky.
Diffstat (limited to 'Lib/distutils')
-rw-r--r--Lib/distutils/core.py5
-rw-r--r--Lib/distutils/tests/test_core.py30
2 files changed, 32 insertions, 3 deletions
diff --git a/Lib/distutils/core.py b/Lib/distutils/core.py
index f05b34b..d603d4a 100644
--- a/Lib/distutils/core.py
+++ b/Lib/distutils/core.py
@@ -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
diff --git a/Lib/distutils/tests/test_core.py b/Lib/distutils/tests/test_core.py
index 41321f7..57856f1 100644
--- a/Lib/distutils/tests/test_core.py
+++ b/Lib/distutils/tests/test_core.py
@@ -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