mercurial/revset.py
changeset 14098 9f5a0acb0056
parent 14073 72c84f24b420
child 14153 f8047a059ca0
equal deleted inserted replaced
14097:ca3376f044f8 14098:9f5a0acb0056
   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