mirror of
				https://github.com/smaeul/u-boot.git
				synced 2025-11-04 05:50:17 +00:00 
			
		
		
		
	Bintool.version already contains everything required to get the version out of lz4 binary so let's not override it with its own implementation. Signed-off-by: Quentin Schulz <quentin.schulz@theobroma-systems.com> Reviewed-by: Simon Glass <sjg@chromium.org>
		
			
				
	
	
		
			129 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
# SPDX-License-Identifier: GPL-2.0+
 | 
						|
# Copyright 2022 Google LLC
 | 
						|
#
 | 
						|
"""Bintool implementation for lz4
 | 
						|
 | 
						|
lz4 allows compression and decompression of files.
 | 
						|
 | 
						|
Documentation is available via::
 | 
						|
 | 
						|
   man lz4
 | 
						|
 | 
						|
Here is the help:
 | 
						|
 | 
						|
*** LZ4 command line interface 64-bits v1.9.3, by Yann Collet ***
 | 
						|
Usage :
 | 
						|
      lz4 [arg] [input] [output]
 | 
						|
 | 
						|
input   : a filename
 | 
						|
          with no FILE, or when FILE is - or stdin, read standard input
 | 
						|
Arguments :
 | 
						|
 -1     : Fast compression (default)
 | 
						|
 -9     : High compression
 | 
						|
 -d     : decompression (default for .lz4 extension)
 | 
						|
 -z     : force compression
 | 
						|
 -D FILE: use FILE as dictionary
 | 
						|
 -f     : overwrite output without prompting
 | 
						|
 -k     : preserve source files(s)  (default)
 | 
						|
--rm    : remove source file(s) after successful de/compression
 | 
						|
 -h/-H  : display help/long help and exit
 | 
						|
 | 
						|
Advanced arguments :
 | 
						|
 -V     : display Version number and exit
 | 
						|
 -v     : verbose mode
 | 
						|
 -q     : suppress warnings; specify twice to suppress errors too
 | 
						|
 -c     : force write to standard output, even if it is the console
 | 
						|
 -t     : test compressed file integrity
 | 
						|
 -m     : multiple input files (implies automatic output filenames)
 | 
						|
 -r     : operate recursively on directories (sets also -m)
 | 
						|
 -l     : compress using Legacy format (Linux kernel compression)
 | 
						|
 -B#    : cut file into blocks of size # bytes [32+]
 | 
						|
                     or predefined block size [4-7] (default: 7)
 | 
						|
 -BI    : Block Independence (default)
 | 
						|
 -BD    : Block dependency (improves compression ratio)
 | 
						|
 -BX    : enable block checksum (default:disabled)
 | 
						|
--no-frame-crc : disable stream checksum (default:enabled)
 | 
						|
--content-size : compressed frame includes original size (default:not present)
 | 
						|
--list FILE : lists information about .lz4 files (useful for files compressed
 | 
						|
    with --content-size flag)
 | 
						|
--[no-]sparse  : sparse mode (default:enabled on file, disabled on stdout)
 | 
						|
--favor-decSpeed: compressed files decompress faster, but are less compressed
 | 
						|
--fast[=#]: switch to ultra fast compression level (default: 1)
 | 
						|
--best  : same as -12
 | 
						|
Benchmark arguments :
 | 
						|
 -b#    : benchmark file(s), using # compression level (default : 1)
 | 
						|
 -e#    : test all compression levels from -bX to # (default : 1)
 | 
						|
 -i#    : minimum evaluation time in seconds (default : 3s)
 | 
						|
"""
 | 
						|
 | 
						|
import re
 | 
						|
import tempfile
 | 
						|
 | 
						|
from binman import bintool
 | 
						|
from patman import tools
 | 
						|
 | 
						|
# pylint: disable=C0103
 | 
						|
class Bintoollz4(bintool.Bintool):
 | 
						|
    """Compression/decompression using the LZ4 algorithm
 | 
						|
 | 
						|
    This bintool supports running `lz4` 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 lz4
 | 
						|
    """
 | 
						|
    def __init__(self, name):
 | 
						|
        super().__init__(name, 'lz4 compression', r'.* (v[0-9.]*),.*')
 | 
						|
 | 
						|
    def compress(self, indata):
 | 
						|
        """Compress data with lz4
 | 
						|
 | 
						|
        Args:
 | 
						|
            indata (bytes): Data to compress
 | 
						|
 | 
						|
        Returns:
 | 
						|
            bytes: Compressed data
 | 
						|
        """
 | 
						|
        with tempfile.NamedTemporaryFile(prefix='comp.tmp',
 | 
						|
                                         dir=tools.get_output_dir()) as tmp:
 | 
						|
            tools.write_file(tmp.name, indata)
 | 
						|
            args = ['--no-frame-crc', '-B4', '-5', '-c', tmp.name]
 | 
						|
            return self.run_cmd(*args, binary=True)
 | 
						|
 | 
						|
    def decompress(self, indata):
 | 
						|
        """Decompress data with lz4
 | 
						|
 | 
						|
        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)
 | 
						|
            args = ['-cd', inf.name]
 | 
						|
            return self.run_cmd(*args, binary=True)
 | 
						|
 | 
						|
    def fetch(self, method):
 | 
						|
        """Fetch handler for lz4
 | 
						|
 | 
						|
        This installs the lz4 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('lz4')
 |