summaryrefslogtreecommitdiff
path: root/dedup/debpkg.py
diff options
context:
space:
mode:
Diffstat (limited to 'dedup/debpkg.py')
-rw-r--r--dedup/debpkg.py27
1 files changed, 9 insertions, 18 deletions
diff --git a/dedup/debpkg.py b/dedup/debpkg.py
index 38086ec..0ecb123 100644
--- a/dedup/debpkg.py
+++ b/dedup/debpkg.py
@@ -1,8 +1,8 @@
import tarfile
+import arpy
from debian import deb822
-from dedup.arreader import ArReader
from dedup.compression import decompress
from dedup.hashing import hash_file
@@ -52,45 +52,36 @@ class DebExtractor:
@param filelike: is a file-like object containing the contents of the
Debian packge and can be read once without seeks.
"""
- af = ArReader(filelike)
- af.read_magic()
- while True:
- try:
- name = af.read_entry()
- except EOFError:
- break
- else:
- self.handle_ar_member(name, af)
+ af = arpy.Archive(fileobj=filelike)
+ for member in af:
+ self.handle_ar_member(member)
self.handle_ar_end()
- def handle_ar_member(self, name, filelike):
+ def handle_ar_member(self, arfiledata: arpy.ArchiveFileData) -> None:
"""Handle an ar archive member of the Debian package.
If you replace this method, you must also replace handle_ar_end and
none of the methods handle_debversion, handle_control_tar or
handle_data_tar are called.
- @type name: bytes
- @param name: is the name of the member
- @param filelike: is a file-like object containing the contents of the
- member and can be read once without seeks.
"""
+ name = arfiledata.header.name
if self.arstate == "start":
if name != b"debian-binary":
raise ValueError("debian-binary not found")
- version = filelike.read()
+ version = arfiledata.read()
self.handle_debversion(version)
if not version.startswith(b"2."):
raise ValueError("debian version not recognized")
self.arstate = "version"
elif self.arstate == "version":
if name.startswith(b"control.tar"):
- filelike = decompress(filelike, name[11:].decode("ascii"))
+ filelike = decompress(arfiledata, name[11:].decode("ascii"))
self.handle_control_tar(opentar(filelike))
self.arstate = "control"
elif not name.startswith(b"_"):
raise ValueError("unexpected ar member %r" % name)
elif self.arstate == "control":
if name.startswith(b"data.tar"):
- filelike = decompress(filelike, name[8:].decode("ascii"))
+ filelike = decompress(arfiledata, name[8:].decode("ascii"))
self.handle_data_tar(opentar(filelike))
self.arstate = "data"
elif not name.startswith(b"_"):