Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/revlog.py @ 4986:58cc017ec7e0
revlog: abstract out index entry packing
This lets us remove most of the remaining v0/v1 logic from revlog
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Mon, 23 Jul 2007 20:44:08 -0500 |
parents | e6525e459157 |
children | 8d30004ada40 |
comparison
equal
deleted
inserted
replaced
4985:e6525e459157 | 4986:58cc017ec7e0 |
---|---|
327 nodemap[e[6]] = n | 327 nodemap[e[6]] = n |
328 n += 1 | 328 n += 1 |
329 | 329 |
330 return index, nodemap, None | 330 return index, nodemap, None |
331 | 331 |
332 def packentry(self, entry, node, version): | |
333 e2 = (getoffset(entry[0]), entry[1], entry[3], entry[4], | |
334 node(entry[5]), node(entry[6]), entry[7]) | |
335 return struct.pack(indexformatv0, *e2) | |
336 | |
332 class revlogio(object): | 337 class revlogio(object): |
333 def __init__(self): | 338 def __init__(self): |
334 self.size = struct.calcsize(indexformatng) | 339 self.size = struct.calcsize(indexformatng) |
335 | 340 |
336 def parseindex(self, fp, inline): | 341 def parseindex(self, fp, inline): |
375 type = gettype(e[0]) | 380 type = gettype(e[0]) |
376 e[0] = offset_type(0, type) | 381 e[0] = offset_type(0, type) |
377 index[0] = e | 382 index[0] = e |
378 | 383 |
379 return index, nodemap, cache | 384 return index, nodemap, cache |
385 | |
386 def packentry(self, entry, node, version): | |
387 p = struct.pack(indexformatng, *entry) | |
388 if not entry[3] and not getoffset(entry[0]) and entry[5] == nullrev: | |
389 p = struct.pack(versionformat, version) + p[4:] | |
390 return p | |
380 | 391 |
381 class revlog(object): | 392 class revlog(object): |
382 """ | 393 """ |
383 the underlying revision storage object | 394 the underlying revision storage object |
384 | 395 |
944 fp.close() | 955 fp.close() |
945 df.close() | 956 df.close() |
946 fp = self.opener(self.indexfile, 'w', atomictemp=True) | 957 fp = self.opener(self.indexfile, 'w', atomictemp=True) |
947 self.version &= ~(REVLOGNGINLINEDATA) | 958 self.version &= ~(REVLOGNGINLINEDATA) |
948 self._inline = False | 959 self._inline = False |
949 if self.count(): | 960 for i in xrange(self.count()): |
950 x = self.index[0] | 961 e = self._io.packentry(self.index[i], self.node, self.version) |
951 e = struct.pack(indexformatng, *x)[4:] | |
952 l = struct.pack(versionformat, self.version) | |
953 fp.write(l) | |
954 fp.write(e) | |
955 | |
956 for i in xrange(1, self.count()): | |
957 x = self.index[i] | |
958 e = struct.pack(indexformatng, *x) | |
959 fp.write(e) | 962 fp.write(e) |
960 | 963 |
961 # if we don't call rename, the temp file will never replace the | 964 # if we don't call rename, the temp file will never replace the |
962 # real index | 965 # real index |
963 fp.rename() | 966 fp.rename() |
1008 e = (offset_type(offset, 0), l, len(text), | 1011 e = (offset_type(offset, 0), l, len(text), |
1009 base, link, self.rev(p1), self.rev(p2), node) | 1012 base, link, self.rev(p1), self.rev(p2), node) |
1010 self.index.insert(-1, e) | 1013 self.index.insert(-1, e) |
1011 self.nodemap[node] = curr | 1014 self.nodemap[node] = curr |
1012 | 1015 |
1013 if self.version == REVLOGV0: | 1016 entry = self._io.packentry(e, self.node, self.version) |
1014 e = (offset, l, base, link, p1, p2, node) | |
1015 entry = struct.pack(indexformatv0, *e) | |
1016 else: | |
1017 entry = struct.pack(indexformatng, *e) | |
1018 if not curr: | |
1019 entry = struct.pack(versionformat, self.version) + entry[4:] | |
1020 | |
1021 if not self._inline: | 1017 if not self._inline: |
1022 transaction.add(self.datafile, offset) | 1018 transaction.add(self.datafile, offset) |
1023 transaction.add(self.indexfile, curr * len(entry)) | 1019 transaction.add(self.indexfile, curr * len(entry)) |
1024 if data[0]: | 1020 if data[0]: |
1025 dfh.write(data[0]) | 1021 dfh.write(data[0]) |
1166 else: | 1162 else: |
1167 e = (offset_type(end, 0), len(cdelta), textlen, base, | 1163 e = (offset_type(end, 0), len(cdelta), textlen, base, |
1168 link, self.rev(p1), self.rev(p2), node) | 1164 link, self.rev(p1), self.rev(p2), node) |
1169 self.index.insert(-1, e) | 1165 self.index.insert(-1, e) |
1170 self.nodemap[node] = r | 1166 self.nodemap[node] = r |
1167 entry = self._io.packentry(e, self.node, self.version) | |
1171 if self._inline: | 1168 if self._inline: |
1172 ifh.write(struct.pack(indexformatng, *e)) | 1169 ifh.write(entry) |
1173 ifh.write(cdelta) | 1170 ifh.write(cdelta) |
1174 self.checkinlinesize(transaction, ifh) | 1171 self.checkinlinesize(transaction, ifh) |
1175 if not self._inline: | 1172 if not self._inline: |
1176 dfh = self.opener(self.datafile, "a") | 1173 dfh = self.opener(self.datafile, "a") |
1177 ifh = self.opener(self.indexfile, "a") | 1174 ifh = self.opener(self.indexfile, "a") |
1178 else: | 1175 else: |
1179 if self.version == REVLOGV0: | |
1180 e = (end, len(cdelta), base, link, p1, p2, node) | |
1181 entry = struct.pack(indexformatv0, *e) | |
1182 else: | |
1183 entry = struct.pack(indexformatng, *e) | |
1184 dfh.write(cdelta) | 1176 dfh.write(cdelta) |
1185 ifh.write(entry) | 1177 ifh.write(entry) |
1186 | 1178 |
1187 t, r, chain, prev = r, r + 1, node, node | 1179 t, r, chain, prev = r, r + 1, node, node |
1188 base = self.base(t) | 1180 base = self.base(t) |