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