233 return ret |
233 return ret |
234 def __setitem__(self, pos, item): |
234 def __setitem__(self, pos, item): |
235 self.p.index[pos] = item |
235 self.p.index[pos] = item |
236 def __delitem__(self, pos): |
236 def __delitem__(self, pos): |
237 del self.p.index[pos] |
237 del self.p.index[pos] |
|
238 def insert(self, pos, e): |
|
239 self.p.index.insert(pos, e) |
238 def append(self, e): |
240 def append(self, e): |
239 self.p.index.append(e) |
241 self.p.index.append(e) |
240 |
242 |
241 class lazymap(object): |
243 class lazymap(object): |
242 """a lazy version of the node map""" |
244 """a lazy version of the node map""" |
449 self._io = revlogio() |
451 self._io = revlogio() |
450 if self.version == REVLOGV0: |
452 if self.version == REVLOGV0: |
451 self._io = revlogoldio() |
453 self._io = revlogoldio() |
452 if i: |
454 if i: |
453 self.index, self.nodemap = self._io.parseindex(f, st, self._inline()) |
455 self.index, self.nodemap = self._io.parseindex(f, st, self._inline()) |
|
456 # add the magic null revision at -1 |
|
457 self.index.append((0, 0, 0, -1, -1, -1, -1, nullid)) |
454 |
458 |
455 def _loadindex(self, start, end): |
459 def _loadindex(self, start, end): |
456 """load a block of indexes all at once from the lazy parser""" |
460 """load a block of indexes all at once from the lazy parser""" |
457 if isinstance(self.index, lazyindex): |
461 if isinstance(self.index, lazyindex): |
458 self.index.p.loadindex(start, end) |
462 self.index.p.loadindex(start, end) |
470 self.nodemap.p.loadmap() |
474 self.nodemap.p.loadmap() |
471 self.nodemap = self.nodemap.p.map |
475 self.nodemap = self.nodemap.p.map |
472 |
476 |
473 def _inline(self): return self.version & REVLOGNGINLINEDATA |
477 def _inline(self): return self.version & REVLOGNGINLINEDATA |
474 |
478 |
475 def tip(self): return self.node(len(self.index) - 1) |
479 def tip(self): return self.node(len(self.index) - 2) |
476 def count(self): return len(self.index) |
480 def count(self): return len(self.index) - 1 |
477 def node(self, rev): |
481 def node(self, rev): |
478 return rev == nullrev and nullid or self.index[rev][7] |
482 return self.index[rev][7] |
479 def rev(self, node): |
483 def rev(self, node): |
480 try: |
484 try: |
481 return self.nodemap[node] |
485 return self.nodemap[node] |
482 except KeyError: |
486 except KeyError: |
483 raise LookupError(_('%s: no node %s') % (self.indexfile, hex(node))) |
487 raise LookupError(_('%s: no node %s') % (self.indexfile, hex(node))) |
484 def linkrev(self, node): |
488 def linkrev(self, node): |
485 return (node == nullid) and nullrev or self.index[self.rev(node)][4] |
489 return self.index[self.rev(node)][4] |
486 def parents(self, node): |
490 def parents(self, node): |
487 if node == nullid: return (nullid, nullid) |
491 d = self.index[self.rev(node)][5:7] |
488 r = self.rev(node) |
|
489 d = self.index[r][5:7] |
|
490 return (self.node(d[0]), self.node(d[1])) |
492 return (self.node(d[0]), self.node(d[1])) |
491 def parentrevs(self, rev): |
493 def parentrevs(self, rev): |
492 if rev == nullrev: |
494 return self.index[rev][5:7] |
493 return (nullrev, nullrev) |
|
494 d = self.index[rev][5:7] |
|
495 return d |
|
496 def start(self, rev): |
495 def start(self, rev): |
497 if rev == nullrev: |
|
498 return 0 |
|
499 return getoffset(self.index[rev][0]) |
496 return getoffset(self.index[rev][0]) |
500 |
|
501 def end(self, rev): return self.start(rev) + self.length(rev) |
497 def end(self, rev): return self.start(rev) + self.length(rev) |
502 |
498 |
503 def size(self, rev): |
499 def size(self, rev): |
504 """return the length of the uncompressed text for a given revision""" |
500 """return the length of the uncompressed text for a given revision""" |
505 if rev == nullrev: |
|
506 return 0 |
|
507 l = self.index[rev][2] |
501 l = self.index[rev][2] |
508 if l >= 0: |
502 if l >= 0: |
509 return l |
503 return l |
510 |
504 |
511 t = self.revision(self.node(rev)) |
505 t = self.revision(self.node(rev)) |
530 l = mdiff.patchedsize(l, self.chunk(x)) |
524 l = mdiff.patchedsize(l, self.chunk(x)) |
531 return l |
525 return l |
532 """ |
526 """ |
533 |
527 |
534 def length(self, rev): |
528 def length(self, rev): |
535 if rev == nullrev: |
529 return self.index[rev][1] |
536 return 0 |
|
537 else: |
|
538 return self.index[rev][1] |
|
539 def base(self, rev): |
530 def base(self, rev): |
540 if (rev == nullrev): |
531 return self.index[rev][3] |
541 return nullrev |
|
542 else: |
|
543 return self.index[rev][3] |
|
544 |
532 |
545 def reachable(self, node, stop=None): |
533 def reachable(self, node, stop=None): |
546 """return a hash of all nodes ancestral to a given node, including |
534 """return a hash of all nodes ancestral to a given node, including |
547 the node itself, stopping when stop is matched""" |
535 the node itself, stopping when stop is matched""" |
548 reachable = {} |
536 reachable = {} |
1027 offset = self.end(t) |
1015 offset = self.end(t) |
1028 |
1016 |
1029 e = (offset_type(offset, 0), l, len(text), |
1017 e = (offset_type(offset, 0), l, len(text), |
1030 base, link, self.rev(p1), self.rev(p2), node) |
1018 base, link, self.rev(p1), self.rev(p2), node) |
1031 |
1019 |
1032 self.index.append(e) |
1020 self.index.insert(-1, e) |
1033 self.nodemap[node] = n |
1021 self.nodemap[node] = n |
1034 |
1022 |
1035 if self.version == REVLOGV0: |
1023 if self.version == REVLOGV0: |
1036 e = (offset, l, base, link, p1, p2, node) |
1024 e = (offset, l, base, link, p1, p2, node) |
1037 entry = struct.pack(indexformatv0, *e) |
1025 entry = struct.pack(indexformatv0, *e) |
1191 raise RevlogError(_("consistency error adding group")) |
1179 raise RevlogError(_("consistency error adding group")) |
1192 textlen = len(text) |
1180 textlen = len(text) |
1193 else: |
1181 else: |
1194 e = (offset_type(end, 0), len(cdelta), textlen, base, |
1182 e = (offset_type(end, 0), len(cdelta), textlen, base, |
1195 link, self.rev(p1), self.rev(p2), node) |
1183 link, self.rev(p1), self.rev(p2), node) |
1196 self.index.append(e) |
1184 self.index.insert(-1, e) |
1197 self.nodemap[node] = r |
1185 self.nodemap[node] = r |
1198 if self._inline(): |
1186 if self._inline(): |
1199 ifh.write(struct.pack(indexformatng, *e)) |
1187 ifh.write(struct.pack(indexformatng, *e)) |
1200 ifh.write(cdelta) |
1188 ifh.write(cdelta) |
1201 self.checkinlinesize(transaction, ifh) |
1189 self.checkinlinesize(transaction, ifh) |
1250 self.cache = None |
1238 self.cache = None |
1251 self._io.chunkcache = None |
1239 self._io.chunkcache = None |
1252 for x in xrange(rev, self.count()): |
1240 for x in xrange(rev, self.count()): |
1253 del self.nodemap[self.node(x)] |
1241 del self.nodemap[self.node(x)] |
1254 |
1242 |
1255 del self.index[rev:] |
1243 del self.index[rev:-1] |
1256 |
1244 |
1257 def checksize(self): |
1245 def checksize(self): |
1258 expected = 0 |
1246 expected = 0 |
1259 if self.count(): |
1247 if self.count(): |
1260 expected = self.end(self.count() - 1) |
1248 expected = self.end(self.count() - 1) |