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
48case "$COMP_WORDBREAKS" in
49*:*) : great ;;
50*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
51esac
52
53__gitdir ()
54{
55 if [ -z "$1" ]; then
56 if [ -n "$__git_dir" ]; then
57 echo "$__git_dir"
58 elif [ -d .git ]; then
59 echo .git
60 else
61 git rev-parse --git-dir 2>/dev/null
62 fi
63 elif [ -d "$1/.git" ]; then
64 echo "$1/.git"
65 else
66 echo "$1"
67 fi
68}
69
70__git_ps1 ()
71{
72 local g="$(git rev-parse --git-dir 2>/dev/null)"
73 if [ -n "$g" ]; then
74 local r
75 local b
76 if [ -d "$g/rebase-apply" ]
77 then
78 if test -f "$g/rebase-apply/rebasing"
79 then
80 r="|REBASE"
81 elif test -f "$g/rebase-apply/applying"
82 then
83 r="|AM"
84 else
85 r="|AM/REBASE"
86 fi
87 b="$(git symbolic-ref HEAD 2>/dev/null)"
88 elif [ -f "$g/rebase-merge/interactive" ]
89 then
90 r="|REBASE-i"
91 b="$(cat "$g/rebase-merge/head-name")"
92 elif [ -d "$g/rebase-merge" ]
93 then
94 r="|REBASE-m"
95 b="$(cat "$g/rebase-merge/head-name")"
96 elif [ -f "$g/MERGE_HEAD" ]
97 then
98 r="|MERGING"
99 b="$(git symbolic-ref HEAD 2>/dev/null)"
100 else
101 if [ -f "$g/BISECT_LOG" ]
102 then
103 r="|BISECTING"
104 fi
105 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
106 then
107 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
108 then
109 b="$(cut -c1-7 "$g/HEAD")..."
110 fi
111 fi
112 fi
113
114 if [ -n "$1" ]; then
115 printf "$1" "${b##refs/heads/}$r"
116 else
117 printf " (%s)" "${b##refs/heads/}$r"
118 fi
119 fi
120}
121
122__gitcomp_1 ()
123{
124 local c IFS=' '$'\t'$'\n'
125 for c in $1; do
126 case "$c$2" in
127 --*=*) printf %s$'\n' "$c$2" ;;
128 *.) printf %s$'\n' "$c$2" ;;
129 *) printf %s$'\n' "$c$2 " ;;
130 esac
131 done
132}
133
134__gitcomp ()
135{
136 local cur="${COMP_WORDS[COMP_CWORD]}"
137 if [ $# -gt 2 ]; then
138 cur="$3"
139 fi
140 case "$cur" in
141 --*=)
142 COMPREPLY=()
143 ;;
144 *)
145 local IFS=$'\n'
146 COMPREPLY=($(compgen -P "$2" \
147 -W "$(__gitcomp_1 "$1" "$4")" \
148 -- "$cur"))
149 ;;
150 esac
151}
152
153__git_heads ()
154{
155 local cmd i is_hash=y dir="$(__gitdir "$1")"
156 if [ -d "$dir" ]; then
157 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
158 refs/heads
159 return
160 fi
161 for i in $(git ls-remote "$1" 2>/dev/null); do
162 case "$is_hash,$i" in
163 y,*) is_hash=n ;;
164 n,*^{}) is_hash=y ;;
165 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
166 n,*) is_hash=y; echo "$i" ;;
167 esac
168 done
169}
170
171__git_tags ()
172{
173 local cmd i is_hash=y dir="$(__gitdir "$1")"
174 if [ -d "$dir" ]; then
175 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
176 refs/tags
177 return
178 fi
179 for i in $(git ls-remote "$1" 2>/dev/null); do
180 case "$is_hash,$i" in
181 y,*) is_hash=n ;;
182 n,*^{}) is_hash=y ;;
183 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
184 n,*) is_hash=y; echo "$i" ;;
185 esac
186 done
187}
188
189__git_refs ()
190{
191 local i is_hash=y dir="$(__gitdir "$1")"
192 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
193 if [ -d "$dir" ]; then
194 case "$cur" in
195 refs|refs/*)
196 format="refname"
197 refs="${cur%/*}"
198 ;;
199 *)
200 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
201 format="refname:short"
202 refs="refs/tags refs/heads refs/remotes"
203 ;;
204 esac
205 git --git-dir="$dir" for-each-ref --format="%($format)" \
206 $refs
207 return
208 fi
209 for i in $(git ls-remote "$dir" 2>/dev/null); do
210 case "$is_hash,$i" in
211 y,*) is_hash=n ;;
212 n,*^{}) is_hash=y ;;
213 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
214 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
215 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
216 n,*) is_hash=y; echo "$i" ;;
217 esac
218 done
219}
220
221__git_refs2 ()
222{
223 local i
224 for i in $(__git_refs "$1"); do
225 echo "$i:$i"
226 done
227}
228
229__git_refs_remotes ()
230{
231 local cmd i is_hash=y
232 for i in $(git ls-remote "$1" 2>/dev/null); do
233 case "$is_hash,$i" in
234 n,refs/heads/*)
235 is_hash=y
236 echo "$i:refs/remotes/$1/${i#refs/heads/}"
237 ;;
238 y,*) is_hash=n ;;
239 n,*^{}) is_hash=y ;;
240 n,refs/tags/*) is_hash=y;;
241 n,*) is_hash=y; ;;
242 esac
243 done
244}
245
246__git_remotes ()
247{
248 local i ngoff IFS=$'\n' d="$(__gitdir)"
249 shopt -q nullglob || ngoff=1
250 shopt -s nullglob
251 for i in "$d/remotes"/*; do
252 echo ${i#$d/remotes/}
253 done
254 [ "$ngoff" ] && shopt -u nullglob
255 for i in $(git --git-dir="$d" config --list); do
256 case "$i" in
257 remote.*.url=*)
258 i="${i#remote.}"
259 echo "${i/.url=*/}"
260 ;;
261 esac
262 done
263}
264
265__git_merge_strategies ()
266{
267 if [ -n "$__git_merge_strategylist" ]; then
268 echo "$__git_merge_strategylist"
269 return
270 fi
271 git merge -s help 2>&1 |
272 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
273 s/\.$//
274 s/.*://
275 s/^[ ]*//
276 s/[ ]*$//
277 p
278 }'
279}
280__git_merge_strategylist=
281__git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
282
283__git_complete_file ()
284{
285 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
286 case "$cur" in
287 ?*:*)
288 ref="${cur%%:*}"
289 cur="${cur#*:}"
290 case "$cur" in
291 ?*/*)
292 pfx="${cur%/*}"
293 cur="${cur##*/}"
294 ls="$ref:$pfx"
295 pfx="$pfx/"
296 ;;
297 *)
298 ls="$ref"
299 ;;
300 esac
301
302 case "$COMP_WORDBREAKS" in
303 *:*) : great ;;
304 *) pfx="$ref:$pfx" ;;
305 esac
306
307 local IFS=$'\n'
308 COMPREPLY=($(compgen -P "$pfx" \
309 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
310 | sed '/^100... blob /{
311 s,^.* ,,
312 s,$, ,
313 }
314 /^120000 blob /{
315 s,^.* ,,
316 s,$, ,
317 }
318 /^040000 tree /{
319 s,^.* ,,
320 s,$,/,
321 }
322 s/^.* //')" \
323 -- "$cur"))
324 ;;
325 *)
326 __gitcomp "$(__git_refs)"
327 ;;
328 esac
329}
330
331__git_complete_revlist ()
332{
333 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
334 case "$cur" in
335 *...*)
336 pfx="${cur%...*}..."
337 cur="${cur#*...}"
338 __gitcomp "$(__git_refs)" "$pfx" "$cur"
339 ;;
340 *..*)
341 pfx="${cur%..*}.."
342 cur="${cur#*..}"
343 __gitcomp "$(__git_refs)" "$pfx" "$cur"
344 ;;
345 *)
346 __gitcomp "$(__git_refs)"
347 ;;
348 esac
349}
350
351__git_all_commands ()
352{
353 if [ -n "$__git_all_commandlist" ]; then
354 echo "$__git_all_commandlist"
355 return
356 fi
357 local i IFS=" "$'\n'
358 for i in $(git help -a|egrep '^ ')
359 do
360 case $i in
361 *--*) : helper pattern;;
362 *) echo $i;;
363 esac
364 done
365}
366__git_all_commandlist=
367__git_all_commandlist="$(__git_all_commands 2>/dev/null)"
368
369__git_porcelain_commands ()
370{
371 if [ -n "$__git_porcelain_commandlist" ]; then
372 echo "$__git_porcelain_commandlist"
373 return
374 fi
375 local i IFS=" "$'\n'
376 for i in "help" $(__git_all_commands)
377 do
378 case $i in
379 *--*) : helper pattern;;
380 applymbox) : ask gittus;;
381 applypatch) : ask gittus;;
382 archimport) : import;;
383 cat-file) : plumbing;;
384 check-attr) : plumbing;;
385 check-ref-format) : plumbing;;
386 checkout-index) : plumbing;;
387 commit-tree) : plumbing;;
388 count-objects) : infrequent;;
389 cvsexportcommit) : export;;
390 cvsimport) : import;;
391 cvsserver) : daemon;;
392 daemon) : daemon;;
393 diff-files) : plumbing;;
394 diff-index) : plumbing;;
395 diff-tree) : plumbing;;
396 fast-import) : import;;
397 fast-export) : export;;
398 fsck-objects) : plumbing;;
399 fetch-pack) : plumbing;;
400 fmt-merge-msg) : plumbing;;
401 for-each-ref) : plumbing;;
402 hash-object) : plumbing;;
403 http-*) : transport;;
404 index-pack) : plumbing;;
405 init-db) : deprecated;;
406 local-fetch) : plumbing;;
407 lost-found) : infrequent;;
408 ls-files) : plumbing;;
409 ls-remote) : plumbing;;
410 ls-tree) : plumbing;;
411 mailinfo) : plumbing;;
412 mailsplit) : plumbing;;
413 merge-*) : plumbing;;
414 mktree) : plumbing;;
415 mktag) : plumbing;;
416 pack-objects) : plumbing;;
417 pack-redundant) : plumbing;;
418 pack-refs) : plumbing;;
419 parse-remote) : plumbing;;
420 patch-id) : plumbing;;
421 peek-remote) : plumbing;;
422 prune) : plumbing;;
423 prune-packed) : plumbing;;
424 quiltimport) : import;;
425 read-tree) : plumbing;;
426 receive-pack) : plumbing;;
427 reflog) : plumbing;;
428 repo-config) : deprecated;;
429 rerere) : plumbing;;
430 rev-list) : plumbing;;
431 rev-parse) : plumbing;;
432 runstatus) : plumbing;;
433 sh-setup) : internal;;
434 shell) : daemon;;
435 show-ref) : plumbing;;
436 send-pack) : plumbing;;
437 show-index) : plumbing;;
438 ssh-*) : transport;;
439 stripspace) : plumbing;;
440 symbolic-ref) : plumbing;;
441 tar-tree) : deprecated;;
442 unpack-file) : plumbing;;
443 unpack-objects) : plumbing;;
444 update-index) : plumbing;;
445 update-ref) : plumbing;;
446 update-server-info) : daemon;;
447 upload-archive) : plumbing;;
448 upload-pack) : plumbing;;
449 write-tree) : plumbing;;
450 var) : infrequent;;
451 verify-pack) : infrequent;;
452 verify-tag) : plumbing;;
453 *) echo $i;;
454 esac
455 done
456}
457__git_porcelain_commandlist=
458__git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
459
460__git_aliases ()
461{
462 local i IFS=$'\n'
463 for i in $(git --git-dir="$(__gitdir)" config --list); do
464 case "$i" in
465 alias.*)
466 i="${i#alias.}"
467 echo "${i/=*/}"
468 ;;
469 esac
470 done
471}
472
473__git_aliased_command ()
474{
475 local word cmdline=$(git --git-dir="$(__gitdir)" \
476 config --get "alias.$1")
477 for word in $cmdline; do
478 if [ "${word##-*}" ]; then
479 echo $word
480 return
481 fi
482 done
483}
484
485__git_find_subcommand ()
486{
487 local word subcommand c=1
488
489 while [ $c -lt $COMP_CWORD ]; do
490 word="${COMP_WORDS[c]}"
491 for subcommand in $1; do
492 if [ "$subcommand" = "$word" ]; then
493 echo "$subcommand"
494 return
495 fi
496 done
497 c=$((++c))
498 done
499}
500
501__git_has_doubledash ()
502{
503 local c=1
504 while [ $c -lt $COMP_CWORD ]; do
505 if [ "--" = "${COMP_WORDS[c]}" ]; then
506 return 0
507 fi
508 c=$((++c))
509 done
510 return 1
511}
512
513__git_whitespacelist="nowarn warn error error-all fix"
514
515_git_am ()
516{
517 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
518 if [ -d "$dir"/rebase-apply ]; then
519 __gitcomp "--skip --resolved --abort"
520 return
521 fi
522 case "$cur" in
523 --whitespace=*)
524 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
525 return
526 ;;
527 --*)
528 __gitcomp "
529 --signoff --utf8 --binary --3way --interactive
530 --whitespace=
531 "
532 return
533 esac
534 COMPREPLY=()
535}
536
537_git_apply ()
538{
539 local cur="${COMP_WORDS[COMP_CWORD]}"
540 case "$cur" in
541 --whitespace=*)
542 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
543 return
544 ;;
545 --*)
546 __gitcomp "
547 --stat --numstat --summary --check --index
548 --cached --index-info --reverse --reject --unidiff-zero
549 --apply --no-add --exclude=
550 --whitespace= --inaccurate-eof --verbose
551 "
552 return
553 esac
554 COMPREPLY=()
555}
556
557_git_add ()
558{
559 __git_has_doubledash && return
560
561 local cur="${COMP_WORDS[COMP_CWORD]}"
562 case "$cur" in
563 --*)
564 __gitcomp "
565 --interactive --refresh --patch --update --dry-run
566 --ignore-errors
567 "
568 return
569 esac
570 COMPREPLY=()
571}
572
573_git_archive ()
574{
575 local cur="${COMP_WORDS[COMP_CWORD]}"
576 case "$cur" in
577 --format=*)
578 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
579 return
580 ;;
581 --remote=*)
582 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
583 return
584 ;;
585 --*)
586 __gitcomp "
587 --format= --list --verbose
588 --prefix= --remote= --exec=
589 "
590 return
591 ;;
592 esac
593 __git_complete_file
594}
595
596_git_bisect ()
597{
598 __git_has_doubledash && return
599
600 local subcommands="start bad good skip reset visualize replay log run"
601 local subcommand="$(__git_find_subcommand "$subcommands")"
602 if [ -z "$subcommand" ]; then
603 __gitcomp "$subcommands"
604 return
605 fi
606
607 case "$subcommand" in
608 bad|good|reset|skip)
609 __gitcomp "$(__git_refs)"
610 ;;
611 *)
612 COMPREPLY=()
613 ;;
614 esac
615}
616
617_git_branch ()
618{
619 local i c=1 only_local_ref="n" has_r="n"
620
621 while [ $c -lt $COMP_CWORD ]; do
622 i="${COMP_WORDS[c]}"
623 case "$i" in
624 -d|-m) only_local_ref="y" ;;
625 -r) has_r="y" ;;
626 esac
627 c=$((++c))
628 done
629
630 case "${COMP_WORDS[COMP_CWORD]}" in
631 --*=*) COMPREPLY=() ;;
632 --*)
633 __gitcomp "
634 --color --no-color --verbose --abbrev= --no-abbrev
635 --track --no-track --contains --merged --no-merged
636 "
637 ;;
638 *)
639 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
640 __gitcomp "$(__git_heads)"
641 else
642 __gitcomp "$(__git_refs)"
643 fi
644 ;;
645 esac
646}
647
648_git_bundle ()
649{
650 local cmd="${COMP_WORDS[2]}"
651 case "$COMP_CWORD" in
652 2)
653 __gitcomp "create list-heads verify unbundle"
654 ;;
655 3)
656 # looking for a file
657 ;;
658 *)
659 case "$cmd" in
660 create)
661 __git_complete_revlist
662 ;;
663 esac
664 ;;
665 esac
666}
667
668_git_checkout ()
669{
670 __git_has_doubledash && return
671
672 __gitcomp "$(__git_refs)"
673}
674
675_git_cherry ()
676{
677 __gitcomp "$(__git_refs)"
678}
679
680_git_cherry_pick ()
681{
682 local cur="${COMP_WORDS[COMP_CWORD]}"
683 case "$cur" in
684 --*)
685 __gitcomp "--edit --no-commit"
686 ;;
687 *)
688 __gitcomp "$(__git_refs)"
689 ;;
690 esac
691}
692
693_git_clean ()
694{
695 __git_has_doubledash && return
696
697 local cur="${COMP_WORDS[COMP_CWORD]}"
698 case "$cur" in
699 --*)
700 __gitcomp "--dry-run --quiet"
701 return
702 ;;
703 esac
704 COMPREPLY=()
705}
706
707_git_clone ()
708{
709 local cur="${COMP_WORDS[COMP_CWORD]}"
710 case "$cur" in
711 --*)
712 __gitcomp "
713 --local
714 --no-hardlinks
715 --shared
716 --reference
717 --quiet
718 --no-checkout
719 --bare
720 --mirror
721 --origin
722 --upload-pack
723 --template=
724 --depth
725 "
726 return
727 ;;
728 esac
729 COMPREPLY=()
730}
731
732_git_commit ()
733{
734 __git_has_doubledash && return
735
736 local cur="${COMP_WORDS[COMP_CWORD]}"
737 case "$cur" in
738 --*)
739 __gitcomp "
740 --all --author= --signoff --verify --no-verify
741 --edit --amend --include --only --interactive
742 "
743 return
744 esac
745 COMPREPLY=()
746}
747
748_git_describe ()
749{
750 local cur="${COMP_WORDS[COMP_CWORD]}"
751 case "$cur" in
752 --*)
753 __gitcomp "
754 --all --tags --contains --abbrev= --candidates=
755 --exact-match --debug --long --match --always
756 "
757 return
758 esac
759 __gitcomp "$(__git_refs)"
760}
761
762_git_diff ()
763{
764 __git_has_doubledash && return
765
766 local cur="${COMP_WORDS[COMP_CWORD]}"
767 case "$cur" in
768 --*)
769 __gitcomp "--cached --stat --numstat --shortstat --summary
770 --patch-with-stat --name-only --name-status --color
771 --no-color --color-words --no-renames --check
772 --full-index --binary --abbrev --diff-filter=
773 --find-copies-harder --pickaxe-all --pickaxe-regex
774 --text --ignore-space-at-eol --ignore-space-change
775 --ignore-all-space --exit-code --quiet --ext-diff
776 --no-ext-diff
777 --no-prefix --src-prefix= --dst-prefix=
778 --base --ours --theirs
779 --inter-hunk-context=
780 "
781 return
782 ;;
783 esac
784 __git_complete_file
785}
786
787_git_fetch ()
788{
789 local cur="${COMP_WORDS[COMP_CWORD]}"
790
791 if [ "$COMP_CWORD" = 2 ]; then
792 __gitcomp "$(__git_remotes)"
793 else
794 case "$cur" in
795 *:*)
796 local pfx=""
797 case "$COMP_WORDBREAKS" in
798 *:*) : great ;;
799 *) pfx="${cur%%:*}:" ;;
800 esac
801 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
802 ;;
803 *)
804 __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
805 ;;
806 esac
807 fi
808}
809
810_git_format_patch ()
811{
812 local cur="${COMP_WORDS[COMP_CWORD]}"
813 case "$cur" in
814 --*)
815 __gitcomp "
816 --stdout --attach --thread
817 --output-directory
818 --numbered --start-number
819 --numbered-files
820 --keep-subject
821 --signoff
822 --in-reply-to=
823 --full-index --binary
824 --not --all
825 --cover-letter
826 --no-prefix --src-prefix= --dst-prefix=
827 "
828 return
829 ;;
830 esac
831 __git_complete_revlist
832}
833
834_git_gc ()
835{
836 local cur="${COMP_WORDS[COMP_CWORD]}"
837 case "$cur" in
838 --*)
839 __gitcomp "--prune --aggressive"
840 return
841 ;;
842 esac
843 COMPREPLY=()
844}
845
846_git_grep ()
847{
848 __git_has_doubledash && return
849
850 local cur="${COMP_WORDS[COMP_CWORD]}"
851 case "$cur" in
852 --*)
853 __gitcomp "
854 --cached
855 --text --ignore-case --word-regexp --invert-match
856 --full-name
857 --extended-regexp --basic-regexp --fixed-strings
858 --files-with-matches --name-only
859 --files-without-match
860 --count
861 --and --or --not --all-match
862 "
863 return
864 ;;
865 esac
866 COMPREPLY=()
867}
868
869_git_help ()
870{
871 local cur="${COMP_WORDS[COMP_CWORD]}"
872 case "$cur" in
873 --*)
874 __gitcomp "--all --info --man --web"
875 return
876 ;;
877 esac
878 __gitcomp "$(__git_all_commands)
879 attributes cli core-tutorial cvs-migration
880 diffcore gitk glossary hooks ignore modules
881 repository-layout tutorial tutorial-2
882 workflows
883 "
884}
885
886_git_init ()
887{
888 local cur="${COMP_WORDS[COMP_CWORD]}"
889 case "$cur" in
890 --shared=*)
891 __gitcomp "
892 false true umask group all world everybody
893 " "" "${cur##--shared=}"
894 return
895 ;;
896 --*)
897 __gitcomp "--quiet --bare --template= --shared --shared="
898 return
899 ;;
900 esac
901 COMPREPLY=()
902}
903
904_git_ls_files ()
905{
906 __git_has_doubledash && return
907
908 local cur="${COMP_WORDS[COMP_CWORD]}"
909 case "$cur" in
910 --*)
911 __gitcomp "--cached --deleted --modified --others --ignored
912 --stage --directory --no-empty-directory --unmerged
913 --killed --exclude= --exclude-from=
914 --exclude-per-directory= --exclude-standard
915 --error-unmatch --with-tree= --full-name
916 --abbrev --ignored --exclude-per-directory
917 "
918 return
919 ;;
920 esac
921 COMPREPLY=()
922}
923
924_git_ls_remote ()
925{
926 __gitcomp "$(__git_remotes)"
927}
928
929_git_ls_tree ()
930{
931 __git_complete_file
932}
933
934_git_log ()
935{
936 __git_has_doubledash && return
937
938 local cur="${COMP_WORDS[COMP_CWORD]}"
939 case "$cur" in
940 --pretty=*)
941 __gitcomp "
942 oneline short medium full fuller email raw
943 " "" "${cur##--pretty=}"
944 return
945 ;;
946 --date=*)
947 __gitcomp "
948 relative iso8601 rfc2822 short local default
949 " "" "${cur##--date=}"
950 return
951 ;;
952 --*)
953 __gitcomp "
954 --max-count= --max-age= --since= --after=
955 --min-age= --before= --until=
956 --root --topo-order --date-order --reverse
957 --no-merges --follow
958 --abbrev-commit --abbrev=
959 --relative-date --date=
960 --author= --committer= --grep=
961 --all-match
962 --pretty= --name-status --name-only --raw
963 --not --all
964 --left-right --cherry-pick
965 --graph
966 --stat --numstat --shortstat
967 --decorate --diff-filter=
968 --color-words --walk-reflogs
969 --parents --children --full-history
970 --merge
971 --inter-hunk-context=
972 "
973 return
974 ;;
975 esac
976 __git_complete_revlist
977}
978
979_git_merge ()
980{
981 local cur="${COMP_WORDS[COMP_CWORD]}"
982 case "${COMP_WORDS[COMP_CWORD-1]}" in
983 -s|--strategy)
984 __gitcomp "$(__git_merge_strategies)"
985 return
986 esac
987 case "$cur" in
988 --strategy=*)
989 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
990 return
991 ;;
992 --*)
993 __gitcomp "
994 --no-commit --no-stat --log --no-log --squash --strategy
995 "
996 return
997 esac
998 __gitcomp "$(__git_refs)"
999}
1000
1001_git_mergetool ()
1002{
1003 local cur="${COMP_WORDS[COMP_CWORD]}"
1004 case "$cur" in
1005 --tool=*)
1006 __gitcomp "
1007 kdiff3 tkdiff meld xxdiff emerge
1008 vimdiff gvimdiff ecmerge opendiff
1009 " "" "${cur##--tool=}"
1010 return
1011 ;;
1012 --*)
1013 __gitcomp "--tool="
1014 return
1015 ;;
1016 esac
1017 COMPREPLY=()
1018}
1019
1020_git_merge_base ()
1021{
1022 __gitcomp "$(__git_refs)"
1023}
1024
1025_git_mv ()
1026{
1027 local cur="${COMP_WORDS[COMP_CWORD]}"
1028 case "$cur" in
1029 --*)
1030 __gitcomp "--dry-run"
1031 return
1032 ;;
1033 esac
1034 COMPREPLY=()
1035}
1036
1037_git_name_rev ()
1038{
1039 __gitcomp "--tags --all --stdin"
1040}
1041
1042_git_pull ()
1043{
1044 local cur="${COMP_WORDS[COMP_CWORD]}"
1045
1046 if [ "$COMP_CWORD" = 2 ]; then
1047 __gitcomp "$(__git_remotes)"
1048 else
1049 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1050 fi
1051}
1052
1053_git_push ()
1054{
1055 local cur="${COMP_WORDS[COMP_CWORD]}"
1056
1057 if [ "$COMP_CWORD" = 2 ]; then
1058 __gitcomp "$(__git_remotes)"
1059 else
1060 case "$cur" in
1061 *:*)
1062 local pfx=""
1063 case "$COMP_WORDBREAKS" in
1064 *:*) : great ;;
1065 *) pfx="${cur%%:*}:" ;;
1066 esac
1067
1068 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1069 ;;
1070 +*)
1071 __gitcomp "$(__git_refs)" + "${cur#+}"
1072 ;;
1073 *)
1074 __gitcomp "$(__git_refs)"
1075 ;;
1076 esac
1077 fi
1078}
1079
1080_git_rebase ()
1081{
1082 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1083 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1084 __gitcomp "--continue --skip --abort"
1085 return
1086 fi
1087 case "${COMP_WORDS[COMP_CWORD-1]}" in
1088 -s|--strategy)
1089 __gitcomp "$(__git_merge_strategies)"
1090 return
1091 esac
1092 case "$cur" in
1093 --strategy=*)
1094 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1095 return
1096 ;;
1097 --*)
1098 __gitcomp "--onto --merge --strategy --interactive"
1099 return
1100 esac
1101 __gitcomp "$(__git_refs)"
1102}
1103
1104_git_send_email ()
1105{
1106 local cur="${COMP_WORDS[COMP_CWORD]}"
1107 case "$cur" in
1108 --*)
1109 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1110 --dry-run --envelope-sender --from --identity
1111 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1112 --no-suppress-from --no-thread --quiet
1113 --signed-off-by-cc --smtp-pass --smtp-server
1114 --smtp-server-port --smtp-ssl --smtp-user --subject
1115 --suppress-cc --suppress-from --thread --to
1116 --validate --no-validate"
1117 return
1118 ;;
1119 esac
1120 COMPREPLY=()
1121}
1122
1123_git_config ()
1124{
1125 local cur="${COMP_WORDS[COMP_CWORD]}"
1126 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1127 case "$prv" in
1128 branch.*.remote)
1129 __gitcomp "$(__git_remotes)"
1130 return
1131 ;;
1132 branch.*.merge)
1133 __gitcomp "$(__git_refs)"
1134 return
1135 ;;
1136 remote.*.fetch)
1137 local remote="${prv#remote.}"
1138 remote="${remote%.fetch}"
1139 __gitcomp "$(__git_refs_remotes "$remote")"
1140 return
1141 ;;
1142 remote.*.push)
1143 local remote="${prv#remote.}"
1144 remote="${remote%.push}"
1145 __gitcomp "$(git --git-dir="$(__gitdir)" \
1146 for-each-ref --format='%(refname):%(refname)' \
1147 refs/heads)"
1148 return
1149 ;;
1150 pull.twohead|pull.octopus)
1151 __gitcomp "$(__git_merge_strategies)"
1152 return
1153 ;;
1154 color.branch|color.diff|color.status)
1155 __gitcomp "always never auto"
1156 return
1157 ;;
1158 color.*.*)
1159 __gitcomp "
1160 normal black red green yellow blue magenta cyan white
1161 bold dim ul blink reverse
1162 "
1163 return
1164 ;;
1165 *.*)
1166 COMPREPLY=()
1167 return
1168 ;;
1169 esac
1170 case "$cur" in
1171 --*)
1172 __gitcomp "
1173 --global --system --file=
1174 --list --replace-all
1175 --get --get-all --get-regexp
1176 --add --unset --unset-all
1177 --remove-section --rename-section
1178 "
1179 return
1180 ;;
1181 branch.*.*)
1182 local pfx="${cur%.*}."
1183 cur="${cur##*.}"
1184 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1185 return
1186 ;;
1187 branch.*)
1188 local pfx="${cur%.*}."
1189 cur="${cur#*.}"
1190 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1191 return
1192 ;;
1193 remote.*.*)
1194 local pfx="${cur%.*}."
1195 cur="${cur##*.}"
1196 __gitcomp "
1197 url proxy fetch push mirror skipDefaultUpdate
1198 receivepack uploadpack tagopt
1199 " "$pfx" "$cur"
1200 return
1201 ;;
1202 remote.*)
1203 local pfx="${cur%.*}."
1204 cur="${cur#*.}"
1205 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1206 return
1207 ;;
1208 esac
1209 __gitcomp "
1210 apply.whitespace
1211 branch.autosetupmerge
1212 branch.autosetuprebase
1213 clean.requireForce
1214 color.branch
1215 color.branch.current
1216 color.branch.local
1217 color.branch.plain
1218 color.branch.remote
1219 color.diff
1220 color.diff.commit
1221 color.diff.frag
1222 color.diff.meta
1223 color.diff.new
1224 color.diff.old
1225 color.diff.plain
1226 color.diff.whitespace
1227 color.interactive
1228 color.interactive.header
1229 color.interactive.help
1230 color.interactive.prompt
1231 color.pager
1232 color.status
1233 color.status.added
1234 color.status.changed
1235 color.status.header
1236 color.status.nobranch
1237 color.status.untracked
1238 color.status.updated
1239 color.ui
1240 commit.template
1241 core.autocrlf
1242 core.bare
1243 core.compression
1244 core.deltaBaseCacheLimit
1245 core.editor
1246 core.excludesfile
1247 core.fileMode
1248 core.fsyncobjectfiles
1249 core.gitProxy
1250 core.ignoreCygwinFSTricks
1251 core.ignoreStat
1252 core.logAllRefUpdates
1253 core.loosecompression
1254 core.packedGitLimit
1255 core.packedGitWindowSize
1256 core.pager
1257 core.preferSymlinkRefs
1258 core.preloadindex
1259 core.quotepath
1260 core.repositoryFormatVersion
1261 core.safecrlf
1262 core.sharedRepository
1263 core.symlinks
1264 core.trustctime
1265 core.warnAmbiguousRefs
1266 core.whitespace
1267 core.worktree
1268 diff.autorefreshindex
1269 diff.external
1270 diff.mnemonicprefix
1271 diff.renameLimit
1272 diff.renameLimit.
1273 diff.renames
1274 fetch.unpackLimit
1275 format.headers
1276 format.numbered
1277 format.pretty
1278 format.suffix
1279 gc.aggressiveWindow
1280 gc.auto
1281 gc.autopacklimit
1282 gc.packrefs
1283 gc.pruneexpire
1284 gc.reflogexpire
1285 gc.reflogexpireunreachable
1286 gc.rerereresolved
1287 gc.rerereunresolved
1288 gitcvs.allbinary
1289 gitcvs.dbTableNamePrefix
1290 gitcvs.dbdriver
1291 gitcvs.dbname
1292 gitcvs.dbpass
1293 gitcvs.dbuser
1294 gitcvs.enabled
1295 gitcvs.logfile
1296 gitcvs.usecrlfattr
1297 gui.blamehistoryctx
1298 gui.commitmsgwidth
1299 gui.copyblamethreshold
1300 gui.diffcontext
1301 gui.encoding
1302 gui.fastcopyblame
1303 gui.matchtrackingbranch
1304 gui.newbranchtemplate
1305 gui.pruneduringfetch
1306 gui.spellingdictionary
1307 gui.trustmtime
1308 help.autocorrect
1309 help.browser
1310 help.format
1311 http.lowSpeedLimit
1312 http.lowSpeedTime
1313 http.maxRequests
1314 http.noEPSV
1315 http.proxy
1316 http.sslCAInfo
1317 http.sslCAPath
1318 http.sslCert
1319 http.sslKey
1320 http.sslVerify
1321 i18n.commitEncoding
1322 i18n.logOutputEncoding
1323 instaweb.browser
1324 instaweb.httpd
1325 instaweb.local
1326 instaweb.modulepath
1327 instaweb.port
1328 log.date
1329 log.showroot
1330 man.viewer
1331 merge.conflictstyle
1332 merge.log
1333 merge.renameLimit
1334 merge.stat
1335 merge.tool
1336 merge.verbosity
1337 mergetool.keepBackup
1338 pack.compression
1339 pack.deltaCacheLimit
1340 pack.deltaCacheSize
1341 pack.depth
1342 pack.indexVersion
1343 pack.packSizeLimit
1344 pack.threads
1345 pack.window
1346 pack.windowMemory
1347 pull.octopus
1348 pull.twohead
1349 receive.denyCurrentBranch
1350 receive.denyDeletes
1351 receive.denyNonFastForwards
1352 receive.fsckObjects
1353 receive.unpackLimit
1354 repack.usedeltabaseoffset
1355 rerere.autoupdate
1356 rerere.enabled
1357 showbranch.default
1358 status.relativePaths
1359 status.showUntrackedFiles
1360 tar.umask
1361 transfer.unpackLimit
1362 user.email
1363 user.name
1364 user.signingkey
1365 web.browser
1366 branch. remote.
1367 "
1368}
1369
1370_git_remote ()
1371{
1372 local subcommands="add rm show prune update"
1373 local subcommand="$(__git_find_subcommand "$subcommands")"
1374 if [ -z "$subcommand" ]; then
1375 __gitcomp "$subcommands"
1376 return
1377 fi
1378
1379 case "$subcommand" in
1380 rm|show|prune)
1381 __gitcomp "$(__git_remotes)"
1382 ;;
1383 update)
1384 local i c='' IFS=$'\n'
1385 for i in $(git --git-dir="$(__gitdir)" config --list); do
1386 case "$i" in
1387 remotes.*)
1388 i="${i#remotes.}"
1389 c="$c ${i/=*/}"
1390 ;;
1391 esac
1392 done
1393 __gitcomp "$c"
1394 ;;
1395 *)
1396 COMPREPLY=()
1397 ;;
1398 esac
1399}
1400
1401_git_reset ()
1402{
1403 __git_has_doubledash && return
1404
1405 local cur="${COMP_WORDS[COMP_CWORD]}"
1406 case "$cur" in
1407 --*)
1408 __gitcomp "--merge --mixed --hard --soft"
1409 return
1410 ;;
1411 esac
1412 __gitcomp "$(__git_refs)"
1413}
1414
1415_git_revert ()
1416{
1417 local cur="${COMP_WORDS[COMP_CWORD]}"
1418 case "$cur" in
1419 --*)
1420 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1421 return
1422 ;;
1423 esac
1424 __gitcomp "$(__git_refs)"
1425}
1426
1427_git_rm ()
1428{
1429 __git_has_doubledash && return
1430
1431 local cur="${COMP_WORDS[COMP_CWORD]}"
1432 case "$cur" in
1433 --*)
1434 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1435 return
1436 ;;
1437 esac
1438 COMPREPLY=()
1439}
1440
1441_git_shortlog ()
1442{
1443 __git_has_doubledash && return
1444
1445 local cur="${COMP_WORDS[COMP_CWORD]}"
1446 case "$cur" in
1447 --*)
1448 __gitcomp "
1449 --max-count= --max-age= --since= --after=
1450 --min-age= --before= --until=
1451 --no-merges
1452 --author= --committer= --grep=
1453 --all-match
1454 --not --all
1455 --numbered --summary
1456 "
1457 return
1458 ;;
1459 esac
1460 __git_complete_revlist
1461}
1462
1463_git_show ()
1464{
1465 __git_has_doubledash && return
1466
1467 local cur="${COMP_WORDS[COMP_CWORD]}"
1468 case "$cur" in
1469 --pretty=*)
1470 __gitcomp "
1471 oneline short medium full fuller email raw
1472 " "" "${cur##--pretty=}"
1473 return
1474 ;;
1475 --*)
1476 __gitcomp "--pretty="
1477 return
1478 ;;
1479 esac
1480 __git_complete_file
1481}
1482
1483_git_show_branch ()
1484{
1485 local cur="${COMP_WORDS[COMP_CWORD]}"
1486 case "$cur" in
1487 --*)
1488 __gitcomp "
1489 --all --remotes --topo-order --current --more=
1490 --list --independent --merge-base --no-name
1491 --sha1-name --topics --reflog
1492 "
1493 return
1494 ;;
1495 esac
1496 __git_complete_revlist
1497}
1498
1499_git_stash ()
1500{
1501 local subcommands='save list show apply clear drop pop create branch'
1502 local subcommand="$(__git_find_subcommand "$subcommands")"
1503 if [ -z "$subcommand" ]; then
1504 __gitcomp "$subcommands"
1505 else
1506 local cur="${COMP_WORDS[COMP_CWORD]}"
1507 case "$subcommand,$cur" in
1508 save,--*)
1509 __gitcomp "--keep-index"
1510 ;;
1511 apply,--*)
1512 __gitcomp "--index"
1513 ;;
1514 show,--*|drop,--*|pop,--*|branch,--*)
1515 COMPREPLY=()
1516 ;;
1517 show,*|apply,*|drop,*|pop,*|branch,*)
1518 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1519 | sed -n -e 's/:.*//p')"
1520 ;;
1521 *)
1522 COMPREPLY=()
1523 ;;
1524 esac
1525 fi
1526}
1527
1528_git_submodule ()
1529{
1530 __git_has_doubledash && return
1531
1532 local subcommands="add status init update summary foreach sync"
1533 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1534 local cur="${COMP_WORDS[COMP_CWORD]}"
1535 case "$cur" in
1536 --*)
1537 __gitcomp "--quiet --cached"
1538 ;;
1539 *)
1540 __gitcomp "$subcommands"
1541 ;;
1542 esac
1543 return
1544 fi
1545}
1546
1547_git_svn ()
1548{
1549 local subcommands="
1550 init fetch clone rebase dcommit log find-rev
1551 set-tree commit-diff info create-ignore propget
1552 proplist show-ignore show-externals
1553 "
1554 local subcommand="$(__git_find_subcommand "$subcommands")"
1555 if [ -z "$subcommand" ]; then
1556 __gitcomp "$subcommands"
1557 else
1558 local remote_opts="--username= --config-dir= --no-auth-cache"
1559 local fc_opts="
1560 --follow-parent --authors-file= --repack=
1561 --no-metadata --use-svm-props --use-svnsync-props
1562 --log-window-size= --no-checkout --quiet
1563 --repack-flags --user-log-author $remote_opts
1564 "
1565 local init_opts="
1566 --template= --shared= --trunk= --tags=
1567 --branches= --stdlayout --minimize-url
1568 --no-metadata --use-svm-props --use-svnsync-props
1569 --rewrite-root= $remote_opts
1570 "
1571 local cmt_opts="
1572 --edit --rmdir --find-copies-harder --copy-similarity=
1573 "
1574
1575 local cur="${COMP_WORDS[COMP_CWORD]}"
1576 case "$subcommand,$cur" in
1577 fetch,--*)
1578 __gitcomp "--revision= --fetch-all $fc_opts"
1579 ;;
1580 clone,--*)
1581 __gitcomp "--revision= $fc_opts $init_opts"
1582 ;;
1583 init,--*)
1584 __gitcomp "$init_opts"
1585 ;;
1586 dcommit,--*)
1587 __gitcomp "
1588 --merge --strategy= --verbose --dry-run
1589 --fetch-all --no-rebase $cmt_opts $fc_opts
1590 "
1591 ;;
1592 set-tree,--*)
1593 __gitcomp "--stdin $cmt_opts $fc_opts"
1594 ;;
1595 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1596 show-externals,--*)
1597 __gitcomp "--revision="
1598 ;;
1599 log,--*)
1600 __gitcomp "
1601 --limit= --revision= --verbose --incremental
1602 --oneline --show-commit --non-recursive
1603 --authors-file=
1604 "
1605 ;;
1606 rebase,--*)
1607 __gitcomp "
1608 --merge --verbose --strategy= --local
1609 --fetch-all $fc_opts
1610 "
1611 ;;
1612 commit-diff,--*)
1613 __gitcomp "--message= --file= --revision= $cmt_opts"
1614 ;;
1615 info,--*)
1616 __gitcomp "--url"
1617 ;;
1618 *)
1619 COMPREPLY=()
1620 ;;
1621 esac
1622 fi
1623}
1624
1625_git_tag ()
1626{
1627 local i c=1 f=0
1628 while [ $c -lt $COMP_CWORD ]; do
1629 i="${COMP_WORDS[c]}"
1630 case "$i" in
1631 -d|-v)
1632 __gitcomp "$(__git_tags)"
1633 return
1634 ;;
1635 -f)
1636 f=1
1637 ;;
1638 esac
1639 c=$((++c))
1640 done
1641
1642 case "${COMP_WORDS[COMP_CWORD-1]}" in
1643 -m|-F)
1644 COMPREPLY=()
1645 ;;
1646 -*|tag)
1647 if [ $f = 1 ]; then
1648 __gitcomp "$(__git_tags)"
1649 else
1650 COMPREPLY=()
1651 fi
1652 ;;
1653 *)
1654 __gitcomp "$(__git_refs)"
1655 ;;
1656 esac
1657}
1658
1659_git ()
1660{
1661 local i c=1 command __git_dir
1662
1663 while [ $c -lt $COMP_CWORD ]; do
1664 i="${COMP_WORDS[c]}"
1665 case "$i" in
1666 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1667 --bare) __git_dir="." ;;
1668 --version|-p|--paginate) ;;
1669 --help) command="help"; break ;;
1670 *) command="$i"; break ;;
1671 esac
1672 c=$((++c))
1673 done
1674
1675 if [ -z "$command" ]; then
1676 case "${COMP_WORDS[COMP_CWORD]}" in
1677 --*=*) COMPREPLY=() ;;
1678 --*) __gitcomp "
1679 --paginate
1680 --no-pager
1681 --git-dir=
1682 --bare
1683 --version
1684 --exec-path
1685 --work-tree=
1686 --help
1687 "
1688 ;;
1689 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1690 esac
1691 return
1692 fi
1693
1694 local expansion=$(__git_aliased_command "$command")
1695 [ "$expansion" ] && command="$expansion"
1696
1697 case "$command" in
1698 am) _git_am ;;
1699 add) _git_add ;;
1700 apply) _git_apply ;;
1701 archive) _git_archive ;;
1702 bisect) _git_bisect ;;
1703 bundle) _git_bundle ;;
1704 branch) _git_branch ;;
1705 checkout) _git_checkout ;;
1706 cherry) _git_cherry ;;
1707 cherry-pick) _git_cherry_pick ;;
1708 clean) _git_clean ;;
1709 clone) _git_clone ;;
1710 commit) _git_commit ;;
1711 config) _git_config ;;
1712 describe) _git_describe ;;
1713 diff) _git_diff ;;
1714 fetch) _git_fetch ;;
1715 format-patch) _git_format_patch ;;
1716 gc) _git_gc ;;
1717 grep) _git_grep ;;
1718 help) _git_help ;;
1719 init) _git_init ;;
1720 log) _git_log ;;
1721 ls-files) _git_ls_files ;;
1722 ls-remote) _git_ls_remote ;;
1723 ls-tree) _git_ls_tree ;;
1724 merge) _git_merge;;
1725 mergetool) _git_mergetool;;
1726 merge-base) _git_merge_base ;;
1727 mv) _git_mv ;;
1728 name-rev) _git_name_rev ;;
1729 pull) _git_pull ;;
1730 push) _git_push ;;
1731 rebase) _git_rebase ;;
1732 remote) _git_remote ;;
1733 reset) _git_reset ;;
1734 revert) _git_revert ;;
1735 rm) _git_rm ;;
1736 send-email) _git_send_email ;;
1737 shortlog) _git_shortlog ;;
1738 show) _git_show ;;
1739 show-branch) _git_show_branch ;;
1740 stash) _git_stash ;;
1741 submodule) _git_submodule ;;
1742 svn) _git_svn ;;
1743 tag) _git_tag ;;
1744 whatchanged) _git_log ;;
1745 *) COMPREPLY=() ;;
1746 esac
1747}
1748
1749_gitk ()
1750{
1751 __git_has_doubledash && return
1752
1753 local cur="${COMP_WORDS[COMP_CWORD]}"
1754 local g="$(git rev-parse --git-dir 2>/dev/null)"
1755 local merge=""
1756 if [ -f $g/MERGE_HEAD ]; then
1757 merge="--merge"
1758 fi
1759 case "$cur" in
1760 --*)
1761 __gitcomp "--not --all $merge"
1762 return
1763 ;;
1764 esac
1765 __git_complete_revlist
1766}
1767
1768complete -o default -o nospace -F _git git
1769complete -o default -o nospace -F _gitk gitk
1770
1771# The following are necessary only for Cygwin, and only are needed
1772# when the user has tab-completed the executable name and consequently
1773# included the '.exe' suffix.
1774#
1775if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1776complete -o default -o nospace -F _git git.exe
1777fi