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: |