bash: not all 'git bisect' subcommands make sense when not bisecting
[git/jnareb-git.git] / contrib / completion / git-completion.bash
blobd739113153cce21b2eee6d2f2d62f2ac9b9ea066
1 #!bash
3 # bash completion support for core Git.
5 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
6 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
7 # Distributed under the GNU General Public License, version 2.0.
9 # The contained completion routines provide support for completing:
11 # *) local and remote branch names
12 # *) local and remote tag names
13 # *) .git/remotes file names
14 # *) git 'subcommands'
15 # *) tree paths within 'ref:path/to/file' expressions
16 # *) common --long-options
18 # To use these routines:
20 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
21 # 2) Added the following line to your .bashrc:
22 # source ~/.git-completion.sh
24 # 3) Consider changing your PS1 to also show the current branch:
25 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
27 # The argument to __git_ps1 will be displayed only if you
28 # are currently in a git repository. The %s token will be
29 # the name of the current branch.
31 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
32 # value, unstaged (*) and staged (+) changes will be shown next
33 # to the branch name. You can configure this per-repository
34 # with the bash.showDirtyState variable, which defaults to true
35 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
37 # You can also see if currently something is stashed, by setting
38 # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
39 # then a '$' will be shown next to the branch name.
41 # If you would like to see if there're untracked files, then you can
42 # set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
43 # untracked files, then a '%' will be shown next to the branch name.
45 # If you would like to see the difference between HEAD and its
46 # upstream, set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates
47 # you are behind, ">" indicates you are ahead, and "<>"
48 # indicates you have diverged. You can further control
49 # behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated
50 # list of values:
51 # verbose show number of commits ahead/behind (+/-) upstream
52 # legacy don't use the '--count' option available in recent
53 # versions of git-rev-list
54 # git always compare HEAD to @{upstream}
55 # svn always compare HEAD to your SVN upstream
56 # By default, __git_ps1 will compare HEAD to your SVN upstream
57 # if it can find one, or @{upstream} otherwise. Once you have
58 # set GIT_PS1_SHOWUPSTREAM, you can override it on a
59 # per-repository basis by setting the bash.showUpstream config
60 # variable.
63 # To submit patches:
65 # *) Read Documentation/SubmittingPatches
66 # *) Send all patches to the current maintainer:
68 # "Shawn O. Pearce" <spearce@spearce.org>
70 # *) Always CC the Git mailing list:
72 # git@vger.kernel.org
75 case "$COMP_WORDBREAKS" in
76 *:*) : great ;;
77 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
78 esac
80 # __gitdir accepts 0 or 1 arguments (i.e., location)
81 # returns location of .git repo
82 __gitdir ()
84 if [ -z "${1-}" ]; then
85 if [ -n "${__git_dir-}" ]; then
86 echo "$__git_dir"
87 elif [ -d .git ]; then
88 echo .git
89 else
90 git rev-parse --git-dir 2>/dev/null
92 elif [ -d "$1/.git" ]; then
93 echo "$1/.git"
94 else
95 echo "$1"
99 # stores the divergence from upstream in $p
100 # used by GIT_PS1_SHOWUPSTREAM
101 __git_ps1_show_upstream ()
103 local key value
104 local svn_remote=() svn_url_pattern count n
105 local upstream=git legacy="" verbose=""
107 # get some config options from git-config
108 while read key value; do
109 case "$key" in
110 bash.showupstream)
111 GIT_PS1_SHOWUPSTREAM="$value"
112 if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
113 p=""
114 return
117 svn-remote.*.url)
118 svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
119 svn_url_pattern+="\\|$value"
120 upstream=svn+git # default upstream is SVN if available, else git
122 esac
123 done < <(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')
125 # parse configuration values
126 for option in ${GIT_PS1_SHOWUPSTREAM}; do
127 case "$option" in
128 git|svn) upstream="$option" ;;
129 verbose) verbose=1 ;;
130 legacy) legacy=1 ;;
131 esac
132 done
134 # Find our upstream
135 case "$upstream" in
136 git) upstream="@{upstream}" ;;
137 svn*)
138 # get the upstream from the "git-svn-id: ..." in a commit message
139 # (git-svn uses essentially the same procedure internally)
140 local svn_upstream=($(git log --first-parent -1 \
141 --grep="^git-svn-id: \(${svn_url_pattern:2}\)" 2>/dev/null))
142 if [[ 0 -ne ${#svn_upstream[@]} ]]; then
143 svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
144 svn_upstream=${svn_upstream%@*}
145 for ((n=1; "$n" <= "${#svn_remote[@]}"; ++n)); do
146 svn_upstream=${svn_upstream#${svn_remote[$n]}}
147 done
149 if [[ -z "$svn_upstream" ]]; then
150 # default branch name for checkouts with no layout:
151 upstream=${GIT_SVN_ID:-git-svn}
152 else
153 upstream=${svn_upstream#/}
155 elif [[ "svn+git" = "$upstream" ]]; then
156 upstream="@{upstream}"
159 esac
161 # Find how many commits we are ahead/behind our upstream
162 if [[ -z "$legacy" ]]; then
163 count="$(git rev-list --count --left-right \
164 "$upstream"...HEAD 2>/dev/null)"
165 else
166 # produce equivalent output to --count for older versions of git
167 local commits
168 if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
169 then
170 local commit behind=0 ahead=0
171 for commit in $commits
173 case "$commit" in
174 "<"*) let ++behind
176 *) let ++ahead
178 esac
179 done
180 count="$behind $ahead"
181 else
182 count=""
186 # calculate the result
187 if [[ -z "$verbose" ]]; then
188 case "$count" in
189 "") # no upstream
190 p="" ;;
191 "0 0") # equal to upstream
192 p="=" ;;
193 "0 "*) # ahead of upstream
194 p=">" ;;
195 *" 0") # behind upstream
196 p="<" ;;
197 *) # diverged from upstream
198 p="<>" ;;
199 esac
200 else
201 case "$count" in
202 "") # no upstream
203 p="" ;;
204 "0 0") # equal to upstream
205 p=" u=" ;;
206 "0 "*) # ahead of upstream
207 p=" u+${count#0 }" ;;
208 *" 0") # behind upstream
209 p=" u-${count% 0}" ;;
210 *) # diverged from upstream
211 p=" u+${count#* }-${count% *}" ;;
212 esac
218 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
219 # returns text to add to bash PS1 prompt (includes branch name)
220 __git_ps1 ()
222 local g="$(__gitdir)"
223 if [ -n "$g" ]; then
224 local r=""
225 local b=""
226 if [ -f "$g/rebase-merge/interactive" ]; then
227 r="|REBASE-i"
228 b="$(cat "$g/rebase-merge/head-name")"
229 elif [ -d "$g/rebase-merge" ]; then
230 r="|REBASE-m"
231 b="$(cat "$g/rebase-merge/head-name")"
232 else
233 if [ -d "$g/rebase-apply" ]; then
234 if [ -f "$g/rebase-apply/rebasing" ]; then
235 r="|REBASE"
236 elif [ -f "$g/rebase-apply/applying" ]; then
237 r="|AM"
238 else
239 r="|AM/REBASE"
241 elif [ -f "$g/MERGE_HEAD" ]; then
242 r="|MERGING"
243 elif [ -f "$g/BISECT_LOG" ]; then
244 r="|BISECTING"
247 b="$(git symbolic-ref HEAD 2>/dev/null)" || {
249 b="$(
250 case "${GIT_PS1_DESCRIBE_STYLE-}" in
251 (contains)
252 git describe --contains HEAD ;;
253 (branch)
254 git describe --contains --all HEAD ;;
255 (describe)
256 git describe HEAD ;;
257 (* | default)
258 git describe --exact-match HEAD ;;
259 esac 2>/dev/null)" ||
261 b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
262 b="unknown"
263 b="($b)"
267 local w=""
268 local i=""
269 local s=""
270 local u=""
271 local c=""
272 local p=""
274 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
275 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
276 c="BARE:"
277 else
278 b="GIT_DIR!"
280 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
281 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
282 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
283 git diff --no-ext-diff --quiet --exit-code || w="*"
284 if git rev-parse --quiet --verify HEAD >/dev/null; then
285 git diff-index --cached --quiet HEAD -- || i="+"
286 else
287 i="#"
291 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
292 git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
295 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
296 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
297 u="%"
301 if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
302 __git_ps1_show_upstream
306 local f="$w$i$s$u"
307 printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p"
311 # __gitcomp_1 requires 2 arguments
312 __gitcomp_1 ()
314 local c IFS=' '$'\t'$'\n'
315 for c in $1; do
316 case "$c$2" in
317 --*=*) printf %s$'\n' "$c$2" ;;
318 *.) printf %s$'\n' "$c$2" ;;
319 *) printf %s$'\n' "$c$2 " ;;
320 esac
321 done
324 # __gitcomp accepts 1, 2, 3, or 4 arguments
325 # generates completion reply with compgen
326 __gitcomp ()
328 local cur="${COMP_WORDS[COMP_CWORD]}"
329 if [ $# -gt 2 ]; then
330 cur="$3"
332 case "$cur" in
333 --*=)
334 COMPREPLY=()
337 local IFS=$'\n'
338 COMPREPLY=($(compgen -P "${2-}" \
339 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
340 -- "$cur"))
342 esac
345 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
346 __git_heads ()
348 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
349 if [ -d "$dir" ]; then
350 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
351 refs/heads
352 return
354 for i in $(git ls-remote "${1-}" 2>/dev/null); do
355 case "$is_hash,$i" in
356 y,*) is_hash=n ;;
357 n,*^{}) is_hash=y ;;
358 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
359 n,*) is_hash=y; echo "$i" ;;
360 esac
361 done
364 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
365 __git_tags ()
367 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
368 if [ -d "$dir" ]; then
369 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
370 refs/tags
371 return
373 for i in $(git ls-remote "${1-}" 2>/dev/null); do
374 case "$is_hash,$i" in
375 y,*) is_hash=n ;;
376 n,*^{}) is_hash=y ;;
377 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
378 n,*) is_hash=y; echo "$i" ;;
379 esac
380 done
383 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
384 __git_refs ()
386 local i is_hash=y dir="$(__gitdir "${1-}")"
387 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
388 if [ -d "$dir" ]; then
389 case "$cur" in
390 refs|refs/*)
391 format="refname"
392 refs="${cur%/*}"
395 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
396 if [ -e "$dir/$i" ]; then echo $i; fi
397 done
398 format="refname:short"
399 refs="refs/tags refs/heads refs/remotes"
401 esac
402 git --git-dir="$dir" for-each-ref --format="%($format)" \
403 $refs
404 return
406 for i in $(git ls-remote "$dir" 2>/dev/null); do
407 case "$is_hash,$i" in
408 y,*) is_hash=n ;;
409 n,*^{}) is_hash=y ;;
410 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
411 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
412 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
413 n,*) is_hash=y; echo "$i" ;;
414 esac
415 done
418 # __git_refs2 requires 1 argument (to pass to __git_refs)
419 __git_refs2 ()
421 local i
422 for i in $(__git_refs "$1"); do
423 echo "$i:$i"
424 done
427 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
428 __git_refs_remotes ()
430 local cmd i is_hash=y
431 for i in $(git ls-remote "$1" 2>/dev/null); do
432 case "$is_hash,$i" in
433 n,refs/heads/*)
434 is_hash=y
435 echo "$i:refs/remotes/$1/${i#refs/heads/}"
437 y,*) is_hash=n ;;
438 n,*^{}) is_hash=y ;;
439 n,refs/tags/*) is_hash=y;;
440 n,*) is_hash=y; ;;
441 esac
442 done
445 __git_remotes ()
447 local i ngoff IFS=$'\n' d="$(__gitdir)"
448 shopt -q nullglob || ngoff=1
449 shopt -s nullglob
450 for i in "$d/remotes"/*; do
451 echo ${i#$d/remotes/}
452 done
453 [ "$ngoff" ] && shopt -u nullglob
454 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
455 i="${i#remote.}"
456 echo "${i/.url*/}"
457 done
460 __git_list_merge_strategies ()
462 git merge -s help 2>&1 |
463 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
464 s/\.$//
465 s/.*://
466 s/^[ ]*//
467 s/[ ]*$//
472 __git_merge_strategies=
473 # 'git merge -s help' (and thus detection of the merge strategy
474 # list) fails, unfortunately, if run outside of any git working
475 # tree. __git_merge_strategies is set to the empty string in
476 # that case, and the detection will be repeated the next time it
477 # is needed.
478 __git_compute_merge_strategies ()
480 : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
483 __git_complete_file ()
485 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
486 case "$cur" in
487 ?*:*)
488 ref="${cur%%:*}"
489 cur="${cur#*:}"
490 case "$cur" in
491 ?*/*)
492 pfx="${cur%/*}"
493 cur="${cur##*/}"
494 ls="$ref:$pfx"
495 pfx="$pfx/"
498 ls="$ref"
500 esac
502 case "$COMP_WORDBREAKS" in
503 *:*) : great ;;
504 *) pfx="$ref:$pfx" ;;
505 esac
507 local IFS=$'\n'
508 COMPREPLY=($(compgen -P "$pfx" \
509 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
510 | sed '/^100... blob /{
511 s,^.* ,,
512 s,$, ,
514 /^120000 blob /{
515 s,^.* ,,
516 s,$, ,
518 /^040000 tree /{
519 s,^.* ,,
520 s,$,/,
522 s/^.* //')" \
523 -- "$cur"))
526 __gitcomp "$(__git_refs)"
528 esac
531 __git_complete_revlist ()
533 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
534 case "$cur" in
535 *...*)
536 pfx="${cur%...*}..."
537 cur="${cur#*...}"
538 __gitcomp "$(__git_refs)" "$pfx" "$cur"
540 *..*)
541 pfx="${cur%..*}.."
542 cur="${cur#*..}"
543 __gitcomp "$(__git_refs)" "$pfx" "$cur"
546 __gitcomp "$(__git_refs)"
548 esac
551 __git_complete_remote_or_refspec ()
553 local cmd="${COMP_WORDS[1]}"
554 local cur="${COMP_WORDS[COMP_CWORD]}"
555 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
556 while [ $c -lt $COMP_CWORD ]; do
557 i="${COMP_WORDS[c]}"
558 case "$i" in
559 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
560 --all)
561 case "$cmd" in
562 push) no_complete_refspec=1 ;;
563 fetch)
564 COMPREPLY=()
565 return
567 *) ;;
568 esac
570 -*) ;;
571 *) remote="$i"; break ;;
572 esac
573 c=$((++c))
574 done
575 if [ -z "$remote" ]; then
576 __gitcomp "$(__git_remotes)"
577 return
579 if [ $no_complete_refspec = 1 ]; then
580 COMPREPLY=()
581 return
583 [ "$remote" = "." ] && remote=
584 case "$cur" in
585 *:*)
586 case "$COMP_WORDBREAKS" in
587 *:*) : great ;;
588 *) pfx="${cur%%:*}:" ;;
589 esac
590 cur="${cur#*:}"
591 lhs=0
594 pfx="+"
595 cur="${cur#+}"
597 esac
598 case "$cmd" in
599 fetch)
600 if [ $lhs = 1 ]; then
601 __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur"
602 else
603 __gitcomp "$(__git_refs)" "$pfx" "$cur"
606 pull)
607 if [ $lhs = 1 ]; then
608 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
609 else
610 __gitcomp "$(__git_refs)" "$pfx" "$cur"
613 push)
614 if [ $lhs = 1 ]; then
615 __gitcomp "$(__git_refs)" "$pfx" "$cur"
616 else
617 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
620 esac
623 __git_complete_strategy ()
625 __git_compute_merge_strategies
626 case "${COMP_WORDS[COMP_CWORD-1]}" in
627 -s|--strategy)
628 __gitcomp "$__git_merge_strategies"
629 return 0
630 esac
631 local cur="${COMP_WORDS[COMP_CWORD]}"
632 case "$cur" in
633 --strategy=*)
634 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
635 return 0
637 esac
638 return 1
641 __git_list_all_commands ()
643 local i IFS=" "$'\n'
644 for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
646 case $i in
647 *--*) : helper pattern;;
648 *) echo $i;;
649 esac
650 done
653 __git_all_commands=
654 __git_compute_all_commands ()
656 : ${__git_all_commands:=$(__git_list_all_commands)}
659 __git_list_porcelain_commands ()
661 local i IFS=" "$'\n'
662 __git_compute_all_commands
663 for i in "help" $__git_all_commands
665 case $i in
666 *--*) : helper pattern;;
667 applymbox) : ask gittus;;
668 applypatch) : ask gittus;;
669 archimport) : import;;
670 cat-file) : plumbing;;
671 check-attr) : plumbing;;
672 check-ref-format) : plumbing;;
673 checkout-index) : plumbing;;
674 commit-tree) : plumbing;;
675 count-objects) : infrequent;;
676 cvsexportcommit) : export;;
677 cvsimport) : import;;
678 cvsserver) : daemon;;
679 daemon) : daemon;;
680 diff-files) : plumbing;;
681 diff-index) : plumbing;;
682 diff-tree) : plumbing;;
683 fast-import) : import;;
684 fast-export) : export;;
685 fsck-objects) : plumbing;;
686 fetch-pack) : plumbing;;
687 fmt-merge-msg) : plumbing;;
688 for-each-ref) : plumbing;;
689 hash-object) : plumbing;;
690 http-*) : transport;;
691 index-pack) : plumbing;;
692 init-db) : deprecated;;
693 local-fetch) : plumbing;;
694 lost-found) : infrequent;;
695 ls-files) : plumbing;;
696 ls-remote) : plumbing;;
697 ls-tree) : plumbing;;
698 mailinfo) : plumbing;;
699 mailsplit) : plumbing;;
700 merge-*) : plumbing;;
701 mktree) : plumbing;;
702 mktag) : plumbing;;
703 pack-objects) : plumbing;;
704 pack-redundant) : plumbing;;
705 pack-refs) : plumbing;;
706 parse-remote) : plumbing;;
707 patch-id) : plumbing;;
708 peek-remote) : plumbing;;
709 prune) : plumbing;;
710 prune-packed) : plumbing;;
711 quiltimport) : import;;
712 read-tree) : plumbing;;
713 receive-pack) : plumbing;;
714 reflog) : plumbing;;
715 remote-*) : transport;;
716 repo-config) : deprecated;;
717 rerere) : plumbing;;
718 rev-list) : plumbing;;
719 rev-parse) : plumbing;;
720 runstatus) : plumbing;;
721 sh-setup) : internal;;
722 shell) : daemon;;
723 show-ref) : plumbing;;
724 send-pack) : plumbing;;
725 show-index) : plumbing;;
726 ssh-*) : transport;;
727 stripspace) : plumbing;;
728 symbolic-ref) : plumbing;;
729 tar-tree) : deprecated;;
730 unpack-file) : plumbing;;
731 unpack-objects) : plumbing;;
732 update-index) : plumbing;;
733 update-ref) : plumbing;;
734 update-server-info) : daemon;;
735 upload-archive) : plumbing;;
736 upload-pack) : plumbing;;
737 write-tree) : plumbing;;
738 var) : infrequent;;
739 verify-pack) : infrequent;;
740 verify-tag) : plumbing;;
741 *) echo $i;;
742 esac
743 done
746 __git_porcelain_commands=
747 __git_compute_porcelain_commands ()
749 __git_compute_all_commands
750 : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
753 __git_aliases ()
755 local i IFS=$'\n'
756 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
757 case "$i" in
758 alias.*)
759 i="${i#alias.}"
760 echo "${i/ */}"
762 esac
763 done
766 # __git_aliased_command requires 1 argument
767 __git_aliased_command ()
769 local word cmdline=$(git --git-dir="$(__gitdir)" \
770 config --get "alias.$1")
771 for word in $cmdline; do
772 case "$word" in
773 \!gitk|gitk)
774 echo "gitk"
775 return
777 \!*) : shell command alias ;;
778 -*) : option ;;
779 *=*) : setting env ;;
780 git) : git itself ;;
782 echo "$word"
783 return
784 esac
785 done
788 # __git_find_on_cmdline requires 1 argument
789 __git_find_on_cmdline ()
791 local word subcommand c=1
793 while [ $c -lt $COMP_CWORD ]; do
794 word="${COMP_WORDS[c]}"
795 for subcommand in $1; do
796 if [ "$subcommand" = "$word" ]; then
797 echo "$subcommand"
798 return
800 done
801 c=$((++c))
802 done
805 __git_has_doubledash ()
807 local c=1
808 while [ $c -lt $COMP_CWORD ]; do
809 if [ "--" = "${COMP_WORDS[c]}" ]; then
810 return 0
812 c=$((++c))
813 done
814 return 1
817 __git_whitespacelist="nowarn warn error error-all fix"
819 _git_am ()
821 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
822 if [ -d "$dir"/rebase-apply ]; then
823 __gitcomp "--skip --continue --resolved --abort"
824 return
826 case "$cur" in
827 --whitespace=*)
828 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
829 return
831 --*)
832 __gitcomp "
833 --3way --committer-date-is-author-date --ignore-date
834 --ignore-whitespace --ignore-space-change
835 --interactive --keep --no-utf8 --signoff --utf8
836 --whitespace= --scissors
838 return
839 esac
840 COMPREPLY=()
843 _git_apply ()
845 local cur="${COMP_WORDS[COMP_CWORD]}"
846 case "$cur" in
847 --whitespace=*)
848 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
849 return
851 --*)
852 __gitcomp "
853 --stat --numstat --summary --check --index
854 --cached --index-info --reverse --reject --unidiff-zero
855 --apply --no-add --exclude=
856 --ignore-whitespace --ignore-space-change
857 --whitespace= --inaccurate-eof --verbose
859 return
860 esac
861 COMPREPLY=()
864 _git_add ()
866 __git_has_doubledash && return
868 local cur="${COMP_WORDS[COMP_CWORD]}"
869 case "$cur" in
870 --*)
871 __gitcomp "
872 --interactive --refresh --patch --update --dry-run
873 --ignore-errors --intent-to-add
875 return
876 esac
877 COMPREPLY=()
880 _git_archive ()
882 local cur="${COMP_WORDS[COMP_CWORD]}"
883 case "$cur" in
884 --format=*)
885 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
886 return
888 --remote=*)
889 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
890 return
892 --*)
893 __gitcomp "
894 --format= --list --verbose
895 --prefix= --remote= --exec=
897 return
899 esac
900 __git_complete_file
903 _git_bisect ()
905 __git_has_doubledash && return
907 local subcommands="start bad good skip reset visualize replay log run"
908 local subcommand="$(__git_find_on_cmdline "$subcommands")"
909 if [ -z "$subcommand" ]; then
910 if [ -f "$(__gitdir)"/BISECT_START ]; then
911 __gitcomp "$subcommands"
912 else
913 __gitcomp "replay start"
915 return
918 case "$subcommand" in
919 bad|good|reset|skip|start)
920 __gitcomp "$(__git_refs)"
923 COMPREPLY=()
925 esac
928 _git_branch ()
930 local i c=1 only_local_ref="n" has_r="n"
932 while [ $c -lt $COMP_CWORD ]; do
933 i="${COMP_WORDS[c]}"
934 case "$i" in
935 -d|-m) only_local_ref="y" ;;
936 -r) has_r="y" ;;
937 esac
938 c=$((++c))
939 done
941 case "${COMP_WORDS[COMP_CWORD]}" in
942 --*)
943 __gitcomp "
944 --color --no-color --verbose --abbrev= --no-abbrev
945 --track --no-track --contains --merged --no-merged
946 --set-upstream
950 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
951 __gitcomp "$(__git_heads)"
952 else
953 __gitcomp "$(__git_refs)"
956 esac
959 _git_bundle ()
961 local cmd="${COMP_WORDS[2]}"
962 case "$COMP_CWORD" in
964 __gitcomp "create list-heads verify unbundle"
967 # looking for a file
970 case "$cmd" in
971 create)
972 __git_complete_revlist
974 esac
976 esac
979 _git_checkout ()
981 __git_has_doubledash && return
983 local cur="${COMP_WORDS[COMP_CWORD]}"
984 case "$cur" in
985 --conflict=*)
986 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
988 --*)
989 __gitcomp "
990 --quiet --ours --theirs --track --no-track --merge
991 --conflict= --orphan --patch
995 __gitcomp "$(__git_refs)"
997 esac
1000 _git_cherry ()
1002 __gitcomp "$(__git_refs)"
1005 _git_cherry_pick ()
1007 local cur="${COMP_WORDS[COMP_CWORD]}"
1008 case "$cur" in
1009 --*)
1010 __gitcomp "--edit --no-commit"
1013 __gitcomp "$(__git_refs)"
1015 esac
1018 _git_clean ()
1020 __git_has_doubledash && return
1022 local cur="${COMP_WORDS[COMP_CWORD]}"
1023 case "$cur" in
1024 --*)
1025 __gitcomp "--dry-run --quiet"
1026 return
1028 esac
1029 COMPREPLY=()
1032 _git_clone ()
1034 local cur="${COMP_WORDS[COMP_CWORD]}"
1035 case "$cur" in
1036 --*)
1037 __gitcomp "
1038 --local
1039 --no-hardlinks
1040 --shared
1041 --reference
1042 --quiet
1043 --no-checkout
1044 --bare
1045 --mirror
1046 --origin
1047 --upload-pack
1048 --template=
1049 --depth
1051 return
1053 esac
1054 COMPREPLY=()
1057 _git_commit ()
1059 __git_has_doubledash && return
1061 local cur="${COMP_WORDS[COMP_CWORD]}"
1062 case "$cur" in
1063 --cleanup=*)
1064 __gitcomp "default strip verbatim whitespace
1065 " "" "${cur##--cleanup=}"
1066 return
1068 --reuse-message=*)
1069 __gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}"
1070 return
1072 --reedit-message=*)
1073 __gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}"
1074 return
1076 --untracked-files=*)
1077 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1078 return
1080 --*)
1081 __gitcomp "
1082 --all --author= --signoff --verify --no-verify
1083 --edit --amend --include --only --interactive
1084 --dry-run --reuse-message= --reedit-message=
1085 --reset-author --file= --message= --template=
1086 --cleanup= --untracked-files --untracked-files=
1087 --verbose --quiet
1089 return
1090 esac
1091 COMPREPLY=()
1094 _git_describe ()
1096 local cur="${COMP_WORDS[COMP_CWORD]}"
1097 case "$cur" in
1098 --*)
1099 __gitcomp "
1100 --all --tags --contains --abbrev= --candidates=
1101 --exact-match --debug --long --match --always
1103 return
1104 esac
1105 __gitcomp "$(__git_refs)"
1108 __git_diff_common_options="--stat --numstat --shortstat --summary
1109 --patch-with-stat --name-only --name-status --color
1110 --no-color --color-words --no-renames --check
1111 --full-index --binary --abbrev --diff-filter=
1112 --find-copies-harder
1113 --text --ignore-space-at-eol --ignore-space-change
1114 --ignore-all-space --exit-code --quiet --ext-diff
1115 --no-ext-diff
1116 --no-prefix --src-prefix= --dst-prefix=
1117 --inter-hunk-context=
1118 --patience
1119 --raw
1120 --dirstat --dirstat= --dirstat-by-file
1121 --dirstat-by-file= --cumulative
1124 _git_diff ()
1126 __git_has_doubledash && return
1128 local cur="${COMP_WORDS[COMP_CWORD]}"
1129 case "$cur" in
1130 --*)
1131 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1132 --base --ours --theirs --no-index
1133 $__git_diff_common_options
1135 return
1137 esac
1138 __git_complete_file
1141 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1142 tkdiff vimdiff gvimdiff xxdiff araxis p4merge
1145 _git_difftool ()
1147 __git_has_doubledash && return
1149 local cur="${COMP_WORDS[COMP_CWORD]}"
1150 case "$cur" in
1151 --tool=*)
1152 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1153 return
1155 --*)
1156 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1157 --base --ours --theirs
1158 --no-renames --diff-filter= --find-copies-harder
1159 --relative --ignore-submodules
1160 --tool="
1161 return
1163 esac
1164 __git_complete_file
1167 __git_fetch_options="
1168 --quiet --verbose --append --upload-pack --force --keep --depth=
1169 --tags --no-tags --all --prune --dry-run
1172 _git_fetch ()
1174 local cur="${COMP_WORDS[COMP_CWORD]}"
1175 case "$cur" in
1176 --*)
1177 __gitcomp "$__git_fetch_options"
1178 return
1180 esac
1181 __git_complete_remote_or_refspec
1184 _git_format_patch ()
1186 local cur="${COMP_WORDS[COMP_CWORD]}"
1187 case "$cur" in
1188 --thread=*)
1189 __gitcomp "
1190 deep shallow
1191 " "" "${cur##--thread=}"
1192 return
1194 --*)
1195 __gitcomp "
1196 --stdout --attach --no-attach --thread --thread=
1197 --output-directory
1198 --numbered --start-number
1199 --numbered-files
1200 --keep-subject
1201 --signoff --signature --no-signature
1202 --in-reply-to= --cc=
1203 --full-index --binary
1204 --not --all
1205 --cover-letter
1206 --no-prefix --src-prefix= --dst-prefix=
1207 --inline --suffix= --ignore-if-in-upstream
1208 --subject-prefix=
1210 return
1212 esac
1213 __git_complete_revlist
1216 _git_fsck ()
1218 local cur="${COMP_WORDS[COMP_CWORD]}"
1219 case "$cur" in
1220 --*)
1221 __gitcomp "
1222 --tags --root --unreachable --cache --no-reflogs --full
1223 --strict --verbose --lost-found
1225 return
1227 esac
1228 COMPREPLY=()
1231 _git_gc ()
1233 local cur="${COMP_WORDS[COMP_CWORD]}"
1234 case "$cur" in
1235 --*)
1236 __gitcomp "--prune --aggressive"
1237 return
1239 esac
1240 COMPREPLY=()
1243 _git_gitk ()
1245 _gitk
1248 _git_grep ()
1250 __git_has_doubledash && return
1252 local cur="${COMP_WORDS[COMP_CWORD]}"
1253 case "$cur" in
1254 --*)
1255 __gitcomp "
1256 --cached
1257 --text --ignore-case --word-regexp --invert-match
1258 --full-name
1259 --extended-regexp --basic-regexp --fixed-strings
1260 --files-with-matches --name-only
1261 --files-without-match
1262 --max-depth
1263 --count
1264 --and --or --not --all-match
1266 return
1268 esac
1270 __gitcomp "$(__git_refs)"
1273 _git_help ()
1275 local cur="${COMP_WORDS[COMP_CWORD]}"
1276 case "$cur" in
1277 --*)
1278 __gitcomp "--all --info --man --web"
1279 return
1281 esac
1282 __git_compute_all_commands
1283 __gitcomp "$__git_all_commands
1284 attributes cli core-tutorial cvs-migration
1285 diffcore gitk glossary hooks ignore modules
1286 repository-layout tutorial tutorial-2
1287 workflows
1291 _git_init ()
1293 local cur="${COMP_WORDS[COMP_CWORD]}"
1294 case "$cur" in
1295 --shared=*)
1296 __gitcomp "
1297 false true umask group all world everybody
1298 " "" "${cur##--shared=}"
1299 return
1301 --*)
1302 __gitcomp "--quiet --bare --template= --shared --shared="
1303 return
1305 esac
1306 COMPREPLY=()
1309 _git_ls_files ()
1311 __git_has_doubledash && return
1313 local cur="${COMP_WORDS[COMP_CWORD]}"
1314 case "$cur" in
1315 --*)
1316 __gitcomp "--cached --deleted --modified --others --ignored
1317 --stage --directory --no-empty-directory --unmerged
1318 --killed --exclude= --exclude-from=
1319 --exclude-per-directory= --exclude-standard
1320 --error-unmatch --with-tree= --full-name
1321 --abbrev --ignored --exclude-per-directory
1323 return
1325 esac
1326 COMPREPLY=()
1329 _git_ls_remote ()
1331 __gitcomp "$(__git_remotes)"
1334 _git_ls_tree ()
1336 __git_complete_file
1339 # Options that go well for log, shortlog and gitk
1340 __git_log_common_options="
1341 --not --all
1342 --branches --tags --remotes
1343 --first-parent --merges --no-merges
1344 --max-count=
1345 --max-age= --since= --after=
1346 --min-age= --until= --before=
1348 # Options that go well for log and gitk (not shortlog)
1349 __git_log_gitk_options="
1350 --dense --sparse --full-history
1351 --simplify-merges --simplify-by-decoration
1352 --left-right
1354 # Options that go well for log and shortlog (not gitk)
1355 __git_log_shortlog_options="
1356 --author= --committer= --grep=
1357 --all-match
1360 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1361 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1363 _git_log ()
1365 __git_has_doubledash && return
1367 local cur="${COMP_WORDS[COMP_CWORD]}"
1368 local g="$(git rev-parse --git-dir 2>/dev/null)"
1369 local merge=""
1370 if [ -f "$g/MERGE_HEAD" ]; then
1371 merge="--merge"
1373 case "$cur" in
1374 --pretty=*)
1375 __gitcomp "$__git_log_pretty_formats
1376 " "" "${cur##--pretty=}"
1377 return
1379 --format=*)
1380 __gitcomp "$__git_log_pretty_formats
1381 " "" "${cur##--format=}"
1382 return
1384 --date=*)
1385 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1386 return
1388 --decorate=*)
1389 __gitcomp "long short" "" "${cur##--decorate=}"
1390 return
1392 --*)
1393 __gitcomp "
1394 $__git_log_common_options
1395 $__git_log_shortlog_options
1396 $__git_log_gitk_options
1397 --root --topo-order --date-order --reverse
1398 --follow --full-diff
1399 --abbrev-commit --abbrev=
1400 --relative-date --date=
1401 --pretty= --format= --oneline
1402 --cherry-pick
1403 --graph
1404 --decorate --decorate=
1405 --walk-reflogs
1406 --parents --children
1407 $merge
1408 $__git_diff_common_options
1409 --pickaxe-all --pickaxe-regex
1411 return
1413 esac
1414 __git_complete_revlist
1417 __git_merge_options="
1418 --no-commit --no-stat --log --no-log --squash --strategy
1419 --commit --stat --no-squash --ff --no-ff --ff-only
1422 _git_merge ()
1424 __git_complete_strategy && return
1426 local cur="${COMP_WORDS[COMP_CWORD]}"
1427 case "$cur" in
1428 --*)
1429 __gitcomp "$__git_merge_options"
1430 return
1431 esac
1432 __gitcomp "$(__git_refs)"
1435 _git_mergetool ()
1437 local cur="${COMP_WORDS[COMP_CWORD]}"
1438 case "$cur" in
1439 --tool=*)
1440 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1441 return
1443 --*)
1444 __gitcomp "--tool="
1445 return
1447 esac
1448 COMPREPLY=()
1451 _git_merge_base ()
1453 __gitcomp "$(__git_refs)"
1456 _git_mv ()
1458 local cur="${COMP_WORDS[COMP_CWORD]}"
1459 case "$cur" in
1460 --*)
1461 __gitcomp "--dry-run"
1462 return
1464 esac
1465 COMPREPLY=()
1468 _git_name_rev ()
1470 __gitcomp "--tags --all --stdin"
1473 _git_notes ()
1475 local subcommands="edit show"
1476 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1477 __gitcomp "$subcommands"
1478 return
1481 case "${COMP_WORDS[COMP_CWORD-1]}" in
1482 -m|-F)
1483 COMPREPLY=()
1486 __gitcomp "$(__git_refs)"
1488 esac
1491 _git_pull ()
1493 __git_complete_strategy && return
1495 local cur="${COMP_WORDS[COMP_CWORD]}"
1496 case "$cur" in
1497 --*)
1498 __gitcomp "
1499 --rebase --no-rebase
1500 $__git_merge_options
1501 $__git_fetch_options
1503 return
1505 esac
1506 __git_complete_remote_or_refspec
1509 _git_push ()
1511 local cur="${COMP_WORDS[COMP_CWORD]}"
1512 case "${COMP_WORDS[COMP_CWORD-1]}" in
1513 --repo)
1514 __gitcomp "$(__git_remotes)"
1515 return
1516 esac
1517 case "$cur" in
1518 --repo=*)
1519 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1520 return
1522 --*)
1523 __gitcomp "
1524 --all --mirror --tags --dry-run --force --verbose
1525 --receive-pack= --repo=
1527 return
1529 esac
1530 __git_complete_remote_or_refspec
1533 _git_rebase ()
1535 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1536 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1537 __gitcomp "--continue --skip --abort"
1538 return
1540 __git_complete_strategy && return
1541 case "$cur" in
1542 --whitespace=*)
1543 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1544 return
1546 --*)
1547 __gitcomp "
1548 --onto --merge --strategy --interactive
1549 --preserve-merges --stat --no-stat
1550 --committer-date-is-author-date --ignore-date
1551 --ignore-whitespace --whitespace=
1552 --autosquash
1555 return
1556 esac
1557 __gitcomp "$(__git_refs)"
1560 __git_send_email_confirm_options="always never auto cc compose"
1561 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1563 _git_send_email ()
1565 local cur="${COMP_WORDS[COMP_CWORD]}"
1566 case "$cur" in
1567 --confirm=*)
1568 __gitcomp "
1569 $__git_send_email_confirm_options
1570 " "" "${cur##--confirm=}"
1571 return
1573 --suppress-cc=*)
1574 __gitcomp "
1575 $__git_send_email_suppresscc_options
1576 " "" "${cur##--suppress-cc=}"
1578 return
1580 --smtp-encryption=*)
1581 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1582 return
1584 --*)
1585 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1586 --compose --confirm= --dry-run --envelope-sender
1587 --from --identity
1588 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1589 --no-suppress-from --no-thread --quiet
1590 --signed-off-by-cc --smtp-pass --smtp-server
1591 --smtp-server-port --smtp-encryption= --smtp-user
1592 --subject --suppress-cc= --suppress-from --thread --to
1593 --validate --no-validate"
1594 return
1596 esac
1597 COMPREPLY=()
1600 _git_stage ()
1602 _git_add
1605 __git_config_get_set_variables ()
1607 local prevword word config_file= c=$COMP_CWORD
1608 while [ $c -gt 1 ]; do
1609 word="${COMP_WORDS[c]}"
1610 case "$word" in
1611 --global|--system|--file=*)
1612 config_file="$word"
1613 break
1615 -f|--file)
1616 config_file="$word $prevword"
1617 break
1619 esac
1620 prevword=$word
1621 c=$((--c))
1622 done
1624 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1625 while read line
1627 case "$line" in
1628 *.*=*)
1629 echo "${line/=*/}"
1631 esac
1632 done
1635 _git_config ()
1637 local cur="${COMP_WORDS[COMP_CWORD]}"
1638 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1639 case "$prv" in
1640 branch.*.remote)
1641 __gitcomp "$(__git_remotes)"
1642 return
1644 branch.*.merge)
1645 __gitcomp "$(__git_refs)"
1646 return
1648 remote.*.fetch)
1649 local remote="${prv#remote.}"
1650 remote="${remote%.fetch}"
1651 __gitcomp "$(__git_refs_remotes "$remote")"
1652 return
1654 remote.*.push)
1655 local remote="${prv#remote.}"
1656 remote="${remote%.push}"
1657 __gitcomp "$(git --git-dir="$(__gitdir)" \
1658 for-each-ref --format='%(refname):%(refname)' \
1659 refs/heads)"
1660 return
1662 pull.twohead|pull.octopus)
1663 __git_compute_merge_strategies
1664 __gitcomp "$__git_merge_strategies"
1665 return
1667 color.branch|color.diff|color.interactive|\
1668 color.showbranch|color.status|color.ui)
1669 __gitcomp "always never auto"
1670 return
1672 color.pager)
1673 __gitcomp "false true"
1674 return
1676 color.*.*)
1677 __gitcomp "
1678 normal black red green yellow blue magenta cyan white
1679 bold dim ul blink reverse
1681 return
1683 help.format)
1684 __gitcomp "man info web html"
1685 return
1687 log.date)
1688 __gitcomp "$__git_log_date_formats"
1689 return
1691 sendemail.aliasesfiletype)
1692 __gitcomp "mutt mailrc pine elm gnus"
1693 return
1695 sendemail.confirm)
1696 __gitcomp "$__git_send_email_confirm_options"
1697 return
1699 sendemail.suppresscc)
1700 __gitcomp "$__git_send_email_suppresscc_options"
1701 return
1703 --get|--get-all|--unset|--unset-all)
1704 __gitcomp "$(__git_config_get_set_variables)"
1705 return
1707 *.*)
1708 COMPREPLY=()
1709 return
1711 esac
1712 case "$cur" in
1713 --*)
1714 __gitcomp "
1715 --global --system --file=
1716 --list --replace-all
1717 --get --get-all --get-regexp
1718 --add --unset --unset-all
1719 --remove-section --rename-section
1721 return
1723 branch.*.*)
1724 local pfx="${cur%.*}."
1725 cur="${cur##*.}"
1726 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
1727 return
1729 branch.*)
1730 local pfx="${cur%.*}."
1731 cur="${cur#*.}"
1732 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1733 return
1735 guitool.*.*)
1736 local pfx="${cur%.*}."
1737 cur="${cur##*.}"
1738 __gitcomp "
1739 argprompt cmd confirm needsfile noconsole norescan
1740 prompt revprompt revunmerged title
1741 " "$pfx" "$cur"
1742 return
1744 difftool.*.*)
1745 local pfx="${cur%.*}."
1746 cur="${cur##*.}"
1747 __gitcomp "cmd path" "$pfx" "$cur"
1748 return
1750 man.*.*)
1751 local pfx="${cur%.*}."
1752 cur="${cur##*.}"
1753 __gitcomp "cmd path" "$pfx" "$cur"
1754 return
1756 mergetool.*.*)
1757 local pfx="${cur%.*}."
1758 cur="${cur##*.}"
1759 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1760 return
1762 pager.*)
1763 local pfx="${cur%.*}."
1764 cur="${cur#*.}"
1765 __git_compute_all_commands
1766 __gitcomp "$__git_all_commands" "$pfx" "$cur"
1767 return
1769 remote.*.*)
1770 local pfx="${cur%.*}."
1771 cur="${cur##*.}"
1772 __gitcomp "
1773 url proxy fetch push mirror skipDefaultUpdate
1774 receivepack uploadpack tagopt pushurl
1775 " "$pfx" "$cur"
1776 return
1778 remote.*)
1779 local pfx="${cur%.*}."
1780 cur="${cur#*.}"
1781 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1782 return
1784 url.*.*)
1785 local pfx="${cur%.*}."
1786 cur="${cur##*.}"
1787 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur"
1788 return
1790 esac
1791 __gitcomp "
1792 add.ignore-errors
1793 alias.
1794 apply.ignorewhitespace
1795 apply.whitespace
1796 branch.autosetupmerge
1797 branch.autosetuprebase
1798 clean.requireForce
1799 color.branch
1800 color.branch.current
1801 color.branch.local
1802 color.branch.plain
1803 color.branch.remote
1804 color.diff
1805 color.diff.commit
1806 color.diff.frag
1807 color.diff.meta
1808 color.diff.new
1809 color.diff.old
1810 color.diff.plain
1811 color.diff.whitespace
1812 color.grep
1813 color.grep.external
1814 color.grep.match
1815 color.interactive
1816 color.interactive.header
1817 color.interactive.help
1818 color.interactive.prompt
1819 color.pager
1820 color.showbranch
1821 color.status
1822 color.status.added
1823 color.status.changed
1824 color.status.header
1825 color.status.nobranch
1826 color.status.untracked
1827 color.status.updated
1828 color.ui
1829 commit.template
1830 core.autocrlf
1831 core.bare
1832 core.compression
1833 core.createObject
1834 core.deltaBaseCacheLimit
1835 core.editor
1836 core.excludesfile
1837 core.fileMode
1838 core.fsyncobjectfiles
1839 core.gitProxy
1840 core.ignoreCygwinFSTricks
1841 core.ignoreStat
1842 core.logAllRefUpdates
1843 core.loosecompression
1844 core.packedGitLimit
1845 core.packedGitWindowSize
1846 core.pager
1847 core.preferSymlinkRefs
1848 core.preloadindex
1849 core.quotepath
1850 core.repositoryFormatVersion
1851 core.safecrlf
1852 core.sharedRepository
1853 core.symlinks
1854 core.trustctime
1855 core.warnAmbiguousRefs
1856 core.whitespace
1857 core.worktree
1858 diff.autorefreshindex
1859 diff.external
1860 diff.mnemonicprefix
1861 diff.renameLimit
1862 diff.renameLimit.
1863 diff.renames
1864 diff.suppressBlankEmpty
1865 diff.tool
1866 diff.wordRegex
1867 difftool.
1868 difftool.prompt
1869 fetch.unpackLimit
1870 format.attach
1871 format.cc
1872 format.headers
1873 format.numbered
1874 format.pretty
1875 format.signature
1876 format.signoff
1877 format.subjectprefix
1878 format.suffix
1879 format.thread
1880 gc.aggressiveWindow
1881 gc.auto
1882 gc.autopacklimit
1883 gc.packrefs
1884 gc.pruneexpire
1885 gc.reflogexpire
1886 gc.reflogexpireunreachable
1887 gc.rerereresolved
1888 gc.rerereunresolved
1889 gitcvs.allbinary
1890 gitcvs.commitmsgannotation
1891 gitcvs.dbTableNamePrefix
1892 gitcvs.dbdriver
1893 gitcvs.dbname
1894 gitcvs.dbpass
1895 gitcvs.dbuser
1896 gitcvs.enabled
1897 gitcvs.logfile
1898 gitcvs.usecrlfattr
1899 guitool.
1900 gui.blamehistoryctx
1901 gui.commitmsgwidth
1902 gui.copyblamethreshold
1903 gui.diffcontext
1904 gui.encoding
1905 gui.fastcopyblame
1906 gui.matchtrackingbranch
1907 gui.newbranchtemplate
1908 gui.pruneduringfetch
1909 gui.spellingdictionary
1910 gui.trustmtime
1911 help.autocorrect
1912 help.browser
1913 help.format
1914 http.lowSpeedLimit
1915 http.lowSpeedTime
1916 http.maxRequests
1917 http.noEPSV
1918 http.proxy
1919 http.sslCAInfo
1920 http.sslCAPath
1921 http.sslCert
1922 http.sslKey
1923 http.sslVerify
1924 i18n.commitEncoding
1925 i18n.logOutputEncoding
1926 imap.folder
1927 imap.host
1928 imap.pass
1929 imap.port
1930 imap.preformattedHTML
1931 imap.sslverify
1932 imap.tunnel
1933 imap.user
1934 instaweb.browser
1935 instaweb.httpd
1936 instaweb.local
1937 instaweb.modulepath
1938 instaweb.port
1939 interactive.singlekey
1940 log.date
1941 log.showroot
1942 mailmap.file
1943 man.
1944 man.viewer
1945 merge.conflictstyle
1946 merge.log
1947 merge.renameLimit
1948 merge.stat
1949 merge.tool
1950 merge.verbosity
1951 mergetool.
1952 mergetool.keepBackup
1953 mergetool.prompt
1954 pack.compression
1955 pack.deltaCacheLimit
1956 pack.deltaCacheSize
1957 pack.depth
1958 pack.indexVersion
1959 pack.packSizeLimit
1960 pack.threads
1961 pack.window
1962 pack.windowMemory
1963 pager.
1964 pull.octopus
1965 pull.twohead
1966 push.default
1967 rebase.stat
1968 receive.denyCurrentBranch
1969 receive.denyDeletes
1970 receive.denyNonFastForwards
1971 receive.fsckObjects
1972 receive.unpackLimit
1973 repack.usedeltabaseoffset
1974 rerere.autoupdate
1975 rerere.enabled
1976 sendemail.aliasesfile
1977 sendemail.aliasesfiletype
1978 sendemail.bcc
1979 sendemail.cc
1980 sendemail.cccmd
1981 sendemail.chainreplyto
1982 sendemail.confirm
1983 sendemail.envelopesender
1984 sendemail.multiedit
1985 sendemail.signedoffbycc
1986 sendemail.smtpencryption
1987 sendemail.smtppass
1988 sendemail.smtpserver
1989 sendemail.smtpserverport
1990 sendemail.smtpuser
1991 sendemail.suppresscc
1992 sendemail.suppressfrom
1993 sendemail.thread
1994 sendemail.to
1995 sendemail.validate
1996 showbranch.default
1997 status.relativePaths
1998 status.showUntrackedFiles
1999 tar.umask
2000 transfer.unpackLimit
2001 url.
2002 user.email
2003 user.name
2004 user.signingkey
2005 web.browser
2006 branch. remote.
2010 _git_remote ()
2012 local subcommands="add rename rm show prune update set-head"
2013 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2014 if [ -z "$subcommand" ]; then
2015 __gitcomp "$subcommands"
2016 return
2019 case "$subcommand" in
2020 rename|rm|show|prune)
2021 __gitcomp "$(__git_remotes)"
2023 update)
2024 local i c='' IFS=$'\n'
2025 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2026 i="${i#remotes.}"
2027 c="$c ${i/ */}"
2028 done
2029 __gitcomp "$c"
2032 COMPREPLY=()
2034 esac
2037 _git_replace ()
2039 __gitcomp "$(__git_refs)"
2042 _git_reset ()
2044 __git_has_doubledash && return
2046 local cur="${COMP_WORDS[COMP_CWORD]}"
2047 case "$cur" in
2048 --*)
2049 __gitcomp "--merge --mixed --hard --soft --patch"
2050 return
2052 esac
2053 __gitcomp "$(__git_refs)"
2056 _git_revert ()
2058 local cur="${COMP_WORDS[COMP_CWORD]}"
2059 case "$cur" in
2060 --*)
2061 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2062 return
2064 esac
2065 __gitcomp "$(__git_refs)"
2068 _git_rm ()
2070 __git_has_doubledash && return
2072 local cur="${COMP_WORDS[COMP_CWORD]}"
2073 case "$cur" in
2074 --*)
2075 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2076 return
2078 esac
2079 COMPREPLY=()
2082 _git_shortlog ()
2084 __git_has_doubledash && return
2086 local cur="${COMP_WORDS[COMP_CWORD]}"
2087 case "$cur" in
2088 --*)
2089 __gitcomp "
2090 $__git_log_common_options
2091 $__git_log_shortlog_options
2092 --numbered --summary
2094 return
2096 esac
2097 __git_complete_revlist
2100 _git_show ()
2102 __git_has_doubledash && return
2104 local cur="${COMP_WORDS[COMP_CWORD]}"
2105 case "$cur" in
2106 --pretty=*)
2107 __gitcomp "$__git_log_pretty_formats
2108 " "" "${cur##--pretty=}"
2109 return
2111 --format=*)
2112 __gitcomp "$__git_log_pretty_formats
2113 " "" "${cur##--format=}"
2114 return
2116 --*)
2117 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2118 $__git_diff_common_options
2120 return
2122 esac
2123 __git_complete_file
2126 _git_show_branch ()
2128 local cur="${COMP_WORDS[COMP_CWORD]}"
2129 case "$cur" in
2130 --*)
2131 __gitcomp "
2132 --all --remotes --topo-order --current --more=
2133 --list --independent --merge-base --no-name
2134 --color --no-color
2135 --sha1-name --sparse --topics --reflog
2137 return
2139 esac
2140 __git_complete_revlist
2143 _git_stash ()
2145 local cur="${COMP_WORDS[COMP_CWORD]}"
2146 local save_opts='--keep-index --no-keep-index --quiet --patch'
2147 local subcommands='save list show apply clear drop pop create branch'
2148 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2149 if [ -z "$subcommand" ]; then
2150 case "$cur" in
2151 --*)
2152 __gitcomp "$save_opts"
2155 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2156 __gitcomp "$subcommands"
2157 else
2158 COMPREPLY=()
2161 esac
2162 else
2163 case "$subcommand,$cur" in
2164 save,--*)
2165 __gitcomp "$save_opts"
2167 apply,--*|pop,--*)
2168 __gitcomp "--index --quiet"
2170 show,--*|drop,--*|branch,--*)
2171 COMPREPLY=()
2173 show,*|apply,*|drop,*|pop,*|branch,*)
2174 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
2175 | sed -n -e 's/:.*//p')"
2178 COMPREPLY=()
2180 esac
2184 _git_submodule ()
2186 __git_has_doubledash && return
2188 local subcommands="add status init update summary foreach sync"
2189 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2190 local cur="${COMP_WORDS[COMP_CWORD]}"
2191 case "$cur" in
2192 --*)
2193 __gitcomp "--quiet --cached"
2196 __gitcomp "$subcommands"
2198 esac
2199 return
2203 _git_svn ()
2205 local subcommands="
2206 init fetch clone rebase dcommit log find-rev
2207 set-tree commit-diff info create-ignore propget
2208 proplist show-ignore show-externals branch tag blame
2209 migrate mkdirs reset gc
2211 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2212 if [ -z "$subcommand" ]; then
2213 __gitcomp "$subcommands"
2214 else
2215 local remote_opts="--username= --config-dir= --no-auth-cache"
2216 local fc_opts="
2217 --follow-parent --authors-file= --repack=
2218 --no-metadata --use-svm-props --use-svnsync-props
2219 --log-window-size= --no-checkout --quiet
2220 --repack-flags --use-log-author --localtime
2221 --ignore-paths= $remote_opts
2223 local init_opts="
2224 --template= --shared= --trunk= --tags=
2225 --branches= --stdlayout --minimize-url
2226 --no-metadata --use-svm-props --use-svnsync-props
2227 --rewrite-root= --prefix= --use-log-author
2228 --add-author-from $remote_opts
2230 local cmt_opts="
2231 --edit --rmdir --find-copies-harder --copy-similarity=
2234 local cur="${COMP_WORDS[COMP_CWORD]}"
2235 case "$subcommand,$cur" in
2236 fetch,--*)
2237 __gitcomp "--revision= --fetch-all $fc_opts"
2239 clone,--*)
2240 __gitcomp "--revision= $fc_opts $init_opts"
2242 init,--*)
2243 __gitcomp "$init_opts"
2245 dcommit,--*)
2246 __gitcomp "
2247 --merge --strategy= --verbose --dry-run
2248 --fetch-all --no-rebase --commit-url
2249 --revision $cmt_opts $fc_opts
2252 set-tree,--*)
2253 __gitcomp "--stdin $cmt_opts $fc_opts"
2255 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2256 show-externals,--*|mkdirs,--*)
2257 __gitcomp "--revision="
2259 log,--*)
2260 __gitcomp "
2261 --limit= --revision= --verbose --incremental
2262 --oneline --show-commit --non-recursive
2263 --authors-file= --color
2266 rebase,--*)
2267 __gitcomp "
2268 --merge --verbose --strategy= --local
2269 --fetch-all --dry-run $fc_opts
2272 commit-diff,--*)
2273 __gitcomp "--message= --file= --revision= $cmt_opts"
2275 info,--*)
2276 __gitcomp "--url"
2278 branch,--*)
2279 __gitcomp "--dry-run --message --tag"
2281 tag,--*)
2282 __gitcomp "--dry-run --message"
2284 blame,--*)
2285 __gitcomp "--git-format"
2287 migrate,--*)
2288 __gitcomp "
2289 --config-dir= --ignore-paths= --minimize
2290 --no-auth-cache --username=
2293 reset,--*)
2294 __gitcomp "--revision= --parent"
2297 COMPREPLY=()
2299 esac
2303 _git_tag ()
2305 local i c=1 f=0
2306 while [ $c -lt $COMP_CWORD ]; do
2307 i="${COMP_WORDS[c]}"
2308 case "$i" in
2309 -d|-v)
2310 __gitcomp "$(__git_tags)"
2311 return
2316 esac
2317 c=$((++c))
2318 done
2320 case "${COMP_WORDS[COMP_CWORD-1]}" in
2321 -m|-F)
2322 COMPREPLY=()
2324 -*|tag)
2325 if [ $f = 1 ]; then
2326 __gitcomp "$(__git_tags)"
2327 else
2328 COMPREPLY=()
2332 __gitcomp "$(__git_refs)"
2334 esac
2337 _git_whatchanged ()
2339 _git_log
2342 _git ()
2344 local i c=1 command __git_dir
2346 while [ $c -lt $COMP_CWORD ]; do
2347 i="${COMP_WORDS[c]}"
2348 case "$i" in
2349 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2350 --bare) __git_dir="." ;;
2351 --version|-p|--paginate) ;;
2352 --help) command="help"; break ;;
2353 *) command="$i"; break ;;
2354 esac
2355 c=$((++c))
2356 done
2358 if [ -z "$command" ]; then
2359 case "${COMP_WORDS[COMP_CWORD]}" in
2360 --*) __gitcomp "
2361 --paginate
2362 --no-pager
2363 --git-dir=
2364 --bare
2365 --version
2366 --exec-path
2367 --html-path
2368 --work-tree=
2369 --help
2372 *) __git_compute_porcelain_commands
2373 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2374 esac
2375 return
2378 local completion_func="_git_${command//-/_}"
2379 declare -F $completion_func >/dev/null && $completion_func && return
2381 local expansion=$(__git_aliased_command "$command")
2382 if [ -n "$expansion" ]; then
2383 completion_func="_git_${expansion//-/_}"
2384 declare -F $completion_func >/dev/null && $completion_func
2388 _gitk ()
2390 __git_has_doubledash && return
2392 local cur="${COMP_WORDS[COMP_CWORD]}"
2393 local g="$(__gitdir)"
2394 local merge=""
2395 if [ -f "$g/MERGE_HEAD" ]; then
2396 merge="--merge"
2398 case "$cur" in
2399 --*)
2400 __gitcomp "
2401 $__git_log_common_options
2402 $__git_log_gitk_options
2403 $merge
2405 return
2407 esac
2408 __git_complete_revlist
2411 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2412 || complete -o default -o nospace -F _git git
2413 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2414 || complete -o default -o nospace -F _gitk gitk
2416 # The following are necessary only for Cygwin, and only are needed
2417 # when the user has tab-completed the executable name and consequently
2418 # included the '.exe' suffix.
2420 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2421 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2422 || complete -o default -o nospace -F _git git.exe