Issue #25624: ZipFile now always writes a ZIP_STORED header for directory

entries.  Patch by Dingyuan Wang.
This commit is contained in:
Serhiy Storchaka 2015-11-22 14:50:59 +02:00
commit bf57bff1a9
4 changed files with 30 additions and 1 deletions

View File

@ -1105,6 +1105,29 @@ class TestShutil(unittest.TestCase):
names2 = zf.namelist() names2 = zf.namelist()
self.assertEqual(sorted(names), sorted(names2)) self.assertEqual(sorted(names), sorted(names2))
@requires_zlib
@unittest.skipUnless(ZIP_SUPPORT, 'Need zip support to run')
@unittest.skipUnless(shutil.which('unzip'),
'Need the unzip command to run')
def test_unzip_zipfile(self):
root_dir, base_dir = self._create_files()
base_name = os.path.join(self.mkdtemp(), 'archive')
archive = make_archive(base_name, 'zip', root_dir, base_dir)
# check if ZIP file was created
self.assertEqual(archive, base_name + '.zip')
self.assertTrue(os.path.isfile(archive))
# now check the ZIP file using `unzip -t`
zip_cmd = ['unzip', '-t', archive]
with support.change_cwd(root_dir):
try:
subprocess.check_output(zip_cmd, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as exc:
details = exc.output.decode(errors="replace")
msg = "{}\n\n**Unzip Output**\n{}"
self.fail(msg.format(exc, details))
def test_make_archive(self): def test_make_archive(self):
tmpdir = self.mkdtemp() tmpdir = self.mkdtemp()
base_name = os.path.join(tmpdir, 'archive') base_name = os.path.join(tmpdir, 'archive')

View File

@ -1444,7 +1444,9 @@ class ZipFile:
arcname += '/' arcname += '/'
zinfo = ZipInfo(arcname, date_time) zinfo = ZipInfo(arcname, date_time)
zinfo.external_attr = (st[0] & 0xFFFF) << 16 # Unix attributes zinfo.external_attr = (st[0] & 0xFFFF) << 16 # Unix attributes
if compress_type is None: if isdir:
zinfo.compress_type = ZIP_STORED
elif compress_type is None:
zinfo.compress_type = self.compression zinfo.compress_type = self.compression
else: else:
zinfo.compress_type = compress_type zinfo.compress_type = compress_type

View File

@ -1522,6 +1522,7 @@ Richard Walker
Larry Wall Larry Wall
Kevin Walzer Kevin Walzer
Rodrigo Steinmuller Wanderley Rodrigo Steinmuller Wanderley
Dingyuan Wang
Ke Wang Ke Wang
Greg Ward Greg Ward
Tom Wardill Tom Wardill

View File

@ -95,6 +95,9 @@ Core and Builtins
Library Library
------- -------
- Issue #25624: ZipFile now always writes a ZIP_STORED header for directory
entries. Patch by Dingyuan Wang.
- Issue #25626: Change three zlib functions to accept sizes that fit in - Issue #25626: Change three zlib functions to accept sizes that fit in
Py_ssize_t, but internally cap those sizes to UINT_MAX. This resolves a Py_ssize_t, but internally cap those sizes to UINT_MAX. This resolves a
regression in 3.5 where GzipFile.read() failed to read chunks larger than 2 regression in 3.5 where GzipFile.read() failed to read chunks larger than 2