mercurial/revset.py
changeset 30044 69b61d0bb008
parent 30043 49d5434d68fb
child 30055 7bf15e7eab77
--- 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)