887 else: |
887 else: |
888 w = 1 |
888 w = 1 |
889 return w + wa, (op, x[1], ta) |
889 return w + wa, (op, x[1], ta) |
890 return 1, x |
890 return 1, x |
891 |
891 |
|
892 class revsetalias(object): |
|
893 funcre = re.compile('^([^(]+)\(([^)]+)\)$') |
|
894 args = () |
|
895 |
|
896 def __init__(self, token, value): |
|
897 '''Aliases like: |
|
898 |
|
899 h = heads(default) |
|
900 b($1) = ancestors($1) - ancestors(default) |
|
901 ''' |
|
902 if isinstance(token, tuple): |
|
903 self.type, self.name = token |
|
904 else: |
|
905 m = self.funcre.search(token) |
|
906 if m: |
|
907 self.type = 'func' |
|
908 self.name = m.group(1) |
|
909 self.args = [x.strip() for x in m.group(2).split(',')] |
|
910 else: |
|
911 self.type = 'symbol' |
|
912 self.name = token |
|
913 |
|
914 if isinstance(value, str): |
|
915 for arg in self.args: |
|
916 value = value.replace(arg, repr(arg)) |
|
917 self.replacement, pos = parse(value) |
|
918 if pos != len(value): |
|
919 raise error.ParseError('invalid token', pos) |
|
920 else: |
|
921 self.replacement = value |
|
922 |
|
923 def match(self, tree): |
|
924 if not tree: |
|
925 return False |
|
926 if tree == (self.type, self.name): |
|
927 return True |
|
928 if tree[0] != self.type: |
|
929 return False |
|
930 if len(tree) > 1 and tree[1] != ('symbol', self.name): |
|
931 return False |
|
932 # 'func' + funcname + args |
|
933 if ((self.args and len(tree) != 3) or |
|
934 (len(self.args) == 1 and tree[2][0] == 'list') or |
|
935 (len(self.args) > 1 and (tree[2][0] != 'list' or |
|
936 len(tree[2]) - 1 != len(self.args)))): |
|
937 raise error.ParseError('invalid amount of arguments', len(tree) - 2) |
|
938 return True |
|
939 |
|
940 def replace(self, tree): |
|
941 if tree == (self.type, self.name): |
|
942 return self.replacement |
|
943 result = self.replacement |
|
944 def getsubtree(i): |
|
945 if tree[2][0] == 'list': |
|
946 return tree[2][i + 1] |
|
947 return tree[i + 2] |
|
948 for i, v in enumerate(self.args): |
|
949 valalias = revsetalias(('string', v), getsubtree(i)) |
|
950 result = valalias.process(result) |
|
951 return result |
|
952 |
|
953 def process(self, tree): |
|
954 if self.match(tree): |
|
955 return self.replace(tree) |
|
956 if isinstance(tree, tuple): |
|
957 return tuple(map(self.process, tree)) |
|
958 return tree |
|
959 |
|
960 def findaliases(ui, tree): |
|
961 for k, v in ui.configitems('revsetalias'): |
|
962 alias = revsetalias(k, v) |
|
963 tree = alias.process(tree) |
|
964 return tree |
|
965 |
892 parse = parser.parser(tokenize, elements).parse |
966 parse = parser.parser(tokenize, elements).parse |
893 |
967 |
894 def match(spec): |
968 def match(ui, spec): |
895 if not spec: |
969 if not spec: |
896 raise error.ParseError(_("empty query")) |
970 raise error.ParseError(_("empty query")) |
897 tree, pos = parse(spec) |
971 tree, pos = parse(spec) |
898 if (pos != len(spec)): |
972 if (pos != len(spec)): |
899 raise error.ParseError("invalid token", pos) |
973 raise error.ParseError("invalid token", pos) |
|
974 tree = findaliases(ui, tree) |
900 weight, tree = optimize(tree, True) |
975 weight, tree = optimize(tree, True) |
901 def mfunc(repo, subset): |
976 def mfunc(repo, subset): |
902 return getset(repo, subset, tree) |
977 return getset(repo, subset, tree) |
903 return mfunc |
978 return mfunc |
904 |
979 |