tests/test-alias.t
author Steve Losh <steve@stevelosh.com>
Tue, 24 Aug 2010 18:25:33 -0400
changeset 12536 208fc9ad6a48
parent 12327 92e30e135581
child 12656 929b424e1146
permissions -rw-r--r--
alias: only allow global options before a shell alias, pass later ones through This patch refactors the dispatch code to change how arguments to shell aliases are handled. A separate "pass" to determine whether a command is a shell alias has been added. The rough steps dispatch now performs when a command is given are these: * Parse all arguments up to the command name. * If any arguments such as --repository or --cwd are given (which could change the config file used, and therefore the definition of aliases), they are taken into account. * We determine whether the command is a shell alias. * If so, execute the alias. The --repo and --cwd arguments are still in effect. Any arguments *after* the command name are passed unchanged through to the shell command (and interpolated as normal. * If the command is *not* a shell alias, the dispatching is effectively "reset" and reparsed as normal in its entirety. The net effect of this patch is to make shell alias commands behave as you would expect. Any arguments you give to a shell alias *after* the alias name are passed through unchanged. This lets you do something like the following: [alias] filereleased = !$HG log -r 'descendants(adds("$1")) and tagged()' -l1 $2 $3 $4 $5 $ hg filereleased hgext/bookmarks.py --style compact Previously the `--style compact` part would fail because Mercurial would interpret those arguments as arguments to the alias command itself (which doesn't take any arguments). Also: running something like `hg -R ~/src/hg-crew filereleased hgext/bookmarks.py` when `filereleased` is only defined in that repo's config will now work. These global arguments can *only* be given to a shell alias *before* the alias name. For example, this will *not* work in the above situation: $ hg filereleased -R ~/src/hg-crew hgext/bookmarks.py The reason for this is that you may want to pass arguments like --repository to the alias (or, more likely, their short versions like -R): [alias] own = !chown $@ `$HG root` $ hg own steve $ hg own -R steve

  $ cat >> $HGRCPATH <<EOF
  > [alias]
  > myinit = init
  > cleanstatus = status -c
  > unknown = bargle
  > ambiguous = s
  > recursive = recursive
  > nodefinition =
  > no--cwd = status --cwd elsewhere
  > no-R = status -R elsewhere
  > no--repo = status --repo elsewhere
  > no--repository = status --repository elsewhere
  > mylog = log
  > lognull = log -r null
  > shortlog = log --template '{rev} {node|short} | {date|isodate}\n'
  > dln = lognull --debug
  > nousage = rollback
  > put = export -r 0 -o "\$FOO/%R.diff"
  > blank = !echo
  > self = !echo '\$0'
  > echo = !echo '\$@'
  > echo1 = !echo '\$1'
  > echo2 = !echo '\$2'
  > echo13 = !echo '\$1' '\$3'
  > count = !hg log -r '\$@' --template='.' | wc -c | sed -e 's/ //g'
  > mcount = !hg log \$@ --template='.' | wc -c | sed -e 's/ //g'
  > rt = root
  > 
  > [defaults]
  > mylog = -q
  > lognull = -q
  > log = -v
  > EOF


basic

  $ hg myinit alias


unknown

  $ hg unknown
  alias 'unknown' resolves to unknown command 'bargle'
  $ hg help unknown
  alias 'unknown' resolves to unknown command 'bargle'


ambiguous

  $ hg ambiguous
  alias 'ambiguous' resolves to ambiguous command 's'
  $ hg help ambiguous
  alias 'ambiguous' resolves to ambiguous command 's'


recursive

  $ hg recursive
  alias 'recursive' resolves to unknown command 'recursive'
  $ hg help recursive
  alias 'recursive' resolves to unknown command 'recursive'


no definition

  $ hg nodef
  no definition for alias 'nodefinition'
  $ hg help nodef
  no definition for alias 'nodefinition'


invalid options

  $ hg no--cwd
  error in definition for alias 'no--cwd': --cwd may only be given on the command line
  $ hg help no--cwd
  error in definition for alias 'no--cwd': --cwd may only be given on the command line
  $ hg no-R
  error in definition for alias 'no-R': -R may only be given on the command line
  $ hg help no-R
  error in definition for alias 'no-R': -R may only be given on the command line
  $ hg no--repo
  error in definition for alias 'no--repo': --repo may only be given on the command line
  $ hg help no--repo
  error in definition for alias 'no--repo': --repo may only be given on the command line
  $ hg no--repository
  error in definition for alias 'no--repository': --repository may only be given on the command line
  $ hg help no--repository
  error in definition for alias 'no--repository': --repository may only be given on the command line

  $ cd alias


no usage

  $ hg nousage
  no rollback information available

  $ echo foo > foo
  $ hg ci -Amfoo
  adding foo


with opts

  $ hg cleanst
  C foo


with opts and whitespace

  $ hg shortlog
  0 e63c23eaa88a | 1970-01-01 00:00 +0000


interaction with defaults

  $ hg mylog
  0:e63c23eaa88a
  $ hg lognull
  -1:000000000000


properly recursive

  $ hg dln
  changeset:   -1:0000000000000000000000000000000000000000
  parent:      -1:0000000000000000000000000000000000000000
  parent:      -1:0000000000000000000000000000000000000000
  manifest:    -1:0000000000000000000000000000000000000000
  user:        
  date:        Thu Jan 01 00:00:00 1970 +0000
  extra:       branch=default
  


path expanding

  $ FOO=`pwd` hg put
  $ cat 0.diff
  # HG changeset patch
  # User test
  # Date 0 0
  # Node ID e63c23eaa88ae77967edcf4ea194d31167c478b0
  # Parent  0000000000000000000000000000000000000000
  foo
  
  diff -r 000000000000 -r e63c23eaa88a foo
  --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
  +++ b/foo	Thu Jan 01 00:00:00 1970 +0000
  @@ -0,0 +1,1 @@
  +foo


simple shell aliases

  $ hg blank
  
  $ hg blank foo
  
  $ hg self
  self
  $ hg echo
  
  $ hg echo foo
  foo
  $ hg echo 'test $2' foo
  test $2 foo
  $ hg echo1 foo bar baz
  foo
  $ hg echo2 foo bar baz
  bar
  $ hg echo13 foo bar baz test
  foo baz
  $ hg echo2 foo
  
  $ echo bar > bar
  $ hg ci -qA -m bar
  $ hg count .
  1
  $ hg count 'branch(default)'
  2
  $ hg mcount -r '"branch(default)"'
  2


shell aliases with global options

  $ hg init sub
  $ cd sub
  $ hg count 'branch(default)'
  0
  $ hg -v count 'branch(default)'
  0
  $ hg -R .. count 'branch(default)'
  0
  $ hg --cwd .. count 'branch(default)'
  2
  $ hg echo --cwd ..
  --cwd ..


repo specific shell aliases

  $ cat >> .hg/hgrc <<EOF
  > [alias]
  > subalias = !echo sub \$@
  > EOF
  $ cat >> ../.hg/hgrc <<EOF
  > [alias]
  > mainalias = !echo main \$@
  > EOF


shell alias defined in current repo

  $ hg subalias
  sub
  $ hg --cwd .. subalias > /dev/null
  hg: unknown command 'subalias'
  [255]
  $ hg -R .. subalias > /dev/null
  hg: unknown command 'subalias'
  [255]


shell alias defined in other repo

  $ hg mainalias > /dev/null
  hg: unknown command 'mainalias'
  [255]
  $ hg -R .. mainalias
  main
  $ hg --cwd .. mainalias
  main


invalid arguments

  $ hg rt foo
  hg rt: invalid arguments
  hg rt 
  
  alias for: hg root
  
  print the root (top) of the current working directory
  
      Print the root directory of the current repository.
  
      Returns 0 on success.
  
  use "hg -v help rt" to show global options
  [255]