Issue #17201: ZIP64 extensions now are enabled by default.

Patch by William Mallard.
This commit is contained in:
Serhiy Storchaka 2013-11-23 15:55:38 +02:00
parent 8b78493d4f
commit 235c5e0dd6
6 changed files with 22 additions and 15 deletions

View File

@ -130,7 +130,7 @@ ZipFile Objects
--------------- ---------------
.. class:: ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=False) .. class:: ZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True)
Open a ZIP file, where *file* can be either a path to a file (a string) or a Open a ZIP file, where *file* can be either a path to a file (a string) or a
file-like object. The *mode* parameter should be ``'r'`` to read an existing file-like object. The *mode* parameter should be ``'r'`` to read an existing
@ -147,12 +147,9 @@ ZipFile Objects
:const:`ZIP_BZIP2` or :const:`ZIP_LZMA` is specified but the corresponding module :const:`ZIP_BZIP2` or :const:`ZIP_LZMA` is specified but the corresponding module
(:mod:`zlib`, :mod:`bz2` or :mod:`lzma`) is not available, :exc:`RuntimeError` (:mod:`zlib`, :mod:`bz2` or :mod:`lzma`) is not available, :exc:`RuntimeError`
is also raised. The default is :const:`ZIP_STORED`. If *allowZip64* is is also raised. The default is :const:`ZIP_STORED`. If *allowZip64* is
``True`` zipfile will create ZIP files that use the ZIP64 extensions when ``True`` (the default) zipfile will create ZIP files that use the ZIP64
the zipfile is larger than 2 GiB. If it is false (the default) :mod:`zipfile` extensions when the zipfile is larger than 2 GiB. If it is false :mod:`zipfile`
will raise an exception when the ZIP file would require ZIP64 extensions. will raise an exception when the ZIP file would require ZIP64 extensions.
ZIP64 extensions are disabled by default because the default :program:`zip`
and :program:`unzip` commands on Unix (the InfoZIP utilities) don't support
these extensions.
If the file is created with mode ``'a'`` or ``'w'`` and then If the file is created with mode ``'a'`` or ``'w'`` and then
:meth:`closed <close>` without adding any files to the archive, the appropriate :meth:`closed <close>` without adding any files to the archive, the appropriate
@ -171,6 +168,9 @@ ZipFile Objects
.. versionchanged:: 3.3 .. versionchanged:: 3.3
Added support for :mod:`bzip2 <bz2>` and :mod:`lzma` compression. Added support for :mod:`bzip2 <bz2>` and :mod:`lzma` compression.
.. versionchanged:: 3.4
ZIP64 extensions are enabled by default.
.. method:: ZipFile.close() .. method:: ZipFile.close()
@ -374,12 +374,15 @@ PyZipFile Objects
The :class:`PyZipFile` constructor takes the same parameters as the The :class:`PyZipFile` constructor takes the same parameters as the
:class:`ZipFile` constructor, and one additional parameter, *optimize*. :class:`ZipFile` constructor, and one additional parameter, *optimize*.
.. class:: PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=False, \ .. class:: PyZipFile(file, mode='r', compression=ZIP_STORED, allowZip64=True, \
optimize=-1) optimize=-1)
.. versionadded:: 3.2 .. versionadded:: 3.2
The *optimize* parameter. The *optimize* parameter.
.. versionchanged:: 3.4
ZIP64 extensions are enabled by default.
Instances have one method in addition to those of :class:`ZipFile` objects: Instances have one method in addition to those of :class:`ZipFile` objects:
.. method:: PyZipFile.writepy(pathname, basename='', filterfunc=None) .. method:: PyZipFile.writepy(pathname, basename='', filterfunc=None)

View File

@ -506,12 +506,12 @@ class StoredTestZip64InSmallFiles(AbstractTestZip64InSmallFiles,
compression = zipfile.ZIP_STORED compression = zipfile.ZIP_STORED
def large_file_exception_test(self, f, compression): def large_file_exception_test(self, f, compression):
with zipfile.ZipFile(f, "w", compression) as zipfp: with zipfile.ZipFile(f, "w", compression, allowZip64=False) as zipfp:
self.assertRaises(zipfile.LargeZipFile, self.assertRaises(zipfile.LargeZipFile,
zipfp.write, TESTFN, "another.name") zipfp.write, TESTFN, "another.name")
def large_file_exception_test2(self, f, compression): def large_file_exception_test2(self, f, compression):
with zipfile.ZipFile(f, "w", compression) as zipfp: with zipfile.ZipFile(f, "w", compression, allowZip64=False) as zipfp:
self.assertRaises(zipfile.LargeZipFile, self.assertRaises(zipfile.LargeZipFile,
zipfp.writestr, "another.name", self.data) zipfp.writestr, "another.name", self.data)

View File

@ -38,7 +38,7 @@ class TestsWithSourceFile(unittest.TestCase):
def zipTest(self, f, compression): def zipTest(self, f, compression):
# Create the ZIP archive. # Create the ZIP archive.
zipfp = zipfile.ZipFile(f, "w", compression, allowZip64=True) zipfp = zipfile.ZipFile(f, "w", compression)
# It will contain enough copies of self.data to reach about 6GB of # It will contain enough copies of self.data to reach about 6GB of
# raw data to store. # raw data to store.
@ -92,7 +92,7 @@ class OtherTests(unittest.TestCase):
def testMoreThan64kFiles(self): def testMoreThan64kFiles(self):
# This test checks that more than 64k files can be added to an archive, # This test checks that more than 64k files can be added to an archive,
# and that the resulting archive can be read properly by ZipFile # and that the resulting archive can be read properly by ZipFile
zipf = zipfile.ZipFile(TESTFN, mode="w") zipf = zipfile.ZipFile(TESTFN, mode="w", allowZip64=False)
zipf.debug = 100 zipf.debug = 100
numfiles = (1 << 16) * 3//2 numfiles = (1 << 16) * 3//2
for i in range(numfiles): for i in range(numfiles):

View File

@ -876,7 +876,7 @@ class ZipExtFile(io.BufferedIOBase):
class ZipFile: class ZipFile:
""" Class with methods to open, read, write, close, list zip files. """ Class with methods to open, read, write, close, list zip files.
z = ZipFile(file, mode="r", compression=ZIP_STORED, allowZip64=False) z = ZipFile(file, mode="r", compression=ZIP_STORED, allowZip64=True)
file: Either the path to the file, or a file-like object. file: Either the path to the file, or a file-like object.
If it is a path, the file will be opened and closed by ZipFile. If it is a path, the file will be opened and closed by ZipFile.
@ -892,7 +892,7 @@ class ZipFile:
fp = None # Set here since __del__ checks it fp = None # Set here since __del__ checks it
_windows_illegal_name_trans_table = None _windows_illegal_name_trans_table = None
def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=False): def __init__(self, file, mode="r", compression=ZIP_STORED, allowZip64=True):
"""Open the ZIP file with mode read "r", write "w" or append "a".""" """Open the ZIP file with mode read "r", write "w" or append "a"."""
if mode not in ("r", "w", "a"): if mode not in ("r", "w", "a"):
raise RuntimeError('ZipFile() requires mode "r", "w", or "a"') raise RuntimeError('ZipFile() requires mode "r", "w", or "a"')
@ -1561,7 +1561,7 @@ class PyZipFile(ZipFile):
"""Class to create ZIP archives with Python library files and packages.""" """Class to create ZIP archives with Python library files and packages."""
def __init__(self, file, mode="r", compression=ZIP_STORED, def __init__(self, file, mode="r", compression=ZIP_STORED,
allowZip64=False, optimize=-1): allowZip64=True, optimize=-1):
ZipFile.__init__(self, file, mode=mode, compression=compression, ZipFile.__init__(self, file, mode=mode, compression=compression,
allowZip64=allowZip64) allowZip64=allowZip64)
self._optimize = optimize self._optimize = optimize
@ -1783,7 +1783,7 @@ def main(args = None):
os.path.join(path, nm), os.path.join(zippath, nm)) os.path.join(path, nm), os.path.join(zippath, nm))
# else: ignore # else: ignore
with ZipFile(args[1], 'w', allowZip64=True) as zf: with ZipFile(args[1], 'w') as zf:
for src in args[2:]: for src in args[2:]:
addToZip(zf, src, os.path.basename(src)) addToZip(zf, src, os.path.basename(src))

View File

@ -806,6 +806,7 @@ Marek Majkowski
Grzegorz Makarewicz Grzegorz Makarewicz
David Malcolm David Malcolm
Greg Malcolm Greg Malcolm
William Mallard
Ken Manheimer Ken Manheimer
Vladimir Marangozov Vladimir Marangozov
Colin Marc Colin Marc

View File

@ -68,6 +68,9 @@ Core and Builtins
Library Library
------- -------
- Issue #17201: ZIP64 extensions now are enabled by default. Patch by
William Mallard.
- Issue #19292: Add SSLContext.load_default_certs() to load default root CA - Issue #19292: Add SSLContext.load_default_certs() to load default root CA
certificates from default stores or system stores. By default the method certificates from default stores or system stores. By default the method
loads CA certs for authentication of server certs. loads CA certs for authentication of server certs.