diff options
author | Amin Hassani <ahassani@google.com> | 2017-12-07 12:13:03 -0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-01-23 01:48:49 -0800 |
commit | 0de7f7847ff2a101a905b75d2ed0867d5ac8fba7 (patch) | |
tree | 3cd366603d173fa7ed9cb0d3ef1b7a71ce1407a0 /scripts/update_payload/applier.py | |
parent | 840703a4cc77228e2606f45665ae3a4bd75ff7dd (diff) |
Relanding 'update_payload: Add XZ compression support'
This patch adds support for checking a payload that has REPLACE_XZ
operations. REPLACE_XZ was added in minor version 3.
BUG=chromium:758792
TEST=unittests pass; paycheck.py with a xz generated payload pass;
CQ-DEPEND=CL:823234
Change-Id: I6ec8068e233f2d595fda93a985923d85c59f150e
Reviewed-on: https://chromium-review.googlesource.com/872124
Commit-Ready: ChromeOS CL Exonerator Bot <chromiumos-cl-exonerator@appspot.gserviceaccount.com>
Tested-by: Amin Hassani <ahassani@chromium.org>
Reviewed-by: Ben Chan <benchan@chromium.org>
Reviewed-by: Sen Jiang <senj@chromium.org>
Diffstat (limited to 'scripts/update_payload/applier.py')
-rw-r--r-- | scripts/update_payload/applier.py | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/scripts/update_payload/applier.py b/scripts/update_payload/applier.py index e470ac4e..8af89e79 100644 --- a/scripts/update_payload/applier.py +++ b/scripts/update_payload/applier.py @@ -18,6 +18,20 @@ import array import bz2 import hashlib import itertools +# Not everywhere we can have the lzma library so we ignore it if we didn't have +# it because it is not going to be used. For example, 'cros flash' uses +# devserver code which eventually loads this file, but the lzma library is not +# included in the client test devices, and it is not necessary to do so. But +# lzma is not used in 'cros flash' so it should be fine. Python 3.x include +# lzma, but for backward compatibility with Python 2.7, backports-lzma is +# needed. +try: + import lzma +except ImportError: + try: + from backports import lzma + except ImportError: + pass import os import shutil import subprocess @@ -216,7 +230,7 @@ class PayloadApplier(object): self.truncate_to_expected_size = truncate_to_expected_size def _ApplyReplaceOperation(self, op, op_name, out_data, part_file, part_size): - """Applies a REPLACE{,_BZ} operation. + """Applies a REPLACE{,_BZ,_XZ} operation. Args: op: the operation object @@ -235,6 +249,10 @@ class PayloadApplier(object): if op.type == common.OpType.REPLACE_BZ: out_data = bz2.decompress(out_data) data_length = len(out_data) + elif op.type == common.OpType.REPLACE_XZ: + # pylint: disable=no-member + out_data = lzma.decompress(out_data) + data_length = len(out_data) # Write data to blocks specified in dst extents. data_start = 0 @@ -508,7 +526,8 @@ class PayloadApplier(object): # Read data blob. data = self.payload.ReadDataBlob(op.data_offset, op.data_length) - if op.type in (common.OpType.REPLACE, common.OpType.REPLACE_BZ): + if op.type in (common.OpType.REPLACE, common.OpType.REPLACE_BZ, + common.OpType.REPLACE_XZ): self._ApplyReplaceOperation(op, op_name, data, new_part_file, part_size) elif op.type == common.OpType.MOVE: self._ApplyMoveOperation(op, op_name, new_part_file) |