Code

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