mirror of
https://github.com/AsahiLinux/u-boot
synced 2024-12-26 21:13:48 +00:00
4583c00236
The patman directory has a number of modules which are used by other tools in U-Boot. This makes it hard to package the tools using pypi since the common files must be copied along with the tool that uses them. To address this, move these files into a new u_boot_pylib library. This can be packaged separately and listed as a dependency of each tool. Signed-off-by: Simon Glass <sjg@chromium.org>
126 lines
4 KiB
Python
126 lines
4 KiB
Python
# SPDX-License-Identifier: GPL-2.0+
|
|
# Copyright 2022 Google LLC
|
|
#
|
|
"""Bintool implementation for lzma_alone
|
|
|
|
lzma_alone allows compression and decompression of files, using an older version
|
|
of lzma.
|
|
|
|
Documentation is available via::
|
|
|
|
man lzma_alone
|
|
|
|
Here is the help:
|
|
|
|
LZMA 9.22 beta : Igor Pavlov : Public domain : 2011-04-18
|
|
|
|
Usage: LZMA <e|d> inputFile outputFile [<switches>...]
|
|
e: encode file
|
|
d: decode file
|
|
b: Benchmark
|
|
<Switches>
|
|
-a{N}: set compression mode - [0, 1], default: 1 (max)
|
|
-d{N}: set dictionary size - [12, 30], default: 23 (8MB)
|
|
-fb{N}: set number of fast bytes - [5, 273], default: 128
|
|
-mc{N}: set number of cycles for match finder
|
|
-lc{N}: set number of literal context bits - [0, 8], default: 3
|
|
-lp{N}: set number of literal pos bits - [0, 4], default: 0
|
|
-pb{N}: set number of pos bits - [0, 4], default: 2
|
|
-mf{MF_ID}: set Match Finder: [bt2, bt3, bt4, hc4], default: bt4
|
|
-mt{N}: set number of CPU threads
|
|
-eos: write End Of Stream marker
|
|
-si: read data from stdin
|
|
-so: write data to stdout
|
|
"""
|
|
|
|
import re
|
|
import tempfile
|
|
|
|
from binman import bintool
|
|
from u_boot_pylib import tools
|
|
|
|
# pylint: disable=C0103
|
|
class Bintoollzma_alone(bintool.Bintool):
|
|
"""Compression/decompression using the LZMA algorithm
|
|
|
|
This bintool supports running `lzma_alone` to compress and decompress data,
|
|
as used by binman.
|
|
|
|
It is also possible to fetch the tool, which uses `apt` to install it.
|
|
|
|
Documentation is available via::
|
|
|
|
man lzma_alone
|
|
"""
|
|
def __init__(self, name):
|
|
super().__init__(name, 'lzma_alone compression')
|
|
|
|
def compress(self, indata):
|
|
"""Compress data with lzma_alone
|
|
|
|
Args:
|
|
indata (bytes): Data to compress
|
|
|
|
Returns:
|
|
bytes: Compressed data
|
|
"""
|
|
with tempfile.NamedTemporaryFile(prefix='comp.tmp',
|
|
dir=tools.get_output_dir()) as inf:
|
|
tools.write_file(inf.name, indata)
|
|
with tempfile.NamedTemporaryFile(prefix='compo.otmp',
|
|
dir=tools.get_output_dir()) as outf:
|
|
args = ['e', inf.name, outf.name, '-lc1', '-lp0', '-pb0', '-d8']
|
|
self.run_cmd(*args, binary=True)
|
|
return tools.read_file(outf.name)
|
|
|
|
def decompress(self, indata):
|
|
"""Decompress data with lzma_alone
|
|
|
|
Args:
|
|
indata (bytes): Data to decompress
|
|
|
|
Returns:
|
|
bytes: Decompressed data
|
|
"""
|
|
with tempfile.NamedTemporaryFile(prefix='decomp.tmp',
|
|
dir=tools.get_output_dir()) as inf:
|
|
tools.write_file(inf.name, indata)
|
|
with tempfile.NamedTemporaryFile(prefix='compo.otmp',
|
|
dir=tools.get_output_dir()) as outf:
|
|
args = ['d', inf.name, outf.name]
|
|
self.run_cmd(*args, binary=True)
|
|
return tools.read_file(outf.name, binary=True)
|
|
|
|
def fetch(self, method):
|
|
"""Fetch handler for lzma_alone
|
|
|
|
This installs the lzma-alone package using the apt utility.
|
|
|
|
Args:
|
|
method (FETCH_...): Method to use
|
|
|
|
Returns:
|
|
True if the file was fetched and now installed, None if a method
|
|
other than FETCH_BIN was requested
|
|
|
|
Raises:
|
|
Valuerror: Fetching could not be completed
|
|
"""
|
|
if method != bintool.FETCH_BIN:
|
|
return None
|
|
return self.apt_install('lzma-alone')
|
|
|
|
def version(self):
|
|
"""Version handler
|
|
|
|
Returns:
|
|
str: Version number of lzma_alone
|
|
"""
|
|
out = self.run_cmd_result('', raise_on_error=False).stderr.strip()
|
|
lines = out.splitlines()
|
|
if not lines:
|
|
return super().version()
|
|
out = lines[0]
|
|
# e.g. LZMA 9.22 beta : Igor Pavlov : Public domain : 2011-04-18
|
|
m_version = re.match(r'LZMA ([^:]*).*', out)
|
|
return m_version.group(1).strip() if m_version else out
|