Show More
@@ -0,0 +1,81 b'' | |||||
|
1 | # parsers.py - Python implementation of parsers.c | |||
|
2 | # | |||
|
3 | # Copyright 2009 Matt Mackall <mpm@selenic.com> and others | |||
|
4 | # | |||
|
5 | # This software may be used and distributed according to the terms | |||
|
6 | # of the GNU General Public License, incorporated herein by reference. | |||
|
7 | ||||
|
8 | from node import bin, hex, nullid, nullrev | |||
|
9 | import revlog, dirstate, struct, util, zlib | |||
|
10 | ||||
|
11 | _pack = struct.pack | |||
|
12 | _unpack = struct.unpack | |||
|
13 | _compress = zlib.compress | |||
|
14 | _decompress = zlib.decompress | |||
|
15 | _sha = util.sha1 | |||
|
16 | ||||
|
17 | def parse_manifest(mfdict, fdict, lines): | |||
|
18 | for l in lines.splitlines(): | |||
|
19 | f, n = l.split('\0') | |||
|
20 | if len(n) > 40: | |||
|
21 | fdict[f] = n[40:] | |||
|
22 | mfdict[f] = bin(n[:40]) | |||
|
23 | else: | |||
|
24 | mfdict[f] = bin(n) | |||
|
25 | ||||
|
26 | def parse_index(data, inline): | |||
|
27 | indexformatng = revlog.indexformatng | |||
|
28 | s = struct.calcsize(indexformatng) | |||
|
29 | index = [] | |||
|
30 | cache = None | |||
|
31 | nodemap = {nullid: nullrev} | |||
|
32 | n = off = 0 | |||
|
33 | # if we're not using lazymap, always read the whole index | |||
|
34 | l = len(data) - s | |||
|
35 | append = index.append | |||
|
36 | if inline: | |||
|
37 | cache = (0, data) | |||
|
38 | while off <= l: | |||
|
39 | e = _unpack(indexformatng, data[off:off + s]) | |||
|
40 | nodemap[e[7]] = n | |||
|
41 | append(e) | |||
|
42 | n += 1 | |||
|
43 | if e[1] < 0: | |||
|
44 | break | |||
|
45 | off += e[1] + s | |||
|
46 | else: | |||
|
47 | while off <= l: | |||
|
48 | e = _unpack(indexformatng, data[off:off + s]) | |||
|
49 | nodemap[e[7]] = n | |||
|
50 | append(e) | |||
|
51 | n += 1 | |||
|
52 | off += s | |||
|
53 | ||||
|
54 | e = list(index[0]) | |||
|
55 | type = revlog.gettype(e[0]) | |||
|
56 | e[0] = revlog.offset_type(0, type) | |||
|
57 | index[0] = tuple(e) | |||
|
58 | ||||
|
59 | # add the magic null revision at -1 | |||
|
60 | index.append((0, 0, 0, -1, -1, -1, -1, nullid)) | |||
|
61 | ||||
|
62 | return index, nodemap, cache | |||
|
63 | ||||
|
64 | def parse_dirstate(dmap, copymap, st): | |||
|
65 | parents = [st[:20], st[20: 40]] | |||
|
66 | # deref fields so they will be local in loop | |||
|
67 | e_size = struct.calcsize(dirstate._format) | |||
|
68 | pos1 = 40 | |||
|
69 | l = len(st) | |||
|
70 | ||||
|
71 | # the inner loop | |||
|
72 | while pos1 < l: | |||
|
73 | pos2 = pos1 + e_size | |||
|
74 | e = _unpack(">cllll", st[pos1:pos2]) # a literal here is faster | |||
|
75 | pos1 = pos2 + e[4] | |||
|
76 | f = st[pos2:pos1] | |||
|
77 | if '\0' in f: | |||
|
78 | f, c = f.split('\0') | |||
|
79 | copymap[f] = c | |||
|
80 | dmap[f] = e[:4] | |||
|
81 | return parents |
General Comments 0
You need to be logged in to leave comments.
Login now