Show More
@@ -954,70 +954,46 b' def optimize(x, small):' | |||||
954 |
|
954 | |||
955 | class revsetalias(object): |
|
955 | class revsetalias(object): | |
956 | funcre = re.compile('^([^(]+)\(([^)]+)\)$') |
|
956 | funcre = re.compile('^([^(]+)\(([^)]+)\)$') | |
957 |
args = |
|
957 | args = None | |
958 |
|
958 | |||
959 |
def __init__(self, |
|
959 | def __init__(self, name, value): | |
960 | '''Aliases like: |
|
960 | '''Aliases like: | |
961 |
|
961 | |||
962 | h = heads(default) |
|
962 | h = heads(default) | |
963 | b($1) = ancestors($1) - ancestors(default) |
|
963 | b($1) = ancestors($1) - ancestors(default) | |
964 | ''' |
|
964 | ''' | |
965 |
if isinstance( |
|
965 | if isinstance(name, tuple): # parameter substitution | |
966 |
self.t |
|
966 | self.tree = name | |
967 | else: |
|
967 | self.replacement = value | |
968 | m = self.funcre.search(token) |
|
968 | else: # alias definition | |
|
969 | m = self.funcre.search(name) | |||
969 | if m: |
|
970 | if m: | |
970 |
self.t |
|
971 | self.tree = ('func', ('symbol', m.group(1))) | |
971 | self.name = m.group(1) |
|
|||
972 | self.args = [x.strip() for x in m.group(2).split(',')] |
|
972 | self.args = [x.strip() for x in m.group(2).split(',')] | |
|
973 | for arg in self.args: | |||
|
974 | value = value.replace(arg, repr(arg)) | |||
973 | else: |
|
975 | else: | |
974 |
self.t |
|
976 | self.tree = ('symbol', name) | |
975 | self.name = token |
|
|||
976 |
|
977 | |||
977 | if isinstance(value, str): |
|
|||
978 | for arg in self.args: |
|
|||
979 | value = value.replace(arg, repr(arg)) |
|
|||
980 | self.replacement, pos = parse(value) |
|
978 | self.replacement, pos = parse(value) | |
981 | if pos != len(value): |
|
979 | if pos != len(value): | |
982 | raise error.ParseError(_('invalid token'), pos) |
|
980 | raise error.ParseError(_('invalid token'), pos) | |
983 | else: |
|
|||
984 | self.replacement = value |
|
|||
985 |
|
||||
986 | def match(self, tree): |
|
|||
987 | if not tree: |
|
|||
988 | return False |
|
|||
989 | if tree == (self.type, self.name): |
|
|||
990 | return True |
|
|||
991 | if tree[0] != self.type: |
|
|||
992 | return False |
|
|||
993 | if len(tree) > 1 and tree[1] != ('symbol', self.name): |
|
|||
994 | return False |
|
|||
995 | # 'func' + funcname + args |
|
|||
996 | if ((self.args and len(tree) != 3) or |
|
|||
997 | (len(self.args) == 1 and tree[2][0] == 'list') or |
|
|||
998 | (len(self.args) > 1 and (tree[2][0] != 'list' or |
|
|||
999 | len(tree[2]) - 1 != len(self.args)))): |
|
|||
1000 | raise error.ParseError(_('invalid amount of arguments'), |
|
|||
1001 | len(tree) - 2) |
|
|||
1002 | return True |
|
|||
1003 |
|
||||
1004 | def replace(self, tree): |
|
|||
1005 | if tree == (self.type, self.name): |
|
|||
1006 | return self.replacement |
|
|||
1007 | result = self.replacement |
|
|||
1008 | def getsubtree(i): |
|
|||
1009 | if tree[2][0] == 'list': |
|
|||
1010 | return tree[2][i + 1] |
|
|||
1011 | return tree[i + 2] |
|
|||
1012 | for i, v in enumerate(self.args): |
|
|||
1013 | valalias = revsetalias(('string', v), getsubtree(i)) |
|
|||
1014 | result = valalias.process(result) |
|
|||
1015 | return result |
|
|||
1016 |
|
981 | |||
1017 | def process(self, tree): |
|
982 | def process(self, tree): | |
1018 | if self.match(tree): |
|
|||
1019 | return self.replace(tree) |
|
|||
1020 | if isinstance(tree, tuple): |
|
983 | if isinstance(tree, tuple): | |
|
984 | if self.args is None: | |||
|
985 | if tree == self.tree: | |||
|
986 | return self.replacement | |||
|
987 | elif tree[:2] == self.tree: | |||
|
988 | l = getlist(tree[2]) | |||
|
989 | if len(l) != len(self.args): | |||
|
990 | raise error.ParseError( | |||
|
991 | _('invalid number of arguments: %s') % len(l)) | |||
|
992 | result = self.replacement | |||
|
993 | for a, v in zip(self.args, l): | |||
|
994 | valalias = revsetalias(('string', a), v) | |||
|
995 | result = valalias.process(result) | |||
|
996 | return result | |||
1021 | return tuple(map(self.process, tree)) |
|
997 | return tuple(map(self.process, tree)) | |
1022 | return tree |
|
998 | return tree | |
1023 |
|
999 |
@@ -420,6 +420,7 b' aliases:' | |||||
420 | $ echo 'm = merge()' >> .hg/hgrc |
|
420 | $ echo 'm = merge()' >> .hg/hgrc | |
421 | $ echo 'd($1) = reverse(sort($1, date))' >> .hg/hgrc |
|
421 | $ echo 'd($1) = reverse(sort($1, date))' >> .hg/hgrc | |
422 | $ echo 'rs(ARG1, ARG2) = reverse(sort(ARG1, ARG2))' >> .hg/hgrc |
|
422 | $ echo 'rs(ARG1, ARG2) = reverse(sort(ARG1, ARG2))' >> .hg/hgrc | |
|
423 | $ echo 'rs4(ARG1, ARGA, ARGB, ARG2) = reverse(sort(ARG1, ARG2))' >> .hg/hgrc | |||
423 |
|
424 | |||
424 | $ try m |
|
425 | $ try m | |
425 | ('symbol', 'm') |
|
426 | ('symbol', 'm') | |
@@ -437,6 +438,23 b' aliases:' | |||||
437 | ('func', ('symbol', 'reverse'), ('func', ('symbol', 'sort'), ('list', ('or', ('symbol', '2'), ('symbol', '3')), ('symbol', 'date')))) |
|
438 | ('func', ('symbol', 'reverse'), ('func', ('symbol', 'sort'), ('list', ('or', ('symbol', '2'), ('symbol', '3')), ('symbol', 'date')))) | |
438 | 3 |
|
439 | 3 | |
439 | 2 |
|
440 | 2 | |
|
441 | $ try 'rs()' | |||
|
442 | ('func', ('symbol', 'rs'), None) | |||
|
443 | hg: parse error: invalid number of arguments: 0 | |||
|
444 | [255] | |||
|
445 | $ try 'rs(2)' | |||
|
446 | ('func', ('symbol', 'rs'), ('symbol', '2')) | |||
|
447 | hg: parse error: invalid number of arguments: 1 | |||
|
448 | [255] | |||
|
449 | $ try 'rs(2, data, 7)' | |||
|
450 | ('func', ('symbol', 'rs'), ('list', ('list', ('symbol', '2'), ('symbol', 'data')), ('symbol', '7'))) | |||
|
451 | hg: parse error: invalid number of arguments: 3 | |||
|
452 | [255] | |||
|
453 | $ try 'rs4(2 or 3, x, x, date)' | |||
|
454 | ('func', ('symbol', 'rs4'), ('list', ('list', ('list', ('or', ('symbol', '2'), ('symbol', '3')), ('symbol', 'x')), ('symbol', 'x')), ('symbol', 'date'))) | |||
|
455 | ('func', ('symbol', 'reverse'), ('func', ('symbol', 'sort'), ('list', ('or', ('symbol', '2'), ('symbol', '3')), ('symbol', 'date')))) | |||
|
456 | 3 | |||
|
457 | 2 | |||
440 |
|
458 | |||
441 | issue2549 - correct optimizations |
|
459 | issue2549 - correct optimizations | |
442 |
|
460 |
General Comments 0
You need to be logged in to leave comments.
Login now