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