diff options
author | Helmut Grohne <helmut@subdivi.de> | 2020-10-25 10:20:34 +0100 |
---|---|---|
committer | Helmut Grohne <helmut@subdivi.de> | 2020-10-25 10:20:34 +0100 |
commit | 4542d84439bbc6bd8f3151a9cb61d0ee85cd910e (patch) | |
tree | d615a378d7c4dc0113f23619dead9a6a099eecb3 /dedup/debpkg.py | |
parent | b4251e2cc3453852d93ad6a2c0c116991982c2f9 (diff) | |
download | debian-dedup-4542d84439bbc6bd8f3151a9cb61d0ee85cd910e.tar.gz |
externalize ar parsing to arpy
Diffstat (limited to 'dedup/debpkg.py')
-rw-r--r-- | dedup/debpkg.py | 27 |
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"_"): |