contrib/zsh/_hg
changeset 10005 68964567e406
parent 9923 c0b79fdfd214
equal deleted inserted replaced
10004:af04a3dea4cd 10005:68964567e406
       
     1 #compdef hg
       
     2 
       
     3 # Zsh completion script for mercurial.  Rename this file to _hg and copy
       
     4 # it into your zsh function path (/usr/share/zsh/site-functions for
       
     5 # instance)
       
     6 #
       
     7 # If you do not want to install it globally, you can copy it somewhere
       
     8 # else and add that directory to $fpath. This must be done before
       
     9 # compinit is called. If the file is copied to ~/.zsh.d, your ~/.zshrc
       
    10 # file could look like this:
       
    11 #
       
    12 # fpath=("$HOME/.zsh.d" $fpath)
       
    13 # autoload -U compinit
       
    14 # compinit
       
    15 #
       
    16 # Copyright (C) 2005, 2006 Steve Borho <steve@borho.org>
       
    17 # Copyright (C) 2006-9 Brendan Cully <brendan@kublai.com>
       
    18 #
       
    19 # Permission is hereby granted, without written agreement and without
       
    20 # licence or royalty fees, to use, copy, modify, and distribute this
       
    21 # software and to distribute modified versions of this software for any
       
    22 # purpose, provided that the above copyright notice and the following
       
    23 # two paragraphs appear in all copies of this software.
       
    24 #
       
    25 # In no event shall the authors be liable to any party for direct,
       
    26 # indirect, special, incidental, or consequential damages arising out of
       
    27 # the use of this software and its documentation, even if the authors
       
    28 # have been advised of the possibility of such damage.
       
    29 #
       
    30 # The authors specifically disclaim any warranties, including, but not
       
    31 # limited to, the implied warranties of merchantability and fitness for
       
    32 # a particular purpose.  The software provided hereunder is on an "as
       
    33 # is" basis, and the authors have no obligation to provide maintenance,
       
    34 # support, updates, enhancements, or modifications.
       
    35 
       
    36 emulate -LR zsh
       
    37 setopt extendedglob
       
    38 
       
    39 local curcontext="$curcontext" state line
       
    40 typeset -A _hg_cmd_globals
       
    41 
       
    42 _hg() {
       
    43   local cmd _hg_root
       
    44   integer i=2
       
    45   _hg_cmd_globals=()
       
    46 
       
    47   while (( i < $#words ))
       
    48   do
       
    49     case "$words[$i]" in
       
    50       -R|--repository)
       
    51         eval _hg_root="$words[$i+1]"
       
    52         _hg_cmd_globals+=("$words[$i]" "$_hg_root")
       
    53         (( i += 2 ))
       
    54         continue
       
    55       ;;
       
    56       -R*)
       
    57         _hg_cmd_globals+="$words[$i]"
       
    58         eval _hg_root="${words[$i]#-R}"
       
    59        (( i++ ))
       
    60        continue
       
    61       ;;
       
    62       --cwd|--config)
       
    63         # pass along arguments to hg completer
       
    64         _hg_cmd_globals+=("$words[$i]" "$words[$i+1]")
       
    65         (( i += 2 ))
       
    66         continue
       
    67       ;;
       
    68       -*)
       
    69         # skip option
       
    70         (( i++ ))
       
    71         continue
       
    72       ;;
       
    73     esac
       
    74     if [[ -z "$cmd" ]]
       
    75     then
       
    76       cmd="$words[$i]"
       
    77       words[$i]=()
       
    78       (( CURRENT-- ))
       
    79     fi
       
    80     (( i++ ))
       
    81   done
       
    82 
       
    83   if [[ -z "$cmd" ]]
       
    84   then
       
    85     _arguments -s -w : $_hg_global_opts \
       
    86     ':mercurial command:_hg_commands'
       
    87     return
       
    88   fi
       
    89 
       
    90   # resolve abbreviations and aliases
       
    91   if ! (( $+functions[_hg_cmd_${cmd}] ))
       
    92   then
       
    93     local cmdexp
       
    94     (( $#_hg_cmd_list )) || _hg_get_commands
       
    95 
       
    96     cmdexp=$_hg_cmd_list[(r)${cmd}*]
       
    97     if [[ $cmdexp == $_hg_cmd_list[(R)${cmd}*] ]]
       
    98     then
       
    99       # might be nice to rewrite the command line with the expansion
       
   100       cmd="$cmdexp"
       
   101     fi
       
   102     if [[ -n $_hg_alias_list[$cmd] ]]
       
   103     then
       
   104       cmd=$_hg_alias_list[$cmd]
       
   105     fi
       
   106   fi
       
   107 
       
   108   curcontext="${curcontext%:*:*}:hg-${cmd}:"
       
   109 
       
   110   zstyle -s ":completion:$curcontext:" cache-policy update_policy
       
   111 
       
   112   if [[ -z "$update_policy" ]]
       
   113   then
       
   114     zstyle ":completion:$curcontext:" cache-policy _hg_cache_policy
       
   115   fi
       
   116 
       
   117   if (( $+functions[_hg_cmd_${cmd}] ))
       
   118   then
       
   119     _hg_cmd_${cmd}
       
   120   else
       
   121     # complete unknown commands normally
       
   122     _arguments -s -w : $_hg_global_opts \
       
   123       '*:files:_hg_files'
       
   124   fi
       
   125 }
       
   126 
       
   127 _hg_cache_policy() {
       
   128   typeset -a old
       
   129 
       
   130   # cache for a minute
       
   131   old=( "$1"(mm+10) )
       
   132   (( $#old )) && return 0
       
   133 
       
   134   return 1
       
   135 }
       
   136 
       
   137 _hg_get_commands() {
       
   138   typeset -ga _hg_cmd_list
       
   139   typeset -gA _hg_alias_list
       
   140   local hline cmd cmdalias
       
   141 
       
   142   _call_program hg hg debugcomplete -v | while read -A hline
       
   143   do
       
   144     cmd=$hline[1]
       
   145     _hg_cmd_list+=($cmd)
       
   146 
       
   147     for cmdalias in $hline[2,-1]
       
   148     do
       
   149       _hg_cmd_list+=($cmdalias)
       
   150       _hg_alias_list+=($cmdalias $cmd)
       
   151     done
       
   152   done
       
   153 }
       
   154 
       
   155 _hg_commands() {
       
   156   (( $#_hg_cmd_list )) || _hg_get_commands
       
   157   _describe -t commands 'mercurial command' _hg_cmd_list
       
   158 }
       
   159 
       
   160 _hg_revrange() {
       
   161   compset -P 1 '*:'
       
   162   _hg_tags "$@"
       
   163 }
       
   164 
       
   165 _hg_tags() {
       
   166   typeset -a tags
       
   167   local tag rev
       
   168 
       
   169   _hg_cmd tags | while read tag
       
   170   do
       
   171     tags+=(${tag/ #    [0-9]#:*})
       
   172   done
       
   173   (( $#tags )) && _describe -t tags 'tags' tags
       
   174 }
       
   175 
       
   176 # likely merge candidates
       
   177 _hg_mergerevs() {
       
   178   typeset -a heads
       
   179   local myrev
       
   180 
       
   181   heads=(${(f)"$(_hg_cmd heads --template '{rev}\\n')"})
       
   182   # exclude own revision
       
   183   myrev=$(_hg_cmd log -r . --template '{rev}\\n')
       
   184   heads=(${heads:#$myrev})
       
   185 
       
   186   (( $#heads )) && _describe -t heads 'heads' heads
       
   187 }
       
   188 
       
   189 _hg_files() {
       
   190   if [[ -n "$_hg_root" ]]
       
   191   then
       
   192     [[ -d "$_hg_root/.hg" ]] || return
       
   193     case "$_hg_root" in
       
   194       /*)
       
   195         _files -W $_hg_root
       
   196       ;;
       
   197       *)
       
   198         _files -W $PWD/$_hg_root
       
   199       ;;
       
   200     esac
       
   201   else
       
   202     _files
       
   203   fi
       
   204 }
       
   205 
       
   206 _hg_status() {
       
   207   [[ -d $PREFIX ]] || PREFIX=$PREFIX:h
       
   208   status_files=(${(ps:\0:)"$(_hg_cmd status -0n$1 ./$PREFIX)"})
       
   209 }
       
   210 
       
   211 _hg_unknown() {
       
   212   typeset -a status_files
       
   213   _hg_status u
       
   214   _wanted files expl 'unknown files' _multi_parts / status_files
       
   215 }
       
   216 
       
   217 _hg_missing() {
       
   218   typeset -a status_files
       
   219   _hg_status d
       
   220   _wanted files expl 'missing files' _multi_parts / status_files
       
   221 }
       
   222 
       
   223 _hg_modified() {
       
   224   typeset -a status_files
       
   225   _hg_status m
       
   226   _wanted files expl 'modified files' _multi_parts / status_files
       
   227 }
       
   228 
       
   229 _hg_resolve() {
       
   230   local rstate rpath
       
   231 
       
   232   [[ -d $PREFIX ]] || PREFIX=$PREFIX:h
       
   233 
       
   234   _hg_cmd resolve -l ./$PREFIX | while read rstate rpath
       
   235   do
       
   236     [[ $rstate == 'R' ]] && resolved_files+=($rpath)
       
   237     [[ $rstate == 'U' ]] && unresolved_files+=($rpath)
       
   238   done
       
   239 }
       
   240 
       
   241 _hg_resolved() {
       
   242   typeset -a resolved_files unresolved_files
       
   243   _hg_resolve
       
   244   _wanted files expl 'resolved files' _multi_parts / resolved_files
       
   245 }
       
   246 
       
   247 _hg_unresolved() {
       
   248   typeset -a resolved_files unresolved_files
       
   249   _hg_resolve
       
   250   _wanted files expl 'unresolved files' _multi_parts / unresolved_files
       
   251 }
       
   252 
       
   253 _hg_config() {
       
   254     typeset -a items
       
   255     items=(${${(%f)"$(_call_program hg hg showconfig)"}%%\=*})
       
   256     (( $#items )) && _describe -t config 'config item' items
       
   257 }
       
   258 
       
   259 _hg_addremove() {
       
   260   _alternative 'files:unknown files:_hg_unknown' \
       
   261     'files:missing files:_hg_missing'
       
   262 }
       
   263 
       
   264 _hg_ssh_urls() {
       
   265   if [[ -prefix */ ]]
       
   266   then
       
   267     if zstyle -T ":completion:${curcontext}:files" remote-access
       
   268     then
       
   269       local host=${PREFIX%%/*}
       
   270       typeset -a remdirs
       
   271       compset -p $(( $#host + 1 ))
       
   272       local rempath=${(M)PREFIX##*/}
       
   273       local cacheid="hg:${host}-${rempath//\//_}"
       
   274       cacheid=${cacheid%[-_]}
       
   275       compset -P '*/'
       
   276       if _cache_invalid "$cacheid" || ! _retrieve_cache "$cacheid"
       
   277       then
       
   278         remdirs=(${${(M)${(f)"$(_call_program files ssh -a -x $host ls -1FL "${(q)rempath}")"}##*/}%/})
       
   279         _store_cache "$cacheid" remdirs
       
   280       fi
       
   281       _describe -t directories 'remote directory' remdirs -S/
       
   282     else
       
   283       _message 'remote directory'
       
   284     fi
       
   285   else
       
   286     if compset -P '*@'
       
   287     then
       
   288       _hosts -S/
       
   289     else
       
   290       _alternative 'hosts:remote host name:_hosts -S/' \
       
   291         'users:user:_users -S@'
       
   292     fi
       
   293   fi
       
   294 }
       
   295 
       
   296 _hg_urls() {
       
   297   if compset -P bundle://
       
   298   then
       
   299     _files
       
   300   elif compset -P ssh://
       
   301   then
       
   302     _hg_ssh_urls
       
   303   elif [[ -prefix *: ]]
       
   304   then
       
   305     _urls
       
   306   else
       
   307     local expl
       
   308     compset -S '[^:]*'
       
   309     _wanted url-schemas expl 'URL schema' compadd -S '' - \
       
   310       http:// https:// ssh:// bundle://
       
   311   fi
       
   312 }
       
   313 
       
   314 _hg_paths() {
       
   315   typeset -a paths pnames
       
   316   _hg_cmd paths | while read -A pnames
       
   317   do
       
   318     paths+=($pnames[1])
       
   319   done
       
   320   (( $#paths )) && _describe -t path-aliases 'repository alias' paths
       
   321 }
       
   322 
       
   323 _hg_remote() {
       
   324   _alternative 'path-aliases:repository alias:_hg_paths' \
       
   325     'directories:directory:_files -/' \
       
   326     'urls:URL:_hg_urls'
       
   327 }
       
   328 
       
   329 _hg_clone_dest() {
       
   330   _alternative 'directories:directory:_files -/' \
       
   331     'urls:URL:_hg_urls'
       
   332 }
       
   333 
       
   334 # Common options
       
   335 _hg_global_opts=(
       
   336     '(--repository -R)'{-R+,--repository}'[repository root directory]:repository:_files -/'
       
   337     '--cwd[change working directory]:new working directory:_files -/'
       
   338     '(--noninteractive -y)'{-y,--noninteractive}'[do not prompt, assume yes for any required answers]'
       
   339     '(--verbose -v)'{-v,--verbose}'[enable additional output]'
       
   340     '*--config[set/override config option]:defined config items:_hg_config'
       
   341     '(--quiet -q)'{-q,--quiet}'[suppress output]'
       
   342     '(--help -h)'{-h,--help}'[display help and exit]'
       
   343     '--debug[debug mode]'
       
   344     '--debugger[start debugger]'
       
   345     '--encoding[set the charset encoding (default: UTF8)]'
       
   346     '--encodingmode[set the charset encoding mode (default: strict)]'
       
   347     '--lsprof[print improved command execution profile]'
       
   348     '--traceback[print traceback on exception]'
       
   349     '--time[time how long the command takes]'
       
   350     '--profile[profile]'
       
   351     '--version[output version information and exit]'
       
   352 )
       
   353 
       
   354 _hg_pat_opts=(
       
   355   '*'{-I+,--include}'[include names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/'
       
   356   '*'{-X+,--exclude}'[exclude names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/')
       
   357 
       
   358 _hg_diff_opts=(
       
   359   '(--text -a)'{-a,--text}'[treat all files as text]'
       
   360   '(--git -g)'{-g,--git}'[use git extended diff format]'
       
   361   "--nodates[don't include dates in diff headers]")
       
   362 
       
   363 _hg_dryrun_opts=(
       
   364   '(--dry-run -n)'{-n,--dry-run}'[do not perform actions, just print output]')
       
   365 
       
   366 _hg_style_opts=(
       
   367   '--style[display using template map file]:'
       
   368   '--template[display with template]:')
       
   369 
       
   370 _hg_commit_opts=(
       
   371   '(-m --message -l --logfile --edit -e)'{-e,--edit}'[edit commit message]'
       
   372   '(-e --edit -l --logfile --message -m)'{-m+,--message}'[use <text> as commit message]:message:'
       
   373   '(-e --edit -m --message --logfile -l)'{-l+,--logfile}'[read the commit message from <file>]:log file:_files')
       
   374 
       
   375 _hg_remote_opts=(
       
   376   '(--ssh -e)'{-e+,--ssh}'[specify ssh command to use]:'
       
   377   '--remotecmd[specify hg command to run on the remote side]:')
       
   378 
       
   379 _hg_cmd() {
       
   380   _call_program hg hg --config ui.verbose=0 --config defaults."$1"= \
       
   381     "$_hg_cmd_globals[@]" "$@" 2> /dev/null
       
   382 }
       
   383 
       
   384 _hg_cmd_add() {
       
   385   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
       
   386   '*:unknown files:_hg_unknown'
       
   387 }
       
   388 
       
   389 _hg_cmd_addremove() {
       
   390   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
       
   391   '(--similarity -s)'{-s+,--similarity}'[guess renamed files by similarity (0<=s<=100)]:' \
       
   392   '*:unknown or missing files:_hg_addremove'
       
   393 }
       
   394 
       
   395 _hg_cmd_annotate() {
       
   396   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
       
   397   '(--rev -r)'{-r+,--rev}'[annotate the specified revision]:revision:_hg_tags' \
       
   398   '(--follow -f)'{-f,--follow}'[follow file copies and renames]' \
       
   399   '(--text -a)'{-a,--text}'[treat all files as text]' \
       
   400   '(--user -u)'{-u,--user}'[list the author]' \
       
   401   '(--date -d)'{-d,--date}'[list the date]' \
       
   402   '(--number -n)'{-n,--number}'[list the revision number (default)]' \
       
   403   '(--changeset -c)'{-c,--changeset}'[list the changeset]' \
       
   404   '*:files:_hg_files'
       
   405 }
       
   406 
       
   407 _hg_cmd_archive() {
       
   408   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
       
   409   '--no-decode[do not pass files through decoders]' \
       
   410   '(--prefix -p)'{-p+,--prefix}'[directory prefix for files in archive]:' \
       
   411   '(--rev -r)'{-r+,--rev}'[revision to distribute]:revision:_hg_tags' \
       
   412   '(--type -t)'{-t+,--type}'[type of distribution to create]:archive type:(files tar tbz2 tgz uzip zip)' \
       
   413   '*:destination:_files'
       
   414 }
       
   415 
       
   416 _hg_cmd_backout() {
       
   417   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
       
   418     '--merge[merge with old dirstate parent after backout]' \
       
   419     '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
       
   420     '--parent[parent to choose when backing out merge]' \
       
   421     '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
       
   422     '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
       
   423     '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
       
   424     '(--logfile -l)'{-l+,--logfile}'[read commit message from <file>]:log file:_files -g \*.txt'
       
   425 }
       
   426 
       
   427 _hg_cmd_bisect() {
       
   428   _arguments -s -w : $_hg_global_opts \
       
   429   '(-)'{-r,--reset}'[reset bisect state]' \
       
   430   '(--good -g --bad -b --skip -s --reset -r)'{-g,--good}'[mark changeset good]'::revision:_hg_tags \
       
   431   '(--good -g --bad -b --skip -s --reset -r)'{-b,--bad}'[mark changeset bad]'::revision:_hg_tags \
       
   432   '(--good -g --bad -b --skip -s --reset -r)'{-s,--skip}'[skip testing changeset]' \
       
   433   '(--command -c --noupdate -U)'{-c+,--command}'[use command to check changeset state]':commands:_command_names \
       
   434   '(--command -c --noupdate -U)'{-U,--noupdate}'[do not update to target]'
       
   435 }
       
   436 
       
   437 _hg_cmd_branch() {
       
   438   _arguments -s -w : $_hg_global_opts \
       
   439   '(--force -f)'{-f,--force}'[set branch name even if it shadows an existing branch]' \
       
   440   '(--clean -C)'{-C,--clean}'[reset branch name to parent branch name]'
       
   441 }
       
   442 
       
   443 _hg_cmd_branches() {
       
   444   _arguments -s -w : $_hg_global_opts \
       
   445   '(--active -a)'{-a,--active}'[show only branches that have unmerge heads]'
       
   446 }
       
   447 
       
   448 _hg_cmd_bundle() {
       
   449   _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
       
   450   '(--force -f)'{-f,--force}'[run even when remote repository is unrelated]' \
       
   451   '(2)*--base[a base changeset to specify instead of a destination]:revision:_hg_tags' \
       
   452   ':output file:_files' \
       
   453   ':destination repository:_files -/'
       
   454 }
       
   455 
       
   456 _hg_cmd_cat() {
       
   457   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
       
   458   '(--output -o)'{-o+,--output}'[print output to file with formatted name]:filespec:' \
       
   459   '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
       
   460   '*:file:_hg_files'
       
   461 }
       
   462 
       
   463 _hg_cmd_clone() {
       
   464   _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
       
   465   '(--noupdate -U)'{-U,--noupdate}'[do not update the new working directory]' \
       
   466   '(--rev -r)'{-r+,--rev}'[a changeset you would like to have after cloning]:' \
       
   467   '--uncompressed[use uncompressed transfer (fast over LAN)]' \
       
   468   ':source repository:_hg_remote' \
       
   469   ':destination:_hg_clone_dest'
       
   470 }
       
   471 
       
   472 _hg_cmd_commit() {
       
   473   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
       
   474   '(--addremove -A)'{-A,--addremove}'[mark new/missing files as added/removed before committing]' \
       
   475   '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
       
   476   '(--logfile -l)'{-l+,--logfile}'[read commit message from <file>]:log file:_files -g \*.txt' \
       
   477   '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
       
   478   '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
       
   479   '*:file:_hg_files'
       
   480 }
       
   481 
       
   482 _hg_cmd_copy() {
       
   483   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
       
   484   '(--after -A)'{-A,--after}'[record a copy that has already occurred]' \
       
   485   '(--force -f)'{-f,--force}'[forcibly copy over an existing managed file]' \
       
   486   '*:file:_hg_files'
       
   487 }
       
   488 
       
   489 _hg_cmd_diff() {
       
   490   typeset -A opt_args
       
   491   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_diff_opts \
       
   492   '*'{-r,--rev}'+[revision]:revision:_hg_revrange' \
       
   493   '(--show-function -p)'{-p,--show-function}'[show which function each change is in]' \
       
   494   '(--ignore-all-space -w)'{-w,--ignore-all-space}'[ignore white space when comparing lines]' \
       
   495   '(--ignore-space-change -b)'{-b,--ignore-space-change}'[ignore changes in the amount of white space]' \
       
   496   '(--ignore-blank-lines -B)'{-B,--ignore-blank-lines}'[ignore changes whose lines are all blank]' \
       
   497   '*:file:->diff_files'
       
   498 
       
   499   if [[ $state == 'diff_files' ]]
       
   500   then
       
   501     if [[ -n $opt_args[-r] ]]
       
   502     then
       
   503       _hg_files
       
   504     else
       
   505       _hg_modified
       
   506     fi
       
   507   fi
       
   508 }
       
   509 
       
   510 _hg_cmd_export() {
       
   511   _arguments -s -w : $_hg_global_opts $_hg_diff_opts \
       
   512   '(--outout -o)'{-o+,--output}'[print output to file with formatted name]:filespec:' \
       
   513   '--switch-parent[diff against the second parent]' \
       
   514   '*:revision:_hg_tags'
       
   515 }
       
   516 
       
   517 _hg_cmd_grep() {
       
   518   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
       
   519   '(--print0 -0)'{-0,--print0}'[end filenames with NUL]' \
       
   520   '--all[print all revisions with matches]' \
       
   521   '(--follow -f)'{-f,--follow}'[follow changeset or file history]' \
       
   522   '(--ignore-case -i)'{-i,--ignore-case}'[ignore case when matching]' \
       
   523   '(--files-with-matches -l)'{-l,--files-with-matches}'[print only filenames and revs that match]' \
       
   524   '(--line-number -n)'{-n,--line-number}'[print matching line numbers]' \
       
   525   '*'{-r+,--rev}'[search in given revision range]:revision:_hg_revrange' \
       
   526   '(--user -u)'{-u,--user}'[print user who committed change]' \
       
   527   '1:search pattern:' \
       
   528   '*:files:_hg_files'
       
   529 }
       
   530 
       
   531 _hg_cmd_heads() {
       
   532   _arguments -s -w : $_hg_global_opts $_hg_style_opts \
       
   533   '(--rev -r)'{-r+,--rev}'[show only heads which are descendants of rev]:revision:_hg_tags'
       
   534 }
       
   535 
       
   536 _hg_cmd_help() {
       
   537   _arguments -s -w : $_hg_global_opts \
       
   538   '*:mercurial command:_hg_commands'
       
   539 }
       
   540 
       
   541 _hg_cmd_identify() {
       
   542   _arguments -s -w : $_hg_global_opts \
       
   543   '(--rev -r)'{-r+,--rev}'[identify the specified rev]:revision:_hg_tags' \
       
   544   '(--num -n)'{-n+,--num}'[show local revision number]' \
       
   545   '(--id -i)'{-i+,--id}'[show global revision id]' \
       
   546   '(--branch -b)'{-b+,--branch}'[show branch]' \
       
   547   '(--tags -t)'{-t+,--tags}'[show tags]'
       
   548 }
       
   549 
       
   550 _hg_cmd_import() {
       
   551   _arguments -s -w : $_hg_global_opts \
       
   552   '(--strip -p)'{-p+,--strip}'[directory strip option for patch (default: 1)]:count:' \
       
   553   '(--message -m)'{-m+,--message}'[use <text> as commit message]:text:' \
       
   554   '(--force -f)'{-f,--force}'[skip check for outstanding uncommitted changes]' \
       
   555   '*:patch:_files'
       
   556 }
       
   557 
       
   558 _hg_cmd_incoming() {
       
   559   _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_style_opts \
       
   560   '(--no-merges -M)'{-M,--no-merges}'[do not show merge revisions]' \
       
   561   '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
       
   562   '(--patch -p)'{-p,--patch}'[show patch]' \
       
   563   '(--rev -r)'{-r+,--rev}'[a specific revision up to which you would like to pull]:revision:_hg_tags' \
       
   564   '(--newest-first -n)'{-n,--newest-first}'[show newest record first]' \
       
   565   '--bundle[file to store the bundles into]:bundle file:_files' \
       
   566   ':source:_hg_remote'
       
   567 }
       
   568 
       
   569 _hg_cmd_init() {
       
   570   _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
       
   571   ':dir:_files -/'
       
   572 }
       
   573 
       
   574 _hg_cmd_locate() {
       
   575   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
       
   576   '(--rev -r)'{-r+,--rev}'[search repository as it stood at revision]:revision:_hg_tags' \
       
   577   '(--print0 -0)'{-0,--print0}'[end filenames with NUL, for use with xargs]' \
       
   578   '(--fullpath -f)'{-f,--fullpath}'[print complete paths]' \
       
   579   '*:search pattern:_hg_files'
       
   580 }
       
   581 
       
   582 _hg_cmd_log() {
       
   583   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_style_opts \
       
   584   '(--follow --follow-first -f)'{-f,--follow}'[follow changeset or history]' \
       
   585   '(-f --follow)--follow-first[only follow the first parent of merge changesets]' \
       
   586   '(--copies -C)'{-C,--copies}'[show copied files]' \
       
   587   '(--keyword -k)'{-k+,--keyword}'[search for a keyword]:' \
       
   588   '(--limit -l)'{-l+,--limit}'[limit number of changes displayed]:' \
       
   589   '*'{-r,--rev}'[show the specified revision or range]:revision:_hg_revrange' \
       
   590   '(--no-merges -M)'{-M,--no-merges}'[do not show merges]' \
       
   591   '(--only-merges -m)'{-m,--only-merges}'[show only merges]' \
       
   592   '(--patch -p)'{-p,--patch}'[show patch]' \
       
   593   '(--prune -P)'{-P+,--prune}'[do not display revision or any of its ancestors]:revision:_hg_tags' \
       
   594   '*:files:_hg_files'
       
   595 }
       
   596 
       
   597 _hg_cmd_manifest() {
       
   598   _arguments -s -w : $_hg_global_opts \
       
   599   ':revision:_hg_tags'
       
   600 }
       
   601 
       
   602 _hg_cmd_merge() {
       
   603   _arguments -s -w : $_hg_global_opts \
       
   604   '(--force -f)'{-f,--force}'[force a merge with outstanding changes]' \
       
   605   '(--rev -r 1)'{-r,--rev}'[revision to merge]:revision:_hg_mergerevs' \
       
   606   '(--preview -P)'{-P,--preview}'[review revisions to merge (no merge is performed)]' \
       
   607   ':revision:_hg_mergerevs'
       
   608 }
       
   609 
       
   610 _hg_cmd_outgoing() {
       
   611   _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_style_opts \
       
   612   '(--no-merges -M)'{-M,--no-merges}'[do not show merge revisions]' \
       
   613   '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
       
   614   '(--patch -p)'{-p,--patch}'[show patch]' \
       
   615   '(--rev -r)'{-r+,--rev}'[a specific revision you would like to push]' \
       
   616   '(--newest-first -n)'{-n,--newest-first}'[show newest record first]' \
       
   617   ':destination:_hg_remote'
       
   618 }
       
   619 
       
   620 _hg_cmd_parents() {
       
   621   _arguments -s -w : $_hg_global_opts $_hg_style_opts \
       
   622   '(--rev -r)'{-r+,--rev}'[show parents of the specified rev]:revision:_hg_tags' \
       
   623   ':last modified file:_hg_files'
       
   624 }
       
   625 
       
   626 _hg_cmd_paths() {
       
   627   _arguments -s -w : $_hg_global_opts \
       
   628   ':path:_hg_paths'
       
   629 }
       
   630 
       
   631 _hg_cmd_pull() {
       
   632   _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
       
   633   '(--force -f)'{-f,--force}'[run even when the remote repository is unrelated]' \
       
   634   '(--update -u)'{-u,--update}'[update to new tip if changesets were pulled]' \
       
   635   '(--rev -r)'{-r+,--rev}'[a specific revision up to which you would like to pull]:revision:' \
       
   636   ':source:_hg_remote'
       
   637 }
       
   638 
       
   639 _hg_cmd_push() {
       
   640   _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
       
   641   '(--force -f)'{-f,--force}'[force push]' \
       
   642   '(--rev -r)'{-r+,--rev}'[a specific revision you would like to push]:revision:_hg_tags' \
       
   643   ':destination:_hg_remote'
       
   644 }
       
   645 
       
   646 _hg_cmd_remove() {
       
   647   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
       
   648   '(--after -A)'{-A,--after}'[record remove that has already occurred]' \
       
   649   '(--force -f)'{-f,--force}'[remove file even if modified]' \
       
   650   '*:file:_hg_files'
       
   651 }
       
   652 
       
   653 _hg_cmd_rename() {
       
   654   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
       
   655   '(--after -A)'{-A,--after}'[record a rename that has already occurred]' \
       
   656   '(--force -f)'{-f,--force}'[forcibly copy over an existing managed file]' \
       
   657   '*:file:_hg_files'
       
   658 }
       
   659 
       
   660 _hg_cmd_resolve() {
       
   661   local context state line
       
   662   typeset -A opt_args
       
   663 
       
   664   _arguments -s -w : $_hg_global_opts \
       
   665   '(--list -l --mark -m --unmark -u)'{-l,--list}'[list state of files needing merge]:*:merged files:->resolve_files' \
       
   666   '(--mark -m --list -l --unmark -u)'{-m,--mark}'[mark files as resolved]:*:unresolved files:_hg_unresolved' \
       
   667   '(--unmark -u --list -l --mark -m)'{-u,--unmark}'[unmark files as resolved]:*:resolved files:_hg_resolved' \
       
   668   '*:file:_hg_unresolved'
       
   669 
       
   670   if [[ $state == 'resolve_files' ]]
       
   671   then
       
   672     _alternative 'files:resolved files:_hg_resolved' \
       
   673       'files:unresolved files:_hg_unresolved'
       
   674   fi
       
   675 }
       
   676 
       
   677 _hg_cmd_revert() {
       
   678   local context state line
       
   679   typeset -A opt_args
       
   680 
       
   681   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
       
   682   '(--all -a :)'{-a,--all}'[revert all changes when no arguments given]' \
       
   683   '(--rev -r)'{-r+,--rev}'[revision to revert to]:revision:_hg_tags' \
       
   684   '--no-backup[do not save backup copies of files]' \
       
   685   '*:file:->diff_files'
       
   686 
       
   687   if [[ $state == 'diff_files' ]]
       
   688   then
       
   689     if [[ -n $opt_args[-r] ]]
       
   690     then
       
   691       _hg_files
       
   692     else
       
   693       typeset -a status_files
       
   694       _hg_status mard
       
   695       _wanted files expl 'modified, added, removed or deleted file' _multi_parts / status_files
       
   696     fi
       
   697   fi
       
   698 }
       
   699 
       
   700 _hg_cmd_serve() {
       
   701   _arguments -s -w : $_hg_global_opts \
       
   702   '(--accesslog -A)'{-A+,--accesslog}'[name of access log file]:log file:_files' \
       
   703   '(--errorlog -E)'{-E+,--errorlog}'[name of error log file]:log file:_files' \
       
   704   '(--daemon -d)'{-d,--daemon}'[run server in background]' \
       
   705   '(--port -p)'{-p+,--port}'[listen port]:listen port:' \
       
   706   '(--address -a)'{-a+,--address}'[interface address]:interface address:' \
       
   707   '(--name -n)'{-n+,--name}'[name to show in web pages]:repository name:' \
       
   708   '(--templates -t)'{-t,--templates}'[web template directory]:template dir:_files -/' \
       
   709   '--style[web template style]:style' \
       
   710   '--stdio[for remote clients]' \
       
   711   '(--ipv6 -6)'{-6,--ipv6}'[use IPv6 in addition to IPv4]'
       
   712 }
       
   713 
       
   714 _hg_cmd_showconfig() {
       
   715   _arguments -s -w : $_hg_global_opts \
       
   716   '(--untrusted -u)'{-u+,--untrusted}'[show untrusted configuration options]' \
       
   717   ':config item:_hg_config'
       
   718 }
       
   719 
       
   720 _hg_cmd_status() {
       
   721   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
       
   722   '(--all -A)'{-A,--all}'[show status of all files]' \
       
   723   '(--modified -m)'{-m,--modified}'[show only modified files]' \
       
   724   '(--added -a)'{-a,--added}'[show only added files]' \
       
   725   '(--removed -r)'{-r,--removed}'[show only removed files]' \
       
   726   '(--deleted -d)'{-d,--deleted}'[show only deleted (but tracked) files]' \
       
   727   '(--clean -c)'{-c,--clean}'[show only files without changes]' \
       
   728   '(--unknown -u)'{-u,--unknown}'[show only unknown files]' \
       
   729   '(--ignored -i)'{-i,--ignored}'[show ignored files]' \
       
   730   '(--no-status -n)'{-n,--no-status}'[hide status prefix]' \
       
   731   '(--copies -C)'{-C,--copies}'[show source of copied files]' \
       
   732   '(--print0 -0)'{-0,--print0}'[end filenames with NUL, for use with xargs]' \
       
   733   '--rev[show difference from revision]:revision:_hg_tags' \
       
   734   '*:files:_files'
       
   735 }
       
   736 
       
   737 _hg_cmd_summary() {
       
   738   _arguments -s -w : $_hg_global_opts \
       
   739   '--remote[check for push and pull]'
       
   740 }
       
   741 
       
   742 _hg_cmd_tag() {
       
   743   _arguments -s -w : $_hg_global_opts \
       
   744   '(--local -l)'{-l,--local}'[make the tag local]' \
       
   745   '(--message -m)'{-m+,--message}'[message for tag commit log entry]:message:' \
       
   746   '(--date -d)'{-d+,--date}'[record datecode as commit date]:date code:' \
       
   747   '(--user -u)'{-u+,--user}'[record user as commiter]:user:' \
       
   748   '(--rev -r)'{-r+,--rev}'[revision to tag]:revision:_hg_tags' \
       
   749   ':tag name:'
       
   750 }
       
   751 
       
   752 _hg_cmd_tip() {
       
   753   _arguments -s -w : $_hg_global_opts $_hg_style_opts \
       
   754   '(--patch -p)'{-p,--patch}'[show patch]'
       
   755 }
       
   756 
       
   757 _hg_cmd_unbundle() {
       
   758   _arguments -s -w : $_hg_global_opts \
       
   759   '(--update -u)'{-u,--update}'[update to new tip if changesets were unbundled]' \
       
   760   ':files:_files'
       
   761 }
       
   762 
       
   763 _hg_cmd_update() {
       
   764   _arguments -s -w : $_hg_global_opts \
       
   765   '(--clean -C)'{-C,--clean}'[overwrite locally modified files]' \
       
   766   '(--rev -r)'{-r+,--rev}'[revision]:revision:_hg_tags' \
       
   767   ':revision:_hg_tags'
       
   768 }
       
   769 
       
   770 # HGK
       
   771 _hg_cmd_view() {
       
   772   _arguments -s -w : $_hg_global_opts \
       
   773   '(--limit -l)'{-l+,--limit}'[limit number of changes displayed]:' \
       
   774   ':revision range:_hg_tags'
       
   775 }
       
   776 
       
   777 # MQ
       
   778 _hg_qseries() {
       
   779   typeset -a patches
       
   780   patches=(${(f)"$(_hg_cmd qseries)"})
       
   781   (( $#patches )) && _describe -t hg-patches 'patches' patches
       
   782 }
       
   783 
       
   784 _hg_qapplied() {
       
   785   typeset -a patches
       
   786   patches=(${(f)"$(_hg_cmd qapplied)"})
       
   787   if (( $#patches ))
       
   788   then
       
   789     patches+=(qbase qtip)
       
   790     _describe -t hg-applied-patches 'applied patches' patches
       
   791   fi
       
   792 }
       
   793 
       
   794 _hg_qunapplied() {
       
   795   typeset -a patches
       
   796   patches=(${(f)"$(_hg_cmd qunapplied)"})
       
   797   (( $#patches )) && _describe -t hg-unapplied-patches 'unapplied patches' patches
       
   798 }
       
   799 
       
   800 # unapplied, including guarded patches
       
   801 _hg_qdeletable() {
       
   802   typeset -a unapplied
       
   803   unapplied=(${(f)"$(_hg_cmd qseries)"})
       
   804   for p in $(_hg_cmd qapplied)
       
   805   do
       
   806     unapplied=(${unapplied:#$p})
       
   807   done
       
   808 
       
   809   (( $#unapplied )) && _describe -t hg-allunapplied-patches 'all unapplied patches' unapplied
       
   810 }
       
   811 
       
   812 _hg_qguards() {
       
   813   typeset -a guards
       
   814   local guard
       
   815   compset -P "+|-"
       
   816   _hg_cmd qselect -s | while read guard
       
   817   do
       
   818     guards+=(${guard#(+|-)})
       
   819   done
       
   820   (( $#guards )) && _describe -t hg-guards 'guards' guards
       
   821 }
       
   822 
       
   823 _hg_qseries_opts=(
       
   824   '(--summary -s)'{-s,--summary}'[print first line of patch header]')
       
   825 
       
   826 _hg_cmd_qapplied() {
       
   827   _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
       
   828 }
       
   829 
       
   830 _hg_cmd_qdelete() {
       
   831   _arguments -s -w : $_hg_global_opts \
       
   832   '(--keep -k)'{-k,--keep}'[keep patch file]' \
       
   833   '*'{-r+,--rev}'[stop managing a revision]:applied patch:_hg_revrange' \
       
   834   '*:unapplied patch:_hg_qdeletable'
       
   835 }
       
   836 
       
   837 _hg_cmd_qdiff() {
       
   838   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
       
   839   '*:pattern:_hg_files'
       
   840 }
       
   841 
       
   842 _hg_cmd_qfold() {
       
   843   _arguments -s -w : $_hg_global_opts $_h_commit_opts \
       
   844   '(--keep,-k)'{-k,--keep}'[keep folded patch files]' \
       
   845   '*:unapplied patch:_hg_qunapplied'
       
   846 }
       
   847 
       
   848 _hg_cmd_qgoto() {
       
   849   _arguments -s -w : $_hg_global_opts \
       
   850   '(--force -f)'{-f,--force}'[overwrite any local changes]' \
       
   851   ':patch:_hg_qseries'
       
   852 }
       
   853 
       
   854 _hg_cmd_qguard() {
       
   855   _arguments -s -w : $_hg_global_opts \
       
   856   '(--list -l)'{-l,--list}'[list all patches and guards]' \
       
   857   '(--none -n)'{-n,--none}'[drop all guards]' \
       
   858   ':patch:_hg_qseries' \
       
   859   '*:guards:_hg_qguards'
       
   860 }
       
   861 
       
   862 _hg_cmd_qheader() {
       
   863   _arguments -s -w : $_hg_global_opts \
       
   864   ':patch:_hg_qseries'
       
   865 }
       
   866 
       
   867 _hg_cmd_qimport() {
       
   868   _arguments -s -w : $_hg_global_opts \
       
   869   '(--existing -e)'{-e,--existing}'[import file in patch dir]' \
       
   870   '(--name -n 2)'{-n+,--name}'[patch file name]:name:' \
       
   871   '(--force -f)'{-f,--force}'[overwrite existing files]' \
       
   872   '*'{-r+,--rev}'[place existing revisions under mq control]:revision:_hg_revrange' \
       
   873   '*:patch:_files'
       
   874 }
       
   875 
       
   876 _hg_cmd_qnew() {
       
   877   _arguments -s -w : $_hg_global_opts $_hg_commit_opts \
       
   878   '(--force -f)'{-f,--force}'[import uncommitted changes into patch]' \
       
   879   ':patch:'
       
   880 }
       
   881 
       
   882 _hg_cmd_qnext() {
       
   883   _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
       
   884 }
       
   885 
       
   886 _hg_cmd_qpop() {
       
   887   _arguments -s -w : $_hg_global_opts \
       
   888   '(--all -a :)'{-a,--all}'[pop all patches]' \
       
   889   '(--name -n)'{-n+,--name}'[queue name to pop]:' \
       
   890   '(--force -f)'{-f,--force}'[forget any local changes]' \
       
   891   ':patch:_hg_qapplied'
       
   892 }
       
   893 
       
   894 _hg_cmd_qprev() {
       
   895   _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
       
   896 }
       
   897 
       
   898 _hg_cmd_qpush() {
       
   899   _arguments -s -w : $_hg_global_opts \
       
   900   '(--all -a :)'{-a,--all}'[apply all patches]' \
       
   901   '(--list -l)'{-l,--list}'[list patch name in commit text]' \
       
   902   '(--merge -m)'{-m+,--merge}'[merge from another queue]:' \
       
   903   '(--name -n)'{-n+,--name}'[merge queue name]:' \
       
   904   '(--force -f)'{-f,--force}'[apply if the patch has rejects]' \
       
   905   ':patch:_hg_qunapplied'
       
   906 }
       
   907 
       
   908 _hg_cmd_qrefresh() {
       
   909   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_commit_opts \
       
   910   '(--git -g)'{-g,--git}'[use git extended diff format]' \
       
   911   '(--short -s)'{-s,--short}'[short refresh]' \
       
   912   '*:files:_hg_files'
       
   913 }
       
   914 
       
   915 _hg_cmd_qrename() {
       
   916   _arguments -s -w : $_hg_global_opts \
       
   917   ':patch:_hg_qseries' \
       
   918   ':destination:'
       
   919 }
       
   920 
       
   921 _hg_cmd_qselect() {
       
   922   _arguments -s -w : $_hg_global_opts \
       
   923   '(--none -n :)'{-n,--none}'[disable all guards]' \
       
   924   '(--series -s :)'{-s,--series}'[list all guards in series file]' \
       
   925   '--pop[pop to before first guarded applied patch]' \
       
   926   '--reapply[pop and reapply patches]' \
       
   927   '*:guards:_hg_qguards'
       
   928 }
       
   929 
       
   930 _hg_cmd_qseries() {
       
   931   _arguments -s -w : $_hg_global_opts $_hg_qseries_opts \
       
   932   '(--missing -m)'{-m,--missing}'[print patches not in series]'
       
   933 }
       
   934 
       
   935 _hg_cmd_qunapplied() {
       
   936   _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
       
   937 }
       
   938 
       
   939 _hg_cmd_qtop() {
       
   940   _arguments -s -w : $_hg_global_opts $_hg_qseries_opts
       
   941 }
       
   942 
       
   943 _hg_cmd_strip() {
       
   944   _arguments -s -w : $_hg_global_opts \
       
   945   '(--force -f)'{-f,--force}'[force multi-head removal]' \
       
   946   '(--backup -b)'{-b,--backup}'[bundle unrelated changesets]' \
       
   947   '(--nobackup -n)'{-n,--nobackup}'[no backups]' \
       
   948   ':revision:_hg_tags'
       
   949 }
       
   950 
       
   951 _hg "$@"