comparison mercurial/revlog.py @ 73:ee1cbe841e01

Change revlog to use new patch code
author mpm@selenic.com
date Mon, 16 May 2005 22:10:02 -0800
parents 47c9a869adee
children d993ebd69d28
comparison
equal deleted inserted replaced
72:4a6ab4d80dc4 73:ee1cbe841e01
33 self.indexfile = indexfile 33 self.indexfile = indexfile
34 self.datafile = datafile 34 self.datafile = datafile
35 self.index = [] 35 self.index = []
36 self.opener = opener 36 self.opener = opener
37 self.cache = None 37 self.cache = None
38 self.nodemap = {nullid: -1}
39 # read the whole index for now, handle on-demand later 38 # read the whole index for now, handle on-demand later
40 try: 39 try:
41 n = 0 40 n = 0
42 i = self.opener(self.indexfile).read() 41 i = self.opener(self.indexfile).read()
43 s = struct.calcsize(indexformat) 42 s = struct.calcsize(indexformat)
43
44 # preallocate arrays
45 l = len(i)/s
46 self.index = [None] * l
47 m = [None] * l
48
44 for f in xrange(0, len(i), s): 49 for f in xrange(0, len(i), s):
45 # offset, size, base, linkrev, p1, p2, nodeid 50 # offset, size, base, linkrev, p1, p2, nodeid
46 e = struct.unpack(indexformat, i[f:f + s]) 51 e = struct.unpack(indexformat, i[f:f + s])
47 self.nodemap[e[6]] = n 52 self.index[n] = e
48 self.index.append(e) 53 m[n] = (e[6], n)
49 n += 1 54 n += 1
50 except IOError: pass 55
56 self.nodemap = dict(m)
57 except IOError:
58 self.nodemap = {}
59 self.nodemap[nullid] = -1
51 60
52 def tip(self): return self.node(len(self.index) - 1) 61 def tip(self): return self.node(len(self.index) - 1)
53 def count(self): return len(self.index) 62 def count(self): return len(self.index)
54 def node(self, rev): return (rev < 0) and nullid or self.index[rev][6] 63 def node(self, rev): return (rev < 0) and nullid or self.index[rev][6]
55 def rev(self, node): return self.nodemap[node] 64 def rev(self, node): return self.nodemap[node]
84 for node in list: 93 for node in list:
85 yield self.revision(node) 94 yield self.revision(node)
86 95
87 def diff(self, a, b): 96 def diff(self, a, b):
88 return mdiff.textdiff(a, b) 97 return mdiff.textdiff(a, b)
98
99 def patches(self, t, pl):
100 return mdiff.patches(t, pl)
89 101
90 def revision(self, node): 102 def revision(self, node):
91 if node == nullid: return "" 103 if node == nullid: return ""
92 if self.cache and self.cache[0] == node: return self.cache[2] 104 if self.cache and self.cache[0] == node: return self.cache[2]
93 105
386 if chain != prev or (end - start + len(cdelta)) > measure * 2: 398 if chain != prev or (end - start + len(cdelta)) > measure * 2:
387 # flush our writes here so we can read it in revision 399 # flush our writes here so we can read it in revision
388 dfh.flush() 400 dfh.flush()
389 ifh.flush() 401 ifh.flush()
390 text = self.revision(chain) 402 text = self.revision(chain)
391 text = self.patch(text, delta) 403 text = self.patches(text, [delta])
392 chk = self.addrevision(text, transaction, link, p1, p2) 404 chk = self.addrevision(text, transaction, link, p1, p2)
393 if chk != node: 405 if chk != node:
394 raise "consistency error adding group" 406 raise "consistency error adding group"
395 measure = len(text) 407 measure = len(text)
396 else: 408 else: