diff options
author | Helmut Grohne <helmut@subdivi.de> | 2021-12-31 15:45:33 +0100 |
---|---|---|
committer | Helmut Grohne <helmut@subdivi.de> | 2021-12-31 15:45:33 +0100 |
commit | f3ea68482e6c01053cb202573d953e8a2e89529f (patch) | |
tree | 4c08f6e5a99bbe5131c0949e7f97cc44cf4a2cbd /dedup/compression.py | |
parent | f2eda3ba74e5bc5613e84381ebd8bfd343e1c8cc (diff) | |
parent | 5b359b10053cbade539246eec26e86b44793ca40 (diff) | |
download | debian-dedup-f3ea68482e6c01053cb202573d953e8a2e89529f.tar.gz |
Merge branch master into branch multiarchhints
Among other things, this drops Python 2.x support.
Diffstat (limited to 'dedup/compression.py')
-rw-r--r-- | dedup/compression.py | 46 |
1 files changed, 20 insertions, 26 deletions
diff --git a/dedup/compression.py b/dedup/compression.py index 8d1912b..da6e9a0 100644 --- a/dedup/compression.py +++ b/dedup/compression.py @@ -1,13 +1,10 @@ import bz2 import struct -import sys import zlib import lzma -crc32_type = "L" if sys.version_info.major >= 3 else "l" - -class GzipDecompressor(object): +class GzipDecompressor: """An interface to gzip which is similar to bz2.BZ2Decompressor and lzma.LZMADecompressor.""" def __init__(self): @@ -66,7 +63,7 @@ class GzipDecompressor(object): elif not self.sawheader: return self.inbuffer else: - expect = struct.pack("<" + crc32_type + "L", self.crc, self.size) + expect = struct.pack("<LL", self.crc, self.size) if self.inbuffer.startswith(expect) and \ self.inbuffer[len(expect):].replace(b"\0", b"") == b"": return b"" @@ -90,7 +87,7 @@ class GzipDecompressor(object): new.size = self.size return new -class DecompressedStream(object): +class DecompressedStream: """Turn a readable file-like into a decompressed file-like. It supports read(optional length), tell, seek(forward only) and close.""" blocksize = 65536 @@ -104,25 +101,23 @@ class DecompressedStream(object): """ self.fileobj = fileobj self.decompressor = decompressor - self.buff = b"" + self.buff = bytearray() self.pos = 0 - self.closed = False def _fill_buff_until(self, predicate): - assert not self.closed - data = True - while True: - if predicate(self.buff) or not data: - return + assert self.fileobj is not None + while not predicate(self.buff): data = self.fileobj.read(self.blocksize) if data: self.buff += self.decompressor.decompress(data) - elif hasattr(self.decompressor, "flush"): - self.buff += self.decompressor.flush() + else: + if hasattr(self.decompressor, "flush"): + self.buff += self.decompressor.flush() + break def _read_from_buff(self, length): - ret = self.buff[:length] - self.buff = self.buff[length:] + ret = bytes(self.buff[:length]) + self.buff[:length] = b"" self.pos += length return ret @@ -146,12 +141,12 @@ class DecompressedStream(object): return iter(self.readline, b'') def tell(self): - assert not self.closed + assert self.fileobj is not None return self.pos def seek(self, pos): """Forward seeks by absolute position only.""" - assert not self.closed + assert self.fileobj is not None if pos < self.pos: raise ValueError("negative seek not allowed on decompressed stream") while True: @@ -165,18 +160,17 @@ class DecompressedStream(object): return def close(self): - if not self.closed: + if self.fileobj is not None: self.fileobj.close() self.fileobj = None self.decompressor = None - self.buff = b"" - self.closed = True + self.buff = bytearray() decompressors = { - u'.gz': GzipDecompressor, - u'.bz2': bz2.BZ2Decompressor, - u'.lzma': lzma.LZMADecompressor, - u'.xz': lzma.LZMADecompressor, + '.gz': GzipDecompressor, + '.bz2': bz2.BZ2Decompressor, + '.lzma': lzma.LZMADecompressor, + '.xz': lzma.LZMADecompressor, } def decompress(filelike, extension): |