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