Mercurial > public > mercurial-scm > hg
comparison mercurial/scmutil.py @ 25383:5909ac39b86a
revrange: drop unnecessary deduplication of revisions
Because "l" is a smartset, duplicated entries are omitted by addsets.
author | Yuya Nishihara <yuya@tcha.org> |
---|---|
date | Sun, 24 May 2015 17:53:22 +0900 |
parents | 755d23a49170 |
children | 99d3ca7d67e4 |
comparison
equal
deleted
inserted
replaced
25382:6084926366b9 | 25383:5909ac39b86a |
---|---|
707 def revfix(repo, val, defval): | 707 def revfix(repo, val, defval): |
708 if not val and val != 0 and defval is not None: | 708 if not val and val != 0 and defval is not None: |
709 return defval | 709 return defval |
710 return repo[val].rev() | 710 return repo[val].rev() |
711 | 711 |
712 seen, l = set(), revset.baseset([]) | 712 l = revset.baseset([]) |
713 | 713 |
714 revsetaliases = [alias for (alias, _) in | 714 revsetaliases = [alias for (alias, _) in |
715 repo.ui.configitems("revsetalias")] | 715 repo.ui.configitems("revsetalias")] |
716 | 716 |
717 for spec in revs: | 717 for spec in revs: |
718 if l and not seen: | |
719 seen = set(l) | |
720 # attempt to parse old-style ranges first to deal with | 718 # attempt to parse old-style ranges first to deal with |
721 # things like old-tag which contain query metacharacters | 719 # things like old-tag which contain query metacharacters |
722 try: | 720 try: |
723 # ... except for revset aliases without arguments. These | 721 # ... except for revset aliases without arguments. These |
724 # should be parsed as soon as possible, because they might | 722 # should be parsed as soon as possible, because they might |
725 # clash with a hash prefix. | 723 # clash with a hash prefix. |
726 if spec in revsetaliases: | 724 if spec in revsetaliases: |
727 raise error.RepoLookupError | 725 raise error.RepoLookupError |
728 | 726 |
729 if isinstance(spec, int): | 727 if isinstance(spec, int): |
730 seen.add(spec) | |
731 l = l + revset.baseset([spec]) | 728 l = l + revset.baseset([spec]) |
732 continue | 729 continue |
733 | 730 |
734 if _revrangesep in spec: | 731 if _revrangesep in spec: |
735 start, end = spec.split(_revrangesep, 1) | 732 start, end = spec.split(_revrangesep, 1) |
739 start = revfix(repo, start, 0) | 736 start = revfix(repo, start, 0) |
740 end = revfix(repo, end, len(repo) - 1) | 737 end = revfix(repo, end, len(repo) - 1) |
741 if end == nullrev and start < 0: | 738 if end == nullrev and start < 0: |
742 start = nullrev | 739 start = nullrev |
743 rangeiter = repo.changelog.revs(start, end) | 740 rangeiter = repo.changelog.revs(start, end) |
744 if not seen and not l: | 741 if not l: |
745 # by far the most common case: revs = ["-1:0"] | 742 # by far the most common case: revs = ["-1:0"] |
746 l = revset.baseset(rangeiter) | 743 l = revset.baseset(rangeiter) |
747 # defer syncing seen until next iteration | |
748 continue | 744 continue |
749 newrevs = set(rangeiter) | 745 newrevs = set(rangeiter) |
750 if seen: | |
751 newrevs.difference_update(seen) | |
752 seen.update(newrevs) | |
753 else: | |
754 seen = newrevs | |
755 l = l + revset.baseset(sorted(newrevs, reverse=start > end)) | 746 l = l + revset.baseset(sorted(newrevs, reverse=start > end)) |
756 continue | 747 continue |
757 elif spec and spec in repo: # single unquoted rev | 748 elif spec and spec in repo: # single unquoted rev |
758 rev = revfix(repo, spec, None) | 749 rev = revfix(repo, spec, None) |
759 if rev in seen: | |
760 continue | |
761 seen.add(rev) | |
762 l = l + revset.baseset([rev]) | 750 l = l + revset.baseset([rev]) |
763 continue | 751 continue |
764 except error.RepoLookupError: | 752 except error.RepoLookupError: |
765 pass | 753 pass |
766 | 754 |
767 # fall through to new-style queries if old-style fails | 755 # fall through to new-style queries if old-style fails |
768 m = revset.match(repo.ui, spec, repo) | 756 m = revset.match(repo.ui, spec, repo) |
769 if seen or l: | 757 if l: |
770 dl = [r for r in m(repo) if r not in seen] | 758 dl = [r for r in m(repo)] |
771 l = l + revset.baseset(dl) | 759 l = l + revset.baseset(dl) |
772 seen.update(dl) | |
773 else: | 760 else: |
774 l = m(repo) | 761 l = m(repo) |
775 | 762 |
776 return l | 763 return l |
777 | 764 |