1#
2# bash completion support for core Git.
3#
4# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
5# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
6# Distributed under the GNU General Public License, version 2.0.
7#
8# The contained completion routines provide support for completing:
9#
10# *) local and remote branch names
11# *) local and remote tag names
12# *) .git/remotes file names
13# *) git 'subcommands'
14# *) tree paths within 'ref:path/to/file' expressions
15# *) common --long-options
16#
17# To use these routines:
18#
19# 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
20# 2) Added the following line to your .bashrc:
21# source ~/.git-completion.sh
22#
23# 3) You may want to make sure the git executable is available
24# in your PATH before this script is sourced, as some caching
25# is performed while the script loads. If git isn't found
26# at source time then all lookups will be done on demand,
27# which may be slightly slower.
28#
29# 4) Consider changing your PS1 to also show the current branch:
30# PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
31#
32# The argument to __git_ps1 will be displayed only if you
33# are currently in a git repository. The %s token will be
34# the name of the current branch.
35#
36# To submit patches:
37#
38# *) Read Documentation/SubmittingPatches
39# *) Send all patches to the current maintainer:
40#
41# "Shawn O. Pearce" <spearce@spearce.org>
42#
43# *) Always CC the Git mailing list:
44#
45# git@vger.kernel.org
46#
47
48__gitdir ()
49{
50 if [ -z "$1" ]; then
51 if [ -n "$__git_dir" ]; then
52 echo "$__git_dir"
53 elif [ -d .git ]; then
54 echo .git
55 else
56 git rev-parse --git-dir 2>/dev/null
57 fi
58 elif [ -d "$1/.git" ]; then
59 echo "$1/.git"
60 else
61 echo "$1"
62 fi
63}
64
65__git_ps1 ()
66{
67 local b="$(git symbolic-ref HEAD 2>/dev/null)"
68 if [ -n "$b" ]; then
69 if [ -n "$1" ]; then
70 printf "$1" "${b##refs/heads/}"
71 else
72 printf " (%s)" "${b##refs/heads/}"
73 fi
74 fi
75}
76
77__gitcomp ()
78{
79 local all c s=$'\n' IFS=' '$'\t'$'\n'
80 local cur="${COMP_WORDS[COMP_CWORD]}"
81 if [ $# -gt 2 ]; then
82 cur="$3"
83 fi
84 for c in $1; do
85 case "$c$4" in
86 --*=*) all="$all$c$4$s" ;;
87 *.) all="$all$c$4$s" ;;
88 *) all="$all$c$4 $s" ;;
89 esac
90 done
91 IFS=$s
92 COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
93 return
94}
95
96__git_heads ()
97{
98 local cmd i is_hash=y dir="$(__gitdir "$1")"
99 if [ -d "$dir" ]; then
100 for i in $(git --git-dir="$dir" \
101 for-each-ref --format='%(refname)' \
102 refs/heads ); do
103 echo "${i#refs/heads/}"
104 done
105 return
106 fi
107 for i in $(git-ls-remote "$1" 2>/dev/null); do
108 case "$is_hash,$i" in
109 y,*) is_hash=n ;;
110 n,*^{}) is_hash=y ;;
111 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
112 n,*) is_hash=y; echo "$i" ;;
113 esac
114 done
115}
116
117__git_refs ()
118{
119 local cmd i is_hash=y dir="$(__gitdir "$1")"
120 if [ -d "$dir" ]; then
121 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
122 for i in $(git --git-dir="$dir" \
123 for-each-ref --format='%(refname)' \
124 refs/tags refs/heads refs/remotes); do
125 case "$i" in
126 refs/tags/*) echo "${i#refs/tags/}" ;;
127 refs/heads/*) echo "${i#refs/heads/}" ;;
128 refs/remotes/*) echo "${i#refs/remotes/}" ;;
129 *) echo "$i" ;;
130 esac
131 done
132 return
133 fi
134 for i in $(git-ls-remote "$dir" 2>/dev/null); do
135 case "$is_hash,$i" in
136 y,*) is_hash=n ;;
137 n,*^{}) is_hash=y ;;
138 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
139 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
140 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
141 n,*) is_hash=y; echo "$i" ;;
142 esac
143 done
144}
145
146__git_refs2 ()
147{
148 local i
149 for i in $(__git_refs "$1"); do
150 echo "$i:$i"
151 done
152}
153
154__git_refs_remotes ()
155{
156 local cmd i is_hash=y
157 for i in $(git-ls-remote "$1" 2>/dev/null); do
158 case "$is_hash,$i" in
159 n,refs/heads/*)
160 is_hash=y
161 echo "$i:refs/remotes/$1/${i#refs/heads/}"
162 ;;
163 y,*) is_hash=n ;;
164 n,*^{}) is_hash=y ;;
165 n,refs/tags/*) is_hash=y;;
166 n,*) is_hash=y; ;;
167 esac
168 done
169}
170
171__git_remotes ()
172{
173 local i ngoff IFS=$'\n' d="$(__gitdir)"
174 shopt -q nullglob || ngoff=1
175 shopt -s nullglob
176 for i in "$d/remotes"/*; do
177 echo ${i#$d/remotes/}
178 done
179 [ "$ngoff" ] && shopt -u nullglob
180 for i in $(git --git-dir="$d" config --list); do
181 case "$i" in
182 remote.*.url=*)
183 i="${i#remote.}"
184 echo "${i/.url=*/}"
185 ;;
186 esac
187 done
188}
189
190__git_merge_strategies ()
191{
192 if [ -n "$__git_merge_strategylist" ]; then
193 echo "$__git_merge_strategylist"
194 return
195 fi
196 sed -n "/^all_strategies='/{
197 s/^all_strategies='//
198 s/'//
199 p
200 q
201 }" "$(git --exec-path)/git-merge"
202}
203__git_merge_strategylist=
204__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
205
206__git_complete_file ()
207{
208 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
209 case "$cur" in
210 ?*:*)
211 ref="${cur%%:*}"
212 cur="${cur#*:}"
213 case "$cur" in
214 ?*/*)
215 pfx="${cur%/*}"
216 cur="${cur##*/}"
217 ls="$ref:$pfx"
218 pfx="$pfx/"
219 ;;
220 *)
221 ls="$ref"
222 ;;
223 esac
224 COMPREPLY=($(compgen -P "$pfx" \
225 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
226 | sed '/^100... blob /s,^.* ,,
227 /^040000 tree /{
228 s,^.* ,,
229 s,$,/,
230 }
231 s/^.* //')" \
232 -- "$cur"))
233 ;;
234 *)
235 __gitcomp "$(__git_refs)"
236 ;;
237 esac
238}
239
240__git_complete_revlist ()
241{
242 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
243 case "$cur" in
244 *...*)
245 pfx="${cur%...*}..."
246 cur="${cur#*...}"
247 __gitcomp "$(__git_refs)" "$pfx" "$cur"
248 ;;
249 *..*)
250 pfx="${cur%..*}.."
251 cur="${cur#*..}"
252 __gitcomp "$(__git_refs)" "$pfx" "$cur"
253 ;;
254 *.)
255 __gitcomp "$cur."
256 ;;
257 *)
258 __gitcomp "$(__git_refs)"
259 ;;
260 esac
261}
262
263__git_commands ()
264{
265 if [ -n "$__git_commandlist" ]; then
266 echo "$__git_commandlist"
267 return
268 fi
269 local i IFS=" "$'\n'
270 for i in $(git help -a|egrep '^ ')
271 do
272 case $i in
273 add--interactive) : plumbing;;
274 applymbox) : ask gittus;;
275 applypatch) : ask gittus;;
276 archimport) : import;;
277 cat-file) : plumbing;;
278 check-attr) : plumbing;;
279 check-ref-format) : plumbing;;
280 commit-tree) : plumbing;;
281 convert-objects) : plumbing;;
282 cvsexportcommit) : export;;
283 cvsimport) : import;;
284 cvsserver) : daemon;;
285 daemon) : daemon;;
286 diff-files) : plumbing;;
287 diff-index) : plumbing;;
288 diff-tree) : plumbing;;
289 fast-import) : import;;
290 fsck-objects) : plumbing;;
291 fetch--tool) : plumbing;;
292 fetch-pack) : plumbing;;
293 fmt-merge-msg) : plumbing;;
294 for-each-ref) : plumbing;;
295 hash-object) : plumbing;;
296 http-*) : transport;;
297 index-pack) : plumbing;;
298 init-db) : deprecated;;
299 local-fetch) : plumbing;;
300 mailinfo) : plumbing;;
301 mailsplit) : plumbing;;
302 merge-*) : plumbing;;
303 mktree) : plumbing;;
304 mktag) : plumbing;;
305 pack-objects) : plumbing;;
306 pack-redundant) : plumbing;;
307 pack-refs) : plumbing;;
308 parse-remote) : plumbing;;
309 patch-id) : plumbing;;
310 peek-remote) : plumbing;;
311 prune) : plumbing;;
312 prune-packed) : plumbing;;
313 quiltimport) : import;;
314 read-tree) : plumbing;;
315 receive-pack) : plumbing;;
316 reflog) : plumbing;;
317 repo-config) : plumbing;;
318 rerere) : plumbing;;
319 rev-list) : plumbing;;
320 rev-parse) : plumbing;;
321 runstatus) : plumbing;;
322 sh-setup) : internal;;
323 shell) : daemon;;
324 send-pack) : plumbing;;
325 show-index) : plumbing;;
326 ssh-*) : transport;;
327 stripspace) : plumbing;;
328 svn) : import export;;
329 svnimport) : import;;
330 symbolic-ref) : plumbing;;
331 tar-tree) : deprecated;;
332 unpack-file) : plumbing;;
333 unpack-objects) : plumbing;;
334 update-index) : plumbing;;
335 update-ref) : plumbing;;
336 update-server-info) : daemon;;
337 upload-archive) : plumbing;;
338 upload-pack) : plumbing;;
339 write-tree) : plumbing;;
340 verify-tag) : plumbing;;
341 *) echo $i;;
342 esac
343 done
344}
345__git_commandlist=
346__git_commandlist="$(__git_commands 2>/dev/null)"
347
348__git_aliases ()
349{
350 local i IFS=$'\n'
351 for i in $(git --git-dir="$(__gitdir)" config --list); do
352 case "$i" in
353 alias.*)
354 i="${i#alias.}"
355 echo "${i/=*/}"
356 ;;
357 esac
358 done
359}
360
361__git_aliased_command ()
362{
363 local word cmdline=$(git --git-dir="$(__gitdir)" \
364 config --get "alias.$1")
365 for word in $cmdline; do
366 if [ "${word##-*}" ]; then
367 echo $word
368 return
369 fi
370 done
371}
372
373__git_whitespacelist="nowarn warn error error-all strip"
374
375_git_am ()
376{
377 local cur="${COMP_WORDS[COMP_CWORD]}"
378 if [ -d .dotest ]; then
379 __gitcomp "--skip --resolved"
380 return
381 fi
382 case "$cur" in
383 --whitespace=*)
384 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
385 return
386 ;;
387 --*)
388 __gitcomp "
389 --signoff --utf8 --binary --3way --interactive
390 --whitespace=
391 "
392 return
393 esac
394 COMPREPLY=()
395}
396
397_git_apply ()
398{
399 local cur="${COMP_WORDS[COMP_CWORD]}"
400 case "$cur" in
401 --whitespace=*)
402 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
403 return
404 ;;
405 --*)
406 __gitcomp "
407 --stat --numstat --summary --check --index
408 --cached --index-info --reverse --reject --unidiff-zero
409 --apply --no-add --exclude=
410 --whitespace= --inaccurate-eof --verbose
411 "
412 return
413 esac
414 COMPREPLY=()
415}
416
417_git_add ()
418{
419 local cur="${COMP_WORDS[COMP_CWORD]}"
420 case "$cur" in
421 --*)
422 __gitcomp "--interactive"
423 return
424 esac
425 COMPREPLY=()
426}
427
428_git_bisect ()
429{
430 local i c=1 command
431 while [ $c -lt $COMP_CWORD ]; do
432 i="${COMP_WORDS[c]}"
433 case "$i" in
434 start|bad|good|reset|visualize|replay|log)
435 command="$i"
436 break
437 ;;
438 esac
439 c=$((++c))
440 done
441
442 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
443 __gitcomp "start bad good reset visualize replay log"
444 return
445 fi
446
447 case "$command" in
448 bad|good|reset)
449 __gitcomp "$(__git_refs)"
450 ;;
451 *)
452 COMPREPLY=()
453 ;;
454 esac
455}
456
457_git_branch ()
458{
459 __gitcomp "$(__git_refs)"
460}
461
462_git_checkout ()
463{
464 __gitcomp "$(__git_refs)"
465}
466
467_git_cherry ()
468{
469 __gitcomp "$(__git_refs)"
470}
471
472_git_cherry_pick ()
473{
474 local cur="${COMP_WORDS[COMP_CWORD]}"
475 case "$cur" in
476 --*)
477 __gitcomp "--edit --no-commit"
478 ;;
479 *)
480 __gitcomp "$(__git_refs)"
481 ;;
482 esac
483}
484
485_git_commit ()
486{
487 local cur="${COMP_WORDS[COMP_CWORD]}"
488 case "$cur" in
489 --*)
490 __gitcomp "
491 --all --author= --signoff --verify --no-verify
492 --edit --amend --include --only
493 "
494 return
495 esac
496 COMPREPLY=()
497}
498
499_git_diff ()
500{
501 __git_complete_file
502}
503
504_git_diff_tree ()
505{
506 __gitcomp "$(__git_refs)"
507}
508
509_git_fetch ()
510{
511 local cur="${COMP_WORDS[COMP_CWORD]}"
512
513 case "${COMP_WORDS[0]},$COMP_CWORD" in
514 git-fetch*,1)
515 __gitcomp "$(__git_remotes)"
516 ;;
517 git,2)
518 __gitcomp "$(__git_remotes)"
519 ;;
520 *)
521 case "$cur" in
522 *:*)
523 __gitcomp "$(__git_refs)" "" "${cur#*:}"
524 ;;
525 *)
526 local remote
527 case "${COMP_WORDS[0]}" in
528 git-fetch) remote="${COMP_WORDS[1]}" ;;
529 git) remote="${COMP_WORDS[2]}" ;;
530 esac
531 __gitcomp "$(__git_refs2 "$remote")"
532 ;;
533 esac
534 ;;
535 esac
536}
537
538_git_format_patch ()
539{
540 local cur="${COMP_WORDS[COMP_CWORD]}"
541 case "$cur" in
542 --*)
543 __gitcomp "
544 --stdout --attach --thread
545 --output-directory
546 --numbered --start-number
547 --keep-subject
548 --signoff
549 --in-reply-to=
550 --full-index --binary
551 --not --all
552 "
553 return
554 ;;
555 esac
556 __git_complete_revlist
557}
558
559_git_gc ()
560{
561 local cur="${COMP_WORDS[COMP_CWORD]}"
562 case "$cur" in
563 --*)
564 __gitcomp "--prune"
565 return
566 ;;
567 esac
568 COMPREPLY=()
569}
570
571_git_ls_remote ()
572{
573 __gitcomp "$(__git_remotes)"
574}
575
576_git_ls_tree ()
577{
578 __git_complete_file
579}
580
581_git_log ()
582{
583 local cur="${COMP_WORDS[COMP_CWORD]}"
584 case "$cur" in
585 --pretty=*)
586 __gitcomp "
587 oneline short medium full fuller email raw
588 " "" "${cur##--pretty=}"
589 return
590 ;;
591 --*)
592 __gitcomp "
593 --max-count= --max-age= --since= --after=
594 --min-age= --before= --until=
595 --root --topo-order --date-order --reverse
596 --no-merges
597 --abbrev-commit --abbrev=
598 --relative-date
599 --author= --committer= --grep=
600 --all-match
601 --pretty= --name-status --name-only --raw
602 --not --all
603 "
604 return
605 ;;
606 esac
607 __git_complete_revlist
608}
609
610_git_merge ()
611{
612 local cur="${COMP_WORDS[COMP_CWORD]}"
613 case "${COMP_WORDS[COMP_CWORD-1]}" in
614 -s|--strategy)
615 __gitcomp "$(__git_merge_strategies)"
616 return
617 esac
618 case "$cur" in
619 --strategy=*)
620 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
621 return
622 ;;
623 --*)
624 __gitcomp "
625 --no-commit --no-summary --squash --strategy
626 "
627 return
628 esac
629 __gitcomp "$(__git_refs)"
630}
631
632_git_merge_base ()
633{
634 __gitcomp "$(__git_refs)"
635}
636
637_git_name_rev ()
638{
639 __gitcomp "--tags --all --stdin"
640}
641
642_git_pull ()
643{
644 local cur="${COMP_WORDS[COMP_CWORD]}"
645
646 case "${COMP_WORDS[0]},$COMP_CWORD" in
647 git-pull*,1)
648 __gitcomp "$(__git_remotes)"
649 ;;
650 git,2)
651 __gitcomp "$(__git_remotes)"
652 ;;
653 *)
654 local remote
655 case "${COMP_WORDS[0]}" in
656 git-pull) remote="${COMP_WORDS[1]}" ;;
657 git) remote="${COMP_WORDS[2]}" ;;
658 esac
659 __gitcomp "$(__git_refs "$remote")"
660 ;;
661 esac
662}
663
664_git_push ()
665{
666 local cur="${COMP_WORDS[COMP_CWORD]}"
667
668 case "${COMP_WORDS[0]},$COMP_CWORD" in
669 git-push*,1)
670 __gitcomp "$(__git_remotes)"
671 ;;
672 git,2)
673 __gitcomp "$(__git_remotes)"
674 ;;
675 *)
676 case "$cur" in
677 *:*)
678 local remote
679 case "${COMP_WORDS[0]}" in
680 git-push) remote="${COMP_WORDS[1]}" ;;
681 git) remote="${COMP_WORDS[2]}" ;;
682 esac
683 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
684 ;;
685 +*)
686 __gitcomp "$(__git_refs)" + "${cur#+}"
687 ;;
688 *)
689 __gitcomp "$(__git_refs)"
690 ;;
691 esac
692 ;;
693 esac
694}
695
696_git_rebase ()
697{
698 local cur="${COMP_WORDS[COMP_CWORD]}"
699 if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
700 __gitcomp "--continue --skip --abort"
701 return
702 fi
703 case "${COMP_WORDS[COMP_CWORD-1]}" in
704 -s|--strategy)
705 __gitcomp "$(__git_merge_strategies)"
706 return
707 esac
708 case "$cur" in
709 --strategy=*)
710 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
711 return
712 ;;
713 --*)
714 __gitcomp "--onto --merge --strategy"
715 return
716 esac
717 __gitcomp "$(__git_refs)"
718}
719
720_git_config ()
721{
722 local cur="${COMP_WORDS[COMP_CWORD]}"
723 local prv="${COMP_WORDS[COMP_CWORD-1]}"
724 case "$prv" in
725 branch.*.remote)
726 __gitcomp "$(__git_remotes)"
727 return
728 ;;
729 branch.*.merge)
730 __gitcomp "$(__git_refs)"
731 return
732 ;;
733 remote.*.fetch)
734 local remote="${prv#remote.}"
735 remote="${remote%.fetch}"
736 __gitcomp "$(__git_refs_remotes "$remote")"
737 return
738 ;;
739 remote.*.push)
740 local remote="${prv#remote.}"
741 remote="${remote%.push}"
742 __gitcomp "$(git --git-dir="$(__gitdir)" \
743 for-each-ref --format='%(refname):%(refname)' \
744 refs/heads)"
745 return
746 ;;
747 pull.twohead|pull.octopus)
748 __gitcomp "$(__git_merge_strategies)"
749 return
750 ;;
751 color.branch|color.diff|color.status)
752 __gitcomp "always never auto"
753 return
754 ;;
755 color.*.*)
756 __gitcomp "
757 black red green yellow blue magenta cyan white
758 bold dim ul blink reverse
759 "
760 return
761 ;;
762 *.*)
763 COMPREPLY=()
764 return
765 ;;
766 esac
767 case "$cur" in
768 --*)
769 __gitcomp "
770 --global --system
771 --list --replace-all
772 --get --get-all --get-regexp
773 --add --unset --unset-all
774 --remove-section --rename-section
775 "
776 return
777 ;;
778 branch.*.*)
779 local pfx="${cur%.*}."
780 cur="${cur##*.}"
781 __gitcomp "remote merge" "$pfx" "$cur"
782 return
783 ;;
784 branch.*)
785 local pfx="${cur%.*}."
786 cur="${cur#*.}"
787 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
788 return
789 ;;
790 remote.*.*)
791 local pfx="${cur%.*}."
792 cur="${cur##*.}"
793 __gitcomp "
794 url fetch push skipDefaultUpdate
795 receivepack uploadpack tagopt
796 " "$pfx" "$cur"
797 return
798 ;;
799 remote.*)
800 local pfx="${cur%.*}."
801 cur="${cur#*.}"
802 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
803 return
804 ;;
805 esac
806 __gitcomp "
807 apply.whitespace
808 core.fileMode
809 core.gitProxy
810 core.ignoreStat
811 core.preferSymlinkRefs
812 core.logAllRefUpdates
813 core.repositoryFormatVersion
814 core.sharedRepository
815 core.warnAmbiguousRefs
816 core.compression
817 core.legacyHeaders
818 core.packedGitWindowSize
819 core.packedGitLimit
820 clean.requireForce
821 color.branch
822 color.branch.current
823 color.branch.local
824 color.branch.remote
825 color.branch.plain
826 color.diff
827 color.diff.plain
828 color.diff.meta
829 color.diff.frag
830 color.diff.old
831 color.diff.new
832 color.diff.commit
833 color.diff.whitespace
834 color.pager
835 color.status
836 color.status.header
837 color.status.added
838 color.status.changed
839 color.status.untracked
840 diff.renameLimit
841 diff.renames
842 fetch.unpackLimit
843 format.headers
844 gitcvs.enabled
845 gitcvs.logfile
846 gitcvs.allbinary
847 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
848 gc.packrefs
849 gc.reflogexpire
850 gc.reflogexpireunreachable
851 gc.rerereresolved
852 gc.rerereunresolved
853 http.sslVerify
854 http.sslCert
855 http.sslKey
856 http.sslCAInfo
857 http.sslCAPath
858 http.maxRequests
859 http.lowSpeedLimit
860 http.lowSpeedTime
861 http.noEPSV
862 i18n.commitEncoding
863 i18n.logOutputEncoding
864 log.showroot
865 merge.tool
866 merge.summary
867 merge.verbosity
868 pack.window
869 pack.depth
870 pull.octopus
871 pull.twohead
872 repack.useDeltaBaseOffset
873 show.difftree
874 showbranch.default
875 tar.umask
876 transfer.unpackLimit
877 receive.unpackLimit
878 receive.denyNonFastForwards
879 user.name
880 user.email
881 user.signingkey
882 whatchanged.difftree
883 branch. remote.
884 "
885}
886
887_git_remote ()
888{
889 local i c=1 command
890 while [ $c -lt $COMP_CWORD ]; do
891 i="${COMP_WORDS[c]}"
892 case "$i" in
893 add|show|prune|update) command="$i"; break ;;
894 esac
895 c=$((++c))
896 done
897
898 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
899 __gitcomp "add show prune update"
900 return
901 fi
902
903 case "$command" in
904 show|prune)
905 __gitcomp "$(__git_remotes)"
906 ;;
907 update)
908 local i c='' IFS=$'\n'
909 for i in $(git --git-dir="$(__gitdir)" config --list); do
910 case "$i" in
911 remotes.*)
912 i="${i#remotes.}"
913 c="$c ${i/=*/}"
914 ;;
915 esac
916 done
917 __gitcomp "$c"
918 ;;
919 *)
920 COMPREPLY=()
921 ;;
922 esac
923}
924
925_git_reset ()
926{
927 local cur="${COMP_WORDS[COMP_CWORD]}"
928 case "$cur" in
929 --*)
930 __gitcomp "--mixed --hard --soft"
931 return
932 ;;
933 esac
934 __gitcomp "$(__git_refs)"
935}
936
937_git_shortlog ()
938{
939 local cur="${COMP_WORDS[COMP_CWORD]}"
940 case "$cur" in
941 --*)
942 __gitcomp "
943 --max-count= --max-age= --since= --after=
944 --min-age= --before= --until=
945 --no-merges
946 --author= --committer= --grep=
947 --all-match
948 --not --all
949 --numbered --summary
950 "
951 return
952 ;;
953 esac
954 __git_complete_revlist
955}
956
957_git_show ()
958{
959 local cur="${COMP_WORDS[COMP_CWORD]}"
960 case "$cur" in
961 --pretty=*)
962 __gitcomp "
963 oneline short medium full fuller email raw
964 " "" "${cur##--pretty=}"
965 return
966 ;;
967 --*)
968 __gitcomp "--pretty="
969 return
970 ;;
971 esac
972 __git_complete_file
973}
974
975_git ()
976{
977 local i c=1 command __git_dir
978
979 while [ $c -lt $COMP_CWORD ]; do
980 i="${COMP_WORDS[c]}"
981 case "$i" in
982 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
983 --bare) __git_dir="." ;;
984 --version|--help|-p|--paginate) ;;
985 *) command="$i"; break ;;
986 esac
987 c=$((++c))
988 done
989
990 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
991 case "${COMP_WORDS[COMP_CWORD]}" in
992 --*=*) COMPREPLY=() ;;
993 --*) __gitcomp "--git-dir= --bare --version --exec-path" ;;
994 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
995 esac
996 return
997 fi
998
999 local expansion=$(__git_aliased_command "$command")
1000 [ "$expansion" ] && command="$expansion"
1001
1002 case "$command" in
1003 am) _git_am ;;
1004 add) _git_add ;;
1005 apply) _git_apply ;;
1006 bisect) _git_bisect ;;
1007 branch) _git_branch ;;
1008 checkout) _git_checkout ;;
1009 cherry) _git_cherry ;;
1010 cherry-pick) _git_cherry_pick ;;
1011 commit) _git_commit ;;
1012 config) _git_config ;;
1013 diff) _git_diff ;;
1014 fetch) _git_fetch ;;
1015 format-patch) _git_format_patch ;;
1016 gc) _git_gc ;;
1017 log) _git_log ;;
1018 ls-remote) _git_ls_remote ;;
1019 ls-tree) _git_ls_tree ;;
1020 merge) _git_merge;;
1021 merge-base) _git_merge_base ;;
1022 name-rev) _git_name_rev ;;
1023 pull) _git_pull ;;
1024 push) _git_push ;;
1025 rebase) _git_rebase ;;
1026 remote) _git_remote ;;
1027 reset) _git_reset ;;
1028 shortlog) _git_shortlog ;;
1029 show) _git_show ;;
1030 show-branch) _git_log ;;
1031 whatchanged) _git_log ;;
1032 *) COMPREPLY=() ;;
1033 esac
1034}
1035
1036_gitk ()
1037{
1038 local cur="${COMP_WORDS[COMP_CWORD]}"
1039 case "$cur" in
1040 --*)
1041 __gitcomp "--not --all"
1042 return
1043 ;;
1044 esac
1045 __git_complete_revlist
1046}
1047
1048complete -o default -o nospace -F _git git
1049complete -o default -o nospace -F _gitk gitk
1050complete -o default -o nospace -F _git_am git-am
1051complete -o default -o nospace -F _git_apply git-apply
1052complete -o default -o nospace -F _git_bisect git-bisect
1053complete -o default -o nospace -F _git_branch git-branch
1054complete -o default -o nospace -F _git_checkout git-checkout
1055complete -o default -o nospace -F _git_cherry git-cherry
1056complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1057complete -o default -o nospace -F _git_commit git-commit
1058complete -o default -o nospace -F _git_diff git-diff
1059complete -o default -o nospace -F _git_fetch git-fetch
1060complete -o default -o nospace -F _git_format_patch git-format-patch
1061complete -o default -o nospace -F _git_gc git-gc
1062complete -o default -o nospace -F _git_log git-log
1063complete -o default -o nospace -F _git_ls_remote git-ls-remote
1064complete -o default -o nospace -F _git_ls_tree git-ls-tree
1065complete -o default -o nospace -F _git_merge git-merge
1066complete -o default -o nospace -F _git_merge_base git-merge-base
1067complete -o default -o nospace -F _git_name_rev git-name-rev
1068complete -o default -o nospace -F _git_pull git-pull
1069complete -o default -o nospace -F _git_push git-push
1070complete -o default -o nospace -F _git_rebase git-rebase
1071complete -o default -o nospace -F _git_config git-config
1072complete -o default -o nospace -F _git_remote git-remote
1073complete -o default -o nospace -F _git_reset git-reset
1074complete -o default -o nospace -F _git_shortlog git-shortlog
1075complete -o default -o nospace -F _git_show git-show
1076complete -o default -o nospace -F _git_log git-show-branch
1077complete -o default -o nospace -F _git_log git-whatchanged
1078
1079# The following are necessary only for Cygwin, and only are needed
1080# when the user has tab-completed the executable name and consequently
1081# included the '.exe' suffix.
1082#
1083if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1084complete -o default -o nospace -F _git_add git-add.exe
1085complete -o default -o nospace -F _git_apply git-apply.exe
1086complete -o default -o nospace -F _git git.exe
1087complete -o default -o nospace -F _git_branch git-branch.exe
1088complete -o default -o nospace -F _git_cherry git-cherry.exe
1089complete -o default -o nospace -F _git_diff git-diff.exe
1090complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1091complete -o default -o nospace -F _git_log git-log.exe
1092complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1093complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1094complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1095complete -o default -o nospace -F _git_push git-push.exe
1096complete -o default -o nospace -F _git_config git-config
1097complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1098complete -o default -o nospace -F _git_show git-show.exe
1099complete -o default -o nospace -F _git_log git-show-branch.exe
1100complete -o default -o nospace -F _git_log git-whatchanged.exe
1101fi