equal
deleted
inserted
replaced
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 |