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