##// END OF EJS Templates
filelog: parsemeta stops returning unused key list...
Mike Edgar -
r22422:75bb7c70 default
parent child Browse files
Show More
@@ -1,92 +1,90 b''
1 1 # filelog.py - file history class for mercurial
2 2 #
3 3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 4 #
5 5 # This software may be used and distributed according to the terms of the
6 6 # GNU General Public License version 2 or any later version.
7 7
8 8 import revlog
9 9 import re
10 10
11 11 _mdre = re.compile('\1\n')
12 12 def parsemeta(text):
13 13 """return (metadatadict, keylist, metadatasize)"""
14 14 # text can be buffer, so we can't use .startswith or .index
15 15 if text[:2] != '\1\n':
16 return None, None, None
16 return None, None
17 17 s = _mdre.search(text, 2).start()
18 18 mtext = text[2:s]
19 19 meta = {}
20 keys = []
21 20 for l in mtext.splitlines():
22 21 k, v = l.split(": ", 1)
23 22 meta[k] = v
24 keys.append(k)
25 return meta, keys, (s + 2)
23 return meta, (s + 2)
26 24
27 25 def packmeta(meta, text):
28 26 keys = sorted(meta.iterkeys())
29 27 metatext = "".join("%s: %s\n" % (k, meta[k]) for k in keys)
30 28 return "\1\n%s\1\n%s" % (metatext, text)
31 29
32 30 class filelog(revlog.revlog):
33 31 def __init__(self, opener, path):
34 32 super(filelog, self).__init__(opener,
35 33 "/".join(("data", path + ".i")))
36 34
37 35 def read(self, node):
38 36 t = self.revision(node)
39 37 if not t.startswith('\1\n'):
40 38 return t
41 39 s = t.index('\1\n', 2)
42 40 return t[s + 2:]
43 41
44 42 def add(self, text, meta, transaction, link, p1=None, p2=None):
45 43 if meta or text.startswith('\1\n'):
46 44 text = packmeta(meta, text)
47 45 return self.addrevision(text, transaction, link, p1, p2)
48 46
49 47 def renamed(self, node):
50 48 if self.parents(node)[0] != revlog.nullid:
51 49 return False
52 50 t = self.revision(node)
53 51 m = parsemeta(t)[0]
54 52 if m and "copy" in m:
55 53 return (m["copy"], revlog.bin(m["copyrev"]))
56 54 return False
57 55
58 56 def size(self, rev):
59 57 """return the size of a given revision"""
60 58
61 59 # for revisions with renames, we have to go the slow way
62 60 node = self.node(rev)
63 61 if self.renamed(node):
64 62 return len(self.read(node))
65 63
66 64 # XXX if self.read(node).startswith("\1\n"), this returns (size+4)
67 65 return super(filelog, self).size(rev)
68 66
69 67 def cmp(self, node, text):
70 68 """compare text with a given file revision
71 69
72 70 returns True if text is different than what is stored.
73 71 """
74 72
75 73 t = text
76 74 if text.startswith('\1\n'):
77 75 t = '\1\n\1\n' + text
78 76
79 77 samehashes = not super(filelog, self).cmp(node, t)
80 78 if samehashes:
81 79 return False
82 80
83 81 # renaming a file produces a different hash, even if the data
84 82 # remains unchanged. Check if it's the case (slow):
85 83 if self.renamed(node):
86 84 t2 = self.read(node)
87 85 return t2 != text
88 86
89 87 return True
90 88
91 89 def _file(self, f):
92 90 return filelog(self.opener, f)
General Comments 0
You need to be logged in to leave comments. Login now