completion: use __gitcomp_builtin in _git_am
[git] / contrib / completion / git-completion.bash
1 # bash/zsh completion support for core Git.
2 #
3 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
4 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
5 # Distributed under the GNU General Public License, version 2.0.
6 #
7 # The contained completion routines provide support for completing:
8 #
9 #    *) local and remote branch names
10 #    *) local and remote tag names
11 #    *) .git/remotes file names
12 #    *) git 'subcommands'
13 #    *) git email aliases for git-send-email
14 #    *) tree paths within 'ref:path/to/file' expressions
15 #    *) file paths within current working directory and index
16 #    *) common --long-options
17 #
18 # To use these routines:
19 #
20 #    1) Copy this file to somewhere (e.g. ~/.git-completion.bash).
21 #    2) Add the following line to your .bashrc/.zshrc:
22 #        source ~/.git-completion.bash
23 #    3) Consider changing your PS1 to also show the current branch,
24 #       see git-prompt.sh for details.
25 #
26 # If you use complex aliases of form '!f() { ... }; f', you can use the null
27 # command ':' as the first command in the function body to declare the desired
28 # completion style.  For example '!f() { : git commit ; ... }; f' will
29 # tell the completion to use commit completion.  This also works with aliases
30 # of form "!sh -c '...'".  For example, "!sh -c ': git commit ; ... '".
31 #
32 # You can set the following environment variables to influence the behavior of
33 # the completion routines:
34 #
35 #   GIT_COMPLETION_CHECKOUT_NO_GUESS
36 #
37 #     When set to "1", do not include "DWIM" suggestions in git-checkout
38 #     completion (e.g., completing "foo" when "origin/foo" exists).
39
40 case "$COMP_WORDBREAKS" in
41 *:*) : great ;;
42 *)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
43 esac
44
45 # Discovers the path to the git repository taking any '--git-dir=<path>' and
46 # '-C <path>' options into account and stores it in the $__git_repo_path
47 # variable.
48 __git_find_repo_path ()
49 {
50         if [ -n "$__git_repo_path" ]; then
51                 # we already know where it is
52                 return
53         fi
54
55         if [ -n "${__git_C_args-}" ]; then
56                 __git_repo_path="$(git "${__git_C_args[@]}" \
57                         ${__git_dir:+--git-dir="$__git_dir"} \
58                         rev-parse --absolute-git-dir 2>/dev/null)"
59         elif [ -n "${__git_dir-}" ]; then
60                 test -d "$__git_dir" &&
61                 __git_repo_path="$__git_dir"
62         elif [ -n "${GIT_DIR-}" ]; then
63                 test -d "${GIT_DIR-}" &&
64                 __git_repo_path="$GIT_DIR"
65         elif [ -d .git ]; then
66                 __git_repo_path=.git
67         else
68                 __git_repo_path="$(git rev-parse --git-dir 2>/dev/null)"
69         fi
70 }
71
72 # Deprecated: use __git_find_repo_path() and $__git_repo_path instead
73 # __gitdir accepts 0 or 1 arguments (i.e., location)
74 # returns location of .git repo
75 __gitdir ()
76 {
77         if [ -z "${1-}" ]; then
78                 __git_find_repo_path || return 1
79                 echo "$__git_repo_path"
80         elif [ -d "$1/.git" ]; then
81                 echo "$1/.git"
82         else
83                 echo "$1"
84         fi
85 }
86
87 # Runs git with all the options given as argument, respecting any
88 # '--git-dir=<path>' and '-C <path>' options present on the command line
89 __git ()
90 {
91         git ${__git_C_args:+"${__git_C_args[@]}"} \
92                 ${__git_dir:+--git-dir="$__git_dir"} "$@" 2>/dev/null
93 }
94
95 # The following function is based on code from:
96 #
97 #   bash_completion - programmable completion functions for bash 3.2+
98 #
99 #   Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
100 #             © 2009-2010, Bash Completion Maintainers
101 #                     <bash-completion-devel@lists.alioth.debian.org>
102 #
103 #   This program is free software; you can redistribute it and/or modify
104 #   it under the terms of the GNU General Public License as published by
105 #   the Free Software Foundation; either version 2, or (at your option)
106 #   any later version.
107 #
108 #   This program is distributed in the hope that it will be useful,
109 #   but WITHOUT ANY WARRANTY; without even the implied warranty of
110 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
111 #   GNU General Public License for more details.
112 #
113 #   You should have received a copy of the GNU General Public License
114 #   along with this program; if not, see <http://www.gnu.org/licenses/>.
115 #
116 #   The latest version of this software can be obtained here:
117 #
118 #   http://bash-completion.alioth.debian.org/
119 #
120 #   RELEASE: 2.x
121
122 # This function can be used to access a tokenized list of words
123 # on the command line:
124 #
125 #       __git_reassemble_comp_words_by_ref '=:'
126 #       if test "${words_[cword_-1]}" = -w
127 #       then
128 #               ...
129 #       fi
130 #
131 # The argument should be a collection of characters from the list of
132 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
133 # characters.
134 #
135 # This is roughly equivalent to going back in time and setting
136 # COMP_WORDBREAKS to exclude those characters.  The intent is to
137 # make option types like --date=<type> and <rev>:<path> easy to
138 # recognize by treating each shell word as a single token.
139 #
140 # It is best not to set COMP_WORDBREAKS directly because the value is
141 # shared with other completion scripts.  By the time the completion
142 # function gets called, COMP_WORDS has already been populated so local
143 # changes to COMP_WORDBREAKS have no effect.
144 #
145 # Output: words_, cword_, cur_.
146
147 __git_reassemble_comp_words_by_ref()
148 {
149         local exclude i j first
150         # Which word separators to exclude?
151         exclude="${1//[^$COMP_WORDBREAKS]}"
152         cword_=$COMP_CWORD
153         if [ -z "$exclude" ]; then
154                 words_=("${COMP_WORDS[@]}")
155                 return
156         fi
157         # List of word completion separators has shrunk;
158         # re-assemble words to complete.
159         for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
160                 # Append each nonempty word consisting of just
161                 # word separator characters to the current word.
162                 first=t
163                 while
164                         [ $i -gt 0 ] &&
165                         [ -n "${COMP_WORDS[$i]}" ] &&
166                         # word consists of excluded word separators
167                         [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
168                 do
169                         # Attach to the previous token,
170                         # unless the previous token is the command name.
171                         if [ $j -ge 2 ] && [ -n "$first" ]; then
172                                 ((j--))
173                         fi
174                         first=
175                         words_[$j]=${words_[j]}${COMP_WORDS[i]}
176                         if [ $i = $COMP_CWORD ]; then
177                                 cword_=$j
178                         fi
179                         if (($i < ${#COMP_WORDS[@]} - 1)); then
180                                 ((i++))
181                         else
182                                 # Done.
183                                 return
184                         fi
185                 done
186                 words_[$j]=${words_[j]}${COMP_WORDS[i]}
187                 if [ $i = $COMP_CWORD ]; then
188                         cword_=$j
189                 fi
190         done
191 }
192
193 if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
194 _get_comp_words_by_ref ()
195 {
196         local exclude cur_ words_ cword_
197         if [ "$1" = "-n" ]; then
198                 exclude=$2
199                 shift 2
200         fi
201         __git_reassemble_comp_words_by_ref "$exclude"
202         cur_=${words_[cword_]}
203         while [ $# -gt 0 ]; do
204                 case "$1" in
205                 cur)
206                         cur=$cur_
207                         ;;
208                 prev)
209                         prev=${words_[$cword_-1]}
210                         ;;
211                 words)
212                         words=("${words_[@]}")
213                         ;;
214                 cword)
215                         cword=$cword_
216                         ;;
217                 esac
218                 shift
219         done
220 }
221 fi
222
223 # Fills the COMPREPLY array with prefiltered words without any additional
224 # processing.
225 # Callers must take care of providing only words that match the current word
226 # to be completed and adding any prefix and/or suffix (trailing space!), if
227 # necessary.
228 # 1: List of newline-separated matching completion words, complete with
229 #    prefix and suffix.
230 __gitcomp_direct ()
231 {
232         local IFS=$'\n'
233
234         COMPREPLY=($1)
235 }
236
237 __gitcompappend ()
238 {
239         local x i=${#COMPREPLY[@]}
240         for x in $1; do
241                 if [[ "$x" == "$3"* ]]; then
242                         COMPREPLY[i++]="$2$x$4"
243                 fi
244         done
245 }
246
247 __gitcompadd ()
248 {
249         COMPREPLY=()
250         __gitcompappend "$@"
251 }
252
253 # Generates completion reply, appending a space to possible completion words,
254 # if necessary.
255 # It accepts 1 to 4 arguments:
256 # 1: List of possible completion words.
257 # 2: A prefix to be added to each possible completion word (optional).
258 # 3: Generate possible completion matches for this word (optional).
259 # 4: A suffix to be appended to each possible completion word (optional).
260 __gitcomp ()
261 {
262         local cur_="${3-$cur}"
263
264         case "$cur_" in
265         --*=)
266                 ;;
267         *)
268                 local c i=0 IFS=$' \t\n'
269                 for c in $1; do
270                         c="$c${4-}"
271                         if [[ $c == "$cur_"* ]]; then
272                                 case $c in
273                                 --*=*|*.) ;;
274                                 *) c="$c " ;;
275                                 esac
276                                 COMPREPLY[i++]="${2-}$c"
277                         fi
278                 done
279                 ;;
280         esac
281 }
282
283 # This function is equivalent to
284 #
285 #    __gitcomp "$(git xxx --git-completion-helper) ..."
286 #
287 # except that the output is cached. Accept 1-3 arguments:
288 # 1: the git command to execute, this is also the cache key
289 # 2: extra options to be added on top (e.g. negative forms)
290 # 3: options to be excluded
291 __gitcomp_builtin ()
292 {
293         # spaces must be replaced with underscore for multi-word
294         # commands, e.g. "git remote add" becomes remote_add.
295         local cmd="$1"
296         local incl="$2"
297         local excl="$3"
298
299         local var=__gitcomp_builtin_"${cmd/-/_}"
300         local options
301         eval "options=\$$var"
302
303         if [ -z "$options" ]; then
304                 # leading and trailing spaces are significant to make
305                 # option removal work correctly.
306                 options=" $(__git ${cmd/_/ } --git-completion-helper) $incl "
307                 for i in $excl; do
308                         options="${options/ $i / }"
309                 done
310                 eval "$var=\"$options\""
311         fi
312
313         __gitcomp "$options"
314 }
315
316 # Variation of __gitcomp_nl () that appends to the existing list of
317 # completion candidates, COMPREPLY.
318 __gitcomp_nl_append ()
319 {
320         local IFS=$'\n'
321         __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }"
322 }
323
324 # Generates completion reply from newline-separated possible completion words
325 # by appending a space to all of them.
326 # It accepts 1 to 4 arguments:
327 # 1: List of possible completion words, separated by a single newline.
328 # 2: A prefix to be added to each possible completion word (optional).
329 # 3: Generate possible completion matches for this word (optional).
330 # 4: A suffix to be appended to each possible completion word instead of
331 #    the default space (optional).  If specified but empty, nothing is
332 #    appended.
333 __gitcomp_nl ()
334 {
335         COMPREPLY=()
336         __gitcomp_nl_append "$@"
337 }
338
339 # Generates completion reply with compgen from newline-separated possible
340 # completion filenames.
341 # It accepts 1 to 3 arguments:
342 # 1: List of possible completion filenames, separated by a single newline.
343 # 2: A directory prefix to be added to each possible completion filename
344 #    (optional).
345 # 3: Generate possible completion matches for this word (optional).
346 __gitcomp_file ()
347 {
348         local IFS=$'\n'
349
350         # XXX does not work when the directory prefix contains a tilde,
351         # since tilde expansion is not applied.
352         # This means that COMPREPLY will be empty and Bash default
353         # completion will be used.
354         __gitcompadd "$1" "${2-}" "${3-$cur}" ""
355
356         # use a hack to enable file mode in bash < 4
357         compopt -o filenames +o nospace 2>/dev/null ||
358         compgen -f /non-existing-dir/ > /dev/null
359 }
360
361 # Execute 'git ls-files', unless the --committable option is specified, in
362 # which case it runs 'git diff-index' to find out the files that can be
363 # committed.  It return paths relative to the directory specified in the first
364 # argument, and using the options specified in the second argument.
365 __git_ls_files_helper ()
366 {
367         if [ "$2" == "--committable" ]; then
368                 __git -C "$1" diff-index --name-only --relative HEAD
369         else
370                 # NOTE: $2 is not quoted in order to support multiple options
371                 __git -C "$1" ls-files --exclude-standard $2
372         fi
373 }
374
375
376 # __git_index_files accepts 1 or 2 arguments:
377 # 1: Options to pass to ls-files (required).
378 # 2: A directory path (optional).
379 #    If provided, only files within the specified directory are listed.
380 #    Sub directories are never recursed.  Path must have a trailing
381 #    slash.
382 __git_index_files ()
383 {
384         local root="${2-.}" file
385
386         __git_ls_files_helper "$root" "$1" |
387         while read -r file; do
388                 case "$file" in
389                 ?*/*) echo "${file%%/*}" ;;
390                 *) echo "$file" ;;
391                 esac
392         done | sort | uniq
393 }
394
395 # Lists branches from the local repository.
396 # 1: A prefix to be added to each listed branch (optional).
397 # 2: List only branches matching this word (optional; list all branches if
398 #    unset or empty).
399 # 3: A suffix to be appended to each listed branch (optional).
400 __git_heads ()
401 {
402         local pfx="${1-}" cur_="${2-}" sfx="${3-}"
403
404         __git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
405                         "refs/heads/$cur_*" "refs/heads/$cur_*/**"
406 }
407
408 # Lists tags from the local repository.
409 # Accepts the same positional parameters as __git_heads() above.
410 __git_tags ()
411 {
412         local pfx="${1-}" cur_="${2-}" sfx="${3-}"
413
414         __git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
415                         "refs/tags/$cur_*" "refs/tags/$cur_*/**"
416 }
417
418 # Lists refs from the local (by default) or from a remote repository.
419 # It accepts 0, 1 or 2 arguments:
420 # 1: The remote to list refs from (optional; ignored, if set but empty).
421 #    Can be the name of a configured remote, a path, or a URL.
422 # 2: In addition to local refs, list unique branches from refs/remotes/ for
423 #    'git checkout's tracking DWIMery (optional; ignored, if set but empty).
424 # 3: A prefix to be added to each listed ref (optional).
425 # 4: List only refs matching this word (optional; list all refs if unset or
426 #    empty).
427 # 5: A suffix to be appended to each listed ref (optional; ignored, if set
428 #    but empty).
429 #
430 # Use __git_complete_refs() instead.
431 __git_refs ()
432 {
433         local i hash dir track="${2-}"
434         local list_refs_from=path remote="${1-}"
435         local format refs
436         local pfx="${3-}" cur_="${4-$cur}" sfx="${5-}"
437         local match="${4-}"
438         local fer_pfx="${pfx//\%/%%}" # "escape" for-each-ref format specifiers
439
440         __git_find_repo_path
441         dir="$__git_repo_path"
442
443         if [ -z "$remote" ]; then
444                 if [ -z "$dir" ]; then
445                         return
446                 fi
447         else
448                 if __git_is_configured_remote "$remote"; then
449                         # configured remote takes precedence over a
450                         # local directory with the same name
451                         list_refs_from=remote
452                 elif [ -d "$remote/.git" ]; then
453                         dir="$remote/.git"
454                 elif [ -d "$remote" ]; then
455                         dir="$remote"
456                 else
457                         list_refs_from=url
458                 fi
459         fi
460
461         if [ "$list_refs_from" = path ]; then
462                 if [[ "$cur_" == ^* ]]; then
463                         pfx="$pfx^"
464                         fer_pfx="$fer_pfx^"
465                         cur_=${cur_#^}
466                         match=${match#^}
467                 fi
468                 case "$cur_" in
469                 refs|refs/*)
470                         format="refname"
471                         refs=("$match*" "$match*/**")
472                         track=""
473                         ;;
474                 *)
475                         for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
476                                 case "$i" in
477                                 $match*)
478                                         if [ -e "$dir/$i" ]; then
479                                                 echo "$pfx$i$sfx"
480                                         fi
481                                         ;;
482                                 esac
483                         done
484                         format="refname:strip=2"
485                         refs=("refs/tags/$match*" "refs/tags/$match*/**"
486                                 "refs/heads/$match*" "refs/heads/$match*/**"
487                                 "refs/remotes/$match*" "refs/remotes/$match*/**")
488                         ;;
489                 esac
490                 __git_dir="$dir" __git for-each-ref --format="$fer_pfx%($format)$sfx" \
491                         "${refs[@]}"
492                 if [ -n "$track" ]; then
493                         # employ the heuristic used by git checkout
494                         # Try to find a remote branch that matches the completion word
495                         # but only output if the branch name is unique
496                         __git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
497                                 --sort="refname:strip=3" \
498                                 "refs/remotes/*/$match*" "refs/remotes/*/$match*/**" | \
499                         uniq -u
500                 fi
501                 return
502         fi
503         case "$cur_" in
504         refs|refs/*)
505                 __git ls-remote "$remote" "$match*" | \
506                 while read -r hash i; do
507                         case "$i" in
508                         *^{}) ;;
509                         *) echo "$pfx$i$sfx" ;;
510                         esac
511                 done
512                 ;;
513         *)
514                 if [ "$list_refs_from" = remote ]; then
515                         case "HEAD" in
516                         $match*)        echo "${pfx}HEAD$sfx" ;;
517                         esac
518                         __git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
519                                 "refs/remotes/$remote/$match*" \
520                                 "refs/remotes/$remote/$match*/**"
521                 else
522                         local query_symref
523                         case "HEAD" in
524                         $match*)        query_symref="HEAD" ;;
525                         esac
526                         __git ls-remote "$remote" $query_symref \
527                                 "refs/tags/$match*" "refs/heads/$match*" \
528                                 "refs/remotes/$match*" |
529                         while read -r hash i; do
530                                 case "$i" in
531                                 *^{})   ;;
532                                 refs/*) echo "$pfx${i#refs/*/}$sfx" ;;
533                                 *)      echo "$pfx$i$sfx" ;;  # symbolic refs
534                                 esac
535                         done
536                 fi
537                 ;;
538         esac
539 }
540
541 # Completes refs, short and long, local and remote, symbolic and pseudo.
542 #
543 # Usage: __git_complete_refs [<option>]...
544 # --remote=<remote>: The remote to list refs from, can be the name of a
545 #                    configured remote, a path, or a URL.
546 # --track: List unique remote branches for 'git checkout's tracking DWIMery.
547 # --pfx=<prefix>: A prefix to be added to each ref.
548 # --cur=<word>: The current ref to be completed.  Defaults to the current
549 #               word to be completed.
550 # --sfx=<suffix>: A suffix to be appended to each ref instead of the default
551 #                 space.
552 __git_complete_refs ()
553 {
554         local remote track pfx cur_="$cur" sfx=" "
555
556         while test $# != 0; do
557                 case "$1" in
558                 --remote=*)     remote="${1##--remote=}" ;;
559                 --track)        track="yes" ;;
560                 --pfx=*)        pfx="${1##--pfx=}" ;;
561                 --cur=*)        cur_="${1##--cur=}" ;;
562                 --sfx=*)        sfx="${1##--sfx=}" ;;
563                 *)              return 1 ;;
564                 esac
565                 shift
566         done
567
568         __gitcomp_direct "$(__git_refs "$remote" "$track" "$pfx" "$cur_" "$sfx")"
569 }
570
571 # __git_refs2 requires 1 argument (to pass to __git_refs)
572 # Deprecated: use __git_complete_fetch_refspecs() instead.
573 __git_refs2 ()
574 {
575         local i
576         for i in $(__git_refs "$1"); do
577                 echo "$i:$i"
578         done
579 }
580
581 # Completes refspecs for fetching from a remote repository.
582 # 1: The remote repository.
583 # 2: A prefix to be added to each listed refspec (optional).
584 # 3: The ref to be completed as a refspec instead of the current word to be
585 #    completed (optional)
586 # 4: A suffix to be appended to each listed refspec instead of the default
587 #    space (optional).
588 __git_complete_fetch_refspecs ()
589 {
590         local i remote="$1" pfx="${2-}" cur_="${3-$cur}" sfx="${4- }"
591
592         __gitcomp_direct "$(
593                 for i in $(__git_refs "$remote" "" "" "$cur_") ; do
594                         echo "$pfx$i:$i$sfx"
595                 done
596                 )"
597 }
598
599 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
600 __git_refs_remotes ()
601 {
602         local i hash
603         __git ls-remote "$1" 'refs/heads/*' | \
604         while read -r hash i; do
605                 echo "$i:refs/remotes/$1/${i#refs/heads/}"
606         done
607 }
608
609 __git_remotes ()
610 {
611         __git_find_repo_path
612         test -d "$__git_repo_path/remotes" && ls -1 "$__git_repo_path/remotes"
613         __git remote
614 }
615
616 # Returns true if $1 matches the name of a configured remote, false otherwise.
617 __git_is_configured_remote ()
618 {
619         local remote
620         for remote in $(__git_remotes); do
621                 if [ "$remote" = "$1" ]; then
622                         return 0
623                 fi
624         done
625         return 1
626 }
627
628 __git_list_merge_strategies ()
629 {
630         git merge -s help 2>&1 |
631         sed -n -e '/[Aa]vailable strategies are: /,/^$/{
632                 s/\.$//
633                 s/.*://
634                 s/^[    ]*//
635                 s/[     ]*$//
636                 p
637         }'
638 }
639
640 __git_merge_strategies=
641 # 'git merge -s help' (and thus detection of the merge strategy
642 # list) fails, unfortunately, if run outside of any git working
643 # tree.  __git_merge_strategies is set to the empty string in
644 # that case, and the detection will be repeated the next time it
645 # is needed.
646 __git_compute_merge_strategies ()
647 {
648         test -n "$__git_merge_strategies" ||
649         __git_merge_strategies=$(__git_list_merge_strategies)
650 }
651
652 __git_complete_revlist_file ()
653 {
654         local pfx ls ref cur_="$cur"
655         case "$cur_" in
656         *..?*:*)
657                 return
658                 ;;
659         ?*:*)
660                 ref="${cur_%%:*}"
661                 cur_="${cur_#*:}"
662                 case "$cur_" in
663                 ?*/*)
664                         pfx="${cur_%/*}"
665                         cur_="${cur_##*/}"
666                         ls="$ref:$pfx"
667                         pfx="$pfx/"
668                         ;;
669                 *)
670                         ls="$ref"
671                         ;;
672                 esac
673
674                 case "$COMP_WORDBREAKS" in
675                 *:*) : great ;;
676                 *)   pfx="$ref:$pfx" ;;
677                 esac
678
679                 __gitcomp_nl "$(__git ls-tree "$ls" \
680                                 | sed '/^100... blob /{
681                                            s,^.*        ,,
682                                            s,$, ,
683                                        }
684                                        /^120000 blob /{
685                                            s,^.*        ,,
686                                            s,$, ,
687                                        }
688                                        /^040000 tree /{
689                                            s,^.*        ,,
690                                            s,$,/,
691                                        }
692                                        s/^.*    //')" \
693                         "$pfx" "$cur_" ""
694                 ;;
695         *...*)
696                 pfx="${cur_%...*}..."
697                 cur_="${cur_#*...}"
698                 __git_complete_refs --pfx="$pfx" --cur="$cur_"
699                 ;;
700         *..*)
701                 pfx="${cur_%..*}.."
702                 cur_="${cur_#*..}"
703                 __git_complete_refs --pfx="$pfx" --cur="$cur_"
704                 ;;
705         *)
706                 __git_complete_refs
707                 ;;
708         esac
709 }
710
711
712 # __git_complete_index_file requires 1 argument:
713 # 1: the options to pass to ls-file
714 #
715 # The exception is --committable, which finds the files appropriate commit.
716 __git_complete_index_file ()
717 {
718         local pfx="" cur_="$cur"
719
720         case "$cur_" in
721         ?*/*)
722                 pfx="${cur_%/*}"
723                 cur_="${cur_##*/}"
724                 pfx="${pfx}/"
725                 ;;
726         esac
727
728         __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
729 }
730
731 __git_complete_file ()
732 {
733         __git_complete_revlist_file
734 }
735
736 __git_complete_revlist ()
737 {
738         __git_complete_revlist_file
739 }
740
741 __git_complete_remote_or_refspec ()
742 {
743         local cur_="$cur" cmd="${words[1]}"
744         local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
745         if [ "$cmd" = "remote" ]; then
746                 ((c++))
747         fi
748         while [ $c -lt $cword ]; do
749                 i="${words[c]}"
750                 case "$i" in
751                 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
752                 -d|--delete) [ "$cmd" = "push" ] && lhs=0 ;;
753                 --all)
754                         case "$cmd" in
755                         push) no_complete_refspec=1 ;;
756                         fetch)
757                                 return
758                                 ;;
759                         *) ;;
760                         esac
761                         ;;
762                 -*) ;;
763                 *) remote="$i"; break ;;
764                 esac
765                 ((c++))
766         done
767         if [ -z "$remote" ]; then
768                 __gitcomp_nl "$(__git_remotes)"
769                 return
770         fi
771         if [ $no_complete_refspec = 1 ]; then
772                 return
773         fi
774         [ "$remote" = "." ] && remote=
775         case "$cur_" in
776         *:*)
777                 case "$COMP_WORDBREAKS" in
778                 *:*) : great ;;
779                 *)   pfx="${cur_%%:*}:" ;;
780                 esac
781                 cur_="${cur_#*:}"
782                 lhs=0
783                 ;;
784         +*)
785                 pfx="+"
786                 cur_="${cur_#+}"
787                 ;;
788         esac
789         case "$cmd" in
790         fetch)
791                 if [ $lhs = 1 ]; then
792                         __git_complete_fetch_refspecs "$remote" "$pfx" "$cur_"
793                 else
794                         __git_complete_refs --pfx="$pfx" --cur="$cur_"
795                 fi
796                 ;;
797         pull|remote)
798                 if [ $lhs = 1 ]; then
799                         __git_complete_refs --remote="$remote" --pfx="$pfx" --cur="$cur_"
800                 else
801                         __git_complete_refs --pfx="$pfx" --cur="$cur_"
802                 fi
803                 ;;
804         push)
805                 if [ $lhs = 1 ]; then
806                         __git_complete_refs --pfx="$pfx" --cur="$cur_"
807                 else
808                         __git_complete_refs --remote="$remote" --pfx="$pfx" --cur="$cur_"
809                 fi
810                 ;;
811         esac
812 }
813
814 __git_complete_strategy ()
815 {
816         __git_compute_merge_strategies
817         case "$prev" in
818         -s|--strategy)
819                 __gitcomp "$__git_merge_strategies"
820                 return 0
821         esac
822         case "$cur" in
823         --strategy=*)
824                 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
825                 return 0
826                 ;;
827         esac
828         return 1
829 }
830
831 __git_commands () {
832         if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
833         then
834                 printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
835         else
836                 git help -a|egrep '^  [a-zA-Z0-9]'
837         fi
838 }
839
840 __git_list_all_commands ()
841 {
842         local i IFS=" "$'\n'
843         for i in $(__git_commands)
844         do
845                 case $i in
846                 *--*)             : helper pattern;;
847                 *) echo $i;;
848                 esac
849         done
850 }
851
852 __git_all_commands=
853 __git_compute_all_commands ()
854 {
855         test -n "$__git_all_commands" ||
856         __git_all_commands=$(__git_list_all_commands)
857 }
858
859 __git_list_porcelain_commands ()
860 {
861         local i IFS=" "$'\n'
862         __git_compute_all_commands
863         for i in $__git_all_commands
864         do
865                 case $i in
866                 *--*)             : helper pattern;;
867                 applymbox)        : ask gittus;;
868                 applypatch)       : ask gittus;;
869                 archimport)       : import;;
870                 cat-file)         : plumbing;;
871                 check-attr)       : plumbing;;
872                 check-ignore)     : plumbing;;
873                 check-mailmap)    : plumbing;;
874                 check-ref-format) : plumbing;;
875                 checkout-index)   : plumbing;;
876                 column)           : internal helper;;
877                 commit-tree)      : plumbing;;
878                 count-objects)    : infrequent;;
879                 credential)       : credentials;;
880                 credential-*)     : credentials helper;;
881                 cvsexportcommit)  : export;;
882                 cvsimport)        : import;;
883                 cvsserver)        : daemon;;
884                 daemon)           : daemon;;
885                 diff-files)       : plumbing;;
886                 diff-index)       : plumbing;;
887                 diff-tree)        : plumbing;;
888                 fast-import)      : import;;
889                 fast-export)      : export;;
890                 fsck-objects)     : plumbing;;
891                 fetch-pack)       : plumbing;;
892                 fmt-merge-msg)    : plumbing;;
893                 for-each-ref)     : plumbing;;
894                 hash-object)      : plumbing;;
895                 http-*)           : transport;;
896                 index-pack)       : plumbing;;
897                 init-db)          : deprecated;;
898                 local-fetch)      : plumbing;;
899                 ls-files)         : plumbing;;
900                 ls-remote)        : plumbing;;
901                 ls-tree)          : plumbing;;
902                 mailinfo)         : plumbing;;
903                 mailsplit)        : plumbing;;
904                 merge-*)          : plumbing;;
905                 mktree)           : plumbing;;
906                 mktag)            : plumbing;;
907                 pack-objects)     : plumbing;;
908                 pack-redundant)   : plumbing;;
909                 pack-refs)        : plumbing;;
910                 parse-remote)     : plumbing;;
911                 patch-id)         : plumbing;;
912                 prune)            : plumbing;;
913                 prune-packed)     : plumbing;;
914                 quiltimport)      : import;;
915                 read-tree)        : plumbing;;
916                 receive-pack)     : plumbing;;
917                 remote-*)         : transport;;
918                 rerere)           : plumbing;;
919                 rev-list)         : plumbing;;
920                 rev-parse)        : plumbing;;
921                 runstatus)        : plumbing;;
922                 sh-setup)         : internal;;
923                 shell)            : daemon;;
924                 show-ref)         : plumbing;;
925                 send-pack)        : plumbing;;
926                 show-index)       : plumbing;;
927                 ssh-*)            : transport;;
928                 stripspace)       : plumbing;;
929                 symbolic-ref)     : plumbing;;
930                 unpack-file)      : plumbing;;
931                 unpack-objects)   : plumbing;;
932                 update-index)     : plumbing;;
933                 update-ref)       : plumbing;;
934                 update-server-info) : daemon;;
935                 upload-archive)   : plumbing;;
936                 upload-pack)      : plumbing;;
937                 write-tree)       : plumbing;;
938                 var)              : infrequent;;
939                 verify-pack)      : infrequent;;
940                 verify-tag)       : plumbing;;
941                 *) echo $i;;
942                 esac
943         done
944 }
945
946 __git_porcelain_commands=
947 __git_compute_porcelain_commands ()
948 {
949         test -n "$__git_porcelain_commands" ||
950         __git_porcelain_commands=$(__git_list_porcelain_commands)
951 }
952
953 # Lists all set config variables starting with the given section prefix,
954 # with the prefix removed.
955 __git_get_config_variables ()
956 {
957         local section="$1" i IFS=$'\n'
958         for i in $(__git config --name-only --get-regexp "^$section\..*"); do
959                 echo "${i#$section.}"
960         done
961 }
962
963 __git_pretty_aliases ()
964 {
965         __git_get_config_variables "pretty"
966 }
967
968 __git_aliases ()
969 {
970         __git_get_config_variables "alias"
971 }
972
973 # __git_aliased_command requires 1 argument
974 __git_aliased_command ()
975 {
976         local word cmdline=$(__git config --get "alias.$1")
977         for word in $cmdline; do
978                 case "$word" in
979                 \!gitk|gitk)
980                         echo "gitk"
981                         return
982                         ;;
983                 \!*)    : shell command alias ;;
984                 -*)     : option ;;
985                 *=*)    : setting env ;;
986                 git)    : git itself ;;
987                 \(\))   : skip parens of shell function definition ;;
988                 {)      : skip start of shell helper function ;;
989                 :)      : skip null command ;;
990                 \'*)    : skip opening quote after sh -c ;;
991                 *)
992                         echo "$word"
993                         return
994                 esac
995         done
996 }
997
998 # __git_find_on_cmdline requires 1 argument
999 __git_find_on_cmdline ()
1000 {
1001         local word subcommand c=1
1002         while [ $c -lt $cword ]; do
1003                 word="${words[c]}"
1004                 for subcommand in $1; do
1005                         if [ "$subcommand" = "$word" ]; then
1006                                 echo "$subcommand"
1007                                 return
1008                         fi
1009                 done
1010                 ((c++))
1011         done
1012 }
1013
1014 # Echo the value of an option set on the command line or config
1015 #
1016 # $1: short option name
1017 # $2: long option name including =
1018 # $3: list of possible values
1019 # $4: config string (optional)
1020 #
1021 # example:
1022 # result="$(__git_get_option_value "-d" "--do-something=" \
1023 #     "yes no" "core.doSomething")"
1024 #
1025 # result is then either empty (no option set) or "yes" or "no"
1026 #
1027 # __git_get_option_value requires 3 arguments
1028 __git_get_option_value ()
1029 {
1030         local c short_opt long_opt val
1031         local result= values config_key word
1032
1033         short_opt="$1"
1034         long_opt="$2"
1035         values="$3"
1036         config_key="$4"
1037
1038         ((c = $cword - 1))
1039         while [ $c -ge 0 ]; do
1040                 word="${words[c]}"
1041                 for val in $values; do
1042                         if [ "$short_opt$val" = "$word" ] ||
1043                            [ "$long_opt$val"  = "$word" ]; then
1044                                 result="$val"
1045                                 break 2
1046                         fi
1047                 done
1048                 ((c--))
1049         done
1050
1051         if [ -n "$config_key" ] && [ -z "$result" ]; then
1052                 result="$(__git config "$config_key")"
1053         fi
1054
1055         echo "$result"
1056 }
1057
1058 __git_has_doubledash ()
1059 {
1060         local c=1
1061         while [ $c -lt $cword ]; do
1062                 if [ "--" = "${words[c]}" ]; then
1063                         return 0
1064                 fi
1065                 ((c++))
1066         done
1067         return 1
1068 }
1069
1070 # Try to count non option arguments passed on the command line for the
1071 # specified git command.
1072 # When options are used, it is necessary to use the special -- option to
1073 # tell the implementation were non option arguments begin.
1074 # XXX this can not be improved, since options can appear everywhere, as
1075 # an example:
1076 #       git mv x -n y
1077 #
1078 # __git_count_arguments requires 1 argument: the git command executed.
1079 __git_count_arguments ()
1080 {
1081         local word i c=0
1082
1083         # Skip "git" (first argument)
1084         for ((i=1; i < ${#words[@]}; i++)); do
1085                 word="${words[i]}"
1086
1087                 case "$word" in
1088                         --)
1089                                 # Good; we can assume that the following are only non
1090                                 # option arguments.
1091                                 ((c = 0))
1092                                 ;;
1093                         "$1")
1094                                 # Skip the specified git command and discard git
1095                                 # main options
1096                                 ((c = 0))
1097                                 ;;
1098                         ?*)
1099                                 ((c++))
1100                                 ;;
1101                 esac
1102         done
1103
1104         printf "%d" $c
1105 }
1106
1107 __git_whitespacelist="nowarn warn error error-all fix"
1108 __git_am_inprogress_options="--skip --continue --resolved --abort"
1109
1110 _git_am ()
1111 {
1112         __git_find_repo_path
1113         if [ -d "$__git_repo_path"/rebase-apply ]; then
1114                 __gitcomp "$__git_am_inprogress_options"
1115                 return
1116         fi
1117         case "$cur" in
1118         --whitespace=*)
1119                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1120                 return
1121                 ;;
1122         --*)
1123                 __gitcomp_builtin am "--no-utf8" \
1124                         "$__git_am_inprogress_options"
1125                 return
1126         esac
1127 }
1128
1129 _git_apply ()
1130 {
1131         case "$cur" in
1132         --whitespace=*)
1133                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1134                 return
1135                 ;;
1136         --*)
1137                 __gitcomp "
1138                         --stat --numstat --summary --check --index
1139                         --cached --index-info --reverse --reject --unidiff-zero
1140                         --apply --no-add --exclude=
1141                         --ignore-whitespace --ignore-space-change
1142                         --whitespace= --inaccurate-eof --verbose
1143                         --recount --directory=
1144                         "
1145                 return
1146         esac
1147 }
1148
1149 _git_add ()
1150 {
1151         case "$cur" in
1152         --*)
1153                 __gitcomp_builtin add
1154                 return
1155         esac
1156
1157         local complete_opt="--others --modified --directory --no-empty-directory"
1158         if test -n "$(__git_find_on_cmdline "-u --update")"
1159         then
1160                 complete_opt="--modified"
1161         fi
1162         __git_complete_index_file "$complete_opt"
1163 }
1164
1165 _git_archive ()
1166 {
1167         case "$cur" in
1168         --format=*)
1169                 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
1170                 return
1171                 ;;
1172         --remote=*)
1173                 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
1174                 return
1175                 ;;
1176         --*)
1177                 __gitcomp "
1178                         --format= --list --verbose
1179                         --prefix= --remote= --exec= --output
1180                         "
1181                 return
1182                 ;;
1183         esac
1184         __git_complete_file
1185 }
1186
1187 _git_bisect ()
1188 {
1189         __git_has_doubledash && return
1190
1191         local subcommands="start bad good skip reset visualize replay log run"
1192         local subcommand="$(__git_find_on_cmdline "$subcommands")"
1193         if [ -z "$subcommand" ]; then
1194                 __git_find_repo_path
1195                 if [ -f "$__git_repo_path"/BISECT_START ]; then
1196                         __gitcomp "$subcommands"
1197                 else
1198                         __gitcomp "replay start"
1199                 fi
1200                 return
1201         fi
1202
1203         case "$subcommand" in
1204         bad|good|reset|skip|start)
1205                 __git_complete_refs
1206                 ;;
1207         *)
1208                 ;;
1209         esac
1210 }
1211
1212 _git_branch ()
1213 {
1214         local i c=1 only_local_ref="n" has_r="n"
1215
1216         while [ $c -lt $cword ]; do
1217                 i="${words[c]}"
1218                 case "$i" in
1219                 -d|--delete|-m|--move)  only_local_ref="y" ;;
1220                 -r|--remotes)           has_r="y" ;;
1221                 esac
1222                 ((c++))
1223         done
1224
1225         case "$cur" in
1226         --set-upstream-to=*)
1227                 __git_complete_refs --cur="${cur##--set-upstream-to=}"
1228                 ;;
1229         --*)
1230                 __gitcomp "
1231                         --color --no-color --verbose --abbrev= --no-abbrev
1232                         --track --no-track --contains --no-contains --merged --no-merged
1233                         --set-upstream-to= --edit-description --list
1234                         --unset-upstream --delete --move --copy --remotes
1235                         --column --no-column --sort= --points-at
1236                         "
1237                 ;;
1238         *)
1239                 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1240                         __gitcomp_direct "$(__git_heads "" "$cur" " ")"
1241                 else
1242                         __git_complete_refs
1243                 fi
1244                 ;;
1245         esac
1246 }
1247
1248 _git_bundle ()
1249 {
1250         local cmd="${words[2]}"
1251         case "$cword" in
1252         2)
1253                 __gitcomp "create list-heads verify unbundle"
1254                 ;;
1255         3)
1256                 # looking for a file
1257                 ;;
1258         *)
1259                 case "$cmd" in
1260                         create)
1261                                 __git_complete_revlist
1262                         ;;
1263                 esac
1264                 ;;
1265         esac
1266 }
1267
1268 _git_checkout ()
1269 {
1270         __git_has_doubledash && return
1271
1272         case "$cur" in
1273         --conflict=*)
1274                 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1275                 ;;
1276         --*)
1277                 __gitcomp "
1278                         --quiet --ours --theirs --track --no-track --merge
1279                         --conflict= --orphan --patch --detach --ignore-skip-worktree-bits
1280                         --recurse-submodules --no-recurse-submodules
1281                         "
1282                 ;;
1283         *)
1284                 # check if --track, --no-track, or --no-guess was specified
1285                 # if so, disable DWIM mode
1286                 local flags="--track --no-track --no-guess" track_opt="--track"
1287                 if [ "$GIT_COMPLETION_CHECKOUT_NO_GUESS" = "1" ] ||
1288                    [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1289                         track_opt=''
1290                 fi
1291                 __git_complete_refs $track_opt
1292                 ;;
1293         esac
1294 }
1295
1296 _git_cherry ()
1297 {
1298         __git_complete_refs
1299 }
1300
1301 _git_cherry_pick ()
1302 {
1303         __git_find_repo_path
1304         if [ -f "$__git_repo_path"/CHERRY_PICK_HEAD ]; then
1305                 __gitcomp "--continue --quit --abort"
1306                 return
1307         fi
1308         case "$cur" in
1309         --*)
1310                 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1311                 ;;
1312         *)
1313                 __git_complete_refs
1314                 ;;
1315         esac
1316 }
1317
1318 _git_clean ()
1319 {
1320         case "$cur" in
1321         --*)
1322                 __gitcomp "--dry-run --quiet"
1323                 return
1324                 ;;
1325         esac
1326
1327         # XXX should we check for -x option ?
1328         __git_complete_index_file "--others --directory"
1329 }
1330
1331 _git_clone ()
1332 {
1333         case "$cur" in
1334         --*)
1335                 __gitcomp "
1336                         --local
1337                         --no-hardlinks
1338                         --shared
1339                         --reference
1340                         --quiet
1341                         --no-checkout
1342                         --bare
1343                         --mirror
1344                         --origin
1345                         --upload-pack
1346                         --template=
1347                         --depth
1348                         --single-branch
1349                         --no-tags
1350                         --branch
1351                         --recurse-submodules
1352                         --no-single-branch
1353                         --shallow-submodules
1354                         "
1355                 return
1356                 ;;
1357         esac
1358 }
1359
1360 __git_untracked_file_modes="all no normal"
1361
1362 _git_commit ()
1363 {
1364         case "$prev" in
1365         -c|-C)
1366                 __git_complete_refs
1367                 return
1368                 ;;
1369         esac
1370
1371         case "$cur" in
1372         --cleanup=*)
1373                 __gitcomp "default scissors strip verbatim whitespace
1374                         " "" "${cur##--cleanup=}"
1375                 return
1376                 ;;
1377         --reuse-message=*|--reedit-message=*|\
1378         --fixup=*|--squash=*)
1379                 __git_complete_refs --cur="${cur#*=}"
1380                 return
1381                 ;;
1382         --untracked-files=*)
1383                 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1384                 return
1385                 ;;
1386         --*)
1387                 __gitcomp "
1388                         --all --author= --signoff --verify --no-verify
1389                         --edit --no-edit
1390                         --amend --include --only --interactive
1391                         --dry-run --reuse-message= --reedit-message=
1392                         --reset-author --file= --message= --template=
1393                         --cleanup= --untracked-files --untracked-files=
1394                         --verbose --quiet --fixup= --squash=
1395                         --patch --short --date --allow-empty
1396                         "
1397                 return
1398         esac
1399
1400         if __git rev-parse --verify --quiet HEAD >/dev/null; then
1401                 __git_complete_index_file "--committable"
1402         else
1403                 # This is the first commit
1404                 __git_complete_index_file "--cached"
1405         fi
1406 }
1407
1408 _git_describe ()
1409 {
1410         case "$cur" in
1411         --*)
1412                 __gitcomp "
1413                         --all --tags --contains --abbrev= --candidates=
1414                         --exact-match --debug --long --match --always --first-parent
1415                         --exclude --dirty --broken
1416                         "
1417                 return
1418         esac
1419         __git_complete_refs
1420 }
1421
1422 __git_diff_algorithms="myers minimal patience histogram"
1423
1424 __git_diff_submodule_formats="diff log short"
1425
1426 __git_diff_common_options="--stat --numstat --shortstat --summary
1427                         --patch-with-stat --name-only --name-status --color
1428                         --no-color --color-words --no-renames --check
1429                         --full-index --binary --abbrev --diff-filter=
1430                         --find-copies-harder --ignore-cr-at-eol
1431                         --text --ignore-space-at-eol --ignore-space-change
1432                         --ignore-all-space --ignore-blank-lines --exit-code
1433                         --quiet --ext-diff --no-ext-diff
1434                         --no-prefix --src-prefix= --dst-prefix=
1435                         --inter-hunk-context=
1436                         --patience --histogram --minimal
1437                         --raw --word-diff --word-diff-regex=
1438                         --dirstat --dirstat= --dirstat-by-file
1439                         --dirstat-by-file= --cumulative
1440                         --diff-algorithm=
1441                         --submodule --submodule=
1442 "
1443
1444 _git_diff ()
1445 {
1446         __git_has_doubledash && return
1447
1448         case "$cur" in
1449         --diff-algorithm=*)
1450                 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1451                 return
1452                 ;;
1453         --submodule=*)
1454                 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1455                 return
1456                 ;;
1457         --*)
1458                 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1459                         --base --ours --theirs --no-index
1460                         $__git_diff_common_options
1461                         "
1462                 return
1463                 ;;
1464         esac
1465         __git_complete_revlist_file
1466 }
1467
1468 __git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1469                         tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
1470 "
1471
1472 _git_difftool ()
1473 {
1474         __git_has_doubledash && return
1475
1476         case "$cur" in
1477         --tool=*)
1478                 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1479                 return
1480                 ;;
1481         --*)
1482                 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1483                         --base --ours --theirs
1484                         --no-renames --diff-filter= --find-copies-harder
1485                         --relative --ignore-submodules
1486                         --tool="
1487                 return
1488                 ;;
1489         esac
1490         __git_complete_revlist_file
1491 }
1492
1493 __git_fetch_recurse_submodules="yes on-demand no"
1494
1495 __git_fetch_options="
1496         --quiet --verbose --append --upload-pack --force --keep --depth=
1497         --tags --no-tags --all --prune --dry-run --recurse-submodules=
1498         --unshallow --update-shallow
1499 "
1500
1501 _git_fetch ()
1502 {
1503         case "$cur" in
1504         --recurse-submodules=*)
1505                 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1506                 return
1507                 ;;
1508         --*)
1509                 __gitcomp "$__git_fetch_options"
1510                 return
1511                 ;;
1512         esac
1513         __git_complete_remote_or_refspec
1514 }
1515
1516 __git_format_patch_options="
1517         --stdout --attach --no-attach --thread --thread= --no-thread
1518         --numbered --start-number --numbered-files --keep-subject --signoff
1519         --signature --no-signature --in-reply-to= --cc= --full-index --binary
1520         --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1521         --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1522         --output-directory --reroll-count --to= --quiet --notes
1523 "
1524
1525 _git_format_patch ()
1526 {
1527         case "$cur" in
1528         --thread=*)
1529                 __gitcomp "
1530                         deep shallow
1531                         " "" "${cur##--thread=}"
1532                 return
1533                 ;;
1534         --*)
1535                 __gitcomp "$__git_format_patch_options"
1536                 return
1537                 ;;
1538         esac
1539         __git_complete_revlist
1540 }
1541
1542 _git_fsck ()
1543 {
1544         case "$cur" in
1545         --*)
1546                 __gitcomp "
1547                         --tags --root --unreachable --cache --no-reflogs --full
1548                         --strict --verbose --lost-found --name-objects
1549                         "
1550                 return
1551                 ;;
1552         esac
1553 }
1554
1555 _git_gc ()
1556 {
1557         case "$cur" in
1558         --*)
1559                 __gitcomp "--prune --aggressive"
1560                 return
1561                 ;;
1562         esac
1563 }
1564
1565 _git_gitk ()
1566 {
1567         _gitk
1568 }
1569
1570 # Lists matching symbol names from a tag (as in ctags) file.
1571 # 1: List symbol names matching this word.
1572 # 2: The tag file to list symbol names from.
1573 # 3: A prefix to be added to each listed symbol name (optional).
1574 # 4: A suffix to be appended to each listed symbol name (optional).
1575 __git_match_ctag () {
1576         awk -v pfx="${3-}" -v sfx="${4-}" "
1577                 /^${1//\//\\/}/ { print pfx \$1 sfx }
1578                 " "$2"
1579 }
1580
1581 # Complete symbol names from a tag file.
1582 # Usage: __git_complete_symbol [<option>]...
1583 # --tags=<file>: The tag file to list symbol names from instead of the
1584 #                default "tags".
1585 # --pfx=<prefix>: A prefix to be added to each symbol name.
1586 # --cur=<word>: The current symbol name to be completed.  Defaults to
1587 #               the current word to be completed.
1588 # --sfx=<suffix>: A suffix to be appended to each symbol name instead
1589 #                 of the default space.
1590 __git_complete_symbol () {
1591         local tags=tags pfx="" cur_="${cur-}" sfx=" "
1592
1593         while test $# != 0; do
1594                 case "$1" in
1595                 --tags=*)       tags="${1##--tags=}" ;;
1596                 --pfx=*)        pfx="${1##--pfx=}" ;;
1597                 --cur=*)        cur_="${1##--cur=}" ;;
1598                 --sfx=*)        sfx="${1##--sfx=}" ;;
1599                 *)              return 1 ;;
1600                 esac
1601                 shift
1602         done
1603
1604         if test -r "$tags"; then
1605                 __gitcomp_direct "$(__git_match_ctag "$cur_" "$tags" "$pfx" "$sfx")"
1606         fi
1607 }
1608
1609 _git_grep ()
1610 {
1611         __git_has_doubledash && return
1612
1613         case "$cur" in
1614         --*)
1615                 __gitcomp "
1616                         --cached
1617                         --text --ignore-case --word-regexp --invert-match
1618                         --full-name --line-number
1619                         --extended-regexp --basic-regexp --fixed-strings
1620                         --perl-regexp
1621                         --threads
1622                         --files-with-matches --name-only
1623                         --files-without-match
1624                         --max-depth
1625                         --count
1626                         --and --or --not --all-match
1627                         --break --heading --show-function --function-context
1628                         --untracked --no-index
1629                         "
1630                 return
1631                 ;;
1632         esac
1633
1634         case "$cword,$prev" in
1635         2,*|*,-*)
1636                 __git_complete_symbol && return
1637                 ;;
1638         esac
1639
1640         __git_complete_refs
1641 }
1642
1643 _git_help ()
1644 {
1645         case "$cur" in
1646         --*)
1647                 __gitcomp "--all --guides --info --man --web"
1648                 return
1649                 ;;
1650         esac
1651         __git_compute_all_commands
1652         __gitcomp "$__git_all_commands $(__git_aliases)
1653                 attributes cli core-tutorial cvs-migration
1654                 diffcore everyday gitk glossary hooks ignore modules
1655                 namespaces repository-layout revisions tutorial tutorial-2
1656                 workflows
1657                 "
1658 }
1659
1660 _git_init ()
1661 {
1662         case "$cur" in
1663         --shared=*)
1664                 __gitcomp "
1665                         false true umask group all world everybody
1666                         " "" "${cur##--shared=}"
1667                 return
1668                 ;;
1669         --*)
1670                 __gitcomp "--quiet --bare --template= --shared --shared="
1671                 return
1672                 ;;
1673         esac
1674 }
1675
1676 _git_ls_files ()
1677 {
1678         case "$cur" in
1679         --*)
1680                 __gitcomp "--cached --deleted --modified --others --ignored
1681                         --stage --directory --no-empty-directory --unmerged
1682                         --killed --exclude= --exclude-from=
1683                         --exclude-per-directory= --exclude-standard
1684                         --error-unmatch --with-tree= --full-name
1685                         --abbrev --ignored --exclude-per-directory
1686                         "
1687                 return
1688                 ;;
1689         esac
1690
1691         # XXX ignore options like --modified and always suggest all cached
1692         # files.
1693         __git_complete_index_file "--cached"
1694 }
1695
1696 _git_ls_remote ()
1697 {
1698         case "$cur" in
1699         --*)
1700                 __gitcomp "--heads --tags --refs --get-url --symref"
1701                 return
1702                 ;;
1703         esac
1704         __gitcomp_nl "$(__git_remotes)"
1705 }
1706
1707 _git_ls_tree ()
1708 {
1709         __git_complete_file
1710 }
1711
1712 # Options that go well for log, shortlog and gitk
1713 __git_log_common_options="
1714         --not --all
1715         --branches --tags --remotes
1716         --first-parent --merges --no-merges
1717         --max-count=
1718         --max-age= --since= --after=
1719         --min-age= --until= --before=
1720         --min-parents= --max-parents=
1721         --no-min-parents --no-max-parents
1722 "
1723 # Options that go well for log and gitk (not shortlog)
1724 __git_log_gitk_options="
1725         --dense --sparse --full-history
1726         --simplify-merges --simplify-by-decoration
1727         --left-right --notes --no-notes
1728 "
1729 # Options that go well for log and shortlog (not gitk)
1730 __git_log_shortlog_options="
1731         --author= --committer= --grep=
1732         --all-match --invert-grep
1733 "
1734
1735 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1736 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1737
1738 _git_log ()
1739 {
1740         __git_has_doubledash && return
1741         __git_find_repo_path
1742
1743         local merge=""
1744         if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
1745                 merge="--merge"
1746         fi
1747         case "$prev,$cur" in
1748         -L,:*:*)
1749                 return  # fall back to Bash filename completion
1750                 ;;
1751         -L,:*)
1752                 __git_complete_symbol --cur="${cur#:}" --sfx=":"
1753                 return
1754                 ;;
1755         -G,*|-S,*)
1756                 __git_complete_symbol
1757                 return
1758                 ;;
1759         esac
1760         case "$cur" in
1761         --pretty=*|--format=*)
1762                 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1763                         " "" "${cur#*=}"
1764                 return
1765                 ;;
1766         --date=*)
1767                 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1768                 return
1769                 ;;
1770         --decorate=*)
1771                 __gitcomp "full short no" "" "${cur##--decorate=}"
1772                 return
1773                 ;;
1774         --diff-algorithm=*)
1775                 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1776                 return
1777                 ;;
1778         --submodule=*)
1779                 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1780                 return
1781                 ;;
1782         --*)
1783                 __gitcomp "
1784                         $__git_log_common_options
1785                         $__git_log_shortlog_options
1786                         $__git_log_gitk_options
1787                         --root --topo-order --date-order --reverse
1788                         --follow --full-diff
1789                         --abbrev-commit --abbrev=
1790                         --relative-date --date=
1791                         --pretty= --format= --oneline
1792                         --show-signature
1793                         --cherry-mark
1794                         --cherry-pick
1795                         --graph
1796                         --decorate --decorate=
1797                         --walk-reflogs
1798                         --parents --children
1799                         $merge
1800                         $__git_diff_common_options
1801                         --pickaxe-all --pickaxe-regex
1802                         "
1803                 return
1804                 ;;
1805         -L:*:*)
1806                 return  # fall back to Bash filename completion
1807                 ;;
1808         -L:*)
1809                 __git_complete_symbol --cur="${cur#-L:}" --sfx=":"
1810                 return
1811                 ;;
1812         -G*)
1813                 __git_complete_symbol --pfx="-G" --cur="${cur#-G}"
1814                 return
1815                 ;;
1816         -S*)
1817                 __git_complete_symbol --pfx="-S" --cur="${cur#-S}"
1818                 return
1819                 ;;
1820         esac
1821         __git_complete_revlist
1822 }
1823
1824 # Common merge options shared by git-merge(1) and git-pull(1).
1825 __git_merge_options="
1826         --no-commit --no-stat --log --no-log --squash --strategy
1827         --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1828         --verify-signatures --no-verify-signatures --gpg-sign
1829         --quiet --verbose --progress --no-progress
1830 "
1831
1832 _git_merge ()
1833 {
1834         __git_complete_strategy && return
1835
1836         case "$cur" in
1837         --*)
1838                 __gitcomp "$__git_merge_options
1839                         --rerere-autoupdate --no-rerere-autoupdate --abort --continue"
1840                 return
1841         esac
1842         __git_complete_refs
1843 }
1844
1845 _git_mergetool ()
1846 {
1847         case "$cur" in
1848         --tool=*)
1849                 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1850                 return
1851                 ;;
1852         --*)
1853                 __gitcomp "--tool= --prompt --no-prompt"
1854                 return
1855                 ;;
1856         esac
1857 }
1858
1859 _git_merge_base ()
1860 {
1861         case "$cur" in
1862         --*)
1863                 __gitcomp "--octopus --independent --is-ancestor --fork-point"
1864                 return
1865                 ;;
1866         esac
1867         __git_complete_refs
1868 }
1869
1870 _git_mv ()
1871 {
1872         case "$cur" in
1873         --*)
1874                 __gitcomp "--dry-run"
1875                 return
1876                 ;;
1877         esac
1878
1879         if [ $(__git_count_arguments "mv") -gt 0 ]; then
1880                 # We need to show both cached and untracked files (including
1881                 # empty directories) since this may not be the last argument.
1882                 __git_complete_index_file "--cached --others --directory"
1883         else
1884                 __git_complete_index_file "--cached"
1885         fi
1886 }
1887
1888 _git_name_rev ()
1889 {
1890         __gitcomp "--tags --all --stdin"
1891 }
1892
1893 _git_notes ()
1894 {
1895         local subcommands='add append copy edit list prune remove show'
1896         local subcommand="$(__git_find_on_cmdline "$subcommands")"
1897
1898         case "$subcommand,$cur" in
1899         ,--*)
1900                 __gitcomp '--ref'
1901                 ;;
1902         ,*)
1903                 case "$prev" in
1904                 --ref)
1905                         __git_complete_refs
1906                         ;;
1907                 *)
1908                         __gitcomp "$subcommands --ref"
1909                         ;;
1910                 esac
1911                 ;;
1912         add,--reuse-message=*|append,--reuse-message=*|\
1913         add,--reedit-message=*|append,--reedit-message=*)
1914                 __git_complete_refs --cur="${cur#*=}"
1915                 ;;
1916         add,--*|append,--*)
1917                 __gitcomp '--file= --message= --reedit-message=
1918                                 --reuse-message='
1919                 ;;
1920         copy,--*)
1921                 __gitcomp '--stdin'
1922                 ;;
1923         prune,--*)
1924                 __gitcomp '--dry-run --verbose'
1925                 ;;
1926         prune,*)
1927                 ;;
1928         *)
1929                 case "$prev" in
1930                 -m|-F)
1931                         ;;
1932                 *)
1933                         __git_complete_refs
1934                         ;;
1935                 esac
1936                 ;;
1937         esac
1938 }
1939
1940 _git_pull ()
1941 {
1942         __git_complete_strategy && return
1943
1944         case "$cur" in
1945         --recurse-submodules=*)
1946                 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1947                 return
1948                 ;;
1949         --*)
1950                 __gitcomp "
1951                         --rebase --no-rebase
1952                         --autostash --no-autostash
1953                         $__git_merge_options
1954                         $__git_fetch_options
1955                 "
1956                 return
1957                 ;;
1958         esac
1959         __git_complete_remote_or_refspec
1960 }
1961
1962 __git_push_recurse_submodules="check on-demand only"
1963
1964 __git_complete_force_with_lease ()
1965 {
1966         local cur_=$1
1967
1968         case "$cur_" in
1969         --*=)
1970                 ;;
1971         *:*)
1972                 __git_complete_refs --cur="${cur_#*:}"
1973                 ;;
1974         *)
1975                 __git_complete_refs --cur="$cur_"
1976                 ;;
1977         esac
1978 }
1979
1980 _git_push ()
1981 {
1982         case "$prev" in
1983         --repo)
1984                 __gitcomp_nl "$(__git_remotes)"
1985                 return
1986                 ;;
1987         --recurse-submodules)
1988                 __gitcomp "$__git_push_recurse_submodules"
1989                 return
1990                 ;;
1991         esac
1992         case "$cur" in
1993         --repo=*)
1994                 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1995                 return
1996                 ;;
1997         --recurse-submodules=*)
1998                 __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1999                 return
2000                 ;;
2001         --force-with-lease=*)
2002                 __git_complete_force_with_lease "${cur##--force-with-lease=}"
2003                 return
2004                 ;;
2005         --*)
2006                 __gitcomp "
2007                         --all --mirror --tags --dry-run --force --verbose
2008                         --quiet --prune --delete --follow-tags
2009                         --receive-pack= --repo= --set-upstream
2010                         --force-with-lease --force-with-lease= --recurse-submodules=
2011                 "
2012                 return
2013                 ;;
2014         esac
2015         __git_complete_remote_or_refspec
2016 }
2017
2018 _git_rebase ()
2019 {
2020         __git_find_repo_path
2021         if [ -f "$__git_repo_path"/rebase-merge/interactive ]; then
2022                 __gitcomp "--continue --skip --abort --quit --edit-todo"
2023                 return
2024         elif [ -d "$__git_repo_path"/rebase-apply ] || \
2025              [ -d "$__git_repo_path"/rebase-merge ]; then
2026                 __gitcomp "--continue --skip --abort --quit"
2027                 return
2028         fi
2029         __git_complete_strategy && return
2030         case "$cur" in
2031         --whitespace=*)
2032                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
2033                 return
2034                 ;;
2035         --*)
2036                 __gitcomp "
2037                         --onto --merge --strategy --interactive
2038                         --preserve-merges --stat --no-stat
2039                         --committer-date-is-author-date --ignore-date
2040                         --ignore-whitespace --whitespace=
2041                         --autosquash --no-autosquash
2042                         --fork-point --no-fork-point
2043                         --autostash --no-autostash
2044                         --verify --no-verify
2045                         --keep-empty --root --force-rebase --no-ff
2046                         --exec
2047                         "
2048
2049                 return
2050         esac
2051         __git_complete_refs
2052 }
2053
2054 _git_reflog ()
2055 {
2056         local subcommands="show delete expire"
2057         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2058
2059         if [ -z "$subcommand" ]; then
2060                 __gitcomp "$subcommands"
2061         else
2062                 __git_complete_refs
2063         fi
2064 }
2065
2066 __git_send_email_confirm_options="always never auto cc compose"
2067 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
2068
2069 _git_send_email ()
2070 {
2071         case "$prev" in
2072         --to|--cc|--bcc|--from)
2073                 __gitcomp "$(__git send-email --dump-aliases)"
2074                 return
2075                 ;;
2076         esac
2077
2078         case "$cur" in
2079         --confirm=*)
2080                 __gitcomp "
2081                         $__git_send_email_confirm_options
2082                         " "" "${cur##--confirm=}"
2083                 return
2084                 ;;
2085         --suppress-cc=*)
2086                 __gitcomp "
2087                         $__git_send_email_suppresscc_options
2088                         " "" "${cur##--suppress-cc=}"
2089
2090                 return
2091                 ;;
2092         --smtp-encryption=*)
2093                 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
2094                 return
2095                 ;;
2096         --thread=*)
2097                 __gitcomp "
2098                         deep shallow
2099                         " "" "${cur##--thread=}"
2100                 return
2101                 ;;
2102         --to=*|--cc=*|--bcc=*|--from=*)
2103                 __gitcomp "$(__git send-email --dump-aliases)" "" "${cur#--*=}"
2104                 return
2105                 ;;
2106         --*)
2107                 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
2108                         --compose --confirm= --dry-run --envelope-sender
2109                         --from --identity
2110                         --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
2111                         --no-suppress-from --no-thread --quiet
2112                         --signed-off-by-cc --smtp-pass --smtp-server
2113                         --smtp-server-port --smtp-encryption= --smtp-user
2114                         --subject --suppress-cc= --suppress-from --thread --to
2115                         --validate --no-validate
2116                         $__git_format_patch_options"
2117                 return
2118                 ;;
2119         esac
2120         __git_complete_revlist
2121 }
2122
2123 _git_stage ()
2124 {
2125         _git_add
2126 }
2127
2128 _git_status ()
2129 {
2130         local complete_opt
2131         local untracked_state
2132
2133         case "$cur" in
2134         --ignore-submodules=*)
2135                 __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
2136                 return
2137                 ;;
2138         --untracked-files=*)
2139                 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
2140                 return
2141                 ;;
2142         --column=*)
2143                 __gitcomp "
2144                         always never auto column row plain dense nodense
2145                         " "" "${cur##--column=}"
2146                 return
2147                 ;;
2148         --*)
2149                 __gitcomp "
2150                         --short --branch --porcelain --long --verbose
2151                         --untracked-files= --ignore-submodules= --ignored
2152                         --column= --no-column
2153                         "
2154                 return
2155                 ;;
2156         esac
2157
2158         untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
2159                 "$__git_untracked_file_modes" "status.showUntrackedFiles")"
2160
2161         case "$untracked_state" in
2162         no)
2163                 # --ignored option does not matter
2164                 complete_opt=
2165                 ;;
2166         all|normal|*)
2167                 complete_opt="--cached --directory --no-empty-directory --others"
2168
2169                 if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
2170                         complete_opt="$complete_opt --ignored --exclude=*"
2171                 fi
2172                 ;;
2173         esac
2174
2175         __git_complete_index_file "$complete_opt"
2176 }
2177
2178 __git_config_get_set_variables ()
2179 {
2180         local prevword word config_file= c=$cword
2181         while [ $c -gt 1 ]; do
2182                 word="${words[c]}"
2183                 case "$word" in
2184                 --system|--global|--local|--file=*)
2185                         config_file="$word"
2186                         break
2187                         ;;
2188                 -f|--file)
2189                         config_file="$word $prevword"
2190                         break
2191                         ;;
2192                 esac
2193                 prevword=$word
2194                 c=$((--c))
2195         done
2196
2197         __git config $config_file --name-only --list
2198 }
2199
2200 _git_config ()
2201 {
2202         case "$prev" in
2203         branch.*.remote|branch.*.pushremote)
2204                 __gitcomp_nl "$(__git_remotes)"
2205                 return
2206                 ;;
2207         branch.*.merge)
2208                 __git_complete_refs
2209                 return
2210                 ;;
2211         branch.*.rebase)
2212                 __gitcomp "false true preserve interactive"
2213                 return
2214                 ;;
2215         remote.pushdefault)
2216                 __gitcomp_nl "$(__git_remotes)"
2217                 return
2218                 ;;
2219         remote.*.fetch)
2220                 local remote="${prev#remote.}"
2221                 remote="${remote%.fetch}"
2222                 if [ -z "$cur" ]; then
2223                         __gitcomp_nl "refs/heads/" "" "" ""
2224                         return
2225                 fi
2226                 __gitcomp_nl "$(__git_refs_remotes "$remote")"
2227                 return
2228                 ;;
2229         remote.*.push)
2230                 local remote="${prev#remote.}"
2231                 remote="${remote%.push}"
2232                 __gitcomp_nl "$(__git for-each-ref \
2233                         --format='%(refname):%(refname)' refs/heads)"
2234                 return
2235                 ;;
2236         pull.twohead|pull.octopus)
2237                 __git_compute_merge_strategies
2238                 __gitcomp "$__git_merge_strategies"
2239                 return
2240                 ;;
2241         color.branch|color.diff|color.interactive|\
2242         color.showbranch|color.status|color.ui)
2243                 __gitcomp "always never auto"
2244                 return
2245                 ;;
2246         color.pager)
2247                 __gitcomp "false true"
2248                 return
2249                 ;;
2250         color.*.*)
2251                 __gitcomp "
2252                         normal black red green yellow blue magenta cyan white
2253                         bold dim ul blink reverse
2254                         "
2255                 return
2256                 ;;
2257         diff.submodule)
2258                 __gitcomp "log short"
2259                 return
2260                 ;;
2261         help.format)
2262                 __gitcomp "man info web html"
2263                 return
2264                 ;;
2265         log.date)
2266                 __gitcomp "$__git_log_date_formats"
2267                 return
2268                 ;;
2269         sendemail.aliasesfiletype)
2270                 __gitcomp "mutt mailrc pine elm gnus"
2271                 return
2272                 ;;
2273         sendemail.confirm)
2274                 __gitcomp "$__git_send_email_confirm_options"
2275                 return
2276                 ;;
2277         sendemail.suppresscc)
2278                 __gitcomp "$__git_send_email_suppresscc_options"
2279                 return
2280                 ;;
2281         sendemail.transferencoding)
2282                 __gitcomp "7bit 8bit quoted-printable base64"
2283                 return
2284                 ;;
2285         --get|--get-all|--unset|--unset-all)
2286                 __gitcomp_nl "$(__git_config_get_set_variables)"
2287                 return
2288                 ;;
2289         *.*)
2290                 return
2291                 ;;
2292         esac
2293         case "$cur" in
2294         --*)
2295                 __gitcomp "
2296                         --system --global --local --file=
2297                         --list --replace-all
2298                         --get --get-all --get-regexp
2299                         --add --unset --unset-all
2300                         --remove-section --rename-section
2301                         --name-only
2302                         "
2303                 return
2304                 ;;
2305         branch.*.*)
2306                 local pfx="${cur%.*}." cur_="${cur##*.}"
2307                 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
2308                 return
2309                 ;;
2310         branch.*)
2311                 local pfx="${cur%.*}." cur_="${cur#*.}"
2312                 __gitcomp_direct "$(__git_heads "$pfx" "$cur_" ".")"
2313                 __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
2314                 return
2315                 ;;
2316         guitool.*.*)
2317                 local pfx="${cur%.*}." cur_="${cur##*.}"
2318                 __gitcomp "
2319                         argprompt cmd confirm needsfile noconsole norescan
2320                         prompt revprompt revunmerged title
2321                         " "$pfx" "$cur_"
2322                 return
2323                 ;;
2324         difftool.*.*)
2325                 local pfx="${cur%.*}." cur_="${cur##*.}"
2326                 __gitcomp "cmd path" "$pfx" "$cur_"
2327                 return
2328                 ;;
2329         man.*.*)
2330                 local pfx="${cur%.*}." cur_="${cur##*.}"
2331                 __gitcomp "cmd path" "$pfx" "$cur_"
2332                 return
2333                 ;;
2334         mergetool.*.*)
2335                 local pfx="${cur%.*}." cur_="${cur##*.}"
2336                 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
2337                 return
2338                 ;;
2339         pager.*)
2340                 local pfx="${cur%.*}." cur_="${cur#*.}"
2341                 __git_compute_all_commands
2342                 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
2343                 return
2344                 ;;
2345         remote.*.*)
2346                 local pfx="${cur%.*}." cur_="${cur##*.}"
2347                 __gitcomp "
2348                         url proxy fetch push mirror skipDefaultUpdate
2349                         receivepack uploadpack tagopt pushurl
2350                         " "$pfx" "$cur_"
2351                 return
2352                 ;;
2353         remote.*)
2354                 local pfx="${cur%.*}." cur_="${cur#*.}"
2355                 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
2356                 __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
2357                 return
2358                 ;;
2359         url.*.*)
2360                 local pfx="${cur%.*}." cur_="${cur##*.}"
2361                 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2362                 return
2363                 ;;
2364         esac
2365         __gitcomp "
2366                 add.ignoreErrors
2367                 advice.amWorkDir
2368                 advice.commitBeforeMerge
2369                 advice.detachedHead
2370                 advice.implicitIdentity
2371                 advice.pushAlreadyExists
2372                 advice.pushFetchFirst
2373                 advice.pushNeedsForce
2374                 advice.pushNonFFCurrent
2375                 advice.pushNonFFMatching
2376                 advice.pushUpdateRejected
2377                 advice.resolveConflict
2378                 advice.rmHints
2379                 advice.statusHints
2380                 advice.statusUoption
2381                 advice.ignoredHook
2382                 alias.
2383                 am.keepcr
2384                 am.threeWay
2385                 apply.ignorewhitespace
2386                 apply.whitespace
2387                 branch.autosetupmerge
2388                 branch.autosetuprebase
2389                 browser.
2390                 clean.requireForce
2391                 color.branch
2392                 color.branch.current
2393                 color.branch.local
2394                 color.branch.plain
2395                 color.branch.remote
2396                 color.decorate.HEAD
2397                 color.decorate.branch
2398                 color.decorate.remoteBranch
2399                 color.decorate.stash
2400                 color.decorate.tag
2401                 color.diff
2402                 color.diff.commit
2403                 color.diff.frag
2404                 color.diff.func
2405                 color.diff.meta
2406                 color.diff.new
2407                 color.diff.old
2408                 color.diff.plain
2409                 color.diff.whitespace
2410                 color.grep
2411                 color.grep.context
2412                 color.grep.filename
2413                 color.grep.function
2414                 color.grep.linenumber
2415                 color.grep.match
2416                 color.grep.selected
2417                 color.grep.separator
2418                 color.interactive
2419                 color.interactive.error
2420                 color.interactive.header
2421                 color.interactive.help
2422                 color.interactive.prompt
2423                 color.pager
2424                 color.showbranch
2425                 color.status
2426                 color.status.added
2427                 color.status.changed
2428                 color.status.header
2429                 color.status.localBranch
2430                 color.status.nobranch
2431                 color.status.remoteBranch
2432                 color.status.unmerged
2433                 color.status.untracked
2434                 color.status.updated
2435                 color.ui
2436                 commit.cleanup
2437                 commit.gpgSign
2438                 commit.status
2439                 commit.template
2440                 commit.verbose
2441                 core.abbrev
2442                 core.askpass
2443                 core.attributesfile
2444                 core.autocrlf
2445                 core.bare
2446                 core.bigFileThreshold
2447                 core.checkStat
2448                 core.commentChar
2449                 core.compression
2450                 core.createObject
2451                 core.deltaBaseCacheLimit
2452                 core.editor
2453                 core.eol
2454                 core.excludesfile
2455                 core.fileMode
2456                 core.fsyncobjectfiles
2457                 core.gitProxy
2458                 core.hideDotFiles
2459                 core.hooksPath
2460                 core.ignoreStat
2461                 core.ignorecase
2462                 core.logAllRefUpdates
2463                 core.loosecompression
2464                 core.notesRef
2465                 core.packedGitLimit
2466                 core.packedGitWindowSize
2467                 core.packedRefsTimeout
2468                 core.pager
2469                 core.precomposeUnicode
2470                 core.preferSymlinkRefs
2471                 core.preloadindex
2472                 core.protectHFS
2473                 core.protectNTFS
2474                 core.quotepath
2475                 core.repositoryFormatVersion
2476                 core.safecrlf
2477                 core.sharedRepository
2478                 core.sparseCheckout
2479                 core.splitIndex
2480                 core.sshCommand
2481                 core.symlinks
2482                 core.trustctime
2483                 core.untrackedCache
2484                 core.warnAmbiguousRefs
2485                 core.whitespace
2486                 core.worktree
2487                 credential.helper
2488                 credential.useHttpPath
2489                 credential.username
2490                 credentialCache.ignoreSIGHUP
2491                 diff.autorefreshindex
2492                 diff.external
2493                 diff.ignoreSubmodules
2494                 diff.mnemonicprefix
2495                 diff.noprefix
2496                 diff.renameLimit
2497                 diff.renames
2498                 diff.statGraphWidth
2499                 diff.submodule
2500                 diff.suppressBlankEmpty
2501                 diff.tool
2502                 diff.wordRegex
2503                 diff.algorithm
2504                 difftool.
2505                 difftool.prompt
2506                 fetch.recurseSubmodules
2507                 fetch.unpackLimit
2508                 format.attach
2509                 format.cc
2510                 format.coverLetter
2511                 format.from
2512                 format.headers
2513                 format.numbered
2514                 format.pretty
2515                 format.signature
2516                 format.signoff
2517                 format.subjectprefix
2518                 format.suffix
2519                 format.thread
2520                 format.to
2521                 gc.
2522                 gc.aggressiveDepth
2523                 gc.aggressiveWindow
2524                 gc.auto
2525                 gc.autoDetach
2526                 gc.autopacklimit
2527                 gc.logExpiry
2528                 gc.packrefs
2529                 gc.pruneexpire
2530                 gc.reflogexpire
2531                 gc.reflogexpireunreachable
2532                 gc.rerereresolved
2533                 gc.rerereunresolved
2534                 gc.worktreePruneExpire
2535                 gitcvs.allbinary
2536                 gitcvs.commitmsgannotation
2537                 gitcvs.dbTableNamePrefix
2538                 gitcvs.dbdriver
2539                 gitcvs.dbname
2540                 gitcvs.dbpass
2541                 gitcvs.dbuser
2542                 gitcvs.enabled
2543                 gitcvs.logfile
2544                 gitcvs.usecrlfattr
2545                 guitool.
2546                 gui.blamehistoryctx
2547                 gui.commitmsgwidth
2548                 gui.copyblamethreshold
2549                 gui.diffcontext
2550                 gui.encoding
2551                 gui.fastcopyblame
2552                 gui.matchtrackingbranch
2553                 gui.newbranchtemplate
2554                 gui.pruneduringfetch
2555                 gui.spellingdictionary
2556                 gui.trustmtime
2557                 help.autocorrect
2558                 help.browser
2559                 help.format
2560                 http.lowSpeedLimit
2561                 http.lowSpeedTime
2562                 http.maxRequests
2563                 http.minSessions
2564                 http.noEPSV
2565                 http.postBuffer
2566                 http.proxy
2567                 http.sslCipherList
2568                 http.sslVersion
2569                 http.sslCAInfo
2570                 http.sslCAPath
2571                 http.sslCert
2572                 http.sslCertPasswordProtected
2573                 http.sslKey
2574                 http.sslVerify
2575                 http.useragent
2576                 i18n.commitEncoding
2577                 i18n.logOutputEncoding
2578                 imap.authMethod
2579                 imap.folder
2580                 imap.host
2581                 imap.pass
2582                 imap.port
2583                 imap.preformattedHTML
2584                 imap.sslverify
2585                 imap.tunnel
2586                 imap.user
2587                 init.templatedir
2588                 instaweb.browser
2589                 instaweb.httpd
2590                 instaweb.local
2591                 instaweb.modulepath
2592                 instaweb.port
2593                 interactive.singlekey
2594                 log.date
2595                 log.decorate
2596                 log.showroot
2597                 mailmap.file
2598                 man.
2599                 man.viewer
2600                 merge.
2601                 merge.conflictstyle
2602                 merge.log
2603                 merge.renameLimit
2604                 merge.renormalize
2605                 merge.stat
2606                 merge.tool
2607                 merge.verbosity
2608                 mergetool.
2609                 mergetool.keepBackup
2610                 mergetool.keepTemporaries
2611                 mergetool.prompt
2612                 notes.displayRef
2613                 notes.rewrite.
2614                 notes.rewrite.amend
2615                 notes.rewrite.rebase
2616                 notes.rewriteMode
2617                 notes.rewriteRef
2618                 pack.compression
2619                 pack.deltaCacheLimit
2620                 pack.deltaCacheSize
2621                 pack.depth
2622                 pack.indexVersion
2623                 pack.packSizeLimit
2624                 pack.threads
2625                 pack.window
2626                 pack.windowMemory
2627                 pager.
2628                 pretty.
2629                 pull.octopus
2630                 pull.twohead
2631                 push.default
2632                 push.followTags
2633                 rebase.autosquash
2634                 rebase.stat
2635                 receive.autogc
2636                 receive.denyCurrentBranch
2637                 receive.denyDeleteCurrent
2638                 receive.denyDeletes
2639                 receive.denyNonFastForwards
2640                 receive.fsckObjects
2641                 receive.unpackLimit
2642                 receive.updateserverinfo
2643                 remote.pushdefault
2644                 remotes.
2645                 repack.usedeltabaseoffset
2646                 rerere.autoupdate
2647                 rerere.enabled
2648                 sendemail.
2649                 sendemail.aliasesfile
2650                 sendemail.aliasfiletype
2651                 sendemail.bcc
2652                 sendemail.cc
2653                 sendemail.cccmd
2654                 sendemail.chainreplyto
2655                 sendemail.confirm
2656                 sendemail.envelopesender
2657                 sendemail.from
2658                 sendemail.identity
2659                 sendemail.multiedit
2660                 sendemail.signedoffbycc
2661                 sendemail.smtpdomain
2662                 sendemail.smtpencryption
2663                 sendemail.smtppass
2664                 sendemail.smtpserver
2665                 sendemail.smtpserveroption
2666                 sendemail.smtpserverport
2667                 sendemail.smtpuser
2668                 sendemail.suppresscc
2669                 sendemail.suppressfrom
2670                 sendemail.thread
2671                 sendemail.to
2672                 sendemail.tocmd
2673                 sendemail.validate
2674                 sendemail.smtpbatchsize
2675                 sendemail.smtprelogindelay
2676                 showbranch.default
2677                 status.relativePaths
2678                 status.showUntrackedFiles
2679                 status.submodulesummary
2680                 submodule.
2681                 tar.umask
2682                 transfer.unpackLimit
2683                 url.
2684                 user.email
2685                 user.name
2686                 user.signingkey
2687                 web.browser
2688                 branch. remote.
2689         "
2690 }
2691
2692 _git_remote ()
2693 {
2694         local subcommands="
2695                 add rename remove set-head set-branches
2696                 get-url set-url show prune update
2697                 "
2698         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2699         if [ -z "$subcommand" ]; then
2700                 case "$cur" in
2701                 --*)
2702                         __gitcomp "--verbose"
2703                         ;;
2704                 *)
2705                         __gitcomp "$subcommands"
2706                         ;;
2707                 esac
2708                 return
2709         fi
2710
2711         case "$subcommand,$cur" in
2712         add,--*)
2713                 __gitcomp "--track --master --fetch --tags --no-tags --mirror="
2714                 ;;
2715         add,*)
2716                 ;;
2717         set-head,--*)
2718                 __gitcomp "--auto --delete"
2719                 ;;
2720         set-branches,--*)
2721                 __gitcomp "--add"
2722                 ;;
2723         set-head,*|set-branches,*)
2724                 __git_complete_remote_or_refspec
2725                 ;;
2726         update,--*)
2727                 __gitcomp "--prune"
2728                 ;;
2729         update,*)
2730                 __gitcomp "$(__git_get_config_variables "remotes")"
2731                 ;;
2732         set-url,--*)
2733                 __gitcomp "--push --add --delete"
2734                 ;;
2735         get-url,--*)
2736                 __gitcomp "--push --all"
2737                 ;;
2738         prune,--*)
2739                 __gitcomp "--dry-run"
2740                 ;;
2741         *)
2742                 __gitcomp_nl "$(__git_remotes)"
2743                 ;;
2744         esac
2745 }
2746
2747 _git_replace ()
2748 {
2749         case "$cur" in
2750         --*)
2751                 __gitcomp "--edit --graft --format= --list --delete"
2752                 return
2753                 ;;
2754         esac
2755         __git_complete_refs
2756 }
2757
2758 _git_rerere ()
2759 {
2760         local subcommands="clear forget diff remaining status gc"
2761         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2762         if test -z "$subcommand"
2763         then
2764                 __gitcomp "$subcommands"
2765                 return
2766         fi
2767 }
2768
2769 _git_reset ()
2770 {
2771         __git_has_doubledash && return
2772
2773         case "$cur" in
2774         --*)
2775                 __gitcomp "--merge --mixed --hard --soft --patch --keep"
2776                 return
2777                 ;;
2778         esac
2779         __git_complete_refs
2780 }
2781
2782 _git_revert ()
2783 {
2784         __git_find_repo_path
2785         if [ -f "$__git_repo_path"/REVERT_HEAD ]; then
2786                 __gitcomp "--continue --quit --abort"
2787                 return
2788         fi
2789         case "$cur" in
2790         --*)
2791                 __gitcomp "
2792                         --edit --mainline --no-edit --no-commit --signoff
2793                         --strategy= --strategy-option=
2794                         "
2795                 return
2796                 ;;
2797         esac
2798         __git_complete_refs
2799 }
2800
2801 _git_rm ()
2802 {
2803         case "$cur" in
2804         --*)
2805                 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2806                 return
2807                 ;;
2808         esac
2809
2810         __git_complete_index_file "--cached"
2811 }
2812
2813 _git_shortlog ()
2814 {
2815         __git_has_doubledash && return
2816
2817         case "$cur" in
2818         --*)
2819                 __gitcomp "
2820                         $__git_log_common_options
2821                         $__git_log_shortlog_options
2822                         --numbered --summary --email
2823                         "
2824                 return
2825                 ;;
2826         esac
2827         __git_complete_revlist
2828 }
2829
2830 _git_show ()
2831 {
2832         __git_has_doubledash && return
2833
2834         case "$cur" in
2835         --pretty=*|--format=*)
2836                 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2837                         " "" "${cur#*=}"
2838                 return
2839                 ;;
2840         --diff-algorithm=*)
2841                 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2842                 return
2843                 ;;
2844         --submodule=*)
2845                 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
2846                 return
2847                 ;;
2848         --*)
2849                 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2850                         --show-signature
2851                         $__git_diff_common_options
2852                         "
2853                 return
2854                 ;;
2855         esac
2856         __git_complete_revlist_file
2857 }
2858
2859 _git_show_branch ()
2860 {
2861         case "$cur" in
2862         --*)
2863                 __gitcomp "
2864                         --all --remotes --topo-order --date-order --current --more=
2865                         --list --independent --merge-base --no-name
2866                         --color --no-color
2867                         --sha1-name --sparse --topics --reflog
2868                         "
2869                 return
2870                 ;;
2871         esac
2872         __git_complete_revlist
2873 }
2874
2875 _git_stash ()
2876 {
2877         local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
2878         local subcommands='push save list show apply clear drop pop create branch'
2879         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2880         if [ -z "$subcommand" ]; then
2881                 case "$cur" in
2882                 --*)
2883                         __gitcomp "$save_opts"
2884                         ;;
2885                 *)
2886                         if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2887                                 __gitcomp "$subcommands"
2888                         fi
2889                         ;;
2890                 esac
2891         else
2892                 case "$subcommand,$cur" in
2893                 push,--*)
2894                         __gitcomp "$save_opts --message"
2895                         ;;
2896                 save,--*)
2897                         __gitcomp "$save_opts"
2898                         ;;
2899                 apply,--*|pop,--*)
2900                         __gitcomp "--index --quiet"
2901                         ;;
2902                 drop,--*)
2903                         __gitcomp "--quiet"
2904                         ;;
2905                 show,--*|branch,--*)
2906                         ;;
2907                 branch,*)
2908                         if [ $cword -eq 3 ]; then
2909                                 __git_complete_refs
2910                         else
2911                                 __gitcomp_nl "$(__git stash list \
2912                                                 | sed -n -e 's/:.*//p')"
2913                         fi
2914                         ;;
2915                 show,*|apply,*|drop,*|pop,*)
2916                         __gitcomp_nl "$(__git stash list \
2917                                         | sed -n -e 's/:.*//p')"
2918                         ;;
2919                 *)
2920                         ;;
2921                 esac
2922         fi
2923 }
2924
2925 _git_submodule ()
2926 {
2927         __git_has_doubledash && return
2928
2929         local subcommands="add status init deinit update summary foreach sync"
2930         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2931         if [ -z "$subcommand" ]; then
2932                 case "$cur" in
2933                 --*)
2934                         __gitcomp "--quiet"
2935                         ;;
2936                 *)
2937                         __gitcomp "$subcommands"
2938                         ;;
2939                 esac
2940                 return
2941         fi
2942
2943         case "$subcommand,$cur" in
2944         add,--*)
2945                 __gitcomp "--branch --force --name --reference --depth"
2946                 ;;
2947         status,--*)
2948                 __gitcomp "--cached --recursive"
2949                 ;;
2950         deinit,--*)
2951                 __gitcomp "--force --all"
2952                 ;;
2953         update,--*)
2954                 __gitcomp "
2955                         --init --remote --no-fetch
2956                         --recommend-shallow --no-recommend-shallow
2957                         --force --rebase --merge --reference --depth --recursive --jobs
2958                 "
2959                 ;;
2960         summary,--*)
2961                 __gitcomp "--cached --files --summary-limit"
2962                 ;;
2963         foreach,--*|sync,--*)
2964                 __gitcomp "--recursive"
2965                 ;;
2966         *)
2967                 ;;
2968         esac
2969 }
2970
2971 _git_svn ()
2972 {
2973         local subcommands="
2974                 init fetch clone rebase dcommit log find-rev
2975                 set-tree commit-diff info create-ignore propget
2976                 proplist show-ignore show-externals branch tag blame
2977                 migrate mkdirs reset gc
2978                 "
2979         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2980         if [ -z "$subcommand" ]; then
2981                 __gitcomp "$subcommands"
2982         else
2983                 local remote_opts="--username= --config-dir= --no-auth-cache"
2984                 local fc_opts="
2985                         --follow-parent --authors-file= --repack=
2986                         --no-metadata --use-svm-props --use-svnsync-props
2987                         --log-window-size= --no-checkout --quiet
2988                         --repack-flags --use-log-author --localtime
2989                         --add-author-from
2990                         --ignore-paths= --include-paths= $remote_opts
2991                         "
2992                 local init_opts="
2993                         --template= --shared= --trunk= --tags=
2994                         --branches= --stdlayout --minimize-url
2995                         --no-metadata --use-svm-props --use-svnsync-props
2996                         --rewrite-root= --prefix= $remote_opts
2997                         "
2998                 local cmt_opts="
2999                         --edit --rmdir --find-copies-harder --copy-similarity=
3000                         "
3001
3002                 case "$subcommand,$cur" in
3003                 fetch,--*)
3004                         __gitcomp "--revision= --fetch-all $fc_opts"
3005                         ;;
3006                 clone,--*)
3007                         __gitcomp "--revision= $fc_opts $init_opts"
3008                         ;;
3009                 init,--*)
3010                         __gitcomp "$init_opts"
3011                         ;;
3012                 dcommit,--*)
3013                         __gitcomp "
3014                                 --merge --strategy= --verbose --dry-run
3015                                 --fetch-all --no-rebase --commit-url
3016                                 --revision --interactive $cmt_opts $fc_opts
3017                                 "
3018                         ;;
3019                 set-tree,--*)
3020                         __gitcomp "--stdin $cmt_opts $fc_opts"
3021                         ;;
3022                 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
3023                 show-externals,--*|mkdirs,--*)
3024                         __gitcomp "--revision="
3025                         ;;
3026                 log,--*)
3027                         __gitcomp "
3028                                 --limit= --revision= --verbose --incremental
3029                                 --oneline --show-commit --non-recursive
3030                                 --authors-file= --color
3031                                 "
3032                         ;;
3033                 rebase,--*)
3034                         __gitcomp "
3035                                 --merge --verbose --strategy= --local
3036                                 --fetch-all --dry-run $fc_opts
3037                                 "
3038                         ;;
3039                 commit-diff,--*)
3040                         __gitcomp "--message= --file= --revision= $cmt_opts"
3041                         ;;
3042                 info,--*)
3043                         __gitcomp "--url"
3044                         ;;
3045                 branch,--*)
3046                         __gitcomp "--dry-run --message --tag"
3047                         ;;
3048                 tag,--*)
3049                         __gitcomp "--dry-run --message"
3050                         ;;
3051                 blame,--*)
3052                         __gitcomp "--git-format"
3053                         ;;
3054                 migrate,--*)
3055                         __gitcomp "
3056                                 --config-dir= --ignore-paths= --minimize
3057                                 --no-auth-cache --username=
3058                                 "
3059                         ;;
3060                 reset,--*)
3061                         __gitcomp "--revision= --parent"
3062                         ;;
3063                 *)
3064                         ;;
3065                 esac
3066         fi
3067 }
3068
3069 _git_tag ()
3070 {
3071         local i c=1 f=0
3072         while [ $c -lt $cword ]; do
3073                 i="${words[c]}"
3074                 case "$i" in
3075                 -d|-v)
3076                         __gitcomp_direct "$(__git_tags "" "$cur" " ")"
3077                         return
3078                         ;;
3079                 -f)
3080                         f=1
3081                         ;;
3082                 esac
3083                 ((c++))
3084         done
3085
3086         case "$prev" in
3087         -m|-F)
3088                 ;;
3089         -*|tag)
3090                 if [ $f = 1 ]; then
3091                         __gitcomp_direct "$(__git_tags "" "$cur" " ")"
3092                 fi
3093                 ;;
3094         *)
3095                 __git_complete_refs
3096                 ;;
3097         esac
3098
3099         case "$cur" in
3100         --*)
3101                 __gitcomp "
3102                         --list --delete --verify --annotate --message --file
3103                         --sign --cleanup --local-user --force --column --sort=
3104                         --contains --no-contains --points-at --merged --no-merged --create-reflog
3105                         "
3106                 ;;
3107         esac
3108 }
3109
3110 _git_whatchanged ()
3111 {
3112         _git_log
3113 }
3114
3115 _git_worktree ()
3116 {
3117         local subcommands="add list lock prune unlock"
3118         local subcommand="$(__git_find_on_cmdline "$subcommands")"
3119         if [ -z "$subcommand" ]; then
3120                 __gitcomp "$subcommands"
3121         else
3122                 case "$subcommand,$cur" in
3123                 add,--*)
3124                         __gitcomp "--detach"
3125                         ;;
3126                 list,--*)
3127                         __gitcomp "--porcelain"
3128                         ;;
3129                 lock,--*)
3130                         __gitcomp "--reason"
3131                         ;;
3132                 prune,--*)
3133                         __gitcomp "--dry-run --expire --verbose"
3134                         ;;
3135                 *)
3136                         ;;
3137                 esac
3138         fi
3139 }
3140
3141 __git_main ()
3142 {
3143         local i c=1 command __git_dir __git_repo_path
3144         local __git_C_args C_args_count=0
3145
3146         while [ $c -lt $cword ]; do
3147                 i="${words[c]}"
3148                 case "$i" in
3149                 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
3150                 --git-dir)   ((c++)) ; __git_dir="${words[c]}" ;;
3151                 --bare)      __git_dir="." ;;
3152                 --help) command="help"; break ;;
3153                 -c|--work-tree|--namespace) ((c++)) ;;
3154                 -C)     __git_C_args[C_args_count++]=-C
3155                         ((c++))
3156                         __git_C_args[C_args_count++]="${words[c]}"
3157                         ;;
3158                 -*) ;;
3159                 *) command="$i"; break ;;
3160                 esac
3161                 ((c++))
3162         done
3163
3164         if [ -z "$command" ]; then
3165                 case "$prev" in
3166                 --git-dir|-C|--work-tree)
3167                         # these need a path argument, let's fall back to
3168                         # Bash filename completion
3169                         return
3170                         ;;
3171                 -c|--namespace)
3172                         # we don't support completing these options' arguments
3173                         return
3174                         ;;
3175                 esac
3176                 case "$cur" in
3177                 --*)   __gitcomp "
3178                         --paginate
3179                         --no-pager
3180                         --git-dir=
3181                         --bare
3182                         --version
3183                         --exec-path
3184                         --exec-path=
3185                         --html-path
3186                         --man-path
3187                         --info-path
3188                         --work-tree=
3189                         --namespace=
3190                         --no-replace-objects
3191                         --help
3192                         "
3193                         ;;
3194                 *)     __git_compute_porcelain_commands
3195                        __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
3196                 esac
3197                 return
3198         fi
3199
3200         local completion_func="_git_${command//-/_}"
3201         declare -f $completion_func >/dev/null 2>/dev/null && $completion_func && return
3202
3203         local expansion=$(__git_aliased_command "$command")
3204         if [ -n "$expansion" ]; then
3205                 words[1]=$expansion
3206                 completion_func="_git_${expansion//-/_}"
3207                 declare -f $completion_func >/dev/null 2>/dev/null && $completion_func
3208         fi
3209 }
3210
3211 __gitk_main ()
3212 {
3213         __git_has_doubledash && return
3214
3215         local __git_repo_path
3216         __git_find_repo_path
3217
3218         local merge=""
3219         if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
3220                 merge="--merge"
3221         fi
3222         case "$cur" in
3223         --*)
3224                 __gitcomp "
3225                         $__git_log_common_options
3226                         $__git_log_gitk_options
3227                         $merge
3228                         "
3229                 return
3230                 ;;
3231         esac
3232         __git_complete_revlist
3233 }
3234
3235 if [[ -n ${ZSH_VERSION-} ]]; then
3236         echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
3237
3238         autoload -U +X compinit && compinit
3239
3240         __gitcomp ()
3241         {
3242                 emulate -L zsh
3243
3244                 local cur_="${3-$cur}"
3245
3246                 case "$cur_" in
3247                 --*=)
3248                         ;;
3249                 *)
3250                         local c IFS=$' \t\n'
3251                         local -a array
3252                         for c in ${=1}; do
3253                                 c="$c${4-}"
3254                                 case $c in
3255                                 --*=*|*.) ;;
3256                                 *) c="$c " ;;
3257                                 esac
3258                                 array[${#array[@]}+1]="$c"
3259                         done
3260                         compset -P '*[=:]'
3261                         compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
3262                         ;;
3263                 esac
3264         }
3265
3266         __gitcomp_direct ()
3267         {
3268                 emulate -L zsh
3269
3270                 local IFS=$'\n'
3271                 compset -P '*[=:]'
3272                 compadd -Q -- ${=1} && _ret=0
3273         }
3274
3275         __gitcomp_nl ()
3276         {
3277                 emulate -L zsh
3278
3279                 local IFS=$'\n'
3280                 compset -P '*[=:]'
3281                 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
3282         }
3283
3284         __gitcomp_file ()
3285         {
3286                 emulate -L zsh
3287
3288                 local IFS=$'\n'
3289                 compset -P '*[=:]'
3290                 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
3291         }
3292
3293         _git ()
3294         {
3295                 local _ret=1 cur cword prev
3296                 cur=${words[CURRENT]}
3297                 prev=${words[CURRENT-1]}
3298                 let cword=CURRENT-1
3299                 emulate ksh -c __${service}_main
3300                 let _ret && _default && _ret=0
3301                 return _ret
3302         }
3303
3304         compdef _git git gitk
3305         return
3306 fi
3307
3308 __git_func_wrap ()
3309 {
3310         local cur words cword prev
3311         _get_comp_words_by_ref -n =: cur words cword prev
3312         $1
3313 }
3314
3315 # Setup completion for certain functions defined above by setting common
3316 # variables and workarounds.
3317 # This is NOT a public function; use at your own risk.
3318 __git_complete ()
3319 {
3320         local wrapper="__git_wrap${2}"
3321         eval "$wrapper () { __git_func_wrap $2 ; }"
3322         complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
3323                 || complete -o default -o nospace -F $wrapper $1
3324 }
3325
3326 # wrapper for backwards compatibility
3327 _git ()
3328 {
3329         __git_wrap__git_main
3330 }
3331
3332 # wrapper for backwards compatibility
3333 _gitk ()
3334 {
3335         __git_wrap__gitk_main
3336 }
3337
3338 __git_complete git __git_main
3339 __git_complete gitk __gitk_main
3340
3341 # The following are necessary only for Cygwin, and only are needed
3342 # when the user has tab-completed the executable name and consequently
3343 # included the '.exe' suffix.
3344 #
3345 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
3346 __git_complete git.exe __git_main
3347 fi