4 # |
4 # |
5 # This software may be used and distributed according to the terms of the |
5 # This software may be used and distributed according to the terms of the |
6 # GNU General Public License version 2 or any later version. |
6 # GNU General Public License version 2 or any later version. |
7 |
7 |
8 import revlog |
8 import revlog |
|
9 import re |
9 |
10 |
|
11 _mdre = re.compile('\1\n') |
10 def _parsemeta(text): |
12 def _parsemeta(text): |
11 if not text.startswith('\1\n'): |
13 """return (metadatadict, keylist, metadatasize)""" |
12 return {} |
14 # text can be buffer, so we can't use .startswith or .index |
13 s = text.index('\1\n', 2) |
15 if text[:2] != '\1\n': |
14 mt = text[2:s] |
16 return None, None, None |
15 m = {} |
17 s = _mdre.search(text, 2).start() |
16 for l in mt.splitlines(): |
18 mtext = text[2:s] |
|
19 meta = {} |
|
20 keys = [] |
|
21 for l in mtext.splitlines(): |
17 k, v = l.split(": ", 1) |
22 k, v = l.split(": ", 1) |
18 m[k] = v |
23 meta[k] = v |
19 return m |
24 keys.append(k) |
|
25 return meta, keys, (s + 2) |
|
26 |
|
27 def _packmeta(meta, keys=None): |
|
28 if not keys: |
|
29 keys = sorted(meta.iterkeys()) |
|
30 return "".join("%s: %s\n" % (k, meta[k]) for k in keys) |
20 |
31 |
21 class filelog(revlog.revlog): |
32 class filelog(revlog.revlog): |
22 def __init__(self, opener, path): |
33 def __init__(self, opener, path): |
23 revlog.revlog.__init__(self, opener, |
34 revlog.revlog.__init__(self, opener, |
24 "/".join(("data", path + ".i"))) |
35 "/".join(("data", path + ".i"))) |
30 s = t.index('\1\n', 2) |
41 s = t.index('\1\n', 2) |
31 return t[s + 2:] |
42 return t[s + 2:] |
32 |
43 |
33 def add(self, text, meta, transaction, link, p1=None, p2=None): |
44 def add(self, text, meta, transaction, link, p1=None, p2=None): |
34 if meta or text.startswith('\1\n'): |
45 if meta or text.startswith('\1\n'): |
35 mt = ["%s: %s\n" % (k, v) for k, v in sorted(meta.iteritems())] |
46 text = "\1\n%s\1\n%s" % (_packmeta(meta), text) |
36 text = "\1\n%s\1\n%s" % ("".join(mt), text) |
|
37 return self.addrevision(text, transaction, link, p1, p2) |
47 return self.addrevision(text, transaction, link, p1, p2) |
38 |
48 |
39 def renamed(self, node): |
49 def renamed(self, node): |
40 if self.parents(node)[0] != revlog.nullid: |
50 if self.parents(node)[0] != revlog.nullid: |
41 return False |
51 return False |
42 t = self.revision(node) |
52 t = self.revision(node) |
43 m = _parsemeta(t) |
53 m = _parsemeta(t)[0] |
44 if m and "copy" in m: |
54 if m and "copy" in m: |
45 return (m["copy"], revlog.bin(m["copyrev"])) |
55 return (m["copy"], revlog.bin(m["copyrev"])) |
46 return False |
56 return False |
47 |
57 |
48 def size(self, rev): |
58 def size(self, rev): |