mercurial/revlog.py
changeset 4979 06abdaf78788
parent 4978 93d48a8fa496
child 4980 fc44c8df9d99
equal deleted inserted replaced
4978:93d48a8fa496 4979:06abdaf78788
   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)
  1047             dfh.flush()
  1035             dfh.flush()
  1048         else:
  1036         else:
  1049             ifh.seek(0, 2)
  1037             ifh.seek(0, 2)
  1050             transaction.add(self.indexfile, ifh.tell(), self.count() - 1)
  1038             transaction.add(self.indexfile, ifh.tell(), self.count() - 1)
  1051 
  1039 
  1052         if len(self.index) == 1 and self.version != REVLOGV0:
  1040         if self.count() == 1 and self.version != REVLOGV0:
  1053             l = struct.pack(versionformat, self.version)
  1041             l = struct.pack(versionformat, self.version)
  1054             ifh.write(l)
  1042             ifh.write(l)
  1055             entry = entry[4:]
  1043             entry = entry[4:]
  1056 
  1044 
  1057         ifh.write(entry)
  1045         ifh.write(entry)
  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)