##// END OF EJS Templates
branchcache: fetch source branchcache during clone (issue3378)...
branchcache: fetch source branchcache during clone (issue3378) Recomputing branch cache on clone may be expensive, therefore if possible we fetch it along with the data. - If the clone is performed by copying, we just copy branchcache file. - If we localrepo.clone and streaming then we follow the procedure: 1. Fetch branchmap from the remote 2. Fetch the actual data. 3. Find the latest rev within branch heads (tip at the time of branchmap fetch) 4. Update the cache for the revs in [remotetip+1, tip] This way we ensure that the branchcache is correct even in case of races with commits.

File last commit:

r17425:e95ec38f default
r17740:e6067bec default
Show More
parsers.py
89 lines | 2.2 KiB | text/x-python | PythonLexer
Martin Geisler
pure Python implementation of parsers.c
r7700 # parsers.py - Python implementation of parsers.c
#
# Copyright 2009 Matt Mackall <mpm@selenic.com> and others
#
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.
Martin Geisler
pure Python implementation of parsers.c
r7700
Alexander Solovyov
remove unused imports and variables
r14064 from mercurial.node import bin, nullid
Matt Mackall
pure/parsers: fix circular imports, import mercurial modules properly
r7945 from mercurial import util
import struct, zlib
Martin Geisler
pure Python implementation of parsers.c
r7700
_pack = struct.pack
_unpack = struct.unpack
_compress = zlib.compress
_decompress = zlib.decompress
_sha = util.sha1
def parse_manifest(mfdict, fdict, lines):
for l in lines.splitlines():
f, n = l.split('\0')
if len(n) > 40:
fdict[f] = n[40:]
mfdict[f] = bin(n[:40])
else:
mfdict[f] = bin(n)
Matt Mackall
pure: update index parsing
r13261 def parse_index2(data, inline):
Matt Mackall
pure/parsers: fix circular imports, import mercurial modules properly
r7945 def gettype(q):
return int(q & 0xFFFF)
def offset_type(offset, type):
return long(long(offset) << 16 | type)
indexformatng = ">Qiiiiii20s12x"
Martin Geisler
pure Python implementation of parsers.c
r7700 s = struct.calcsize(indexformatng)
index = []
cache = None
py4fun
parsers: remove redundant 'n' variable in parsers.parse_index2() (issue2935)
r14995 off = 0
Matt Mackall
revlog: remove lazy index
r13253
Martin Geisler
pure Python implementation of parsers.c
r7700 l = len(data) - s
append = index.append
if inline:
cache = (0, data)
while off <= l:
e = _unpack(indexformatng, data[off:off + s])
append(e)
if e[1] < 0:
break
off += e[1] + s
else:
while off <= l:
e = _unpack(indexformatng, data[off:off + s])
append(e)
off += s
Augie Fackler
pure parsers: properly detect corrupt index files...
r14421 if off != len(data):
raise ValueError('corrupt index file')
Wagner Bruna
pure: fix index parsing on empty repositories
r13435 if index:
e = list(index[0])
type = gettype(e[0])
e[0] = offset_type(0, type)
index[0] = tuple(e)
Martin Geisler
pure Python implementation of parsers.c
r7700
# add the magic null revision at -1
index.append((0, 0, 0, -1, -1, -1, -1, nullid))
Matt Mackall
pure: update index parsing
r13261 return index, cache
Martin Geisler
pure Python implementation of parsers.c
r7700
def parse_dirstate(dmap, copymap, st):
parents = [st[:20], st[20: 40]]
Mads Kiilerich
fix wording and not-completely-trivial spelling errors and bad docstrings
r17425 # dereference fields so they will be local in loop
Matt Mackall
pure/parsers: fix circular imports, import mercurial modules properly
r7945 format = ">cllll"
e_size = struct.calcsize(format)
Martin Geisler
pure Python implementation of parsers.c
r7700 pos1 = 40
l = len(st)
# the inner loop
while pos1 < l:
pos2 = pos1 + e_size
e = _unpack(">cllll", st[pos1:pos2]) # a literal here is faster
pos1 = pos2 + e[4]
f = st[pos2:pos1]
if '\0' in f:
f, c = f.split('\0')
copymap[f] = c
dmap[f] = e[:4]
return parents