summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libmat2/archive.py20
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
378class TarGzParser(TarParser): 387class 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()