comparison mercurial/revset.py @ 30803:d389f19f14aa

revset: do not transform range* operators in parsed tree This allows us to handle x:y range as a general range object. A primary user of it is followlines().
author Yuya Nishihara <yuya@tcha.org>
date Mon, 09 Jan 2017 16:55:56 +0900
parents 5eb3e4568c94
children 4227f80f72b2
comparison
equal deleted inserted replaced
30802:5eb3e4568c94 30803:d389f19f14aa
378 378
379 if not m or not n: 379 if not m or not n:
380 return baseset() 380 return baseset()
381 return _makerangeset(repo, subset, m.first(), n.last(), order) 381 return _makerangeset(repo, subset, m.first(), n.last(), order)
382 382
383 def rangeall(repo, subset, x, order):
384 assert x is None
385 return _makerangeset(repo, subset, 0, len(repo) - 1, order)
386
383 def rangepre(repo, subset, y, order): 387 def rangepre(repo, subset, y, order):
384 # ':y' can't be rewritten to '0:y' since '0' may be hidden 388 # ':y' can't be rewritten to '0:y' since '0' may be hidden
385 n = getset(repo, fullreposet(repo), y) 389 n = getset(repo, fullreposet(repo), y)
386 if not n: 390 if not n:
387 return baseset() 391 return baseset()
388 return _makerangeset(repo, subset, 0, n.last(), order) 392 return _makerangeset(repo, subset, 0, n.last(), order)
393
394 def rangepost(repo, subset, x, order):
395 m = getset(repo, fullreposet(repo), x)
396 if not m:
397 return baseset()
398 return _makerangeset(repo, subset, m.first(), len(repo) - 1, order)
389 399
390 def _makerangeset(repo, subset, m, n, order): 400 def _makerangeset(repo, subset, m, n, order):
391 if m == n: 401 if m == n:
392 r = baseset([m]) 402 r = baseset([m])
393 elif n == node.wdirrev: 403 elif n == node.wdirrev:
2383 else: 2393 else:
2384 return _orderedhexlist(repo, subset, x) 2394 return _orderedhexlist(repo, subset, x)
2385 2395
2386 methods = { 2396 methods = {
2387 "range": rangeset, 2397 "range": rangeset,
2398 "rangeall": rangeall,
2388 "rangepre": rangepre, 2399 "rangepre": rangepre,
2400 "rangepost": rangepost,
2389 "dagrange": dagrange, 2401 "dagrange": dagrange,
2390 "string": stringset, 2402 "string": stringset,
2391 "symbol": stringset, 2403 "symbol": stringset,
2392 "and": andset, 2404 "and": andset,
2393 "or": orset, 2405 "or": orset,
2498 return _analyze(('func', ('symbol', 'only'), x[1]), order) 2510 return _analyze(('func', ('symbol', 'only'), x[1]), order)
2499 elif op == 'dagrangepre': 2511 elif op == 'dagrangepre':
2500 return _analyze(('func', ('symbol', 'ancestors'), x[1]), order) 2512 return _analyze(('func', ('symbol', 'ancestors'), x[1]), order)
2501 elif op == 'dagrangepost': 2513 elif op == 'dagrangepost':
2502 return _analyze(('func', ('symbol', 'descendants'), x[1]), order) 2514 return _analyze(('func', ('symbol', 'descendants'), x[1]), order)
2503 elif op == 'rangeall':
2504 return _analyze(('rangepre', ('string', 'tip')), order)
2505 elif op == 'rangepost':
2506 return _analyze(('range', x[1], ('string', 'tip')), order)
2507 elif op == 'negate': 2515 elif op == 'negate':
2508 s = getstring(x[1], _("can't negate that")) 2516 s = getstring(x[1], _("can't negate that"))
2509 return _analyze(('string', '-' + s), order) 2517 return _analyze(('string', '-' + s), order)
2510 elif op in ('string', 'symbol'): 2518 elif op in ('string', 'symbol'):
2511 return x 2519 return x
2515 return (op, ta, tb, order) 2523 return (op, ta, tb, order)
2516 elif op == 'or': 2524 elif op == 'or':
2517 return (op, _analyze(x[1], order), order) 2525 return (op, _analyze(x[1], order), order)
2518 elif op == 'not': 2526 elif op == 'not':
2519 return (op, _analyze(x[1], anyorder), order) 2527 return (op, _analyze(x[1], anyorder), order)
2520 elif op in ('rangepre', 'parentpost'): 2528 elif op == 'rangeall':
2529 return (op, None, order)
2530 elif op in ('rangepre', 'rangepost', 'parentpost'):
2521 return (op, _analyze(x[1], defineorder), order) 2531 return (op, _analyze(x[1], defineorder), order)
2522 elif op == 'group': 2532 elif op == 'group':
2523 return _analyze(x[1], order) 2533 return _analyze(x[1], order)
2524 elif op in ('dagrange', 'range', 'parent', 'ancestor'): 2534 elif op in ('dagrange', 'range', 'parent', 'ancestor'):
2525 ta = _analyze(x[1], defineorder) 2535 ta = _analyze(x[1], defineorder)
2620 return o[0], o[1] 2630 return o[0], o[1]
2621 else: 2631 else:
2622 o = _optimize(x[1], not small) 2632 o = _optimize(x[1], not small)
2623 order = x[2] 2633 order = x[2]
2624 return o[0], (op, o[1], order) 2634 return o[0], (op, o[1], order)
2625 elif op in ('rangepre', 'parentpost'): 2635 elif op == 'rangeall':
2636 return smallbonus, x
2637 elif op in ('rangepre', 'rangepost', 'parentpost'):
2626 o = _optimize(x[1], small) 2638 o = _optimize(x[1], small)
2627 order = x[2] 2639 order = x[2]
2628 return o[0], (op, o[1], order) 2640 return o[0], (op, o[1], order)
2629 elif op in ('dagrange', 'range', 'parent', 'ancestor'): 2641 elif op in ('dagrange', 'range', 'parent', 'ancestor'):
2630 wa, ta = _optimize(x[1], small) 2642 wa, ta = _optimize(x[1], small)