[PATCH] add rev1::rev2 syntax for topological revision range selection

Alexander Solovyov piranha at piranha.org.ua
Sun Oct 25 10:45:34 CDT 2009


# HG changeset patch
# User Alexander Solovyov <piranha at piranha.org.ua>
# Date 1256481240 -7200
# Node ID b097bdfc98dd5899ed9031c8bd8b9961d5ce2e2c
# Parent  26073b3e8ab982fdccb71c595e8cf0dd87a07c99
add rev1::rev2 syntax for topological revision range selection

diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -12,6 +12,7 @@ import mdiff, bdiff, util, templater, pa
 import match as _match
 
 revrangesep = ':'
+revbranchsep = '::'
 
 def findpossible(cmd, table, strict=False):
     """
@@ -153,13 +154,26 @@ def revrange(repo, revs):
         if not val and val != 0 and defval is not None:
             return defval
         return repo.changelog.rev(repo.lookup(val))
+    def split(spec, splitter):
+        start, end = spec.split(splitter, 1)
+        start = revfix(repo, start, 0)
+        end = revfix(repo, end, len(repo) - 1)
+        return start, end
 
     seen, l = set(), []
+    cl = repo.changelog
     for spec in revs:
-        if revrangesep in spec:
-            start, end = spec.split(revrangesep, 1)
-            start = revfix(repo, start, 0)
-            end = revfix(repo, end, len(repo) - 1)
+        if revbranchsep in spec:
+            start, end = split(spec, revbranchsep)
+            r1, r2 = repo.lookup(start), repo.lookup(end)
+            reverse = start > end
+            if reverse:
+                r1, r2 = r2, r1
+            l = map(cl.rev, cl.nodesbetween([r1], [r2])[0])
+            if reverse:
+                l = list(reversed(l))
+        elif revrangesep in spec:
+            start, end = split(spec, revrangesep)
             step = start > end and -1 or 1
             for rev in xrange(start, end+step, step):
                 if rev in seen:
diff --git a/tests/test-revrange b/tests/test-revrange
new file mode 100755
--- /dev/null
+++ b/tests/test-revrange
@@ -0,0 +1,34 @@
+#!/bin/sh
+# test rev1:rev2 and rev1::rev2 syntax
+
+echo "[extensions]" >> $HGRCPATH
+echo "graphlog=" >> $HGRCPATH
+echo "[alias]" >> $HGRCPATH
+echo "sl = log --template '{rev} {desc}\\\n'" >> $HGRCPATH
+echo "sg = glog --template '{rev} {desc}\\\n'" >> $HGRCPATH
+
+hg init repo
+cd repo
+echo a > a
+hg ci -qAm initial
+echo b > b
+hg ci -qAm one
+hg up -r 0
+echo c > c
+hg ci -qAm two
+hg up -Cr 1
+echo d > d
+hg ci -qAm three
+hg merge
+hg ci -m merge
+
+echo '\n% result'
+hg sg
+
+echo '\n% usual revrange'
+hg sl -r 0:3
+
+echo '\n% topological revrange'
+hg sl -r 0::3
+echo
+hg sl -r 4::2
diff --git a/tests/test-revrange.out b/tests/test-revrange.out
new file mode 100644
--- /dev/null
+++ b/tests/test-revrange.out
@@ -0,0 +1,30 @@
+0 files updated, 0 files merged, 1 files removed, 0 files unresolved
+1 files updated, 0 files merged, 1 files removed, 0 files unresolved
+1 files updated, 0 files merged, 0 files removed, 0 files unresolved
+(branch merge, don't forget to commit)
+
+% result
+@    4 merge
+|\
+| o  3 three
+| |
+o |  2 two
+| |
+| o  1 one
+|/
+o  0 initial
+
+
+% usual revrange
+0 initial
+1 one
+2 two
+3 three
+
+% topological revrange
+0 initial
+1 one
+3 three
+
+4 merge
+2 two


More information about the Mercurial-devel mailing list