mirror of
https://github.com/AsahiLinux/u-boot
synced 2025-03-16 23:07:00 +00:00
binman: Move compression bintool management into entry class
Move management of the bintool to compress and decompress data into the entry class and add the bintool to the list of required bintools. Signed-off-by: Stefan Herbrechtsmeier <stefan.herbrechtsmeier@weidmueller.com> Reviewed-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
parent
edafeb8da6
commit
ec7d27d3a8
4 changed files with 41 additions and 83 deletions
|
@ -1,69 +0,0 @@
|
|||
# SPDX-License-Identifier: GPL-2.0+
|
||||
# Copyright 2022 Google LLC
|
||||
#
|
||||
"""Utilities to compress and decompress data"""
|
||||
|
||||
import tempfile
|
||||
|
||||
from binman import bintool
|
||||
from patman import tools
|
||||
|
||||
LZ4 = bintool.Bintool.create('lz4')
|
||||
HAVE_LZ4 = LZ4.is_present()
|
||||
|
||||
LZMA_ALONE = bintool.Bintool.create('lzma_alone')
|
||||
HAVE_LZMA_ALONE = LZMA_ALONE.is_present()
|
||||
|
||||
|
||||
def compress(indata, algo):
|
||||
"""Compress some data using a given algorithm
|
||||
|
||||
Note that for lzma this uses an old version of the algorithm, not that
|
||||
provided by xz.
|
||||
|
||||
This requires 'lz4' and 'lzma_alone' tools. It also requires an output
|
||||
directory to be previously set up, by calling PrepareOutputDir().
|
||||
|
||||
Args:
|
||||
indata (bytes): Input data to compress
|
||||
algo (str): Algorithm to use ('none', 'lz4' or 'lzma')
|
||||
|
||||
Returns:
|
||||
bytes: Compressed data
|
||||
"""
|
||||
if algo == 'none':
|
||||
return indata
|
||||
if algo == 'lz4':
|
||||
data = LZ4.compress(indata)
|
||||
# cbfstool uses a very old version of lzma
|
||||
elif algo == 'lzma':
|
||||
data = LZMA_ALONE.compress(indata)
|
||||
else:
|
||||
raise ValueError("Unknown algorithm '%s'" % algo)
|
||||
return data
|
||||
|
||||
def decompress(indata, algo):
|
||||
"""Decompress some data using a given algorithm
|
||||
|
||||
Note that for lzma this uses an old version of the algorithm, not that
|
||||
provided by xz.
|
||||
|
||||
This requires 'lz4' and 'lzma_alone' tools. It also requires an output
|
||||
directory to be previously set up, by calling PrepareOutputDir().
|
||||
|
||||
Args:
|
||||
indata (bytes): Input data to decompress
|
||||
algo (str): Algorithm to use ('none', 'lz4' or 'lzma')
|
||||
|
||||
Returns:
|
||||
(bytes) Compressed data
|
||||
"""
|
||||
if algo == 'none':
|
||||
return indata
|
||||
if algo == 'lz4':
|
||||
data = LZ4.decompress(indata)
|
||||
elif algo == 'lzma':
|
||||
data = LZMA_ALONE.decompress(indata)
|
||||
else:
|
||||
raise ValueError("Unknown algorithm '%s'" % algo)
|
||||
return data
|
|
@ -12,7 +12,6 @@ import sys
|
|||
import time
|
||||
|
||||
from binman import bintool
|
||||
from binman import comp_util
|
||||
from dtoc import fdt_util
|
||||
from patman import tools
|
||||
from patman.tools import to_hex, to_hex_size
|
||||
|
@ -83,6 +82,7 @@ class Entry(object):
|
|||
missing_bintools: List of missing bintools for this entry
|
||||
update_hash: True if this entry's "hash" subnode should be
|
||||
updated with a hash of the entry contents
|
||||
comp_bintool: Bintools used for compress and decompress data
|
||||
fake_fname: Fake filename, if one was created, else None
|
||||
required_props (dict of str): Properties which must be present. This can
|
||||
be added to by subclasses
|
||||
|
@ -124,6 +124,7 @@ class Entry(object):
|
|||
self.update_hash = True
|
||||
self.fake_fname = None
|
||||
self.required_props = []
|
||||
self.comp_bintool = None
|
||||
|
||||
@staticmethod
|
||||
def FindEntryClass(etype, expanded):
|
||||
|
@ -1117,7 +1118,9 @@ features to produce new behaviours.
|
|||
self.uncomp_data = indata
|
||||
if self.compress != 'none':
|
||||
self.uncomp_size = len(indata)
|
||||
data = comp_util.compress(indata, self.compress)
|
||||
data = self.comp_bintool.compress(indata)
|
||||
else:
|
||||
data = indata
|
||||
return data
|
||||
|
||||
def DecompressData(self, indata):
|
||||
|
@ -1129,9 +1132,11 @@ features to produce new behaviours.
|
|||
Returns:
|
||||
Decompressed data
|
||||
"""
|
||||
data = comp_util.decompress(indata, self.compress)
|
||||
if self.compress != 'none':
|
||||
data = self.comp_bintool.decompress(indata)
|
||||
self.uncomp_size = len(data)
|
||||
else:
|
||||
data = indata
|
||||
self.uncomp_data = data
|
||||
return data
|
||||
|
||||
|
@ -1172,8 +1177,18 @@ features to produce new behaviours.
|
|||
|
||||
Args:
|
||||
btools (dict of Bintool):
|
||||
|
||||
Raise:
|
||||
ValueError if compression algorithm is not supported
|
||||
"""
|
||||
pass
|
||||
algo = self.compress
|
||||
if algo != 'none':
|
||||
algos = ['lz4', 'lzma']
|
||||
if algo not in algos:
|
||||
raise ValueError("Unknown algorithm '%s'" % algo)
|
||||
names = {'lzma': 'lzma_alone'}
|
||||
name = names.get(self.compress, self.compress)
|
||||
self.comp_bintool = self.AddBintool(btools, name)
|
||||
|
||||
@classmethod
|
||||
def AddBintool(self, tools, name):
|
||||
|
|
|
@ -23,7 +23,6 @@ import urllib.error
|
|||
from binman import bintool
|
||||
from binman import cbfs_util
|
||||
from binman import cmdline
|
||||
from binman import comp_util
|
||||
from binman import control
|
||||
from binman import elf
|
||||
from binman import elf_test
|
||||
|
@ -5229,15 +5228,6 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
self._DoBinman(*args)
|
||||
self.assertIn('failed to fetch with all methods', stdout.getvalue())
|
||||
|
||||
def testInvalidCompress(self):
|
||||
with self.assertRaises(ValueError) as e:
|
||||
comp_util.compress(b'', 'invalid')
|
||||
self.assertIn("Unknown algorithm 'invalid'", str(e.exception))
|
||||
|
||||
with self.assertRaises(ValueError) as e:
|
||||
comp_util.decompress(b'1234', 'invalid')
|
||||
self.assertIn("Unknown algorithm 'invalid'", str(e.exception))
|
||||
|
||||
def testBintoolDocs(self):
|
||||
"""Test for creation of bintool documentation"""
|
||||
with test_util.capture_sys_output() as (stdout, stderr):
|
||||
|
@ -5858,6 +5848,12 @@ fdt fdtmap Extract the devicetree blob from the fdtmap
|
|||
orig2 = self._decompress(comp_data)
|
||||
self.assertEqual(orig, orig2)
|
||||
|
||||
def testInvalidCompress(self):
|
||||
"""Test that invalid compress algorithm is detected"""
|
||||
with self.assertRaises(ValueError) as e:
|
||||
self._DoTestFile('237_compress_dtb_invalid.dts')
|
||||
self.assertIn("Unknown algorithm 'invalid'", str(e.exception))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
|
16
tools/binman/test/237_compress_dtb_invalid.dts
Normal file
16
tools/binman/test/237_compress_dtb_invalid.dts
Normal file
|
@ -0,0 +1,16 @@
|
|||
// SPDX-License-Identifier: GPL-2.0+
|
||||
|
||||
/dts-v1/;
|
||||
|
||||
/ {
|
||||
#address-cells = <1>;
|
||||
#size-cells = <1>;
|
||||
|
||||
binman {
|
||||
u-boot {
|
||||
};
|
||||
u-boot-dtb {
|
||||
compress = "invalid";
|
||||
};
|
||||
};
|
||||
};
|
Loading…
Add table
Reference in a new issue