contrib/zsh_completion
changeset 3511 060aefba4459
parent 3492 776c317566b6
child 3517 a6dd7ab568cc
equal deleted inserted replaced
3510:9383af6f236d 3511:060aefba4459
    11 # Software Foundation; either version 2 of the License, or (at your
    11 # Software Foundation; either version 2 of the License, or (at your
    12 # option) any later version.
    12 # option) any later version.
    13 #
    13 #
    14 
    14 
    15 local curcontext="$curcontext" state line
    15 local curcontext="$curcontext" state line
    16 typeset -A opt_args
    16 local repos newFiles addedFiles commitMessage
    17 local repos newFiles addedFiles includeExclude commitMessage
    17 typeset -A _hg_cmd_globals
    18 local ridx _hgroot
    18 
    19 
    19 _hg() {
    20 # FIXME: why isn't opt_args available?
    20   local cmd
    21 [[ -d .hg ]] && _hgroot="$PWD"
    21   integer i=2
    22 ridx=$words[(i)-R]
    22   _hg_cmd_globals=()
    23 (( $ridx < $#words )) && _hgroot="${words[$ridx+1]}"
    23 
    24 
    24   while (( i < $#words ))
    25 # hg dispatch (borrowed from _cvs)
    25   do
    26 (( $+functions[_hg_cmd] )) ||
    26     case "$words[$i]" in
    27 _hg_cmd () {
    27       -R|--repository|--cwd|--config)
    28   _call_program hg hg -R "$_hgroot" "$@"
    28         # pass along arguments to hg completer
    29 }
    29         _hg_cmd_globals+="$words[$i]"
    30 
    30         _hg_cmd_globals+="$words[$i+1]"
    31 (( $+functions[_hg_state] )) ||
    31         (( i += 2 ))
    32 _hg_state () {
    32         continue
    33   case "$state" in
    33       ;;
    34     (tags)
    34       -R*)
    35       compadd $(_hg_cmd tags 2> /dev/null |
    35         _hg_cmd_globals+="$words[$i]"
    36         sed -e 's/[0-9]*:[a-f0-9]*$//; s/ *$//')
    36        (( i++ ))
    37     ;;
    37        continue
    38     (qapplied)
    38       ;;
    39       compadd $(_hg_cmd qapplied)
    39       -*)
    40     ;;
    40         # skip option
    41     (qunapplied)
    41         (( i++ ))
    42       compadd $(_hg_cmd qunapplied)
    42         continue
    43     ;;
    43       ;;
    44   esac
    44     esac
    45 }
    45     if [[ -z "$cmd" ]]
    46 
    46     then
    47 (( $+_hg_commands )) ||
    47       cmd="$words[$i]"
    48 _hg_commands=($(hg -v help | sed -e '1,/^list of commands:/d' \
    48       words[$i]=()
    49       -e '/^global options:/,$d' -e '/^ [^ ]/!d; s/[,:].*//g;'))
    49       (( CURRENT-- ))
    50 
       
    51 # A lot of commands have these arguments
       
    52 includeExclude=(
       
    53         '*-I-[include names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/'
       
    54         '*--include-[include names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/'
       
    55         '*-X-[exclude names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/'
       
    56         '*--exclude-[exclude names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/')
       
    57 
       
    58 styleOpts=(
       
    59         '--style[display using template map file]:'
       
    60         '--template[display with template]:')
       
    61 
       
    62 commitMessage=(
       
    63         '(-m --message -l --logfile --edit)-e[edit commit message]'
       
    64         '(-m --message -l --logfile -e)--edit[edit commit message]'
       
    65         '(-e --edit -l --logfile --message)-m[use <text> as commit message]:message:'
       
    66         '(-e --edit -l --logfile -m)--message[use <text> as commit message]:message:'
       
    67         '(-e --edit -m --message --logfile)-l[read the commit message from <file>]:log file:_files'
       
    68         '(-e --edit -m --message -l)--logfile[read the commit message from <file>]:log file:_files')
       
    69 
       
    70 if [[ $service == "hg" ]]; then
       
    71     _arguments -C -A "-*" \
       
    72     '(--repository)-R[repository root directory]:root:_files -/' \
       
    73     '(-R)--repository[repository root directory]:root:_files -/' \
       
    74     '--cwd[change working directory]:new working directory:_files -/' \
       
    75     '(--noninteractive)-y[do not prompt, assume yes for any required answers]' \
       
    76     '(-y)--noninteractive[do not prompt, assume yes for any required answers]' \
       
    77     '(--verbose)-v[enable additional output]' \
       
    78     '(-v)--verbose[enable additional output]' \
       
    79     '(--quiet)-q[suppress output]' \
       
    80     '(-q)--quiet[suppress output]' \
       
    81     '(--help)-h[display help and exit]' \
       
    82     '(-h)--help[display help and exit]' \
       
    83     '--debug[debug mode]' \
       
    84     '--debugger[start debugger]' \
       
    85     '--traceback[print traceback on exception]' \
       
    86     '--time[time how long the command takes]' \
       
    87     '--profile[profile]' \
       
    88     '--version[output version information and exit]' \
       
    89     '*::command:->subcmd' && return 0
       
    90 
       
    91     if (( CURRENT == 1 )); then
       
    92         _wanted commands expl 'hg command' compadd -a _hg_commands
       
    93         return
       
    94     fi
    50     fi
    95     service="$words[1]"
    51     (( i++ ))
    96     curcontext="${curcontext%:*}=$service:"
    52   done
    97 fi
    53 
    98 
    54   if [[ -z "$cmd" ]]
    99 case $service in
    55   then
   100     (add)
    56     _arguments -s -w : $_hg_global_opts \
   101         newFiles=(${(ps:\0:)"$(_hg_cmd status -0un .)"})
    57     ':mercurial command:_hg_commands'
   102         _arguments $includeExclude \
    58     return
   103         '*:file:->unknown'
    59   fi
   104         _wanted files expl 'unknown files' compadd -a newFiles
    60 
   105     ;;
    61   # resolve abbreviations and aliases
   106 
    62   if ! (( $+functions[_hg_cmd_${cmd}] ))
   107     (addremove)
    63   then
   108         _arguments $includeExclude \
    64     local cmdexp
   109         '*:directories:_files -/'  # assume they want to add/remove a dir
    65     (( $#_hg_cmd_list )) || _hg_get_commands
   110     ;;
    66 
   111 
    67     cmdexp=$_hg_cmd_list[(r)${cmd}*]
   112     (forget)
    68     if [[ $cmdexp == $_hg_cmd_list[(R)${cmd}*] ]]
   113         addedFiles=(${(ps:\0:)"$(_hg_cmd status -0an .)"})
    69     then
   114         _arguments $includeExclude  \
    70       # might be nice to rewrite the command line with the expansion
   115         '*:file:->added'
    71       cmd="$cmdexp"
   116         _wanted files expl 'newly added files' compadd -a addedFiles
    72     fi
   117     ;;
    73     if [[ -n $_hg_alias_list[$cmd] ]]
   118 
    74     then
   119     (remove|rm)
    75       cmd=$_hg_alias_list[$cmd]
   120         _arguments $includeExclude \
    76     fi
   121         '*:file:_files'
    77   fi
   122     ;;
    78 
   123 
    79   if (( $+functions[_hg_cmd_${cmd}] ))
   124     (copy|cp)
    80   then
   125         _arguments $includeExclude \
    81     curcontext="${curcontext%:*:*}:hg-${cmd}:"
   126         '(--after)-A[record a copy that has already occurred]' \
    82     _hg_cmd_${cmd}
   127         '(-A)--after[record a copy that has already occurred]' \
    83     return
   128         '(--force)-f[forcibly copy over an existing managed file]' \
    84   fi
   129         '(-f)--force[forcibly copy over an existing managed file]' \
    85 }
   130         '(--parents)-p[append source path to dest]' \
    86 
   131         '(-p)--parents[append source path to dest]' \
    87 _hg_get_commands() {
   132         '*:files:_files'
    88   typeset -ga _hg_cmd_list
   133     ;;
    89   typeset -gA _hg_alias_list
   134 
    90   local hline cmd cmdalias
   135     (rename|mv)
    91   _call_program help hg --verbose help | while read -A hline
   136         if (( CURRENT == 2 )); then
    92   do
   137             _arguments $includeExclude \
    93     cmd="$hline[1]"
   138             '(--after)-A[record a rename that has already occurred]' \
    94     case $cmd in
   139             '(-A)--after[record a rename that has already occurred]' \
    95       *:)
   140             '(--force)-f[replace destination if it exists]' \
    96         cmd=${cmd%:}
   141             '(-F)--force[replace destination if it exists]' \
    97         _hg_cmd_list+=($cmd)
   142             '(--parents)-p[append source path to dest]' \
    98       ;;
   143             '(-p)--parents[append source path to dest]' \
    99       *,)
   144             '*:files:_files'
   100         cmd=${cmd%,}
   145         else
   101         _hg_cmd_list+=($cmd)
   146             _arguments '*:destination:_files'
   102         integer i=2
   147         fi
   103         while (( i <= $#hline ))
   148     ;;
   104         do
   149 
   105           cmdalias=${hline[$i]%(:|,)}
   150     (diff)
   106           _hg_cmd_list+=($cmdalias)
   151         _arguments $includeExclude \
   107           _hg_alias_list+=($cmdalias $cmd)
   152         '*-r[revision]:revision:->tags' \
   108           (( i++ ))
   153         '*--rev[revision]:revision:->tags' \
   109         done
   154         '(--text)-a[treat all files as text]' \
   110       ;;
   155         '(-a)--text[treat all files as text]' \
   111     esac
   156         '*:file:_files'
   112   done
   157     ;;
   113 }
   158 
   114 
   159     (status|st)
   115 _hg_commands() {
   160         _arguments $includeExclude \
   116   (( $#_hg_cmd_list )) || _hg_get_commands
   161         '(--no-status)-n[hide status prefix]' \
   117   _describe -t hg-commands 'Mercurial command' _hg_cmd_list
   162         '(-n)--no-status[hide status prefix]' \
   118 }
   163         '(--print0)-0[end filenames with NUL, for use with xargs]' \
   119 
   164         '(-0)--print0[end filenames with NUL, for use with xargs]' \
   120 _hg_tags() {
   165         '(--modified)-m[show only modified files]' \
   121   typeset -a tags
   166         '(-m)--modified[show only modified files]' \
   122   local tag rev
   167         '(--added)-a[show only added files]' \
   123 
   168         '(-a)--added[show only added files]' \
   124   _hg_cmd tags 2> /dev/null | while read tag rev
   169         '(--removed)-r[show only removed files]' \
   125   do
   170         '(-r)--removed[show only removed files]' \
   126     tags+=($tag)
   171         '(--unknown)-u[show only unknown files]' \
   127   done
   172         '(-u)--unknown[show only unknown files]' \
   128   (( $#tags )) && _describe -t hg-tags 'tags' tags
   173         '*:search pattern, then files:_files'
   129 }
   174     ;;
   130 
   175 
   131 _hg_status() {
   176     (revert)
   132   status_files=(${(ps:\0:)"$(_hg_cmd status -0n$1 .)"})
   177         addedFiles=(${(ps:\0:)"$(_hg_cmd status -0amrn .)"})
   133 }
   178         _arguments \
   134 
   179         '(--rev)-r[revision to revert to]:revision:->tags' \
   135 _hg_unknown() {
   180         '(-r)--rev[revision to revert to]:revision:->tags' \
   136   typeset -a status_files
   181         '(--nonrecursive)-n[do not recurse into subdirectories]' \
   137   _hg_status u
   182         '(-n)--nonrecursive[do not recurse into subdirectories]' \
   138   (( $#status_files )) && _describe -t hg-unknown-files 'unknown files' status_files
   183         '*:file:->modified'
   139 }
   184         _wanted files expl 'mofified files' compadd -a addedFiles
   140 
   185     ;;
   141 _hg_missing() {
   186 
   142   typeset -a status_files
   187     (commit|ci)
   143   _hg_status d
   188         addedFiles=(${(ps:\0:)"$(_hg_cmd status -0amrn .)"})
   144   (( $#status_files )) && _describe -t hg-missing-files 'missing files' status_files
   189         _arguments $includeExclude \
   145 }
   190         '(--addremove)-A[run addremove during commit]' \
   146 
   191         '(-A)--addremove[run addremove during commit]' \
   147 _hg_addremove() {
   192         '(--message)-m[use <txt> as commit message]:string:' \
   148   _alternative "unknown files:unknown files:_hg_unknown" \
   193         '(-m)--message[use <txt> as commit message]:string:' \
   149   "missing files:missing files:_hg_missing"
   194         '(--logfile)-l[read commit message from <file>]:.log file:_file -g \*.txt' \
   150 }
   195         '(-l)--logfile[read commit message from <file>]:.log file:_file -g \*.txt' \
   151 
   196         '(--date)-d[record datecode as commit date]:date code:' \
   152 _hg_paths() {
   197         '(-d)--date[record datecode as commit date]:date code:' \
   153   typeset -a paths pnames
   198         '(--user)-u[record user as commiter]:user:' \
   154   _hg_cmd paths 2> /dev/null | while read -A pnames
   199         '(-u)--user[record user as commiter]:user:' \
   155   do
   200         '*:file:->modified'
   156     paths+=($pnames[1])
   201         _wanted files expl 'mofified files' compadd -a addedFiles
   157   done
   202     ;;
   158   (( $#paths )) && _describe -t hg-paths 'repository aliases' paths
   203 
   159 }
   204     (cat)
   160 
   205         _arguments $includeExclude \
   161 _hg_remote() {
   206         '(--output)-o[print output to file with formatted name]:filespec:' \
   162   _alternative 'repository aliases:repository aliases:_hg_paths' \
   207         '(-o)--output[print output to file with formatted name]:filespec:' \
   163   'directory:directory:_files -/'
   208         '(--rev)-r[revision]:revision:->tags' \
   164 }
   209         '(-r)--rev[revision]:revision:->tags' \
   165 
   210         '*:file:_files'
   166 _hg_qseries() {
   211     ;;
   167   typeset -a patches
   212 
   168   patches=($(_hg_cmd qseries))
   213     (annotate)
   169   (( $#patches )) && _describe -t hg-patches 'patches' patches
   214         _arguments $includeExclude \
   170 }
   215         '(--rev)-r[annotate the specified revision]:revision:->tags' \
   171 
   216         '(-r)--rev[annotate the specified revision]:revision:->tags' \
   172 _hg_qapplied() {
   217         '(--text)-a[treat all files as text]' \
   173   typeset -a patches
   218         '(-a)--text[treat all files as text]' \
   174   patches=($(_hg_cmd qapplied))
   219         '(--user)-u[list the author]' \
   175   (( $#patches )) && _describe -t hg-applied-patches 'applied patches' patches
   220         '(-u)--user[list the author]' \
   176 }
   221         '(--changeset)-c[list the changeset]' \
   177 
   222         '(-c)--changeset[list the changeset]' \
   178 _hg_qunapplied() {
   223         '(--number)-n[list the revision number (default)]' \
   179   typeset -a patches
   224         '(-n)--number[list the revision number (default)]' \
   180   patches=($(_hg_cmd qunapplied))
   225         '*:files:_files'
   181   (( $#patches )) && _describe -t hg-unapplied-patches 'unapplied patches' patches
   226     ;;
   182 }
   227 
   183 
   228     (grep)
   184 # Common options
   229         _arguments $includeExclude \
   185 _hg_global_opts=(
   230         '*-r[search in given revision range]:revision:->tags' \
   186     '(--repository)-R+[repository root directory]:repository:_files -/'
   231         '*--rev[search in given revision range]:revision:->tags' \
   187     '(-R)--repository[repository root directory]:repository:_files -/'
   232         '--all[print all revisions with matches]' \
   188     '--cwd[change working directory]:new working directory:_files -/'
   233         '(-print0)-0[end filenames with NUL, for use with xargs]' \
   189     '(--noninteractive)-y[do not prompt, assume yes for any required answers]'
   234         '(-0)--print0[end filenames with NUL, for use with xargs]' \
   190     '(-y)--noninteractive[do not prompt, assume yes for any required answers]'
   235         '(--ignore-case)-i[ignore case when matching]' \
   191     '(--verbose)-v[enable additional output]'
   236         '(-i)--ignore-case[ignore case when matching]' \
   192     '(-v)--verbose[enable additional output]'
   237         '(--files-with-matches)-l[print names of files and revs that match]' \
   193     '(--quiet)-q[suppress output]'
   238         '(-l)--files-with-matches[print names of files and revs that match]' \
   194     '(-q)--quiet[suppress output]'
   239         '(--line-number)-n[print matching line numbers]' \
   195     '(--help)-h[display help and exit]'
   240         '(-n)--line-number[print matching line numbers]' \
   196     '(-h)--help[display help and exit]'
   241         '(--user)-u[print user who committed change]' \
   197     '--debug[debug mode]'
   242         '(-u)--user[print user who committed change]' \
   198     '--debugger[start debugger]'
   243         '*:search pattern:'
   199     '--traceback[print traceback on exception]'
   244     ;;
   200     '--time[time how long the command takes]'
   245 
   201     '--profile[profile]'
   246     (locate)
   202     '--version[output version information and exit]'
   247         _arguments $includeExclude \
   203 )
   248         '(--rev)-r[search repository as it stood at revision]:revision:->tags' \
   204 
   249         '(-r)--rev[search repository as it stood at revision]:revision:->tags' \
   205 _hg_pat_opts=(
   250         '(--print0)-0[end filenames with NUL, for use with xargs]' \
   206   '*-I+[include names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/'
   251         '(-0)--print0[end filenames with NUL, for use with xargs]' \
   207   '*--include[include names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/'
   252         '(--fullpath)-f[print complete paths]' \
   208   '*-X+[exclude names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/'
   253         '(-f)--fullpath[print complete paths]' \
   209   '*--exclude[exclude names matching the given patterns]:dir:_files -W $(_hg_cmd root) -/')
   254         '*:search pattern:'
   210 
   255     ;;
   211 _hg_diff_opts=(
   256 
   212   '(--text)-a[treat all files as text]'
   257     (log|history)
   213   '(-a)--text[treat all files as text]'
   258         _arguments $includeExclude $styleOpts \
   214   '(--git)-g[use git extended diff format]'
   259         '*-r[show the specified revision or range]:revision:->tags' \
   215   '(-g)--git[use git extended diff format]'
   260         '*--rev[show the specified revision or range]:revision:->tags' \
   216   "--nodates[don't include dates in diff headers]")
   261         '(--no-merges -M --only-merges)-m[show only merge revisions]' \
   217 
   262         '(--no-merges -M -m)--only-merges[show only merge revisions]' \
   218 _hg_dryrun_opts=(
   263         '(--only-merges -m --no-merges)-M[do not show merge revisions]' \
   219   '(--dry-run)-n[do not perform actions, just print output]'
   264         '(--only-merges -m -M)--no-merges[do not show merge revisions]' \
   220   '(-n)--dry-run[do not perform actions, just print output]')
   265         '(--keyword)-k[search for a keyword]:keyword:' \
   221 
   266         '(-k)--keyword[search for a keyword]:keyword:' \
   222 _hg_style_opts=(
   267         '(--branch)-b[show branches]' \
   223   '--style[display using template map file]:'
   268         '(-b)--branch[show branches]' \
   224   '--template[display with template]:')
   269         '(--patch)-p[show patch]' \
   225 
   270         '(-p)--patch[show patch]' \
   226 _hg_commit_opts=(
   271         '*:file:_files'
   227   '(-m --message -l --logfile --edit)-e[edit commit message]'
   272     ;;
   228   '(-m --message -l --logfile -e)--edit[edit commit message]'
   273 
   229   '(-e --edit -l --logfile --message)-m+[use <text> as commit message]:message:'
   274     (update|checkout|co)
   230   '(-e --edit -l --logfile -m)--message[use <text> as commit message]:message:'
   275         _arguments \
   231   '(-e --edit -m --message --logfile)-l+[read the commit message from <file>]:log file:_files'
   276         '(--branch)-b[checkout the head of a specific branch]' \
   232   '(-e --edit -m --message -l)--logfile[read the commit message from <file>]:log file:_files')
   277         '(-b)--branch[checkout the head of a specific branch]' \
   233 
   278         '(-C --clean --merge)-m[allow merging of branches]' \
   234 _hg_remote_opts=(
   279         '(-C --clean -m)--merge[allow merging of branches]' \
   235   '(--ssh)-e+[specify ssh command to use]:'
   280         '(-m --merge --clean)-C[overwrite locally modified files]' \
   236   '(-e)--ssh[specify ssh command to use]:'
   281         '(-m --merge -C)--clean[overwrite locally modified files]' \
   237   '--remotecmd[specify hg command to run on the remote side]:')
   282         '*:revision or tag:->tags'
   238 
   283     ;;
   239 _hg_cmd() {
   284 
   240   _call_program hg hg "$_hg_cmd_globals[@]" "$@"
   285     (tag)
   241 }
   286         _arguments \
   242 
   287         '(--local)-l[make the tag local]' \
   243 _hg_cmd_add() {
   288         '(-l)--local[make the tag local]' \
   244   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
   289         '(--message)-m[message for tag commit log entry]:string:' \
   245   '*:unknown files:_hg_unknown'
   290         '(-m)--message[message for tag commit log entry]:string:' \
   246 }
   291         '(--date)-d[record datecode as commit date]:date code:' \
   247 
   292         '(-d)--date[record datecode as commit date]:date code:' \
   248 _hg_cmd_addremove() {
   293         '(--user)-u[record user as commiter]:user:' \
   249   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
   294         '(-u)--user[record user as commiter]:user:' \
   250   '(--similarity)-s[guess renamed files by similarity (0<=s<=100)]:' \
   295         '*:name, then revision:->tags'
   251   '(-s)--similarity[guess renamed files by similarity (0<=s<=100)]:' \
   296     ;;
   252   '*:unknown or missing files:_hg_addremove'
   297 
   253 }
   298     (clone)
   254 
   299         if (( CURRENT == 2 )); then
   255 _hg_cmd_annotate() {
   300             repos=( $(_hg_cmd paths | sed -e 's/^.*= //') )
   256   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
   301             _arguments \
   257   '(--rev)-r+[annotate the specified revision]:revision:_hg_tags' \
   302             '(--no-update)-U[do not update the new working directory]' \
   258   '(-r)--rev[annotate the specified revision]:revision:_hg_tags' \
   303             '(-U)--no-update[do not update the new working directory]' \
   259   '(--follow)-f[follow file copies and renames]' \
   304             '(--ssh)-e[specify ssh command to use]:string:' \
   260   '(-f)--follow[follow file copies and renames]' \
   305             '(-e)--ssh[specify ssh command to use]:string:' \
   261   '(--text)-a[treat all files as text]' \
   306             '--pull[use pull protocol to copy metadata]' \
   262   '(-a)--text[treat all files as text]' \
   307             '--remotecmd[specify hg command to run on the remote side]:remote hg:' \
   263   '(--user)-u[list the author]' \
   308             '*:local repo:_files -/'
   264   '(-u)--user[list the author]' \
   309             _wanted source expl 'source repository' compadd -a repos
   265   '(--date)-d[list the date]' \
   310         elif (( CURRENT == 3 )); then
   266   '(-d)--date[list the date]' \
   311             _arguments '*:dest repo:_files -/'
   267   '(--number)-n[list the revision number (default)]' \
   312         fi
   268   '(-n)--number[list the revision number (default)]' \
   313     ;;
   269   '(--changeset)-c[list the changeset]' \
   314 
   270   '(-c)--changeset[list the changeset]' \
   315     (rawcommit)
   271   '*:files:_files -W $(_hg_cmd root)'
   316         _arguments \
   272 }
   317         '(--parent)-p[parent revision]:revision:->tags' \
   273 
   318         '(-p)--parent[parent revision]:revision:->tags' \
   274 _hg_cmd_archive() {
   319         '(--date)-d[record datecode as commit date]:date code:' \
   275   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
   320         '(-d)--date[record datecode as commit date]:date code:' \
   276   '--no-decode[do not pass files through decoders]' \
   321         '(--user)-u[record user as commiter]:user:' \
   277   '(--prefix)-p+[directory prefix for files in archive]:' \
   322         '(-u)--user[record user as commiter]:user:' \
   278   '(-p)--prefix[directory prefix for files in archive]:' \
   323         '(--message)-m[use <txt> as commit message]:string:' \
   279   '(--rev)-r+[revision to distribute]:revision:_hg_tags' \
   324         '(-m)--message[use <txt> as commit message]:string:' \
   280   '(-r)--rev[revision to distribute]:revision:_hg_tags' \
   325         '(--logfile)-l[read commit message from <file>]:.log file:_file -g \*.txt' \
   281   '(--type)-t+[type of distribution to create]:archive type:(files tar tbz2 tgz uzip zip)' \
   326         '(-l)--logfile[read commit message from <file>]:.log file:_file -g \*.txt' \
   282   '(-t)--type[type of distribution to create]:archive type:(files tar tbz2 tgz uzip zip)' \
   327         '(--files)-F[file list]:file list:_files' \
   283   '*:destination:_files'
   328         '(-F)--files[file list]:file list:_files' \
   284 }
   329         '*:files to commit:_files'
   285 
   330     ;;
   286 _hg_cmd_bundle() {
   331 
   287   _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
   332     (bundle)
   288   '(--force)-f[run even when remote repository is unrelated]' \
   333         if (( CURRENT == 2 )); then
   289   '(-f)--force[run even when remote repository is unrelated]' \
   334             _arguments '*:changegroup file:_files -g \*.hg'
   290   '(2)*--base[a base changeset to specify instead of a destination]:revision:_hg_tags' \
   335         elif (( CURRENT == 3 )); then
   291   ':output file:_files' \
   336             _arguments '*:other repo:_files -/'
   292   ':destination repository:_files -/'
   337         fi
   293 }
   338     ;;
   294 
   339 
   295 _hg_cmd_cat() {
   340     (unbundle)
   296   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
   341         _arguments '*:changegroup .hg file:_files -g \*.hg'
   297   '(--output)-o+[print output to file with formatted name]:filespec:' \
   342     ;;
   298   '(-o)--output[print output to file with formatted name]:filespec:' \
   343 
   299   '(--rev)-r+[revision]:revision:_hg_tags' \
   344     (incoming)
   300   '(-r)--rev[revision]:revision:_hg_tags' \
   345         _arguments $styleOpts \
   301   '*:file:_files -W $(_hg_cmd root)'
   346         '(--patch)-p[show patch]' \
   302 }
   347         '(-p)--patch[show patch]' \
   303 
   348         '(--no-merges)-M[do not show merge revisions]' \
   304 _hg_cmd_clone() {
   349         '(-M)--no-merges[do not show merge revisions]' \
   305   _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
   350         '(--newest-first)-n[show newest record first]' \
   306   '(--noupdate)-U[do not update the new working directory]' \
   351         '(-n)--newest-first[show newest record first]' \
   307   '(-U)--noupdate[do not update the new working directory]' \
   352         '*:mercurial repository:_files -/'
   308   '(--rev)-r+[a changeset you would like to have after cloning]:' \
   353     ;;
   309   '(-r)--rev[a changeset you would like to have after cloning]:' \
   354 
   310   '--uncompressed[use uncompressed transfer (fast over LAN)]' \
   355     (import|patch)
   311   ':source repository:_hg_remote' \
   356         _arguments \
   312   ':destination:_files -/'  
   357         '(--strip)-p[directory strip option for patch (default: 1)]:count:' \
   313 }
   358         '(-p)--strip[directory strip option for patch (default: 1)]:count:' \
   314 
   359         '(--force)-f[skip check for outstanding uncommitted changes]' \
   315 _hg_cmd_commit() {
   360         '(-f)--force[skip check for outstanding uncommitted changes]' \
   316   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
   361         '(--base)-b[base directory to read patches from]:file:_files -W $(_hg_cmd root) -/' \
   317   '(--addremove)-A[mark new/missing files as added/removed before committing]'
   362         '(-b)--base[base directory to read patches from]:file:_files -W $(_hg_cmd root) -/' \
   318   '(-A)--addremove[mark new/missing files as added/removed before committing]'
   363         '*:patch file:_files'
   319   '(--message)-m+[use <text> as commit message]:text:' \
   364     ;;
   320   '(-m)--message[use <text> as commit message]:text:' \
   365 
   321   '(--logfile)-l+[read commit message from <file>]:.log file:_file -g \*.txt' \
   366     (pull)
   322   '(-l)--logfile[read commit message from <file>]:.log file:_file -g \*.txt' \
   367         repos=( $(_hg_cmd paths | sed -e 's/^.*= //') )
   323   '(--date)-d+[record datecode as commit date]:date code:' \
   368         _arguments \
   324   '(-d)--date[record datecode as commit date]:date code:' \
   369         '(--update)-u[update working directory to tip after pull]' \
   325   '(--user)-u+[record user as commiter]:user:' \
   370         '(-u)--update[update working directory to tip after pull]' \
   326   '(-u)--user[record user as commiter]:user:' \
   371         '(--ssh)-e[specify ssh command to use]:ssh command:' \
   327   '*:file:_files -W $(_hg_cmd root)'
   372         '(-e)--ssh[specify ssh command to use]:ssh command:' \
   328 }
   373         '--remotecmd[specify hg command to run on the remote side]:remote hg:' \
   329 
   374         '*:local repo:_files -/'
   330 _hg_cmd_copy() {
   375         _wanted source expl 'source repository' compadd -a repos
   331   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
   376     ;;
   332   '(--after)-A[record a copy that has already occurred]' \
   377 
   333   '(-A)--after[record a copy that has already occurred]' \
   378     (outgoing)
   334   '(--force)-f[forcibly copy over an existing managed file]' \
   379         _arguments $styleOpts \
   335   '(-f)--force[forcibly copy over an existing managed file]' \
   380         '(--patch)-p[show patch]' \
   336   '*:file:_files -W $(_hg_cmd root)'
   381         '(-p)--patch[show patch]' \
   337 }
   382         '(--no-merges)-M[do not show merge revisions]' \
   338 
   383         '(-M)--no-merges[do not show merge revisions]' \
   339 _hg_cmd_diff() {
   384         '(--newest-first)-n[show newest record first]' \
   340   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_diff_opts \
   385         '(-n)--newest-first[show newest record first]' \
   341   '*'{-r,--rev}'+[revision]:revision:_hg_tags ' \
   386         '*:local repo:_files -/'
   342   '(--show-function)-p[show which function each change is in]' \
   387         _wanted source expl 'source repository' compadd -a repos
   343   '(-p)--show-function[show which function each change is in]' \
   388     ;;
   344   '(--ignore-all-space)-w[ignore white space when comparing lines]' \
   389 
   345   '(-w)--ignore-all-space[ignore white space when comparing lines]' \
   390     (export)
   346   '(--ignore-space-change)-b[ignore changes in the amount of white space]' \
   391         _arguments \
   347   '(-b)--ignore-space-change[ignore changes in the amount of white space]' \
   392         '(--outout)-o[print output to file with formatted name]:filespec:' \
   348   '(--ignore-blank-lines)-B[ignore changes whose lines are all blank]' \
   393         '(-o)--output[print output to file with formatted name]:filespec:' \
   349   '(-B)--ignore-blank-lines[ignore changes whose lines are all blank]' \
   394         '(--text)-a[treat all files as text]' \
   350   '*:file:_files -W $(_hg_cmd root)'
   395         '(-a)--text[treat all files as text]' \
   351 }
   396         '*:revision:->revs'
   352 
   397         _wanted revs expl 'revision or tag' compadd -a tags
   353 _hg_cmd_export() {
   398     ;;
   354   _arguments -s -w : $_hg_global_opts $_hg_diff_opts \
   399 
   355   '(--outout)-o+[print output to file with formatted name]:filespec:' \
   400     (push)
   356   '(-o)--output[print output to file with formatted name]:filespec:' \
   401         repos=( $(_hg_cmd paths | sed -e 's/^.*= //') )
   357   '--switch-parent[diff against the second parent]' \
   402         _arguments \
   358   '*:revision:_hg_tags'
   403         '(--force)-f[force push]' \
   359 }
   404         '(-f)--force[force push]' \
   360 
   405         '(--ssh)-e[specify ssh command to use]:ssh command:' \
   361 _hg_cmd_grep() {
   406         '(-e)--ssh[specify ssh command to use]:ssh command:' \
   362   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
   407         '--remotecmd[specify hg command to run on the remote side]:remote hg:' \
   363   '(-print0)-0[end filenames with NUL]' \
   408         '*:local repo:_files -/'
   364   '(-0)--print0[end filenames with NUL]' \
   409         _wanted source expl 'source repository' compadd -a repos
   365   '--all[print all revisions with matches]' \
   410     ;;
   366   '(--follow)-f[follow changeset or file history]' \
   411 
   367   '(-f)--follow[follow changeset or file history]' \
   412     (serve)
   368   '(--ignore-case)-i[ignore case when matching]' \
   413         _arguments \
   369   '(-i)--ignore-case[ignore case when matching]' \
   414         '(--accesslog)-A[name of access log file]:log file:_files' \
   370   '(--files-with-matches)-l[print only filenames and revs that match]' \
   415         '(-A)--accesslog[name of access log file]:log file:_files' \
   371   '(-l)--files-with-matches[print only filenames and revs that match]' \
   416         '(--errorlog)-E[name of error log file]:log file:_files' \
   372   '(--line-number)-n[print matching line numbers]' \
   417         '(-E)--errorlog[name of error log file]:log file:_files' \
   373   '(-n)--line-number[print matching line numbers]' \
   418         '(--port)-p[listen port]:listen port:' \
   374   '*-r+[search in given revision range]:revision:_hg_tags' \
   419         '(-p)--port[listen port]:listen port:' \
   375   '*--rev[search in given revision range]:revision:_hg_tags' \
   420         '(--address)-a[interface address]:interface address:' \
   376   '(--user)-u[print user who committed change]' \
   421         '(-a)--address[interface address]:interface address:' \
   377   '(-u)--user[print user who committed change]' \
   422         '(--name)-n[name to show in web pages]:repository name:' \
   378   '*:search pattern:_files -W $(_hg_cmd root)'
   423         '(-n)--name[name to show in web pages]:repository name:' \
   379 }
   424         '(--templates)-t[web template directory]:template dir:_files -/' \
   380 
   425         '(-t)--templates[web template directory]:template dir:_files -/' \
   381 _hg_cmd_heads() {
   426         '--style[web template style]:style' \
   382   _arguments -s -w : $_hg_global_opts $_hg_style_opts \
   427         '--stdio[for remote clients]' \
   383   '(--rev)-r+[show only heads which are descendants of rev]:revision:_hg_tags' \
   428         '(--ipv6)-6[use IPv6 in addition to IPv4]' \
   384   '(-r)--rev[show only heads which are descendants of rev]:revision:_hg_tags'
   429         '(-6)--ipv6[use IPv6 in addition to IPv4]'
   385 }
   430     ;;
   386 
   431 
   387 _hg_cmd_help() {
   432     (help)
   388   _arguments -s -w : $_hg_global_opts \
   433         _wanted commands expl 'hg command' compadd -a _hg_commands
   389   '*:mercurial command:_hg_commands'
   434     ;;
   390 }
   435 
   391 
   436     (heads)
   392 _hg_cmd_import() {
   437         _arguments $styleOpts \
   393   _arguments -s -w : $_hg_global_opts \
   438         '(--branches)-b[find branch info]' \
   394   '(--strip)-p+[directory strip option for patch (default: 1)]:count:' \
   439         '(-b)--branches[find branch info]'
   395   '(-p)--strip[directory strip option for patch (default: 1)]:count:' \
   440     ;;
   396   '(--message)-m+[use <text> as commit message]:text:' \
   441 
   397   '(-m)--message[use <text> as commit message]:text:' \
   442     (paths)
   398   '(--force)-f[skip check for outstanding uncommitted changes]' \
   443         _arguments '*:symbolic name:(default default-push)'
   399   '(-f)--force[skip check for outstanding uncommitted changes]' \
   444     ;;
   400   '*:patch:_files'
   445 
   401 }
   446     (init)
   402 
   447         _arguments '*:new repo directory:_files -/'
   403 _hg_cmd_incoming() {
   448     ;;
   404   _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_style_opts \
   449 
   405   '(--no-merges)-M[do not show merge revisions]' \
   450     (manifest)
   406   '(-M)--no-merges[do not show merge revisions]' \
   451         _arguments '*:revision:->tags'
   407   '(--force)-f[run even when the remote repository is unrelated]' \
   452     ;;
   408   '(-f)--force[run even when the remote repository is unrelated]' \
   453 
   409   '(--patch)-p[show patch]' \
   454     (par*)
   410   '(-p)--patch[show patch]' \
   455         _arguments $styleOpts \
   411   '(--rev)-r+[a specific revision up to which you would like to pull]' \
   456         '(--rev 1)-r[show parents of the specified rev]:revision:->tags' \
   412   '(-r)--rev[a specific revision up to which you would like to pull]' \
   457         '(-r 1)--rev[show parents of the specified rev]:revision:->tags' \
   413   '(--newest-first)-n[show newest record first]' \
   458 	'::revision:->tags'
   414   '(-n)--newest-first[show newest record first]' \
   459     ;;
   415   '--bundle[file to store the bundles into]:bundle file:_files' \
   460 
   416   ':source:_hg_remote'
   461     (identify|recover|root|undo|verify|version|ct|tags)
   417 }
   462         # no arguments for these commands
   418 
   463     ;;
   419 _hg_cmd_init() {
   464 
   420   _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
   465     # HGK
   421   ':dir:_files -/'
   466     (vi*)
   422 }
   467         _arguments \
   423 
   468         '(--limit)-l[limit number of changes displayed]:' \
   424 _hg_cmd_locate() {
   469         '(-l)--limit[limit number of changes displayed]:' \
   425   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
   470         '::revision range:->tags'
   426   '(--rev)-r+[search repository as it stood at revision]:revision:_hg_tags' \
   471     ;;
   427   '(-r)--rev[search repository as it stood at revision]:revision:_hg_tags' \
   472 
   428   '(--print0)-0[end filenames with NUL, for use with xargs]' \
   473     # MQ commands
   429   '(-0)--print0[end filenames with NUL, for use with xargs]' \
   474     (qdel*|qrm|qrem*)
   430   '(--fullpath)-f[print complete paths]' \
   475         _arguments \
   431   '(-f)--fullpath[print complete paths]' \
   476             {-k,--keep}'[keep patch file]' \
   432   '*:search pattern:_files -W $(_hg_cmd root)'
   477             {-r,--rev}'[revision]:applied patch:->qapplied' \
   433 }
   478             '*:unapplied patches:->qunapplied'
   434 
   479     ;;
   435 _hg_cmd_log() {
   480 
   436   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_style_opts \
   481     (qnew)
   437   '(--follow --follow-first)-f[follow changeset or history]' \
   482         _arguments $commitMessage \
   438   '(-f --follow-first)--follow[follow changeset or history]' \
   483             {-f,--force}'[import uncommitted changes into patch]' \
   439   '(-f --follow)--follow-first[only follow the first parent of merge changesets]' \
   484             ':patch name:'
   440   '(--copies)-C[show copied files]' \
   485     ;;
   441   '(-C)--copies[show copied files]' \
   486 
   442   '(--keyword)-k+[search for a keyword]:' \
   487     (qpo*)
   443   '(-k)--keyword[search for a keyword]:' \
   488         _arguments \
   444   '(--limit)-l+[limit number of changes displayed]:' \
   489             (1){-a,--all}'[pop all patches]' \
   445   '(-l)--limit[limit number of changes displayed]:' \
   490             {-f,--force}'[forget any local changes]' \
   446   '*'{-r,--rev}'[show the specified revision or range]:revision:_hg_tags' \
   491             ':applied patch:->qapplied'
   447   '(--no-merges)-M[do not show merges]' \
   492     ;;
   448   '(-M)--no-merges[do not show merges]' \
   493 
   449   '(--only-merges)-m[show only merges]' \
   494     (qpu*)
   450   '(-m)--only-merges[show only merges]' \
   495         _arguments \
   451   '(--patch)-p[show patch]' \
   496             (1){-a,--all}'[apply all patches]' \
   452   '(-p)--patch[show patch]' \
   497             {-f,--force}'[apply if the patch has rejects]' \
   453   '(--prune)-P+[do not display revision or any of its ancestors]:revision:_hg_tags' \
   498             ':unapplied patch:->qunapplied'
   454   '(-P)--prune[do not display revision or any of its ancestors]:revision:_hg_tags' \
   499     ;;
   455   '*:files:_files -W $(_hg_cmd root)'
   500     (qref*)
   456 }
   501         _arguments $commitMessage $includeExclude \
   457 
   502             {-g,--git}'[use git extended diff format]' \
   458 _hg_cmd_manifest() {
   503             {-s,--short}'[short refresh]'
   459   _arguments -s -w : $_hg_global_opts \
   504     ;;
   460   ':revision:_hg_tags'
   505 
   461 }
   506     (*)
   462 
   507         _message "unknown hg command completion: $service"
   463 _hg_cmd_outgoing() {
   508     ;;
   464   _arguments -s -w : $_hg_global_opts $_hg_remote_opts $_hg_style_opts \
   509 esac
   465   '(--no-merges)-M[do not show merge revisions]' \
   510 
   466   '(-M)--no-merges[do not show merge revisions]' \
   511 _hg_state
   467   '(--force)-f[run even when the remote repository is unrelated]' \
       
   468   '(-f)--force[run even when the remote repository is unrelated]' \
       
   469   '(--patch)-p[show patch]' \
       
   470   '(-p)--patch[show patch]' \
       
   471   '(--rev)-r+[a specific revision you would like to push]' \
       
   472   '(-r)--rev[a specific revision you would like to push]' \
       
   473   '(--newest-first)-n[show newest record first]' \
       
   474   '(-n)--newest-first[show newest record first]' \
       
   475   ':destination:_hg_remote'
       
   476 }
       
   477 
       
   478 _hg_cmd_parents() {
       
   479   _arguments -s -w : $_hg_global_opts $_hg_style_opts \
       
   480   '(--rev)-r[show parents of the specified rev]:revision:_hg_tags' \
       
   481   '(-r)--rev[show parents of the specified rev]:revision:_hg_tags' \
       
   482   ':revision:_hg_tags'
       
   483 }
       
   484 
       
   485 _hg_cmd_paths() {
       
   486   _arguments -s -w : $_hg_global_opts \
       
   487   ':path:_hg_paths'
       
   488 }
       
   489 
       
   490 _hg_cmd_pull() {
       
   491   _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
       
   492   '(--force)-f[run even when the remote repository is unrelated]' \
       
   493   '(-f)--force[run even when the remote repository is unrelated]' \
       
   494   '(--update)-u[update to new tip if changesets were pulled]' \
       
   495   '(-u)--update[update to new tip if changesets were pulled]' \
       
   496   ':source:_hg_remote'
       
   497 }
       
   498 
       
   499 _hg_cmd_push() {
       
   500   _arguments -s -w : $_hg_global_opts $_hg_remote_opts \
       
   501   '(--force)-f[force push]' \
       
   502   '(-f)--force[force push]' \
       
   503   '(--rev)-r+[a specific revision you would like to push]' \
       
   504   '(-r)--rev[a specific revision you would like to push]' \
       
   505   ':destination:_hg_remote'
       
   506 }
       
   507 
       
   508 _hg_cmd_remove() {
       
   509   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
       
   510   '(--after)-A[record remove that has already occurred]' \
       
   511   '(-A)--after[record remove that has already occurred]' \
       
   512   '(--force)-f[remove file even if modified]' \
       
   513   '(-f)--force[remove file even if modified]' \
       
   514   '*:file:_files -W $(_hg_cmd root)'
       
   515 }
       
   516 
       
   517 _hg_cmd_rename() {
       
   518   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
       
   519   '(--after)-A[record a rename that has already occurred]' \
       
   520   '(-A)--after[record a rename that has already occurred]' \
       
   521   '(--force)-f[forcibly copy over an existing managed file]' \
       
   522   '(-f)--force[forcibly copy over an existing managed file]' \
       
   523   '*:file:_files -W $(_hg_cmd root)'
       
   524 }
       
   525 
       
   526 _hg_cmd_revert() {
       
   527   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_dryrun_opts \
       
   528   '(--all :)-a[revert all changes when no arguments given]' \
       
   529   '(-a :)--all[revert all changes when no arguments given]' \
       
   530   '(--rev)-r+[revision to revert to]:revision:_hg_tags' \
       
   531   '(-r)--rev[revision to revert to]:revision:_hg_tags' \
       
   532   '--no-backup[do not save backup copies of files]' \
       
   533   '*:file:_files -W $(_hg_cmd root)'
       
   534 }
       
   535 
       
   536 _hg_cmd_serve() {
       
   537   _arguments -s -w : $_hg_global_opts \
       
   538   '(--accesslog)-A+[name of access log file]:log file:_files' \
       
   539   '(-A)--accesslog[name of access log file]:log file:_files' \
       
   540   '(--errorlog)-E+[name of error log file]:log file:_files' \
       
   541   '(-E)--errorlog[name of error log file]:log file:_files' \
       
   542   '(--daemon)-d[run server in background]' \
       
   543   '(-d)--daemon[run server in background]' \
       
   544   '(--port)-p+[listen port]:listen port:' \
       
   545   '(-p)--port[listen port]:listen port:' \
       
   546   '(--address)-a+[interface address]:interface address:' \
       
   547   '(-a)--address[interface address]:interface address:' \
       
   548   '(--name)-n+[name to show in web pages]:repository name:' \
       
   549   '(-n)--name[name to show in web pages]:repository name:' \
       
   550   '(--templates)-t[web template directory]:template dir:_files -/' \
       
   551   '(-t)--templates[web template directory]:template dir:_files -/' \
       
   552   '--style[web template style]:style' \
       
   553   '--stdio[for remote clients]' \
       
   554   '(--ipv6)-6[use IPv6 in addition to IPv4]' \
       
   555   '(-6)--ipv6[use IPv6 in addition to IPv4]'
       
   556 }
       
   557 
       
   558 _hg_cmd_status() {
       
   559   _arguments -s -w : $_hg_global_opts $_hg_pat_opts \
       
   560   '(--all)-A[show status of all files]' \
       
   561   '(-A)--all[show status of all files]' \
       
   562   '(--modified)-m[show only modified files]' \
       
   563   '(-m)--modified[show only modified files]' \
       
   564   '(--added)-a[show only added files]' \
       
   565   '(-a)--added[show only added files]' \
       
   566   '(--removed)-r[show only removed files]' \
       
   567   '(-r)--removed[show only removed files]' \
       
   568   '(--deleted)-d[show only deleted (but tracked) files]' \
       
   569   '(-d)--deleted[show only deleted (but tracked) files]' \
       
   570   '(--clean)-c[show only files without changes]' \
       
   571   '(-c)--clean[show only files without changes]' \
       
   572   '(--unknown)-u[show only unknown files]' \
       
   573   '(-u)--unknown[show only unknown files]' \
       
   574   '(--ignored)-i[show ignored files]' \
       
   575   '(-i)--ignored[show ignored files]' \
       
   576   '(--no-status)-n[hide status prefix]' \
       
   577   '(-n)--no-status[hide status prefix]' \
       
   578   '(--copies)-C[show source of copied files]' \
       
   579   '(-C)--copies[show source of copied files]' \
       
   580   '(--print0)-0[end filenames with NUL, for use with xargs]' \
       
   581   '(-0)--print0[end filenames with NUL, for use with xargs]' \
       
   582   '--rev[show difference from revision]:revision:_hg_tags' \
       
   583   '*:files:_files'
       
   584 }
       
   585 
       
   586 _hg_cmd_tag() {
       
   587   _arguments -s -w : $_hg_global_opts \
       
   588   '(--local)-l[make the tag local]' \
       
   589   '(-l)--local[make the tag local]' \
       
   590   '(--message)-m+[message for tag commit log entry]:message:' \
       
   591   '(-m)--message[message for tag commit log entry]:message:' \
       
   592   '(--date)-d+[record datecode as commit date]:date code:' \
       
   593   '(-d)--date[record datecode as commit date]:date code:' \
       
   594   '(--user)-u+[record user as commiter]:user:' \
       
   595   '(-u)--user[record user as commiter]:user:' \
       
   596   '(--rev)-r+[revision to tag]:revision:_hg_tags' \
       
   597   '(-r)--rev[revision to tag]:revision:_hg_tags' \
       
   598   ':tag name:'
       
   599 }
       
   600 
       
   601 _hg_cmd_tip() {
       
   602   _arguments -s -w : $_hg_global_opts $_hg_style_opts \
       
   603   '(--patch)-p[show patch]' \
       
   604   '(-p)--patch[show patch]'
       
   605 }
       
   606 
       
   607 _hg_cmd_unbundle() {
       
   608   _arguments -s -w : $_hg_global_opts \
       
   609   '(--update)-u[update to new tip if changesets were unbundled]' \
       
   610   '(-u)--update[update to new tip if changesets were unbundled]' \
       
   611   ':files:_files'
       
   612 }
       
   613 
       
   614 _hg_cmd_update() {
       
   615   _arguments -s -w : $_hg_global_opts \
       
   616   '(--clean)-C[overwrite locally modified files]' \
       
   617   '(-C)--clean[overwrite locally modified files]' \
       
   618   '(--force)-f[force a merge with outstanding changes]' \
       
   619   '(-f)--force[force a merge with outstanding changes]' \
       
   620   ':revision:_hg_tags'
       
   621 }
       
   622 
       
   623 # HGK
       
   624 _hg_cmd_view() {
       
   625   _arguments -s -w : $_hg_global_opts \
       
   626   '(--limit)-l+[limit number of changes displayed]:' \
       
   627   '(-l)--limit[limit number of changes displayed]:' \
       
   628   ':revision range:_hg_tags'
       
   629 }
       
   630 
       
   631 # MQ
       
   632 _hg_cmd_qdelete() {
       
   633   _arguments -s -w : $_hg_global_opts \
       
   634   '(--keep)-k[keep patch file]' \
       
   635   '(-k)--keep[keep patch file]' \
       
   636   '*-r+[stop managing a revision]:applied patch:_hg_qapplied' \
       
   637   '*--revision[stop managing a revision]:applied patch:_hg_qapplied' \
       
   638   '*:patch:_hg_qunapplied'
       
   639 }
       
   640 
       
   641 _hg_cmd_qheader() {
       
   642   _arguments -s -w : $_hg_global_opts \
       
   643   ':patch:_hg_qseries'
       
   644 }
       
   645 
       
   646 _hg_cmd_qnew() {
       
   647   _arguments -s -w : $_hg_global_opts $_hg_commit_opts \
       
   648   '(--force)-f[import uncommitted changes into patch]' \
       
   649   '(-f)--force[import uncommitted changes into patch]' \
       
   650   ':patch:'
       
   651 }
       
   652 
       
   653 _hg_cmd_qpop() {
       
   654   _arguments -s -w : $_hg_global_opts \
       
   655   '(--all :)-a[pop all patches]' \
       
   656   '(-a :)--all[pop all patches]' \
       
   657   '(--name)-n+[queue name to pop]:' \
       
   658   '(-n)--name[queue name to pop]:' \
       
   659   '(--force)-f[forget any local changes]' \
       
   660   '(-f)--force[forget any local changes]' \
       
   661   ':patch:_hg_qapplied'
       
   662 }
       
   663 
       
   664 _hg_cmd_qpush() {
       
   665   _arguments -s -w : $_hg_global_opts \
       
   666   '(--all :)-a[apply all patches]' \
       
   667   '(-a :)--all[apply all patches]' \
       
   668   '(--list)-l[list patch name in commit text]' \
       
   669   '(-l)--list[list patch name in commit text]' \
       
   670   '(--merge)-m+[merge from another queue]:' \
       
   671   '(-m)--merge[merge from another queue]:' \
       
   672   '(--name)-n+[merge queue name]:' \
       
   673   '(-n)--name[merge queue name]:' \
       
   674   '(--force)-f[apply if the patch has rejects]' \
       
   675   '(-f)--force[apply if the patch has rejects]' \
       
   676   ':patch:_hg_qunapplied'
       
   677 }
       
   678 
       
   679 _hg_cmd_qrefresh() {
       
   680   _arguments -s -w : $_hg_global_opts $_hg_pat_opts $_hg_commit_opts \
       
   681   '(--git)-g[use git extended diff format]' \
       
   682   '(-g)--git[use git extended diff format]' \
       
   683   '(--short)-s[short refresh]' \
       
   684   '(-s)--short[short refresh]' \
       
   685   '*:files:_files -W $(_hg_cmd root)'
       
   686 }
       
   687 
       
   688 _hg_cmd_strip() {
       
   689   _arguments -s -w : $_hg_global_opts \
       
   690   '(--force)-f[force multi-head removal]' \
       
   691   '(-f)--force[force multi-head removal]' \
       
   692   '(--backup)-b[bundle unrelated changesets]' \
       
   693   '(-b)--backup[bundle unrelated changesets]' \
       
   694   '(--nobackup)-n[no backups]' \
       
   695   '(-n)--nobackup[no backups]' \
       
   696   ':revision:_hg_tags'
       
   697 }
       
   698 
       
   699 _hg "$@"