[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