comparison mercurial/revlog.py @ 2956:6dddcba7596a

merge.
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Fri, 18 Aug 2006 21:17:28 -0700
parents 5df3e5cf16bc
children baa3873eb387
comparison
equal deleted inserted replaced
2955:9d1c3529ebbc 2956:6dddcba7596a
2 revlog.py - storage back-end for mercurial 2 revlog.py - storage back-end for mercurial
3 3
4 This provides efficient delta storage with O(1) retrieve and append 4 This provides efficient delta storage with O(1) retrieve and append
5 and O(changes) merge between branches 5 and O(changes) merge between branches
6 6
7 Copyright 2005 Matt Mackall <mpm@selenic.com> 7 Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
8 8
9 This software may be used and distributed according to the terms 9 This software may be used and distributed according to the terms
10 of the GNU General Public License, incorporated herein by reference. 10 of the GNU General Public License, incorporated herein by reference.
11 """ 11 """
12 12
467 def rev(self, node): 467 def rev(self, node):
468 try: 468 try:
469 return self.nodemap[node] 469 return self.nodemap[node]
470 except KeyError: 470 except KeyError:
471 raise RevlogError(_('%s: no node %s') % (self.indexfile, hex(node))) 471 raise RevlogError(_('%s: no node %s') % (self.indexfile, hex(node)))
472 def linkrev(self, node): return self.index[self.rev(node)][-4] 472 def linkrev(self, node):
473 return (node == nullid) and -1 or self.index[self.rev(node)][-4]
473 def parents(self, node): 474 def parents(self, node):
474 if node == nullid: return (nullid, nullid) 475 if node == nullid: return (nullid, nullid)
475 r = self.rev(node) 476 r = self.rev(node)
476 d = self.index[r][-3:-1] 477 d = self.index[r][-3:-1]
477 if self.version == REVLOGV0: 478 if self.version == REVLOGV0:
741 continue 742 continue
742 return c 743 return c
743 744
744 def lookup(self, id): 745 def lookup(self, id):
745 """locate a node based on revision number or subset of hex nodeid""" 746 """locate a node based on revision number or subset of hex nodeid"""
746 if id in self.nodemap:
747 return id
748 if type(id) == type(0): 747 if type(id) == type(0):
749 rev = id 748 return self.node(id)
750 if rev < 0: rev = self.count() + rev
751 if rev < 0 or rev >= self.count(): return None
752 return self.node(rev)
753 try: 749 try:
754 rev = int(id) 750 rev = int(id)
755 if str(rev) != id: raise ValueError 751 if str(rev) != id: raise ValueError
756 if rev < 0: rev = self.count() + rev 752 if rev < 0: rev = self.count() + rev
757 if rev < 0 or rev >= self.count(): raise ValueError 753 if rev < 0 or rev >= self.count(): raise ValueError
760 c = [] 756 c = []
761 for n in self.nodemap: 757 for n in self.nodemap:
762 if hex(n).startswith(id): 758 if hex(n).startswith(id):
763 c.append(n) 759 c.append(n)
764 if len(c) > 1: raise RevlogError(_("Ambiguous identifier")) 760 if len(c) > 1: raise RevlogError(_("Ambiguous identifier"))
765 if len(c) < 1: raise RevlogError(_("No match found")) 761 if len(c) == 1: return c[0]
766 return c[0] 762
767 763 # might need fixing if we change hash lengths
768 return None 764 if len(id) == 20 and id in self.nodemap:
765 return id
766
767 raise RevlogError(_("No match found"))
768
769 def cmp(self, node, text):
770 """compare text with a given file revision"""
771 p1, p2 = self.parents(node)
772 return hash(text, p1, p2) != node
773
774 def makenode(self, node, text):
775 """calculate a file nodeid for text, descended or possibly
776 unchanged from node"""
777
778 if self.cmp(node, text):
779 return hash(text, node, nullid)
780 return node
769 781
770 def diff(self, a, b): 782 def diff(self, a, b):
771 """return a delta between two revisions""" 783 """return a delta between two revisions"""
772 return mdiff.textdiff(a, b) 784 return mdiff.textdiff(a, b)
773 785