38d61210a2f40fc6a7de8b543a68bdebe7e75ca7
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#
34
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}
51
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}
63
64__gitcomp ()
65{
66 local all c s=$'\n' IFS=' '$'\t'$'\n'
67 local cur="${COMP_WORDS[COMP_CWORD]}"
68 if [ -n "$2" ]; then
69 cur="$3"
70 fi
71 for c in $1; do
72 case "$c$4" in
73 --*=*) all="$all$c$4$s" ;;
74 *.) all="$all$c$4$s" ;;
75 *) all="$all$c$4 $s" ;;
76 esac
77 done
78 IFS=$s
79 COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
80 return
81}
82
83__git_heads ()
84{
85 local cmd i is_hash=y dir="$(__gitdir "$1")"
86 if [ -d "$dir" ]; then
87 for i in $(git --git-dir="$dir" \
88 for-each-ref --format='%(refname)' \
89 refs/heads ); do
90 echo "${i#refs/heads/}"
91 done
92 return
93 fi
94 for i in $(git-ls-remote "$1" 2>/dev/null); do
95 case "$is_hash,$i" in
96 y,*) is_hash=n ;;
97 n,*^{}) is_hash=y ;;
98 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
99 n,*) is_hash=y; echo "$i" ;;
100 esac
101 done
102}
103
104__git_refs ()
105{
106 local cmd i is_hash=y dir="$(__gitdir "$1")"
107 if [ -d "$dir" ]; then
108 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
109 for i in $(git --git-dir="$dir" \
110 for-each-ref --format='%(refname)' \
111 refs/tags refs/heads refs/remotes); do
112 case "$i" in
113 refs/tags/*) echo "${i#refs/tags/}" ;;
114 refs/heads/*) echo "${i#refs/heads/}" ;;
115 refs/remotes/*) echo "${i#refs/remotes/}" ;;
116 *) echo "$i" ;;
117 esac
118 done
119 return
120 fi
121 for i in $(git-ls-remote "$dir" 2>/dev/null); do
122 case "$is_hash,$i" in
123 y,*) is_hash=n ;;
124 n,*^{}) is_hash=y ;;
125 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
126 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
127 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
128 n,*) is_hash=y; echo "$i" ;;
129 esac
130 done
131}
132
133__git_refs2 ()
134{
135 local i
136 for i in $(__git_refs "$1"); do
137 echo "$i:$i"
138 done
139}
140
141__git_refs_remotes ()
142{
143 local cmd i is_hash=y
144 for i in $(git-ls-remote "$1" 2>/dev/null); do
145 case "$is_hash,$i" in
146 n,refs/heads/*)
147 is_hash=y
148 echo "$i:refs/remotes/$1/${i#refs/heads/}"
149 ;;
150 y,*) is_hash=n ;;
151 n,*^{}) is_hash=y ;;
152 n,refs/tags/*) is_hash=y;;
153 n,*) is_hash=y; ;;
154 esac
155 done
156}
157
158__git_remotes ()
159{
160 local i ngoff IFS=$'\n' d="$(__gitdir)"
161 shopt -q nullglob || ngoff=1
162 shopt -s nullglob
163 for i in "$d/remotes"/*; do
164 echo ${i#$d/remotes/}
165 done
166 [ "$ngoff" ] && shopt -u nullglob
167 for i in $(git --git-dir="$d" config --list); do
168 case "$i" in
169 remote.*.url=*)
170 i="${i#remote.}"
171 echo "${i/.url=*/}"
172 ;;
173 esac
174 done
175}
176
177__git_merge_strategies ()
178{
179 if [ -n "$__git_merge_strategylist" ]; then
180 echo "$__git_merge_strategylist"
181 return
182 fi
183 sed -n "/^all_strategies='/{
184 s/^all_strategies='//
185 s/'//
186 p
187 q
188 }" "$(git --exec-path)/git-merge"
189}
190__git_merge_strategylist=
191__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
192
193__git_complete_file ()
194{
195 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
196 case "$cur" in
197 ?*:*)
198 ref="${cur%%:*}"
199 cur="${cur#*:}"
200 case "$cur" in
201 ?*/*)
202 pfx="${cur%/*}"
203 cur="${cur##*/}"
204 ls="$ref:$pfx"
205 pfx="$pfx/"
206 ;;
207 *)
208 ls="$ref"
209 ;;
210 esac
211 COMPREPLY=($(compgen -P "$pfx" \
212 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
213 | sed '/^100... blob /s,^.* ,,
214 /^040000 tree /{
215 s,^.* ,,
216 s,$,/,
217 }
218 s/^.* //')" \
219 -- "$cur"))
220 ;;
221 *)
222 COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
223 ;;
224 esac
225}
226
227__git_complete_revlist ()
228{
229 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
230 case "$cur" in
231 *...*)
232 pfx="${cur%...*}..."
233 cur="${cur#*...}"
234 COMPREPLY=($(compgen -P "$pfx" -W "$(__git_refs)" -- "$cur"))
235 ;;
236 *..*)
237 pfx="${cur%..*}.."
238 cur="${cur#*..}"
239 COMPREPLY=($(compgen -P "$pfx" -W "$(__git_refs)" -- "$cur"))
240 ;;
241 *)
242 COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
243 ;;
244 esac
245}
246
247__git_commands ()
248{
249 if [ -n "$__git_commandlist" ]; then
250 echo "$__git_commandlist"
251 return
252 fi
253 local i IFS=" "$'\n'
254 for i in $(git help -a|egrep '^ ')
255 do
256 case $i in
257 add--interactive) : plumbing;;
258 applymbox) : ask gittus;;
259 applypatch) : ask gittus;;
260 archimport) : import;;
261 cat-file) : plumbing;;
262 check-ref-format) : plumbing;;
263 commit-tree) : plumbing;;
264 convert-objects) : plumbing;;
265 cvsexportcommit) : export;;
266 cvsimport) : import;;
267 cvsserver) : daemon;;
268 daemon) : daemon;;
269 fsck-objects) : plumbing;;
270 fetch-pack) : plumbing;;
271 fmt-merge-msg) : plumbing;;
272 hash-object) : plumbing;;
273 http-*) : transport;;
274 index-pack) : plumbing;;
275 init-db) : deprecated;;
276 local-fetch) : plumbing;;
277 mailinfo) : plumbing;;
278 mailsplit) : plumbing;;
279 merge-*) : plumbing;;
280 mktree) : plumbing;;
281 mktag) : plumbing;;
282 pack-objects) : plumbing;;
283 pack-redundant) : plumbing;;
284 pack-refs) : plumbing;;
285 parse-remote) : plumbing;;
286 patch-id) : plumbing;;
287 peek-remote) : plumbing;;
288 prune) : plumbing;;
289 prune-packed) : plumbing;;
290 quiltimport) : import;;
291 read-tree) : plumbing;;
292 receive-pack) : plumbing;;
293 reflog) : plumbing;;
294 repo-config) : plumbing;;
295 rerere) : plumbing;;
296 rev-list) : plumbing;;
297 rev-parse) : plumbing;;
298 runstatus) : plumbing;;
299 sh-setup) : internal;;
300 shell) : daemon;;
301 send-pack) : plumbing;;
302 show-index) : plumbing;;
303 ssh-*) : transport;;
304 stripspace) : plumbing;;
305 svn) : import export;;
306 svnimport) : import;;
307 symbolic-ref) : plumbing;;
308 tar-tree) : deprecated;;
309 unpack-file) : plumbing;;
310 unpack-objects) : plumbing;;
311 update-index) : plumbing;;
312 update-ref) : plumbing;;
313 update-server-info) : daemon;;
314 upload-archive) : plumbing;;
315 upload-pack) : plumbing;;
316 write-tree) : plumbing;;
317 verify-tag) : plumbing;;
318 *) echo $i;;
319 esac
320 done
321}
322__git_commandlist=
323__git_commandlist="$(__git_commands 2>/dev/null)"
324
325__git_aliases ()
326{
327 local i IFS=$'\n'
328 for i in $(git --git-dir="$(__gitdir)" config --list); do
329 case "$i" in
330 alias.*)
331 i="${i#alias.}"
332 echo "${i/=*/}"
333 ;;
334 esac
335 done
336}
337
338__git_aliased_command ()
339{
340 local word cmdline=$(git --git-dir="$(__gitdir)" \
341 config --get "alias.$1")
342 for word in $cmdline; do
343 if [ "${word##-*}" ]; then
344 echo $word
345 return
346 fi
347 done
348}
349
350__git_whitespacelist="nowarn warn error error-all strip"
351
352_git_am ()
353{
354 local cur="${COMP_WORDS[COMP_CWORD]}"
355 if [ -d .dotest ]; then
356 COMPREPLY=($(compgen -W "
357 --skip --resolved
358 " -- "$cur"))
359 return
360 fi
361 case "$cur" in
362 --whitespace=*)
363 COMPREPLY=($(compgen -W "$__git_whitespacelist" \
364 -- "${cur##--whitespace=}"))
365 return
366 ;;
367 --*)
368 COMPREPLY=($(compgen -W "
369 --signoff --utf8 --binary --3way --interactive
370 --whitespace=
371 " -- "$cur"))
372 return
373 esac
374 COMPREPLY=()
375}
376
377_git_apply ()
378{
379 local cur="${COMP_WORDS[COMP_CWORD]}"
380 case "$cur" in
381 --whitespace=*)
382 COMPREPLY=($(compgen -W "$__git_whitespacelist" \
383 -- "${cur##--whitespace=}"))
384 return
385 ;;
386 --*)
387 COMPREPLY=($(compgen -W "
388 --stat --numstat --summary --check --index
389 --cached --index-info --reverse --reject --unidiff-zero
390 --apply --no-add --exclude=
391 --whitespace= --inaccurate-eof --verbose
392 " -- "$cur"))
393 return
394 esac
395 COMPREPLY=()
396}
397
398_git_add ()
399{
400 local cur="${COMP_WORDS[COMP_CWORD]}"
401 case "$cur" in
402 --*)
403 COMPREPLY=($(compgen -W "
404 --interactive
405 " -- "$cur"))
406 return
407 esac
408 COMPREPLY=()
409}
410
411_git_branch ()
412{
413 local cur="${COMP_WORDS[COMP_CWORD]}"
414 COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
415}
416
417_git_checkout ()
418{
419 local cur="${COMP_WORDS[COMP_CWORD]}"
420 COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
421}
422
423_git_cherry_pick ()
424{
425 local cur="${COMP_WORDS[COMP_CWORD]}"
426 case "$cur" in
427 --*)
428 COMPREPLY=($(compgen -W "
429 --edit --no-commit
430 " -- "$cur"))
431 ;;
432 *)
433 COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
434 ;;
435 esac
436}
437
438_git_commit ()
439{
440 local cur="${COMP_WORDS[COMP_CWORD]}"
441 case "$cur" in
442 --*)
443 COMPREPLY=($(compgen -W "
444 --all --author= --signoff --verify --no-verify
445 --edit --amend --include --only
446 " -- "$cur"))
447 return
448 esac
449 COMPREPLY=()
450}
451
452_git_diff ()
453{
454 __git_complete_file
455}
456
457_git_diff_tree ()
458{
459 local cur="${COMP_WORDS[COMP_CWORD]}"
460 COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
461}
462
463_git_fetch ()
464{
465 local cur="${COMP_WORDS[COMP_CWORD]}"
466
467 case "${COMP_WORDS[0]},$COMP_CWORD" in
468 git-fetch*,1)
469 COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
470 ;;
471 git,2)
472 COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
473 ;;
474 *)
475 case "$cur" in
476 *:*)
477 cur="${cur#*:}"
478 COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
479 ;;
480 *)
481 local remote
482 case "${COMP_WORDS[0]}" in
483 git-fetch) remote="${COMP_WORDS[1]}" ;;
484 git) remote="${COMP_WORDS[2]}" ;;
485 esac
486 COMPREPLY=($(compgen -W "$(__git_refs2 "$remote")" -- "$cur"))
487 ;;
488 esac
489 ;;
490 esac
491}
492
493_git_format_patch ()
494{
495 local cur="${COMP_WORDS[COMP_CWORD]}"
496 case "$cur" in
497 --*)
498 COMPREPLY=($(compgen -W "
499 --stdout --attach --thread
500 --output-directory
501 --numbered --start-number
502 --keep-subject
503 --signoff
504 --in-reply-to=
505 --full-index --binary
506 " -- "$cur"))
507 return
508 ;;
509 esac
510 __git_complete_revlist
511}
512
513_git_ls_remote ()
514{
515 local cur="${COMP_WORDS[COMP_CWORD]}"
516 COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
517}
518
519_git_ls_tree ()
520{
521 __git_complete_file
522}
523
524_git_log ()
525{
526 local cur="${COMP_WORDS[COMP_CWORD]}"
527 case "$cur" in
528 --pretty=*)
529 COMPREPLY=($(compgen -W "
530 oneline short medium full fuller email raw
531 " -- "${cur##--pretty=}"))
532 return
533 ;;
534 --*)
535 COMPREPLY=($(compgen -W "
536 --max-count= --max-age= --since= --after=
537 --min-age= --before= --until=
538 --root --not --topo-order --date-order
539 --no-merges
540 --abbrev-commit --abbrev=
541 --relative-date
542 --author= --committer= --grep=
543 --all-match
544 --pretty= --name-status --name-only
545 " -- "$cur"))
546 return
547 ;;
548 esac
549 __git_complete_revlist
550}
551
552_git_merge ()
553{
554 local cur="${COMP_WORDS[COMP_CWORD]}"
555 case "${COMP_WORDS[COMP_CWORD-1]}" in
556 -s|--strategy)
557 COMPREPLY=($(compgen -W "$(__git_merge_strategies)" -- "$cur"))
558 return
559 esac
560 case "$cur" in
561 --strategy=*)
562 COMPREPLY=($(compgen -W "$(__git_merge_strategies)" \
563 -- "${cur##--strategy=}"))
564 return
565 ;;
566 --*)
567 COMPREPLY=($(compgen -W "
568 --no-commit --no-summary --squash --strategy
569 " -- "$cur"))
570 return
571 esac
572 COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
573}
574
575_git_merge_base ()
576{
577 local cur="${COMP_WORDS[COMP_CWORD]}"
578 COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
579}
580
581_git_name_rev ()
582{
583 local cur="${COMP_WORDS[COMP_CWORD]}"
584 COMPREPLY=($(compgen -W "--tags --all --stdin" -- "$cur"))
585}
586
587_git_pull ()
588{
589 local cur="${COMP_WORDS[COMP_CWORD]}"
590
591 case "${COMP_WORDS[0]},$COMP_CWORD" in
592 git-pull*,1)
593 COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
594 ;;
595 git,2)
596 COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
597 ;;
598 *)
599 local remote
600 case "${COMP_WORDS[0]}" in
601 git-pull) remote="${COMP_WORDS[1]}" ;;
602 git) remote="${COMP_WORDS[2]}" ;;
603 esac
604 COMPREPLY=($(compgen -W "$(__git_refs "$remote")" -- "$cur"))
605 ;;
606 esac
607}
608
609_git_push ()
610{
611 local cur="${COMP_WORDS[COMP_CWORD]}"
612
613 case "${COMP_WORDS[0]},$COMP_CWORD" in
614 git-push*,1)
615 COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
616 ;;
617 git,2)
618 COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
619 ;;
620 *)
621 case "$cur" in
622 *:*)
623 local remote
624 case "${COMP_WORDS[0]}" in
625 git-push) remote="${COMP_WORDS[1]}" ;;
626 git) remote="${COMP_WORDS[2]}" ;;
627 esac
628 cur="${cur#*:}"
629 COMPREPLY=($(compgen -W "$(__git_refs "$remote")" -- "$cur"))
630 ;;
631 *)
632 COMPREPLY=($(compgen -W "$(__git_refs2)" -- "$cur"))
633 ;;
634 esac
635 ;;
636 esac
637}
638
639_git_rebase ()
640{
641 local cur="${COMP_WORDS[COMP_CWORD]}"
642 if [ -d .dotest ]; then
643 COMPREPLY=($(compgen -W "
644 --continue --skip --abort
645 " -- "$cur"))
646 return
647 fi
648 case "${COMP_WORDS[COMP_CWORD-1]}" in
649 -s|--strategy)
650 COMPREPLY=($(compgen -W "$(__git_merge_strategies)" -- "$cur"))
651 return
652 esac
653 case "$cur" in
654 --strategy=*)
655 COMPREPLY=($(compgen -W "$(__git_merge_strategies)" \
656 -- "${cur##--strategy=}"))
657 return
658 ;;
659 --*)
660 COMPREPLY=($(compgen -W "
661 --onto --merge --strategy
662 " -- "$cur"))
663 return
664 esac
665 COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
666}
667
668_git_config ()
669{
670 local cur="${COMP_WORDS[COMP_CWORD]}"
671 local prv="${COMP_WORDS[COMP_CWORD-1]}"
672 case "$prv" in
673 branch.*.remote)
674 __gitcomp "$(__git_remotes)"
675 return
676 ;;
677 branch.*.merge)
678 __gitcomp "$(__git_refs)"
679 return
680 ;;
681 remote.*.fetch)
682 local remote="${prv#remote.}"
683 remote="${remote%.fetch}"
684 __gitcomp "$(__git_refs_remotes "$remote")"
685 return
686 ;;
687 remote.*.push)
688 local remote="${prv#remote.}"
689 remote="${remote%.push}"
690 __gitcomp "$(git --git-dir="$(__gitdir)" \
691 for-each-ref --format='%(refname):%(refname)' \
692 refs/heads)"
693 return
694 ;;
695 pull.twohead|pull.octopus)
696 __gitcomp "$(__git_merge_strategies)"
697 return
698 ;;
699 color.branch|color.diff|color.status)
700 __gitcomp "always never auto"
701 return
702 ;;
703 color.*.*)
704 __gitcomp "
705 black red green yellow blue magenta cyan white
706 bold dim ul blink reverse
707 "
708 return
709 ;;
710 *.*)
711 COMPREPLY=()
712 return
713 ;;
714 esac
715 case "$cur" in
716 --*)
717 __gitcomp "
718 --global --list --replace-all
719 --get --get-all --get-regexp
720 --unset --unset-all
721 "
722 return
723 ;;
724 branch.*.*)
725 local pfx="${cur%.*}."
726 cur="${cur##*.}"
727 __gitcomp "remote merge" "$pfx" "$cur"
728 return
729 ;;
730 branch.*)
731 local pfx="${cur%.*}."
732 cur="${cur#*.}"
733 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
734 return
735 ;;
736 remote.*.*)
737 local pfx="${cur%.*}."
738 cur="${cur##*.}"
739 __gitcomp "url fetch push" "$pfx" "$cur"
740 return
741 ;;
742 remote.*)
743 local pfx="${cur%.*}."
744 cur="${cur#*.}"
745 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
746 return
747 ;;
748 esac
749 __gitcomp "
750 apply.whitespace
751 core.fileMode
752 core.gitProxy
753 core.ignoreStat
754 core.preferSymlinkRefs
755 core.logAllRefUpdates
756 core.repositoryFormatVersion
757 core.sharedRepository
758 core.warnAmbiguousRefs
759 core.compression
760 core.legacyHeaders
761 core.packedGitWindowSize
762 core.packedGitLimit
763 color.branch
764 color.branch.current
765 color.branch.local
766 color.branch.remote
767 color.branch.plain
768 color.diff
769 color.diff.plain
770 color.diff.meta
771 color.diff.frag
772 color.diff.old
773 color.diff.new
774 color.diff.commit
775 color.diff.whitespace
776 color.pager
777 color.status
778 color.status.header
779 color.status.added
780 color.status.changed
781 color.status.untracked
782 diff.renameLimit
783 diff.renames
784 fetch.unpackLimit
785 format.headers
786 gitcvs.enabled
787 gitcvs.logfile
788 gc.reflogexpire
789 gc.reflogexpireunreachable
790 gc.rerereresolved
791 gc.rerereunresolved
792 http.sslVerify
793 http.sslCert
794 http.sslKey
795 http.sslCAInfo
796 http.sslCAPath
797 http.maxRequests
798 http.lowSpeedLimit
799 http.lowSpeedTime
800 http.noEPSV
801 i18n.commitEncoding
802 i18n.logOutputEncoding
803 log.showroot
804 merge.summary
805 merge.verbosity
806 pack.window
807 pull.octopus
808 pull.twohead
809 repack.useDeltaBaseOffset
810 show.difftree
811 showbranch.default
812 tar.umask
813 transfer.unpackLimit
814 receive.unpackLimit
815 receive.denyNonFastForwards
816 user.name
817 user.email
818 user.signingkey
819 whatchanged.difftree
820 branch. remote.
821 "
822}
823
824_git_reset ()
825{
826 local cur="${COMP_WORDS[COMP_CWORD]}"
827 local opt="--mixed --hard --soft"
828 COMPREPLY=($(compgen -W "$opt $(__git_refs)" -- "$cur"))
829}
830
831_git_show ()
832{
833 local cur="${COMP_WORDS[COMP_CWORD]}"
834 case "$cur" in
835 --pretty=*)
836 COMPREPLY=($(compgen -W "
837 oneline short medium full fuller email raw
838 " -- "${cur##--pretty=}"))
839 return
840 ;;
841 --*)
842 COMPREPLY=($(compgen -W "--pretty=" -- "$cur"))
843 return
844 ;;
845 esac
846 __git_complete_file
847}
848
849_git ()
850{
851 local i c=1 command __git_dir
852
853 while [ $c -lt $COMP_CWORD ]; do
854 i="${COMP_WORDS[c]}"
855 case "$i" in
856 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
857 --bare) __git_dir="." ;;
858 --version|--help|-p|--paginate) ;;
859 *) command="$i"; break ;;
860 esac
861 c=$((++c))
862 done
863
864 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
865 case "${COMP_WORDS[COMP_CWORD]}" in
866 --*=*) COMPREPLY=() ;;
867 --*) __gitcomp "--git-dir= --bare --version --exec-path" ;;
868 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
869 esac
870 return
871 fi
872
873 local expansion=$(__git_aliased_command "$command")
874 [ "$expansion" ] && command="$expansion"
875
876 case "$command" in
877 am) _git_am ;;
878 add) _git_add ;;
879 apply) _git_apply ;;
880 branch) _git_branch ;;
881 checkout) _git_checkout ;;
882 cherry-pick) _git_cherry_pick ;;
883 commit) _git_commit ;;
884 config) _git_config ;;
885 diff) _git_diff ;;
886 diff-tree) _git_diff_tree ;;
887 fetch) _git_fetch ;;
888 format-patch) _git_format_patch ;;
889 log) _git_log ;;
890 ls-remote) _git_ls_remote ;;
891 ls-tree) _git_ls_tree ;;
892 merge) _git_merge;;
893 merge-base) _git_merge_base ;;
894 name-rev) _git_name_rev ;;
895 pull) _git_pull ;;
896 push) _git_push ;;
897 rebase) _git_rebase ;;
898 reset) _git_reset ;;
899 show) _git_show ;;
900 show-branch) _git_log ;;
901 whatchanged) _git_log ;;
902 *) COMPREPLY=() ;;
903 esac
904}
905
906_gitk ()
907{
908 local cur="${COMP_WORDS[COMP_CWORD]}"
909 COMPREPLY=($(compgen -W "--all $(__git_refs)" -- "$cur"))
910}
911
912complete -o default -o nospace -F _git git
913complete -o default -F _gitk gitk
914complete -o default -F _git_am git-am
915complete -o default -F _git_apply git-apply
916complete -o default -F _git_branch git-branch
917complete -o default -F _git_checkout git-checkout
918complete -o default -F _git_cherry_pick git-cherry-pick
919complete -o default -F _git_commit git-commit
920complete -o default -o nospace -F _git_diff git-diff
921complete -o default -F _git_diff_tree git-diff-tree
922complete -o default -o nospace -F _git_fetch git-fetch
923complete -o default -o nospace -F _git_format_patch git-format-patch
924complete -o default -o nospace -F _git_log git-log
925complete -o default -F _git_ls_remote git-ls-remote
926complete -o default -o nospace -F _git_ls_tree git-ls-tree
927complete -o default -F _git_merge git-merge
928complete -o default -F _git_merge_base git-merge-base
929complete -o default -F _git_name_rev git-name-rev
930complete -o default -o nospace -F _git_pull git-pull
931complete -o default -o nospace -F _git_push git-push
932complete -o default -F _git_rebase git-rebase
933complete -o default -F _git_config git-config
934complete -o default -F _git_reset git-reset
935complete -o default -o nospace -F _git_show git-show
936complete -o default -o nospace -F _git_log git-show-branch
937complete -o default -o nospace -F _git_log git-whatchanged
938
939# The following are necessary only for Cygwin, and only are needed
940# when the user has tab-completed the executable name and consequently
941# included the '.exe' suffix.
942#
943if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
944complete -o default -F _git_add git-add.exe
945complete -o default -F _git_apply git-apply.exe
946complete -o default -o nospace -F _git git.exe
947complete -o default -F _git_branch git-branch.exe
948complete -o default -o nospace -F _git_diff git-diff.exe
949complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
950complete -o default -o nospace -F _git_format_patch git-format-patch.exe
951complete -o default -o nospace -F _git_log git-log.exe
952complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
953complete -o default -F _git_merge_base git-merge-base.exe
954complete -o default -F _git_name_rev git-name-rev.exe
955complete -o default -o nospace -F _git_push git-push.exe
956complete -o default -F _git_config git-config
957complete -o default -o nospace -F _git_show git-show.exe
958complete -o default -o nospace -F _git_log git-show-branch.exe
959complete -o default -o nospace -F _git_log git-whatchanged.exe
960fi