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