mirror of https://github.com/python/cpython
Issue #20912: Now directories added to ZIP file have correct Unix and MS-DOS
directory attributes.
This commit is contained in:
parent
026a399bf9
commit
46a34924e4
|
@ -1696,11 +1696,48 @@ class TestWithDirectory(unittest.TestCase):
|
||||||
os.mkdir(os.path.join(TESTFN2, "a"))
|
os.mkdir(os.path.join(TESTFN2, "a"))
|
||||||
self.test_extract_dir()
|
self.test_extract_dir()
|
||||||
|
|
||||||
def test_store_dir(self):
|
def test_write_dir(self):
|
||||||
|
dirpath = os.path.join(TESTFN2, "x")
|
||||||
|
os.mkdir(dirpath)
|
||||||
|
mode = os.stat(dirpath).st_mode & 0xFFFF
|
||||||
|
with zipfile.ZipFile(TESTFN, "w") as zipf:
|
||||||
|
zipf.write(dirpath)
|
||||||
|
zinfo = zipf.filelist[0]
|
||||||
|
self.assertTrue(zinfo.filename.endswith("/x/"))
|
||||||
|
self.assertEqual(zinfo.external_attr, (mode << 16) | 0x10)
|
||||||
|
zipf.write(dirpath, "y")
|
||||||
|
zinfo = zipf.filelist[1]
|
||||||
|
self.assertTrue(zinfo.filename, "y/")
|
||||||
|
self.assertEqual(zinfo.external_attr, (mode << 16) | 0x10)
|
||||||
|
with zipfile.ZipFile(TESTFN, "r") as zipf:
|
||||||
|
zinfo = zipf.filelist[0]
|
||||||
|
self.assertTrue(zinfo.filename.endswith("/x/"))
|
||||||
|
self.assertEqual(zinfo.external_attr, (mode << 16) | 0x10)
|
||||||
|
zinfo = zipf.filelist[1]
|
||||||
|
self.assertTrue(zinfo.filename, "y/")
|
||||||
|
self.assertEqual(zinfo.external_attr, (mode << 16) | 0x10)
|
||||||
|
target = os.path.join(TESTFN2, "target")
|
||||||
|
os.mkdir(target)
|
||||||
|
zipf.extractall(target)
|
||||||
|
self.assertTrue(os.path.isdir(os.path.join(target, "y")))
|
||||||
|
self.assertEqual(len(os.listdir(target)), 2)
|
||||||
|
|
||||||
|
def test_writestr_dir(self):
|
||||||
os.mkdir(os.path.join(TESTFN2, "x"))
|
os.mkdir(os.path.join(TESTFN2, "x"))
|
||||||
zipf = zipfile.ZipFile(TESTFN, "w")
|
with zipfile.ZipFile(TESTFN, "w") as zipf:
|
||||||
zipf.write(os.path.join(TESTFN2, "x"), "x")
|
zipf.writestr("x/", b'')
|
||||||
self.assertTrue(zipf.filelist[0].filename.endswith("x/"))
|
zinfo = zipf.filelist[0]
|
||||||
|
self.assertEqual(zinfo.filename, "x/")
|
||||||
|
self.assertEqual(zinfo.external_attr, (0o40775 << 16) | 0x10)
|
||||||
|
with zipfile.ZipFile(TESTFN, "r") as zipf:
|
||||||
|
zinfo = zipf.filelist[0]
|
||||||
|
self.assertTrue(zinfo.filename.endswith("x/"))
|
||||||
|
self.assertEqual(zinfo.external_attr, (0o40775 << 16) | 0x10)
|
||||||
|
target = os.path.join(TESTFN2, "target")
|
||||||
|
os.mkdir(target)
|
||||||
|
zipf.extractall(target)
|
||||||
|
self.assertTrue(os.path.isdir(os.path.join(target, "x")))
|
||||||
|
self.assertEqual(os.listdir(target), ["x"])
|
||||||
|
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
rmtree(TESTFN2)
|
rmtree(TESTFN2)
|
||||||
|
|
|
@ -1356,6 +1356,7 @@ class ZipFile:
|
||||||
zinfo.file_size = 0
|
zinfo.file_size = 0
|
||||||
zinfo.compress_size = 0
|
zinfo.compress_size = 0
|
||||||
zinfo.CRC = 0
|
zinfo.CRC = 0
|
||||||
|
zinfo.external_attr |= 0x10 # MS-DOS directory flag
|
||||||
self.filelist.append(zinfo)
|
self.filelist.append(zinfo)
|
||||||
self.NameToInfo[zinfo.filename] = zinfo
|
self.NameToInfo[zinfo.filename] = zinfo
|
||||||
self.fp.write(zinfo.FileHeader(False))
|
self.fp.write(zinfo.FileHeader(False))
|
||||||
|
@ -1416,7 +1417,11 @@ class ZipFile:
|
||||||
zinfo = ZipInfo(filename=zinfo_or_arcname,
|
zinfo = ZipInfo(filename=zinfo_or_arcname,
|
||||||
date_time=time.localtime(time.time())[:6])
|
date_time=time.localtime(time.time())[:6])
|
||||||
zinfo.compress_type = self.compression
|
zinfo.compress_type = self.compression
|
||||||
zinfo.external_attr = 0o600 << 16
|
if zinfo.filename[-1] == '/':
|
||||||
|
zinfo.external_attr = 0o40775 << 16 # drwxrwxr-x
|
||||||
|
zinfo.external_attr |= 0x10 # MS-DOS directory flag
|
||||||
|
else:
|
||||||
|
zinfo.external_attr = 0o600 << 16 # ?rw-------
|
||||||
else:
|
else:
|
||||||
zinfo = zinfo_or_arcname
|
zinfo = zinfo_or_arcname
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,9 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #20912: Now directories added to ZIP file have correct Unix and MS-DOS
|
||||||
|
directory attributes.
|
||||||
|
|
||||||
- Issue #21866: ZipFile.close() no longer writes ZIP64 central directory
|
- Issue #21866: ZipFile.close() no longer writes ZIP64 central directory
|
||||||
records if allowZip64 is false.
|
records if allowZip64 is false.
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue