@@ -1369,8 +1369,9 @@ def close(self):
1369
1369
1370
1370
class _ZipRepacker :
1371
1371
"""Class for ZipFile repacking."""
1372
- def __init__ (self , debug = 0 ):
1372
+ def __init__ (self , * , chunk_size = 2 ** 20 , debug = 0 ):
1373
1373
self .debug = debug # Level of printing: 0 through 3
1374
+ self .chunk_size = chunk_size
1374
1375
1375
1376
def _debug (self , level , * msg ):
1376
1377
if self .debug >= level :
@@ -1443,7 +1444,7 @@ def repack(self, zfile):
1443
1444
with zfile ._lock :
1444
1445
self ._repack (zfile )
1445
1446
1446
- def _repack (self , zfile , * , chunk_size = 2 ** 20 ):
1447
+ def _repack (self , zfile ):
1447
1448
fp = zfile .fp
1448
1449
1449
1450
# get a sorted filelist by header offset, in case the dir order
@@ -1473,14 +1474,7 @@ def _repack(self, zfile, *, chunk_size=2**20):
1473
1474
if entry_offset > 0 :
1474
1475
old_header_offset = info .header_offset
1475
1476
info .header_offset -= entry_offset
1476
- read_size = 0
1477
- while read_size < used_entry_size :
1478
- fp .seek (old_header_offset + read_size )
1479
- data = fp .read (min (used_entry_size - read_size , chunk_size ))
1480
- fp .seek (info .header_offset + read_size )
1481
- fp .write (data )
1482
- fp .flush ()
1483
- read_size += len (data )
1477
+ self ._move_entry_data (fp , old_header_offset , info .header_offset , used_entry_size )
1484
1478
1485
1479
if info ._end_offset is not None :
1486
1480
info ._end_offset = info .header_offset + used_entry_size
@@ -1700,6 +1694,16 @@ def _calc_local_file_entry_size(self, fp, zinfo):
1700
1694
dd_size
1701
1695
)
1702
1696
1697
+ def _move_entry_data (self , fp , old_offset , new_offset , size ):
1698
+ read_size = 0
1699
+ while read_size < size :
1700
+ fp .seek (old_offset + read_size )
1701
+ data = fp .read (min (size - read_size , self .chunk_size ))
1702
+ fp .seek (new_offset + read_size )
1703
+ fp .write (data )
1704
+ fp .flush ()
1705
+ read_size += len (data )
1706
+
1703
1707
1704
1708
class ZipFile :
1705
1709
""" Class with methods to open, read, write, close, list zip files.
0 commit comments