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: If82c767a201b189e464f459d5c19485e5278d9b1
Reviewed-on: https://chromium-review.googlesource.com/823227
Commit-Ready: Amin Hassani <ahassani@chromium.org>
Tested-by: Amin Hassani <ahassani@chromium.org>
Reviewed-by: Ben Chan <benchan@chromium.org>
Reviewed-by: Sen Jiang <senj@chromium.org>
diff --git a/scripts/update_payload/applier.py b/scripts/update_payload/applier.py
index 3cb9741..eeb2e42 100644
--- a/scripts/update_payload/applier.py
+++ b/scripts/update_payload/applier.py
@@ -18,6 +18,10 @@
import bz2
import hashlib
import itertools
+try:
+ import lzma
+except ImportError:
+ from backports import lzma
import os
import shutil
import subprocess
@@ -217,7 +221,7 @@
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
@@ -236,6 +240,9 @@
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:
+ out_data = lzma.decompress(out_data)
+ data_length = len(out_data)
# Write data to blocks specified in dst extents.
data_start = 0
@@ -507,7 +514,8 @@
# 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)