Merge branch 'sp/maint-bash-completion-optim'
[git/dscho.git] / contrib / completion / git-completion.bash
blob37f52d5395daf5791917aa4c4a3b1dc45114b69a
2 # bash completion support for core Git.
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.
8 # The contained completion routines provide support for completing:
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
17 # To use these routines:
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
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.
29 # 4) Consider changing your PS1 to also show the current branch:
30 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
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.
36 # To submit patches:
38 # *) Read Documentation/SubmittingPatches
39 # *) Send all patches to the current maintainer:
41 # "Shawn O. Pearce" <spearce@spearce.org>
43 # *) Always CC the Git mailing list:
45 # git@vger.kernel.org
48 case "$COMP_WORDBREAKS" in
49 *:*) : great ;;
50 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
51 esac
53 __gitdir ()
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
63 elif [ -d "$1/.git" ]; then
64 echo "$1/.git"
65 else
66 echo "$1"
70 __git_ps1 ()
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/../.dotest" ]
77 then
78 if test -f "$g/../.dotest/rebasing"
79 then
80 r="|REBASE"
81 elif test -f "$g/../.dotest/applying"
82 then
83 r="|AM"
84 else
85 r="|AM/REBASE"
87 b="$(git symbolic-ref HEAD 2>/dev/null)"
88 elif [ -f "$g/.dotest-merge/interactive" ]
89 then
90 r="|REBASE-i"
91 b="$(cat "$g/.dotest-merge/head-name")"
92 elif [ -d "$g/.dotest-merge" ]
93 then
94 r="|REBASE-m"
95 b="$(cat "$g/.dotest-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"
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")..."
114 if [ -n "$1" ]; then
115 printf "$1" "${b##refs/heads/}$r"
116 else
117 printf " (%s)" "${b##refs/heads/}$r"
122 __gitcomp_1 ()
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
134 __gitcomp ()
136 local cur="${COMP_WORDS[COMP_CWORD]}"
137 if [ $# -gt 2 ]; then
138 cur="$3"
140 case "$cur" in
141 --*=)
142 COMPREPLY=()
145 local IFS=$'\n'
146 COMPREPLY=($(compgen -P "$2" \
147 -W "$(__gitcomp_1 "$1" "$4")" \
148 -- "$cur"))
150 esac
153 __git_heads ()
155 local cmd i is_hash=y dir="$(__gitdir "$1")"
156 if [ -d "$dir" ]; then
157 for i in $(git --git-dir="$dir" \
158 for-each-ref --format='%(refname)' \
159 refs/heads ); do
160 echo "${i#refs/heads/}"
161 done
162 return
164 for i in $(git ls-remote "$1" 2>/dev/null); do
165 case "$is_hash,$i" in
166 y,*) is_hash=n ;;
167 n,*^{}) is_hash=y ;;
168 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
169 n,*) is_hash=y; echo "$i" ;;
170 esac
171 done
174 __git_tags ()
176 local cmd i is_hash=y dir="$(__gitdir "$1")"
177 if [ -d "$dir" ]; then
178 for i in $(git --git-dir="$dir" \
179 for-each-ref --format='%(refname)' \
180 refs/tags ); do
181 echo "${i#refs/tags/}"
182 done
183 return
185 for i in $(git ls-remote "$1" 2>/dev/null); do
186 case "$is_hash,$i" in
187 y,*) is_hash=n ;;
188 n,*^{}) is_hash=y ;;
189 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
190 n,*) is_hash=y; echo "$i" ;;
191 esac
192 done
195 __git_refs ()
197 local cmd i is_hash=y dir="$(__gitdir "$1")"
198 if [ -d "$dir" ]; then
199 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
200 for i in $(git --git-dir="$dir" \
201 for-each-ref --format='%(refname)' \
202 refs/tags refs/heads refs/remotes); do
203 case "$i" in
204 refs/tags/*) echo "${i#refs/tags/}" ;;
205 refs/heads/*) echo "${i#refs/heads/}" ;;
206 refs/remotes/*) echo "${i#refs/remotes/}" ;;
207 *) echo "$i" ;;
208 esac
209 done
210 return
212 for i in $(git ls-remote "$dir" 2>/dev/null); do
213 case "$is_hash,$i" in
214 y,*) is_hash=n ;;
215 n,*^{}) is_hash=y ;;
216 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
217 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
218 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
219 n,*) is_hash=y; echo "$i" ;;
220 esac
221 done
224 __git_refs2 ()
226 local i
227 for i in $(__git_refs "$1"); do
228 echo "$i:$i"
229 done
232 __git_refs_remotes ()
234 local cmd i is_hash=y
235 for i in $(git ls-remote "$1" 2>/dev/null); do
236 case "$is_hash,$i" in
237 n,refs/heads/*)
238 is_hash=y
239 echo "$i:refs/remotes/$1/${i#refs/heads/}"
241 y,*) is_hash=n ;;
242 n,*^{}) is_hash=y ;;
243 n,refs/tags/*) is_hash=y;;
244 n,*) is_hash=y; ;;
245 esac
246 done
249 __git_remotes ()
251 local i ngoff IFS=$'\n' d="$(__gitdir)"
252 shopt -q nullglob || ngoff=1
253 shopt -s nullglob
254 for i in "$d/remotes"/*; do
255 echo ${i#$d/remotes/}
256 done
257 [ "$ngoff" ] && shopt -u nullglob
258 for i in $(git --git-dir="$d" config --list); do
259 case "$i" in
260 remote.*.url=*)
261 i="${i#remote.}"
262 echo "${i/.url=*/}"
264 esac
265 done
268 __git_merge_strategies ()
270 if [ -n "$__git_merge_strategylist" ]; then
271 echo "$__git_merge_strategylist"
272 return
274 sed -n "/^all_strategies='/{
275 s/^all_strategies='//
276 s/'//
279 }" "$(git --exec-path)/git-merge"
281 __git_merge_strategylist=
282 __git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
284 __git_complete_file ()
286 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
287 case "$cur" in
288 ?*:*)
289 ref="${cur%%:*}"
290 cur="${cur#*:}"
291 case "$cur" in
292 ?*/*)
293 pfx="${cur%/*}"
294 cur="${cur##*/}"
295 ls="$ref:$pfx"
296 pfx="$pfx/"
299 ls="$ref"
301 esac
303 case "$COMP_WORDBREAKS" in
304 *:*) : great ;;
305 *) pfx="$ref:$pfx" ;;
306 esac
308 local IFS=$'\n'
309 COMPREPLY=($(compgen -P "$pfx" \
310 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
311 | sed '/^100... blob /{
312 s,^.* ,,
313 s,$, ,
315 /^120000 blob /{
316 s,^.* ,,
317 s,$, ,
319 /^040000 tree /{
320 s,^.* ,,
321 s,$,/,
323 s/^.* //')" \
324 -- "$cur"))
327 __gitcomp "$(__git_refs)"
329 esac
332 __git_complete_revlist ()
334 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
335 case "$cur" in
336 *...*)
337 pfx="${cur%...*}..."
338 cur="${cur#*...}"
339 __gitcomp "$(__git_refs)" "$pfx" "$cur"
341 *..*)
342 pfx="${cur%..*}.."
343 cur="${cur#*..}"
344 __gitcomp "$(__git_refs)" "$pfx" "$cur"
347 __gitcomp "$(__git_refs)"
349 esac
352 __git_commands ()
354 if [ -n "$__git_commandlist" ]; then
355 echo "$__git_commandlist"
356 return
358 local i IFS=" "$'\n'
359 for i in $(git help -a|egrep '^ ')
361 case $i in
362 *--*) : helper pattern;;
363 applymbox) : ask gittus;;
364 applypatch) : ask gittus;;
365 archimport) : import;;
366 cat-file) : plumbing;;
367 check-attr) : plumbing;;
368 check-ref-format) : plumbing;;
369 commit-tree) : plumbing;;
370 cvsexportcommit) : export;;
371 cvsimport) : import;;
372 cvsserver) : daemon;;
373 daemon) : daemon;;
374 diff-files) : plumbing;;
375 diff-index) : plumbing;;
376 diff-tree) : plumbing;;
377 fast-import) : import;;
378 fsck-objects) : plumbing;;
379 fetch-pack) : plumbing;;
380 fmt-merge-msg) : plumbing;;
381 for-each-ref) : plumbing;;
382 hash-object) : plumbing;;
383 http-*) : transport;;
384 index-pack) : plumbing;;
385 init-db) : deprecated;;
386 local-fetch) : plumbing;;
387 mailinfo) : plumbing;;
388 mailsplit) : plumbing;;
389 merge-*) : plumbing;;
390 mktree) : plumbing;;
391 mktag) : plumbing;;
392 pack-objects) : plumbing;;
393 pack-redundant) : plumbing;;
394 pack-refs) : plumbing;;
395 parse-remote) : plumbing;;
396 patch-id) : plumbing;;
397 peek-remote) : plumbing;;
398 prune) : plumbing;;
399 prune-packed) : plumbing;;
400 quiltimport) : import;;
401 read-tree) : plumbing;;
402 receive-pack) : plumbing;;
403 reflog) : plumbing;;
404 repo-config) : deprecated;;
405 rerere) : plumbing;;
406 rev-list) : plumbing;;
407 rev-parse) : plumbing;;
408 runstatus) : plumbing;;
409 sh-setup) : internal;;
410 shell) : daemon;;
411 send-pack) : plumbing;;
412 show-index) : plumbing;;
413 ssh-*) : transport;;
414 stripspace) : plumbing;;
415 symbolic-ref) : plumbing;;
416 tar-tree) : deprecated;;
417 unpack-file) : plumbing;;
418 unpack-objects) : plumbing;;
419 update-index) : plumbing;;
420 update-ref) : plumbing;;
421 update-server-info) : daemon;;
422 upload-archive) : plumbing;;
423 upload-pack) : plumbing;;
424 write-tree) : plumbing;;
425 verify-tag) : plumbing;;
426 *) echo $i;;
427 esac
428 done
430 __git_commandlist=
431 __git_commandlist="$(__git_commands 2>/dev/null)"
433 __git_aliases ()
435 local i IFS=$'\n'
436 for i in $(git --git-dir="$(__gitdir)" config --list); do
437 case "$i" in
438 alias.*)
439 i="${i#alias.}"
440 echo "${i/=*/}"
442 esac
443 done
446 __git_aliased_command ()
448 local word cmdline=$(git --git-dir="$(__gitdir)" \
449 config --get "alias.$1")
450 for word in $cmdline; do
451 if [ "${word##-*}" ]; then
452 echo $word
453 return
455 done
458 __git_find_subcommand ()
460 local word subcommand c=1
462 while [ $c -lt $COMP_CWORD ]; do
463 word="${COMP_WORDS[c]}"
464 for subcommand in $1; do
465 if [ "$subcommand" = "$word" ]; then
466 echo "$subcommand"
467 return
469 done
470 c=$((++c))
471 done
474 __git_has_doubledash ()
476 local c=1
477 while [ $c -lt $COMP_CWORD ]; do
478 if [ "--" = "${COMP_WORDS[c]}" ]; then
479 return 0
481 c=$((++c))
482 done
483 return 1
486 __git_whitespacelist="nowarn warn error error-all strip"
488 _git_am ()
490 local cur="${COMP_WORDS[COMP_CWORD]}"
491 if [ -d .dotest ]; then
492 __gitcomp "--skip --resolved"
493 return
495 case "$cur" in
496 --whitespace=*)
497 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
498 return
500 --*)
501 __gitcomp "
502 --signoff --utf8 --binary --3way --interactive
503 --whitespace=
505 return
506 esac
507 COMPREPLY=()
510 _git_apply ()
512 local cur="${COMP_WORDS[COMP_CWORD]}"
513 case "$cur" in
514 --whitespace=*)
515 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
516 return
518 --*)
519 __gitcomp "
520 --stat --numstat --summary --check --index
521 --cached --index-info --reverse --reject --unidiff-zero
522 --apply --no-add --exclude=
523 --whitespace= --inaccurate-eof --verbose
525 return
526 esac
527 COMPREPLY=()
530 _git_add ()
532 __git_has_doubledash && return
534 local cur="${COMP_WORDS[COMP_CWORD]}"
535 case "$cur" in
536 --*)
537 __gitcomp "
538 --interactive --refresh --patch --update --dry-run
539 --ignore-errors
541 return
542 esac
543 COMPREPLY=()
546 _git_bisect ()
548 __git_has_doubledash && return
550 local subcommands="start bad good skip reset visualize replay log run"
551 local subcommand="$(__git_find_subcommand "$subcommands")"
552 if [ -z "$subcommand" ]; then
553 __gitcomp "$subcommands"
554 return
557 case "$subcommand" in
558 bad|good|reset|skip)
559 __gitcomp "$(__git_refs)"
562 COMPREPLY=()
564 esac
567 _git_branch ()
569 local i c=1 only_local_ref="n" has_r="n"
571 while [ $c -lt $COMP_CWORD ]; do
572 i="${COMP_WORDS[c]}"
573 case "$i" in
574 -d|-m) only_local_ref="y" ;;
575 -r) has_r="y" ;;
576 esac
577 c=$((++c))
578 done
580 case "${COMP_WORDS[COMP_CWORD]}" in
581 --*=*) COMPREPLY=() ;;
582 --*)
583 __gitcomp "
584 --color --no-color --verbose --abbrev= --no-abbrev
585 --track --no-track --contains --merged --no-merged
589 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
590 __gitcomp "$(__git_heads)"
591 else
592 __gitcomp "$(__git_refs)"
595 esac
598 _git_bundle ()
600 local mycword="$COMP_CWORD"
601 case "${COMP_WORDS[0]}" in
602 git)
603 local cmd="${COMP_WORDS[2]}"
604 mycword="$((mycword-1))"
606 git-bundle*)
607 local cmd="${COMP_WORDS[1]}"
609 esac
610 case "$mycword" in
612 __gitcomp "create list-heads verify unbundle"
615 # looking for a file
618 case "$cmd" in
619 create)
620 __git_complete_revlist
622 esac
624 esac
627 _git_checkout ()
629 __gitcomp "$(__git_refs)"
632 _git_cherry ()
634 __gitcomp "$(__git_refs)"
637 _git_cherry_pick ()
639 local cur="${COMP_WORDS[COMP_CWORD]}"
640 case "$cur" in
641 --*)
642 __gitcomp "--edit --no-commit"
645 __gitcomp "$(__git_refs)"
647 esac
650 _git_commit ()
652 __git_has_doubledash && return
654 local cur="${COMP_WORDS[COMP_CWORD]}"
655 case "$cur" in
656 --*)
657 __gitcomp "
658 --all --author= --signoff --verify --no-verify
659 --edit --amend --include --only
661 return
662 esac
663 COMPREPLY=()
666 _git_describe ()
668 __gitcomp "$(__git_refs)"
671 _git_diff ()
673 __git_has_doubledash && return
675 local cur="${COMP_WORDS[COMP_CWORD]}"
676 case "$cur" in
677 --*)
678 __gitcomp "--cached --stat --numstat --shortstat --summary
679 --patch-with-stat --name-only --name-status --color
680 --no-color --color-words --no-renames --check
681 --full-index --binary --abbrev --diff-filter
682 --find-copies-harder --pickaxe-all --pickaxe-regex
683 --text --ignore-space-at-eol --ignore-space-change
684 --ignore-all-space --exit-code --quiet --ext-diff
685 --no-ext-diff
686 --no-prefix --src-prefix= --dst-prefix=
687 --base --ours --theirs
689 return
691 esac
692 __git_complete_file
695 _git_diff_tree ()
697 __gitcomp "$(__git_refs)"
700 _git_fetch ()
702 local cur="${COMP_WORDS[COMP_CWORD]}"
704 case "${COMP_WORDS[0]},$COMP_CWORD" in
705 git-fetch*,1)
706 __gitcomp "$(__git_remotes)"
708 git,2)
709 __gitcomp "$(__git_remotes)"
712 case "$cur" in
713 *:*)
714 local pfx=""
715 case "$COMP_WORDBREAKS" in
716 *:*) : great ;;
717 *) pfx="${cur%%:*}:" ;;
718 esac
719 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
722 local remote
723 case "${COMP_WORDS[0]}" in
724 git-fetch) remote="${COMP_WORDS[1]}" ;;
725 git) remote="${COMP_WORDS[2]}" ;;
726 esac
727 __gitcomp "$(__git_refs2 "$remote")"
729 esac
731 esac
734 _git_format_patch ()
736 local cur="${COMP_WORDS[COMP_CWORD]}"
737 case "$cur" in
738 --*)
739 __gitcomp "
740 --stdout --attach --thread
741 --output-directory
742 --numbered --start-number
743 --numbered-files
744 --keep-subject
745 --signoff
746 --in-reply-to=
747 --full-index --binary
748 --not --all
749 --cover-letter
750 --no-prefix --src-prefix= --dst-prefix=
752 return
754 esac
755 __git_complete_revlist
758 _git_gc ()
760 local cur="${COMP_WORDS[COMP_CWORD]}"
761 case "$cur" in
762 --*)
763 __gitcomp "--prune --aggressive"
764 return
766 esac
767 COMPREPLY=()
770 _git_ls_remote ()
772 __gitcomp "$(__git_remotes)"
775 _git_ls_tree ()
777 __git_complete_file
780 _git_log ()
782 __git_has_doubledash && return
784 local cur="${COMP_WORDS[COMP_CWORD]}"
785 case "$cur" in
786 --pretty=*)
787 __gitcomp "
788 oneline short medium full fuller email raw
789 " "" "${cur##--pretty=}"
790 return
792 --date=*)
793 __gitcomp "
794 relative iso8601 rfc2822 short local default
795 " "" "${cur##--date=}"
796 return
798 --*)
799 __gitcomp "
800 --max-count= --max-age= --since= --after=
801 --min-age= --before= --until=
802 --root --topo-order --date-order --reverse
803 --no-merges --follow
804 --abbrev-commit --abbrev=
805 --relative-date --date=
806 --author= --committer= --grep=
807 --all-match
808 --pretty= --name-status --name-only --raw
809 --not --all
810 --left-right --cherry-pick
811 --graph
812 --stat --numstat --shortstat
813 --decorate --diff-filter=
814 --color-words --walk-reflogs
816 return
818 esac
819 __git_complete_revlist
822 _git_merge ()
824 local cur="${COMP_WORDS[COMP_CWORD]}"
825 case "${COMP_WORDS[COMP_CWORD-1]}" in
826 -s|--strategy)
827 __gitcomp "$(__git_merge_strategies)"
828 return
829 esac
830 case "$cur" in
831 --strategy=*)
832 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
833 return
835 --*)
836 __gitcomp "
837 --no-commit --no-stat --log --no-log --squash --strategy
839 return
840 esac
841 __gitcomp "$(__git_refs)"
844 _git_merge_base ()
846 __gitcomp "$(__git_refs)"
849 _git_name_rev ()
851 __gitcomp "--tags --all --stdin"
854 _git_pull ()
856 local cur="${COMP_WORDS[COMP_CWORD]}"
858 case "${COMP_WORDS[0]},$COMP_CWORD" in
859 git-pull*,1)
860 __gitcomp "$(__git_remotes)"
862 git,2)
863 __gitcomp "$(__git_remotes)"
866 local remote
867 case "${COMP_WORDS[0]}" in
868 git-pull) remote="${COMP_WORDS[1]}" ;;
869 git) remote="${COMP_WORDS[2]}" ;;
870 esac
871 __gitcomp "$(__git_refs "$remote")"
873 esac
876 _git_push ()
878 local cur="${COMP_WORDS[COMP_CWORD]}"
880 case "${COMP_WORDS[0]},$COMP_CWORD" in
881 git-push*,1)
882 __gitcomp "$(__git_remotes)"
884 git,2)
885 __gitcomp "$(__git_remotes)"
888 case "$cur" in
889 *:*)
890 local remote
891 case "${COMP_WORDS[0]}" in
892 git-push) remote="${COMP_WORDS[1]}" ;;
893 git) remote="${COMP_WORDS[2]}" ;;
894 esac
896 local pfx=""
897 case "$COMP_WORDBREAKS" in
898 *:*) : great ;;
899 *) pfx="${cur%%:*}:" ;;
900 esac
902 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
905 __gitcomp "$(__git_refs)" + "${cur#+}"
908 __gitcomp "$(__git_refs)"
910 esac
912 esac
915 _git_rebase ()
917 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
918 if [ -d .dotest ] || [ -d "$dir"/.dotest-merge ]; then
919 __gitcomp "--continue --skip --abort"
920 return
922 case "${COMP_WORDS[COMP_CWORD-1]}" in
923 -s|--strategy)
924 __gitcomp "$(__git_merge_strategies)"
925 return
926 esac
927 case "$cur" in
928 --strategy=*)
929 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
930 return
932 --*)
933 __gitcomp "--onto --merge --strategy --interactive"
934 return
935 esac
936 __gitcomp "$(__git_refs)"
939 _git_send_email ()
941 local cur="${COMP_WORDS[COMP_CWORD]}"
942 case "$cur" in
943 --*)
944 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
945 --dry-run --envelope-sender --from --identity
946 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
947 --no-suppress-from --no-thread --quiet
948 --signed-off-by-cc --smtp-pass --smtp-server
949 --smtp-server-port --smtp-ssl --smtp-user --subject
950 --suppress-cc --suppress-from --thread --to"
951 return
953 esac
954 COMPREPLY=()
957 _git_config ()
959 local cur="${COMP_WORDS[COMP_CWORD]}"
960 local prv="${COMP_WORDS[COMP_CWORD-1]}"
961 case "$prv" in
962 branch.*.remote)
963 __gitcomp "$(__git_remotes)"
964 return
966 branch.*.merge)
967 __gitcomp "$(__git_refs)"
968 return
970 remote.*.fetch)
971 local remote="${prv#remote.}"
972 remote="${remote%.fetch}"
973 __gitcomp "$(__git_refs_remotes "$remote")"
974 return
976 remote.*.push)
977 local remote="${prv#remote.}"
978 remote="${remote%.push}"
979 __gitcomp "$(git --git-dir="$(__gitdir)" \
980 for-each-ref --format='%(refname):%(refname)' \
981 refs/heads)"
982 return
984 pull.twohead|pull.octopus)
985 __gitcomp "$(__git_merge_strategies)"
986 return
988 color.branch|color.diff|color.status)
989 __gitcomp "always never auto"
990 return
992 color.*.*)
993 __gitcomp "
994 black red green yellow blue magenta cyan white
995 bold dim ul blink reverse
997 return
999 *.*)
1000 COMPREPLY=()
1001 return
1003 esac
1004 case "$cur" in
1005 --*)
1006 __gitcomp "
1007 --global --system --file=
1008 --list --replace-all
1009 --get --get-all --get-regexp
1010 --add --unset --unset-all
1011 --remove-section --rename-section
1013 return
1015 branch.*.*)
1016 local pfx="${cur%.*}."
1017 cur="${cur##*.}"
1018 __gitcomp "remote merge" "$pfx" "$cur"
1019 return
1021 branch.*)
1022 local pfx="${cur%.*}."
1023 cur="${cur#*.}"
1024 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1025 return
1027 remote.*.*)
1028 local pfx="${cur%.*}."
1029 cur="${cur##*.}"
1030 __gitcomp "
1031 url fetch push skipDefaultUpdate
1032 receivepack uploadpack tagopt
1033 " "$pfx" "$cur"
1034 return
1036 remote.*)
1037 local pfx="${cur%.*}."
1038 cur="${cur#*.}"
1039 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1040 return
1042 esac
1043 __gitcomp "
1044 apply.whitespace
1045 core.fileMode
1046 core.gitProxy
1047 core.ignoreStat
1048 core.preferSymlinkRefs
1049 core.logAllRefUpdates
1050 core.loosecompression
1051 core.repositoryFormatVersion
1052 core.sharedRepository
1053 core.warnAmbiguousRefs
1054 core.compression
1055 core.packedGitWindowSize
1056 core.packedGitLimit
1057 clean.requireForce
1058 color.branch
1059 color.branch.current
1060 color.branch.local
1061 color.branch.remote
1062 color.branch.plain
1063 color.diff
1064 color.diff.plain
1065 color.diff.meta
1066 color.diff.frag
1067 color.diff.old
1068 color.diff.new
1069 color.diff.commit
1070 color.diff.whitespace
1071 color.pager
1072 color.status
1073 color.status.header
1074 color.status.added
1075 color.status.changed
1076 color.status.untracked
1077 diff.renameLimit
1078 diff.renames
1079 fetch.unpackLimit
1080 format.headers
1081 format.subjectprefix
1082 gitcvs.enabled
1083 gitcvs.logfile
1084 gitcvs.allbinary
1085 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1086 gitcvs.dbtablenameprefix
1087 gc.packrefs
1088 gc.reflogexpire
1089 gc.reflogexpireunreachable
1090 gc.rerereresolved
1091 gc.rerereunresolved
1092 http.sslVerify
1093 http.sslCert
1094 http.sslKey
1095 http.sslCAInfo
1096 http.sslCAPath
1097 http.maxRequests
1098 http.lowSpeedLimit
1099 http.lowSpeedTime
1100 http.noEPSV
1101 i18n.commitEncoding
1102 i18n.logOutputEncoding
1103 log.showroot
1104 merge.tool
1105 merge.summary
1106 merge.verbosity
1107 pack.window
1108 pack.depth
1109 pack.windowMemory
1110 pack.compression
1111 pack.deltaCacheSize
1112 pack.deltaCacheLimit
1113 pull.octopus
1114 pull.twohead
1115 repack.useDeltaBaseOffset
1116 showbranch.default
1117 tar.umask
1118 transfer.unpackLimit
1119 receive.unpackLimit
1120 receive.denyNonFastForwards
1121 user.name
1122 user.email
1123 user.signingkey
1124 branch. remote.
1128 _git_remote ()
1130 local subcommands="add rm show prune update"
1131 local subcommand="$(__git_find_subcommand "$subcommands")"
1132 if [ -z "$subcommand" ]; then
1133 __gitcomp "$subcommands"
1134 return
1137 case "$subcommand" in
1138 rm|show|prune)
1139 __gitcomp "$(__git_remotes)"
1141 update)
1142 local i c='' IFS=$'\n'
1143 for i in $(git --git-dir="$(__gitdir)" config --list); do
1144 case "$i" in
1145 remotes.*)
1146 i="${i#remotes.}"
1147 c="$c ${i/=*/}"
1149 esac
1150 done
1151 __gitcomp "$c"
1154 COMPREPLY=()
1156 esac
1159 _git_reset ()
1161 __git_has_doubledash && return
1163 local cur="${COMP_WORDS[COMP_CWORD]}"
1164 case "$cur" in
1165 --*)
1166 __gitcomp "--mixed --hard --soft"
1167 return
1169 esac
1170 __gitcomp "$(__git_refs)"
1173 _git_shortlog ()
1175 __git_has_doubledash && return
1177 local cur="${COMP_WORDS[COMP_CWORD]}"
1178 case "$cur" in
1179 --*)
1180 __gitcomp "
1181 --max-count= --max-age= --since= --after=
1182 --min-age= --before= --until=
1183 --no-merges
1184 --author= --committer= --grep=
1185 --all-match
1186 --not --all
1187 --numbered --summary
1189 return
1191 esac
1192 __git_complete_revlist
1195 _git_show ()
1197 local cur="${COMP_WORDS[COMP_CWORD]}"
1198 case "$cur" in
1199 --pretty=*)
1200 __gitcomp "
1201 oneline short medium full fuller email raw
1202 " "" "${cur##--pretty=}"
1203 return
1205 --*)
1206 __gitcomp "--pretty="
1207 return
1209 esac
1210 __git_complete_file
1213 _git_stash ()
1215 local subcommands='save list show apply clear drop pop create'
1216 local subcommand="$(__git_find_subcommand "$subcommands")"
1217 if [ -z "$subcommand" ]; then
1218 __gitcomp "$subcommands"
1219 else
1220 local cur="${COMP_WORDS[COMP_CWORD]}"
1221 case "$subcommand,$cur" in
1222 save,--*)
1223 __gitcomp "--keep-index"
1226 COMPREPLY=()
1228 esac
1232 _git_submodule ()
1234 __git_has_doubledash && return
1236 local subcommands="add status init update"
1237 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1238 local cur="${COMP_WORDS[COMP_CWORD]}"
1239 case "$cur" in
1240 --*)
1241 __gitcomp "--quiet --cached"
1244 __gitcomp "$subcommands"
1246 esac
1247 return
1251 _git_svn ()
1253 local subcommands="
1254 init fetch clone rebase dcommit log find-rev
1255 set-tree commit-diff info create-ignore propget
1256 proplist show-ignore show-externals
1258 local subcommand="$(__git_find_subcommand "$subcommands")"
1259 if [ -z "$subcommand" ]; then
1260 __gitcomp "$subcommands"
1261 else
1262 local remote_opts="--username= --config-dir= --no-auth-cache"
1263 local fc_opts="
1264 --follow-parent --authors-file= --repack=
1265 --no-metadata --use-svm-props --use-svnsync-props
1266 --log-window-size= --no-checkout --quiet
1267 --repack-flags --user-log-author $remote_opts
1269 local init_opts="
1270 --template= --shared= --trunk= --tags=
1271 --branches= --stdlayout --minimize-url
1272 --no-metadata --use-svm-props --use-svnsync-props
1273 --rewrite-root= $remote_opts
1275 local cmt_opts="
1276 --edit --rmdir --find-copies-harder --copy-similarity=
1279 local cur="${COMP_WORDS[COMP_CWORD]}"
1280 case "$subcommand,$cur" in
1281 fetch,--*)
1282 __gitcomp "--revision= --fetch-all $fc_opts"
1284 clone,--*)
1285 __gitcomp "--revision= $fc_opts $init_opts"
1287 init,--*)
1288 __gitcomp "$init_opts"
1290 dcommit,--*)
1291 __gitcomp "
1292 --merge --strategy= --verbose --dry-run
1293 --fetch-all --no-rebase $cmt_opts $fc_opts
1296 set-tree,--*)
1297 __gitcomp "--stdin $cmt_opts $fc_opts"
1299 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1300 show-externals,--*)
1301 __gitcomp "--revision="
1303 log,--*)
1304 __gitcomp "
1305 --limit= --revision= --verbose --incremental
1306 --oneline --show-commit --non-recursive
1307 --authors-file=
1310 rebase,--*)
1311 __gitcomp "
1312 --merge --verbose --strategy= --local
1313 --fetch-all $fc_opts
1316 commit-diff,--*)
1317 __gitcomp "--message= --file= --revision= $cmt_opts"
1319 info,--*)
1320 __gitcomp "--url"
1323 COMPREPLY=()
1325 esac
1329 _git_tag ()
1331 local i c=1 f=0
1332 while [ $c -lt $COMP_CWORD ]; do
1333 i="${COMP_WORDS[c]}"
1334 case "$i" in
1335 -d|-v)
1336 __gitcomp "$(__git_tags)"
1337 return
1342 esac
1343 c=$((++c))
1344 done
1346 case "${COMP_WORDS[COMP_CWORD-1]}" in
1347 -m|-F)
1348 COMPREPLY=()
1350 -*|tag|git-tag)
1351 if [ $f = 1 ]; then
1352 __gitcomp "$(__git_tags)"
1353 else
1354 COMPREPLY=()
1358 __gitcomp "$(__git_refs)"
1360 esac
1363 _git ()
1365 local i c=1 command __git_dir
1367 while [ $c -lt $COMP_CWORD ]; do
1368 i="${COMP_WORDS[c]}"
1369 case "$i" in
1370 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1371 --bare) __git_dir="." ;;
1372 --version|--help|-p|--paginate) ;;
1373 *) command="$i"; break ;;
1374 esac
1375 c=$((++c))
1376 done
1378 if [ -z "$command" ]; then
1379 case "${COMP_WORDS[COMP_CWORD]}" in
1380 --*=*) COMPREPLY=() ;;
1381 --*) __gitcomp "
1382 --paginate
1383 --no-pager
1384 --git-dir=
1385 --bare
1386 --version
1387 --exec-path
1388 --work-tree=
1389 --help
1392 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1393 esac
1394 return
1397 local expansion=$(__git_aliased_command "$command")
1398 [ "$expansion" ] && command="$expansion"
1400 case "$command" in
1401 am) _git_am ;;
1402 add) _git_add ;;
1403 apply) _git_apply ;;
1404 bisect) _git_bisect ;;
1405 bundle) _git_bundle ;;
1406 branch) _git_branch ;;
1407 checkout) _git_checkout ;;
1408 cherry) _git_cherry ;;
1409 cherry-pick) _git_cherry_pick ;;
1410 commit) _git_commit ;;
1411 config) _git_config ;;
1412 describe) _git_describe ;;
1413 diff) _git_diff ;;
1414 fetch) _git_fetch ;;
1415 format-patch) _git_format_patch ;;
1416 gc) _git_gc ;;
1417 log) _git_log ;;
1418 ls-remote) _git_ls_remote ;;
1419 ls-tree) _git_ls_tree ;;
1420 merge) _git_merge;;
1421 merge-base) _git_merge_base ;;
1422 name-rev) _git_name_rev ;;
1423 pull) _git_pull ;;
1424 push) _git_push ;;
1425 rebase) _git_rebase ;;
1426 remote) _git_remote ;;
1427 reset) _git_reset ;;
1428 send-email) _git_send_email ;;
1429 shortlog) _git_shortlog ;;
1430 show) _git_show ;;
1431 show-branch) _git_log ;;
1432 stash) _git_stash ;;
1433 submodule) _git_submodule ;;
1434 svn) _git_svn ;;
1435 tag) _git_tag ;;
1436 whatchanged) _git_log ;;
1437 *) COMPREPLY=() ;;
1438 esac
1441 _gitk ()
1443 __git_has_doubledash && return
1445 local cur="${COMP_WORDS[COMP_CWORD]}"
1446 local g="$(git rev-parse --git-dir 2>/dev/null)"
1447 local merge=""
1448 if [ -f $g/MERGE_HEAD ]; then
1449 merge="--merge"
1451 case "$cur" in
1452 --*)
1453 __gitcomp "--not --all $merge"
1454 return
1456 esac
1457 __git_complete_revlist
1460 complete -o default -o nospace -F _git git
1461 complete -o default -o nospace -F _gitk gitk
1462 complete -o default -o nospace -F _git_am git-am
1463 complete -o default -o nospace -F _git_apply git-apply
1464 complete -o default -o nospace -F _git_bisect git-bisect
1465 complete -o default -o nospace -F _git_branch git-branch
1466 complete -o default -o nospace -F _git_bundle git-bundle
1467 complete -o default -o nospace -F _git_checkout git-checkout
1468 complete -o default -o nospace -F _git_cherry git-cherry
1469 complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1470 complete -o default -o nospace -F _git_commit git-commit
1471 complete -o default -o nospace -F _git_describe git-describe
1472 complete -o default -o nospace -F _git_diff git-diff
1473 complete -o default -o nospace -F _git_fetch git-fetch
1474 complete -o default -o nospace -F _git_format_patch git-format-patch
1475 complete -o default -o nospace -F _git_gc git-gc
1476 complete -o default -o nospace -F _git_log git-log
1477 complete -o default -o nospace -F _git_ls_remote git-ls-remote
1478 complete -o default -o nospace -F _git_ls_tree git-ls-tree
1479 complete -o default -o nospace -F _git_merge git-merge
1480 complete -o default -o nospace -F _git_merge_base git-merge-base
1481 complete -o default -o nospace -F _git_name_rev git-name-rev
1482 complete -o default -o nospace -F _git_pull git-pull
1483 complete -o default -o nospace -F _git_push git-push
1484 complete -o default -o nospace -F _git_rebase git-rebase
1485 complete -o default -o nospace -F _git_config git-config
1486 complete -o default -o nospace -F _git_remote git-remote
1487 complete -o default -o nospace -F _git_reset git-reset
1488 complete -o default -o nospace -F _git_send_email git-send-email
1489 complete -o default -o nospace -F _git_shortlog git-shortlog
1490 complete -o default -o nospace -F _git_show git-show
1491 complete -o default -o nospace -F _git_stash git-stash
1492 complete -o default -o nospace -F _git_submodule git-submodule
1493 complete -o default -o nospace -F _git_svn git-svn
1494 complete -o default -o nospace -F _git_log git-show-branch
1495 complete -o default -o nospace -F _git_tag git-tag
1496 complete -o default -o nospace -F _git_log git-whatchanged
1498 # The following are necessary only for Cygwin, and only are needed
1499 # when the user has tab-completed the executable name and consequently
1500 # included the '.exe' suffix.
1502 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1503 complete -o default -o nospace -F _git_add git-add.exe
1504 complete -o default -o nospace -F _git_apply git-apply.exe
1505 complete -o default -o nospace -F _git git.exe
1506 complete -o default -o nospace -F _git_branch git-branch.exe
1507 complete -o default -o nospace -F _git_bundle git-bundle.exe
1508 complete -o default -o nospace -F _git_cherry git-cherry.exe
1509 complete -o default -o nospace -F _git_describe git-describe.exe
1510 complete -o default -o nospace -F _git_diff git-diff.exe
1511 complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1512 complete -o default -o nospace -F _git_log git-log.exe
1513 complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1514 complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1515 complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1516 complete -o default -o nospace -F _git_push git-push.exe
1517 complete -o default -o nospace -F _git_config git-config
1518 complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1519 complete -o default -o nospace -F _git_show git-show.exe
1520 complete -o default -o nospace -F _git_log git-show-branch.exe
1521 complete -o default -o nospace -F _git_tag git-tag.exe
1522 complete -o default -o nospace -F _git_log git-whatchanged.exe