##// END OF EJS Templates
dirstate: drop all logic around the "non-normal" sets...
dirstate: drop all logic around the "non-normal" sets The dirstate has a lot of code to compute a set of all "non-normal" and "from_other_parent" entries. This is all used in one, unique, location, when `setparent` is called and moved from a merge to a non merge. At that time, any "merge related" information has to be dropped. This is mostly useful for command like `graft` or `shelve` that move to a single-parent state -before- the commit. Otherwise the commit will already have removed all traces of the merge information in the dirstate (e.g. for a regular merges). The bookkeeping for these sets is quite invasive. And it seems simpler to just drop it and do the full computation in the single location where we actually use it (since we have to do the computation at least once anyway). This simplify the code a lot, and clarify why this kind of computation is needed. The possible drawback compared to the previous code are: - if the operation happens in a loop, we will end up doing it multiple time, - the C code to detect entry of interest have been dropped, for now. It will be re-introduced later, with a processing code directly in C for even faster operation. Differential Revision: https://phab.mercurial-scm.org/D11507

File last commit:

r44082:4cd91104 stable
r48875:060cd909 default
Show More
base85.py
88 lines | 2.0 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
Pulkit Goyal
py3: use pycompat.bytestr to convert _b85chars to bytes...
r35962 from .. import pycompat
Augie Fackler
formatting: blacken the codebase...
r43346 _b85chars = pycompat.bytestr(
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 b"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdef"
b"ghijklmnopqrstuvwxyz!#$%&()*+-;<=>?@^_`{|}~"
Augie Fackler
formatting: blacken the codebase...
r43346 )
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 = {}
Augie Fackler
formatting: blacken the codebase...
r43346
Brendan Cully
Pure python base85 fallback...
r7701 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
Augie Fackler
formatting: blacken the codebase...
r43346
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:
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 text += b'\0' * (4 - r)
Brendan Cully
Pure python base85 fallback...
r7701 longs = len(text) >> 2
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 words = struct.unpack(b'>%dL' % longs, text)
Brendan Cully
Pure python base85 fallback...
r7701
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 out = b''.join(
Augie Fackler
formatting: blacken the codebase...
r43346 _b85chars[(word // 52200625) % 85]
+ _b85chars2[(word // 7225) % 7225]
+ _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]
Augie Fackler
formatting: blacken the codebase...
r43346
Brendan Cully
Pure python base85 fallback...
r7701 def b85decode(text):
"""decode base85-encoded text"""
if not _b85dec:
_mkb85dec()
l = len(text)
out = []
for i in range(0, len(text), 5):
Augie Fackler
formatting: blacken the codebase...
r43346 chunk = text[i : i + 5]
Pulkit Goyal
py3: converts bytes to pycompat.bytestr to get bytechrs while enumerating...
r36209 chunk = pycompat.bytestr(chunk)
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:
Augie Fackler
formatting: blacken the codebase...
r43346 raise ValueError(
pure: use string for exception in the pure version of base85...
r44081 'bad base85 character at position %d' % (i + j)
Augie Fackler
formatting: blacken the codebase...
r43346 )
Brendan Cully
Pure python base85 fallback...
r7701 if acc > 4294967295:
pure: use string for another exception in the pure version of base85...
r44082 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:
Augie Fackler
formatting: blacken the codebase...
r43346 acc += 0xFFFFFF >> (cl - 2) * 8
Brendan Cully
Pure python base85 fallback...
r7701 out[-1] = acc
Augie Fackler
formatting: byteify all mercurial/ and hgext/ string literals...
r43347 out = struct.pack(b'>%dL' % (len(out)), *out)
Brendan Cully
Pure python base85 fallback...
r7701 if cl:
Augie Fackler
formatting: blacken the codebase...
r43346 out = out[: -(5 - cl)]
Brendan Cully
Pure python base85 fallback...
r7701
return out