diff options
author | Robert Collins <rbtcollins@hp.com> | 2015-07-28 03:55:07 (GMT) |
---|---|---|
committer | Robert Collins <rbtcollins@hp.com> | 2015-07-28 03:55:07 (GMT) |
commit | c6d9228290c1635588d8edddc04f2b2278705867 (patch) | |
tree | f17f4ee2072cfe550286b26501fc5e33fe75eb89 /Lib/distutils | |
parent | 9c11d91b5089bba386751a9d0ba88377f5b4321f (diff) | |
download | cpython-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.py | 5 | ||||
-rw-r--r-- | Lib/distutils/tests/test_core.py | 30 |
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 |