Mercurial > public > mercurial-scm > hg
comparison mercurial/revlog.py @ 71:47c9a869adee
Add mdiff.patches to speed up applying thousands of patches to the manifest
author | mpm@selenic.com |
---|---|
date | Sat, 14 May 2005 10:27:14 -0800 |
parents | a182f2561c8e |
children | ee1cbe841e01 |
comparison
equal
deleted
inserted
replaced
70:ce080e8eccd7 | 71:47c9a869adee |
---|---|
39 # read the whole index for now, handle on-demand later | 39 # read the whole index for now, handle on-demand later |
40 try: | 40 try: |
41 n = 0 | 41 n = 0 |
42 i = self.opener(self.indexfile).read() | 42 i = self.opener(self.indexfile).read() |
43 s = struct.calcsize(indexformat) | 43 s = struct.calcsize(indexformat) |
44 for f in range(0, len(i), s): | 44 for f in xrange(0, len(i), s): |
45 # offset, size, base, linkrev, p1, p2, nodeid | 45 # offset, size, base, linkrev, p1, p2, nodeid |
46 e = struct.unpack(indexformat, i[f:f + s]) | 46 e = struct.unpack(indexformat, i[f:f + s]) |
47 self.nodemap[e[6]] = n | 47 self.nodemap[e[6]] = n |
48 self.index.append(e) | 48 self.index.append(e) |
49 n += 1 | 49 n += 1 |
85 yield self.revision(node) | 85 yield self.revision(node) |
86 | 86 |
87 def diff(self, a, b): | 87 def diff(self, a, b): |
88 return mdiff.textdiff(a, b) | 88 return mdiff.textdiff(a, b) |
89 | 89 |
90 def patch(self, text, patch): | |
91 return mdiff.patch(text, patch) | |
92 | |
93 def revision(self, node): | 90 def revision(self, node): |
94 if node == nullid: return "" | 91 if node == nullid: return "" |
95 if self.cache and self.cache[0] == node: return self.cache[2] | 92 if self.cache and self.cache[0] == node: return self.cache[2] |
96 | 93 |
97 text = None | 94 text = None |
112 | 109 |
113 if not text: | 110 if not text: |
114 last = self.length(base) | 111 last = self.length(base) |
115 text = decompress(data[:last]) | 112 text = decompress(data[:last]) |
116 | 113 |
114 bins = [] | |
117 for r in xrange(base + 1, rev + 1): | 115 for r in xrange(base + 1, rev + 1): |
118 s = self.length(r) | 116 s = self.length(r) |
119 b = decompress(data[last:last + s]) | 117 bins.append(decompress(data[last:last + s])) |
120 text = self.patch(text, b) | |
121 last = last + s | 118 last = last + s |
119 | |
120 text = mdiff.patches(text, bins) | |
122 | 121 |
123 (p1, p2) = self.parents(node) | 122 (p1, p2) = self.parents(node) |
124 if node != hash(text, p1, p2): | 123 if node != hash(text, p1, p2): |
125 raise "integrity check failed on %s:%d" % (self.datafile, rev) | 124 raise "integrity check failed on %s:%d" % (self.datafile, rev) |
126 | 125 |
299 chunks[r] = data[pos: pos + l] | 298 chunks[r] = data[pos: pos + l] |
300 pos += l | 299 pos += l |
301 | 300 |
302 # helper to reconstruct intermediate versions | 301 # helper to reconstruct intermediate versions |
303 def construct(text, base, rev): | 302 def construct(text, base, rev): |
304 for r in range(base + 1, rev + 1): | 303 bins = [decompress(chunks[r]) for r in xrange(base + 1, rev + 1)] |
305 b = decompress(chunks[r]) | 304 return mdiff.patches(text, bins) |
306 text = self.patch(text, b) | |
307 return text | |
308 | 305 |
309 # build deltas | 306 # build deltas |
310 deltas = [] | 307 deltas = [] |
311 for d in range(0, len(revs) - 1): | 308 for d in xrange(0, len(revs) - 1): |
312 a, b = revs[d], revs[d + 1] | 309 a, b = revs[d], revs[d + 1] |
313 n = self.node(b) | 310 n = self.node(b) |
314 | 311 |
315 if a + 1 != b or self.base(b) == b: | 312 if a + 1 != b or self.base(b) == b: |
316 if a >= 0: | 313 if a >= 0: |