comparison mercurial/revset.py @ 30044:69b61d0bb008

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.
author Yuya Nishihara <yuya@tcha.org>
date Sat, 01 Oct 2016 20:20:11 +0900
parents 49d5434d68fb
children 7bf15e7eab77
comparison
equal deleted inserted replaced
30043:49d5434d68fb 30044:69b61d0bb008
366 366
367 if not m or not n: 367 if not m or not n:
368 return baseset() 368 return baseset()
369 return _makerangeset(repo, subset, m.first(), n.last(), order) 369 return _makerangeset(repo, subset, m.first(), n.last(), order)
370 370
371 def rangepre(repo, subset, y, order):
372 # ':y' can't be rewritten to '0:y' since '0' may be hidden
373 n = getset(repo, fullreposet(repo), y)
374 if not n:
375 return baseset()
376 return _makerangeset(repo, subset, 0, n.last(), order)
377
371 def _makerangeset(repo, subset, m, n, order): 378 def _makerangeset(repo, subset, m, n, order):
372 if m == n: 379 if m == n:
373 r = baseset([m]) 380 r = baseset([m])
374 elif n == node.wdirrev: 381 elif n == node.wdirrev:
375 r = spanset(repo, m, len(repo)) + baseset([n]) 382 r = spanset(repo, m, len(repo)) + baseset([n])
2327 else: 2334 else:
2328 return _orderedhexlist(repo, subset, x) 2335 return _orderedhexlist(repo, subset, x)
2329 2336
2330 methods = { 2337 methods = {
2331 "range": rangeset, 2338 "range": rangeset,
2339 "rangepre": rangepre,
2332 "dagrange": dagrange, 2340 "dagrange": dagrange,
2333 "string": stringset, 2341 "string": stringset,
2334 "symbol": stringset, 2342 "symbol": stringset,
2335 "and": andset, 2343 "and": andset,
2336 "or": orset, 2344 "or": orset,
2442 elif op == 'dagrangepre': 2450 elif op == 'dagrangepre':
2443 return _analyze(('func', ('symbol', 'ancestors'), x[1]), order) 2451 return _analyze(('func', ('symbol', 'ancestors'), x[1]), order)
2444 elif op == 'dagrangepost': 2452 elif op == 'dagrangepost':
2445 return _analyze(('func', ('symbol', 'descendants'), x[1]), order) 2453 return _analyze(('func', ('symbol', 'descendants'), x[1]), order)
2446 elif op == 'rangeall': 2454 elif op == 'rangeall':
2447 return _analyze(('range', ('string', '0'), ('string', 'tip')), order) 2455 return _analyze(('rangepre', ('string', 'tip')), order)
2448 elif op == 'rangepre':
2449 return _analyze(('range', ('string', '0'), x[1]), order)
2450 elif op == 'rangepost': 2456 elif op == 'rangepost':
2451 return _analyze(('range', x[1], ('string', 'tip')), order) 2457 return _analyze(('range', x[1], ('string', 'tip')), order)
2452 elif op == 'negate': 2458 elif op == 'negate':
2453 s = getstring(x[1], _("can't negate that")) 2459 s = getstring(x[1], _("can't negate that"))
2454 return _analyze(('string', '-' + s), order) 2460 return _analyze(('string', '-' + s), order)
2460 return (op, ta, tb, order) 2466 return (op, ta, tb, order)
2461 elif op == 'or': 2467 elif op == 'or':
2462 return (op, _analyze(x[1], order), order) 2468 return (op, _analyze(x[1], order), order)
2463 elif op == 'not': 2469 elif op == 'not':
2464 return (op, _analyze(x[1], anyorder), order) 2470 return (op, _analyze(x[1], anyorder), order)
2465 elif op == 'parentpost': 2471 elif op in ('rangepre', 'parentpost'):
2466 return (op, _analyze(x[1], defineorder), order) 2472 return (op, _analyze(x[1], defineorder), order)
2467 elif op == 'group': 2473 elif op == 'group':
2468 return _analyze(x[1], order) 2474 return _analyze(x[1], order)
2469 elif op in ('dagrange', 'range', 'parent', 'ancestor'): 2475 elif op in ('dagrange', 'range', 'parent', 'ancestor'):
2470 ta = _analyze(x[1], defineorder) 2476 ta = _analyze(x[1], defineorder)
2565 return o[0], o[1] 2571 return o[0], o[1]
2566 else: 2572 else:
2567 o = _optimize(x[1], not small) 2573 o = _optimize(x[1], not small)
2568 order = x[2] 2574 order = x[2]
2569 return o[0], (op, o[1], order) 2575 return o[0], (op, o[1], order)
2570 elif op == 'parentpost': 2576 elif op in ('rangepre', 'parentpost'):
2571 o = _optimize(x[1], small) 2577 o = _optimize(x[1], small)
2572 order = x[2] 2578 order = x[2]
2573 return o[0], (op, o[1], order) 2579 return o[0], (op, o[1], order)
2574 elif op in ('dagrange', 'range', 'parent', 'ancestor'): 2580 elif op in ('dagrange', 'range', 'parent', 'ancestor'):
2575 wa, ta = _optimize(x[1], small) 2581 wa, ta = _optimize(x[1], small)