[PATCH 1 of 2 WIP] revlog: add a wrapper class that can give a filtered view of a revlog
Idan Kamara
idankk86 at gmail.com
Fri Jun 29 12:07:34 CDT 2012
# HG changeset patch
# User Idan Kamara <idankk86 at gmail.com>
# Date 1340987626 -10800
# Node ID f9c24a3d3a570bc93070490190bd0c87bb4c88e9
# Parent fba17a64fa4978bfea19222da5e64a18cfddeecd
revlog: add a wrapper class that can give a filtered view of a revlog
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -1310,3 +1310,87 @@
if not self._inline:
res.append(self.datafile)
return res
+
+class filteredrevlog(object):
+ def __init__(self, rl, filteredrevs, filterednodes):
+ self.rl = rl
+ self.filteredrevs = filteredrevs
+ self.filterednodes = filterednodes
+
+ def tip(self):
+ t = self.rev(self.rl.tip())
+ while t in self.filteredrevs:
+ t -= 1
+ return self.node(t)
+
+ def __len__(self):
+ return len(self.rl) - len(self.filteredrevs)
+
+ def __iter__(self):
+ for i in xrange(len(self.rl)):
+ if i not in self.filteredrevs:
+ yield i
+
+ def hasnode(self, node):
+ # explicit query, should we give filtered view?
+ return node not in self.filterednodes and self.rl.hasnode(node)
+
+ def descendants(self, *revs):
+ for r in self.rl.descendants(*revs):
+ if r not in self.filteredrevs:
+ yield r
+
+ def headrevs(self):
+ h = self.rl.headrevs()
+ hh = []
+ for r in h:
+ if r in self.filteredrevs:
+ for p in self.parentrevs(r):
+ if len(self.children(self.node(p))) == 0:
+ hh.append(p)
+ else:
+ hh.append(r)
+ return hh
+
+ def heads(self, start=None, stop=None):
+ h = self.rl.heads(start, stop)
+ hh = []
+ for n in h:
+ if n in self.filterednodes:
+ for p in self.parents(n):
+ # do the same check for p if it's also filtered
+ if p in self.filterednodes:
+ h.append(p)
+ elif len(self.children(p)) == 0:
+ hh.append(p)
+ else:
+ hh.append(n)
+ return hh
+
+ def children(self, node):
+ c = []
+ for n in self.rl.children(node):
+ if n not in self.filterednodes:
+ c.append(n)
+ return c
+
+ def nodesbetween(self, roots=None, heads=None):
+ if heads is None:
+ heads = self.heads()
+ return self.rl.nodesbetween(roots, heads)
+
+ def findmissing(self, common=None, heads=None):
+ if heads is None:
+ heads = self.heads()
+ return self.rl.findmissing(common, heads)
+
+ def findcommonmissing(self, common=None, heads=None):
+ if heads is None:
+ heads = self.heads()
+ return self.rl.findcommonmissing(common, heads)
+
+ def __getattr__(self, attr):
+ return getattr(self.rl, attr)
+
+ def __eq__(self, other):
+ return self.rl == other
More information about the Mercurial-devel
mailing list