Improve bash prompt to detect various states like an unfinished merge
[git] / contrib / completion / git-completion.bash
1 #
2 # bash completion support for core Git.
3 #
4 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
5 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
6 # Distributed under the GNU General Public License, version 2.0.
7 #
8 # The contained completion routines provide support for completing:
9 #
10 #    *) local and remote branch names
11 #    *) local and remote tag names
12 #    *) .git/remotes file names
13 #    *) git 'subcommands'
14 #    *) tree paths within 'ref:path/to/file' expressions
15 #    *) common --long-options
16 #
17 # To use these routines:
18 #
19 #    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
20 #    2) Added the following line to your .bashrc:
21 #        source ~/.git-completion.sh
22 #
23 #    3) You may want to make sure the git executable is available
24 #       in your PATH before this script is sourced, as some caching
25 #       is performed while the script loads.  If git isn't found
26 #       at source time then all lookups will be done on demand,
27 #       which may be slightly slower.
28 #
29 #    4) Consider changing your PS1 to also show the current branch:
30 #        PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
31 #
32 #       The argument to __git_ps1 will be displayed only if you
33 #       are currently in a git repository.  The %s token will be
34 #       the name of the current branch.
35 #
36 # To submit patches:
37 #
38 #    *) Read Documentation/SubmittingPatches
39 #    *) Send all patches to the current maintainer:
40 #
41 #       "Shawn O. Pearce" <spearce@spearce.org>
42 #
43 #    *) Always CC the Git mailing list:
44 #
45 #       git@vger.kernel.org
46 #
47
48 __gitdir ()
49 {
50         if [ -z "$1" ]; then
51                 if [ -n "$__git_dir" ]; then
52                         echo "$__git_dir"
53                 elif [ -d .git ]; then
54                         echo .git
55                 else
56                         git rev-parse --git-dir 2>/dev/null
57                 fi
58         elif [ -d "$1/.git" ]; then
59                 echo "$1/.git"
60         else
61                 echo "$1"
62         fi
63 }
64
65 __git_ps1 ()
66 {
67         local g="$(git rev-parse --git-dir 2>/dev/null)"
68         if [ -n "$g" ]; then
69                 local r
70                 local b
71                 if [ -d "$g/../.dotest" ]
72                 then
73                         r="|AM/REBASE"
74                         b="$(git symbolic-ref HEAD 2>/dev/null)"
75                 elif [ -f "$g/.dotest-merge/interactive" ]
76                 then
77                         r="|REBASE-i"
78                         b="$(cat $g/.dotest-merge/head-name)"
79                 elif [ -d "$g/.dotest-merge" ]
80                 then
81                         r="|REBASE-m"
82                         b="$(cat $g/.dotest-merge/head-name)"
83                 elif [ -f "$g/MERGE_HEAD" ]
84                 then
85                         r="|MERGING"
86                         b="$(git symbolic-ref HEAD 2>/dev/null)"
87                 else
88                         if [ -f $g/BISECT_LOG ]
89                         then
90                                 r="|BISECTING"
91                         fi
92                         if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
93                         then
94                                 b="$(cut -c1-7 $g/HEAD)..."
95                         fi
96                 fi
97
98                 if [ -n "$1" ]; then
99                         printf "$1" "${b##refs/heads/}$r"
100                 else
101                         printf " (%s)" "${b##refs/heads/}$r"
102                 fi
103         fi
104 }
105
106 __gitcomp ()
107 {
108         local all c s=$'\n' IFS=' '$'\t'$'\n'
109         local cur="${COMP_WORDS[COMP_CWORD]}"
110         if [ $# -gt 2 ]; then
111                 cur="$3"
112         fi
113         for c in $1; do
114                 case "$c$4" in
115                 --*=*) all="$all$c$4$s" ;;
116                 *.)    all="$all$c$4$s" ;;
117                 *)     all="$all$c$4 $s" ;;
118                 esac
119         done
120         IFS=$s
121         COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
122         return
123 }
124
125 __git_heads ()
126 {
127         local cmd i is_hash=y dir="$(__gitdir "$1")"
128         if [ -d "$dir" ]; then
129                 for i in $(git --git-dir="$dir" \
130                         for-each-ref --format='%(refname)' \
131                         refs/heads ); do
132                         echo "${i#refs/heads/}"
133                 done
134                 return
135         fi
136         for i in $(git-ls-remote "$1" 2>/dev/null); do
137                 case "$is_hash,$i" in
138                 y,*) is_hash=n ;;
139                 n,*^{}) is_hash=y ;;
140                 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
141                 n,*) is_hash=y; echo "$i" ;;
142                 esac
143         done
144 }
145
146 __git_tags ()
147 {
148         local cmd i is_hash=y dir="$(__gitdir "$1")"
149         if [ -d "$dir" ]; then
150                 for i in $(git --git-dir="$dir" \
151                         for-each-ref --format='%(refname)' \
152                         refs/tags ); do
153                         echo "${i#refs/tags/}"
154                 done
155                 return
156         fi
157         for i in $(git-ls-remote "$1" 2>/dev/null); do
158                 case "$is_hash,$i" in
159                 y,*) is_hash=n ;;
160                 n,*^{}) is_hash=y ;;
161                 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
162                 n,*) is_hash=y; echo "$i" ;;
163                 esac
164         done
165 }
166
167 __git_refs ()
168 {
169         local cmd i is_hash=y dir="$(__gitdir "$1")"
170         if [ -d "$dir" ]; then
171                 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
172                 for i in $(git --git-dir="$dir" \
173                         for-each-ref --format='%(refname)' \
174                         refs/tags refs/heads refs/remotes); do
175                         case "$i" in
176                                 refs/tags/*)    echo "${i#refs/tags/}" ;;
177                                 refs/heads/*)   echo "${i#refs/heads/}" ;;
178                                 refs/remotes/*) echo "${i#refs/remotes/}" ;;
179                                 *)              echo "$i" ;;
180                         esac
181                 done
182                 return
183         fi
184         for i in $(git-ls-remote "$dir" 2>/dev/null); do
185                 case "$is_hash,$i" in
186                 y,*) is_hash=n ;;
187                 n,*^{}) is_hash=y ;;
188                 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
189                 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
190                 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
191                 n,*) is_hash=y; echo "$i" ;;
192                 esac
193         done
194 }
195
196 __git_refs2 ()
197 {
198         local i
199         for i in $(__git_refs "$1"); do
200                 echo "$i:$i"
201         done
202 }
203
204 __git_refs_remotes ()
205 {
206         local cmd i is_hash=y
207         for i in $(git-ls-remote "$1" 2>/dev/null); do
208                 case "$is_hash,$i" in
209                 n,refs/heads/*)
210                         is_hash=y
211                         echo "$i:refs/remotes/$1/${i#refs/heads/}"
212                         ;;
213                 y,*) is_hash=n ;;
214                 n,*^{}) is_hash=y ;;
215                 n,refs/tags/*) is_hash=y;;
216                 n,*) is_hash=y; ;;
217                 esac
218         done
219 }
220
221 __git_remotes ()
222 {
223         local i ngoff IFS=$'\n' d="$(__gitdir)"
224         shopt -q nullglob || ngoff=1
225         shopt -s nullglob
226         for i in "$d/remotes"/*; do
227                 echo ${i#$d/remotes/}
228         done
229         [ "$ngoff" ] && shopt -u nullglob
230         for i in $(git --git-dir="$d" config --list); do
231                 case "$i" in
232                 remote.*.url=*)
233                         i="${i#remote.}"
234                         echo "${i/.url=*/}"
235                         ;;
236                 esac
237         done
238 }
239
240 __git_merge_strategies ()
241 {
242         if [ -n "$__git_merge_strategylist" ]; then
243                 echo "$__git_merge_strategylist"
244                 return
245         fi
246         sed -n "/^all_strategies='/{
247                 s/^all_strategies='//
248                 s/'//
249                 p
250                 q
251                 }" "$(git --exec-path)/git-merge"
252 }
253 __git_merge_strategylist=
254 __git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
255
256 __git_complete_file ()
257 {
258         local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
259         case "$cur" in
260         ?*:*)
261                 ref="${cur%%:*}"
262                 cur="${cur#*:}"
263                 case "$cur" in
264                 ?*/*)
265                         pfx="${cur%/*}"
266                         cur="${cur##*/}"
267                         ls="$ref:$pfx"
268                         pfx="$pfx/"
269                         ;;
270                 *)
271                         ls="$ref"
272                         ;;
273             esac
274                 COMPREPLY=($(compgen -P "$pfx" \
275                         -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
276                                 | sed '/^100... blob /s,^.*     ,,
277                                        /^040000 tree /{
278                                            s,^.*        ,,
279                                            s,$,/,
280                                        }
281                                        s/^.*    //')" \
282                         -- "$cur"))
283                 ;;
284         *)
285                 __gitcomp "$(__git_refs)"
286                 ;;
287         esac
288 }
289
290 __git_complete_revlist ()
291 {
292         local pfx cur="${COMP_WORDS[COMP_CWORD]}"
293         case "$cur" in
294         *...*)
295                 pfx="${cur%...*}..."
296                 cur="${cur#*...}"
297                 __gitcomp "$(__git_refs)" "$pfx" "$cur"
298                 ;;
299         *..*)
300                 pfx="${cur%..*}.."
301                 cur="${cur#*..}"
302                 __gitcomp "$(__git_refs)" "$pfx" "$cur"
303                 ;;
304         *.)
305                 __gitcomp "$cur."
306                 ;;
307         *)
308                 __gitcomp "$(__git_refs)"
309                 ;;
310         esac
311 }
312
313 __git_commands ()
314 {
315         if [ -n "$__git_commandlist" ]; then
316                 echo "$__git_commandlist"
317                 return
318         fi
319         local i IFS=" "$'\n'
320         for i in $(git help -a|egrep '^ ')
321         do
322                 case $i in
323                 *--*)             : helper pattern;;
324                 applymbox)        : ask gittus;;
325                 applypatch)       : ask gittus;;
326                 archimport)       : import;;
327                 cat-file)         : plumbing;;
328                 check-attr)       : plumbing;;
329                 check-ref-format) : plumbing;;
330                 commit-tree)      : plumbing;;
331                 cvsexportcommit)  : export;;
332                 cvsimport)        : import;;
333                 cvsserver)        : daemon;;
334                 daemon)           : daemon;;
335                 diff-files)       : plumbing;;
336                 diff-index)       : plumbing;;
337                 diff-tree)        : plumbing;;
338                 fast-import)      : import;;
339                 fsck-objects)     : plumbing;;
340                 fetch-pack)       : plumbing;;
341                 fmt-merge-msg)    : plumbing;;
342                 for-each-ref)     : plumbing;;
343                 hash-object)      : plumbing;;
344                 http-*)           : transport;;
345                 index-pack)       : plumbing;;
346                 init-db)          : deprecated;;
347                 local-fetch)      : plumbing;;
348                 mailinfo)         : plumbing;;
349                 mailsplit)        : plumbing;;
350                 merge-*)          : plumbing;;
351                 mktree)           : plumbing;;
352                 mktag)            : plumbing;;
353                 pack-objects)     : plumbing;;
354                 pack-redundant)   : plumbing;;
355                 pack-refs)        : plumbing;;
356                 parse-remote)     : plumbing;;
357                 patch-id)         : plumbing;;
358                 peek-remote)      : plumbing;;
359                 prune)            : plumbing;;
360                 prune-packed)     : plumbing;;
361                 quiltimport)      : import;;
362                 read-tree)        : plumbing;;
363                 receive-pack)     : plumbing;;
364                 reflog)           : plumbing;;
365                 repo-config)      : deprecated;;
366                 rerere)           : plumbing;;
367                 rev-list)         : plumbing;;
368                 rev-parse)        : plumbing;;
369                 runstatus)        : plumbing;;
370                 sh-setup)         : internal;;
371                 shell)            : daemon;;
372                 send-pack)        : plumbing;;
373                 show-index)       : plumbing;;
374                 ssh-*)            : transport;;
375                 stripspace)       : plumbing;;
376                 svn)              : import export;;
377                 symbolic-ref)     : plumbing;;
378                 tar-tree)         : deprecated;;
379                 unpack-file)      : plumbing;;
380                 unpack-objects)   : plumbing;;
381                 update-index)     : plumbing;;
382                 update-ref)       : plumbing;;
383                 update-server-info) : daemon;;
384                 upload-archive)   : plumbing;;
385                 upload-pack)      : plumbing;;
386                 write-tree)       : plumbing;;
387                 verify-tag)       : plumbing;;
388                 *) echo $i;;
389                 esac
390         done
391 }
392 __git_commandlist=
393 __git_commandlist="$(__git_commands 2>/dev/null)"
394
395 __git_aliases ()
396 {
397         local i IFS=$'\n'
398         for i in $(git --git-dir="$(__gitdir)" config --list); do
399                 case "$i" in
400                 alias.*)
401                         i="${i#alias.}"
402                         echo "${i/=*/}"
403                         ;;
404                 esac
405         done
406 }
407
408 __git_aliased_command ()
409 {
410         local word cmdline=$(git --git-dir="$(__gitdir)" \
411                 config --get "alias.$1")
412         for word in $cmdline; do
413                 if [ "${word##-*}" ]; then
414                         echo $word
415                         return
416                 fi
417         done
418 }
419
420 __git_whitespacelist="nowarn warn error error-all strip"
421
422 _git_am ()
423 {
424         local cur="${COMP_WORDS[COMP_CWORD]}"
425         if [ -d .dotest ]; then
426                 __gitcomp "--skip --resolved"
427                 return
428         fi
429         case "$cur" in
430         --whitespace=*)
431                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
432                 return
433                 ;;
434         --*)
435                 __gitcomp "
436                         --signoff --utf8 --binary --3way --interactive
437                         --whitespace=
438                         "
439                 return
440         esac
441         COMPREPLY=()
442 }
443
444 _git_apply ()
445 {
446         local cur="${COMP_WORDS[COMP_CWORD]}"
447         case "$cur" in
448         --whitespace=*)
449                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
450                 return
451                 ;;
452         --*)
453                 __gitcomp "
454                         --stat --numstat --summary --check --index
455                         --cached --index-info --reverse --reject --unidiff-zero
456                         --apply --no-add --exclude=
457                         --whitespace= --inaccurate-eof --verbose
458                         "
459                 return
460         esac
461         COMPREPLY=()
462 }
463
464 _git_add ()
465 {
466         local cur="${COMP_WORDS[COMP_CWORD]}"
467         case "$cur" in
468         --*)
469                 __gitcomp "--interactive --refresh"
470                 return
471         esac
472         COMPREPLY=()
473 }
474
475 _git_bisect ()
476 {
477         local i c=1 command
478         while [ $c -lt $COMP_CWORD ]; do
479                 i="${COMP_WORDS[c]}"
480                 case "$i" in
481                 start|bad|good|reset|visualize|replay|log)
482                         command="$i"
483                         break
484                         ;;
485                 esac
486                 c=$((++c))
487         done
488
489         if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
490                 __gitcomp "start bad good reset visualize replay log"
491                 return
492         fi
493
494         case "$command" in
495         bad|good|reset)
496                 __gitcomp "$(__git_refs)"
497                 ;;
498         *)
499                 COMPREPLY=()
500                 ;;
501         esac
502 }
503
504 _git_branch ()
505 {
506         __gitcomp "$(__git_refs)"
507 }
508
509 _git_bundle ()
510 {
511         local mycword="$COMP_CWORD"
512         case "${COMP_WORDS[0]}" in
513         git)
514                 local cmd="${COMP_WORDS[2]}"
515                 mycword="$((mycword-1))"
516                 ;;
517         git-bundle*)
518                 local cmd="${COMP_WORDS[1]}"
519                 ;;
520         esac
521         case "$mycword" in
522         1)
523                 __gitcomp "create list-heads verify unbundle"
524                 ;;
525         2)
526                 # looking for a file
527                 ;;
528         *)
529                 case "$cmd" in
530                         create)
531                                 __git_complete_revlist
532                         ;;
533                 esac
534                 ;;
535         esac
536 }
537
538 _git_checkout ()
539 {
540         __gitcomp "$(__git_refs)"
541 }
542
543 _git_cherry ()
544 {
545         __gitcomp "$(__git_refs)"
546 }
547
548 _git_cherry_pick ()
549 {
550         local cur="${COMP_WORDS[COMP_CWORD]}"
551         case "$cur" in
552         --*)
553                 __gitcomp "--edit --no-commit"
554                 ;;
555         *)
556                 __gitcomp "$(__git_refs)"
557                 ;;
558         esac
559 }
560
561 _git_commit ()
562 {
563         local cur="${COMP_WORDS[COMP_CWORD]}"
564         case "$cur" in
565         --*)
566                 __gitcomp "
567                         --all --author= --signoff --verify --no-verify
568                         --edit --amend --include --only
569                         "
570                 return
571         esac
572         COMPREPLY=()
573 }
574
575 _git_describe ()
576 {
577         __gitcomp "$(__git_refs)"
578 }
579
580 _git_diff ()
581 {
582         local cur="${COMP_WORDS[COMP_CWORD]}"
583         case "$cur" in
584         --*)
585                 __gitcomp "--cached --stat --numstat --shortstat --summary
586                         --patch-with-stat --name-only --name-status --color
587                         --no-color --color-words --no-renames --check
588                         --full-index --binary --abbrev --diff-filter
589                         --find-copies-harder --pickaxe-all --pickaxe-regex
590                         --text --ignore-space-at-eol --ignore-space-change
591                         --ignore-all-space --exit-code --quiet --ext-diff
592                         --no-ext-diff"
593                 return
594                 ;;
595         esac
596         __git_complete_file
597 }
598
599 _git_diff_tree ()
600 {
601         __gitcomp "$(__git_refs)"
602 }
603
604 _git_fetch ()
605 {
606         local cur="${COMP_WORDS[COMP_CWORD]}"
607
608         case "${COMP_WORDS[0]},$COMP_CWORD" in
609         git-fetch*,1)
610                 __gitcomp "$(__git_remotes)"
611                 ;;
612         git,2)
613                 __gitcomp "$(__git_remotes)"
614                 ;;
615         *)
616                 case "$cur" in
617                 *:*)
618                         __gitcomp "$(__git_refs)" "" "${cur#*:}"
619                         ;;
620                 *)
621                         local remote
622                         case "${COMP_WORDS[0]}" in
623                         git-fetch) remote="${COMP_WORDS[1]}" ;;
624                         git)       remote="${COMP_WORDS[2]}" ;;
625                         esac
626                         __gitcomp "$(__git_refs2 "$remote")"
627                         ;;
628                 esac
629                 ;;
630         esac
631 }
632
633 _git_format_patch ()
634 {
635         local cur="${COMP_WORDS[COMP_CWORD]}"
636         case "$cur" in
637         --*)
638                 __gitcomp "
639                         --stdout --attach --thread
640                         --output-directory
641                         --numbered --start-number
642                         --numbered-files
643                         --keep-subject
644                         --signoff
645                         --in-reply-to=
646                         --full-index --binary
647                         --not --all
648                         "
649                 return
650                 ;;
651         esac
652         __git_complete_revlist
653 }
654
655 _git_gc ()
656 {
657         local cur="${COMP_WORDS[COMP_CWORD]}"
658         case "$cur" in
659         --*)
660                 __gitcomp "--prune --aggressive"
661                 return
662                 ;;
663         esac
664         COMPREPLY=()
665 }
666
667 _git_ls_remote ()
668 {
669         __gitcomp "$(__git_remotes)"
670 }
671
672 _git_ls_tree ()
673 {
674         __git_complete_file
675 }
676
677 _git_log ()
678 {
679         local cur="${COMP_WORDS[COMP_CWORD]}"
680         case "$cur" in
681         --pretty=*)
682                 __gitcomp "
683                         oneline short medium full fuller email raw
684                         " "" "${cur##--pretty=}"
685                 return
686                 ;;
687         --date=*)
688                 __gitcomp "
689                         relative iso8601 rfc2822 short local default
690                 " "" "${cur##--date=}"
691                 return
692                 ;;
693         --*)
694                 __gitcomp "
695                         --max-count= --max-age= --since= --after=
696                         --min-age= --before= --until=
697                         --root --topo-order --date-order --reverse
698                         --no-merges --follow
699                         --abbrev-commit --abbrev=
700                         --relative-date --date=
701                         --author= --committer= --grep=
702                         --all-match
703                         --pretty= --name-status --name-only --raw
704                         --not --all
705                         --left-right --cherry-pick
706                         "
707                 return
708                 ;;
709         esac
710         __git_complete_revlist
711 }
712
713 _git_merge ()
714 {
715         local cur="${COMP_WORDS[COMP_CWORD]}"
716         case "${COMP_WORDS[COMP_CWORD-1]}" in
717         -s|--strategy)
718                 __gitcomp "$(__git_merge_strategies)"
719                 return
720         esac
721         case "$cur" in
722         --strategy=*)
723                 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
724                 return
725                 ;;
726         --*)
727                 __gitcomp "
728                         --no-commit --no-summary --squash --strategy
729                         "
730                 return
731         esac
732         __gitcomp "$(__git_refs)"
733 }
734
735 _git_merge_base ()
736 {
737         __gitcomp "$(__git_refs)"
738 }
739
740 _git_name_rev ()
741 {
742         __gitcomp "--tags --all --stdin"
743 }
744
745 _git_pull ()
746 {
747         local cur="${COMP_WORDS[COMP_CWORD]}"
748
749         case "${COMP_WORDS[0]},$COMP_CWORD" in
750         git-pull*,1)
751                 __gitcomp "$(__git_remotes)"
752                 ;;
753         git,2)
754                 __gitcomp "$(__git_remotes)"
755                 ;;
756         *)
757                 local remote
758                 case "${COMP_WORDS[0]}" in
759                 git-pull)  remote="${COMP_WORDS[1]}" ;;
760                 git)       remote="${COMP_WORDS[2]}" ;;
761                 esac
762                 __gitcomp "$(__git_refs "$remote")"
763                 ;;
764         esac
765 }
766
767 _git_push ()
768 {
769         local cur="${COMP_WORDS[COMP_CWORD]}"
770
771         case "${COMP_WORDS[0]},$COMP_CWORD" in
772         git-push*,1)
773                 __gitcomp "$(__git_remotes)"
774                 ;;
775         git,2)
776                 __gitcomp "$(__git_remotes)"
777                 ;;
778         *)
779                 case "$cur" in
780                 *:*)
781                         local remote
782                         case "${COMP_WORDS[0]}" in
783                         git-push)  remote="${COMP_WORDS[1]}" ;;
784                         git)       remote="${COMP_WORDS[2]}" ;;
785                         esac
786                         __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
787                         ;;
788                 +*)
789                         __gitcomp "$(__git_refs)" + "${cur#+}"
790                         ;;
791                 *)
792                         __gitcomp "$(__git_refs)"
793                         ;;
794                 esac
795                 ;;
796         esac
797 }
798
799 _git_rebase ()
800 {
801         local cur="${COMP_WORDS[COMP_CWORD]}"
802         if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
803                 __gitcomp "--continue --skip --abort"
804                 return
805         fi
806         case "${COMP_WORDS[COMP_CWORD-1]}" in
807         -s|--strategy)
808                 __gitcomp "$(__git_merge_strategies)"
809                 return
810         esac
811         case "$cur" in
812         --strategy=*)
813                 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
814                 return
815                 ;;
816         --*)
817                 __gitcomp "--onto --merge --strategy"
818                 return
819         esac
820         __gitcomp "$(__git_refs)"
821 }
822
823 _git_config ()
824 {
825         local cur="${COMP_WORDS[COMP_CWORD]}"
826         local prv="${COMP_WORDS[COMP_CWORD-1]}"
827         case "$prv" in
828         branch.*.remote)
829                 __gitcomp "$(__git_remotes)"
830                 return
831                 ;;
832         branch.*.merge)
833                 __gitcomp "$(__git_refs)"
834                 return
835                 ;;
836         remote.*.fetch)
837                 local remote="${prv#remote.}"
838                 remote="${remote%.fetch}"
839                 __gitcomp "$(__git_refs_remotes "$remote")"
840                 return
841                 ;;
842         remote.*.push)
843                 local remote="${prv#remote.}"
844                 remote="${remote%.push}"
845                 __gitcomp "$(git --git-dir="$(__gitdir)" \
846                         for-each-ref --format='%(refname):%(refname)' \
847                         refs/heads)"
848                 return
849                 ;;
850         pull.twohead|pull.octopus)
851                 __gitcomp "$(__git_merge_strategies)"
852                 return
853                 ;;
854         color.branch|color.diff|color.status)
855                 __gitcomp "always never auto"
856                 return
857                 ;;
858         color.*.*)
859                 __gitcomp "
860                         black red green yellow blue magenta cyan white
861                         bold dim ul blink reverse
862                         "
863                 return
864                 ;;
865         *.*)
866                 COMPREPLY=()
867                 return
868                 ;;
869         esac
870         case "$cur" in
871         --*)
872                 __gitcomp "
873                         --global --system --file=
874                         --list --replace-all
875                         --get --get-all --get-regexp
876                         --add --unset --unset-all
877                         --remove-section --rename-section
878                         "
879                 return
880                 ;;
881         branch.*.*)
882                 local pfx="${cur%.*}."
883                 cur="${cur##*.}"
884                 __gitcomp "remote merge" "$pfx" "$cur"
885                 return
886                 ;;
887         branch.*)
888                 local pfx="${cur%.*}."
889                 cur="${cur#*.}"
890                 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
891                 return
892                 ;;
893         remote.*.*)
894                 local pfx="${cur%.*}."
895                 cur="${cur##*.}"
896                 __gitcomp "
897                         url fetch push skipDefaultUpdate
898                         receivepack uploadpack tagopt
899                         " "$pfx" "$cur"
900                 return
901                 ;;
902         remote.*)
903                 local pfx="${cur%.*}."
904                 cur="${cur#*.}"
905                 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
906                 return
907                 ;;
908         esac
909         __gitcomp "
910                 apply.whitespace
911                 core.fileMode
912                 core.gitProxy
913                 core.ignoreStat
914                 core.preferSymlinkRefs
915                 core.logAllRefUpdates
916                 core.loosecompression
917                 core.repositoryFormatVersion
918                 core.sharedRepository
919                 core.warnAmbiguousRefs
920                 core.compression
921                 core.legacyHeaders
922                 core.packedGitWindowSize
923                 core.packedGitLimit
924                 clean.requireForce
925                 color.branch
926                 color.branch.current
927                 color.branch.local
928                 color.branch.remote
929                 color.branch.plain
930                 color.diff
931                 color.diff.plain
932                 color.diff.meta
933                 color.diff.frag
934                 color.diff.old
935                 color.diff.new
936                 color.diff.commit
937                 color.diff.whitespace
938                 color.pager
939                 color.status
940                 color.status.header
941                 color.status.added
942                 color.status.changed
943                 color.status.untracked
944                 diff.renameLimit
945                 diff.renames
946                 fetch.unpackLimit
947                 format.headers
948                 format.subjectprefix
949                 gitcvs.enabled
950                 gitcvs.logfile
951                 gitcvs.allbinary
952                 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
953                 gc.packrefs
954                 gc.reflogexpire
955                 gc.reflogexpireunreachable
956                 gc.rerereresolved
957                 gc.rerereunresolved
958                 http.sslVerify
959                 http.sslCert
960                 http.sslKey
961                 http.sslCAInfo
962                 http.sslCAPath
963                 http.maxRequests
964                 http.lowSpeedLimit
965                 http.lowSpeedTime
966                 http.noEPSV
967                 i18n.commitEncoding
968                 i18n.logOutputEncoding
969                 log.showroot
970                 merge.tool
971                 merge.summary
972                 merge.verbosity
973                 pack.window
974                 pack.depth
975                 pack.windowMemory
976                 pack.compression
977                 pack.deltaCacheSize
978                 pack.deltaCacheLimit
979                 pull.octopus
980                 pull.twohead
981                 repack.useDeltaBaseOffset
982                 show.difftree
983                 showbranch.default
984                 tar.umask
985                 transfer.unpackLimit
986                 receive.unpackLimit
987                 receive.denyNonFastForwards
988                 user.name
989                 user.email
990                 user.signingkey
991                 whatchanged.difftree
992                 branch. remote.
993         "
994 }
995
996 _git_remote ()
997 {
998         local i c=1 command
999         while [ $c -lt $COMP_CWORD ]; do
1000                 i="${COMP_WORDS[c]}"
1001                 case "$i" in
1002                 add|rm|show|prune|update) command="$i"; break ;;
1003                 esac
1004                 c=$((++c))
1005         done
1006
1007         if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1008                 __gitcomp "add rm show prune update"
1009                 return
1010         fi
1011
1012         case "$command" in
1013         rm|show|prune)
1014                 __gitcomp "$(__git_remotes)"
1015                 ;;
1016         update)
1017                 local i c='' IFS=$'\n'
1018                 for i in $(git --git-dir="$(__gitdir)" config --list); do
1019                         case "$i" in
1020                         remotes.*)
1021                                 i="${i#remotes.}"
1022                                 c="$c ${i/=*/}"
1023                                 ;;
1024                         esac
1025                 done
1026                 __gitcomp "$c"
1027                 ;;
1028         *)
1029                 COMPREPLY=()
1030                 ;;
1031         esac
1032 }
1033
1034 _git_reset ()
1035 {
1036         local cur="${COMP_WORDS[COMP_CWORD]}"
1037         case "$cur" in
1038         --*)
1039                 __gitcomp "--mixed --hard --soft"
1040                 return
1041                 ;;
1042         esac
1043         __gitcomp "$(__git_refs)"
1044 }
1045
1046 _git_shortlog ()
1047 {
1048         local cur="${COMP_WORDS[COMP_CWORD]}"
1049         case "$cur" in
1050         --*)
1051                 __gitcomp "
1052                         --max-count= --max-age= --since= --after=
1053                         --min-age= --before= --until=
1054                         --no-merges
1055                         --author= --committer= --grep=
1056                         --all-match
1057                         --not --all
1058                         --numbered --summary
1059                         "
1060                 return
1061                 ;;
1062         esac
1063         __git_complete_revlist
1064 }
1065
1066 _git_show ()
1067 {
1068         local cur="${COMP_WORDS[COMP_CWORD]}"
1069         case "$cur" in
1070         --pretty=*)
1071                 __gitcomp "
1072                         oneline short medium full fuller email raw
1073                         " "" "${cur##--pretty=}"
1074                 return
1075                 ;;
1076         --*)
1077                 __gitcomp "--pretty="
1078                 return
1079                 ;;
1080         esac
1081         __git_complete_file
1082 }
1083
1084 _git_stash ()
1085 {
1086         __gitcomp 'list show apply clear'
1087 }
1088
1089 _git_submodule ()
1090 {
1091         local i c=1 command
1092         while [ $c -lt $COMP_CWORD ]; do
1093                 i="${COMP_WORDS[c]}"
1094                 case "$i" in
1095                 add|status|init|update) command="$i"; break ;;
1096                 esac
1097                 c=$((++c))
1098         done
1099
1100         if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1101                 local cur="${COMP_WORDS[COMP_CWORD]}"
1102                 case "$cur" in
1103                 --*)
1104                         __gitcomp "--quiet --cached"
1105                         ;;
1106                 *)
1107                         __gitcomp "add status init update"
1108                         ;;
1109                 esac
1110                 return
1111         fi
1112 }
1113
1114 _git_tag ()
1115 {
1116         local i c=1 f=0
1117         while [ $c -lt $COMP_CWORD ]; do
1118                 i="${COMP_WORDS[c]}"
1119                 case "$i" in
1120                 -d|-v)
1121                         __gitcomp "$(__git_tags)"
1122                         return
1123                         ;;
1124                 -f)
1125                         f=1
1126                         ;;
1127                 esac
1128                 c=$((++c))
1129         done
1130
1131         case "${COMP_WORDS[COMP_CWORD-1]}" in
1132         -m|-F)
1133                 COMPREPLY=()
1134                 ;;
1135         -*|tag|git-tag)
1136                 if [ $f = 1 ]; then
1137                         __gitcomp "$(__git_tags)"
1138                 else
1139                         COMPREPLY=()
1140                 fi
1141                 ;;
1142         *)
1143                 __gitcomp "$(__git_refs)"
1144                 ;;
1145         esac
1146 }
1147
1148 _git ()
1149 {
1150         local i c=1 command __git_dir
1151
1152         while [ $c -lt $COMP_CWORD ]; do
1153                 i="${COMP_WORDS[c]}"
1154                 case "$i" in
1155                 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1156                 --bare)      __git_dir="." ;;
1157                 --version|--help|-p|--paginate) ;;
1158                 *) command="$i"; break ;;
1159                 esac
1160                 c=$((++c))
1161         done
1162
1163         if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1164                 case "${COMP_WORDS[COMP_CWORD]}" in
1165                 --*=*) COMPREPLY=() ;;
1166                 --*)   __gitcomp "
1167                         --no-pager
1168                         --git-dir=
1169                         --bare
1170                         --version
1171                         --exec-path
1172                         "
1173                         ;;
1174                 *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1175                 esac
1176                 return
1177         fi
1178
1179         local expansion=$(__git_aliased_command "$command")
1180         [ "$expansion" ] && command="$expansion"
1181
1182         case "$command" in
1183         am)          _git_am ;;
1184         add)         _git_add ;;
1185         apply)       _git_apply ;;
1186         bisect)      _git_bisect ;;
1187         bundle)      _git_bundle ;;
1188         branch)      _git_branch ;;
1189         checkout)    _git_checkout ;;
1190         cherry)      _git_cherry ;;
1191         cherry-pick) _git_cherry_pick ;;
1192         commit)      _git_commit ;;
1193         config)      _git_config ;;
1194         describe)    _git_describe ;;
1195         diff)        _git_diff ;;
1196         fetch)       _git_fetch ;;
1197         format-patch) _git_format_patch ;;
1198         gc)          _git_gc ;;
1199         log)         _git_log ;;
1200         ls-remote)   _git_ls_remote ;;
1201         ls-tree)     _git_ls_tree ;;
1202         merge)       _git_merge;;
1203         merge-base)  _git_merge_base ;;
1204         name-rev)    _git_name_rev ;;
1205         pull)        _git_pull ;;
1206         push)        _git_push ;;
1207         rebase)      _git_rebase ;;
1208         remote)      _git_remote ;;
1209         reset)       _git_reset ;;
1210         shortlog)    _git_shortlog ;;
1211         show)        _git_show ;;
1212         show-branch) _git_log ;;
1213         stash)       _git_stash ;;
1214         submodule)   _git_submodule ;;
1215         tag)         _git_tag ;;
1216         whatchanged) _git_log ;;
1217         *)           COMPREPLY=() ;;
1218         esac
1219 }
1220
1221 _gitk ()
1222 {
1223         local cur="${COMP_WORDS[COMP_CWORD]}"
1224         case "$cur" in
1225         --*)
1226                 __gitcomp "--not --all"
1227                 return
1228                 ;;
1229         esac
1230         __git_complete_revlist
1231 }
1232
1233 complete -o default -o nospace -F _git git
1234 complete -o default -o nospace -F _gitk gitk
1235 complete -o default -o nospace -F _git_am git-am
1236 complete -o default -o nospace -F _git_apply git-apply
1237 complete -o default -o nospace -F _git_bisect git-bisect
1238 complete -o default -o nospace -F _git_branch git-branch
1239 complete -o default -o nospace -F _git_bundle git-bundle
1240 complete -o default -o nospace -F _git_checkout git-checkout
1241 complete -o default -o nospace -F _git_cherry git-cherry
1242 complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1243 complete -o default -o nospace -F _git_commit git-commit
1244 complete -o default -o nospace -F _git_describe git-describe
1245 complete -o default -o nospace -F _git_diff git-diff
1246 complete -o default -o nospace -F _git_fetch git-fetch
1247 complete -o default -o nospace -F _git_format_patch git-format-patch
1248 complete -o default -o nospace -F _git_gc git-gc
1249 complete -o default -o nospace -F _git_log git-log
1250 complete -o default -o nospace -F _git_ls_remote git-ls-remote
1251 complete -o default -o nospace -F _git_ls_tree git-ls-tree
1252 complete -o default -o nospace -F _git_merge git-merge
1253 complete -o default -o nospace -F _git_merge_base git-merge-base
1254 complete -o default -o nospace -F _git_name_rev git-name-rev
1255 complete -o default -o nospace -F _git_pull git-pull
1256 complete -o default -o nospace -F _git_push git-push
1257 complete -o default -o nospace -F _git_rebase git-rebase
1258 complete -o default -o nospace -F _git_config git-config
1259 complete -o default -o nospace -F _git_remote git-remote
1260 complete -o default -o nospace -F _git_reset git-reset
1261 complete -o default -o nospace -F _git_shortlog git-shortlog
1262 complete -o default -o nospace -F _git_show git-show
1263 complete -o default -o nospace -F _git_stash git-stash
1264 complete -o default -o nospace -F _git_submodule git-submodule
1265 complete -o default -o nospace -F _git_log git-show-branch
1266 complete -o default -o nospace -F _git_tag git-tag
1267 complete -o default -o nospace -F _git_log git-whatchanged
1268
1269 # The following are necessary only for Cygwin, and only are needed
1270 # when the user has tab-completed the executable name and consequently
1271 # included the '.exe' suffix.
1272 #
1273 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1274 complete -o default -o nospace -F _git_add git-add.exe
1275 complete -o default -o nospace -F _git_apply git-apply.exe
1276 complete -o default -o nospace -F _git git.exe
1277 complete -o default -o nospace -F _git_branch git-branch.exe
1278 complete -o default -o nospace -F _git_bundle git-bundle.exe
1279 complete -o default -o nospace -F _git_cherry git-cherry.exe
1280 complete -o default -o nospace -F _git_describe git-describe.exe
1281 complete -o default -o nospace -F _git_diff git-diff.exe
1282 complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1283 complete -o default -o nospace -F _git_log git-log.exe
1284 complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1285 complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1286 complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1287 complete -o default -o nospace -F _git_push git-push.exe
1288 complete -o default -o nospace -F _git_config git-config
1289 complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1290 complete -o default -o nospace -F _git_show git-show.exe
1291 complete -o default -o nospace -F _git_log git-show-branch.exe
1292 complete -o default -o nospace -F _git_tag git-tag.exe
1293 complete -o default -o nospace -F _git_log git-whatchanged.exe
1294 fi