Index: Lib/distutils/core.py =================================================================== --- Lib/distutils/core.py (revision 62142) +++ Lib/distutils/core.py (working copy) @@ -210,6 +210,7 @@ _setup_stop_after = stop_after save_argv = sys.argv + save_dir = os.getcwd() g = {'__file__': script_name} l = {} os.chdir(os.path.dirname(script_name) or os.curdir) @@ -220,6 +221,7 @@ sys.argv[1:] = script_args execfile(script_name, g, l) finally: + os.chdir(save_dir) sys.argv = save_argv _setup_stop_after = None except SystemExit: Index: Lib/distutils/tests/test_core.py =================================================================== --- Lib/distutils/tests/test_core.py (revision 62142) +++ Lib/distutils/tests/test_core.py (working copy) @@ -3,6 +3,7 @@ import StringIO import distutils.core import os +import sys import test.test_support import unittest @@ -16,25 +17,48 @@ setup() """ +setup_changing_cwd = """\ +from distutils.core import setup +import os +os.chdir(os.pardir) # Not so great; assumes we're not at the top dir. + +setup() +""" + + class CoreTestCase(unittest.TestCase): + def setUp(self): + self._old_stdout = sys.stdout + sys.stdout = StringIO.StringIO() + def tearDown(self): os.remove(test.test_support.TESTFN) + sys.stdout = self._old_stdout def write_setup(self, text): + fn = test.test_support.TESTFN + open(fn, "w").write(text) return fn def test_run_setup_provides_file(self): # Make sure the script can use __file__; if that's missing, the test # setup.py script will raise NameError. - fn = test.test_support.TESTFN - open(fn, "w").write(setup_using___file__) - distutils.core.run_setup(fn) + distutils.core.run_setup( + self.write_setup(setup_using___file__)) + def test_run_setup_saves_and_restores_cwd(self): + starting_dir = os.getcwd() + distutils.core.run_setup( + self.write_setup(setup_changing_cwd)) + ending_dir = os.getcwd() + self.assertEqual(starting_dir, ending_dir) + def test_suite(): return unittest.makeSuite(CoreTestCase) if __name__ == "__main__": unittest.main(defaultTest="test_suite") +