Code

d3d8203171a3c7c221399dd6d79c8429c5006bcc
[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) You may want to make sure the git executable is available
25 #       in your PATH before this script is sourced, as some caching
26 #       is performed while the script loads.  If git isn't found
27 #       at source time then all lookups will be done on demand,
28 #       which may be slightly slower.
29 #
30 #    4) Consider changing your PS1 to also show the current branch:
31 #        PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
32 #
33 #       The argument to __git_ps1 will be displayed only if you
34 #       are currently in a git repository.  The %s token will be
35 #       the name of the current branch.
36 #
37 #       In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
38 #       value, unstaged (*) and staged (+) changes will be shown next
39 #       to the branch name.  You can configure this per-repository
40 #       with the bash.showDirtyState variable, which defaults to true
41 #       once GIT_PS1_SHOWDIRTYSTATE is enabled.
42 #
43 # To submit patches:
44 #
45 #    *) Read Documentation/SubmittingPatches
46 #    *) Send all patches to the current maintainer:
47 #
48 #       "Shawn O. Pearce" <spearce@spearce.org>
49 #
50 #    *) Always CC the Git mailing list:
51 #
52 #       git@vger.kernel.org
53 #
55 case "$COMP_WORDBREAKS" in
56 *:*) : great ;;
57 *)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
58 esac
60 # __gitdir accepts 0 or 1 arguments (i.e., location)
61 # returns location of .git repo
62 __gitdir ()
63 {
64         if [ -z "${1-}" ]; then
65                 if [ -n "${__git_dir-}" ]; then
66                         echo "$__git_dir"
67                 elif [ -d .git ]; then
68                         echo .git
69                 else
70                         git rev-parse --git-dir 2>/dev/null
71                 fi
72         elif [ -d "$1/.git" ]; then
73                 echo "$1/.git"
74         else
75                 echo "$1"
76         fi
77 }
79 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
80 # returns text to add to bash PS1 prompt (includes branch name)
81 __git_ps1 ()
82 {
83         local g="$(__gitdir)"
84         if [ -n "$g" ]; then
85                 local r
86                 local b
87                 if [ -d "$g/rebase-apply" ]; then
88                         if [ -f "$g/rebase-apply/rebasing" ]; then
89                                 r="|REBASE"
90                 elif [ -f "$g/rebase-apply/applying" ]; then
91                                 r="|AM"
92                         else
93                                 r="|AM/REBASE"
94                         fi
95                         b="$(git symbolic-ref HEAD 2>/dev/null)"
96                 elif [ -f "$g/rebase-merge/interactive" ]; then
97                         r="|REBASE-i"
98                         b="$(cat "$g/rebase-merge/head-name")"
99                 elif [ -d "$g/rebase-merge" ]; then
100                         r="|REBASE-m"
101                         b="$(cat "$g/rebase-merge/head-name")"
102                 elif [ -f "$g/MERGE_HEAD" ]; then
103                         r="|MERGING"
104                         b="$(git symbolic-ref HEAD 2>/dev/null)"
105                 else
106                         if [ -f "$g/BISECT_LOG" ]; then
107                                 r="|BISECTING"
108                         fi
109                         if ! b="$(git symbolic-ref HEAD 2>/dev/null)"; then
110                                 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"; then
111                                         if [ -r "$g/HEAD" ]; then
112                                                 b="$(cut -c1-7 "$g/HEAD")..."
113                                         fi
114                                 fi
115                         fi
116                 fi
118                 local w
119                 local i
120                 local c
122                 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
123                         if [ "true" = "$(git config --bool core.bare 2>/dev/null)" ]; then
124                                 c="BARE:"
125                         else
126                                 b="GIT_DIR!"
127                         fi
128                 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
129                         if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
130                                 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
131                                         git diff --no-ext-diff --ignore-submodules \
132                                                 --quiet --exit-code || w="*"
133                                         if git rev-parse --quiet --verify HEAD >/dev/null; then
134                                                 git diff-index --cached --quiet \
135                                                         --ignore-submodules HEAD -- || i="+"
136                                         else
137                                                 i="#"
138                                         fi
139                                 fi
140                         fi
141                 fi
143                 if [ -n "$b" ]; then
144                         if [ -n "${1-}" ]; then
145                                 printf "$1" "$c${b##refs/heads/}$w$i$r"
146                         else
147                                 printf " (%s)" "$c${b##refs/heads/}$w$i$r"
148                         fi
149                 fi
150         fi
153 # __gitcomp_1 requires 2 arguments
154 __gitcomp_1 ()
156         local c IFS=' '$'\t'$'\n'
157         for c in $1; do
158                 case "$c$2" in
159                 --*=*) printf %s$'\n' "$c$2" ;;
160                 *.)    printf %s$'\n' "$c$2" ;;
161                 *)     printf %s$'\n' "$c$2 " ;;
162                 esac
163         done
166 # __gitcomp accepts 1, 2, 3, or 4 arguments
167 # generates completion reply with compgen
168 __gitcomp ()
170         local cur="${COMP_WORDS[COMP_CWORD]}"
171         if [ $# -gt 2 ]; then
172                 cur="$3"
173         fi
174         case "$cur" in
175         --*=)
176                 COMPREPLY=()
177                 ;;
178         *)
179                 local IFS=$'\n'
180                 COMPREPLY=($(compgen -P "${2-}" \
181                         -W "$(__gitcomp_1 "${1-}" "${4-}")" \
182                         -- "$cur"))
183                 ;;
184         esac
187 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
188 __git_heads ()
190         local cmd i is_hash=y dir="$(__gitdir "${1-}")"
191         if [ -d "$dir" ]; then
192                 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
193                         refs/heads
194                 return
195         fi
196         for i in $(git ls-remote "${1-}" 2>/dev/null); do
197                 case "$is_hash,$i" in
198                 y,*) is_hash=n ;;
199                 n,*^{}) is_hash=y ;;
200                 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
201                 n,*) is_hash=y; echo "$i" ;;
202                 esac
203         done
206 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
207 __git_tags ()
209         local cmd i is_hash=y dir="$(__gitdir "${1-}")"
210         if [ -d "$dir" ]; then
211                 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
212                         refs/tags
213                 return
214         fi
215         for i in $(git ls-remote "${1-}" 2>/dev/null); do
216                 case "$is_hash,$i" in
217                 y,*) is_hash=n ;;
218                 n,*^{}) is_hash=y ;;
219                 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
220                 n,*) is_hash=y; echo "$i" ;;
221                 esac
222         done
225 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
226 __git_refs ()
228         local i is_hash=y dir="$(__gitdir "${1-}")"
229         local cur="${COMP_WORDS[COMP_CWORD]}" format refs
230         if [ -d "$dir" ]; then
231                 case "$cur" in
232                 refs|refs/*)
233                         format="refname"
234                         refs="${cur%/*}"
235                         ;;
236                 *)
237                         if [ -e "$dir/HEAD" ]; then echo HEAD; fi
238                         format="refname:short"
239                         refs="refs/tags refs/heads refs/remotes"
240                         ;;
241                 esac
242                 git --git-dir="$dir" for-each-ref --format="%($format)" \
243                         $refs
244                 return
245         fi
246         for i in $(git ls-remote "$dir" 2>/dev/null); do
247                 case "$is_hash,$i" in
248                 y,*) is_hash=n ;;
249                 n,*^{}) is_hash=y ;;
250                 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
251                 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
252                 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
253                 n,*) is_hash=y; echo "$i" ;;
254                 esac
255         done
258 # __git_refs2 requires 1 argument (to pass to __git_refs)
259 __git_refs2 ()
261         local i
262         for i in $(__git_refs "$1"); do
263                 echo "$i:$i"
264         done
267 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
268 __git_refs_remotes ()
270         local cmd i is_hash=y
271         for i in $(git ls-remote "$1" 2>/dev/null); do
272                 case "$is_hash,$i" in
273                 n,refs/heads/*)
274                         is_hash=y
275                         echo "$i:refs/remotes/$1/${i#refs/heads/}"
276                         ;;
277                 y,*) is_hash=n ;;
278                 n,*^{}) is_hash=y ;;
279                 n,refs/tags/*) is_hash=y;;
280                 n,*) is_hash=y; ;;
281                 esac
282         done
285 __git_remotes ()
287         local i ngoff IFS=$'\n' d="$(__gitdir)"
288         shopt -q nullglob || ngoff=1
289         shopt -s nullglob
290         for i in "$d/remotes"/*; do
291                 echo ${i#$d/remotes/}
292         done
293         [ "$ngoff" ] && shopt -u nullglob
294         for i in $(git --git-dir="$d" config --list); do
295                 case "$i" in
296                 remote.*.url=*)
297                         i="${i#remote.}"
298                         echo "${i/.url=*/}"
299                         ;;
300                 esac
301         done
304 __git_merge_strategies ()
306         if [ -n "${__git_merge_strategylist-}" ]; then
307                 echo "$__git_merge_strategylist"
308                 return
309         fi
310         git merge -s help 2>&1 |
311         sed -n -e '/[Aa]vailable strategies are: /,/^$/{
312                 s/\.$//
313                 s/.*://
314                 s/^[    ]*//
315                 s/[     ]*$//
316                 p
317         }'
319 __git_merge_strategylist=
320 __git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
322 __git_complete_file ()
324         local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
325         case "$cur" in
326         ?*:*)
327                 ref="${cur%%:*}"
328                 cur="${cur#*:}"
329                 case "$cur" in
330                 ?*/*)
331                         pfx="${cur%/*}"
332                         cur="${cur##*/}"
333                         ls="$ref:$pfx"
334                         pfx="$pfx/"
335                         ;;
336                 *)
337                         ls="$ref"
338                         ;;
339             esac
341                 case "$COMP_WORDBREAKS" in
342                 *:*) : great ;;
343                 *)   pfx="$ref:$pfx" ;;
344                 esac
346                 local IFS=$'\n'
347                 COMPREPLY=($(compgen -P "$pfx" \
348                         -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
349                                 | sed '/^100... blob /{
350                                            s,^.*        ,,
351                                            s,$, ,
352                                        }
353                                        /^120000 blob /{
354                                            s,^.*        ,,
355                                            s,$, ,
356                                        }
357                                        /^040000 tree /{
358                                            s,^.*        ,,
359                                            s,$,/,
360                                        }
361                                        s/^.*    //')" \
362                         -- "$cur"))
363                 ;;
364         *)
365                 __gitcomp "$(__git_refs)"
366                 ;;
367         esac
370 __git_complete_revlist ()
372         local pfx cur="${COMP_WORDS[COMP_CWORD]}"
373         case "$cur" in
374         *...*)
375                 pfx="${cur%...*}..."
376                 cur="${cur#*...}"
377                 __gitcomp "$(__git_refs)" "$pfx" "$cur"
378                 ;;
379         *..*)
380                 pfx="${cur%..*}.."
381                 cur="${cur#*..}"
382                 __gitcomp "$(__git_refs)" "$pfx" "$cur"
383                 ;;
384         *)
385                 __gitcomp "$(__git_refs)"
386                 ;;
387         esac
390 __git_complete_remote_or_refspec ()
392         local cmd="${COMP_WORDS[1]}"
393         local cur="${COMP_WORDS[COMP_CWORD]}"
394         local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
395         while [ $c -lt $COMP_CWORD ]; do
396                 i="${COMP_WORDS[c]}"
397                 case "$i" in
398                 --all|--mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
399                 -*) ;;
400                 *) remote="$i"; break ;;
401                 esac
402                 c=$((++c))
403         done
404         if [ -z "$remote" ]; then
405                 __gitcomp "$(__git_remotes)"
406                 return
407         fi
408         if [ $no_complete_refspec = 1 ]; then
409                 COMPREPLY=()
410                 return
411         fi
412         [ "$remote" = "." ] && remote=
413         case "$cur" in
414         *:*)
415                 case "$COMP_WORDBREAKS" in
416                 *:*) : great ;;
417                 *)   pfx="${cur%%:*}:" ;;
418                 esac
419                 cur="${cur#*:}"
420                 lhs=0
421                 ;;
422         +*)
423                 pfx="+"
424                 cur="${cur#+}"
425                 ;;
426         esac
427         case "$cmd" in
428         fetch)
429                 if [ $lhs = 1 ]; then
430                         __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur"
431                 else
432                         __gitcomp "$(__git_refs)" "$pfx" "$cur"
433                 fi
434                 ;;
435         pull)
436                 if [ $lhs = 1 ]; then
437                         __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
438                 else
439                         __gitcomp "$(__git_refs)" "$pfx" "$cur"
440                 fi
441                 ;;
442         push)
443                 if [ $lhs = 1 ]; then
444                         __gitcomp "$(__git_refs)" "$pfx" "$cur"
445                 else
446                         __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
447                 fi
448                 ;;
449         esac
452 __git_complete_strategy ()
454         case "${COMP_WORDS[COMP_CWORD-1]}" in
455         -s|--strategy)
456                 __gitcomp "$(__git_merge_strategies)"
457                 return 0
458         esac
459         local cur="${COMP_WORDS[COMP_CWORD]}"
460         case "$cur" in
461         --strategy=*)
462                 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
463                 return 0
464                 ;;
465         esac
466         return 1
469 __git_all_commands ()
471         if [ -n "${__git_all_commandlist-}" ]; then
472                 echo "$__git_all_commandlist"
473                 return
474         fi
475         local i IFS=" "$'\n'
476         for i in $(git help -a|egrep '^ ')
477         do
478                 case $i in
479                 *--*)             : helper pattern;;
480                 *) echo $i;;
481                 esac
482         done
484 __git_all_commandlist=
485 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
487 __git_porcelain_commands ()
489         if [ -n "${__git_porcelain_commandlist-}" ]; then
490                 echo "$__git_porcelain_commandlist"
491                 return
492         fi
493         local i IFS=" "$'\n'
494         for i in "help" $(__git_all_commands)
495         do
496                 case $i in
497                 *--*)             : helper pattern;;
498                 applymbox)        : ask gittus;;
499                 applypatch)       : ask gittus;;
500                 archimport)       : import;;
501                 cat-file)         : plumbing;;
502                 check-attr)       : plumbing;;
503                 check-ref-format) : plumbing;;
504                 checkout-index)   : plumbing;;
505                 commit-tree)      : plumbing;;
506                 count-objects)    : infrequent;;
507                 cvsexportcommit)  : export;;
508                 cvsimport)        : import;;
509                 cvsserver)        : daemon;;
510                 daemon)           : daemon;;
511                 diff-files)       : plumbing;;
512                 diff-index)       : plumbing;;
513                 diff-tree)        : plumbing;;
514                 fast-import)      : import;;
515                 fast-export)      : export;;
516                 fsck-objects)     : plumbing;;
517                 fetch-pack)       : plumbing;;
518                 fmt-merge-msg)    : plumbing;;
519                 for-each-ref)     : plumbing;;
520                 hash-object)      : plumbing;;
521                 http-*)           : transport;;
522                 index-pack)       : plumbing;;
523                 init-db)          : deprecated;;
524                 local-fetch)      : plumbing;;
525                 lost-found)       : infrequent;;
526                 ls-files)         : plumbing;;
527                 ls-remote)        : plumbing;;
528                 ls-tree)          : plumbing;;
529                 mailinfo)         : plumbing;;
530                 mailsplit)        : plumbing;;
531                 merge-*)          : plumbing;;
532                 mktree)           : plumbing;;
533                 mktag)            : plumbing;;
534                 pack-objects)     : plumbing;;
535                 pack-redundant)   : plumbing;;
536                 pack-refs)        : plumbing;;
537                 parse-remote)     : plumbing;;
538                 patch-id)         : plumbing;;
539                 peek-remote)      : plumbing;;
540                 prune)            : plumbing;;
541                 prune-packed)     : plumbing;;
542                 quiltimport)      : import;;
543                 read-tree)        : plumbing;;
544                 receive-pack)     : plumbing;;
545                 reflog)           : plumbing;;
546                 repo-config)      : deprecated;;
547                 rerere)           : plumbing;;
548                 rev-list)         : plumbing;;
549                 rev-parse)        : plumbing;;
550                 runstatus)        : plumbing;;
551                 sh-setup)         : internal;;
552                 shell)            : daemon;;
553                 show-ref)         : plumbing;;
554                 send-pack)        : plumbing;;
555                 show-index)       : plumbing;;
556                 ssh-*)            : transport;;
557                 stripspace)       : plumbing;;
558                 symbolic-ref)     : plumbing;;
559                 tar-tree)         : deprecated;;
560                 unpack-file)      : plumbing;;
561                 unpack-objects)   : plumbing;;
562                 update-index)     : plumbing;;
563                 update-ref)       : plumbing;;
564                 update-server-info) : daemon;;
565                 upload-archive)   : plumbing;;
566                 upload-pack)      : plumbing;;
567                 write-tree)       : plumbing;;
568                 var)              : infrequent;;
569                 verify-pack)      : infrequent;;
570                 verify-tag)       : plumbing;;
571                 *) echo $i;;
572                 esac
573         done
575 __git_porcelain_commandlist=
576 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
578 __git_aliases ()
580         local i IFS=$'\n'
581         for i in $(git --git-dir="$(__gitdir)" config --list); do
582                 case "$i" in
583                 alias.*)
584                         i="${i#alias.}"
585                         echo "${i/=*/}"
586                         ;;
587                 esac
588         done
591 # __git_aliased_command requires 1 argument
592 __git_aliased_command ()
594         local word cmdline=$(git --git-dir="$(__gitdir)" \
595                 config --get "alias.$1")
596         for word in $cmdline; do
597                 if [ "${word##-*}" ]; then
598                         echo $word
599                         return
600                 fi
601         done
604 # __git_find_subcommand requires 1 argument
605 __git_find_subcommand ()
607         local word subcommand c=1
609         while [ $c -lt $COMP_CWORD ]; do
610                 word="${COMP_WORDS[c]}"
611                 for subcommand in $1; do
612                         if [ "$subcommand" = "$word" ]; then
613                                 echo "$subcommand"
614                                 return
615                         fi
616                 done
617                 c=$((++c))
618         done
621 __git_has_doubledash ()
623         local c=1
624         while [ $c -lt $COMP_CWORD ]; do
625                 if [ "--" = "${COMP_WORDS[c]}" ]; then
626                         return 0
627                 fi
628                 c=$((++c))
629         done
630         return 1
633 __git_whitespacelist="nowarn warn error error-all fix"
635 _git_am ()
637         local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
638         if [ -d "$dir"/rebase-apply ]; then
639                 __gitcomp "--skip --resolved --abort"
640                 return
641         fi
642         case "$cur" in
643         --whitespace=*)
644                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
645                 return
646                 ;;
647         --*)
648                 __gitcomp "
649                         --3way --committer-date-is-author-date --ignore-date
650                         --interactive --keep --no-utf8 --signoff --utf8
651                         --whitespace=
652                         "
653                 return
654         esac
655         COMPREPLY=()
658 _git_apply ()
660         local cur="${COMP_WORDS[COMP_CWORD]}"
661         case "$cur" in
662         --whitespace=*)
663                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
664                 return
665                 ;;
666         --*)
667                 __gitcomp "
668                         --stat --numstat --summary --check --index
669                         --cached --index-info --reverse --reject --unidiff-zero
670                         --apply --no-add --exclude=
671                         --whitespace= --inaccurate-eof --verbose
672                         "
673                 return
674         esac
675         COMPREPLY=()
678 _git_add ()
680         __git_has_doubledash && return
682         local cur="${COMP_WORDS[COMP_CWORD]}"
683         case "$cur" in
684         --*)
685                 __gitcomp "
686                         --interactive --refresh --patch --update --dry-run
687                         --ignore-errors --intent-to-add
688                         "
689                 return
690         esac
691         COMPREPLY=()
694 _git_archive ()
696         local cur="${COMP_WORDS[COMP_CWORD]}"
697         case "$cur" in
698         --format=*)
699                 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
700                 return
701                 ;;
702         --remote=*)
703                 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
704                 return
705                 ;;
706         --*)
707                 __gitcomp "
708                         --format= --list --verbose
709                         --prefix= --remote= --exec=
710                         "
711                 return
712                 ;;
713         esac
714         __git_complete_file
717 _git_bisect ()
719         __git_has_doubledash && return
721         local subcommands="start bad good skip reset visualize replay log run"
722         local subcommand="$(__git_find_subcommand "$subcommands")"
723         if [ -z "$subcommand" ]; then
724                 __gitcomp "$subcommands"
725                 return
726         fi
728         case "$subcommand" in
729         bad|good|reset|skip)
730                 __gitcomp "$(__git_refs)"
731                 ;;
732         *)
733                 COMPREPLY=()
734                 ;;
735         esac
738 _git_branch ()
740         local i c=1 only_local_ref="n" has_r="n"
742         while [ $c -lt $COMP_CWORD ]; do
743                 i="${COMP_WORDS[c]}"
744                 case "$i" in
745                 -d|-m)  only_local_ref="y" ;;
746                 -r)     has_r="y" ;;
747                 esac
748                 c=$((++c))
749         done
751         case "${COMP_WORDS[COMP_CWORD]}" in
752         --*)
753                 __gitcomp "
754                         --color --no-color --verbose --abbrev= --no-abbrev
755                         --track --no-track --contains --merged --no-merged
756                         "
757                 ;;
758         *)
759                 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
760                         __gitcomp "$(__git_heads)"
761                 else
762                         __gitcomp "$(__git_refs)"
763                 fi
764                 ;;
765         esac
768 _git_bundle ()
770         local cmd="${COMP_WORDS[2]}"
771         case "$COMP_CWORD" in
772         2)
773                 __gitcomp "create list-heads verify unbundle"
774                 ;;
775         3)
776                 # looking for a file
777                 ;;
778         *)
779                 case "$cmd" in
780                         create)
781                                 __git_complete_revlist
782                         ;;
783                 esac
784                 ;;
785         esac
788 _git_checkout ()
790         __git_has_doubledash && return
792         __gitcomp "$(__git_refs)"
795 _git_cherry ()
797         __gitcomp "$(__git_refs)"
800 _git_cherry_pick ()
802         local cur="${COMP_WORDS[COMP_CWORD]}"
803         case "$cur" in
804         --*)
805                 __gitcomp "--edit --no-commit"
806                 ;;
807         *)
808                 __gitcomp "$(__git_refs)"
809                 ;;
810         esac
813 _git_clean ()
815         __git_has_doubledash && return
817         local cur="${COMP_WORDS[COMP_CWORD]}"
818         case "$cur" in
819         --*)
820                 __gitcomp "--dry-run --quiet"
821                 return
822                 ;;
823         esac
824         COMPREPLY=()
827 _git_clone ()
829         local cur="${COMP_WORDS[COMP_CWORD]}"
830         case "$cur" in
831         --*)
832                 __gitcomp "
833                         --local
834                         --no-hardlinks
835                         --shared
836                         --reference
837                         --quiet
838                         --no-checkout
839                         --bare
840                         --mirror
841                         --origin
842                         --upload-pack
843                         --template=
844                         --depth
845                         "
846                 return
847                 ;;
848         esac
849         COMPREPLY=()
852 _git_commit ()
854         __git_has_doubledash && return
856         local cur="${COMP_WORDS[COMP_CWORD]}"
857         case "$cur" in
858         --*)
859                 __gitcomp "
860                         --all --author= --signoff --verify --no-verify
861                         --edit --amend --include --only --interactive
862                         "
863                 return
864         esac
865         COMPREPLY=()
868 _git_describe ()
870         local cur="${COMP_WORDS[COMP_CWORD]}"
871         case "$cur" in
872         --*)
873                 __gitcomp "
874                         --all --tags --contains --abbrev= --candidates=
875                         --exact-match --debug --long --match --always
876                         "
877                 return
878         esac
879         __gitcomp "$(__git_refs)"
882 __git_diff_common_options="--stat --numstat --shortstat --summary
883                         --patch-with-stat --name-only --name-status --color
884                         --no-color --color-words --no-renames --check
885                         --full-index --binary --abbrev --diff-filter=
886                         --find-copies-harder
887                         --text --ignore-space-at-eol --ignore-space-change
888                         --ignore-all-space --exit-code --quiet --ext-diff
889                         --no-ext-diff
890                         --no-prefix --src-prefix= --dst-prefix=
891                         --inter-hunk-context=
892                         --patience
893                         --raw
896 _git_diff ()
898         __git_has_doubledash && return
900         local cur="${COMP_WORDS[COMP_CWORD]}"
901         case "$cur" in
902         --*)
903                 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
904                         --base --ours --theirs
905                         $__git_diff_common_options
906                         "
907                 return
908                 ;;
909         esac
910         __git_complete_file
913 __git_fetch_options="
914         --quiet --verbose --append --upload-pack --force --keep --depth=
915         --tags --no-tags
918 _git_fetch ()
920         local cur="${COMP_WORDS[COMP_CWORD]}"
921         case "$cur" in
922         --*)
923                 __gitcomp "$__git_fetch_options"
924                 return
925                 ;;
926         esac
927         __git_complete_remote_or_refspec
930 _git_format_patch ()
932         local cur="${COMP_WORDS[COMP_CWORD]}"
933         case "$cur" in
934         --thread=*)
935                 __gitcomp "
936                         deep shallow
937                         " "" "${cur##--thread=}"
938                 return
939                 ;;
940         --*)
941                 __gitcomp "
942                         --stdout --attach --no-attach --thread --thread=
943                         --output-directory
944                         --numbered --start-number
945                         --numbered-files
946                         --keep-subject
947                         --signoff
948                         --in-reply-to= --cc=
949                         --full-index --binary
950                         --not --all
951                         --cover-letter
952                         --no-prefix --src-prefix= --dst-prefix=
953                         --inline --suffix= --ignore-if-in-upstream
954                         --subject-prefix=
955                         "
956                 return
957                 ;;
958         esac
959         __git_complete_revlist
962 _git_fsck ()
964         local cur="${COMP_WORDS[COMP_CWORD]}"
965         case "$cur" in
966         --*)
967                 __gitcomp "
968                         --tags --root --unreachable --cache --no-reflogs --full
969                         --strict --verbose --lost-found
970                         "
971                 return
972                 ;;
973         esac
974         COMPREPLY=()
977 _git_gc ()
979         local cur="${COMP_WORDS[COMP_CWORD]}"
980         case "$cur" in
981         --*)
982                 __gitcomp "--prune --aggressive"
983                 return
984                 ;;
985         esac
986         COMPREPLY=()
989 _git_grep ()
991         __git_has_doubledash && return
993         local cur="${COMP_WORDS[COMP_CWORD]}"
994         case "$cur" in
995         --*)
996                 __gitcomp "
997                         --cached
998                         --text --ignore-case --word-regexp --invert-match
999                         --full-name
1000                         --extended-regexp --basic-regexp --fixed-strings
1001                         --files-with-matches --name-only
1002                         --files-without-match
1003                         --count
1004                         --and --or --not --all-match
1005                         "
1006                 return
1007                 ;;
1008         esac
1009         COMPREPLY=()
1012 _git_help ()
1014         local cur="${COMP_WORDS[COMP_CWORD]}"
1015         case "$cur" in
1016         --*)
1017                 __gitcomp "--all --info --man --web"
1018                 return
1019                 ;;
1020         esac
1021         __gitcomp "$(__git_all_commands)
1022                 attributes cli core-tutorial cvs-migration
1023                 diffcore gitk glossary hooks ignore modules
1024                 repository-layout tutorial tutorial-2
1025                 workflows
1026                 "
1029 _git_init ()
1031         local cur="${COMP_WORDS[COMP_CWORD]}"
1032         case "$cur" in
1033         --shared=*)
1034                 __gitcomp "
1035                         false true umask group all world everybody
1036                         " "" "${cur##--shared=}"
1037                 return
1038                 ;;
1039         --*)
1040                 __gitcomp "--quiet --bare --template= --shared --shared="
1041                 return
1042                 ;;
1043         esac
1044         COMPREPLY=()
1047 _git_ls_files ()
1049         __git_has_doubledash && return
1051         local cur="${COMP_WORDS[COMP_CWORD]}"
1052         case "$cur" in
1053         --*)
1054                 __gitcomp "--cached --deleted --modified --others --ignored
1055                         --stage --directory --no-empty-directory --unmerged
1056                         --killed --exclude= --exclude-from=
1057                         --exclude-per-directory= --exclude-standard
1058                         --error-unmatch --with-tree= --full-name
1059                         --abbrev --ignored --exclude-per-directory
1060                         "
1061                 return
1062                 ;;
1063         esac
1064         COMPREPLY=()
1067 _git_ls_remote ()
1069         __gitcomp "$(__git_remotes)"
1072 _git_ls_tree ()
1074         __git_complete_file
1077 # Options that go well for log, shortlog and gitk
1078 __git_log_common_options="
1079         --not --all
1080         --branches --tags --remotes
1081         --first-parent --no-merges
1082         --max-count=
1083         --max-age= --since= --after=
1084         --min-age= --until= --before=
1086 # Options that go well for log and gitk (not shortlog)
1087 __git_log_gitk_options="
1088         --dense --sparse --full-history
1089         --simplify-merges --simplify-by-decoration
1090         --left-right
1092 # Options that go well for log and shortlog (not gitk)
1093 __git_log_shortlog_options="
1094         --author= --committer= --grep=
1095         --all-match
1098 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1100 _git_log ()
1102         __git_has_doubledash && return
1104         local cur="${COMP_WORDS[COMP_CWORD]}"
1105         local g="$(git rev-parse --git-dir 2>/dev/null)"
1106         local merge=""
1107         if [ -f "$g/MERGE_HEAD" ]; then
1108                 merge="--merge"
1109         fi
1110         case "$cur" in
1111         --pretty=*)
1112                 __gitcomp "$__git_log_pretty_formats
1113                         " "" "${cur##--pretty=}"
1114                 return
1115                 ;;
1116         --format=*)
1117                 __gitcomp "$__git_log_pretty_formats
1118                         " "" "${cur##--format=}"
1119                 return
1120                 ;;
1121         --date=*)
1122                 __gitcomp "
1123                         relative iso8601 rfc2822 short local default
1124                 " "" "${cur##--date=}"
1125                 return
1126                 ;;
1127         --*)
1128                 __gitcomp "
1129                         $__git_log_common_options
1130                         $__git_log_shortlog_options
1131                         $__git_log_gitk_options
1132                         --root --topo-order --date-order --reverse
1133                         --follow
1134                         --abbrev-commit --abbrev=
1135                         --relative-date --date=
1136                         --pretty= --format= --oneline
1137                         --cherry-pick
1138                         --graph
1139                         --decorate
1140                         --walk-reflogs
1141                         --parents --children
1142                         $merge
1143                         $__git_diff_common_options
1144                         --pickaxe-all --pickaxe-regex
1145                         "
1146                 return
1147                 ;;
1148         esac
1149         __git_complete_revlist
1152 __git_merge_options="
1153         --no-commit --no-stat --log --no-log --squash --strategy
1154         --commit --stat --no-squash --ff --no-ff
1157 _git_merge ()
1159         __git_complete_strategy && return
1161         local cur="${COMP_WORDS[COMP_CWORD]}"
1162         case "$cur" in
1163         --*)
1164                 __gitcomp "$__git_merge_options"
1165                 return
1166         esac
1167         __gitcomp "$(__git_refs)"
1170 _git_mergetool ()
1172         local cur="${COMP_WORDS[COMP_CWORD]}"
1173         case "$cur" in
1174         --tool=*)
1175                 __gitcomp "
1176                         kdiff3 tkdiff meld xxdiff emerge
1177                         vimdiff gvimdiff ecmerge opendiff
1178                         " "" "${cur##--tool=}"
1179                 return
1180                 ;;
1181         --*)
1182                 __gitcomp "--tool="
1183                 return
1184                 ;;
1185         esac
1186         COMPREPLY=()
1189 _git_merge_base ()
1191         __gitcomp "$(__git_refs)"
1194 _git_mv ()
1196         local cur="${COMP_WORDS[COMP_CWORD]}"
1197         case "$cur" in
1198         --*)
1199                 __gitcomp "--dry-run"
1200                 return
1201                 ;;
1202         esac
1203         COMPREPLY=()
1206 _git_name_rev ()
1208         __gitcomp "--tags --all --stdin"
1211 _git_pull ()
1213         __git_complete_strategy && return
1215         local cur="${COMP_WORDS[COMP_CWORD]}"
1216         case "$cur" in
1217         --*)
1218                 __gitcomp "
1219                         --rebase --no-rebase
1220                         $__git_merge_options
1221                         $__git_fetch_options
1222                 "
1223                 return
1224                 ;;
1225         esac
1226         __git_complete_remote_or_refspec
1229 _git_push ()
1231         local cur="${COMP_WORDS[COMP_CWORD]}"
1232         case "${COMP_WORDS[COMP_CWORD-1]}" in
1233         --repo)
1234                 __gitcomp "$(__git_remotes)"
1235                 return
1236         esac
1237         case "$cur" in
1238         --repo=*)
1239                 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1240                 return
1241                 ;;
1242         --*)
1243                 __gitcomp "
1244                         --all --mirror --tags --dry-run --force --verbose
1245                         --receive-pack= --repo=
1246                 "
1247                 return
1248                 ;;
1249         esac
1250         __git_complete_remote_or_refspec
1253 _git_rebase ()
1255         local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1256         if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1257                 __gitcomp "--continue --skip --abort"
1258                 return
1259         fi
1260         __git_complete_strategy && return
1261         case "$cur" in
1262         --*)
1263                 __gitcomp "--onto --merge --strategy --interactive"
1264                 return
1265         esac
1266         __gitcomp "$(__git_refs)"
1269 _git_send_email ()
1271         local cur="${COMP_WORDS[COMP_CWORD]}"
1272         case "$cur" in
1273         --*)
1274                 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1275                         --compose --dry-run --envelope-sender --from --identity
1276                         --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1277                         --no-suppress-from --no-thread --quiet
1278                         --signed-off-by-cc --smtp-pass --smtp-server
1279                         --smtp-server-port --smtp-ssl --smtp-user --subject
1280                         --suppress-cc --suppress-from --thread --to
1281                         --validate --no-validate"
1282                 return
1283                 ;;
1284         esac
1285         COMPREPLY=()
1288 _git_config ()
1290         local cur="${COMP_WORDS[COMP_CWORD]}"
1291         local prv="${COMP_WORDS[COMP_CWORD-1]}"
1292         case "$prv" in
1293         branch.*.remote)
1294                 __gitcomp "$(__git_remotes)"
1295                 return
1296                 ;;
1297         branch.*.merge)
1298                 __gitcomp "$(__git_refs)"
1299                 return
1300                 ;;
1301         remote.*.fetch)
1302                 local remote="${prv#remote.}"
1303                 remote="${remote%.fetch}"
1304                 __gitcomp "$(__git_refs_remotes "$remote")"
1305                 return
1306                 ;;
1307         remote.*.push)
1308                 local remote="${prv#remote.}"
1309                 remote="${remote%.push}"
1310                 __gitcomp "$(git --git-dir="$(__gitdir)" \
1311                         for-each-ref --format='%(refname):%(refname)' \
1312                         refs/heads)"
1313                 return
1314                 ;;
1315         pull.twohead|pull.octopus)
1316                 __gitcomp "$(__git_merge_strategies)"
1317                 return
1318                 ;;
1319         color.branch|color.diff|color.interactive|color.status|color.ui)
1320                 __gitcomp "always never auto"
1321                 return
1322                 ;;
1323         color.pager)
1324                 __gitcomp "false true"
1325                 return
1326                 ;;
1327         color.*.*)
1328                 __gitcomp "
1329                         normal black red green yellow blue magenta cyan white
1330                         bold dim ul blink reverse
1331                         "
1332                 return
1333                 ;;
1334         *.*)
1335                 COMPREPLY=()
1336                 return
1337                 ;;
1338         esac
1339         case "$cur" in
1340         --*)
1341                 __gitcomp "
1342                         --global --system --file=
1343                         --list --replace-all
1344                         --get --get-all --get-regexp
1345                         --add --unset --unset-all
1346                         --remove-section --rename-section
1347                         "
1348                 return
1349                 ;;
1350         branch.*.*)
1351                 local pfx="${cur%.*}."
1352                 cur="${cur##*.}"
1353                 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1354                 return
1355                 ;;
1356         branch.*)
1357                 local pfx="${cur%.*}."
1358                 cur="${cur#*.}"
1359                 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1360                 return
1361                 ;;
1362         remote.*.*)
1363                 local pfx="${cur%.*}."
1364                 cur="${cur##*.}"
1365                 __gitcomp "
1366                         url proxy fetch push mirror skipDefaultUpdate
1367                         receivepack uploadpack tagopt
1368                         " "$pfx" "$cur"
1369                 return
1370                 ;;
1371         remote.*)
1372                 local pfx="${cur%.*}."
1373                 cur="${cur#*.}"
1374                 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1375                 return
1376                 ;;
1377         esac
1378         __gitcomp "
1379                 apply.whitespace
1380                 branch.autosetupmerge
1381                 branch.autosetuprebase
1382                 clean.requireForce
1383                 color.branch
1384                 color.branch.current
1385                 color.branch.local
1386                 color.branch.plain
1387                 color.branch.remote
1388                 color.diff
1389                 color.diff.commit
1390                 color.diff.frag
1391                 color.diff.meta
1392                 color.diff.new
1393                 color.diff.old
1394                 color.diff.plain
1395                 color.diff.whitespace
1396                 color.interactive
1397                 color.interactive.header
1398                 color.interactive.help
1399                 color.interactive.prompt
1400                 color.pager
1401                 color.status
1402                 color.status.added
1403                 color.status.changed
1404                 color.status.header
1405                 color.status.nobranch
1406                 color.status.untracked
1407                 color.status.updated
1408                 color.ui
1409                 commit.template
1410                 core.autocrlf
1411                 core.bare
1412                 core.compression
1413                 core.deltaBaseCacheLimit
1414                 core.editor
1415                 core.excludesfile
1416                 core.fileMode
1417                 core.fsyncobjectfiles
1418                 core.gitProxy
1419                 core.ignoreCygwinFSTricks
1420                 core.ignoreStat
1421                 core.logAllRefUpdates
1422                 core.loosecompression
1423                 core.packedGitLimit
1424                 core.packedGitWindowSize
1425                 core.pager
1426                 core.preferSymlinkRefs
1427                 core.preloadindex
1428                 core.quotepath
1429                 core.repositoryFormatVersion
1430                 core.safecrlf
1431                 core.sharedRepository
1432                 core.symlinks
1433                 core.trustctime
1434                 core.warnAmbiguousRefs
1435                 core.whitespace
1436                 core.worktree
1437                 diff.autorefreshindex
1438                 diff.external
1439                 diff.mnemonicprefix
1440                 diff.renameLimit
1441                 diff.renameLimit.
1442                 diff.renames
1443                 fetch.unpackLimit
1444                 format.headers
1445                 format.numbered
1446                 format.pretty
1447                 format.suffix
1448                 gc.aggressiveWindow
1449                 gc.auto
1450                 gc.autopacklimit
1451                 gc.packrefs
1452                 gc.pruneexpire
1453                 gc.reflogexpire
1454                 gc.reflogexpireunreachable
1455                 gc.rerereresolved
1456                 gc.rerereunresolved
1457                 gitcvs.allbinary
1458                 gitcvs.dbTableNamePrefix
1459                 gitcvs.dbdriver
1460                 gitcvs.dbname
1461                 gitcvs.dbpass
1462                 gitcvs.dbuser
1463                 gitcvs.enabled
1464                 gitcvs.logfile
1465                 gitcvs.usecrlfattr
1466                 gui.blamehistoryctx
1467                 gui.commitmsgwidth
1468                 gui.copyblamethreshold
1469                 gui.diffcontext
1470                 gui.encoding
1471                 gui.fastcopyblame
1472                 gui.matchtrackingbranch
1473                 gui.newbranchtemplate
1474                 gui.pruneduringfetch
1475                 gui.spellingdictionary
1476                 gui.trustmtime
1477                 help.autocorrect
1478                 help.browser
1479                 help.format
1480                 http.lowSpeedLimit
1481                 http.lowSpeedTime
1482                 http.maxRequests
1483                 http.noEPSV
1484                 http.proxy
1485                 http.sslCAInfo
1486                 http.sslCAPath
1487                 http.sslCert
1488                 http.sslKey
1489                 http.sslVerify
1490                 i18n.commitEncoding
1491                 i18n.logOutputEncoding
1492                 instaweb.browser
1493                 instaweb.httpd
1494                 instaweb.local
1495                 instaweb.modulepath
1496                 instaweb.port
1497                 log.date
1498                 log.showroot
1499                 man.viewer
1500                 merge.conflictstyle
1501                 merge.log
1502                 merge.renameLimit
1503                 merge.stat
1504                 merge.tool
1505                 merge.verbosity
1506                 mergetool.keepBackup
1507                 pack.compression
1508                 pack.deltaCacheLimit
1509                 pack.deltaCacheSize
1510                 pack.depth
1511                 pack.indexVersion
1512                 pack.packSizeLimit
1513                 pack.threads
1514                 pack.window
1515                 pack.windowMemory
1516                 pull.octopus
1517                 pull.twohead
1518                 receive.denyCurrentBranch
1519                 receive.denyDeletes
1520                 receive.denyNonFastForwards
1521                 receive.fsckObjects
1522                 receive.unpackLimit
1523                 repack.usedeltabaseoffset
1524                 rerere.autoupdate
1525                 rerere.enabled
1526                 showbranch.default
1527                 status.relativePaths
1528                 status.showUntrackedFiles
1529                 tar.umask
1530                 transfer.unpackLimit
1531                 user.email
1532                 user.name
1533                 user.signingkey
1534                 web.browser
1535                 branch. remote.
1536         "
1539 _git_remote ()
1541         local subcommands="add rename rm show prune update set-head"
1542         local subcommand="$(__git_find_subcommand "$subcommands")"
1543         if [ -z "$subcommand" ]; then
1544                 __gitcomp "$subcommands"
1545                 return
1546         fi
1548         case "$subcommand" in
1549         rename|rm|show|prune)
1550                 __gitcomp "$(__git_remotes)"
1551                 ;;
1552         update)
1553                 local i c='' IFS=$'\n'
1554                 for i in $(git --git-dir="$(__gitdir)" config --list); do
1555                         case "$i" in
1556                         remotes.*)
1557                                 i="${i#remotes.}"
1558                                 c="$c ${i/=*/}"
1559                                 ;;
1560                         esac
1561                 done
1562                 __gitcomp "$c"
1563                 ;;
1564         *)
1565                 COMPREPLY=()
1566                 ;;
1567         esac
1570 _git_reset ()
1572         __git_has_doubledash && return
1574         local cur="${COMP_WORDS[COMP_CWORD]}"
1575         case "$cur" in
1576         --*)
1577                 __gitcomp "--merge --mixed --hard --soft"
1578                 return
1579                 ;;
1580         esac
1581         __gitcomp "$(__git_refs)"
1584 _git_revert ()
1586         local cur="${COMP_WORDS[COMP_CWORD]}"
1587         case "$cur" in
1588         --*)
1589                 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1590                 return
1591                 ;;
1592         esac
1593         __gitcomp "$(__git_refs)"
1596 _git_rm ()
1598         __git_has_doubledash && return
1600         local cur="${COMP_WORDS[COMP_CWORD]}"
1601         case "$cur" in
1602         --*)
1603                 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1604                 return
1605                 ;;
1606         esac
1607         COMPREPLY=()
1610 _git_shortlog ()
1612         __git_has_doubledash && return
1614         local cur="${COMP_WORDS[COMP_CWORD]}"
1615         case "$cur" in
1616         --*)
1617                 __gitcomp "
1618                         $__git_log_common_options
1619                         $__git_log_shortlog_options
1620                         --numbered --summary
1621                         "
1622                 return
1623                 ;;
1624         esac
1625         __git_complete_revlist
1628 _git_show ()
1630         __git_has_doubledash && return
1632         local cur="${COMP_WORDS[COMP_CWORD]}"
1633         case "$cur" in
1634         --pretty=*)
1635                 __gitcomp "$__git_log_pretty_formats
1636                         " "" "${cur##--pretty=}"
1637                 return
1638                 ;;
1639         --format=*)
1640                 __gitcomp "$__git_log_pretty_formats
1641                         " "" "${cur##--format=}"
1642                 return
1643                 ;;
1644         --*)
1645                 __gitcomp "--pretty= --format=
1646                         $__git_diff_common_options
1647                         "
1648                 return
1649                 ;;
1650         esac
1651         __git_complete_file
1654 _git_show_branch ()
1656         local cur="${COMP_WORDS[COMP_CWORD]}"
1657         case "$cur" in
1658         --*)
1659                 __gitcomp "
1660                         --all --remotes --topo-order --current --more=
1661                         --list --independent --merge-base --no-name
1662                         --sha1-name --topics --reflog
1663                         "
1664                 return
1665                 ;;
1666         esac
1667         __git_complete_revlist
1670 _git_stash ()
1672         local subcommands='save list show apply clear drop pop create branch'
1673         local subcommand="$(__git_find_subcommand "$subcommands")"
1674         if [ -z "$subcommand" ]; then
1675                 __gitcomp "$subcommands"
1676         else
1677                 local cur="${COMP_WORDS[COMP_CWORD]}"
1678                 case "$subcommand,$cur" in
1679                 save,--*)
1680                         __gitcomp "--keep-index"
1681                         ;;
1682                 apply,--*)
1683                         __gitcomp "--index"
1684                         ;;
1685                 show,--*|drop,--*|pop,--*|branch,--*)
1686                         COMPREPLY=()
1687                         ;;
1688                 show,*|apply,*|drop,*|pop,*|branch,*)
1689                         __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1690                                         | sed -n -e 's/:.*//p')"
1691                         ;;
1692                 *)
1693                         COMPREPLY=()
1694                         ;;
1695                 esac
1696         fi
1699 _git_submodule ()
1701         __git_has_doubledash && return
1703         local subcommands="add status init update summary foreach sync"
1704         if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1705                 local cur="${COMP_WORDS[COMP_CWORD]}"
1706                 case "$cur" in
1707                 --*)
1708                         __gitcomp "--quiet --cached"
1709                         ;;
1710                 *)
1711                         __gitcomp "$subcommands"
1712                         ;;
1713                 esac
1714                 return
1715         fi
1718 _git_svn ()
1720         local subcommands="
1721                 init fetch clone rebase dcommit log find-rev
1722                 set-tree commit-diff info create-ignore propget
1723                 proplist show-ignore show-externals branch tag blame
1724                 migrate
1725                 "
1726         local subcommand="$(__git_find_subcommand "$subcommands")"
1727         if [ -z "$subcommand" ]; then
1728                 __gitcomp "$subcommands"
1729         else
1730                 local remote_opts="--username= --config-dir= --no-auth-cache"
1731                 local fc_opts="
1732                         --follow-parent --authors-file= --repack=
1733                         --no-metadata --use-svm-props --use-svnsync-props
1734                         --log-window-size= --no-checkout --quiet
1735                         --repack-flags --use-log-author --localtime
1736                         --ignore-paths= $remote_opts
1737                         "
1738                 local init_opts="
1739                         --template= --shared= --trunk= --tags=
1740                         --branches= --stdlayout --minimize-url
1741                         --no-metadata --use-svm-props --use-svnsync-props
1742                         --rewrite-root= --prefix= --use-log-author
1743                         --add-author-from $remote_opts
1744                         "
1745                 local cmt_opts="
1746                         --edit --rmdir --find-copies-harder --copy-similarity=
1747                         "
1749                 local cur="${COMP_WORDS[COMP_CWORD]}"
1750                 case "$subcommand,$cur" in
1751                 fetch,--*)
1752                         __gitcomp "--revision= --fetch-all $fc_opts"
1753                         ;;
1754                 clone,--*)
1755                         __gitcomp "--revision= $fc_opts $init_opts"
1756                         ;;
1757                 init,--*)
1758                         __gitcomp "$init_opts"
1759                         ;;
1760                 dcommit,--*)
1761                         __gitcomp "
1762                                 --merge --strategy= --verbose --dry-run
1763                                 --fetch-all --no-rebase --commit-url
1764                                 --revision $cmt_opts $fc_opts
1765                                 "
1766                         ;;
1767                 set-tree,--*)
1768                         __gitcomp "--stdin $cmt_opts $fc_opts"
1769                         ;;
1770                 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1771                 show-externals,--*)
1772                         __gitcomp "--revision="
1773                         ;;
1774                 log,--*)
1775                         __gitcomp "
1776                                 --limit= --revision= --verbose --incremental
1777                                 --oneline --show-commit --non-recursive
1778                                 --authors-file= --color
1779                                 "
1780                         ;;
1781                 rebase,--*)
1782                         __gitcomp "
1783                                 --merge --verbose --strategy= --local
1784                                 --fetch-all --dry-run $fc_opts
1785                                 "
1786                         ;;
1787                 commit-diff,--*)
1788                         __gitcomp "--message= --file= --revision= $cmt_opts"
1789                         ;;
1790                 info,--*)
1791                         __gitcomp "--url"
1792                         ;;
1793                 branch,--*)
1794                         __gitcomp "--dry-run --message --tag"
1795                         ;;
1796                 tag,--*)
1797                         __gitcomp "--dry-run --message"
1798                         ;;
1799                 blame,--*)
1800                         __gitcomp "--git-format"
1801                         ;;
1802                 migrate,--*)
1803                         __gitcomp "
1804                                 --config-dir= --ignore-paths= --minimize
1805                                 --no-auth-cache --username=
1806                                 "
1807                         ;;
1808                 *)
1809                         COMPREPLY=()
1810                         ;;
1811                 esac
1812         fi
1815 _git_tag ()
1817         local i c=1 f=0
1818         while [ $c -lt $COMP_CWORD ]; do
1819                 i="${COMP_WORDS[c]}"
1820                 case "$i" in
1821                 -d|-v)
1822                         __gitcomp "$(__git_tags)"
1823                         return
1824                         ;;
1825                 -f)
1826                         f=1
1827                         ;;
1828                 esac
1829                 c=$((++c))
1830         done
1832         case "${COMP_WORDS[COMP_CWORD-1]}" in
1833         -m|-F)
1834                 COMPREPLY=()
1835                 ;;
1836         -*|tag)
1837                 if [ $f = 1 ]; then
1838                         __gitcomp "$(__git_tags)"
1839                 else
1840                         COMPREPLY=()
1841                 fi
1842                 ;;
1843         *)
1844                 __gitcomp "$(__git_refs)"
1845                 ;;
1846         esac
1849 _git ()
1851         local i c=1 command __git_dir
1853         while [ $c -lt $COMP_CWORD ]; do
1854                 i="${COMP_WORDS[c]}"
1855                 case "$i" in
1856                 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1857                 --bare)      __git_dir="." ;;
1858                 --version|-p|--paginate) ;;
1859                 --help) command="help"; break ;;
1860                 *) command="$i"; break ;;
1861                 esac
1862                 c=$((++c))
1863         done
1865         if [ -z "$command" ]; then
1866                 case "${COMP_WORDS[COMP_CWORD]}" in
1867                 --*)   __gitcomp "
1868                         --paginate
1869                         --no-pager
1870                         --git-dir=
1871                         --bare
1872                         --version
1873                         --exec-path
1874                         --work-tree=
1875                         --help
1876                         "
1877                         ;;
1878                 *)     __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1879                 esac
1880                 return
1881         fi
1883         local expansion=$(__git_aliased_command "$command")
1884         [ "$expansion" ] && command="$expansion"
1886         case "$command" in
1887         am)          _git_am ;;
1888         add)         _git_add ;;
1889         apply)       _git_apply ;;
1890         archive)     _git_archive ;;
1891         bisect)      _git_bisect ;;
1892         bundle)      _git_bundle ;;
1893         branch)      _git_branch ;;
1894         checkout)    _git_checkout ;;
1895         cherry)      _git_cherry ;;
1896         cherry-pick) _git_cherry_pick ;;
1897         clean)       _git_clean ;;
1898         clone)       _git_clone ;;
1899         commit)      _git_commit ;;
1900         config)      _git_config ;;
1901         describe)    _git_describe ;;
1902         diff)        _git_diff ;;
1903         fetch)       _git_fetch ;;
1904         format-patch) _git_format_patch ;;
1905         fsck)        _git_fsck ;;
1906         gc)          _git_gc ;;
1907         grep)        _git_grep ;;
1908         help)        _git_help ;;
1909         init)        _git_init ;;
1910         log)         _git_log ;;
1911         ls-files)    _git_ls_files ;;
1912         ls-remote)   _git_ls_remote ;;
1913         ls-tree)     _git_ls_tree ;;
1914         merge)       _git_merge;;
1915         mergetool)   _git_mergetool;;
1916         merge-base)  _git_merge_base ;;
1917         mv)          _git_mv ;;
1918         name-rev)    _git_name_rev ;;
1919         pull)        _git_pull ;;
1920         push)        _git_push ;;
1921         rebase)      _git_rebase ;;
1922         remote)      _git_remote ;;
1923         reset)       _git_reset ;;
1924         revert)      _git_revert ;;
1925         rm)          _git_rm ;;
1926         send-email)  _git_send_email ;;
1927         shortlog)    _git_shortlog ;;
1928         show)        _git_show ;;
1929         show-branch) _git_show_branch ;;
1930         stash)       _git_stash ;;
1931         stage)       _git_add ;;
1932         submodule)   _git_submodule ;;
1933         svn)         _git_svn ;;
1934         tag)         _git_tag ;;
1935         whatchanged) _git_log ;;
1936         *)           COMPREPLY=() ;;
1937         esac
1940 _gitk ()
1942         __git_has_doubledash && return
1944         local cur="${COMP_WORDS[COMP_CWORD]}"
1945         local g="$(__gitdir)"
1946         local merge=""
1947         if [ -f "$g/MERGE_HEAD" ]; then
1948                 merge="--merge"
1949         fi
1950         case "$cur" in
1951         --*)
1952                 __gitcomp "
1953                         $__git_log_common_options
1954                         $__git_log_gitk_options
1955                         $merge
1956                         "
1957                 return
1958                 ;;
1959         esac
1960         __git_complete_revlist
1963 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1964         || complete -o default -o nospace -F _git git
1965 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1966         || complete -o default -o nospace -F _gitk gitk
1968 # The following are necessary only for Cygwin, and only are needed
1969 # when the user has tab-completed the executable name and consequently
1970 # included the '.exe' suffix.
1972 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1973 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1974         || complete -o default -o nospace -F _git git.exe
1975 fi