# Copyright (c) 2015 SUSE Linux GmbH. All rights reserved.
#
# This file is part of kiwi.
#
# kiwi is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# kiwi is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with kiwi. If not, see <http://www.gnu.org/licenses/>
#
import os
import logging
from typing import List, Optional
# project
from kiwi.utils.temporary import Temporary
from kiwi.command import Command
from kiwi.defaults import Defaults
from kiwi.exceptions import (
KiwiFileNotFound,
KiwiCompressionFormatUnknown
)
log = logging.getLogger('kiwi')
[docs]
class Compress:
"""
**File compression / decompression**
:param bool keep_source: Request to keep the uncompressed source
:param str source_filename: Source file name to compress
:param list supported_zipper: List of supported compression tools
:param str compressed_filename: Compressed file name path with
compression suffix
:param str uncompressed_filename:
Uncompressed file name path
"""
def __init__(
self, source_filename: str, keep_source_on_compress: bool = False
) -> None:
if not os.path.exists(source_filename):
raise KiwiFileNotFound(
'compression source file %s not found' % source_filename
)
self.keep_source = keep_source_on_compress
self.source_filename = source_filename
self.supported_zipper = [
'xz', 'gzip'
]
self.compressed_filename: Optional[str] = None
self.uncompressed_filename: Optional[str] = None
[docs]
def xz(self, options: Optional[List[str]] = None) -> str:
"""
Create XZ compressed file
:param list options: custom xz compression options
"""
if not options:
options = Defaults.get_xz_compression_options()
assert options
if self.keep_source:
options.append('--keep')
Command.run(
['xz', '-f'] + options + [self.source_filename]
)
self.compressed_filename = self.source_filename + '.xz'
return self.compressed_filename
[docs]
def gzip(self) -> str:
"""
Create gzip(max compression) compressed file
"""
options = [
'-9'
]
if self.keep_source:
options.append('--keep')
Command.run(
['gzip', '-f'] + options + [self.source_filename]
)
self.compressed_filename = self.source_filename + '.gz'
return self.compressed_filename
[docs]
def uncompress(self, temporary: bool = False) -> str:
"""
Uncompress with format autodetection
By default the original source file will be changed into
the uncompressed variant. If temporary is set to True
a temporary file is created instead
:param bool temporary: uncompress to a temporary file
"""
zipper = self.get_format()
if not zipper:
raise KiwiCompressionFormatUnknown(
'could not detect compression format for %s' %
self.source_filename
)
if not temporary:
Command.run([zipper, '-d', self.source_filename])
self.uncompressed_filename = self.source_filename
else:
self.temp_file = Temporary().new_file()
bash_command = [
zipper, '-c', '-d', self.source_filename,
'>', self.temp_file.name
]
Command.run(['bash', '-c', ' '.join(bash_command)])
self.uncompressed_filename = self.temp_file.name
return self.uncompressed_filename