diff --git a/tools/releasetools/common.py b/tools/releasetools/common.py index bbdff6e50b..e7fd204aa3 100644 --- a/tools/releasetools/common.py +++ b/tools/releasetools/common.py @@ -2868,30 +2868,32 @@ def ZipWriteStr(zip_file, zinfo_or_arcname, data, perms=None, def ZipDelete(zip_filename, entries, force=False): """Deletes entries from a ZIP file. - Since deleting entries from a ZIP file is not supported, it shells out to - 'zip -d'. - Args: zip_filename: The name of the ZIP file. entries: The name of the entry, or the list of names to be deleted. - - Raises: - AssertionError: In case of non-zero return from 'zip'. """ if isinstance(entries, str): entries = [entries] # If list is empty, nothing to do if not entries: return - if force: - cmd = ["zip", "-q", "-d", zip_filename] + entries - else: - cmd = ["zip", "-d", zip_filename] + entries - if force: - p = Run(cmd) - p.wait() - else: - RunAndCheckOutput(cmd) + + with zipfile.ZipFile(zip_filename, 'r') as zin: + if not force and len(set(zin.namelist()).intersection(entries)) == 0: + raise ExternalError( + "Failed to delete zip entries, name not matched: %s" % entries) + + fd, new_zipfile = tempfile.mkstemp(dir=os.path.dirname(zip_filename)) + os.close(fd) + + 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) def ZipClose(zip_file):