##// END OF EJS Templates
alias: expand "$@" as list of parameters quoted individually (BC) (issue4200)...
Siddharth Agarwal -
r22158:bc2132df default
parent child Browse files
Show More
@@ -331,6 +331,27 b' def aliasargs(fn, givenargs):'
331 args = shlex.split(cmd)
331 args = shlex.split(cmd)
332 return args + givenargs
332 return args + givenargs
333
333
334 def aliasinterpolate(name, args, cmd):
335 '''interpolate args into cmd for shell aliases
336
337 This also handles $0, $@ and "$@".
338 '''
339 # util.interpolate can't deal with "$@" (with quotes) because it's only
340 # built to match prefix + patterns.
341 replacemap = dict(('$%d' % (i + 1), arg) for i, arg in enumerate(args))
342 replacemap['$0'] = name
343 replacemap['$$'] = '$'
344 replacemap['$@'] = ' '.join(args)
345 # Typical Unix shells interpolate "$@" (with quotes) as all the positional
346 # parameters, separated out into words. Emulate the same behavior here by
347 # quoting the arguments individually. POSIX shells will then typically
348 # tokenize each argument into exactly one word.
349 replacemap['"$@"'] = ' '.join(util.shellquote(arg) for arg in args)
350 # escape '\$' for regex
351 regex = '|'.join(replacemap.keys()).replace('$', r'\$')
352 r = re.compile(regex)
353 return r.sub(lambda x: replacemap[x.group()], cmd)
354
334 class cmdalias(object):
355 class cmdalias(object):
335 def __init__(self, name, definition, cmdtable):
356 def __init__(self, name, definition, cmdtable):
336 self.name = self.cmd = name
357 self.name = self.cmd = name
@@ -376,10 +397,7 b' class cmdalias(object):'
376 % (int(m.groups()[0]), self.name))
397 % (int(m.groups()[0]), self.name))
377 return ''
398 return ''
378 cmd = re.sub(r'\$(\d+|\$)', _checkvar, self.definition[1:])
399 cmd = re.sub(r'\$(\d+|\$)', _checkvar, self.definition[1:])
379 replace = dict((str(i + 1), arg) for i, arg in enumerate(args))
400 cmd = aliasinterpolate(self.name, args, cmd)
380 replace['0'] = self.name
381 replace['@'] = ' '.join(args)
382 cmd = util.interpolate(r'\$', replace, cmd, escape_prefix=True)
383 return util.system(cmd, environ=env, out=ui.fout)
401 return util.system(cmd, environ=env, out=ui.fout)
384 self.fn = fn
402 self.fn = fn
385 return
403 return
@@ -229,8 +229,9 b' repository in the same manner as the pur'
229 Positional arguments like ``$1``, ``$2``, etc. in the alias definition
229 Positional arguments like ``$1``, ``$2``, etc. in the alias definition
230 expand to the command arguments. Unmatched arguments are
230 expand to the command arguments. Unmatched arguments are
231 removed. ``$0`` expands to the alias name and ``$@`` expands to all
231 removed. ``$0`` expands to the alias name and ``$@`` expands to all
232 arguments separated by a space. These expansions happen before the
232 arguments separated by a space. ``"$@"`` (with quotes) expands to all
233 command is passed to the shell.
233 arguments quoted individually and separated by a space. These expansions
234 happen before the command is passed to the shell.
234
235
235 Shell aliases are executed in an environment where ``$HG`` expands to
236 Shell aliases are executed in an environment where ``$HG`` expands to
236 the path of the Mercurial that was used to execute the alias. This is
237 the path of the Mercurial that was used to execute the alias. This is
@@ -30,6 +30,7 b''
30 > echo1 = !printf '\$1\n'
30 > echo1 = !printf '\$1\n'
31 > echo2 = !printf '\$2\n'
31 > echo2 = !printf '\$2\n'
32 > echo13 = !printf '\$1 \$3\n'
32 > echo13 = !printf '\$1 \$3\n'
33 > echotokens = !printf "%s\n" "\$@"
33 > count = !hg log -r "\$@" --template=. | wc -c | sed -e 's/ //g'
34 > count = !hg log -r "\$@" --template=. | wc -c | sed -e 's/ //g'
34 > mcount = !hg log \$@ --template=. | wc -c | sed -e 's/ //g'
35 > mcount = !hg log \$@ --template=. | wc -c | sed -e 's/ //g'
35 > rt = root
36 > rt = root
@@ -241,6 +242,22 b' simple shell aliases'
241 foo baz
242 foo baz
242 $ hg echo2 foo
243 $ hg echo2 foo
243
244
245 $ hg echotokens
246
247 $ hg echotokens foo 'bar $1 baz'
248 foo
249 bar $1 baz
250 $ hg echotokens 'test $2' foo
251 test $2
252 foo
253 $ hg echotokens 'test $@' foo '$@'
254 test $@
255 foo
256 $@
257 $ hg echotokens 'test "$@"' foo '"$@"'
258 test "$@"
259 foo
260 "$@"
244 $ echo bar > bar
261 $ echo bar > bar
245 $ hg commit -qA -m bar
262 $ hg commit -qA -m bar
246 $ hg count .
263 $ hg count .
General Comments 0
You need to be logged in to leave comments. Login now