summaryrefslogtreecommitdiffstats
path: root/tools/releasetools/amend_generator.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/releasetools/amend_generator.py')
-rw-r--r--tools/releasetools/amend_generator.py222
1 files changed, 0 insertions, 222 deletions
diff --git a/tools/releasetools/amend_generator.py b/tools/releasetools/amend_generator.py
deleted file mode 100644
index b543bf7..0000000
--- a/tools/releasetools/amend_generator.py
+++ /dev/null
@@ -1,222 +0,0 @@
-# Copyright (C) 2009 The Android Open Source Project
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-# http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-
-import os
-
-import common
-
-class AmendGenerator(object):
- """Class to generate scripts in the 'amend' recovery script language
- used up through cupcake."""
-
- def __init__(self):
- self.script = ['assert compatible_with("0.2") == "true"']
- self.included_files = set()
-
- def MakeTemporary(self):
- """Make a temporary script object whose commands can latter be
- appended to the parent script with AppendScript(). Used when the
- caller wants to generate script commands out-of-order."""
- x = AmendGenerator()
- x.script = []
- x.included_files = self.included_files
- return x
-
- @staticmethod
- def _FileRoot(fn):
- """Convert a file path to the 'root' notation used by amend."""
- if fn.startswith("/system/"):
- return "SYSTEM:" + fn[8:]
- elif fn == "/system":
- return "SYSTEM:"
- elif fn.startswith("/tmp/"):
- return "CACHE:.." + fn
- else:
- raise ValueError("don't know root for \"%s\"" % (fn,))
-
- @staticmethod
- def _PartitionRoot(partition):
- """Convert a partition name to the 'root' notation used by amend."""
- if partition == "userdata":
- return "DATA:"
- else:
- return partition.upper() + ":"
-
- def AppendScript(self, other):
- """Append the contents of another script (which should be created
- with temporary=True) to this one."""
- self.script.extend(other.script)
- self.included_files.update(other.included_files)
-
- def AssertSomeFingerprint(self, *fp):
- """Assert that the current fingerprint is one of *fp."""
- x = [('file_contains("SYSTEM:build.prop", '
- '"ro.build.fingerprint=%s") == "true"') % i for i in fp]
- self.script.append("assert %s" % (" || ".join(x),))
-
- def AssertOlderBuild(self, timestamp):
- """Assert that the build on the device is older (or the same as)
- the given timestamp."""
- self.script.append("run_program PACKAGE:check_prereq %s" % (timestamp,))
- self.included_files.add("check_prereq")
-
- def AssertDevice(self, device):
- """Assert that the device identifier is the given string."""
- self.script.append('assert getprop("ro.product.device") == "%s" || '
- 'getprop("ro.build.product") == "%s"' % (device, device))
-
- def AssertSomeBootloader(self, *bootloaders):
- """Asert that the bootloader version is one of *bootloaders."""
- self.script.append("assert " +
- " || ".join(['getprop("ro.bootloader") == "%s"' % (b,)
- for b in bootloaders]))
-
- def ShowProgress(self, frac, dur):
- """Update the progress bar, advancing it over 'frac' over the next
- 'dur' seconds."""
- self.script.append("show_progress %f %d" % (frac, int(dur)))
-
- def SetProgress(self, frac):
- """Not implemented in amend."""
- pass
-
- def PatchCheck(self, filename, *sha1):
- """Check that the given file (or MTD reference) has one of the
- given *sha1 hashes."""
- out = ["run_program PACKAGE:applypatch -c %s" % (filename,)]
- for i in sha1:
- out.append(" " + i)
- 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."""
- self.script.append("run_program PACKAGE:applypatch -s %d" % (amount,))
- self.included_files.add(("applypatch_static", "applypatch"))
-
- def Mount(self, kind, what, path):
- # no-op; amend uses it's 'roots' system to automatically mount
- # things when they're referred to
- pass
-
- def UnpackPackageDir(self, src, dst):
- """Unpack a given directory from the OTA package into the given
- destination directory."""
- dst = self._FileRoot(dst)
- self.script.append("copy_dir PACKAGE:%s %s" % (src, dst))
-
- def Comment(self, comment):
- """Write a comment into the update script."""
- self.script.append("")
- for i in comment.split("\n"):
- self.script.append("# " + i)
- self.script.append("")
-
- def Print(self, message):
- """Log a message to the screen (if the logs are visible)."""
- # no way to do this from amend; substitute a script comment instead
- self.Comment(message)
-
- def FormatPartition(self, partition):
- """Format the given MTD partition."""
- self.script.append("format %s" % (self._PartitionRoot(partition),))
-
- def DeleteFiles(self, file_list):
- """Delete all files in file_list."""
- line = []
- t = 0
- for i in file_list:
- i = self._FileRoot(i)
- line.append(i)
- t += len(i) + 1
- if t > 80:
- self.script.append("delete " + " ".join(line))
- line = []
- t = 0
- if line:
- self.script.append("delete " + " ".join(line))
-
- def ApplyPatch(self, srcfile, tgtfile, tgtsize, tgtsha1, *patchpairs):
- """Apply binary patches (in *patchpairs) to the given srcfile to
- produce tgtfile (which may be "-" to indicate overwriting the
- source file."""
- if len(patchpairs) % 2 != 0:
- raise ValueError("bad patches given to ApplyPatch")
- self.script.append(
- ("run_program PACKAGE:applypatch %s %s %s %d " %
- (srcfile, tgtfile, tgtsha1, tgtsize)) +
- " ".join(["%s:%s" % patchpairs[i:i+2]
- for i in range(0, len(patchpairs), 2)]))
- self.included_files.add(("applypatch_static", "applypatch"))
-
- def WriteFirmwareImage(self, kind, fn):
- """Arrange to update the given firmware image (kind must be
- "hboot" or "radio") when recovery finishes."""
- self.script.append("write_%s_image PACKAGE:%s" % (kind, fn))
-
- def WriteRawImage(self, partition, fn):
- """Write the given file into the given MTD partition."""
- self.script.append("write_raw_image PACKAGE:%s %s" %
- (fn, self._PartitionRoot(partition)))
-
- def SetPermissions(self, fn, uid, gid, mode):
- """Set file ownership and permissions."""
- fn = self._FileRoot(fn)
- self.script.append("set_perm %d %d 0%o %s" % (uid, gid, mode, fn))
-
- def SetPermissionsRecursive(self, fn, uid, gid, dmode, fmode):
- """Recursively set path ownership and permissions."""
- fn = self._FileRoot(fn)
- self.script.append("set_perm_recursive %d %d 0%o 0%o %s" %
- (uid, gid, dmode, fmode, fn))
-
- def MakeSymlinks(self, symlink_list):
- """Create symlinks, given a list of (dest, link) pairs."""
- self.DeleteFiles([i[1] for i in symlink_list])
- self.script.extend(["symlink %s %s" % (i[0], self._FileRoot(i[1]))
- for i in sorted(symlink_list)])
-
- def AppendExtra(self, extra):
- """Append text verbatim to the output script."""
- self.script.append(extra)
-
- def UnmountAll(self):
- pass
-
- def AddToZip(self, input_zip, output_zip, input_path=None):
- """Write the accumulated script to the output_zip file. input_zip
- is used as the source for any ancillary binaries needed by the
- script. If input_path is not None, it will be used as a local
- path for binaries instead of input_zip."""
- common.ZipWriteStr(output_zip, "META-INF/com/google/android/update-script",
- "\n".join(self.script) + "\n")
- for i in self.included_files:
- if isinstance(i, tuple):
- sourcefn, targetfn = i
- else:
- sourcefn = i
- targetfn = i
- try:
- if input_path is None:
- data = input_zip.read(os.path.join("OTA/bin", sourcefn))
- else:
- data = open(os.path.join(input_path, sourcefn)).read()
- common.ZipWriteStr(output_zip, targetfn, data, perms=0755)
- except (IOError, KeyError), e:
- raise ExternalError("unable to include binary %s: %s" % (i, e))