diff options
Diffstat (limited to 'libmat2')
| -rw-r--r-- | libmat2/archive.py | 27 |
1 files changed, 25 insertions, 2 deletions
diff --git a/libmat2/archive.py b/libmat2/archive.py index 48c1594..29db417 100644 --- a/libmat2/archive.py +++ b/libmat2/archive.py | |||
| @@ -120,6 +120,18 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser): | |||
| 120 | # pylint: disable=unused-argument | 120 | # pylint: disable=unused-argument |
| 121 | return member | 121 | return member |
| 122 | 122 | ||
| 123 | @staticmethod | ||
| 124 | def _get_member_compression(member: ArchiveMember): | ||
| 125 | """Get the compression of the archive member.""" | ||
| 126 | # pylint: disable=unused-argument | ||
| 127 | return None | ||
| 128 | |||
| 129 | @staticmethod | ||
| 130 | def _set_member_compression(member: ArchiveMember, compression) -> ArchiveMember: | ||
| 131 | """Set the compression of the archive member.""" | ||
| 132 | # pylint: disable=unused-argument | ||
| 133 | return member | ||
| 134 | |||
| 123 | def get_meta(self) -> Dict[str, Union[str, dict]]: | 135 | def get_meta(self) -> Dict[str, Union[str, dict]]: |
| 124 | meta = dict() # type: Dict[str, Union[str, dict]] | 136 | meta = dict() # type: Dict[str, Union[str, dict]] |
| 125 | 137 | ||
| @@ -184,6 +196,8 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser): | |||
| 184 | original_permissions = os.stat(full_path).st_mode | 196 | original_permissions = os.stat(full_path).st_mode |
| 185 | os.chmod(full_path, original_permissions | stat.S_IWUSR | stat.S_IRUSR) | 197 | os.chmod(full_path, original_permissions | stat.S_IWUSR | stat.S_IRUSR) |
| 186 | 198 | ||
| 199 | original_compression = self._get_member_compression(item) | ||
| 200 | |||
| 187 | if self._specific_cleanup(full_path) is False: | 201 | if self._specific_cleanup(full_path) is False: |
| 188 | logging.warning("Something went wrong during deep cleaning of %s", | 202 | logging.warning("Something went wrong during deep cleaning of %s", |
| 189 | member_name) | 203 | member_name) |
| @@ -223,6 +237,7 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser): | |||
| 223 | 237 | ||
| 224 | zinfo = self.member_class(member_name) # type: ignore | 238 | zinfo = self.member_class(member_name) # type: ignore |
| 225 | zinfo = self._set_member_permissions(zinfo, original_permissions) | 239 | zinfo = self._set_member_permissions(zinfo, original_permissions) |
| 240 | zinfo = self._set_member_compression(zinfo, original_compression) | ||
| 226 | clean_zinfo = self._clean_member(zinfo) | 241 | clean_zinfo = self._clean_member(zinfo) |
| 227 | self._add_file_to_archive(zout, clean_zinfo, full_path) | 242 | self._add_file_to_archive(zout, clean_zinfo, full_path) |
| 228 | 243 | ||
| @@ -368,7 +383,6 @@ class ZipParser(ArchiveBasedAbstractParser): | |||
| 368 | super().__init__(filename) | 383 | super().__init__(filename) |
| 369 | self.archive_class = zipfile.ZipFile | 384 | self.archive_class = zipfile.ZipFile |
| 370 | self.member_class = zipfile.ZipInfo | 385 | self.member_class = zipfile.ZipInfo |
| 371 | self.zip_compression_type = zipfile.ZIP_DEFLATED | ||
| 372 | 386 | ||
| 373 | def is_archive_valid(self): | 387 | def is_archive_valid(self): |
| 374 | try: | 388 | try: |
| @@ -410,7 +424,7 @@ class ZipParser(ArchiveBasedAbstractParser): | |||
| 410 | assert isinstance(member, zipfile.ZipInfo) # please mypy | 424 | assert isinstance(member, zipfile.ZipInfo) # please mypy |
| 411 | with open(full_path, 'rb') as f: | 425 | with open(full_path, 'rb') as f: |
| 412 | archive.writestr(member, f.read(), | 426 | archive.writestr(member, f.read(), |
| 413 | compress_type=self.zip_compression_type) | 427 | compress_type=member.compress_type) |
| 414 | 428 | ||
| 415 | @staticmethod | 429 | @staticmethod |
| 416 | def _get_all_members(archive: ArchiveClass) -> List[ArchiveMember]: | 430 | def _get_all_members(archive: ArchiveClass) -> List[ArchiveMember]: |
| @@ -421,3 +435,12 @@ class ZipParser(ArchiveBasedAbstractParser): | |||
| 421 | def _get_member_name(member: ArchiveMember) -> str: | 435 | def _get_member_name(member: ArchiveMember) -> str: |
| 422 | assert isinstance(member, zipfile.ZipInfo) # please mypy | 436 | assert isinstance(member, zipfile.ZipInfo) # please mypy |
| 423 | return member.filename | 437 | return member.filename |
| 438 | |||
| 439 | @staticmethod | ||
| 440 | def _get_member_compression(member: ArchiveMember): | ||
| 441 | return member.compress_type | ||
| 442 | |||
| 443 | @staticmethod | ||
| 444 | def _set_member_compression(member: ArchiveMember, compression) -> ArchiveMember: | ||
| 445 | member.compress_type = compression | ||
| 446 | return member | ||
