[PATCH 2 of 2] revset: do not rewrite ':y' to '0:y' (issue5385)
Yuya Nishihara
yuya at tcha.org
Sat Oct 1 14:14:07 UTC 2016
# HG changeset patch
# User Yuya Nishihara <yuya at tcha.org>
# Date 1475320811 -32400
# Sat Oct 01 20:20:11 2016 +0900
# Node ID 763d3e64a8b88d6e8ab12e15738274c3ffcab589
# Parent 95ec9f99f4dc075caa28ca71580e913b35855d84
revset: do not rewrite ':y' to '0:y' (issue5385)
That's no longer valid since the revision 0 may be hidden. Bypass validating
the existence of '0' and filter it by spanset.
diff --git a/mercurial/revset.py b/mercurial/revset.py
--- a/mercurial/revset.py
+++ b/mercurial/revset.py
@@ -368,6 +368,13 @@ def rangeset(repo, subset, x, y, order):
return baseset()
return _makerangeset(repo, subset, m.first(), n.last(), order)
+def rangepre(repo, subset, y, order):
+ # ':y' can't be rewritten to '0:y' since '0' may be hidden
+ n = getset(repo, fullreposet(repo), y)
+ if not n:
+ return baseset()
+ return _makerangeset(repo, subset, 0, n.last(), order)
+
def _makerangeset(repo, subset, m, n, order):
if m == n:
r = baseset([m])
@@ -2329,6 +2336,7 @@ def _hexlist(repo, subset, x, order):
methods = {
"range": rangeset,
+ "rangepre": rangepre,
"dagrange": dagrange,
"string": stringset,
"symbol": stringset,
@@ -2444,9 +2452,7 @@ def _analyze(x, order):
elif op == 'dagrangepost':
return _analyze(('func', ('symbol', 'descendants'), x[1]), order)
elif op == 'rangeall':
- return _analyze(('range', ('string', '0'), ('string', 'tip')), order)
- elif op == 'rangepre':
- return _analyze(('range', ('string', '0'), x[1]), order)
+ return _analyze(('rangepre', ('string', 'tip')), order)
elif op == 'rangepost':
return _analyze(('range', x[1], ('string', 'tip')), order)
elif op == 'negate':
@@ -2462,7 +2468,7 @@ def _analyze(x, order):
return (op, _analyze(x[1], order), order)
elif op == 'not':
return (op, _analyze(x[1], anyorder), order)
- elif op == 'parentpost':
+ elif op in ('rangepre', 'parentpost'):
return (op, _analyze(x[1], defineorder), order)
elif op == 'group':
return _analyze(x[1], order)
@@ -2567,7 +2573,7 @@ def _optimize(x, small):
o = _optimize(x[1], not small)
order = x[2]
return o[0], (op, o[1], order)
- elif op == 'parentpost':
+ elif op in ('rangepre', 'parentpost'):
o = _optimize(x[1], small)
order = x[2]
return o[0], (op, o[1], order)
diff --git a/tests/test-log.t b/tests/test-log.t
--- a/tests/test-log.t
+++ b/tests/test-log.t
@@ -1747,6 +1747,34 @@ divergent bookmarks are not hidden
1:a765632148dc55d38c35c4f247c618701886cb2f
0:9f758d63dcde62d547ebfb08e1e7ee96535f2b05
+test hidden revision 0 (issue5385)
+
+ $ hg bookmark -d X at foo
+ $ hg up null -q
+ $ hg debugobsolete 9f758d63dcde62d547ebfb08e1e7ee96535f2b05
+ $ echo f > b
+ $ hg ci -Am'b' -d '2 0'
+ adding b
+ $ echo f >> b
+ $ hg ci -m'b bis' -d '3 0'
+ $ hg log -T'{rev}:{node}\n'
+ 3:d7d28b288a6b83d5d2cf49f10c5974deed3a1d2e
+ 2:94375ec45bddd2a824535fc04855bd058c926ec0
+
+ $ hg log -T'{rev}:{node}\n' -r:
+ 2:94375ec45bddd2a824535fc04855bd058c926ec0
+ 3:d7d28b288a6b83d5d2cf49f10c5974deed3a1d2e
+ $ hg log -T'{rev}:{node}\n' -r:tip
+ 2:94375ec45bddd2a824535fc04855bd058c926ec0
+ 3:d7d28b288a6b83d5d2cf49f10c5974deed3a1d2e
+ $ hg log -T'{rev}:{node}\n' -r:0
+ abort: hidden revision '0'!
+ (use --hidden to access hidden revisions)
+ [255]
+ $ hg log -T'{rev}:{node}\n' -f
+ 3:d7d28b288a6b83d5d2cf49f10c5974deed3a1d2e
+ 2:94375ec45bddd2a824535fc04855bd058c926ec0
+
clear extensions configuration
$ echo '[extensions]' >> $HGRCPATH
$ echo "obs=!" >> $HGRCPATH
diff --git a/tests/test-revset.t b/tests/test-revset.t
--- a/tests/test-revset.t
+++ b/tests/test-revset.t
@@ -161,8 +161,7 @@ trivial
(rangeall
None)
* optimized:
- (range
- ('string', '0')
+ (rangepre
('string', 'tip')
define)
* set:
@@ -612,6 +611,63 @@ parenthesis.
8
9
+':y' behaves like '0:y', but can't be rewritten as such since the revision '0'
+may be hidden (issue5385)
+
+ $ try -p parsed -p analyzed ':'
+ * parsed:
+ (rangeall
+ None)
+ * analyzed:
+ (rangepre
+ ('string', 'tip')
+ define)
+ * set:
+ <spanset+ 0:9>
+ 0
+ 1
+ 2
+ 3
+ 4
+ 5
+ 6
+ 7
+ 8
+ 9
+ $ try -p analyzed ':1'
+ * analyzed:
+ (rangepre
+ ('symbol', '1')
+ define)
+ * set:
+ <spanset+ 0:1>
+ 0
+ 1
+ $ try -p analyzed ':(1|2)'
+ * analyzed:
+ (rangepre
+ (or
+ (list
+ ('symbol', '1')
+ ('symbol', '2'))
+ define)
+ define)
+ * set:
+ <spanset+ 0:2>
+ 0
+ 1
+ 2
+ $ try -p analyzed ':(1&2)'
+ * analyzed:
+ (rangepre
+ (and
+ ('symbol', '1')
+ ('symbol', '2')
+ define)
+ define)
+ * set:
+ <baseset []>
+
infix/suffix resolution of ^ operator (issue2884):
x^:y means (x^):y
More information about the Mercurial-devel
mailing list