[PATCH 3 of 5] revset: add option to make inner range follow ordering of input set
Yuya Nishihara
yuya at tcha.org
Mon May 30 15:11:33 UTC 2016
# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1462247570 -32400
# Tue May 03 12:52:50 2016 +0900
# Node ID 7ed64e1d13c699211ad82431af51f513d2aafbbb
# Parent 2ec0a482eea2f8cfcd19b3d3fa39457c3bf3c6f3
revset: add option to make inner range follow ordering of input set
This is simpler and faster than inserting generic _reorder() function.
diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -357,7 +357,7 @@ def stringset(repo, subset, x):
return baseset([x])
return baseset()
-def rangeset(repo, subset, x, y):
+def rangeset(repo, subset, x, y, o):
m = getset(repo, fullreposet(repo), x)
n = getset(repo, fullreposet(repo), y)
@@ -375,12 +375,13 @@ def rangeset(repo, subset, x, y):
r = spanset(repo, m, n + 1)
else:
r = spanset(repo, m, n - 1)
- # XXX We should combine with subset first: 'subset & baseset(...)'. This is
- # necessary to ensure we preserve the order in subset.
- #
- # This has performance implication, carrying the sorting over when possible
- # would be more efficient.
- return r & subset
+
+ order = getstring(o, "internal error: rangeset requires a order string")
+ if order == _defineorder:
+ return r & subset
+ else:
+ # carrying the sorting over when possible would be more efficient
+ return subset & r
def dagrange(repo, subset, x, y):
r = fullreposet(repo)
@@ -2224,7 +2225,11 @@ def _optimize(x, small, order):
return o[0], (op, o[1])
elif op == 'group':
return _optimize(x[1], small, order)
- elif op in 'dagrange range parent ancestorspec':
+ elif op == 'range':
+ wa, ta = _optimize(x[1], small, _defineorder)
+ wb, tb = _optimize(x[2], small, _defineorder)
+ return wa + wb, (op, ta, tb, ('string', order))
+ elif op in 'dagrange parent ancestorspec':
if op == 'parent':
# x^:y means (x^) : y, not x ^ (:y)
post = ('parentpost', x[1])
diff --git a/tests/test-revset.t b/tests/test-revset.t
--- a/tests/test-revset.t
+++ b/tests/test-revset.t
@@ -123,7 +123,8 @@ trivial
* optimized:
(range
('string', '0')
- ('string', 'tip'))
+ ('string', 'tip')
+ ('string', 'define'))
* set:
<spanset+ 0:9>
0
@@ -706,7 +707,8 @@ Test opreand of '%' is optimized recursi
(difference
(range
('symbol', '8')
- ('symbol', '9'))
+ ('symbol', '9')
+ ('string', 'define'))
('symbol', '8')))
* set:
<baseset+ [8, 9]>
@@ -913,6 +915,46 @@ Test order of revisions in compound expr
1
0
+ 'x:y' takes ordering parameter:
+
+ $ try --optimize '3:0 & 0:3 & not 2:1'
+ (and
+ (and
+ (range
+ ('symbol', '3')
+ ('symbol', '0'))
+ (range
+ ('symbol', '0')
+ ('symbol', '3')))
+ (not
+ (range
+ ('symbol', '2')
+ ('symbol', '1'))))
+ * optimized:
+ (difference
+ (and
+ (range
+ ('symbol', '3')
+ ('symbol', '0')
+ ('string', 'define'))
+ (range
+ ('symbol', '0')
+ ('symbol', '3')
+ ('string', 'follow')))
+ (range
+ ('symbol', '2')
+ ('symbol', '1')
+ ('string', 'any')))
+ * set:
+ <filteredset
+ <filteredset
+ <spanset- 0:3>,
+ <spanset+ 0:3>>,
+ <not
+ <spanset+ 1:2>>>
+ 3
+ 0
+
'_reorder' should be inserted where necessary:
$ try --optimize '2:0 & (0 + 1 + 2)'
@@ -929,7 +971,8 @@ Test order of revisions in compound expr
(and
(range
('symbol', '2')
- ('symbol', '0'))
+ ('symbol', '0')
+ ('string', 'define'))
(func
('symbol', '_reorder')
(func
@@ -958,21 +1001,23 @@ Test order of revisions in compound expr
(and
(range
('symbol', '2')
- ('symbol', '0'))
+ ('symbol', '0')
+ ('string', 'define'))
(func
('symbol', '_reorder')
(or
(range
('symbol', '0')
- ('symbol', '1'))
+ ('symbol', '1')
+ ('string', 'follow'))
('symbol', '2'))))
* set:
<filteredset
<spanset- 0:2>,
<addset
<filteredset
- <spanset+ 0:1>,
- <spanset- 0:2>>,
+ <spanset- 0:2>,
+ <spanset+ 0:1>>,
<baseset [2]>>>
2
1
@@ -994,7 +1039,8 @@ Test order of revisions in compound expr
(difference
(range
('symbol', '2')
- ('symbol', '0'))
+ ('symbol', '0')
+ ('string', 'define'))
(func
('symbol', '_list')
('string', '0\x001')))
@@ -1024,11 +1070,13 @@ Test order of revisions in compound expr
(difference
(range
('symbol', '2')
- ('symbol', '0'))
+ ('symbol', '0')
+ ('string', 'define'))
(and
(range
('symbol', '0')
- ('symbol', '2'))
+ ('symbol', '2')
+ ('string', 'any'))
(func
('symbol', '_list')
('string', '0\x001'))))
@@ -1056,7 +1104,8 @@ Test order of revisions in compound expr
(and
(range
('symbol', '0')
- ('symbol', '2'))
+ ('symbol', '2')
+ ('string', 'define'))
(func
('symbol', '_reorder')
(func
@@ -1091,7 +1140,8 @@ Test order of revisions in compound expr
(and
(range
('symbol', '0')
- ('symbol', '2'))
+ ('symbol', '2')
+ ('string', 'define'))
(func
('symbol', '_reorder')
(func
@@ -1128,7 +1178,8 @@ Test order of revisions in compound expr
(and
(range
('symbol', '2')
- ('symbol', '0'))
+ ('symbol', '0')
+ ('string', 'define'))
(func
('symbol', 'first')
(func
@@ -1157,7 +1208,8 @@ Test order of revisions in compound expr
(difference
(range
('symbol', '2')
- ('symbol', '0'))
+ ('symbol', '0')
+ ('string', 'define'))
(func
('symbol', 'last')
(func
@@ -1196,18 +1248,20 @@ Test order of revisions in compound expr
(and
(range
('symbol', '2')
- ('symbol', '0'))
+ ('symbol', '0')
+ ('string', 'define'))
(range
(func
('symbol', '_list')
('string', '1\x000\x002'))
(func
('symbol', '_list')
- ('string', '0\x002\x001'))))
+ ('string', '0\x002\x001'))
+ ('string', 'follow')))
* set:
<filteredset
- <baseset [1]>,
- <spanset- 0:2>>
+ <spanset- 0:2>,
+ <baseset [1]>>
1
'A & B' can be rewritten as 'B & A' by weight, but that's fine as long as
@@ -1610,7 +1664,8 @@ test optimization of trivial `or` operat
('string', '0\x001'))
(range
('symbol', '2')
- ('symbol', '3')))
+ ('symbol', '3')
+ ('string', 'define')))
* set:
<addset
<baseset [0, 1]>,
@@ -1635,11 +1690,13 @@ test optimization of trivial `or` operat
(or
(range
('symbol', '0')
- ('symbol', '1'))
+ ('symbol', '1')
+ ('string', 'define'))
('symbol', '2')
(range
('symbol', '3')
- ('symbol', '4'))
+ ('symbol', '4')
+ ('string', 'define'))
(func
('symbol', '_list')
('string', '5\x006')))
More information about the Mercurial-devel
mailing list