diff options
Diffstat (limited to 'importpkg.py')
-rwxr-xr-x | importpkg.py | 54 |
1 files changed, 1 insertions, 53 deletions
diff --git a/importpkg.py b/importpkg.py index 5d6a58c..e0160e6 100755 --- a/importpkg.py +++ b/importpkg.py @@ -2,7 +2,6 @@ import hashlib import sqlite3 -import struct import sys import tarfile import zlib @@ -11,62 +10,11 @@ from debian.debian_support import version_compare from debian import deb822 import lzma +from dedup.arreader import ArReader from dedup.hashing import HashBlacklist, DecompressedHash, SuppressingHash, hash_file from dedup.compression import GzipDecompressor, DecompressedStream from dedup.image import ImageHash -class ArReader(object): - global_magic = b"!<arch>\n" - file_magic = b"`\n" - - def __init__(self, fileobj): - self.fileobj = fileobj - self.remaining = None - self.padding = 0 - - def skip(self, length): - while length: - data = self.fileobj.read(min(4096, length)) - if not data: - raise ValueError("archive truncated") - length -= len(data) - - def read_magic(self): - data = self.fileobj.read(len(self.global_magic)) - if data != self.global_magic: - raise ValueError("ar global header not found") - self.remaining = 0 - - def read_entry(self): - self.skip_current_entry() - if self.padding: - if self.fileobj.read(1) != '\n': - raise ValueError("missing ar padding") - self.padding = 0 - file_header = self.fileobj.read(60) - if not file_header: - raise EOFError("end of archive found") - parts = struct.unpack("16s 12s 6s 6s 8s 10s 2s", file_header) - parts = [p.rstrip(" ") for p in parts] - if parts.pop() != self.file_magic: - raise ValueError("ar file header not found") - self.remaining = int(parts[5]) - self.padding = self.remaining % 2 - return parts[0] # name - - def skip_current_entry(self): - self.skip(self.remaining) - self.remaining = 0 - - def read(self, length=None): - if length is None: - length = self.remaining - else: - length = min(self.remaining, length) - data = self.fileobj.read(length) - self.remaining -= len(data) - return data - class MultiHash(object): def __init__(self, *hashes): self.hashes = hashes |