diff -r 49d5434d68fb -r 69b61d0bb008 mercurial/revset.py --- a/mercurial/revset.py Sat Oct 01 20:11:48 2016 +0900 +++ b/mercurial/revset.py Sat Oct 01 20:20:11 2016 +0900 @@ -368,6 +368,13 @@ 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 @@ methods = { "range": rangeset, + "rangepre": rangepre, "dagrange": dagrange, "string": stringset, "symbol": stringset, @@ -2444,9 +2452,7 @@ 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 @@ 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 @@ 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)