Commit 605cf208 authored by Serhiy Storchaka's avatar Serhiy Storchaka

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

entries.  Patch by Dingyuan Wang.
parent 600caceb
...@@ -1099,6 +1099,29 @@ class TestShutil(unittest.TestCase): ...@@ -1099,6 +1099,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')
......
...@@ -1337,7 +1337,9 @@ class ZipFile: ...@@ -1337,7 +1337,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
......
...@@ -1471,6 +1471,7 @@ Richard Walker ...@@ -1471,6 +1471,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
......
...@@ -106,6 +106,9 @@ Core and Builtins ...@@ -106,6 +106,9 @@ Core and Builtins
Library Library
------- -------
- Issue #25624: ZipFile now always writes a ZIP_STORED header for directory
entries. Patch by Dingyuan Wang.
- Issue #25583: Avoid incorrect errors raised by os.makedirs(exist_ok=True) - Issue #25583: Avoid incorrect errors raised by os.makedirs(exist_ok=True)
when the OS gives priority to errors such as EACCES over EEXIST. when the OS gives priority to errors such as EACCES over EEXIST.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment