Mercurial > public > mercurial-scm > hg-stable
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) |