Mercurial > public > mercurial-scm > hg
comparison mercurial/revlog.py @ 26:9cf83bf9ad38
Simplify integrity checking
More fiddling with transaction truncate points (still untested)
author | mpm@selenic.com |
---|---|
date | Wed, 04 May 2005 22:51:25 -0800 |
parents | e0e5c1b9febd |
children | da28286bf6b7 |
comparison
equal
deleted
inserted
replaced
25:daa724b27300 | 26:9cf83bf9ad38 |
---|---|
37 try: | 37 try: |
38 n = 0 | 38 n = 0 |
39 i = self.opener(self.indexfile).read() | 39 i = self.opener(self.indexfile).read() |
40 s = struct.calcsize(indexformat) | 40 s = struct.calcsize(indexformat) |
41 for f in range(0, len(i), s): | 41 for f in range(0, len(i), s): |
42 # offset, size, base, linkrev, p1, p2, nodeid, changeset | 42 # offset, size, base, linkrev, p1, p2, nodeid |
43 e = struct.unpack(indexformat, i[f:f + s]) | 43 e = struct.unpack(indexformat, i[f:f + s]) |
44 self.nodemap[e[6]] = n | 44 self.nodemap[e[6]] = n |
45 self.index.append(e) | 45 self.index.append(e) |
46 n += 1 | 46 n += 1 |
47 except IOError: pass | 47 except IOError: pass |
48 | 48 |
49 def tip(self): return self.node(len(self.index) - 1) | 49 def tip(self): return self.node(len(self.index) - 1) |
50 def count(self): return len(self.index) | 50 def count(self): return len(self.index) |
51 def node(self, rev): return rev < 0 and nullid or self.index[rev][6] | 51 def node(self, rev): return (rev < 0) and nullid or self.index[rev][6] |
52 def rev(self, node): return self.nodemap[node] | 52 def rev(self, node): return self.nodemap[node] |
53 def linkrev(self, node): return self.index[self.nodemap[node]][3] | 53 def linkrev(self, node): return self.index[self.nodemap[node]][3] |
54 def parents(self, node): | 54 def parents(self, node): |
55 if node == nullid: return (nullid, nullid) | 55 if node == nullid: return (nullid, nullid) |
56 return self.index[self.nodemap[node]][4:6] | 56 return self.index[self.nodemap[node]][4:6] |
101 b = decompress(data[last:last + s]) | 101 b = decompress(data[last:last + s]) |
102 text = self.patch(text, b) | 102 text = self.patch(text, b) |
103 last = last + s | 103 last = last + s |
104 | 104 |
105 (p1, p2) = self.parents(node) | 105 (p1, p2) = self.parents(node) |
106 if self.node(rev) != hash(text, p1, p2): | 106 if node != hash(text, p1, p2): |
107 raise "Consistency check failed on %s:%d" % (self.datafile, rev) | 107 raise "integrity check failed on %s:%d" % (self.datafile, rev) |
108 | 108 |
109 self.cache = (node, rev, text) | 109 self.cache = (node, rev, text) |
110 return text | 110 return text |
111 | 111 |
112 def addrevision(self, text, transaction, link, p1=None, p2=None): | 112 def addrevision(self, text, transaction, link, p1=None, p2=None): |
121 | 121 |
122 if n: | 122 if n: |
123 start = self.start(self.base(t)) | 123 start = self.start(self.base(t)) |
124 end = self.end(t) | 124 end = self.end(t) |
125 prev = self.revision(self.tip()) | 125 prev = self.revision(self.tip()) |
126 if 0: | |
127 dd = self.diff(prev, text) | |
128 tt = self.patch(prev, dd) | |
129 if tt != text: | |
130 print prev | |
131 print text | |
132 print tt | |
133 raise "diff+patch failed" | |
134 data = compress(self.diff(prev, text)) | 126 data = compress(self.diff(prev, text)) |
135 | 127 |
136 # full versions are inserted when the needed deltas | 128 # full versions are inserted when the needed deltas |
137 # become comparable to the uncompressed text | 129 # become comparable to the uncompressed text |
138 if not n or (end + len(data) - start) > len(text) * 2: | 130 if not n or (end + len(data) - start) > len(text) * 2: |
149 | 141 |
150 self.index.append(e) | 142 self.index.append(e) |
151 self.nodemap[node] = n | 143 self.nodemap[node] = n |
152 entry = struct.pack(indexformat, *e) | 144 entry = struct.pack(indexformat, *e) |
153 | 145 |
154 transaction.add(self.datafile, e[0] - 1) | 146 transaction.add(self.datafile, e[0]) |
155 self.opener(self.datafile, "a").write(data) | 147 self.opener(self.datafile, "a").write(data) |
156 transaction.add(self.indexfile, (n + 1) * len(entry) - 1) | 148 transaction.add(self.indexfile, (n + 1) * len(entry)) |
157 self.opener(self.indexfile, "a").write(entry) | 149 self.opener(self.indexfile, "a").write(entry) |
158 | 150 |
159 self.cache = (node, n, text) | 151 self.cache = (node, n, text) |
160 return node | 152 return node |
161 | 153 |