Mercurial > hg
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 |