Bug 8527 - multiple compileall calls produce cascading __pycache__ directories.

* Patch contributed by Arfrever Frehtes Taifersar Arahesis.
* Test added by Barry

Also, improve Makefile's deletion of __pycache__ directories so e.g. 'make
distclean' doesn't fail if no __pycache__ directories exist.
This commit is contained in:
Barry Warsaw 2010-04-26 15:59:03 +00:00
parent a1af3e0b9e
commit c04317fdc4
3 changed files with 21 additions and 1 deletions

View File

@ -45,6 +45,8 @@ def compile_dir(dir, maxlevels=10, ddir=None,
names.sort()
success = 1
for name in names:
if name == '__pycache__':
continue
fullname = os.path.join(dir, name)
if ddir is not None:
dfile = os.path.join(ddir, name)

View File

@ -150,6 +150,24 @@ class CommandLineTests(unittest.TestCase):
expected.sort()
self.assertEqual(sorted(os.listdir(self.pkgdir)), expected)
def test_multiple_runs(self):
# Bug 8527 reported that multiple calls produced empty
# __pycache__/__pycache__ directories.
retcode = subprocess.call(
(sys.executable, '-m', 'compileall', '-q', self.pkgdir))
self.assertEqual(retcode, 0)
# Verify the __pycache__ directory contents.
cachedir = os.path.join(self.pkgdir, '__pycache__')
self.assertTrue(os.path.exists(cachedir))
cachecachedir = os.path.join(cachedir, '__pycache__')
self.assertFalse(os.path.exists(cachecachedir))
# Call compileall again.
retcode = subprocess.call(
(sys.executable, '-m', 'compileall', '-q', self.pkgdir))
self.assertEqual(retcode, 0)
self.assertTrue(os.path.exists(cachedir))
self.assertFalse(os.path.exists(cachecachedir))
def test_main():
support.run_unittest(

View File

@ -1161,7 +1161,7 @@ TAGS::
# files, which clobber removes as well
pycremoval:
find $(srcdir) -name '*.py[co]' -exec rm -f {} ';'
find $(srcdir) -name '__pycache__' | xargs rmdir
find $(srcdir) -name '__pycache__' -exec rmdir {} ';'
rmtestturds:
-rm -f *BAD *GOOD *SKIPPED