4 # |
4 # |
5 # This software may be used and distributed according to the terms of the |
5 # This software may be used and distributed according to the terms of the |
6 # GNU General Public License version 2 or any later version. |
6 # GNU General Public License version 2 or any later version. |
7 |
7 |
8 from i18n import _ |
8 from i18n import _ |
9 from mercurial.node import nullrev, wdirrev |
9 from mercurial.node import wdirrev |
10 import util, error, osutil, revset, similar, encoding, phases |
10 import util, error, osutil, revset, similar, encoding, phases |
11 import pathutil |
11 import pathutil |
12 import match as matchmod |
12 import match as matchmod |
13 import os, errno, re, glob, tempfile, shutil, stat |
13 import os, errno, re, glob, tempfile, shutil, stat |
14 |
14 |
718 |
718 |
719 _revrangesep = ':' |
719 _revrangesep = ':' |
720 |
720 |
721 def revrange(repo, revs): |
721 def revrange(repo, revs): |
722 """Yield revision as strings from a list of revision specifications.""" |
722 """Yield revision as strings from a list of revision specifications.""" |
723 |
|
724 def revfix(repo, val, defval): |
|
725 if not val and val != 0 and defval is not None: |
|
726 return defval |
|
727 return repo[val].rev() |
|
728 |
|
729 subsets = [] |
723 subsets = [] |
730 |
|
731 revsetaliases = [alias for (alias, _) in |
|
732 repo.ui.configitems("revsetalias")] |
|
733 |
|
734 for spec in revs: |
724 for spec in revs: |
735 # attempt to parse old-style ranges first to deal with |
725 if isinstance(spec, int): |
736 # things like old-tag which contain query metacharacters |
726 spec = revset.formatspec('rev(%d)', spec) |
737 try: |
|
738 # ... except for revset aliases without arguments. These |
|
739 # should be parsed as soon as possible, because they might |
|
740 # clash with a hash prefix. |
|
741 if spec in revsetaliases: |
|
742 raise error.RepoLookupError |
|
743 |
|
744 if isinstance(spec, int): |
|
745 subsets.append(revset.baseset([spec])) |
|
746 continue |
|
747 |
|
748 if _revrangesep in spec: |
|
749 start, end = spec.split(_revrangesep, 1) |
|
750 if start in revsetaliases or end in revsetaliases: |
|
751 raise error.RepoLookupError |
|
752 |
|
753 start = revfix(repo, start, 0) |
|
754 end = revfix(repo, end, len(repo) - 1) |
|
755 if end == nullrev and start < 0: |
|
756 start = nullrev |
|
757 if start < end: |
|
758 l = revset.spanset(repo, start, end + 1) |
|
759 else: |
|
760 l = revset.spanset(repo, start, end - 1) |
|
761 subsets.append(l) |
|
762 continue |
|
763 elif spec and spec in repo: # single unquoted rev |
|
764 rev = revfix(repo, spec, None) |
|
765 subsets.append(revset.baseset([rev])) |
|
766 continue |
|
767 except error.RepoLookupError: |
|
768 pass |
|
769 |
|
770 # fall through to new-style queries if old-style fails |
|
771 m = revset.match(repo.ui, spec, repo) |
727 m = revset.match(repo.ui, spec, repo) |
772 subsets.append(m(repo)) |
728 subsets.append(m(repo)) |
773 |
729 |
774 return revset._combinesets(subsets) |
730 return revset._combinesets(subsets) |
775 |
731 |