121
|
1 # filelog.py - file history class for mercurial
|
|
2 #
|
|
3 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
|
|
4 #
|
|
5 # This software may be used and distributed according to the terms of the
|
|
6 # GNU General Public License version 2, incorporated herein by reference.
|
|
7
|
|
8 import revlog
|
|
9
|
|
10 class filelog(revlog.revlog):
|
|
11 def __init__(self, opener, path):
|
|
12 revlog.revlog.__init__(self, opener,
|
|
13 "/".join(("data", path + ".i")))
|
|
14
|
|
15 def read(self, node):
|
|
16 t = self.revision(node)
|
|
17 if not t.startswith('\1\n'):
|
|
18 return t
|
|
19 s = t.index('\1\n', 2)
|
|
20 return t[s+2:]
|
|
21
|
|
22 def _readmeta(self, node):
|
|
23 t = self.revision(node)
|
|
24 if not t.startswith('\1\n'):
|
|
25 return {}
|
|
26 s = t.index('\1\n', 2)
|
|
27 mt = t[2:s]
|
|
28 m = {}
|
|
29 for l in mt.splitlines():
|
|
30 k, v = l.split(": ", 1)
|
|
31 m[k] = v
|
|
32 return m
|
|
33
|
|
34 def add(self, text, meta, transaction, link, p1=None, p2=None):
|
|
35 if meta or text.startswith('\1\n'):
|
|
36 mt = ""
|
|
37 if meta:
|
|
38 mt = ["%s: %s\n" % (k, v) for k, v in meta.iteritems()]
|
|
39 text = "\1\n%s\1\n%s" % ("".join(mt), text)
|
|
40 return self.addrevision(text, transaction, link, p1, p2)
|
|
41
|
|
42 def renamed(self, node):
|
|
43 if self.parents(node)[0] != revlog.nullid:
|
|
44 return False
|
|
45 m = self._readmeta(node)
|
|
46 if m and "copy" in m:
|
|
47 return (m["copy"], revlog.bin(m["copyrev"]))
|
|
48 return False
|
|
49
|
|
50 def size(self, rev):
|
|
51 """return the size of a given revision"""
|
|
52
|
|
53 # for revisions with renames, we have to go the slow way
|
|
54 node = self.node(rev)
|
|
55 if self.renamed(node):
|
|
56 return len(self.read(node))
|
|
57
|
|
58 return revlog.revlog.size(self, rev)
|
|
59
|
|
60 def cmp(self, node, text):
|
|
61 """compare text with a given file revision"""
|
|
62
|
|
63 # for renames, we have to go the slow way
|
|
64 if self.renamed(node):
|
|
65 t2 = self.read(node)
|
|
66 return t2 != text
|
|
67
|
|
68 return revlog.revlog.cmp(self, node, text)
|