##// END OF EJS Templates
filelog: cmp: don't read data if hashes are identical (issue2273)...
Nicolas Dumazet -
r11541:ab9fa7a8 stable
parent child Browse files
Show More
@@ -1,70 +1,79 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
10 10 class filelog(revlog.revlog):
11 11 def __init__(self, opener, path):
12 12 revlog.revlog.__init__(self, opener,
13 13 "/".join(("data", path + ".i")))
14 14
15 15 def read(self, node):
16 16 t = self.revision(node)
17 17 if not t.startswith('\1\n'):
18 18 return t
19 19 s = t.index('\1\n', 2)
20 20 return t[s + 2:]
21 21
22 22 def _readmeta(self, node):
23 23 t = self.revision(node)
24 24 if not t.startswith('\1\n'):
25 25 return {}
26 26 s = t.index('\1\n', 2)
27 27 mt = t[2:s]
28 28 m = {}
29 29 for l in mt.splitlines():
30 30 k, v = l.split(": ", 1)
31 31 m[k] = v
32 32 return m
33 33
34 34 def add(self, text, meta, transaction, link, p1=None, p2=None):
35 35 if meta or text.startswith('\1\n'):
36 36 mt = ["%s: %s\n" % (k, v) for k, v in sorted(meta.iteritems())]
37 37 text = "\1\n%s\1\n%s" % ("".join(mt), text)
38 38 return self.addrevision(text, transaction, link, p1, p2)
39 39
40 40 def renamed(self, node):
41 41 if self.parents(node)[0] != revlog.nullid:
42 42 return False
43 43 m = self._readmeta(node)
44 44 if m and "copy" in m:
45 45 return (m["copy"], revlog.bin(m["copyrev"]))
46 46 return False
47 47
48 48 def size(self, rev):
49 49 """return the size of a given revision"""
50 50
51 51 # for revisions with renames, we have to go the slow way
52 52 node = self.node(rev)
53 53 if self.renamed(node):
54 54 return len(self.read(node))
55 55
56 56 # XXX if self.read(node).startswith("\1\n"), this returns (size+4)
57 57 return revlog.revlog.size(self, rev)
58 58
59 59 def cmp(self, node, text):
60 60 """compare text with a given file revision
61 61
62 62 returns True if text is different than what is stored.
63 63 """
64 64
65 # for renames, we have to go the slow way
66 if text.startswith('\1\n') or self.renamed(node):
65 t = text
66 if text.startswith('\1\n'):
67 t = '\1\n\1\n' + text
68
69 samehashes = not revlog.revlog.cmp(self, node, t)
70 if samehashes:
71 return False
72
73 # renaming a file produces a different hash, even if the data
74 # remains unchanged. Check if it's the case (slow):
75 if self.renamed(node):
67 76 t2 = self.read(node)
68 77 return t2 != text
69 78
70 return revlog.revlog.cmp(self, node, text)
79 return True
General Comments 0
You need to be logged in to leave comments. Login now