Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit ddfc1ebf authored by Wei Li's avatar Wei Li Committed by Gerrit Code Review
Browse files

Merge "Change function ZipDelete to use Python module zipinfo instead of command 'zip'."

parents 92c35bda 8895f9ec
Loading
Loading
Loading
Loading
+17 −15
Original line number Diff line number Diff line
@@ -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):