diff options
Diffstat (limited to 'libmat2')
| -rw-r--r-- | libmat2/archive.py | 20 |
1 files changed, 17 insertions, 3 deletions
diff --git a/libmat2/archive.py b/libmat2/archive.py index 76679e6..beadd50 100644 --- a/libmat2/archive.py +++ b/libmat2/archive.py | |||
| @@ -105,6 +105,11 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser): | |||
| 105 | def _get_member_name(member: ArchiveMember) -> str: | 105 | def _get_member_name(member: ArchiveMember) -> str: |
| 106 | """Return the name of the given member.""" | 106 | """Return the name of the given member.""" |
| 107 | 107 | ||
| 108 | @staticmethod | ||
| 109 | @abc.abstractmethod | ||
| 110 | def _is_dir(member: ArchiveMember) -> bool: | ||
| 111 | """Return true is the given member is a directory.""" | ||
| 112 | |||
| 108 | @abc.abstractmethod | 113 | @abc.abstractmethod |
| 109 | def _add_file_to_archive(self, archive: ArchiveClass, member: ArchiveMember, | 114 | def _add_file_to_archive(self, archive: ArchiveClass, member: ArchiveMember, |
| 110 | full_path: str): | 115 | full_path: str): |
| @@ -138,8 +143,7 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser): | |||
| 138 | local_meta = self._get_member_meta(item) | 143 | local_meta = self._get_member_meta(item) |
| 139 | member_name = self._get_member_name(item) | 144 | member_name = self._get_member_name(item) |
| 140 | 145 | ||
| 141 | if member_name[-1] == '/': # pragma: no cover | 146 | if self._is_dir(item): # pragma: no cover |
| 142 | # `is_dir` is added in Python3.6 | ||
| 143 | continue # don't keep empty folders | 147 | continue # don't keep empty folders |
| 144 | 148 | ||
| 145 | zin.extract(member=item, path=temp_folder) | 149 | zin.extract(member=item, path=temp_folder) |
| @@ -183,7 +187,7 @@ class ArchiveBasedAbstractParser(abstract.AbstractParser): | |||
| 183 | # we're iterating (and thus inserting) them in lexicographic order. | 187 | # we're iterating (and thus inserting) them in lexicographic order. |
| 184 | for item in items: | 188 | for item in items: |
| 185 | member_name = self._get_member_name(item) | 189 | member_name = self._get_member_name(item) |
| 186 | if member_name[-1] == '/': # `is_dir` is added in Python3.6 | 190 | if self._is_dir(item): |
| 187 | continue # don't keep empty folders | 191 | continue # don't keep empty folders |
| 188 | 192 | ||
| 189 | full_path = os.path.join(temp_folder, member_name) | 193 | full_path = os.path.join(temp_folder, member_name) |
| @@ -374,6 +378,11 @@ class TarParser(ArchiveBasedAbstractParser): | |||
| 374 | member.mode = permissions | 378 | member.mode = permissions |
| 375 | return member | 379 | return member |
| 376 | 380 | ||
| 381 | @staticmethod | ||
| 382 | def _is_dir(member: ArchiveMember) -> bool: | ||
| 383 | assert isinstance(member, tarfile.TarInfo) # please mypy | ||
| 384 | return member.isdir() | ||
| 385 | |||
| 377 | 386 | ||
| 378 | class TarGzParser(TarParser): | 387 | class TarGzParser(TarParser): |
| 379 | compression = ':gz' | 388 | compression = ':gz' |
| @@ -460,3 +469,8 @@ class ZipParser(ArchiveBasedAbstractParser): | |||
| 460 | assert isinstance(member, zipfile.ZipInfo) # please mypy | 469 | assert isinstance(member, zipfile.ZipInfo) # please mypy |
| 461 | member.compress_type = compression | 470 | member.compress_type = compression |
| 462 | return member | 471 | return member |
| 472 | |||
| 473 | @staticmethod | ||
| 474 | def _is_dir(member: ArchiveMember) -> bool: | ||
| 475 | assert isinstance(member, zipfile.ZipInfo) # please mypy | ||
| 476 | return member.is_dir() | ||
