[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