bash: refactor searching for subcommands on the command line
[git/platforms/storm.git] / contrib / completion / git-completion.bash
blob438e193bd0de7506bf3d8b286f655acb97a776bc
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 __gitdir ()
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
58 elif [ -d "$1/.git" ]; then
59 echo "$1/.git"
60 else
61 echo "$1"
65 __git_ps1 ()
67 local g="$(git rev-parse --git-dir 2>/dev/null)"
68 if [ -n "$g" ]; then
69 local r
70 local b
71 if [ -d "$g/../.dotest" ]
72 then
73 if test -f "$g/../.dotest/rebasing"
74 then
75 r="|REBASE"
76 elif test -f "$g/../.dotest/applying"
77 then
78 r="|AM"
79 else
80 r="|AM/REBASE"
82 b="$(git symbolic-ref HEAD 2>/dev/null)"
83 elif [ -f "$g/.dotest-merge/interactive" ]
84 then
85 r="|REBASE-i"
86 b="$(cat "$g/.dotest-merge/head-name")"
87 elif [ -d "$g/.dotest-merge" ]
88 then
89 r="|REBASE-m"
90 b="$(cat "$g/.dotest-merge/head-name")"
91 elif [ -f "$g/MERGE_HEAD" ]
92 then
93 r="|MERGING"
94 b="$(git symbolic-ref HEAD 2>/dev/null)"
95 else
96 if [ -f "$g/BISECT_LOG" ]
97 then
98 r="|BISECTING"
100 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
101 then
102 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
103 then
104 b="$(cut -c1-7 "$g/HEAD")..."
109 if [ -n "$1" ]; then
110 printf "$1" "${b##refs/heads/}$r"
111 else
112 printf " (%s)" "${b##refs/heads/}$r"
117 __gitcomp ()
119 local all c s=$'\n' IFS=' '$'\t'$'\n'
120 local cur="${COMP_WORDS[COMP_CWORD]}"
121 if [ $# -gt 2 ]; then
122 cur="$3"
124 for c in $1; do
125 case "$c$4" in
126 --*=*) all="$all$c$4$s" ;;
127 *.) all="$all$c$4$s" ;;
128 *) all="$all$c$4 $s" ;;
129 esac
130 done
131 IFS=$s
132 COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
133 return
136 __git_heads ()
138 local cmd i is_hash=y dir="$(__gitdir "$1")"
139 if [ -d "$dir" ]; then
140 for i in $(git --git-dir="$dir" \
141 for-each-ref --format='%(refname)' \
142 refs/heads ); do
143 echo "${i#refs/heads/}"
144 done
145 return
147 for i in $(git-ls-remote "$1" 2>/dev/null); do
148 case "$is_hash,$i" in
149 y,*) is_hash=n ;;
150 n,*^{}) is_hash=y ;;
151 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
152 n,*) is_hash=y; echo "$i" ;;
153 esac
154 done
157 __git_tags ()
159 local cmd i is_hash=y dir="$(__gitdir "$1")"
160 if [ -d "$dir" ]; then
161 for i in $(git --git-dir="$dir" \
162 for-each-ref --format='%(refname)' \
163 refs/tags ); do
164 echo "${i#refs/tags/}"
165 done
166 return
168 for i in $(git-ls-remote "$1" 2>/dev/null); do
169 case "$is_hash,$i" in
170 y,*) is_hash=n ;;
171 n,*^{}) is_hash=y ;;
172 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
173 n,*) is_hash=y; echo "$i" ;;
174 esac
175 done
178 __git_refs ()
180 local cmd i is_hash=y dir="$(__gitdir "$1")"
181 if [ -d "$dir" ]; then
182 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
183 for i in $(git --git-dir="$dir" \
184 for-each-ref --format='%(refname)' \
185 refs/tags refs/heads refs/remotes); do
186 case "$i" in
187 refs/tags/*) echo "${i#refs/tags/}" ;;
188 refs/heads/*) echo "${i#refs/heads/}" ;;
189 refs/remotes/*) echo "${i#refs/remotes/}" ;;
190 *) echo "$i" ;;
191 esac
192 done
193 return
195 for i in $(git-ls-remote "$dir" 2>/dev/null); do
196 case "$is_hash,$i" in
197 y,*) is_hash=n ;;
198 n,*^{}) is_hash=y ;;
199 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
200 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
201 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
202 n,*) is_hash=y; echo "$i" ;;
203 esac
204 done
207 __git_refs2 ()
209 local i
210 for i in $(__git_refs "$1"); do
211 echo "$i:$i"
212 done
215 __git_refs_remotes ()
217 local cmd i is_hash=y
218 for i in $(git-ls-remote "$1" 2>/dev/null); do
219 case "$is_hash,$i" in
220 n,refs/heads/*)
221 is_hash=y
222 echo "$i:refs/remotes/$1/${i#refs/heads/}"
224 y,*) is_hash=n ;;
225 n,*^{}) is_hash=y ;;
226 n,refs/tags/*) is_hash=y;;
227 n,*) is_hash=y; ;;
228 esac
229 done
232 __git_remotes ()
234 local i ngoff IFS=$'\n' d="$(__gitdir)"
235 shopt -q nullglob || ngoff=1
236 shopt -s nullglob
237 for i in "$d/remotes"/*; do
238 echo ${i#$d/remotes/}
239 done
240 [ "$ngoff" ] && shopt -u nullglob
241 for i in $(git --git-dir="$d" config --list); do
242 case "$i" in
243 remote.*.url=*)
244 i="${i#remote.}"
245 echo "${i/.url=*/}"
247 esac
248 done
251 __git_merge_strategies ()
253 if [ -n "$__git_merge_strategylist" ]; then
254 echo "$__git_merge_strategylist"
255 return
257 sed -n "/^all_strategies='/{
258 s/^all_strategies='//
259 s/'//
262 }" "$(git --exec-path)/git-merge"
264 __git_merge_strategylist=
265 __git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
267 __git_complete_file ()
269 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
270 case "$cur" in
271 ?*:*)
272 ref="${cur%%:*}"
273 cur="${cur#*:}"
274 case "$cur" in
275 ?*/*)
276 pfx="${cur%/*}"
277 cur="${cur##*/}"
278 ls="$ref:$pfx"
279 pfx="$pfx/"
282 ls="$ref"
284 esac
285 COMPREPLY=($(compgen -P "$pfx" \
286 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
287 | sed '/^100... blob /s,^.* ,,
288 /^040000 tree /{
289 s,^.* ,,
290 s,$,/,
292 s/^.* //')" \
293 -- "$cur"))
296 __gitcomp "$(__git_refs)"
298 esac
301 __git_complete_revlist ()
303 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
304 case "$cur" in
305 *...*)
306 pfx="${cur%...*}..."
307 cur="${cur#*...}"
308 __gitcomp "$(__git_refs)" "$pfx" "$cur"
310 *..*)
311 pfx="${cur%..*}.."
312 cur="${cur#*..}"
313 __gitcomp "$(__git_refs)" "$pfx" "$cur"
316 __gitcomp "$cur."
319 __gitcomp "$(__git_refs)"
321 esac
324 __git_commands ()
326 if [ -n "$__git_commandlist" ]; then
327 echo "$__git_commandlist"
328 return
330 local i IFS=" "$'\n'
331 for i in $(git help -a|egrep '^ ')
333 case $i in
334 *--*) : helper pattern;;
335 applymbox) : ask gittus;;
336 applypatch) : ask gittus;;
337 archimport) : import;;
338 cat-file) : plumbing;;
339 check-attr) : plumbing;;
340 check-ref-format) : plumbing;;
341 commit-tree) : plumbing;;
342 cvsexportcommit) : export;;
343 cvsimport) : import;;
344 cvsserver) : daemon;;
345 daemon) : daemon;;
346 diff-files) : plumbing;;
347 diff-index) : plumbing;;
348 diff-tree) : plumbing;;
349 fast-import) : import;;
350 fsck-objects) : plumbing;;
351 fetch-pack) : plumbing;;
352 fmt-merge-msg) : plumbing;;
353 for-each-ref) : plumbing;;
354 hash-object) : plumbing;;
355 http-*) : transport;;
356 index-pack) : plumbing;;
357 init-db) : deprecated;;
358 local-fetch) : plumbing;;
359 mailinfo) : plumbing;;
360 mailsplit) : plumbing;;
361 merge-*) : plumbing;;
362 mktree) : plumbing;;
363 mktag) : plumbing;;
364 pack-objects) : plumbing;;
365 pack-redundant) : plumbing;;
366 pack-refs) : plumbing;;
367 parse-remote) : plumbing;;
368 patch-id) : plumbing;;
369 peek-remote) : plumbing;;
370 prune) : plumbing;;
371 prune-packed) : plumbing;;
372 quiltimport) : import;;
373 read-tree) : plumbing;;
374 receive-pack) : plumbing;;
375 reflog) : plumbing;;
376 repo-config) : deprecated;;
377 rerere) : plumbing;;
378 rev-list) : plumbing;;
379 rev-parse) : plumbing;;
380 runstatus) : plumbing;;
381 sh-setup) : internal;;
382 shell) : daemon;;
383 send-pack) : plumbing;;
384 show-index) : plumbing;;
385 ssh-*) : transport;;
386 stripspace) : plumbing;;
387 svn) : import export;;
388 symbolic-ref) : plumbing;;
389 tar-tree) : deprecated;;
390 unpack-file) : plumbing;;
391 unpack-objects) : plumbing;;
392 update-index) : plumbing;;
393 update-ref) : plumbing;;
394 update-server-info) : daemon;;
395 upload-archive) : plumbing;;
396 upload-pack) : plumbing;;
397 write-tree) : plumbing;;
398 verify-tag) : plumbing;;
399 *) echo $i;;
400 esac
401 done
403 __git_commandlist=
404 __git_commandlist="$(__git_commands 2>/dev/null)"
406 __git_aliases ()
408 local i IFS=$'\n'
409 for i in $(git --git-dir="$(__gitdir)" config --list); do
410 case "$i" in
411 alias.*)
412 i="${i#alias.}"
413 echo "${i/=*/}"
415 esac
416 done
419 __git_aliased_command ()
421 local word cmdline=$(git --git-dir="$(__gitdir)" \
422 config --get "alias.$1")
423 for word in $cmdline; do
424 if [ "${word##-*}" ]; then
425 echo $word
426 return
428 done
431 __git_find_subcommand ()
433 local word subcommand c=1
435 while [ $c -lt $COMP_CWORD ]; do
436 word="${COMP_WORDS[c]}"
437 for subcommand in $1; do
438 if [ "$subcommand" = "$word" ]; then
439 echo "$subcommand"
440 return
442 done
443 c=$((++c))
444 done
447 __git_whitespacelist="nowarn warn error error-all strip"
449 _git_am ()
451 local cur="${COMP_WORDS[COMP_CWORD]}"
452 if [ -d .dotest ]; then
453 __gitcomp "--skip --resolved"
454 return
456 case "$cur" in
457 --whitespace=*)
458 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
459 return
461 --*)
462 __gitcomp "
463 --signoff --utf8 --binary --3way --interactive
464 --whitespace=
466 return
467 esac
468 COMPREPLY=()
471 _git_apply ()
473 local cur="${COMP_WORDS[COMP_CWORD]}"
474 case "$cur" in
475 --whitespace=*)
476 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
477 return
479 --*)
480 __gitcomp "
481 --stat --numstat --summary --check --index
482 --cached --index-info --reverse --reject --unidiff-zero
483 --apply --no-add --exclude=
484 --whitespace= --inaccurate-eof --verbose
486 return
487 esac
488 COMPREPLY=()
491 _git_add ()
493 local cur="${COMP_WORDS[COMP_CWORD]}"
494 case "$cur" in
495 --*)
496 __gitcomp "--interactive --refresh"
497 return
498 esac
499 COMPREPLY=()
502 _git_bisect ()
504 local subcommands="start bad good reset visualize replay log"
505 local subcommand="$(__git_find_subcommand "$subcommands")"
506 if [ -z "$subcommand" ]; then
507 __gitcomp "$subcommands"
508 return
511 case "$subcommand" in
512 bad|good|reset)
513 __gitcomp "$(__git_refs)"
516 COMPREPLY=()
518 esac
521 _git_branch ()
523 local i c=1 only_local_ref="n" has_r="n"
525 while [ $c -lt $COMP_CWORD ]; do
526 i="${COMP_WORDS[c]}"
527 case "$i" in
528 -d|-m) only_local_ref="y" ;;
529 -r) has_r="y" ;;
530 esac
531 c=$((++c))
532 done
534 case "${COMP_WORDS[COMP_CWORD]}" in
535 --*=*) COMPREPLY=() ;;
536 --*)
537 __gitcomp "
538 --color --no-color --verbose --abbrev= --no-abbrev
539 --track --no-track
543 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
544 __gitcomp "$(__git_heads)"
545 else
546 __gitcomp "$(__git_refs)"
549 esac
552 _git_bundle ()
554 local mycword="$COMP_CWORD"
555 case "${COMP_WORDS[0]}" in
556 git)
557 local cmd="${COMP_WORDS[2]}"
558 mycword="$((mycword-1))"
560 git-bundle*)
561 local cmd="${COMP_WORDS[1]}"
563 esac
564 case "$mycword" in
566 __gitcomp "create list-heads verify unbundle"
569 # looking for a file
572 case "$cmd" in
573 create)
574 __git_complete_revlist
576 esac
578 esac
581 _git_checkout ()
583 __gitcomp "$(__git_refs)"
586 _git_cherry ()
588 __gitcomp "$(__git_refs)"
591 _git_cherry_pick ()
593 local cur="${COMP_WORDS[COMP_CWORD]}"
594 case "$cur" in
595 --*)
596 __gitcomp "--edit --no-commit"
599 __gitcomp "$(__git_refs)"
601 esac
604 _git_commit ()
606 local cur="${COMP_WORDS[COMP_CWORD]}"
607 case "$cur" in
608 --*)
609 __gitcomp "
610 --all --author= --signoff --verify --no-verify
611 --edit --amend --include --only
613 return
614 esac
615 COMPREPLY=()
618 _git_describe ()
620 __gitcomp "$(__git_refs)"
623 _git_diff ()
625 local cur="${COMP_WORDS[COMP_CWORD]}"
626 case "$cur" in
627 --*)
628 __gitcomp "--cached --stat --numstat --shortstat --summary
629 --patch-with-stat --name-only --name-status --color
630 --no-color --color-words --no-renames --check
631 --full-index --binary --abbrev --diff-filter
632 --find-copies-harder --pickaxe-all --pickaxe-regex
633 --text --ignore-space-at-eol --ignore-space-change
634 --ignore-all-space --exit-code --quiet --ext-diff
635 --no-ext-diff"
636 return
638 esac
639 __git_complete_file
642 _git_diff_tree ()
644 __gitcomp "$(__git_refs)"
647 _git_fetch ()
649 local cur="${COMP_WORDS[COMP_CWORD]}"
651 case "${COMP_WORDS[0]},$COMP_CWORD" in
652 git-fetch*,1)
653 __gitcomp "$(__git_remotes)"
655 git,2)
656 __gitcomp "$(__git_remotes)"
659 case "$cur" in
660 *:*)
661 __gitcomp "$(__git_refs)" "" "${cur#*:}"
664 local remote
665 case "${COMP_WORDS[0]}" in
666 git-fetch) remote="${COMP_WORDS[1]}" ;;
667 git) remote="${COMP_WORDS[2]}" ;;
668 esac
669 __gitcomp "$(__git_refs2 "$remote")"
671 esac
673 esac
676 _git_format_patch ()
678 local cur="${COMP_WORDS[COMP_CWORD]}"
679 case "$cur" in
680 --*)
681 __gitcomp "
682 --stdout --attach --thread
683 --output-directory
684 --numbered --start-number
685 --numbered-files
686 --keep-subject
687 --signoff
688 --in-reply-to=
689 --full-index --binary
690 --not --all
691 --cover-letter
693 return
695 esac
696 __git_complete_revlist
699 _git_gc ()
701 local cur="${COMP_WORDS[COMP_CWORD]}"
702 case "$cur" in
703 --*)
704 __gitcomp "--prune --aggressive"
705 return
707 esac
708 COMPREPLY=()
711 _git_ls_remote ()
713 __gitcomp "$(__git_remotes)"
716 _git_ls_tree ()
718 __git_complete_file
721 _git_log ()
723 local cur="${COMP_WORDS[COMP_CWORD]}"
724 case "$cur" in
725 --pretty=*)
726 __gitcomp "
727 oneline short medium full fuller email raw
728 " "" "${cur##--pretty=}"
729 return
731 --date=*)
732 __gitcomp "
733 relative iso8601 rfc2822 short local default
734 " "" "${cur##--date=}"
735 return
737 --*)
738 __gitcomp "
739 --max-count= --max-age= --since= --after=
740 --min-age= --before= --until=
741 --root --topo-order --date-order --reverse
742 --no-merges --follow
743 --abbrev-commit --abbrev=
744 --relative-date --date=
745 --author= --committer= --grep=
746 --all-match
747 --pretty= --name-status --name-only --raw
748 --not --all
749 --left-right --cherry-pick
751 return
753 esac
754 __git_complete_revlist
757 _git_merge ()
759 local cur="${COMP_WORDS[COMP_CWORD]}"
760 case "${COMP_WORDS[COMP_CWORD-1]}" in
761 -s|--strategy)
762 __gitcomp "$(__git_merge_strategies)"
763 return
764 esac
765 case "$cur" in
766 --strategy=*)
767 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
768 return
770 --*)
771 __gitcomp "
772 --no-commit --no-summary --squash --strategy
774 return
775 esac
776 __gitcomp "$(__git_refs)"
779 _git_merge_base ()
781 __gitcomp "$(__git_refs)"
784 _git_name_rev ()
786 __gitcomp "--tags --all --stdin"
789 _git_pull ()
791 local cur="${COMP_WORDS[COMP_CWORD]}"
793 case "${COMP_WORDS[0]},$COMP_CWORD" in
794 git-pull*,1)
795 __gitcomp "$(__git_remotes)"
797 git,2)
798 __gitcomp "$(__git_remotes)"
801 local remote
802 case "${COMP_WORDS[0]}" in
803 git-pull) remote="${COMP_WORDS[1]}" ;;
804 git) remote="${COMP_WORDS[2]}" ;;
805 esac
806 __gitcomp "$(__git_refs "$remote")"
808 esac
811 _git_push ()
813 local cur="${COMP_WORDS[COMP_CWORD]}"
815 case "${COMP_WORDS[0]},$COMP_CWORD" in
816 git-push*,1)
817 __gitcomp "$(__git_remotes)"
819 git,2)
820 __gitcomp "$(__git_remotes)"
823 case "$cur" in
824 *:*)
825 local remote
826 case "${COMP_WORDS[0]}" in
827 git-push) remote="${COMP_WORDS[1]}" ;;
828 git) remote="${COMP_WORDS[2]}" ;;
829 esac
830 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
833 __gitcomp "$(__git_refs)" + "${cur#+}"
836 __gitcomp "$(__git_refs)"
838 esac
840 esac
843 _git_rebase ()
845 local cur="${COMP_WORDS[COMP_CWORD]}"
846 if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
847 __gitcomp "--continue --skip --abort"
848 return
850 case "${COMP_WORDS[COMP_CWORD-1]}" in
851 -s|--strategy)
852 __gitcomp "$(__git_merge_strategies)"
853 return
854 esac
855 case "$cur" in
856 --strategy=*)
857 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
858 return
860 --*)
861 __gitcomp "--onto --merge --strategy"
862 return
863 esac
864 __gitcomp "$(__git_refs)"
867 _git_config ()
869 local cur="${COMP_WORDS[COMP_CWORD]}"
870 local prv="${COMP_WORDS[COMP_CWORD-1]}"
871 case "$prv" in
872 branch.*.remote)
873 __gitcomp "$(__git_remotes)"
874 return
876 branch.*.merge)
877 __gitcomp "$(__git_refs)"
878 return
880 remote.*.fetch)
881 local remote="${prv#remote.}"
882 remote="${remote%.fetch}"
883 __gitcomp "$(__git_refs_remotes "$remote")"
884 return
886 remote.*.push)
887 local remote="${prv#remote.}"
888 remote="${remote%.push}"
889 __gitcomp "$(git --git-dir="$(__gitdir)" \
890 for-each-ref --format='%(refname):%(refname)' \
891 refs/heads)"
892 return
894 pull.twohead|pull.octopus)
895 __gitcomp "$(__git_merge_strategies)"
896 return
898 color.branch|color.diff|color.status)
899 __gitcomp "always never auto"
900 return
902 color.*.*)
903 __gitcomp "
904 black red green yellow blue magenta cyan white
905 bold dim ul blink reverse
907 return
909 *.*)
910 COMPREPLY=()
911 return
913 esac
914 case "$cur" in
915 --*)
916 __gitcomp "
917 --global --system --file=
918 --list --replace-all
919 --get --get-all --get-regexp
920 --add --unset --unset-all
921 --remove-section --rename-section
923 return
925 branch.*.*)
926 local pfx="${cur%.*}."
927 cur="${cur##*.}"
928 __gitcomp "remote merge" "$pfx" "$cur"
929 return
931 branch.*)
932 local pfx="${cur%.*}."
933 cur="${cur#*.}"
934 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
935 return
937 remote.*.*)
938 local pfx="${cur%.*}."
939 cur="${cur##*.}"
940 __gitcomp "
941 url fetch push skipDefaultUpdate
942 receivepack uploadpack tagopt
943 " "$pfx" "$cur"
944 return
946 remote.*)
947 local pfx="${cur%.*}."
948 cur="${cur#*.}"
949 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
950 return
952 esac
953 __gitcomp "
954 apply.whitespace
955 core.fileMode
956 core.gitProxy
957 core.ignoreStat
958 core.preferSymlinkRefs
959 core.logAllRefUpdates
960 core.loosecompression
961 core.repositoryFormatVersion
962 core.sharedRepository
963 core.warnAmbiguousRefs
964 core.compression
965 core.legacyHeaders
966 core.packedGitWindowSize
967 core.packedGitLimit
968 clean.requireForce
969 color.branch
970 color.branch.current
971 color.branch.local
972 color.branch.remote
973 color.branch.plain
974 color.diff
975 color.diff.plain
976 color.diff.meta
977 color.diff.frag
978 color.diff.old
979 color.diff.new
980 color.diff.commit
981 color.diff.whitespace
982 color.pager
983 color.status
984 color.status.header
985 color.status.added
986 color.status.changed
987 color.status.untracked
988 diff.renameLimit
989 diff.renames
990 fetch.unpackLimit
991 format.headers
992 format.subjectprefix
993 gitcvs.enabled
994 gitcvs.logfile
995 gitcvs.allbinary
996 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
997 gc.packrefs
998 gc.reflogexpire
999 gc.reflogexpireunreachable
1000 gc.rerereresolved
1001 gc.rerereunresolved
1002 http.sslVerify
1003 http.sslCert
1004 http.sslKey
1005 http.sslCAInfo
1006 http.sslCAPath
1007 http.maxRequests
1008 http.lowSpeedLimit
1009 http.lowSpeedTime
1010 http.noEPSV
1011 i18n.commitEncoding
1012 i18n.logOutputEncoding
1013 log.showroot
1014 merge.tool
1015 merge.summary
1016 merge.verbosity
1017 pack.window
1018 pack.depth
1019 pack.windowMemory
1020 pack.compression
1021 pack.deltaCacheSize
1022 pack.deltaCacheLimit
1023 pull.octopus
1024 pull.twohead
1025 repack.useDeltaBaseOffset
1026 show.difftree
1027 showbranch.default
1028 tar.umask
1029 transfer.unpackLimit
1030 receive.unpackLimit
1031 receive.denyNonFastForwards
1032 user.name
1033 user.email
1034 user.signingkey
1035 whatchanged.difftree
1036 branch. remote.
1040 _git_remote ()
1042 local subcommands="add rm show prune update"
1043 local subcommand="$(__git_find_subcommand "$subcommands")"
1044 if [ -z "$subcommand" ]; then
1045 return
1048 case "$subcommand" in
1049 rm|show|prune)
1050 __gitcomp "$(__git_remotes)"
1052 update)
1053 local i c='' IFS=$'\n'
1054 for i in $(git --git-dir="$(__gitdir)" config --list); do
1055 case "$i" in
1056 remotes.*)
1057 i="${i#remotes.}"
1058 c="$c ${i/=*/}"
1060 esac
1061 done
1062 __gitcomp "$c"
1065 COMPREPLY=()
1067 esac
1070 _git_reset ()
1072 local cur="${COMP_WORDS[COMP_CWORD]}"
1073 case "$cur" in
1074 --*)
1075 __gitcomp "--mixed --hard --soft"
1076 return
1078 esac
1079 __gitcomp "$(__git_refs)"
1082 _git_shortlog ()
1084 local cur="${COMP_WORDS[COMP_CWORD]}"
1085 case "$cur" in
1086 --*)
1087 __gitcomp "
1088 --max-count= --max-age= --since= --after=
1089 --min-age= --before= --until=
1090 --no-merges
1091 --author= --committer= --grep=
1092 --all-match
1093 --not --all
1094 --numbered --summary
1096 return
1098 esac
1099 __git_complete_revlist
1102 _git_show ()
1104 local cur="${COMP_WORDS[COMP_CWORD]}"
1105 case "$cur" in
1106 --pretty=*)
1107 __gitcomp "
1108 oneline short medium full fuller email raw
1109 " "" "${cur##--pretty=}"
1110 return
1112 --*)
1113 __gitcomp "--pretty="
1114 return
1116 esac
1117 __git_complete_file
1120 _git_stash ()
1122 local subcommands='list show apply clear'
1123 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1124 __gitcomp "$subcommands"
1128 _git_submodule ()
1130 local subcommands="add status init update"
1131 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1132 local cur="${COMP_WORDS[COMP_CWORD]}"
1133 case "$cur" in
1134 --*)
1135 __gitcomp "--quiet --cached"
1138 __gitcomp "$subcommands"
1140 esac
1141 return
1145 _git_tag ()
1147 local i c=1 f=0
1148 while [ $c -lt $COMP_CWORD ]; do
1149 i="${COMP_WORDS[c]}"
1150 case "$i" in
1151 -d|-v)
1152 __gitcomp "$(__git_tags)"
1153 return
1158 esac
1159 c=$((++c))
1160 done
1162 case "${COMP_WORDS[COMP_CWORD-1]}" in
1163 -m|-F)
1164 COMPREPLY=()
1166 -*|tag|git-tag)
1167 if [ $f = 1 ]; then
1168 __gitcomp "$(__git_tags)"
1169 else
1170 COMPREPLY=()
1174 __gitcomp "$(__git_refs)"
1176 esac
1179 _git ()
1181 local i c=1 command __git_dir
1183 while [ $c -lt $COMP_CWORD ]; do
1184 i="${COMP_WORDS[c]}"
1185 case "$i" in
1186 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1187 --bare) __git_dir="." ;;
1188 --version|--help|-p|--paginate) ;;
1189 *) command="$i"; break ;;
1190 esac
1191 c=$((++c))
1192 done
1194 if [ -z "$command" ]; then
1195 case "${COMP_WORDS[COMP_CWORD]}" in
1196 --*=*) COMPREPLY=() ;;
1197 --*) __gitcomp "
1198 --no-pager
1199 --git-dir=
1200 --bare
1201 --version
1202 --exec-path
1205 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1206 esac
1207 return
1210 local expansion=$(__git_aliased_command "$command")
1211 [ "$expansion" ] && command="$expansion"
1213 case "$command" in
1214 am) _git_am ;;
1215 add) _git_add ;;
1216 apply) _git_apply ;;
1217 bisect) _git_bisect ;;
1218 bundle) _git_bundle ;;
1219 branch) _git_branch ;;
1220 checkout) _git_checkout ;;
1221 cherry) _git_cherry ;;
1222 cherry-pick) _git_cherry_pick ;;
1223 commit) _git_commit ;;
1224 config) _git_config ;;
1225 describe) _git_describe ;;
1226 diff) _git_diff ;;
1227 fetch) _git_fetch ;;
1228 format-patch) _git_format_patch ;;
1229 gc) _git_gc ;;
1230 log) _git_log ;;
1231 ls-remote) _git_ls_remote ;;
1232 ls-tree) _git_ls_tree ;;
1233 merge) _git_merge;;
1234 merge-base) _git_merge_base ;;
1235 name-rev) _git_name_rev ;;
1236 pull) _git_pull ;;
1237 push) _git_push ;;
1238 rebase) _git_rebase ;;
1239 remote) _git_remote ;;
1240 reset) _git_reset ;;
1241 shortlog) _git_shortlog ;;
1242 show) _git_show ;;
1243 show-branch) _git_log ;;
1244 stash) _git_stash ;;
1245 submodule) _git_submodule ;;
1246 tag) _git_tag ;;
1247 whatchanged) _git_log ;;
1248 *) COMPREPLY=() ;;
1249 esac
1252 _gitk ()
1254 local cur="${COMP_WORDS[COMP_CWORD]}"
1255 case "$cur" in
1256 --*)
1257 __gitcomp "--not --all"
1258 return
1260 esac
1261 __git_complete_revlist
1264 complete -o default -o nospace -F _git git
1265 complete -o default -o nospace -F _gitk gitk
1266 complete -o default -o nospace -F _git_am git-am
1267 complete -o default -o nospace -F _git_apply git-apply
1268 complete -o default -o nospace -F _git_bisect git-bisect
1269 complete -o default -o nospace -F _git_branch git-branch
1270 complete -o default -o nospace -F _git_bundle git-bundle
1271 complete -o default -o nospace -F _git_checkout git-checkout
1272 complete -o default -o nospace -F _git_cherry git-cherry
1273 complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1274 complete -o default -o nospace -F _git_commit git-commit
1275 complete -o default -o nospace -F _git_describe git-describe
1276 complete -o default -o nospace -F _git_diff git-diff
1277 complete -o default -o nospace -F _git_fetch git-fetch
1278 complete -o default -o nospace -F _git_format_patch git-format-patch
1279 complete -o default -o nospace -F _git_gc git-gc
1280 complete -o default -o nospace -F _git_log git-log
1281 complete -o default -o nospace -F _git_ls_remote git-ls-remote
1282 complete -o default -o nospace -F _git_ls_tree git-ls-tree
1283 complete -o default -o nospace -F _git_merge git-merge
1284 complete -o default -o nospace -F _git_merge_base git-merge-base
1285 complete -o default -o nospace -F _git_name_rev git-name-rev
1286 complete -o default -o nospace -F _git_pull git-pull
1287 complete -o default -o nospace -F _git_push git-push
1288 complete -o default -o nospace -F _git_rebase git-rebase
1289 complete -o default -o nospace -F _git_config git-config
1290 complete -o default -o nospace -F _git_remote git-remote
1291 complete -o default -o nospace -F _git_reset git-reset
1292 complete -o default -o nospace -F _git_shortlog git-shortlog
1293 complete -o default -o nospace -F _git_show git-show
1294 complete -o default -o nospace -F _git_stash git-stash
1295 complete -o default -o nospace -F _git_submodule git-submodule
1296 complete -o default -o nospace -F _git_log git-show-branch
1297 complete -o default -o nospace -F _git_tag git-tag
1298 complete -o default -o nospace -F _git_log git-whatchanged
1300 # The following are necessary only for Cygwin, and only are needed
1301 # when the user has tab-completed the executable name and consequently
1302 # included the '.exe' suffix.
1304 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1305 complete -o default -o nospace -F _git_add git-add.exe
1306 complete -o default -o nospace -F _git_apply git-apply.exe
1307 complete -o default -o nospace -F _git git.exe
1308 complete -o default -o nospace -F _git_branch git-branch.exe
1309 complete -o default -o nospace -F _git_bundle git-bundle.exe
1310 complete -o default -o nospace -F _git_cherry git-cherry.exe
1311 complete -o default -o nospace -F _git_describe git-describe.exe
1312 complete -o default -o nospace -F _git_diff git-diff.exe
1313 complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1314 complete -o default -o nospace -F _git_log git-log.exe
1315 complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1316 complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1317 complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1318 complete -o default -o nospace -F _git_push git-push.exe
1319 complete -o default -o nospace -F _git_config git-config
1320 complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1321 complete -o default -o nospace -F _git_show git-show.exe
1322 complete -o default -o nospace -F _git_log git-show-branch.exe
1323 complete -o default -o nospace -F _git_tag git-tag.exe
1324 complete -o default -o nospace -F _git_log git-whatchanged.exe