Use zip2zip to copy zipfiles
ZipDelete() works by copying every non-deleted entry to a new zipfile.
Current implementation uses python's zipfile module to perform entry
copying, which is inefficient, as every entry must be decompressed and
then re-compressed. Instead, use zip2zip which avoid re-compression.
Improvement: deleting META/dynamic_partitions_info.txt from
raven-target_files-9465001.zip improved from 500+ seconds to 13 seconds.
Change-Id: I0548255bc29380303314763f6d81e74bf3dbb76e
diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py
index 9919029..2ae3964 100644
--- a/tools/releasetools/common.py
+++ b/tools/releasetools/common.py
@@ -302,6 +302,8 @@
Raises:
ExternalError: On non-zero exit from the command.
"""
+ if verbose is None:
+ verbose = OPTIONS.verbose
proc = Run(args, verbose=verbose, **kwargs)
output, _ = proc.communicate()
if output is None:
@@ -2893,13 +2895,12 @@
fd, new_zipfile = tempfile.mkstemp(dir=os.path.dirname(zip_filename))
os.close(fd)
+ cmd = ["zip2zip", "-i", zip_filename, "-o", new_zipfile]
+ for entry in entries:
+ cmd.append("-x")
+ cmd.append(entry)
+ RunAndCheckOutput(cmd)
- with zipfile.ZipFile(new_zipfile, 'w') as zout:
- for item in zin.infolist():
- if item.filename in entries:
- continue
- buffer = zin.read(item.filename)
- zout.writestr(item, buffer)
os.replace(new_zipfile, zip_filename)