##// END OF EJS Templates
revlog: make compressed size comparisons consistent...
revlog: make compressed size comparisons consistent revlog.compress() compares the compressed size to the input size and throws away the compressed data if it is larger than the input. This is the correct thing to do, as storing compressed data that is larger than the input takes up more storage space and makes reading slower. However, the comparison was implemented inconsistently. For the streaming compression mode, we threw away the result if it was greater than or equal to the input size. But for the one-shot compression, we threw away the compression only if it was greater than the input size! This patch changes the comparison for the simple case so it is consistent with the streaming case. As a few tests demonstrate, this adds 1 byte to some revlog entries. This is because of an added 'u' header on the chunk. It seems somewhat wrong to increase the revlog size here. However, IMO the cost of 1 byte in storage is insignificant compared to the performance gains of avoiding decompression. This patch should invite questions around the heuristic for throwing away compressed data. For example, I'd argue we should be more liberal about rejecting compressed data, additionally doing so where the number of bytes saved fails to reach a threshold. But we can have this discussion another time.

File last commit:

r27334:9007f697 default
r30792:4215dc1b default
Show More
base85.py
77 lines | 1.9 KiB | text/x-python | PythonLexer
Brendan Cully
Pure python base85 fallback...
r7701 # base85.py: pure python base85 codec
#
# Copyright (C) 2009 Brendan Cully <brendan@kublai.com>
#
Martin Geisler
updated license to be explicit about GPL version 2
r8225 # This software may be used and distributed according to the terms of the
Matt Mackall
Update license to GPLv2+
r10263 # GNU General Public License version 2 or any later version.
Brendan Cully
Pure python base85 fallback...
r7701
Gregory Szorc
base85: use absolute_import
r27334 from __future__ import absolute_import
Brendan Cully
Pure python base85 fallback...
r7701 import struct
_b85chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" \
"abcdefghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~"
Mads Kiilerich
Optimization of pure.base85.b85encode...
r7835 _b85chars2 = [(a + b) for a in _b85chars for b in _b85chars]
Brendan Cully
Pure python base85 fallback...
r7701 _b85dec = {}
def _mkb85dec():
Martin Geisler
replace "i in range(len(xs))" with "i, x in enumerate(xs)"...
r8632 for i, c in enumerate(_b85chars):
_b85dec[c] = i
Brendan Cully
Pure python base85 fallback...
r7701
def b85encode(text, pad=False):
"""encode text in base85 format"""
l = len(text)
r = l % 4
if r:
text += '\0' * (4 - r)
longs = len(text) >> 2
words = struct.unpack('>%dL' % (longs), text)
Alejandro Santos
compat: use // for integer division
r9029 out = ''.join(_b85chars[(word // 52200625) % 85] +
_b85chars2[(word // 7225) % 7225] +
Mads Kiilerich
Optimization of pure.base85.b85encode...
r7835 _b85chars2[word % 7225]
for word in words)
Brendan Cully
Pure python base85 fallback...
r7701
if pad:
return out
# Trim padding
olen = l % 4
if olen:
olen += 1
Alejandro Santos
compat: use // for integer division
r9029 olen += l // 4 * 5
Brendan Cully
Pure python base85 fallback...
r7701 return out[:olen]
def b85decode(text):
"""decode base85-encoded text"""
if not _b85dec:
_mkb85dec()
l = len(text)
out = []
for i in range(0, len(text), 5):
Matt Mackall
many, many trivial check-code fixups
r10282 chunk = text[i:i + 5]
Brendan Cully
Pure python base85 fallback...
r7701 acc = 0
Martin Geisler
replace "i in range(len(xs))" with "i, x in enumerate(xs)"...
r8632 for j, c in enumerate(chunk):
Brendan Cully
Pure python base85 fallback...
r7701 try:
Martin Geisler
replace "i in range(len(xs))" with "i, x in enumerate(xs)"...
r8632 acc = acc * 85 + _b85dec[c]
Brendan Cully
Pure python base85 fallback...
r7701 except KeyError:
Patrick Mezard
pure/base85: align exception type/msg on base85.c...
r16598 raise ValueError('bad base85 character at position %d'
% (i + j))
Brendan Cully
Pure python base85 fallback...
r7701 if acc > 4294967295:
Patrick Mezard
pure/base85: align exception type/msg on base85.c...
r16598 raise ValueError('Base85 overflow in hunk starting at byte %d' % i)
Brendan Cully
Pure python base85 fallback...
r7701 out.append(acc)
# Pad final chunk if necessary
cl = l % 5
if cl:
acc *= 85 ** (5 - cl)
if cl > 1:
acc += 0xffffff >> (cl - 2) * 8
out[-1] = acc
out = struct.pack('>%dL' % (len(out)), *out)
if cl:
out = out[:-(5 - cl)]
return out