comparison mercurial/revlog.py @ 6228:c0c4c7b1e8d3

revlog: report node and file when lookup fails
author Matt Mackall <mpm@selenic.com>
date Tue, 11 Mar 2008 17:42:29 -0500
parents e75aab656f46
children 7c8101b5ceb1
comparison
equal deleted inserted replaced
6227:4c1aa6affe60 6228:c0c4c7b1e8d3
31 31
32 class RevlogError(Exception): 32 class RevlogError(Exception):
33 pass 33 pass
34 34
35 class LookupError(RevlogError): 35 class LookupError(RevlogError):
36 def __init__(self, name, message=None): 36 def __init__(self, name, index, message):
37 if message is None:
38 message = _('not found: %s') % name
39 RevlogError.__init__(self, message)
40 self.name = name 37 self.name = name
38 if isinstance(name, str) and len(name) == 20:
39 name = short(name)
40 RevlogError.__init__(self, _('%s@%s: %s') % (index, name, message))
41 41
42 def getoffset(q): 42 def getoffset(q):
43 return int(q >> 16) 43 return int(q >> 16)
44 44
45 def gettype(q): 45 def gettype(q):
517 517
518 def rev(self, node): 518 def rev(self, node):
519 try: 519 try:
520 return self.nodemap[node] 520 return self.nodemap[node]
521 except KeyError: 521 except KeyError:
522 raise LookupError(hex(node), _('%s: no node %s') % (self.indexfile, hex(node))) 522 raise LookupError(node, self.indexfile, _('no node'))
523 def node(self, rev): 523 def node(self, rev):
524 return self.index[rev][7] 524 return self.index[rev][7]
525 def linkrev(self, node): 525 def linkrev(self, node):
526 return self.index[self.rev(node)][4] 526 return self.index[self.rev(node)][4]
527 def parents(self, node): 527 def parents(self, node):
837 bin_id = bin(id[:len(id) & ~1]) # grab an even number of digits 837 bin_id = bin(id[:len(id) & ~1]) # grab an even number of digits
838 node = None 838 node = None
839 for n in self.nodemap: 839 for n in self.nodemap:
840 if n.startswith(bin_id) and hex(n).startswith(id): 840 if n.startswith(bin_id) and hex(n).startswith(id):
841 if node is not None: 841 if node is not None:
842 raise LookupError(hex(node), 842 raise LookupError(id, self.indexfile,
843 _("Ambiguous identifier")) 843 _('ambiguous identifier'))
844 node = n 844 node = n
845 if node is not None: 845 if node is not None:
846 return node 846 return node
847 except TypeError: 847 except TypeError:
848 pass 848 pass
857 return n 857 return n
858 n = self._partialmatch(id) 858 n = self._partialmatch(id)
859 if n: 859 if n:
860 return n 860 return n
861 861
862 raise LookupError(id, _("No match found")) 862 raise LookupError(id, self.indexfile, _('no match found'))
863 863
864 def cmp(self, node, text): 864 def cmp(self, node, text):
865 """compare text with a given file revision""" 865 """compare text with a given file revision"""
866 p1, p2 = self.parents(node) 866 p1, p2 = self.parents(node)
867 return hash(text, p1, p2) != node 867 return hash(text, p1, p2) != node
1168 delta = buffer(chunk, 80) 1168 delta = buffer(chunk, 80)
1169 del chunk 1169 del chunk
1170 1170
1171 for p in (p1, p2): 1171 for p in (p1, p2):
1172 if not p in self.nodemap: 1172 if not p in self.nodemap:
1173 raise LookupError(hex(p), _("unknown parent %s") % short(p)) 1173 raise LookupError(p, self.indexfile, _('unknown parent'))
1174 1174
1175 if not chain: 1175 if not chain:
1176 # retrieve the parent revision of the delta chain 1176 # retrieve the parent revision of the delta chain
1177 chain = p1 1177 chain = p1
1178 if not chain in self.nodemap: 1178 if not chain in self.nodemap:
1179 raise LookupError(hex(chain), _("unknown base %s") % short(chain[:4])) 1179 raise LookupError(chain, self.indexfile, _('unknown base'))
1180 1180
1181 # full versions are inserted when the needed deltas become 1181 # full versions are inserted when the needed deltas become
1182 # comparable to the uncompressed text or when the previous 1182 # comparable to the uncompressed text or when the previous
1183 # version is not the one we have a delta against. We use 1183 # version is not the one we have a delta against. We use
1184 # the size of the previous full rev as a proxy for the 1184 # the size of the previous full rev as a proxy for the