equal
deleted
inserted
replaced
688 l = revrange(repo, [revspec]) |
688 l = revrange(repo, [revspec]) |
689 if not l: |
689 if not l: |
690 raise util.Abort(_('empty revision set')) |
690 raise util.Abort(_('empty revision set')) |
691 return repo[l.last()] |
691 return repo[l.last()] |
692 |
692 |
|
693 def _pairspec(revspec): |
|
694 tree = revset.parse(revspec) |
|
695 tree = revset.optimize(tree, True)[1] # fix up "x^:y" -> "(x^):y" |
|
696 return tree and tree[0] in ('range', 'rangepre', 'rangepost', 'rangeall') |
|
697 |
693 def revpair(repo, revs): |
698 def revpair(repo, revs): |
694 if not revs: |
699 if not revs: |
695 return repo.dirstate.p1(), None |
700 return repo.dirstate.p1(), None |
696 |
701 |
697 l = revrange(repo, revs) |
702 l = revrange(repo, revs) |
709 second = l.last() |
714 second = l.last() |
710 |
715 |
711 if first is None: |
716 if first is None: |
712 raise util.Abort(_('empty revision range')) |
717 raise util.Abort(_('empty revision range')) |
713 |
718 |
714 if first == second and len(revs) == 1 and _revrangesep not in revs[0]: |
719 # if top-level is range expression, the result must always be a pair |
|
720 if first == second and len(revs) == 1 and not _pairspec(revs[0]): |
715 return repo.lookup(first), None |
721 return repo.lookup(first), None |
716 |
722 |
717 return repo.lookup(first), repo.lookup(second) |
723 return repo.lookup(first), repo.lookup(second) |
718 |
|
719 _revrangesep = ':' |
|
720 |
724 |
721 def revrange(repo, revs): |
725 def revrange(repo, revs): |
722 """Yield revision as strings from a list of revision specifications.""" |
726 """Yield revision as strings from a list of revision specifications.""" |
723 allspecs = [] |
727 allspecs = [] |
724 for spec in revs: |
728 for spec in revs: |