mercurial/revlog.py
changeset 3930 01d98d68d697
parent 3928 4df475e22248
child 4061 40030c1b6bc6
equal deleted inserted replaced
3929:33988aaa1652 3930:01d98d68d697
   279         self.p.map[key] = val
   279         self.p.map[key] = val
   280     def __delitem__(self, key):
   280     def __delitem__(self, key):
   281         del self.p.map[key]
   281         del self.p.map[key]
   282 
   282 
   283 class RevlogError(Exception): pass
   283 class RevlogError(Exception): pass
       
   284 class LookupError(RevlogError): pass
   284 
   285 
   285 class revlog(object):
   286 class revlog(object):
   286     """
   287     """
   287     the underlying revision storage object
   288     the underlying revision storage object
   288 
   289 
   469         return rev == nullrev and nullid or self.index[rev][-1]
   470         return rev == nullrev and nullid or self.index[rev][-1]
   470     def rev(self, node):
   471     def rev(self, node):
   471         try:
   472         try:
   472             return self.nodemap[node]
   473             return self.nodemap[node]
   473         except KeyError:
   474         except KeyError:
   474             raise RevlogError(_('%s: no node %s') % (self.indexfile, hex(node)))
   475             raise LookupError(_('%s: no node %s') % (self.indexfile, hex(node)))
   475     def linkrev(self, node):
   476     def linkrev(self, node):
   476         return (node == nullid) and nullrev or self.index[self.rev(node)][-4]
   477         return (node == nullid) and nullrev or self.index[self.rev(node)][-4]
   477     def parents(self, node):
   478     def parents(self, node):
   478         if node == nullid: return (nullid, nullid)
   479         if node == nullid: return (nullid, nullid)
   479         r = self.rev(node)
   480         r = self.rev(node)
   764             # odds of a binary node being all hex in ASCII are 1 in 10**25
   765             # odds of a binary node being all hex in ASCII are 1 in 10**25
   765             try:
   766             try:
   766                 node = id
   767                 node = id
   767                 r = self.rev(node) # quick search the index
   768                 r = self.rev(node) # quick search the index
   768                 return node
   769                 return node
   769             except RevlogError:
   770             except LookupError:
   770                 pass # may be partial hex id
   771                 pass # may be partial hex id
   771         try:
   772         try:
   772             # str(rev)
   773             # str(rev)
   773             rev = int(id)
   774             rev = int(id)
   774             if str(rev) != id: raise ValueError
   775             if str(rev) != id: raise ValueError
   793                 bin_id = bin(id[:len(id) & ~1]) # grab an even number of digits
   794                 bin_id = bin(id[:len(id) & ~1]) # grab an even number of digits
   794                 node = None
   795                 node = None
   795                 for n in self.nodemap:
   796                 for n in self.nodemap:
   796                     if n.startswith(bin_id) and hex(n).startswith(id):
   797                     if n.startswith(bin_id) and hex(n).startswith(id):
   797                         if node is not None:
   798                         if node is not None:
   798                             raise RevlogError(_("Ambiguous identifier"))
   799                             raise LookupError(_("Ambiguous identifier"))
   799                         node = n
   800                         node = n
   800                 if node is not None:
   801                 if node is not None:
   801                     return node
   802                     return node
   802             except TypeError:
   803             except TypeError:
   803                 pass
   804                 pass
   813             return n
   814             return n
   814         n = self._partialmatch(id)
   815         n = self._partialmatch(id)
   815         if n:
   816         if n:
   816             return n
   817             return n
   817 
   818 
   818         raise RevlogError(_("No match found"))
   819         raise LookupError(_("No match found"))
   819 
   820 
   820     def cmp(self, node, text):
   821     def cmp(self, node, text):
   821         """compare text with a given file revision"""
   822         """compare text with a given file revision"""
   822         p1, p2 = self.parents(node)
   823         p1, p2 = self.parents(node)
   823         return hash(text, p1, p2) != node
   824         return hash(text, p1, p2) != node
  1153                 continue
  1154                 continue
  1154             delta = chunk[80:]
  1155             delta = chunk[80:]
  1155 
  1156 
  1156             for p in (p1, p2):
  1157             for p in (p1, p2):
  1157                 if not p in self.nodemap:
  1158                 if not p in self.nodemap:
  1158                     raise RevlogError(_("unknown parent %s") % short(p))
  1159                     raise LookupError(_("unknown parent %s") % short(p))
  1159 
  1160 
  1160             if not chain:
  1161             if not chain:
  1161                 # retrieve the parent revision of the delta chain
  1162                 # retrieve the parent revision of the delta chain
  1162                 chain = p1
  1163                 chain = p1
  1163                 if not chain in self.nodemap:
  1164                 if not chain in self.nodemap:
  1164                     raise RevlogError(_("unknown base %s") % short(chain[:4]))
  1165                     raise LookupError(_("unknown base %s") % short(chain[:4]))
  1165 
  1166 
  1166             # full versions are inserted when the needed deltas become
  1167             # full versions are inserted when the needed deltas become
  1167             # comparable to the uncompressed text or when the previous
  1168             # comparable to the uncompressed text or when the previous
  1168             # version is not the one we have a delta against. We use
  1169             # version is not the one we have a delta against. We use
  1169             # the size of the previous full rev as a proxy for the
  1170             # the size of the previous full rev as a proxy for the