Code

bash: Classify more commends out of completion.
[git.git] / contrib / completion / git-completion.bash
1 #
2 # bash completion support for core Git.
3 #
4 # Copyright (C) 2006,2007 Shawn Pearce
5 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
6 #
7 # The contained completion routines provide support for completing:
8 #
9 #    *) local and remote branch names
10 #    *) local and remote tag names
11 #    *) .git/remotes file names
12 #    *) git 'subcommands'
13 #    *) tree paths within 'ref:path/to/file' expressions
14 #
15 # To use these routines:
16 #
17 #    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
18 #    2) Added the following line to your .bashrc:
19 #        source ~/.git-completion.sh
20 #
21 #    3) You may want to make sure the git executable is available
22 #       in your PATH before this script is sourced, as some caching
23 #       is performed while the script loads.  If git isn't found
24 #       at source time then all lookups will be done on demand,
25 #       which may be slightly slower.
26 #
27 #    4) Consider changing your PS1 to also show the current branch:
28 #        PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
29 #
30 #       The argument to __git_ps1 will be displayed only if you
31 #       are currently in a git repository.  The %s token will be
32 #       the name of the current branch.
33 #
35 __gitdir ()
36 {
37         if [ -z "$1" ]; then
38                 if [ -n "$__git_dir" ]; then
39                         echo "$__git_dir"
40                 elif [ -d .git ]; then
41                         echo .git
42                 else
43                         git rev-parse --git-dir 2>/dev/null
44                 fi
45         elif [ -d "$1/.git" ]; then
46                 echo "$1/.git"
47         else
48                 echo "$1"
49         fi
50 }
52 __git_ps1 ()
53 {
54         local b="$(git symbolic-ref HEAD 2>/dev/null)"
55         if [ -n "$b" ]; then
56                 if [ -n "$1" ]; then
57                         printf "$1" "${b##refs/heads/}"
58                 else
59                         printf " (%s)" "${b##refs/heads/}"
60                 fi
61         fi
62 }
64 __gitcomp ()
65 {
66         local all c s=$'\n' IFS=' '$'\t'$'\n'
67         for c in $1; do
68                 case "$c" in
69                 --*=*) all="$all$c$s" ;;
70                 *)     all="$all$c $s" ;;
71                 esac
72         done
73         IFS=$s
74         COMPREPLY=($(compgen -W "$all" -- "${COMP_WORDS[COMP_CWORD]}"))
75         return
76 }
78 __git_heads ()
79 {
80         local cmd i is_hash=y dir="$(__gitdir "$1")"
81         if [ -d "$dir" ]; then
82                 for i in $(git --git-dir="$dir" \
83                         for-each-ref --format='%(refname)' \
84                         refs/heads ); do
85                         echo "${i#refs/heads/}"
86                 done
87                 return
88         fi
89         for i in $(git-ls-remote "$1" 2>/dev/null); do
90                 case "$is_hash,$i" in
91                 y,*) is_hash=n ;;
92                 n,*^{}) is_hash=y ;;
93                 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
94                 n,*) is_hash=y; echo "$i" ;;
95                 esac
96         done
97 }
99 __git_refs ()
101         local cmd i is_hash=y dir="$(__gitdir "$1")"
102         if [ -d "$dir" ]; then
103                 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
104                 for i in $(git --git-dir="$dir" \
105                         for-each-ref --format='%(refname)' \
106                         refs/tags refs/heads refs/remotes); do
107                         case "$i" in
108                                 refs/tags/*)    echo "${i#refs/tags/}" ;;
109                                 refs/heads/*)   echo "${i#refs/heads/}" ;;
110                                 refs/remotes/*) echo "${i#refs/remotes/}" ;;
111                                 *)              echo "$i" ;;
112                         esac
113                 done
114                 return
115         fi
116         for i in $(git-ls-remote "$dir" 2>/dev/null); do
117                 case "$is_hash,$i" in
118                 y,*) is_hash=n ;;
119                 n,*^{}) is_hash=y ;;
120                 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
121                 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
122                 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
123                 n,*) is_hash=y; echo "$i" ;;
124                 esac
125         done
128 __git_refs2 ()
130         local i
131         for i in $(__git_refs "$1"); do
132                 echo "$i:$i"
133         done
136 __git_refs_remotes ()
138         local cmd i is_hash=y
139         for i in $(git-ls-remote "$1" 2>/dev/null); do
140                 case "$is_hash,$i" in
141                 n,refs/heads/*)
142                         is_hash=y
143                         echo "$i:refs/remotes/$1/${i#refs/heads/}"
144                         ;;
145                 y,*) is_hash=n ;;
146                 n,*^{}) is_hash=y ;;
147                 n,refs/tags/*) is_hash=y;;
148                 n,*) is_hash=y; ;;
149                 esac
150         done
153 __git_remotes ()
155         local i ngoff IFS=$'\n' d="$(__gitdir)"
156         shopt -q nullglob || ngoff=1
157         shopt -s nullglob
158         for i in "$d/remotes"/*; do
159                 echo ${i#$d/remotes/}
160         done
161         [ "$ngoff" ] && shopt -u nullglob
162         for i in $(git --git-dir="$d" config --list); do
163                 case "$i" in
164                 remote.*.url=*)
165                         i="${i#remote.}"
166                         echo "${i/.url=*/}"
167                         ;;
168                 esac
169         done
172 __git_merge_strategies ()
174         if [ -n "$__git_merge_strategylist" ]; then
175                 echo "$__git_merge_strategylist"
176                 return
177         fi
178         sed -n "/^all_strategies='/{
179                 s/^all_strategies='//
180                 s/'//
181                 p
182                 q
183                 }" "$(git --exec-path)/git-merge"
185 __git_merge_strategylist=
186 __git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
188 __git_complete_file ()
190         local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
191         case "$cur" in
192         ?*:*)
193                 ref="${cur%%:*}"
194                 cur="${cur#*:}"
195                 case "$cur" in
196                 ?*/*)
197                         pfx="${cur%/*}"
198                         cur="${cur##*/}"
199                         ls="$ref:$pfx"
200                         pfx="$pfx/"
201                         ;;
202                 *)
203                         ls="$ref"
204                         ;;
205             esac
206                 COMPREPLY=($(compgen -P "$pfx" \
207                         -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
208                                 | sed '/^100... blob /s,^.*     ,,
209                                        /^040000 tree /{
210                                            s,^.*        ,,
211                                            s,$,/,
212                                        }
213                                        s/^.*    //')" \
214                         -- "$cur"))
215                 ;;
216         *)
217                 COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
218                 ;;
219         esac
222 __git_complete_revlist ()
224         local pfx cur="${COMP_WORDS[COMP_CWORD]}"
225         case "$cur" in
226         *...*)
227                 pfx="${cur%...*}..."
228                 cur="${cur#*...}"
229                 COMPREPLY=($(compgen -P "$pfx" -W "$(__git_refs)" -- "$cur"))
230                 ;;
231         *..*)
232                 pfx="${cur%..*}.."
233                 cur="${cur#*..}"
234                 COMPREPLY=($(compgen -P "$pfx" -W "$(__git_refs)" -- "$cur"))
235                 ;;
236         *)
237                 COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
238                 ;;
239         esac
242 __git_commands ()
244         if [ -n "$__git_commandlist" ]; then
245                 echo "$__git_commandlist"
246                 return
247         fi
248         local i IFS=" "$'\n'
249         for i in $(git help -a|egrep '^ ')
250         do
251                 case $i in
252                 add--interactive) : plumbing;;
253                 applymbox)        : ask gittus;;
254                 applypatch)       : ask gittus;;
255                 archimport)       : import;;
256                 cat-file)         : plumbing;;
257                 check-ref-format) : plumbing;;
258                 commit-tree)      : plumbing;;
259                 convert-objects)  : plumbing;;
260                 cvsexportcommit)  : export;;
261                 cvsimport)        : import;;
262                 cvsserver)        : daemon;;
263                 daemon)           : daemon;;
264                 fsck-objects)     : plumbing;;
265                 fetch-pack)       : plumbing;;
266                 fmt-merge-msg)    : plumbing;;
267                 hash-object)      : plumbing;;
268                 http-*)           : transport;;
269                 index-pack)       : plumbing;;
270                 init-db)          : deprecated;;
271                 local-fetch)      : plumbing;;
272                 mailinfo)         : plumbing;;
273                 mailsplit)        : plumbing;;
274                 merge-*)          : plumbing;;
275                 mktree)           : plumbing;;
276                 mktag)            : plumbing;;
277                 pack-objects)     : plumbing;;
278                 pack-redundant)   : plumbing;;
279                 pack-refs)        : plumbing;;
280                 parse-remote)     : plumbing;;
281                 patch-id)         : plumbing;;
282                 peek-remote)      : plumbing;;
283                 prune)            : plumbing;;
284                 prune-packed)     : plumbing;;
285                 quiltimport)      : import;;
286                 read-tree)        : plumbing;;
287                 receive-pack)     : plumbing;;
288                 reflog)           : plumbing;;
289                 repo-config)      : plumbing;;
290                 rerere)           : plumbing;;
291                 rev-list)         : plumbing;;
292                 rev-parse)        : plumbing;;
293                 runstatus)        : plumbing;;
294                 sh-setup)         : internal;;
295                 shell)            : daemon;;
296                 send-pack)        : plumbing;;
297                 show-index)       : plumbing;;
298                 ssh-*)            : transport;;
299                 stripspace)       : plumbing;;
300                 svn)              : import export;;
301                 svnimport)        : import;;
302                 symbolic-ref)     : plumbing;;
303                 tar-tree)         : deprecated;;
304                 unpack-file)      : plumbing;;
305                 unpack-objects)   : plumbing;;
306                 update-index)     : plumbing;;
307                 update-ref)       : plumbing;;
308                 update-server-info) : daemon;;
309                 upload-archive)   : plumbing;;
310                 upload-pack)      : plumbing;;
311                 write-tree)       : plumbing;;
312                 verify-tag)       : plumbing;;
313                 *) echo $i;;
314                 esac
315         done
317 __git_commandlist=
318 __git_commandlist="$(__git_commands 2>/dev/null)"
320 __git_aliases ()
322         local i IFS=$'\n'
323         for i in $(git --git-dir="$(__gitdir)" config --list); do
324                 case "$i" in
325                 alias.*)
326                         i="${i#alias.}"
327                         echo "${i/=*/}"
328                         ;;
329                 esac
330         done
333 __git_aliased_command ()
335         local word cmdline=$(git --git-dir="$(__gitdir)" \
336                 config --get "alias.$1")
337         for word in $cmdline; do
338                 if [ "${word##-*}" ]; then
339                         echo $word
340                         return
341                 fi
342         done
345 __git_whitespacelist="nowarn warn error error-all strip"
347 _git_am ()
349         local cur="${COMP_WORDS[COMP_CWORD]}"
350         if [ -d .dotest ]; then
351                 COMPREPLY=($(compgen -W "
352                         --skip --resolved
353                         " -- "$cur"))
354                 return
355         fi
356         case "$cur" in
357         --whitespace=*)
358                 COMPREPLY=($(compgen -W "$__git_whitespacelist" \
359                         -- "${cur##--whitespace=}"))
360                 return
361                 ;;
362         --*)
363                 COMPREPLY=($(compgen -W "
364                         --signoff --utf8 --binary --3way --interactive
365                         --whitespace=
366                         " -- "$cur"))
367                 return
368         esac
369         COMPREPLY=()
372 _git_apply ()
374         local cur="${COMP_WORDS[COMP_CWORD]}"
375         case "$cur" in
376         --whitespace=*)
377                 COMPREPLY=($(compgen -W "$__git_whitespacelist" \
378                         -- "${cur##--whitespace=}"))
379                 return
380                 ;;
381         --*)
382                 COMPREPLY=($(compgen -W "
383                         --stat --numstat --summary --check --index
384                         --cached --index-info --reverse --reject --unidiff-zero
385                         --apply --no-add --exclude=
386                         --whitespace= --inaccurate-eof --verbose
387                         " -- "$cur"))
388                 return
389         esac
390         COMPREPLY=()
393 _git_add ()
395         local cur="${COMP_WORDS[COMP_CWORD]}"
396         case "$cur" in
397         --*)
398                 COMPREPLY=($(compgen -W "
399                         --interactive
400                         " -- "$cur"))
401                 return
402         esac
403         COMPREPLY=()
406 _git_branch ()
408         local cur="${COMP_WORDS[COMP_CWORD]}"
409         COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
412 _git_checkout ()
414         local cur="${COMP_WORDS[COMP_CWORD]}"
415         COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
418 _git_cherry_pick ()
420         local cur="${COMP_WORDS[COMP_CWORD]}"
421         case "$cur" in
422         --*)
423                 COMPREPLY=($(compgen -W "
424                         --edit --no-commit
425                         " -- "$cur"))
426                 ;;
427         *)
428                 COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
429                 ;;
430         esac
433 _git_commit ()
435         local cur="${COMP_WORDS[COMP_CWORD]}"
436         case "$cur" in
437         --*)
438                 COMPREPLY=($(compgen -W "
439                         --all --author= --signoff --verify --no-verify
440                         --edit --amend --include --only
441                         " -- "$cur"))
442                 return
443         esac
444         COMPREPLY=()
447 _git_diff ()
449         __git_complete_file
452 _git_diff_tree ()
454         local cur="${COMP_WORDS[COMP_CWORD]}"
455         COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
458 _git_fetch ()
460         local cur="${COMP_WORDS[COMP_CWORD]}"
462         case "${COMP_WORDS[0]},$COMP_CWORD" in
463         git-fetch*,1)
464                 COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
465                 ;;
466         git,2)
467                 COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
468                 ;;
469         *)
470                 case "$cur" in
471                 *:*)
472                         cur="${cur#*:}"
473                         COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
474                         ;;
475                 *)
476                         local remote
477                         case "${COMP_WORDS[0]}" in
478                         git-fetch) remote="${COMP_WORDS[1]}" ;;
479                         git)       remote="${COMP_WORDS[2]}" ;;
480                         esac
481                         COMPREPLY=($(compgen -W "$(__git_refs2 "$remote")" -- "$cur"))
482                         ;;
483                 esac
484                 ;;
485         esac
488 _git_format_patch ()
490         local cur="${COMP_WORDS[COMP_CWORD]}"
491         case "$cur" in
492         --*)
493                 COMPREPLY=($(compgen -W "
494                         --stdout --attach --thread
495                         --output-directory
496                         --numbered --start-number
497                         --keep-subject
498                         --signoff
499                         --in-reply-to=
500                         --full-index --binary
501                         " -- "$cur"))
502                 return
503                 ;;
504         esac
505         __git_complete_revlist
508 _git_ls_remote ()
510         local cur="${COMP_WORDS[COMP_CWORD]}"
511         COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
514 _git_ls_tree ()
516         __git_complete_file
519 _git_log ()
521         local cur="${COMP_WORDS[COMP_CWORD]}"
522         case "$cur" in
523         --pretty=*)
524                 COMPREPLY=($(compgen -W "
525                         oneline short medium full fuller email raw
526                         " -- "${cur##--pretty=}"))
527                 return
528                 ;;
529         --*)
530                 COMPREPLY=($(compgen -W "
531                         --max-count= --max-age= --since= --after=
532                         --min-age= --before= --until=
533                         --root --not --topo-order --date-order
534                         --no-merges
535                         --abbrev-commit --abbrev=
536                         --relative-date
537                         --author= --committer= --grep=
538                         --all-match
539                         --pretty= --name-status --name-only
540                         " -- "$cur"))
541                 return
542                 ;;
543         esac
544         __git_complete_revlist
547 _git_merge ()
549         local cur="${COMP_WORDS[COMP_CWORD]}"
550         case "${COMP_WORDS[COMP_CWORD-1]}" in
551         -s|--strategy)
552                 COMPREPLY=($(compgen -W "$(__git_merge_strategies)" -- "$cur"))
553                 return
554         esac
555         case "$cur" in
556         --strategy=*)
557                 COMPREPLY=($(compgen -W "$(__git_merge_strategies)" \
558                         -- "${cur##--strategy=}"))
559                 return
560                 ;;
561         --*)
562                 COMPREPLY=($(compgen -W "
563                         --no-commit --no-summary --squash --strategy
564                         " -- "$cur"))
565                 return
566         esac
567         COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
570 _git_merge_base ()
572         local cur="${COMP_WORDS[COMP_CWORD]}"
573         COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
576 _git_name_rev ()
578         local cur="${COMP_WORDS[COMP_CWORD]}"
579         COMPREPLY=($(compgen -W "--tags --all --stdin" -- "$cur"))
582 _git_pull ()
584         local cur="${COMP_WORDS[COMP_CWORD]}"
586         case "${COMP_WORDS[0]},$COMP_CWORD" in
587         git-pull*,1)
588                 COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
589                 ;;
590         git,2)
591                 COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
592                 ;;
593         *)
594                 local remote
595                 case "${COMP_WORDS[0]}" in
596                 git-pull)  remote="${COMP_WORDS[1]}" ;;
597                 git)       remote="${COMP_WORDS[2]}" ;;
598                 esac
599                 COMPREPLY=($(compgen -W "$(__git_refs "$remote")" -- "$cur"))
600                 ;;
601         esac
604 _git_push ()
606         local cur="${COMP_WORDS[COMP_CWORD]}"
608         case "${COMP_WORDS[0]},$COMP_CWORD" in
609         git-push*,1)
610                 COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
611                 ;;
612         git,2)
613                 COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
614                 ;;
615         *)
616                 case "$cur" in
617                 *:*)
618                         local remote
619                         case "${COMP_WORDS[0]}" in
620                         git-push)  remote="${COMP_WORDS[1]}" ;;
621                         git)       remote="${COMP_WORDS[2]}" ;;
622                         esac
623                         cur="${cur#*:}"
624                         COMPREPLY=($(compgen -W "$(__git_refs "$remote")" -- "$cur"))
625                         ;;
626                 *)
627                         COMPREPLY=($(compgen -W "$(__git_refs2)" -- "$cur"))
628                         ;;
629                 esac
630                 ;;
631         esac
634 _git_rebase ()
636         local cur="${COMP_WORDS[COMP_CWORD]}"
637         if [ -d .dotest ]; then
638                 COMPREPLY=($(compgen -W "
639                         --continue --skip --abort
640                         " -- "$cur"))
641                 return
642         fi
643         case "${COMP_WORDS[COMP_CWORD-1]}" in
644         -s|--strategy)
645                 COMPREPLY=($(compgen -W "$(__git_merge_strategies)" -- "$cur"))
646                 return
647         esac
648         case "$cur" in
649         --strategy=*)
650                 COMPREPLY=($(compgen -W "$(__git_merge_strategies)" \
651                         -- "${cur##--strategy=}"))
652                 return
653                 ;;
654         --*)
655                 COMPREPLY=($(compgen -W "
656                         --onto --merge --strategy
657                         " -- "$cur"))
658                 return
659         esac
660         COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
663 _git_config ()
665         local cur="${COMP_WORDS[COMP_CWORD]}"
666         local prv="${COMP_WORDS[COMP_CWORD-1]}"
667         case "$prv" in
668         branch.*.remote)
669                 COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
670                 return
671                 ;;
672         branch.*.merge)
673                 COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
674                 return
675                 ;;
676         remote.*.fetch)
677                 local remote="${prv#remote.}"
678                 remote="${remote%.fetch}"
679                 COMPREPLY=($(compgen -W "$(__git_refs_remotes "$remote")" \
680                         -- "$cur"))
681                 return
682                 ;;
683         remote.*.push)
684                 local remote="${prv#remote.}"
685                 remote="${remote%.push}"
686                 COMPREPLY=($(compgen -W "$(git --git-dir="$(__gitdir)" \
687                         for-each-ref --format='%(refname):%(refname)' \
688                         refs/heads)" -- "$cur"))
689                 return
690                 ;;
691         *.*)
692                 COMPREPLY=()
693                 return
694                 ;;
695         esac
696         case "$cur" in
697         --*)
698                 COMPREPLY=($(compgen -W "
699                         --global --list --replace-all
700                         --get --get-all --get-regexp
701                         --unset --unset-all
702                         " -- "$cur"))
703                 return
704                 ;;
705         branch.*.*)
706                 local pfx="${cur%.*}."
707                 cur="${cur##*.}"
708                 COMPREPLY=($(compgen -P "$pfx" -W "remote merge" -- "$cur"))
709                 return
710                 ;;
711         branch.*)
712                 local pfx="${cur%.*}."
713                 cur="${cur#*.}"
714                 COMPREPLY=($(compgen -P "$pfx" -S . \
715                         -W "$(__git_heads)" -- "$cur"))
716                 return
717                 ;;
718         remote.*.*)
719                 local pfx="${cur%.*}."
720                 cur="${cur##*.}"
721                 COMPREPLY=($(compgen -P "$pfx" -W "url fetch push" -- "$cur"))
722                 return
723                 ;;
724         remote.*)
725                 local pfx="${cur%.*}."
726                 cur="${cur#*.}"
727                 COMPREPLY=($(compgen -P "$pfx" -S . \
728                         -W "$(__git_remotes)" -- "$cur"))
729                 return
730                 ;;
731         esac
732         COMPREPLY=($(compgen -W "
733                 apply.whitespace
734                 core.fileMode
735                 core.gitProxy
736                 core.ignoreStat
737                 core.preferSymlinkRefs
738                 core.logAllRefUpdates
739                 core.repositoryFormatVersion
740                 core.sharedRepository
741                 core.warnAmbiguousRefs
742                 core.compression
743                 core.legacyHeaders
744                 i18n.commitEncoding
745                 i18n.logOutputEncoding
746                 diff.color
747                 color.diff
748                 diff.renameLimit
749                 diff.renames
750                 pager.color
751                 color.pager
752                 status.color
753                 color.status
754                 log.showroot
755                 show.difftree
756                 showbranch.default
757                 whatchanged.difftree
758                 http.sslVerify
759                 http.sslCert
760                 http.sslKey
761                 http.sslCAInfo
762                 http.sslCAPath
763                 http.maxRequests
764                 http.lowSpeedLimit http.lowSpeedTime
765                 http.noEPSV
766                 pack.window
767                 repack.useDeltaBaseOffset
768                 pull.octopus pull.twohead
769                 merge.summary
770                 receive.unpackLimit
771                 receive.denyNonFastForwards
772                 user.name user.email
773                 tar.umask
774                 gitcvs.enabled
775                 gitcvs.logfile
776                 branch. remote.
777         " -- "$cur"))
780 _git_reset ()
782         local cur="${COMP_WORDS[COMP_CWORD]}"
783         local opt="--mixed --hard --soft"
784         COMPREPLY=($(compgen -W "$opt $(__git_refs)" -- "$cur"))
787 _git_show ()
789         local cur="${COMP_WORDS[COMP_CWORD]}"
790         case "$cur" in
791         --pretty=*)
792                 COMPREPLY=($(compgen -W "
793                         oneline short medium full fuller email raw
794                         " -- "${cur##--pretty=}"))
795                 return
796                 ;;
797         --*)
798                 COMPREPLY=($(compgen -W "--pretty=" -- "$cur"))
799                 return
800                 ;;
801         esac
802         __git_complete_file
805 _git ()
807         local i c=1 command __git_dir
809         while [ $c -lt $COMP_CWORD ]; do
810                 i="${COMP_WORDS[c]}"
811                 case "$i" in
812                 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
813                 --bare)      __git_dir="." ;;
814                 --version|--help|-p|--paginate) ;;
815                 *) command="$i"; break ;;
816                 esac
817                 c=$((++c))
818         done
820         if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
821                 case "${COMP_WORDS[COMP_CWORD]}" in
822                 --*=*) COMPREPLY=() ;;
823                 --*)   __gitcomp "--git-dir= --bare --version --exec-path" ;;
824                 *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
825                 esac
826                 return
827         fi
829         local expansion=$(__git_aliased_command "$command")
830         [ "$expansion" ] && command="$expansion"
832         case "$command" in
833         am)          _git_am ;;
834         add)         _git_add ;;
835         apply)       _git_apply ;;
836         branch)      _git_branch ;;
837         checkout)    _git_checkout ;;
838         cherry-pick) _git_cherry_pick ;;
839         commit)      _git_commit ;;
840         config)      _git_config ;;
841         diff)        _git_diff ;;
842         diff-tree)   _git_diff_tree ;;
843         fetch)       _git_fetch ;;
844         format-patch) _git_format_patch ;;
845         log)         _git_log ;;
846         ls-remote)   _git_ls_remote ;;
847         ls-tree)     _git_ls_tree ;;
848         merge)       _git_merge;;
849         merge-base)  _git_merge_base ;;
850         name-rev)    _git_name_rev ;;
851         pull)        _git_pull ;;
852         push)        _git_push ;;
853         rebase)      _git_rebase ;;
854         reset)       _git_reset ;;
855         show)        _git_show ;;
856         show-branch) _git_log ;;
857         whatchanged) _git_log ;;
858         *)           COMPREPLY=() ;;
859         esac
862 _gitk ()
864         local cur="${COMP_WORDS[COMP_CWORD]}"
865         COMPREPLY=($(compgen -W "--all $(__git_refs)" -- "$cur"))
868 complete -o default -o nospace -F _git git
869 complete -o default            -F _gitk gitk
870 complete -o default            -F _git_am git-am
871 complete -o default            -F _git_apply git-apply
872 complete -o default            -F _git_branch git-branch
873 complete -o default            -F _git_checkout git-checkout
874 complete -o default            -F _git_cherry_pick git-cherry-pick
875 complete -o default            -F _git_commit git-commit
876 complete -o default -o nospace -F _git_diff git-diff
877 complete -o default            -F _git_diff_tree git-diff-tree
878 complete -o default -o nospace -F _git_fetch git-fetch
879 complete -o default -o nospace -F _git_format_patch git-format-patch
880 complete -o default -o nospace -F _git_log git-log
881 complete -o default            -F _git_ls_remote git-ls-remote
882 complete -o default -o nospace -F _git_ls_tree git-ls-tree
883 complete -o default            -F _git_merge git-merge
884 complete -o default            -F _git_merge_base git-merge-base
885 complete -o default            -F _git_name_rev git-name-rev
886 complete -o default -o nospace -F _git_pull git-pull
887 complete -o default -o nospace -F _git_push git-push
888 complete -o default            -F _git_rebase git-rebase
889 complete -o default            -F _git_config git-config
890 complete -o default            -F _git_reset git-reset
891 complete -o default -o nospace -F _git_show git-show
892 complete -o default -o nospace -F _git_log git-show-branch
893 complete -o default -o nospace -F _git_log git-whatchanged
895 # The following are necessary only for Cygwin, and only are needed
896 # when the user has tab-completed the executable name and consequently
897 # included the '.exe' suffix.
899 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
900 complete -o default            -F _git_add git-add.exe
901 complete -o default            -F _git_apply git-apply.exe
902 complete -o default -o nospace -F _git git.exe
903 complete -o default            -F _git_branch git-branch.exe
904 complete -o default -o nospace -F _git_diff git-diff.exe
905 complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
906 complete -o default -o nospace -F _git_format_patch git-format-patch.exe
907 complete -o default -o nospace -F _git_log git-log.exe
908 complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
909 complete -o default            -F _git_merge_base git-merge-base.exe
910 complete -o default            -F _git_name_rev git-name-rev.exe
911 complete -o default -o nospace -F _git_push git-push.exe
912 complete -o default            -F _git_config git-config
913 complete -o default -o nospace -F _git_show git-show.exe
914 complete -o default -o nospace -F _git_log git-show-branch.exe
915 complete -o default -o nospace -F _git_log git-whatchanged.exe
916 fi