equal
deleted
inserted
replaced
445 def _pairspec(revspec): |
445 def _pairspec(revspec): |
446 tree = revsetlang.parse(revspec) |
446 tree = revsetlang.parse(revspec) |
447 return tree and tree[0] in ('range', 'rangepre', 'rangepost', 'rangeall') |
447 return tree and tree[0] in ('range', 'rangepre', 'rangepost', 'rangeall') |
448 |
448 |
449 def revpairnodes(repo, revs): |
449 def revpairnodes(repo, revs): |
450 return revpair(repo, revs) |
450 ctx1, ctx2 = revpair(repo, revs) |
|
451 return ctx1.node(), ctx2.node() |
451 |
452 |
452 def revpair(repo, revs): |
453 def revpair(repo, revs): |
453 if not revs: |
454 if not revs: |
454 return repo.dirstate.p1(), None |
455 return repo['.'], repo[None] |
455 |
456 |
456 l = revrange(repo, revs) |
457 l = revrange(repo, revs) |
457 |
458 |
458 if not l: |
459 if not l: |
459 first = second = None |
460 first = second = None |
473 and not all(revrange(repo, [r]) for r in revs)): |
474 and not all(revrange(repo, [r]) for r in revs)): |
474 raise error.Abort(_('empty revision on one side of range')) |
475 raise error.Abort(_('empty revision on one side of range')) |
475 |
476 |
476 # if top-level is range expression, the result must always be a pair |
477 # if top-level is range expression, the result must always be a pair |
477 if first == second and len(revs) == 1 and not _pairspec(revs[0]): |
478 if first == second and len(revs) == 1 and not _pairspec(revs[0]): |
478 return repo.lookup(first), None |
479 return repo[first], repo[None] |
479 |
480 |
480 return repo.lookup(first), repo.lookup(second) |
481 return repo[first], repo[second] |
481 |
482 |
482 def revrange(repo, specs, localalias=None): |
483 def revrange(repo, specs, localalias=None): |
483 """Execute 1 to many revsets and return the union. |
484 """Execute 1 to many revsets and return the union. |
484 |
485 |
485 This is the preferred mechanism for executing revsets using user-specified |
486 This is the preferred mechanism for executing revsets using user-specified |