summaryrefslogtreecommitdiff
path: root/dedup/compression.py
diff options
context:
space:
mode:
authorHelmut Grohne <helmut@subdivi.de>2021-12-31 15:45:33 +0100
committerHelmut Grohne <helmut@subdivi.de>2021-12-31 15:45:33 +0100
commitf3ea68482e6c01053cb202573d953e8a2e89529f (patch)
tree4c08f6e5a99bbe5131c0949e7f97cc44cf4a2cbd /dedup/compression.py
parentf2eda3ba74e5bc5613e84381ebd8bfd343e1c8cc (diff)
parent5b359b10053cbade539246eec26e86b44793ca40 (diff)
downloaddebian-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.py46
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):