aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2021-12-06 17:45:47 +0100
committerDenis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>2021-12-07 17:10:20 +0100
commit1cbd0b3c2e7168ad8b61f1a0d90a1c6ab0017c12 (patch)
tree4dd0b943776e99f7b113095c4c4317755616e0d9
parent541b3c83b2da3be57ebcf562a9a84c059de586fa (diff)
downloadexternal_mat2-master.tar.gz
external_mat2-master.tar.bz2
external_mat2-master.zip
zip archives: keep individual files compression typeHEADreplicant-11master
While hardcoding the compression to zipfile.ZIP_DEFLATED works for most use cases of mat, being able to produce cleaned up uncompressed zip files is useful for content that cannot be compressed more. In addition it also enables to use mat2 for reproducible builds of Android bootanimation files file that don't support compression. Signed-off-by: Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
-rw-r--r--libmat2/archive.py24
1 files changed, 22 insertions, 2 deletions
diff --git a/libmat2/archive.py b/libmat2/archive.py
index 48c1594..3f9c8a7 100644
--- a/libmat2/archive.py
+++ b/libmat2/archive.py
@@ -120,6 +120,15 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser):
# pylint: disable=unused-argument
return member
+ @staticmethod
+ def _get_member_compression(member: ArchiveMember):
+ """Get the compression of the archive member."""
+
+ @staticmethod
+ def _set_member_compression(member: ArchiveMember, compression) -> ArchiveMember:
+ """Set the compression of the archive member."""
+ return member
+
def get_meta(self) -> Dict[str, Union[str, dict]]:
meta = dict() # type: Dict[str, Union[str, dict]]
@@ -184,6 +193,8 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser):
original_permissions = os.stat(full_path).st_mode
os.chmod(full_path, original_permissions | stat.S_IWUSR | stat.S_IRUSR)
+ original_compression = self._get_member_compression(item)
+
if self._specific_cleanup(full_path) is False:
logging.warning("Something went wrong during deep cleaning of %s",
member_name)
@@ -223,6 +234,7 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser):
zinfo = self.member_class(member_name) # type: ignore
zinfo = self._set_member_permissions(zinfo, original_permissions)
+ zinfo = self._set_member_compression(zinfo, original_compression)
clean_zinfo = self._clean_member(zinfo)
self._add_file_to_archive(zout, clean_zinfo, full_path)
@@ -368,7 +380,6 @@ class ZipParser(ArchiveBasedAbstractParser):
super().__init__(filename)
self.archive_class = zipfile.ZipFile
self.member_class = zipfile.ZipInfo
- self.zip_compression_type = zipfile.ZIP_DEFLATED
def is_archive_valid(self):
try:
@@ -410,7 +421,7 @@ class ZipParser(ArchiveBasedAbstractParser):
assert isinstance(member, zipfile.ZipInfo) # please mypy
with open(full_path, 'rb') as f:
archive.writestr(member, f.read(),
- compress_type=self.zip_compression_type)
+ compress_type=member.compress_type)
@staticmethod
def _get_all_members(archive: ArchiveClass) -> List[ArchiveMember]:
@@ -421,3 +432,12 @@ class ZipParser(ArchiveBasedAbstractParser):
def _get_member_name(member: ArchiveMember) -> str:
assert isinstance(member, zipfile.ZipInfo) # please mypy
return member.filename
+
+ @staticmethod
+ def _get_member_compression(member: ArchiveMember):
+ return member.compress_type
+
+ @staticmethod
+ def _set_member_compression(member: ArchiveMember, compression) -> ArchiveMember:
+ member.compress_type = compression
+ return member