Skip to content

Commit 797a62c

Browse files
committed
Fix and optimize repack
1 parent 04cddef commit 797a62c

File tree

1 file changed

+13
-12
lines changed

1 file changed

+13
-12
lines changed

Lib/zipfile/__init__.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,7 +1449,7 @@ def repack(self, zfile, removed=None):
14491449
- Modifies the ZIP file in place.
14501450
- Updates zfile.start_dir to account for removed data.
14511451
- Sets zfile._didModify to True.
1452-
- Adjusts header_offset and _end_offset of referenced ZipInfo
1452+
- Updates header_offset and _end_offset of referenced ZipInfo
14531453
instances.
14541454
14551455
Parameters:
@@ -1507,26 +1507,21 @@ def repack(self, zfile, removed=None):
15071507
used_entry_size = used_entry_size_list[i]
15081508

15091509
# update the header and move entry data to the new position
1510+
old_header_offset = zinfo.header_offset
1511+
zinfo.header_offset -= entry_offset
1512+
15101513
if zinfo in removed_zinfos:
1511-
old_header_offset = zinfo.header_offset
1512-
zinfo.header_offset -= entry_offset
15131514
self._copy_bytes(
15141515
fp,
15151516
old_header_offset + used_entry_size,
15161517
zinfo.header_offset,
15171518
entry_size - used_entry_size
15181519
)
15191520

1520-
if zinfo._end_offset is not None:
1521-
zinfo._end_offset = zinfo.header_offset
1522-
15231521
# update entry_offset for subsequent files to follow
15241522
entry_offset += used_entry_size
15251523

15261524
else:
1527-
old_header_offset = zinfo.header_offset
1528-
zinfo.header_offset -= entry_offset
1529-
15301525
if entry_offset > 0:
15311526
self._copy_bytes(fp, old_header_offset, zinfo.header_offset, used_entry_size)
15321527

@@ -1550,13 +1545,19 @@ def repack(self, zfile, removed=None):
15501545
# update entry_offset for subsequent files to follow
15511546
entry_offset += stale_entry_size
15521547

1553-
if zinfo._end_offset is not None:
1554-
zinfo._end_offset = zinfo.header_offset + entry_size - stale_entry_size
1555-
15561548
# update state
15571549
zfile.start_dir -= entry_offset
15581550
zfile._didModify = True
15591551

1552+
end_offset = zfile.start_dir
1553+
for zinfo in reversed(filelist):
1554+
if zinfo in removed_zinfos:
1555+
zinfo._end_offset = None
1556+
else:
1557+
if zinfo._end_offset is not None:
1558+
zinfo._end_offset = end_offset
1559+
end_offset = zinfo.header_offset
1560+
15601561
def _calc_initial_entry_offset(self, fp, data_offset):
15611562
checked_offsets = {}
15621563
if data_offset > 0:

0 commit comments

Comments
 (0)