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

Commit c8d446bc authored by Doug Zongker's avatar Doug Zongker
Browse files

pass blobs to applypatch in incremental OTAs

applypatch now takes patches as blob-valued arguments instead of just
filenames, eliminating the need to unpack all patches to /tmp before
starting to apply them.

Revert the last change I made where sha1_check(read_file(...)) was
substituted for apply_patch_check(...).  apply_patch_check() knows to
check /cache/saved.file if the original source file is missing or has
a bad checksum, which is important if the device loses power or
otherwise restarts during patching.

Change-Id: Ia5b761474b0f809a5a5eed29455b1b145145699e
parent 1af09dea
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -100,6 +100,10 @@ class AmendGenerator(object):
    self.script.append("".join(out))
    self.included_files.add(("applypatch_static", "applypatch"))

  # Not quite right since we don't need to check /cache/saved.file on
  # failure, but shouldn't hurt.
  FileCheck = PatchCheck

  def CacheFreeSpaceCheck(self, amount):
    """Check that there's at least 'amount' space that can be made
    available on /cache."""
+1 −0
Original line number Diff line number Diff line
@@ -41,6 +41,7 @@ class BothGenerator(object):
  def AssertSomeBootloader(self, *a): self._DoBoth("AssertSomeBootloader", *a)
  def ShowProgress(self, *a): self._DoBoth("ShowProgress", *a)
  def PatchCheck(self, *a): self._DoBoth("PatchCheck", *a)
  def FileCheck(self, filename, *sha1): self._DoBoth("FileCheck", *a)
  def CacheFreeSpaceCheck(self, *a): self._DoBoth("CacheFreeSpaceCheck", *a)
  def Mount(self, *a): self._DoBoth("Mount", *a)
  def UnpackPackageDir(self, *a): self._DoBoth("UnpackPackageDir", *a)
+9 −1
Original line number Diff line number Diff line
@@ -111,6 +111,14 @@ class EdifyGenerator(object):
    self.script.append("set_progress(%f);" % (frac,))

  def PatchCheck(self, filename, *sha1):
    """Check that the given file (or MTD reference) has one of the
    given *sha1 hashes, checking the version saved in cache if the
    file does not match."""
    self.script.append('assert(apply_patch_check("%s"' % (filename,) +
                       "".join([', "%s"' % (i,) for i in sha1]) +
                       '));')

  def FileCheck(self, filename, *sha1):
    """Check that the given file (or MTD reference) has one of the
    given *sha1 hashes."""
    self.script.append('assert(sha1_check(read_file("%s")' % (filename,) +
@@ -164,7 +172,7 @@ class EdifyGenerator(object):
    cmd = ['apply_patch("%s",\0"%s",\0%s,\0%d'
           % (srcfile, tgtfile, tgtsha1, tgtsize)]
    for i in range(0, len(patchpairs), 2):
      cmd.append(',\0"%s:%s"' % patchpairs[i:i+2])
      cmd.append(',\0%s, package_extract_file("%s")' % patchpairs[i:i+2])
    cmd.append(');')
    cmd = "".join(cmd)
    self.script.append(self._WordWrap(cmd))
+2 −8
Original line number Diff line number Diff line
@@ -690,11 +690,6 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):

  if patch_list or updating_recovery or updating_boot:
    script.CacheFreeSpaceCheck(largest_source_size)
    script.Print("Unpacking patches...")
    script.UnpackPackageDir("patch", "/tmp/patchtmp")

    for fn, tf, sf, size, patch_sha in patch_list:
      script.PatchCheck("/tmp/patchtmp/" + tf.name + ".p", patch_sha)

  device_specific.IncrementalOTA_VerifyEnd()

@@ -718,8 +713,7 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):

  script.Print("Patching system files...")
  for fn, tf, sf, size, _ in patch_list:
    script.ApplyPatch("/"+fn, "-", tf.size, tf.sha1,
                      sf.sha1, "/tmp/patchtmp/"+fn+".p")
    script.ApplyPatch("/"+fn, "-", tf.size, tf.sha1, sf.sha1, "patch/"+fn+".p")
    so_far += tf.size
    script.SetProgress(so_far / total_patch_size)

@@ -733,7 +727,7 @@ def WriteIncrementalOTAPackage(target_zip, source_zip, output_zip):
                         target_boot.size, target_boot.sha1),
                      "-",
                      target_boot.size, target_boot.sha1,
                      source_boot.sha1, "/tmp/patchtmp/boot.img.p")
                      source_boot.sha1, "patch/boot.img.p")
    so_far += target_boot.size
    script.SetProgress(so_far / total_patch_size)
    print "boot image changed; including."