revsets: preserve ordering with the or operator
This is valuable because now revsets like 'bookmarks() or tip' will
always show tip after bookmarks unless tip was itself a bookmark. This
is a somewhat contrived example, but this behavior is useful for
"where am I" type aliases that use log and revsets.
--- a/mercurial/revset.py Wed Apr 13 07:40:24 2011 +0530
+++ b/mercurial/revset.py Wed Apr 13 12:30:41 2011 -0500
@@ -156,9 +156,10 @@
return getset(repo, getset(repo, subset, x), y)
def orset(repo, subset, x, y):
- s = set(getset(repo, subset, x))
- s |= set(getset(repo, [r for r in subset if r not in s], y))
- return [r for r in subset if r in s]
+ xl = getset(repo, subset, x)
+ s = set(xl)
+ yl = getset(repo, [r for r in subset if r not in s], y)
+ return xl + yl
def notset(repo, subset, x):
s = set(getset(repo, subset, x))
--- a/tests/test-revset.t Wed Apr 13 07:40:24 2011 +0530
+++ b/tests/test-revset.t Wed Apr 13 12:30:41 2011 -0500
@@ -369,3 +369,8 @@
hg: parse error at 2: invalid token
[255]
+or operator should preserve ordering:
+ $ log 'reverse(2::4) or tip'
+ 4
+ 2
+ 9