completion: add completion for --submodule=* diff option
[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                 column)           : internal helper;;
668                 commit-tree)      : plumbing;;
669                 count-objects)    : infrequent;;
670                 credential)       : credentials;;
671                 credential-*)     : credentials helper;;
672                 cvsexportcommit)  : export;;
673                 cvsimport)        : import;;
674                 cvsserver)        : daemon;;
675                 daemon)           : daemon;;
676                 diff-files)       : plumbing;;
677                 diff-index)       : plumbing;;
678                 diff-tree)        : plumbing;;
679                 fast-import)      : import;;
680                 fast-export)      : export;;
681                 fsck-objects)     : plumbing;;
682                 fetch-pack)       : plumbing;;
683                 fmt-merge-msg)    : plumbing;;
684                 for-each-ref)     : plumbing;;
685                 hash-object)      : plumbing;;
686                 http-*)           : transport;;
687                 index-pack)       : plumbing;;
688                 init-db)          : deprecated;;
689                 local-fetch)      : plumbing;;
690                 ls-files)         : plumbing;;
691                 ls-remote)        : plumbing;;
692                 ls-tree)          : plumbing;;
693                 mailinfo)         : plumbing;;
694                 mailsplit)        : plumbing;;
695                 merge-*)          : plumbing;;
696                 mktree)           : plumbing;;
697                 mktag)            : plumbing;;
698                 pack-objects)     : plumbing;;
699                 pack-redundant)   : plumbing;;
700                 pack-refs)        : plumbing;;
701                 parse-remote)     : plumbing;;
702                 patch-id)         : plumbing;;
703                 prune)            : plumbing;;
704                 prune-packed)     : plumbing;;
705                 quiltimport)      : import;;
706                 read-tree)        : plumbing;;
707                 receive-pack)     : plumbing;;
708                 remote-*)         : transport;;
709                 rerere)           : plumbing;;
710                 rev-list)         : plumbing;;
711                 rev-parse)        : plumbing;;
712                 runstatus)        : plumbing;;
713                 sh-setup)         : internal;;
714                 shell)            : daemon;;
715                 show-ref)         : plumbing;;
716                 send-pack)        : plumbing;;
717                 show-index)       : plumbing;;
718                 ssh-*)            : transport;;
719                 stripspace)       : plumbing;;
720                 symbolic-ref)     : plumbing;;
721                 unpack-file)      : plumbing;;
722                 unpack-objects)   : plumbing;;
723                 update-index)     : plumbing;;
724                 update-ref)       : plumbing;;
725                 update-server-info) : daemon;;
726                 upload-archive)   : plumbing;;
727                 upload-pack)      : plumbing;;
728                 write-tree)       : plumbing;;
729                 var)              : infrequent;;
730                 verify-pack)      : infrequent;;
731                 verify-tag)       : plumbing;;
732                 *) echo $i;;
733                 esac
734         done
735 }
736
737 __git_porcelain_commands=
738 __git_compute_porcelain_commands ()
739 {
740         test -n "$__git_porcelain_commands" ||
741         __git_porcelain_commands=$(__git_list_porcelain_commands)
742 }
743
744 # Lists all set config variables starting with the given section prefix,
745 # with the prefix removed.
746 __git_get_config_variables ()
747 {
748         local section="$1" i IFS=$'\n'
749         for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do
750                 echo "${i#$section.}"
751         done
752 }
753
754 __git_pretty_aliases ()
755 {
756         __git_get_config_variables "pretty"
757 }
758
759 __git_aliases ()
760 {
761         __git_get_config_variables "alias"
762 }
763
764 # __git_aliased_command requires 1 argument
765 __git_aliased_command ()
766 {
767         local word cmdline=$(git --git-dir="$(__gitdir)" \
768                 config --get "alias.$1")
769         for word in $cmdline; do
770                 case "$word" in
771                 \!gitk|gitk)
772                         echo "gitk"
773                         return
774                         ;;
775                 \!*)    : shell command alias ;;
776                 -*)     : option ;;
777                 *=*)    : setting env ;;
778                 git)    : git itself ;;
779                 \(\))   : skip parens of shell function definition ;;
780                 {)      : skip start of shell helper function ;;
781                 :)      : skip null command ;;
782                 \'*)    : skip opening quote after sh -c ;;
783                 *)
784                         echo "$word"
785                         return
786                 esac
787         done
788 }
789
790 # __git_find_on_cmdline requires 1 argument
791 __git_find_on_cmdline ()
792 {
793         local word subcommand c=1
794         while [ $c -lt $cword ]; do
795                 word="${words[c]}"
796                 for subcommand in $1; do
797                         if [ "$subcommand" = "$word" ]; then
798                                 echo "$subcommand"
799                                 return
800                         fi
801                 done
802                 ((c++))
803         done
804 }
805
806 __git_has_doubledash ()
807 {
808         local c=1
809         while [ $c -lt $cword ]; do
810                 if [ "--" = "${words[c]}" ]; then
811                         return 0
812                 fi
813                 ((c++))
814         done
815         return 1
816 }
817
818 # Try to count non option arguments passed on the command line for the
819 # specified git command.
820 # When options are used, it is necessary to use the special -- option to
821 # tell the implementation were non option arguments begin.
822 # XXX this can not be improved, since options can appear everywhere, as
823 # an example:
824 #       git mv x -n y
825 #
826 # __git_count_arguments requires 1 argument: the git command executed.
827 __git_count_arguments ()
828 {
829         local word i c=0
830
831         # Skip "git" (first argument)
832         for ((i=1; i < ${#words[@]}; i++)); do
833                 word="${words[i]}"
834
835                 case "$word" in
836                         --)
837                                 # Good; we can assume that the following are only non
838                                 # option arguments.
839                                 ((c = 0))
840                                 ;;
841                         "$1")
842                                 # Skip the specified git command and discard git
843                                 # main options
844                                 ((c = 0))
845                                 ;;
846                         ?*)
847                                 ((c++))
848                                 ;;
849                 esac
850         done
851
852         printf "%d" $c
853 }
854
855 __git_whitespacelist="nowarn warn error error-all fix"
856
857 _git_am ()
858 {
859         local dir="$(__gitdir)"
860         if [ -d "$dir"/rebase-apply ]; then
861                 __gitcomp "--skip --continue --resolved --abort"
862                 return
863         fi
864         case "$cur" in
865         --whitespace=*)
866                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
867                 return
868                 ;;
869         --*)
870                 __gitcomp "
871                         --3way --committer-date-is-author-date --ignore-date
872                         --ignore-whitespace --ignore-space-change
873                         --interactive --keep --no-utf8 --signoff --utf8
874                         --whitespace= --scissors
875                         "
876                 return
877         esac
878 }
879
880 _git_apply ()
881 {
882         case "$cur" in
883         --whitespace=*)
884                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
885                 return
886                 ;;
887         --*)
888                 __gitcomp "
889                         --stat --numstat --summary --check --index
890                         --cached --index-info --reverse --reject --unidiff-zero
891                         --apply --no-add --exclude=
892                         --ignore-whitespace --ignore-space-change
893                         --whitespace= --inaccurate-eof --verbose
894                         "
895                 return
896         esac
897 }
898
899 _git_add ()
900 {
901         case "$cur" in
902         --*)
903                 __gitcomp "
904                         --interactive --refresh --patch --update --dry-run
905                         --ignore-errors --intent-to-add
906                         "
907                 return
908         esac
909
910         # XXX should we check for --update and --all options ?
911         __git_complete_index_file "--others --modified --directory --no-empty-directory"
912 }
913
914 _git_archive ()
915 {
916         case "$cur" in
917         --format=*)
918                 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
919                 return
920                 ;;
921         --remote=*)
922                 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
923                 return
924                 ;;
925         --*)
926                 __gitcomp "
927                         --format= --list --verbose
928                         --prefix= --remote= --exec=
929                         "
930                 return
931                 ;;
932         esac
933         __git_complete_file
934 }
935
936 _git_bisect ()
937 {
938         __git_has_doubledash && return
939
940         local subcommands="start bad good skip reset visualize replay log run"
941         local subcommand="$(__git_find_on_cmdline "$subcommands")"
942         if [ -z "$subcommand" ]; then
943                 if [ -f "$(__gitdir)"/BISECT_START ]; then
944                         __gitcomp "$subcommands"
945                 else
946                         __gitcomp "replay start"
947                 fi
948                 return
949         fi
950
951         case "$subcommand" in
952         bad|good|reset|skip|start)
953                 __gitcomp_nl "$(__git_refs)"
954                 ;;
955         *)
956                 ;;
957         esac
958 }
959
960 _git_branch ()
961 {
962         local i c=1 only_local_ref="n" has_r="n"
963
964         while [ $c -lt $cword ]; do
965                 i="${words[c]}"
966                 case "$i" in
967                 -d|-m)  only_local_ref="y" ;;
968                 -r)     has_r="y" ;;
969                 esac
970                 ((c++))
971         done
972
973         case "$cur" in
974         --set-upstream-to=*)
975                 __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}"
976                 ;;
977         --*)
978                 __gitcomp "
979                         --color --no-color --verbose --abbrev= --no-abbrev
980                         --track --no-track --contains --merged --no-merged
981                         --set-upstream-to= --edit-description --list
982                         --unset-upstream
983                         "
984                 ;;
985         *)
986                 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
987                         __gitcomp_nl "$(__git_heads)"
988                 else
989                         __gitcomp_nl "$(__git_refs)"
990                 fi
991                 ;;
992         esac
993 }
994
995 _git_bundle ()
996 {
997         local cmd="${words[2]}"
998         case "$cword" in
999         2)
1000                 __gitcomp "create list-heads verify unbundle"
1001                 ;;
1002         3)
1003                 # looking for a file
1004                 ;;
1005         *)
1006                 case "$cmd" in
1007                         create)
1008                                 __git_complete_revlist
1009                         ;;
1010                 esac
1011                 ;;
1012         esac
1013 }
1014
1015 _git_checkout ()
1016 {
1017         __git_has_doubledash && return
1018
1019         case "$cur" in
1020         --conflict=*)
1021                 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1022                 ;;
1023         --*)
1024                 __gitcomp "
1025                         --quiet --ours --theirs --track --no-track --merge
1026                         --conflict= --orphan --patch
1027                         "
1028                 ;;
1029         *)
1030                 # check if --track, --no-track, or --no-guess was specified
1031                 # if so, disable DWIM mode
1032                 local flags="--track --no-track --no-guess" track=1
1033                 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1034                         track=''
1035                 fi
1036                 __gitcomp_nl "$(__git_refs '' $track)"
1037                 ;;
1038         esac
1039 }
1040
1041 _git_cherry ()
1042 {
1043         __gitcomp_nl "$(__git_refs)"
1044 }
1045
1046 _git_cherry_pick ()
1047 {
1048         local dir="$(__gitdir)"
1049         if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1050                 __gitcomp "--continue --quit --abort"
1051                 return
1052         fi
1053         case "$cur" in
1054         --*)
1055                 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1056                 ;;
1057         *)
1058                 __gitcomp_nl "$(__git_refs)"
1059                 ;;
1060         esac
1061 }
1062
1063 _git_clean ()
1064 {
1065         case "$cur" in
1066         --*)
1067                 __gitcomp "--dry-run --quiet"
1068                 return
1069                 ;;
1070         esac
1071
1072         # XXX should we check for -x option ?
1073         __git_complete_index_file "--others --directory"
1074 }
1075
1076 _git_clone ()
1077 {
1078         case "$cur" in
1079         --*)
1080                 __gitcomp "
1081                         --local
1082                         --no-hardlinks
1083                         --shared
1084                         --reference
1085                         --quiet
1086                         --no-checkout
1087                         --bare
1088                         --mirror
1089                         --origin
1090                         --upload-pack
1091                         --template=
1092                         --depth
1093                         --single-branch
1094                         --branch
1095                         "
1096                 return
1097                 ;;
1098         esac
1099 }
1100
1101 _git_commit ()
1102 {
1103         case "$prev" in
1104         -c|-C)
1105                 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1106                 return
1107                 ;;
1108         esac
1109
1110         case "$cur" in
1111         --cleanup=*)
1112                 __gitcomp "default scissors strip verbatim whitespace
1113                         " "" "${cur##--cleanup=}"
1114                 return
1115                 ;;
1116         --reuse-message=*|--reedit-message=*|\
1117         --fixup=*|--squash=*)
1118                 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1119                 return
1120                 ;;
1121         --untracked-files=*)
1122                 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1123                 return
1124                 ;;
1125         --*)
1126                 __gitcomp "
1127                         --all --author= --signoff --verify --no-verify
1128                         --edit --no-edit
1129                         --amend --include --only --interactive
1130                         --dry-run --reuse-message= --reedit-message=
1131                         --reset-author --file= --message= --template=
1132                         --cleanup= --untracked-files --untracked-files=
1133                         --verbose --quiet --fixup= --squash=
1134                         "
1135                 return
1136         esac
1137
1138         if git rev-parse --verify --quiet HEAD >/dev/null; then
1139                 __git_complete_index_file "--committable"
1140         else
1141                 # This is the first commit
1142                 __git_complete_index_file "--cached"
1143         fi
1144 }
1145
1146 _git_describe ()
1147 {
1148         case "$cur" in
1149         --*)
1150                 __gitcomp "
1151                         --all --tags --contains --abbrev= --candidates=
1152                         --exact-match --debug --long --match --always
1153                         "
1154                 return
1155         esac
1156         __gitcomp_nl "$(__git_refs)"
1157 }
1158
1159 __git_diff_algorithms="myers minimal patience histogram"
1160
1161 __git_diff_submodule_formats="log short"
1162
1163 __git_diff_common_options="--stat --numstat --shortstat --summary
1164                         --patch-with-stat --name-only --name-status --color
1165                         --no-color --color-words --no-renames --check
1166                         --full-index --binary --abbrev --diff-filter=
1167                         --find-copies-harder
1168                         --text --ignore-space-at-eol --ignore-space-change
1169                         --ignore-all-space --ignore-blank-lines --exit-code
1170                         --quiet --ext-diff --no-ext-diff
1171                         --no-prefix --src-prefix= --dst-prefix=
1172                         --inter-hunk-context=
1173                         --patience --histogram --minimal
1174                         --raw --word-diff --word-diff-regex=
1175                         --dirstat --dirstat= --dirstat-by-file
1176                         --dirstat-by-file= --cumulative
1177                         --diff-algorithm=
1178                         --submodule --submodule=
1179 "
1180
1181 _git_diff ()
1182 {
1183         __git_has_doubledash && return
1184
1185         case "$cur" in
1186         --diff-algorithm=*)
1187                 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1188                 return
1189                 ;;
1190         --submodule=*)
1191                 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1192                 return
1193                 ;;
1194         --*)
1195                 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1196                         --base --ours --theirs --no-index
1197                         $__git_diff_common_options
1198                         "
1199                 return
1200                 ;;
1201         esac
1202         __git_complete_revlist_file
1203 }
1204
1205 __git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1206                         tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
1207 "
1208
1209 _git_difftool ()
1210 {
1211         __git_has_doubledash && return
1212
1213         case "$cur" in
1214         --tool=*)
1215                 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1216                 return
1217                 ;;
1218         --*)
1219                 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1220                         --base --ours --theirs
1221                         --no-renames --diff-filter= --find-copies-harder
1222                         --relative --ignore-submodules
1223                         --tool="
1224                 return
1225                 ;;
1226         esac
1227         __git_complete_revlist_file
1228 }
1229
1230 __git_fetch_recurse_submodules="yes on-demand no"
1231
1232 __git_fetch_options="
1233         --quiet --verbose --append --upload-pack --force --keep --depth=
1234         --tags --no-tags --all --prune --dry-run --recurse-submodules=
1235 "
1236
1237 _git_fetch ()
1238 {
1239         case "$cur" in
1240         --recurse-submodules=*)
1241                 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1242                 return
1243                 ;;
1244         --*)
1245                 __gitcomp "$__git_fetch_options"
1246                 return
1247                 ;;
1248         esac
1249         __git_complete_remote_or_refspec
1250 }
1251
1252 __git_format_patch_options="
1253         --stdout --attach --no-attach --thread --thread= --no-thread
1254         --numbered --start-number --numbered-files --keep-subject --signoff
1255         --signature --no-signature --in-reply-to= --cc= --full-index --binary
1256         --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1257         --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1258         --output-directory --reroll-count --to= --quiet --notes
1259 "
1260
1261 _git_format_patch ()
1262 {
1263         case "$cur" in
1264         --thread=*)
1265                 __gitcomp "
1266                         deep shallow
1267                         " "" "${cur##--thread=}"
1268                 return
1269                 ;;
1270         --*)
1271                 __gitcomp "$__git_format_patch_options"
1272                 return
1273                 ;;
1274         esac
1275         __git_complete_revlist
1276 }
1277
1278 _git_fsck ()
1279 {
1280         case "$cur" in
1281         --*)
1282                 __gitcomp "
1283                         --tags --root --unreachable --cache --no-reflogs --full
1284                         --strict --verbose --lost-found
1285                         "
1286                 return
1287                 ;;
1288         esac
1289 }
1290
1291 _git_gc ()
1292 {
1293         case "$cur" in
1294         --*)
1295                 __gitcomp "--prune --aggressive"
1296                 return
1297                 ;;
1298         esac
1299 }
1300
1301 _git_gitk ()
1302 {
1303         _gitk
1304 }
1305
1306 __git_match_ctag() {
1307         awk "/^${1//\//\\/}/ { print \$1 }" "$2"
1308 }
1309
1310 _git_grep ()
1311 {
1312         __git_has_doubledash && return
1313
1314         case "$cur" in
1315         --*)
1316                 __gitcomp "
1317                         --cached
1318                         --text --ignore-case --word-regexp --invert-match
1319                         --full-name --line-number
1320                         --extended-regexp --basic-regexp --fixed-strings
1321                         --perl-regexp
1322                         --threads
1323                         --files-with-matches --name-only
1324                         --files-without-match
1325                         --max-depth
1326                         --count
1327                         --and --or --not --all-match
1328                         "
1329                 return
1330                 ;;
1331         esac
1332
1333         case "$cword,$prev" in
1334         2,*|*,-*)
1335                 if test -r tags; then
1336                         __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1337                         return
1338                 fi
1339                 ;;
1340         esac
1341
1342         __gitcomp_nl "$(__git_refs)"
1343 }
1344
1345 _git_help ()
1346 {
1347         case "$cur" in
1348         --*)
1349                 __gitcomp "--all --guides --info --man --web"
1350                 return
1351                 ;;
1352         esac
1353         __git_compute_all_commands
1354         __gitcomp "$__git_all_commands $(__git_aliases)
1355                 attributes cli core-tutorial cvs-migration
1356                 diffcore everyday gitk glossary hooks ignore modules
1357                 namespaces repository-layout revisions tutorial tutorial-2
1358                 workflows
1359                 "
1360 }
1361
1362 _git_init ()
1363 {
1364         case "$cur" in
1365         --shared=*)
1366                 __gitcomp "
1367                         false true umask group all world everybody
1368                         " "" "${cur##--shared=}"
1369                 return
1370                 ;;
1371         --*)
1372                 __gitcomp "--quiet --bare --template= --shared --shared="
1373                 return
1374                 ;;
1375         esac
1376 }
1377
1378 _git_ls_files ()
1379 {
1380         case "$cur" in
1381         --*)
1382                 __gitcomp "--cached --deleted --modified --others --ignored
1383                         --stage --directory --no-empty-directory --unmerged
1384                         --killed --exclude= --exclude-from=
1385                         --exclude-per-directory= --exclude-standard
1386                         --error-unmatch --with-tree= --full-name
1387                         --abbrev --ignored --exclude-per-directory
1388                         "
1389                 return
1390                 ;;
1391         esac
1392
1393         # XXX ignore options like --modified and always suggest all cached
1394         # files.
1395         __git_complete_index_file "--cached"
1396 }
1397
1398 _git_ls_remote ()
1399 {
1400         __gitcomp_nl "$(__git_remotes)"
1401 }
1402
1403 _git_ls_tree ()
1404 {
1405         __git_complete_file
1406 }
1407
1408 # Options that go well for log, shortlog and gitk
1409 __git_log_common_options="
1410         --not --all
1411         --branches --tags --remotes
1412         --first-parent --merges --no-merges
1413         --max-count=
1414         --max-age= --since= --after=
1415         --min-age= --until= --before=
1416         --min-parents= --max-parents=
1417         --no-min-parents --no-max-parents
1418 "
1419 # Options that go well for log and gitk (not shortlog)
1420 __git_log_gitk_options="
1421         --dense --sparse --full-history
1422         --simplify-merges --simplify-by-decoration
1423         --left-right --notes --no-notes
1424 "
1425 # Options that go well for log and shortlog (not gitk)
1426 __git_log_shortlog_options="
1427         --author= --committer= --grep=
1428         --all-match --invert-grep
1429 "
1430
1431 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1432 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1433
1434 _git_log ()
1435 {
1436         __git_has_doubledash && return
1437
1438         local g="$(git rev-parse --git-dir 2>/dev/null)"
1439         local merge=""
1440         if [ -f "$g/MERGE_HEAD" ]; then
1441                 merge="--merge"
1442         fi
1443         case "$cur" in
1444         --pretty=*|--format=*)
1445                 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1446                         " "" "${cur#*=}"
1447                 return
1448                 ;;
1449         --date=*)
1450                 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1451                 return
1452                 ;;
1453         --decorate=*)
1454                 __gitcomp "full short no" "" "${cur##--decorate=}"
1455                 return
1456                 ;;
1457         --diff-algorithm=*)
1458                 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1459                 return
1460                 ;;
1461         --submodule=*)
1462                 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1463                 return
1464                 ;;
1465         --*)
1466                 __gitcomp "
1467                         $__git_log_common_options
1468                         $__git_log_shortlog_options
1469                         $__git_log_gitk_options
1470                         --root --topo-order --date-order --reverse
1471                         --follow --full-diff
1472                         --abbrev-commit --abbrev=
1473                         --relative-date --date=
1474                         --pretty= --format= --oneline
1475                         --show-signature
1476                         --cherry-mark
1477                         --cherry-pick
1478                         --graph
1479                         --decorate --decorate=
1480                         --walk-reflogs
1481                         --parents --children
1482                         $merge
1483                         $__git_diff_common_options
1484                         --pickaxe-all --pickaxe-regex
1485                         "
1486                 return
1487                 ;;
1488         esac
1489         __git_complete_revlist
1490 }
1491
1492 # Common merge options shared by git-merge(1) and git-pull(1).
1493 __git_merge_options="
1494         --no-commit --no-stat --log --no-log --squash --strategy
1495         --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1496         --verify-signatures --no-verify-signatures --gpg-sign
1497         --quiet --verbose --progress --no-progress
1498 "
1499
1500 _git_merge ()
1501 {
1502         __git_complete_strategy && return
1503
1504         case "$cur" in
1505         --*)
1506                 __gitcomp "$__git_merge_options
1507                         --rerere-autoupdate --no-rerere-autoupdate --abort"
1508                 return
1509         esac
1510         __gitcomp_nl "$(__git_refs)"
1511 }
1512
1513 _git_mergetool ()
1514 {
1515         case "$cur" in
1516         --tool=*)
1517                 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1518                 return
1519                 ;;
1520         --*)
1521                 __gitcomp "--tool="
1522                 return
1523                 ;;
1524         esac
1525 }
1526
1527 _git_merge_base ()
1528 {
1529         case "$cur" in
1530         --*)
1531                 __gitcomp "--octopus --independent --is-ancestor --fork-point"
1532                 return
1533                 ;;
1534         esac
1535         __gitcomp_nl "$(__git_refs)"
1536 }
1537
1538 _git_mv ()
1539 {
1540         case "$cur" in
1541         --*)
1542                 __gitcomp "--dry-run"
1543                 return
1544                 ;;
1545         esac
1546
1547         if [ $(__git_count_arguments "mv") -gt 0 ]; then
1548                 # We need to show both cached and untracked files (including
1549                 # empty directories) since this may not be the last argument.
1550                 __git_complete_index_file "--cached --others --directory"
1551         else
1552                 __git_complete_index_file "--cached"
1553         fi
1554 }
1555
1556 _git_name_rev ()
1557 {
1558         __gitcomp "--tags --all --stdin"
1559 }
1560
1561 _git_notes ()
1562 {
1563         local subcommands='add append copy edit list prune remove show'
1564         local subcommand="$(__git_find_on_cmdline "$subcommands")"
1565
1566         case "$subcommand,$cur" in
1567         ,--*)
1568                 __gitcomp '--ref'
1569                 ;;
1570         ,*)
1571                 case "$prev" in
1572                 --ref)
1573                         __gitcomp_nl "$(__git_refs)"
1574                         ;;
1575                 *)
1576                         __gitcomp "$subcommands --ref"
1577                         ;;
1578                 esac
1579                 ;;
1580         add,--reuse-message=*|append,--reuse-message=*|\
1581         add,--reedit-message=*|append,--reedit-message=*)
1582                 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1583                 ;;
1584         add,--*|append,--*)
1585                 __gitcomp '--file= --message= --reedit-message=
1586                                 --reuse-message='
1587                 ;;
1588         copy,--*)
1589                 __gitcomp '--stdin'
1590                 ;;
1591         prune,--*)
1592                 __gitcomp '--dry-run --verbose'
1593                 ;;
1594         prune,*)
1595                 ;;
1596         *)
1597                 case "$prev" in
1598                 -m|-F)
1599                         ;;
1600                 *)
1601                         __gitcomp_nl "$(__git_refs)"
1602                         ;;
1603                 esac
1604                 ;;
1605         esac
1606 }
1607
1608 _git_pull ()
1609 {
1610         __git_complete_strategy && return
1611
1612         case "$cur" in
1613         --recurse-submodules=*)
1614                 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1615                 return
1616                 ;;
1617         --*)
1618                 __gitcomp "
1619                         --rebase --no-rebase
1620                         $__git_merge_options
1621                         $__git_fetch_options
1622                 "
1623                 return
1624                 ;;
1625         esac
1626         __git_complete_remote_or_refspec
1627 }
1628
1629 __git_push_recurse_submodules="check on-demand"
1630
1631 __git_complete_force_with_lease ()
1632 {
1633         local cur_=$1
1634
1635         case "$cur_" in
1636         --*=)
1637                 ;;
1638         *:*)
1639                 __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
1640                 ;;
1641         *)
1642                 __gitcomp_nl "$(__git_refs)" "" "$cur_"
1643                 ;;
1644         esac
1645 }
1646
1647 _git_push ()
1648 {
1649         case "$prev" in
1650         --repo)
1651                 __gitcomp_nl "$(__git_remotes)"
1652                 return
1653                 ;;
1654         --recurse-submodules)
1655                 __gitcomp "$__git_push_recurse_submodules"
1656                 return
1657                 ;;
1658         esac
1659         case "$cur" in
1660         --repo=*)
1661                 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1662                 return
1663                 ;;
1664         --recurse-submodules=*)
1665                 __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1666                 return
1667                 ;;
1668         --force-with-lease=*)
1669                 __git_complete_force_with_lease "${cur##--force-with-lease=}"
1670                 return
1671                 ;;
1672         --*)
1673                 __gitcomp "
1674                         --all --mirror --tags --dry-run --force --verbose
1675                         --quiet --prune --delete --follow-tags
1676                         --receive-pack= --repo= --set-upstream
1677                         --force-with-lease --force-with-lease= --recurse-submodules=
1678                 "
1679                 return
1680                 ;;
1681         esac
1682         __git_complete_remote_or_refspec
1683 }
1684
1685 _git_rebase ()
1686 {
1687         local dir="$(__gitdir)"
1688         if [ -f "$dir"/rebase-merge/interactive ]; then
1689                 __gitcomp "--continue --skip --abort --edit-todo"
1690                 return
1691         elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1692                 __gitcomp "--continue --skip --abort"
1693                 return
1694         fi
1695         __git_complete_strategy && return
1696         case "$cur" in
1697         --whitespace=*)
1698                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1699                 return
1700                 ;;
1701         --*)
1702                 __gitcomp "
1703                         --onto --merge --strategy --interactive
1704                         --preserve-merges --stat --no-stat
1705                         --committer-date-is-author-date --ignore-date
1706                         --ignore-whitespace --whitespace=
1707                         --autosquash --no-autosquash
1708                         --fork-point --no-fork-point
1709                         --autostash --no-autostash
1710                         --verify --no-verify
1711                         --keep-empty --root --force-rebase --no-ff
1712                         --exec
1713                         "
1714
1715                 return
1716         esac
1717         __gitcomp_nl "$(__git_refs)"
1718 }
1719
1720 _git_reflog ()
1721 {
1722         local subcommands="show delete expire"
1723         local subcommand="$(__git_find_on_cmdline "$subcommands")"
1724
1725         if [ -z "$subcommand" ]; then
1726                 __gitcomp "$subcommands"
1727         else
1728                 __gitcomp_nl "$(__git_refs)"
1729         fi
1730 }
1731
1732 __git_send_email_confirm_options="always never auto cc compose"
1733 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1734
1735 _git_send_email ()
1736 {
1737         case "$prev" in
1738         --to|--cc|--bcc|--from)
1739                 __gitcomp "
1740                 $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1741                 "
1742                 return
1743                 ;;
1744         esac
1745
1746         case "$cur" in
1747         --confirm=*)
1748                 __gitcomp "
1749                         $__git_send_email_confirm_options
1750                         " "" "${cur##--confirm=}"
1751                 return
1752                 ;;
1753         --suppress-cc=*)
1754                 __gitcomp "
1755                         $__git_send_email_suppresscc_options
1756                         " "" "${cur##--suppress-cc=}"
1757
1758                 return
1759                 ;;
1760         --smtp-encryption=*)
1761                 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1762                 return
1763                 ;;
1764         --thread=*)
1765                 __gitcomp "
1766                         deep shallow
1767                         " "" "${cur##--thread=}"
1768                 return
1769                 ;;
1770         --to=*|--cc=*|--bcc=*|--from=*)
1771                 __gitcomp "
1772                 $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1773                 " "" "${cur#--*=}"
1774                 return
1775                 ;;
1776         --*)
1777                 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1778                         --compose --confirm= --dry-run --envelope-sender
1779                         --from --identity
1780                         --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1781                         --no-suppress-from --no-thread --quiet
1782                         --signed-off-by-cc --smtp-pass --smtp-server
1783                         --smtp-server-port --smtp-encryption= --smtp-user
1784                         --subject --suppress-cc= --suppress-from --thread --to
1785                         --validate --no-validate
1786                         $__git_format_patch_options"
1787                 return
1788                 ;;
1789         esac
1790         __git_complete_revlist
1791 }
1792
1793 _git_stage ()
1794 {
1795         _git_add
1796 }
1797
1798 __git_config_get_set_variables ()
1799 {
1800         local prevword word config_file= c=$cword
1801         while [ $c -gt 1 ]; do
1802                 word="${words[c]}"
1803                 case "$word" in
1804                 --system|--global|--local|--file=*)
1805                         config_file="$word"
1806                         break
1807                         ;;
1808                 -f|--file)
1809                         config_file="$word $prevword"
1810                         break
1811                         ;;
1812                 esac
1813                 prevword=$word
1814                 c=$((--c))
1815         done
1816
1817         git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
1818 }
1819
1820 _git_config ()
1821 {
1822         case "$prev" in
1823         branch.*.remote|branch.*.pushremote)
1824                 __gitcomp_nl "$(__git_remotes)"
1825                 return
1826                 ;;
1827         branch.*.merge)
1828                 __gitcomp_nl "$(__git_refs)"
1829                 return
1830                 ;;
1831         branch.*.rebase)
1832                 __gitcomp "false true preserve interactive"
1833                 return
1834                 ;;
1835         remote.pushdefault)
1836                 __gitcomp_nl "$(__git_remotes)"
1837                 return
1838                 ;;
1839         remote.*.fetch)
1840                 local remote="${prev#remote.}"
1841                 remote="${remote%.fetch}"
1842                 if [ -z "$cur" ]; then
1843                         __gitcomp_nl "refs/heads/" "" "" ""
1844                         return
1845                 fi
1846                 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1847                 return
1848                 ;;
1849         remote.*.push)
1850                 local remote="${prev#remote.}"
1851                 remote="${remote%.push}"
1852                 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1853                         for-each-ref --format='%(refname):%(refname)' \
1854                         refs/heads)"
1855                 return
1856                 ;;
1857         pull.twohead|pull.octopus)
1858                 __git_compute_merge_strategies
1859                 __gitcomp "$__git_merge_strategies"
1860                 return
1861                 ;;
1862         color.branch|color.diff|color.interactive|\
1863         color.showbranch|color.status|color.ui)
1864                 __gitcomp "always never auto"
1865                 return
1866                 ;;
1867         color.pager)
1868                 __gitcomp "false true"
1869                 return
1870                 ;;
1871         color.*.*)
1872                 __gitcomp "
1873                         normal black red green yellow blue magenta cyan white
1874                         bold dim ul blink reverse
1875                         "
1876                 return
1877                 ;;
1878         diff.submodule)
1879                 __gitcomp "log short"
1880                 return
1881                 ;;
1882         help.format)
1883                 __gitcomp "man info web html"
1884                 return
1885                 ;;
1886         log.date)
1887                 __gitcomp "$__git_log_date_formats"
1888                 return
1889                 ;;
1890         sendemail.aliasesfiletype)
1891                 __gitcomp "mutt mailrc pine elm gnus"
1892                 return
1893                 ;;
1894         sendemail.confirm)
1895                 __gitcomp "$__git_send_email_confirm_options"
1896                 return
1897                 ;;
1898         sendemail.suppresscc)
1899                 __gitcomp "$__git_send_email_suppresscc_options"
1900                 return
1901                 ;;
1902         sendemail.transferencoding)
1903                 __gitcomp "7bit 8bit quoted-printable base64"
1904                 return
1905                 ;;
1906         --get|--get-all|--unset|--unset-all)
1907                 __gitcomp_nl "$(__git_config_get_set_variables)"
1908                 return
1909                 ;;
1910         *.*)
1911                 return
1912                 ;;
1913         esac
1914         case "$cur" in
1915         --*)
1916                 __gitcomp "
1917                         --system --global --local --file=
1918                         --list --replace-all
1919                         --get --get-all --get-regexp
1920                         --add --unset --unset-all
1921                         --remove-section --rename-section
1922                         --name-only
1923                         "
1924                 return
1925                 ;;
1926         branch.*.*)
1927                 local pfx="${cur%.*}." cur_="${cur##*.}"
1928                 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
1929                 return
1930                 ;;
1931         branch.*)
1932                 local pfx="${cur%.*}." cur_="${cur#*.}"
1933                 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1934                 __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
1935                 return
1936                 ;;
1937         guitool.*.*)
1938                 local pfx="${cur%.*}." cur_="${cur##*.}"
1939                 __gitcomp "
1940                         argprompt cmd confirm needsfile noconsole norescan
1941                         prompt revprompt revunmerged title
1942                         " "$pfx" "$cur_"
1943                 return
1944                 ;;
1945         difftool.*.*)
1946                 local pfx="${cur%.*}." cur_="${cur##*.}"
1947                 __gitcomp "cmd path" "$pfx" "$cur_"
1948                 return
1949                 ;;
1950         man.*.*)
1951                 local pfx="${cur%.*}." cur_="${cur##*.}"
1952                 __gitcomp "cmd path" "$pfx" "$cur_"
1953                 return
1954                 ;;
1955         mergetool.*.*)
1956                 local pfx="${cur%.*}." cur_="${cur##*.}"
1957                 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1958                 return
1959                 ;;
1960         pager.*)
1961                 local pfx="${cur%.*}." cur_="${cur#*.}"
1962                 __git_compute_all_commands
1963                 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1964                 return
1965                 ;;
1966         remote.*.*)
1967                 local pfx="${cur%.*}." cur_="${cur##*.}"
1968                 __gitcomp "
1969                         url proxy fetch push mirror skipDefaultUpdate
1970                         receivepack uploadpack tagopt pushurl
1971                         " "$pfx" "$cur_"
1972                 return
1973                 ;;
1974         remote.*)
1975                 local pfx="${cur%.*}." cur_="${cur#*.}"
1976                 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1977                 __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
1978                 return
1979                 ;;
1980         url.*.*)
1981                 local pfx="${cur%.*}." cur_="${cur##*.}"
1982                 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1983                 return
1984                 ;;
1985         esac
1986         __gitcomp "
1987                 add.ignoreErrors
1988                 advice.commitBeforeMerge
1989                 advice.detachedHead
1990                 advice.implicitIdentity
1991                 advice.pushNonFastForward
1992                 advice.resolveConflict
1993                 advice.statusHints
1994                 alias.
1995                 am.keepcr
1996                 apply.ignorewhitespace
1997                 apply.whitespace
1998                 branch.autosetupmerge
1999                 branch.autosetuprebase
2000                 browser.
2001                 clean.requireForce
2002                 color.branch
2003                 color.branch.current
2004                 color.branch.local
2005                 color.branch.plain
2006                 color.branch.remote
2007                 color.decorate.HEAD
2008                 color.decorate.branch
2009                 color.decorate.remoteBranch
2010                 color.decorate.stash
2011                 color.decorate.tag
2012                 color.diff
2013                 color.diff.commit
2014                 color.diff.frag
2015                 color.diff.func
2016                 color.diff.meta
2017                 color.diff.new
2018                 color.diff.old
2019                 color.diff.plain
2020                 color.diff.whitespace
2021                 color.grep
2022                 color.grep.context
2023                 color.grep.filename
2024                 color.grep.function
2025                 color.grep.linenumber
2026                 color.grep.match
2027                 color.grep.selected
2028                 color.grep.separator
2029                 color.interactive
2030                 color.interactive.error
2031                 color.interactive.header
2032                 color.interactive.help
2033                 color.interactive.prompt
2034                 color.pager
2035                 color.showbranch
2036                 color.status
2037                 color.status.added
2038                 color.status.changed
2039                 color.status.header
2040                 color.status.nobranch
2041                 color.status.unmerged
2042                 color.status.untracked
2043                 color.status.updated
2044                 color.ui
2045                 commit.status
2046                 commit.template
2047                 core.abbrev
2048                 core.askpass
2049                 core.attributesfile
2050                 core.autocrlf
2051                 core.bare
2052                 core.bigFileThreshold
2053                 core.compression
2054                 core.createObject
2055                 core.deltaBaseCacheLimit
2056                 core.editor
2057                 core.eol
2058                 core.excludesfile
2059                 core.fileMode
2060                 core.fsyncobjectfiles
2061                 core.gitProxy
2062                 core.ignoreStat
2063                 core.ignorecase
2064                 core.logAllRefUpdates
2065                 core.loosecompression
2066                 core.notesRef
2067                 core.packedGitLimit
2068                 core.packedGitWindowSize
2069                 core.pager
2070                 core.preferSymlinkRefs
2071                 core.preloadindex
2072                 core.quotepath
2073                 core.repositoryFormatVersion
2074                 core.safecrlf
2075                 core.sharedRepository
2076                 core.sparseCheckout
2077                 core.symlinks
2078                 core.trustctime
2079                 core.untrackedCache
2080                 core.warnAmbiguousRefs
2081                 core.whitespace
2082                 core.worktree
2083                 diff.autorefreshindex
2084                 diff.external
2085                 diff.ignoreSubmodules
2086                 diff.mnemonicprefix
2087                 diff.noprefix
2088                 diff.renameLimit
2089                 diff.renames
2090                 diff.statGraphWidth
2091                 diff.submodule
2092                 diff.suppressBlankEmpty
2093                 diff.tool
2094                 diff.wordRegex
2095                 diff.algorithm
2096                 difftool.
2097                 difftool.prompt
2098                 fetch.recurseSubmodules
2099                 fetch.unpackLimit
2100                 format.attach
2101                 format.cc
2102                 format.coverLetter
2103                 format.headers
2104                 format.numbered
2105                 format.pretty
2106                 format.signature
2107                 format.signoff
2108                 format.subjectprefix
2109                 format.suffix
2110                 format.thread
2111                 format.to
2112                 gc.
2113                 gc.aggressiveWindow
2114                 gc.auto
2115                 gc.autopacklimit
2116                 gc.packrefs
2117                 gc.pruneexpire
2118                 gc.reflogexpire
2119                 gc.reflogexpireunreachable
2120                 gc.rerereresolved
2121                 gc.rerereunresolved
2122                 gitcvs.allbinary
2123                 gitcvs.commitmsgannotation
2124                 gitcvs.dbTableNamePrefix
2125                 gitcvs.dbdriver
2126                 gitcvs.dbname
2127                 gitcvs.dbpass
2128                 gitcvs.dbuser
2129                 gitcvs.enabled
2130                 gitcvs.logfile
2131                 gitcvs.usecrlfattr
2132                 guitool.
2133                 gui.blamehistoryctx
2134                 gui.commitmsgwidth
2135                 gui.copyblamethreshold
2136                 gui.diffcontext
2137                 gui.encoding
2138                 gui.fastcopyblame
2139                 gui.matchtrackingbranch
2140                 gui.newbranchtemplate
2141                 gui.pruneduringfetch
2142                 gui.spellingdictionary
2143                 gui.trustmtime
2144                 help.autocorrect
2145                 help.browser
2146                 help.format
2147                 http.lowSpeedLimit
2148                 http.lowSpeedTime
2149                 http.maxRequests
2150                 http.minSessions
2151                 http.noEPSV
2152                 http.postBuffer
2153                 http.proxy
2154                 http.sslCipherList
2155                 http.sslVersion
2156                 http.sslCAInfo
2157                 http.sslCAPath
2158                 http.sslCert
2159                 http.sslCertPasswordProtected
2160                 http.sslKey
2161                 http.sslVerify
2162                 http.useragent
2163                 i18n.commitEncoding
2164                 i18n.logOutputEncoding
2165                 imap.authMethod
2166                 imap.folder
2167                 imap.host
2168                 imap.pass
2169                 imap.port
2170                 imap.preformattedHTML
2171                 imap.sslverify
2172                 imap.tunnel
2173                 imap.user
2174                 init.templatedir
2175                 instaweb.browser
2176                 instaweb.httpd
2177                 instaweb.local
2178                 instaweb.modulepath
2179                 instaweb.port
2180                 interactive.singlekey
2181                 log.date
2182                 log.decorate
2183                 log.showroot
2184                 mailmap.file
2185                 man.
2186                 man.viewer
2187                 merge.
2188                 merge.conflictstyle
2189                 merge.log
2190                 merge.renameLimit
2191                 merge.renormalize
2192                 merge.stat
2193                 merge.tool
2194                 merge.verbosity
2195                 mergetool.
2196                 mergetool.keepBackup
2197                 mergetool.keepTemporaries
2198                 mergetool.prompt
2199                 notes.displayRef
2200                 notes.rewrite.
2201                 notes.rewrite.amend
2202                 notes.rewrite.rebase
2203                 notes.rewriteMode
2204                 notes.rewriteRef
2205                 pack.compression
2206                 pack.deltaCacheLimit
2207                 pack.deltaCacheSize
2208                 pack.depth
2209                 pack.indexVersion
2210                 pack.packSizeLimit
2211                 pack.threads
2212                 pack.window
2213                 pack.windowMemory
2214                 pager.
2215                 pretty.
2216                 pull.octopus
2217                 pull.twohead
2218                 push.default
2219                 push.followTags
2220                 rebase.autosquash
2221                 rebase.stat
2222                 receive.autogc
2223                 receive.denyCurrentBranch
2224                 receive.denyDeleteCurrent
2225                 receive.denyDeletes
2226                 receive.denyNonFastForwards
2227                 receive.fsckObjects
2228                 receive.unpackLimit
2229                 receive.updateserverinfo
2230                 remote.pushdefault
2231                 remotes.
2232                 repack.usedeltabaseoffset
2233                 rerere.autoupdate
2234                 rerere.enabled
2235                 sendemail.
2236                 sendemail.aliasesfile
2237                 sendemail.aliasfiletype
2238                 sendemail.bcc
2239                 sendemail.cc
2240                 sendemail.cccmd
2241                 sendemail.chainreplyto
2242                 sendemail.confirm
2243                 sendemail.envelopesender
2244                 sendemail.from
2245                 sendemail.identity
2246                 sendemail.multiedit
2247                 sendemail.signedoffbycc
2248                 sendemail.smtpdomain
2249                 sendemail.smtpencryption
2250                 sendemail.smtppass
2251                 sendemail.smtpserver
2252                 sendemail.smtpserveroption
2253                 sendemail.smtpserverport
2254                 sendemail.smtpuser
2255                 sendemail.suppresscc
2256                 sendemail.suppressfrom
2257                 sendemail.thread
2258                 sendemail.to
2259                 sendemail.validate
2260                 showbranch.default
2261                 status.relativePaths
2262                 status.showUntrackedFiles
2263                 status.submodulesummary
2264                 submodule.
2265                 tar.umask
2266                 transfer.unpackLimit
2267                 url.
2268                 user.email
2269                 user.name
2270                 user.signingkey
2271                 web.browser
2272                 branch. remote.
2273         "
2274 }
2275
2276 _git_remote ()
2277 {
2278         local subcommands="add rename remove set-head set-branches set-url show prune update"
2279         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2280         if [ -z "$subcommand" ]; then
2281                 __gitcomp "$subcommands"
2282                 return
2283         fi
2284
2285         case "$subcommand" in
2286         rename|remove|set-url|show|prune)
2287                 __gitcomp_nl "$(__git_remotes)"
2288                 ;;
2289         set-head|set-branches)
2290                 __git_complete_remote_or_refspec
2291                 ;;
2292         update)
2293                 __gitcomp "$(__git_get_config_variables "remotes")"
2294                 ;;
2295         *)
2296                 ;;
2297         esac
2298 }
2299
2300 _git_replace ()
2301 {
2302         __gitcomp_nl "$(__git_refs)"
2303 }
2304
2305 _git_reset ()
2306 {
2307         __git_has_doubledash && return
2308
2309         case "$cur" in
2310         --*)
2311                 __gitcomp "--merge --mixed --hard --soft --patch"
2312                 return
2313                 ;;
2314         esac
2315         __gitcomp_nl "$(__git_refs)"
2316 }
2317
2318 _git_revert ()
2319 {
2320         local dir="$(__gitdir)"
2321         if [ -f "$dir"/REVERT_HEAD ]; then
2322                 __gitcomp "--continue --quit --abort"
2323                 return
2324         fi
2325         case "$cur" in
2326         --*)
2327                 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2328                 return
2329                 ;;
2330         esac
2331         __gitcomp_nl "$(__git_refs)"
2332 }
2333
2334 _git_rm ()
2335 {
2336         case "$cur" in
2337         --*)
2338                 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2339                 return
2340                 ;;
2341         esac
2342
2343         __git_complete_index_file "--cached"
2344 }
2345
2346 _git_shortlog ()
2347 {
2348         __git_has_doubledash && return
2349
2350         case "$cur" in
2351         --*)
2352                 __gitcomp "
2353                         $__git_log_common_options
2354                         $__git_log_shortlog_options
2355                         --numbered --summary
2356                         "
2357                 return
2358                 ;;
2359         esac
2360         __git_complete_revlist
2361 }
2362
2363 _git_show ()
2364 {
2365         __git_has_doubledash && return
2366
2367         case "$cur" in
2368         --pretty=*|--format=*)
2369                 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2370                         " "" "${cur#*=}"
2371                 return
2372                 ;;
2373         --diff-algorithm=*)
2374                 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2375                 return
2376                 ;;
2377         --submodule=*)
2378                 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
2379                 return
2380                 ;;
2381         --*)
2382                 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2383                         --show-signature
2384                         $__git_diff_common_options
2385                         "
2386                 return
2387                 ;;
2388         esac
2389         __git_complete_revlist_file
2390 }
2391
2392 _git_show_branch ()
2393 {
2394         case "$cur" in
2395         --*)
2396                 __gitcomp "
2397                         --all --remotes --topo-order --date-order --current --more=
2398                         --list --independent --merge-base --no-name
2399                         --color --no-color
2400                         --sha1-name --sparse --topics --reflog
2401                         "
2402                 return
2403                 ;;
2404         esac
2405         __git_complete_revlist
2406 }
2407
2408 _git_stash ()
2409 {
2410         local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
2411         local subcommands='save list show apply clear drop pop create branch'
2412         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2413         if [ -z "$subcommand" ]; then
2414                 case "$cur" in
2415                 --*)
2416                         __gitcomp "$save_opts"
2417                         ;;
2418                 *)
2419                         if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2420                                 __gitcomp "$subcommands"
2421                         fi
2422                         ;;
2423                 esac
2424         else
2425                 case "$subcommand,$cur" in
2426                 save,--*)
2427                         __gitcomp "$save_opts"
2428                         ;;
2429                 apply,--*|pop,--*)
2430                         __gitcomp "--index --quiet"
2431                         ;;
2432                 drop,--*)
2433                         __gitcomp "--quiet"
2434                         ;;
2435                 show,--*|branch,--*)
2436                         ;;
2437                 branch,*)
2438                         if [ $cword -eq 3 ]; then
2439                                 __gitcomp_nl "$(__git_refs)";
2440                         else
2441                                 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2442                                                 | sed -n -e 's/:.*//p')"
2443                         fi
2444                         ;;
2445                 show,*|apply,*|drop,*|pop,*)
2446                         __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2447                                         | sed -n -e 's/:.*//p')"
2448                         ;;
2449                 *)
2450                         ;;
2451                 esac
2452         fi
2453 }
2454
2455 _git_submodule ()
2456 {
2457         __git_has_doubledash && return
2458
2459         local subcommands="add status init deinit update summary foreach sync"
2460         if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2461                 case "$cur" in
2462                 --*)
2463                         __gitcomp "--quiet --cached"
2464                         ;;
2465                 *)
2466                         __gitcomp "$subcommands"
2467                         ;;
2468                 esac
2469                 return
2470         fi
2471 }
2472
2473 _git_svn ()
2474 {
2475         local subcommands="
2476                 init fetch clone rebase dcommit log find-rev
2477                 set-tree commit-diff info create-ignore propget
2478                 proplist show-ignore show-externals branch tag blame
2479                 migrate mkdirs reset gc
2480                 "
2481         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2482         if [ -z "$subcommand" ]; then
2483                 __gitcomp "$subcommands"
2484         else
2485                 local remote_opts="--username= --config-dir= --no-auth-cache"
2486                 local fc_opts="
2487                         --follow-parent --authors-file= --repack=
2488                         --no-metadata --use-svm-props --use-svnsync-props
2489                         --log-window-size= --no-checkout --quiet
2490                         --repack-flags --use-log-author --localtime
2491                         --ignore-paths= --include-paths= $remote_opts
2492                         "
2493                 local init_opts="
2494                         --template= --shared= --trunk= --tags=
2495                         --branches= --stdlayout --minimize-url
2496                         --no-metadata --use-svm-props --use-svnsync-props
2497                         --rewrite-root= --prefix= --use-log-author
2498                         --add-author-from $remote_opts
2499                         "
2500                 local cmt_opts="
2501                         --edit --rmdir --find-copies-harder --copy-similarity=
2502                         "
2503
2504                 case "$subcommand,$cur" in
2505                 fetch,--*)
2506                         __gitcomp "--revision= --fetch-all $fc_opts"
2507                         ;;
2508                 clone,--*)
2509                         __gitcomp "--revision= $fc_opts $init_opts"
2510                         ;;
2511                 init,--*)
2512                         __gitcomp "$init_opts"
2513                         ;;
2514                 dcommit,--*)
2515                         __gitcomp "
2516                                 --merge --strategy= --verbose --dry-run
2517                                 --fetch-all --no-rebase --commit-url
2518                                 --revision --interactive $cmt_opts $fc_opts
2519                                 "
2520                         ;;
2521                 set-tree,--*)
2522                         __gitcomp "--stdin $cmt_opts $fc_opts"
2523                         ;;
2524                 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2525                 show-externals,--*|mkdirs,--*)
2526                         __gitcomp "--revision="
2527                         ;;
2528                 log,--*)
2529                         __gitcomp "
2530                                 --limit= --revision= --verbose --incremental
2531                                 --oneline --show-commit --non-recursive
2532                                 --authors-file= --color
2533                                 "
2534                         ;;
2535                 rebase,--*)
2536                         __gitcomp "
2537                                 --merge --verbose --strategy= --local
2538                                 --fetch-all --dry-run $fc_opts
2539                                 "
2540                         ;;
2541                 commit-diff,--*)
2542                         __gitcomp "--message= --file= --revision= $cmt_opts"
2543                         ;;
2544                 info,--*)
2545                         __gitcomp "--url"
2546                         ;;
2547                 branch,--*)
2548                         __gitcomp "--dry-run --message --tag"
2549                         ;;
2550                 tag,--*)
2551                         __gitcomp "--dry-run --message"
2552                         ;;
2553                 blame,--*)
2554                         __gitcomp "--git-format"
2555                         ;;
2556                 migrate,--*)
2557                         __gitcomp "
2558                                 --config-dir= --ignore-paths= --minimize
2559                                 --no-auth-cache --username=
2560                                 "
2561                         ;;
2562                 reset,--*)
2563                         __gitcomp "--revision= --parent"
2564                         ;;
2565                 *)
2566                         ;;
2567                 esac
2568         fi
2569 }
2570
2571 _git_tag ()
2572 {
2573         local i c=1 f=0
2574         while [ $c -lt $cword ]; do
2575                 i="${words[c]}"
2576                 case "$i" in
2577                 -d|-v)
2578                         __gitcomp_nl "$(__git_tags)"
2579                         return
2580                         ;;
2581                 -f)
2582                         f=1
2583                         ;;
2584                 esac
2585                 ((c++))
2586         done
2587
2588         case "$prev" in
2589         -m|-F)
2590                 ;;
2591         -*|tag)
2592                 if [ $f = 1 ]; then
2593                         __gitcomp_nl "$(__git_tags)"
2594                 fi
2595                 ;;
2596         *)
2597                 __gitcomp_nl "$(__git_refs)"
2598                 ;;
2599         esac
2600
2601         case "$cur" in
2602         --*)
2603                 __gitcomp "
2604                         --list --delete --verify --annotate --message --file
2605                         --sign --cleanup --local-user --force --column --sort
2606                         --contains --points-at
2607                         "
2608                 ;;
2609         esac
2610 }
2611
2612 _git_whatchanged ()
2613 {
2614         _git_log
2615 }
2616
2617 __git_main ()
2618 {
2619         local i c=1 command __git_dir
2620
2621         while [ $c -lt $cword ]; do
2622                 i="${words[c]}"
2623                 case "$i" in
2624                 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2625                 --git-dir)   ((c++)) ; __git_dir="${words[c]}" ;;
2626                 --bare)      __git_dir="." ;;
2627                 --help) command="help"; break ;;
2628                 -c|--work-tree|--namespace) ((c++)) ;;
2629                 -*) ;;
2630                 *) command="$i"; break ;;
2631                 esac
2632                 ((c++))
2633         done
2634
2635         if [ -z "$command" ]; then
2636                 case "$cur" in
2637                 --*)   __gitcomp "
2638                         --paginate
2639                         --no-pager
2640                         --git-dir=
2641                         --bare
2642                         --version
2643                         --exec-path
2644                         --exec-path=
2645                         --html-path
2646                         --man-path
2647                         --info-path
2648                         --work-tree=
2649                         --namespace=
2650                         --no-replace-objects
2651                         --help
2652                         "
2653                         ;;
2654                 *)     __git_compute_porcelain_commands
2655                        __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2656                 esac
2657                 return
2658         fi
2659
2660         local completion_func="_git_${command//-/_}"
2661         declare -f $completion_func >/dev/null && $completion_func && return
2662
2663         local expansion=$(__git_aliased_command "$command")
2664         if [ -n "$expansion" ]; then
2665                 words[1]=$expansion
2666                 completion_func="_git_${expansion//-/_}"
2667                 declare -f $completion_func >/dev/null && $completion_func
2668         fi
2669 }
2670
2671 __gitk_main ()
2672 {
2673         __git_has_doubledash && return
2674
2675         local g="$(__gitdir)"
2676         local merge=""
2677         if [ -f "$g/MERGE_HEAD" ]; then
2678                 merge="--merge"
2679         fi
2680         case "$cur" in
2681         --*)
2682                 __gitcomp "
2683                         $__git_log_common_options
2684                         $__git_log_gitk_options
2685                         $merge
2686                         "
2687                 return
2688                 ;;
2689         esac
2690         __git_complete_revlist
2691 }
2692
2693 if [[ -n ${ZSH_VERSION-} ]]; then
2694         echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2695
2696         autoload -U +X compinit && compinit
2697
2698         __gitcomp ()
2699         {
2700                 emulate -L zsh
2701
2702                 local cur_="${3-$cur}"
2703
2704                 case "$cur_" in
2705                 --*=)
2706                         ;;
2707                 *)
2708                         local c IFS=$' \t\n'
2709                         local -a array
2710                         for c in ${=1}; do
2711                                 c="$c${4-}"
2712                                 case $c in
2713                                 --*=*|*.) ;;
2714                                 *) c="$c " ;;
2715                                 esac
2716                                 array[${#array[@]}+1]="$c"
2717                         done
2718                         compset -P '*[=:]'
2719                         compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2720                         ;;
2721                 esac
2722         }
2723
2724         __gitcomp_nl ()
2725         {
2726                 emulate -L zsh
2727
2728                 local IFS=$'\n'
2729                 compset -P '*[=:]'
2730                 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2731         }
2732
2733         __gitcomp_file ()
2734         {
2735                 emulate -L zsh
2736
2737                 local IFS=$'\n'
2738                 compset -P '*[=:]'
2739                 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2740         }
2741
2742         _git ()
2743         {
2744                 local _ret=1 cur cword prev
2745                 cur=${words[CURRENT]}
2746                 prev=${words[CURRENT-1]}
2747                 let cword=CURRENT-1
2748                 emulate ksh -c __${service}_main
2749                 let _ret && _default && _ret=0
2750                 return _ret
2751         }
2752
2753         compdef _git git gitk
2754         return
2755 fi
2756
2757 __git_func_wrap ()
2758 {
2759         local cur words cword prev
2760         _get_comp_words_by_ref -n =: cur words cword prev
2761         $1
2762 }
2763
2764 # Setup completion for certain functions defined above by setting common
2765 # variables and workarounds.
2766 # This is NOT a public function; use at your own risk.
2767 __git_complete ()
2768 {
2769         local wrapper="__git_wrap${2}"
2770         eval "$wrapper () { __git_func_wrap $2 ; }"
2771         complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2772                 || complete -o default -o nospace -F $wrapper $1
2773 }
2774
2775 # wrapper for backwards compatibility
2776 _git ()
2777 {
2778         __git_wrap__git_main
2779 }
2780
2781 # wrapper for backwards compatibility
2782 _gitk ()
2783 {
2784         __git_wrap__gitk_main
2785 }
2786
2787 __git_complete git __git_main
2788 __git_complete gitk __gitk_main
2789
2790 # The following are necessary only for Cygwin, and only are needed
2791 # when the user has tab-completed the executable name and consequently
2792 # included the '.exe' suffix.
2793 #
2794 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2795 __git_complete git.exe __git_main
2796 fi