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