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