comparison mercurial/fileset.py @ 14676:e80fa502b8cf

fileset: add some basic predicates
author Matt Mackall <mpm@selenic.com>
date Sat, 18 Jun 2011 16:53:49 -0500
parents b0566467c492
children 2a758ffc821e
comparison
equal deleted inserted replaced
14675:cfc89398f710 14676:e80fa502b8cf
3 # Copyright 2010 Matt Mackall <mpm@selenic.com> 3 # Copyright 2010 Matt Mackall <mpm@selenic.com>
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 import parser, error 8 import parser, error, util
9 from i18n import _ 9 from i18n import _
10 10
11 elements = { 11 elements = {
12 "(": (20, ("group", 1, ")"), ("func", 1, ")")), 12 "(": (20, ("group", 1, ")"), ("func", 1, ")")),
13 "-": (5, ("negate", 19), ("minus", 5)), 13 "-": (5, ("negate", 19), ("minus", 5)),
108 return [r for r in mctx.subset if r not in s] 108 return [r for r in mctx.subset if r not in s]
109 109
110 def listset(mctx, a, b): 110 def listset(mctx, a, b):
111 raise error.ParseError(_("can't use a list in this context")) 111 raise error.ParseError(_("can't use a list in this context"))
112 112
113 def func(mctx, a, b):
114 if a[0] == 'symbol' and a[1] in symbols:
115 return symbols[a[1]](mctx, b)
116 raise error.ParseError(_("not a function: %s") % a[1])
117
118 def getlist(x):
119 if not x:
120 return []
121 if x[0] == 'list':
122 return getlist(x[1]) + [x[2]]
123 return [x]
124
125 def getargs(x, min, max, err):
126 l = getlist(x)
127 if len(l) < min or len(l) > max:
128 raise error.ParseError(err)
129 return l
130
131 def binary(mctx, x):
132 getargs(x, 0, 0, _("binary takes no arguments"))
133 return [f for f in mctx.subset if util.binary(mctx.ctx[f].data())]
134
135 def exec_(mctx, x):
136 getargs(x, 0, 0, _("exec takes no arguments"))
137 return [f for f in mctx.subset if mctx.ctx.flags(f) == 'x']
138
139 def symlink(mctx, x):
140 getargs(x, 0, 0, _("symlink takes no arguments"))
141 return [f for f in mctx.subset if mctx.ctx.flags(f) == 'l']
142
143 symbols = {
144 'binary': binary,
145 'exec': exec_,
146 'symlink': symlink,
147 }
148
113 methods = { 149 methods = {
114 'string': stringset, 150 'string': stringset,
115 'symbol': stringset, 151 'symbol': stringset,
116 'and': andset, 152 'and': andset,
117 'or': orset, 153 'or': orset,
118 'list': listset, 154 'list': listset,
119 'group': getset, 155 'group': getset,
120 'not': notset 156 'not': notset,
157 'func': func,
121 } 158 }
122 159
123 class matchctx(object): 160 class matchctx(object):
124 def __init__(self, ctx, subset=None): 161 def __init__(self, ctx, subset=None):
125 self.ctx = ctx 162 self.ctx = ctx