bpo-34738: Add directory entries in ZIP files created by distutils. (GH-9419)

This commit is contained in:
Serhiy Storchaka 2018-12-05 21:46:25 +02:00 committed by GitHub
parent 55f41e45b4
commit 67a93b3a0b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 27 additions and 10 deletions

View File

@ -166,7 +166,15 @@ def make_zipfile(base_name, base_dir, verbose=0, dry_run=0):
zip = zipfile.ZipFile(zip_filename, "w", zip = zipfile.ZipFile(zip_filename, "w",
compression=zipfile.ZIP_STORED) compression=zipfile.ZIP_STORED)
if base_dir != os.curdir:
path = os.path.normpath(os.path.join(base_dir, ''))
zip.write(path, path)
log.info("adding '%s'", path)
for dirpath, dirnames, filenames in os.walk(base_dir): for dirpath, dirnames, filenames in os.walk(base_dir):
for name in dirnames:
path = os.path.normpath(os.path.join(dirpath, name, ''))
zip.write(path, path)
log.info("adding '%s'", path)
for name in filenames: for name in filenames:
path = os.path.normpath(os.path.join(dirpath, name)) path = os.path.normpath(os.path.join(dirpath, name))
if os.path.isfile(path): if os.path.isfile(path):

View File

@ -122,12 +122,13 @@ class ArchiveUtilTestCase(support.TempdirManager,
try: try:
names = tar.getnames() names = tar.getnames()
names.sort() names.sort()
return tuple(names) return names
finally: finally:
tar.close() tar.close()
_created_files = ('dist', 'dist/file1', 'dist/file2', _zip_created_files = ['dist/', 'dist/file1', 'dist/file2',
'dist/sub', 'dist/sub/file3', 'dist/sub2') 'dist/sub/', 'dist/sub/file3', 'dist/sub2/']
_created_files = [p.rstrip('/') for p in _zip_created_files]
def _create_files(self): def _create_files(self):
# creating something to tar # creating something to tar
@ -244,8 +245,7 @@ class ArchiveUtilTestCase(support.TempdirManager,
tarball = base_name + '.zip' tarball = base_name + '.zip'
self.assertTrue(os.path.exists(tarball)) self.assertTrue(os.path.exists(tarball))
with zipfile.ZipFile(tarball) as zf: with zipfile.ZipFile(tarball) as zf:
self.assertEqual(sorted(zf.namelist()), self.assertEqual(sorted(zf.namelist()), self._zip_created_files)
['dist/file1', 'dist/file2', 'dist/sub/file3'])
@unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run') @unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run')
def test_make_zipfile_no_zlib(self): def test_make_zipfile_no_zlib(self):
@ -271,8 +271,7 @@ class ArchiveUtilTestCase(support.TempdirManager,
[((tarball, "w"), {'compression': zipfile.ZIP_STORED})]) [((tarball, "w"), {'compression': zipfile.ZIP_STORED})])
self.assertTrue(os.path.exists(tarball)) self.assertTrue(os.path.exists(tarball))
with zipfile.ZipFile(tarball) as zf: with zipfile.ZipFile(tarball) as zf:
self.assertEqual(sorted(zf.namelist()), self.assertEqual(sorted(zf.namelist()), self._zip_created_files)
['dist/file1', 'dist/file2', 'dist/sub/file3'])
def test_check_archive_formats(self): def test_check_archive_formats(self):
self.assertEqual(check_archive_formats(['gztar', 'xxx', 'zip']), self.assertEqual(check_archive_formats(['gztar', 'xxx', 'zip']),

View File

@ -84,7 +84,7 @@ class BuildDumbTestCase(support.TempdirManager,
finally: finally:
fp.close() fp.close()
contents = sorted(os.path.basename(fn) for fn in contents) contents = sorted(filter(None, map(os.path.basename, contents)))
wanted = ['foo-0.1-py%s.%s.egg-info' % sys.version_info[:2], 'foo.py'] wanted = ['foo-0.1-py%s.%s.egg-info' % sys.version_info[:2], 'foo.py']
if not sys.dont_write_bytecode: if not sys.dont_write_bytecode:
wanted.append('foo.%s.pyc' % sys.implementation.cache_tag) wanted.append('foo.%s.pyc' % sys.implementation.cache_tag)

View File

@ -128,7 +128,9 @@ class SDistTestCase(BasePyPIRCCommandTestCase):
zip_file.close() zip_file.close()
# making sure everything has been pruned correctly # making sure everything has been pruned correctly
self.assertEqual(len(content), 4) expected = ['', 'PKG-INFO', 'README', 'setup.py',
'somecode/', 'somecode/__init__.py']
self.assertEqual(sorted(content), ['fake-1.0/' + x for x in expected])
@unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run') @unittest.skipUnless(ZLIB_SUPPORT, 'Need zlib support to run')
@unittest.skipIf(find_executable('tar') is None, @unittest.skipIf(find_executable('tar') is None,
@ -226,7 +228,13 @@ class SDistTestCase(BasePyPIRCCommandTestCase):
zip_file.close() zip_file.close()
# making sure everything was added # making sure everything was added
self.assertEqual(len(content), 12) expected = ['', 'PKG-INFO', 'README', 'buildout.cfg',
'data/', 'data/data.dt', 'inroot.txt',
'scripts/', 'scripts/script.py', 'setup.py',
'some/', 'some/file.txt', 'some/other_file.txt',
'somecode/', 'somecode/__init__.py', 'somecode/doc.dat',
'somecode/doc.txt']
self.assertEqual(sorted(content), ['fake-1.0/' + x for x in expected])
# checking the MANIFEST # checking the MANIFEST
f = open(join(self.tmp_dir, 'MANIFEST')) f = open(join(self.tmp_dir, 'MANIFEST'))

View File

@ -0,0 +1,2 @@
ZIP files created by :mod:`distutils` will now include entries for
directories.