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_ls_remote ()
512{
513 __gitcomp "$(__git_remotes)"
514}
515
516_git_ls_tree ()
517{
518 __git_complete_file
519}
520
521_git_log ()
522{
523 local cur="${COMP_WORDS[COMP_CWORD]}"
524 case "$cur" in
525 --pretty=*)
526 __gitcomp "
527 oneline short medium full fuller email raw
528 " "" "${cur##--pretty=}"
529 return
530 ;;
531 --*)
532 __gitcomp "
533 --max-count= --max-age= --since= --after=
534 --min-age= --before= --until=
535 --root --not --topo-order --date-order
536 --no-merges
537 --abbrev-commit --abbrev=
538 --relative-date
539 --author= --committer= --grep=
540 --all-match
541 --pretty= --name-status --name-only
542 --not --all
543 "
544 return
545 ;;
546 esac
547 __git_complete_revlist
548}
549
550_git_merge ()
551{
552 local cur="${COMP_WORDS[COMP_CWORD]}"
553 case "${COMP_WORDS[COMP_CWORD-1]}" in
554 -s|--strategy)
555 __gitcomp "$(__git_merge_strategies)"
556 return
557 esac
558 case "$cur" in
559 --strategy=*)
560 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
561 return
562 ;;
563 --*)
564 __gitcomp "
565 --no-commit --no-summary --squash --strategy
566 "
567 return
568 esac
569 __gitcomp "$(__git_refs)"
570}
571
572_git_merge_base ()
573{
574 __gitcomp "$(__git_refs)"
575}
576
577_git_name_rev ()
578{
579 __gitcomp "--tags --all --stdin"
580}
581
582_git_pull ()
583{
584 local cur="${COMP_WORDS[COMP_CWORD]}"
585
586 case "${COMP_WORDS[0]},$COMP_CWORD" in
587 git-pull*,1)
588 __gitcomp "$(__git_remotes)"
589 ;;
590 git,2)
591 __gitcomp "$(__git_remotes)"
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 __gitcomp "$(__git_refs "$remote")"
600 ;;
601 esac
602}
603
604_git_push ()
605{
606 local cur="${COMP_WORDS[COMP_CWORD]}"
607
608 case "${COMP_WORDS[0]},$COMP_CWORD" in
609 git-push*,1)
610 __gitcomp "$(__git_remotes)"
611 ;;
612 git,2)
613 __gitcomp "$(__git_remotes)"
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 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
624 ;;
625 *)
626 __gitcomp "$(__git_refs2)"
627 ;;
628 esac
629 ;;
630 esac
631}
632
633_git_rebase ()
634{
635 local cur="${COMP_WORDS[COMP_CWORD]}"
636 if [ -d .dotest ]; then
637 __gitcomp "--continue --skip --abort"
638 return
639 fi
640 case "${COMP_WORDS[COMP_CWORD-1]}" in
641 -s|--strategy)
642 __gitcomp "$(__git_merge_strategies)"
643 return
644 esac
645 case "$cur" in
646 --strategy=*)
647 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
648 return
649 ;;
650 --*)
651 __gitcomp "--onto --merge --strategy"
652 return
653 esac
654 __gitcomp "$(__git_refs)"
655}
656
657_git_config ()
658{
659 local cur="${COMP_WORDS[COMP_CWORD]}"
660 local prv="${COMP_WORDS[COMP_CWORD-1]}"
661 case "$prv" in
662 branch.*.remote)
663 __gitcomp "$(__git_remotes)"
664 return
665 ;;
666 branch.*.merge)
667 __gitcomp "$(__git_refs)"
668 return
669 ;;
670 remote.*.fetch)
671 local remote="${prv#remote.}"
672 remote="${remote%.fetch}"
673 __gitcomp "$(__git_refs_remotes "$remote")"
674 return
675 ;;
676 remote.*.push)
677 local remote="${prv#remote.}"
678 remote="${remote%.push}"
679 __gitcomp "$(git --git-dir="$(__gitdir)" \
680 for-each-ref --format='%(refname):%(refname)' \
681 refs/heads)"
682 return
683 ;;
684 pull.twohead|pull.octopus)
685 __gitcomp "$(__git_merge_strategies)"
686 return
687 ;;
688 color.branch|color.diff|color.status)
689 __gitcomp "always never auto"
690 return
691 ;;
692 color.*.*)
693 __gitcomp "
694 black red green yellow blue magenta cyan white
695 bold dim ul blink reverse
696 "
697 return
698 ;;
699 *.*)
700 COMPREPLY=()
701 return
702 ;;
703 esac
704 case "$cur" in
705 --*)
706 __gitcomp "
707 --global --list --replace-all
708 --get --get-all --get-regexp
709 --unset --unset-all
710 "
711 return
712 ;;
713 branch.*.*)
714 local pfx="${cur%.*}."
715 cur="${cur##*.}"
716 __gitcomp "remote merge" "$pfx" "$cur"
717 return
718 ;;
719 branch.*)
720 local pfx="${cur%.*}."
721 cur="${cur#*.}"
722 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
723 return
724 ;;
725 remote.*.*)
726 local pfx="${cur%.*}."
727 cur="${cur##*.}"
728 __gitcomp "url fetch push" "$pfx" "$cur"
729 return
730 ;;
731 remote.*)
732 local pfx="${cur%.*}."
733 cur="${cur#*.}"
734 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
735 return
736 ;;
737 esac
738 __gitcomp "
739 apply.whitespace
740 core.fileMode
741 core.gitProxy
742 core.ignoreStat
743 core.preferSymlinkRefs
744 core.logAllRefUpdates
745 core.repositoryFormatVersion
746 core.sharedRepository
747 core.warnAmbiguousRefs
748 core.compression
749 core.legacyHeaders
750 core.packedGitWindowSize
751 core.packedGitLimit
752 color.branch
753 color.branch.current
754 color.branch.local
755 color.branch.remote
756 color.branch.plain
757 color.diff
758 color.diff.plain
759 color.diff.meta
760 color.diff.frag
761 color.diff.old
762 color.diff.new
763 color.diff.commit
764 color.diff.whitespace
765 color.pager
766 color.status
767 color.status.header
768 color.status.added
769 color.status.changed
770 color.status.untracked
771 diff.renameLimit
772 diff.renames
773 fetch.unpackLimit
774 format.headers
775 gitcvs.enabled
776 gitcvs.logfile
777 gc.reflogexpire
778 gc.reflogexpireunreachable
779 gc.rerereresolved
780 gc.rerereunresolved
781 http.sslVerify
782 http.sslCert
783 http.sslKey
784 http.sslCAInfo
785 http.sslCAPath
786 http.maxRequests
787 http.lowSpeedLimit
788 http.lowSpeedTime
789 http.noEPSV
790 i18n.commitEncoding
791 i18n.logOutputEncoding
792 log.showroot
793 merge.summary
794 merge.verbosity
795 pack.window
796 pull.octopus
797 pull.twohead
798 repack.useDeltaBaseOffset
799 show.difftree
800 showbranch.default
801 tar.umask
802 transfer.unpackLimit
803 receive.unpackLimit
804 receive.denyNonFastForwards
805 user.name
806 user.email
807 user.signingkey
808 whatchanged.difftree
809 branch. remote.
810 "
811}
812
813_git_reset ()
814{
815 local cur="${COMP_WORDS[COMP_CWORD]}"
816 case "$cur" in
817 --*)
818 __gitcomp "--mixed --hard --soft"
819 return
820 ;;
821 esac
822 __gitcomp "$(__git_refs)"
823}
824
825_git_show ()
826{
827 local cur="${COMP_WORDS[COMP_CWORD]}"
828 case "$cur" in
829 --pretty=*)
830 __gitcomp "
831 oneline short medium full fuller email raw
832 " "" "${cur##--pretty=}"
833 return
834 ;;
835 --*)
836 __gitcomp "--pretty="
837 return
838 ;;
839 esac
840 __git_complete_file
841}
842
843_git ()
844{
845 local i c=1 command __git_dir
846
847 while [ $c -lt $COMP_CWORD ]; do
848 i="${COMP_WORDS[c]}"
849 case "$i" in
850 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
851 --bare) __git_dir="." ;;
852 --version|--help|-p|--paginate) ;;
853 *) command="$i"; break ;;
854 esac
855 c=$((++c))
856 done
857
858 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
859 case "${COMP_WORDS[COMP_CWORD]}" in
860 --*=*) COMPREPLY=() ;;
861 --*) __gitcomp "--git-dir= --bare --version --exec-path" ;;
862 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
863 esac
864 return
865 fi
866
867 local expansion=$(__git_aliased_command "$command")
868 [ "$expansion" ] && command="$expansion"
869
870 case "$command" in
871 am) _git_am ;;
872 add) _git_add ;;
873 apply) _git_apply ;;
874 branch) _git_branch ;;
875 checkout) _git_checkout ;;
876 cherry) _git_cherry ;;
877 cherry-pick) _git_cherry_pick ;;
878 commit) _git_commit ;;
879 config) _git_config ;;
880 diff) _git_diff ;;
881 diff-tree) _git_diff_tree ;;
882 fetch) _git_fetch ;;
883 format-patch) _git_format_patch ;;
884 log) _git_log ;;
885 ls-remote) _git_ls_remote ;;
886 ls-tree) _git_ls_tree ;;
887 merge) _git_merge;;
888 merge-base) _git_merge_base ;;
889 name-rev) _git_name_rev ;;
890 pull) _git_pull ;;
891 push) _git_push ;;
892 rebase) _git_rebase ;;
893 reset) _git_reset ;;
894 show) _git_show ;;
895 show-branch) _git_log ;;
896 whatchanged) _git_log ;;
897 *) COMPREPLY=() ;;
898 esac
899}
900
901_gitk ()
902{
903 local cur="${COMP_WORDS[COMP_CWORD]}"
904 case "$cur" in
905 --*)
906 __gitcomp "--not --all"
907 return
908 ;;
909 esac
910 __git_complete_revlist
911}
912
913complete -o default -o nospace -F _git git
914complete -o default -o nospace -F _gitk gitk
915complete -o default -o nospace -F _git_am git-am
916complete -o default -o nospace -F _git_apply git-apply
917complete -o default -o nospace -F _git_branch git-branch
918complete -o default -o nospace -F _git_checkout git-checkout
919complete -o default -o nospace -F _git_cherry git-cherry
920complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
921complete -o default -o nospace -F _git_commit git-commit
922complete -o default -o nospace -F _git_diff git-diff
923complete -o default -o nospace -F _git_diff_tree git-diff-tree
924complete -o default -o nospace -F _git_fetch git-fetch
925complete -o default -o nospace -F _git_format_patch git-format-patch
926complete -o default -o nospace -F _git_log git-log
927complete -o default -o nospace -F _git_ls_remote git-ls-remote
928complete -o default -o nospace -F _git_ls_tree git-ls-tree
929complete -o default -o nospace -F _git_merge git-merge
930complete -o default -o nospace -F _git_merge_base git-merge-base
931complete -o default -o nospace -F _git_name_rev git-name-rev
932complete -o default -o nospace -F _git_pull git-pull
933complete -o default -o nospace -F _git_push git-push
934complete -o default -o nospace -F _git_rebase git-rebase
935complete -o default -o nospace -F _git_config git-config
936complete -o default -o nospace -F _git_reset git-reset
937complete -o default -o nospace -F _git_show git-show
938complete -o default -o nospace -F _git_log git-show-branch
939complete -o default -o nospace -F _git_log git-whatchanged
940
941# The following are necessary only for Cygwin, and only are needed
942# when the user has tab-completed the executable name and consequently
943# included the '.exe' suffix.
944#
945if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
946complete -o default -o nospace -F _git_add git-add.exe
947complete -o default -o nospace -F _git_apply git-apply.exe
948complete -o default -o nospace -F _git git.exe
949complete -o default -o nospace -F _git_branch git-branch.exe
950complete -o default -o nospace -F _git_cherry git-cherry.exe
951complete -o default -o nospace -F _git_diff git-diff.exe
952complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
953complete -o default -o nospace -F _git_format_patch git-format-patch.exe
954complete -o default -o nospace -F _git_log git-log.exe
955complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
956complete -o default -o nospace -F _git_merge_base git-merge-base.exe
957complete -o default -o nospace -F _git_name_rev git-name-rev.exe
958complete -o default -o nospace -F _git_push git-push.exe
959complete -o default -o nospace -F _git_config git-config
960complete -o default -o nospace -F _git_show git-show.exe
961complete -o default -o nospace -F _git_log git-show-branch.exe
962complete -o default -o nospace -F _git_log git-whatchanged.exe
963fi