completion: fix issue with process substitution not working on Git for Windows
[git/jnareb-git.git] / contrib / completion / git-completion.bash
blobfc3d0b1a0678ddf99c592959d2fe58c59543ec40
1 #!bash
3 # bash/zsh 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) Add the following line to your .bashrc/.zshrc:
22 # source ~/.git-completion.sh
24 # 3) Consider changing your PS1 to also show the current branch:
25 # Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
26 # ZSH: PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
28 # The argument to __git_ps1 will be displayed only if you
29 # are currently in a git repository. The %s token will be
30 # the name of the current branch.
32 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
33 # value, unstaged (*) and staged (+) changes will be shown next
34 # to the branch name. You can configure this per-repository
35 # with the bash.showDirtyState variable, which defaults to true
36 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
38 # You can also see if currently something is stashed, by setting
39 # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
40 # then a '$' will be shown next to the branch name.
42 # If you would like to see if there're untracked files, then you can
43 # set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
44 # untracked files, then a '%' will be shown next to the branch name.
46 # If you would like to see the difference between HEAD and its
47 # upstream, set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates
48 # you are behind, ">" indicates you are ahead, and "<>"
49 # indicates you have diverged. You can further control
50 # behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated
51 # list of values:
52 # verbose show number of commits ahead/behind (+/-) upstream
53 # legacy don't use the '--count' option available in recent
54 # versions of git-rev-list
55 # git always compare HEAD to @{upstream}
56 # svn always compare HEAD to your SVN upstream
57 # By default, __git_ps1 will compare HEAD to your SVN upstream
58 # if it can find one, or @{upstream} otherwise. Once you have
59 # set GIT_PS1_SHOWUPSTREAM, you can override it on a
60 # per-repository basis by setting the bash.showUpstream config
61 # variable.
64 # To submit patches:
66 # *) Read Documentation/SubmittingPatches
67 # *) Send all patches to the current maintainer:
69 # "Shawn O. Pearce" <spearce@spearce.org>
71 # *) Always CC the Git mailing list:
73 # git@vger.kernel.org
76 if [[ -n ${ZSH_VERSION-} ]]; then
77 autoload -U +X bashcompinit && bashcompinit
80 case "$COMP_WORDBREAKS" in
81 *:*) : great ;;
82 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
83 esac
85 # __gitdir accepts 0 or 1 arguments (i.e., location)
86 # returns location of .git repo
87 __gitdir ()
89 if [ -z "${1-}" ]; then
90 if [ -n "${__git_dir-}" ]; then
91 echo "$__git_dir"
92 elif [ -d .git ]; then
93 echo .git
94 else
95 git rev-parse --git-dir 2>/dev/null
97 elif [ -d "$1/.git" ]; then
98 echo "$1/.git"
99 else
100 echo "$1"
104 # stores the divergence from upstream in $p
105 # used by GIT_PS1_SHOWUPSTREAM
106 __git_ps1_show_upstream ()
108 local key value
109 local svn_remote=() svn_url_pattern count n
110 local upstream=git legacy="" verbose=""
112 # get some config options from git-config
113 output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')"
114 while read key value; do
115 case "$key" in
116 bash.showupstream)
117 GIT_PS1_SHOWUPSTREAM="$value"
118 if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
119 p=""
120 return
123 svn-remote.*.url)
124 svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
125 svn_url_pattern+="\\|$value"
126 upstream=svn+git # default upstream is SVN if available, else git
128 esac
129 done <<< "$output"
131 # parse configuration values
132 for option in ${GIT_PS1_SHOWUPSTREAM}; do
133 case "$option" in
134 git|svn) upstream="$option" ;;
135 verbose) verbose=1 ;;
136 legacy) legacy=1 ;;
137 esac
138 done
140 # Find our upstream
141 case "$upstream" in
142 git) upstream="@{upstream}" ;;
143 svn*)
144 # get the upstream from the "git-svn-id: ..." in a commit message
145 # (git-svn uses essentially the same procedure internally)
146 local svn_upstream=($(git log --first-parent -1 \
147 --grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null))
148 if [[ 0 -ne ${#svn_upstream[@]} ]]; then
149 svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
150 svn_upstream=${svn_upstream%@*}
151 local n_stop="${#svn_remote[@]}"
152 for ((n=1; n <= n_stop; ++n)); do
153 svn_upstream=${svn_upstream#${svn_remote[$n]}}
154 done
156 if [[ -z "$svn_upstream" ]]; then
157 # default branch name for checkouts with no layout:
158 upstream=${GIT_SVN_ID:-git-svn}
159 else
160 upstream=${svn_upstream#/}
162 elif [[ "svn+git" = "$upstream" ]]; then
163 upstream="@{upstream}"
166 esac
168 # Find how many commits we are ahead/behind our upstream
169 if [[ -z "$legacy" ]]; then
170 count="$(git rev-list --count --left-right \
171 "$upstream"...HEAD 2>/dev/null)"
172 else
173 # produce equivalent output to --count for older versions of git
174 local commits
175 if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
176 then
177 local commit behind=0 ahead=0
178 for commit in $commits
180 case "$commit" in
181 "<"*) let ++behind
183 *) let ++ahead
185 esac
186 done
187 count="$behind $ahead"
188 else
189 count=""
193 # calculate the result
194 if [[ -z "$verbose" ]]; then
195 case "$count" in
196 "") # no upstream
197 p="" ;;
198 "0 0") # equal to upstream
199 p="=" ;;
200 "0 "*) # ahead of upstream
201 p=">" ;;
202 *" 0") # behind upstream
203 p="<" ;;
204 *) # diverged from upstream
205 p="<>" ;;
206 esac
207 else
208 case "$count" in
209 "") # no upstream
210 p="" ;;
211 "0 0") # equal to upstream
212 p=" u=" ;;
213 "0 "*) # ahead of upstream
214 p=" u+${count#0 }" ;;
215 *" 0") # behind upstream
216 p=" u-${count% 0}" ;;
217 *) # diverged from upstream
218 p=" u+${count#* }-${count% *}" ;;
219 esac
225 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
226 # returns text to add to bash PS1 prompt (includes branch name)
227 __git_ps1 ()
229 local g="$(__gitdir)"
230 if [ -n "$g" ]; then
231 local r=""
232 local b=""
233 if [ -f "$g/rebase-merge/interactive" ]; then
234 r="|REBASE-i"
235 b="$(cat "$g/rebase-merge/head-name")"
236 elif [ -d "$g/rebase-merge" ]; then
237 r="|REBASE-m"
238 b="$(cat "$g/rebase-merge/head-name")"
239 else
240 if [ -d "$g/rebase-apply" ]; then
241 if [ -f "$g/rebase-apply/rebasing" ]; then
242 r="|REBASE"
243 elif [ -f "$g/rebase-apply/applying" ]; then
244 r="|AM"
245 else
246 r="|AM/REBASE"
248 elif [ -f "$g/MERGE_HEAD" ]; then
249 r="|MERGING"
250 elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
251 r="|CHERRY-PICKING"
252 elif [ -f "$g/BISECT_LOG" ]; then
253 r="|BISECTING"
256 b="$(git symbolic-ref HEAD 2>/dev/null)" || {
258 b="$(
259 case "${GIT_PS1_DESCRIBE_STYLE-}" in
260 (contains)
261 git describe --contains HEAD ;;
262 (branch)
263 git describe --contains --all HEAD ;;
264 (describe)
265 git describe HEAD ;;
266 (* | default)
267 git describe --tags --exact-match HEAD ;;
268 esac 2>/dev/null)" ||
270 b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
271 b="unknown"
272 b="($b)"
276 local w=""
277 local i=""
278 local s=""
279 local u=""
280 local c=""
281 local p=""
283 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
284 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
285 c="BARE:"
286 else
287 b="GIT_DIR!"
289 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
290 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
291 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
292 git diff --no-ext-diff --quiet --exit-code || w="*"
293 if git rev-parse --quiet --verify HEAD >/dev/null; then
294 git diff-index --cached --quiet HEAD -- || i="+"
295 else
296 i="#"
300 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
301 git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
304 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
305 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
306 u="%"
310 if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
311 __git_ps1_show_upstream
315 local f="$w$i$s$u"
316 printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p"
320 # __gitcomp_1 requires 2 arguments
321 __gitcomp_1 ()
323 local c IFS=' '$'\t'$'\n'
324 for c in $1; do
325 case "$c$2" in
326 --*=*) printf %s$'\n' "$c$2" ;;
327 *.) printf %s$'\n' "$c$2" ;;
328 *) printf %s$'\n' "$c$2 " ;;
329 esac
330 done
333 # The following function is based on code from:
335 # bash_completion - programmable completion functions for bash 3.2+
337 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
338 # © 2009-2010, Bash Completion Maintainers
339 # <bash-completion-devel@lists.alioth.debian.org>
341 # This program is free software; you can redistribute it and/or modify
342 # it under the terms of the GNU General Public License as published by
343 # the Free Software Foundation; either version 2, or (at your option)
344 # any later version.
346 # This program is distributed in the hope that it will be useful,
347 # but WITHOUT ANY WARRANTY; without even the implied warranty of
348 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
349 # GNU General Public License for more details.
351 # You should have received a copy of the GNU General Public License
352 # along with this program; if not, write to the Free Software Foundation,
353 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
355 # The latest version of this software can be obtained here:
357 # http://bash-completion.alioth.debian.org/
359 # RELEASE: 2.x
361 # This function can be used to access a tokenized list of words
362 # on the command line:
364 # __git_reassemble_comp_words_by_ref '=:'
365 # if test "${words_[cword_-1]}" = -w
366 # then
367 # ...
368 # fi
370 # The argument should be a collection of characters from the list of
371 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
372 # characters.
374 # This is roughly equivalent to going back in time and setting
375 # COMP_WORDBREAKS to exclude those characters. The intent is to
376 # make option types like --date=<type> and <rev>:<path> easy to
377 # recognize by treating each shell word as a single token.
379 # It is best not to set COMP_WORDBREAKS directly because the value is
380 # shared with other completion scripts. By the time the completion
381 # function gets called, COMP_WORDS has already been populated so local
382 # changes to COMP_WORDBREAKS have no effect.
384 # Output: words_, cword_, cur_.
386 __git_reassemble_comp_words_by_ref()
388 local exclude i j first
389 # Which word separators to exclude?
390 exclude="${1//[^$COMP_WORDBREAKS]}"
391 cword_=$COMP_CWORD
392 if [ -z "$exclude" ]; then
393 words_=("${COMP_WORDS[@]}")
394 return
396 # List of word completion separators has shrunk;
397 # re-assemble words to complete.
398 for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
399 # Append each nonempty word consisting of just
400 # word separator characters to the current word.
401 first=t
402 while
403 [ $i -gt 0 ] &&
404 [ -n "${COMP_WORDS[$i]}" ] &&
405 # word consists of excluded word separators
406 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
408 # Attach to the previous token,
409 # unless the previous token is the command name.
410 if [ $j -ge 2 ] && [ -n "$first" ]; then
411 ((j--))
413 first=
414 words_[$j]=${words_[j]}${COMP_WORDS[i]}
415 if [ $i = $COMP_CWORD ]; then
416 cword_=$j
418 if (($i < ${#COMP_WORDS[@]} - 1)); then
419 ((i++))
420 else
421 # Done.
422 return
424 done
425 words_[$j]=${words_[j]}${COMP_WORDS[i]}
426 if [ $i = $COMP_CWORD ]; then
427 cword_=$j
429 done
432 if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
433 if [[ -z ${ZSH_VERSION:+set} ]]; then
434 _get_comp_words_by_ref ()
436 local exclude cur_ words_ cword_
437 if [ "$1" = "-n" ]; then
438 exclude=$2
439 shift 2
441 __git_reassemble_comp_words_by_ref "$exclude"
442 cur_=${words_[cword_]}
443 while [ $# -gt 0 ]; do
444 case "$1" in
445 cur)
446 cur=$cur_
448 prev)
449 prev=${words_[$cword_-1]}
451 words)
452 words=("${words_[@]}")
454 cword)
455 cword=$cword_
457 esac
458 shift
459 done
461 else
462 _get_comp_words_by_ref ()
464 while [ $# -gt 0 ]; do
465 case "$1" in
466 cur)
467 cur=${COMP_WORDS[COMP_CWORD]}
469 prev)
470 prev=${COMP_WORDS[COMP_CWORD-1]}
472 words)
473 words=("${COMP_WORDS[@]}")
475 cword)
476 cword=$COMP_CWORD
479 # assume COMP_WORDBREAKS is already set sanely
480 shift
482 esac
483 shift
484 done
489 # __gitcomp accepts 1, 2, 3, or 4 arguments
490 # generates completion reply with compgen
491 __gitcomp ()
493 local cur_="$cur"
495 if [ $# -gt 2 ]; then
496 cur_="$3"
498 case "$cur_" in
499 --*=)
500 COMPREPLY=()
503 local IFS=$'\n'
504 COMPREPLY=($(compgen -P "${2-}" \
505 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
506 -- "$cur_"))
508 esac
511 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
512 __git_heads ()
514 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
515 if [ -d "$dir" ]; then
516 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
517 refs/heads
518 return
520 for i in $(git ls-remote "${1-}" 2>/dev/null); do
521 case "$is_hash,$i" in
522 y,*) is_hash=n ;;
523 n,*^{}) is_hash=y ;;
524 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
525 n,*) is_hash=y; echo "$i" ;;
526 esac
527 done
530 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
531 __git_tags ()
533 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
534 if [ -d "$dir" ]; then
535 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
536 refs/tags
537 return
539 for i in $(git ls-remote "${1-}" 2>/dev/null); do
540 case "$is_hash,$i" in
541 y,*) is_hash=n ;;
542 n,*^{}) is_hash=y ;;
543 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
544 n,*) is_hash=y; echo "$i" ;;
545 esac
546 done
549 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
550 # presence of 2nd argument means use the guess heuristic employed
551 # by checkout for tracking branches
552 __git_refs ()
554 local i is_hash=y dir="$(__gitdir "${1-}")" track="${2-}"
555 local format refs
556 if [ -d "$dir" ]; then
557 case "$cur" in
558 refs|refs/*)
559 format="refname"
560 refs="${cur%/*}"
561 track=""
564 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
565 if [ -e "$dir/$i" ]; then echo $i; fi
566 done
567 format="refname:short"
568 refs="refs/tags refs/heads refs/remotes"
570 esac
571 git --git-dir="$dir" for-each-ref --format="%($format)" \
572 $refs
573 if [ -n "$track" ]; then
574 # employ the heuristic used by git checkout
575 # Try to find a remote branch that matches the completion word
576 # but only output if the branch name is unique
577 local ref entry
578 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
579 "refs/remotes/" | \
580 while read entry; do
581 eval "$entry"
582 ref="${ref#*/}"
583 if [[ "$ref" == "$cur"* ]]; then
584 echo "$ref"
586 done | uniq -u
588 return
590 for i in $(git ls-remote "$dir" 2>/dev/null); do
591 case "$is_hash,$i" in
592 y,*) is_hash=n ;;
593 n,*^{}) is_hash=y ;;
594 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
595 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
596 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
597 n,*) is_hash=y; echo "$i" ;;
598 esac
599 done
602 # __git_refs2 requires 1 argument (to pass to __git_refs)
603 __git_refs2 ()
605 local i
606 for i in $(__git_refs "$1"); do
607 echo "$i:$i"
608 done
611 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
612 __git_refs_remotes ()
614 local cmd i is_hash=y
615 for i in $(git ls-remote "$1" 2>/dev/null); do
616 case "$is_hash,$i" in
617 n,refs/heads/*)
618 is_hash=y
619 echo "$i:refs/remotes/$1/${i#refs/heads/}"
621 y,*) is_hash=n ;;
622 n,*^{}) is_hash=y ;;
623 n,refs/tags/*) is_hash=y;;
624 n,*) is_hash=y; ;;
625 esac
626 done
629 __git_remotes ()
631 local i ngoff IFS=$'\n' d="$(__gitdir)"
632 __git_shopt -q nullglob || ngoff=1
633 __git_shopt -s nullglob
634 for i in "$d/remotes"/*; do
635 echo ${i#$d/remotes/}
636 done
637 [ "$ngoff" ] && __git_shopt -u nullglob
638 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
639 i="${i#remote.}"
640 echo "${i/.url*/}"
641 done
644 __git_list_merge_strategies ()
646 git merge -s help 2>&1 |
647 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
648 s/\.$//
649 s/.*://
650 s/^[ ]*//
651 s/[ ]*$//
656 __git_merge_strategies=
657 # 'git merge -s help' (and thus detection of the merge strategy
658 # list) fails, unfortunately, if run outside of any git working
659 # tree. __git_merge_strategies is set to the empty string in
660 # that case, and the detection will be repeated the next time it
661 # is needed.
662 __git_compute_merge_strategies ()
664 : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
667 __git_complete_revlist_file ()
669 local pfx ls ref cur_="$cur"
670 case "$cur_" in
671 *..?*:*)
672 return
674 ?*:*)
675 ref="${cur_%%:*}"
676 cur_="${cur_#*:}"
677 case "$cur_" in
678 ?*/*)
679 pfx="${cur_%/*}"
680 cur_="${cur_##*/}"
681 ls="$ref:$pfx"
682 pfx="$pfx/"
685 ls="$ref"
687 esac
689 case "$COMP_WORDBREAKS" in
690 *:*) : great ;;
691 *) pfx="$ref:$pfx" ;;
692 esac
694 local IFS=$'\n'
695 COMPREPLY=($(compgen -P "$pfx" \
696 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
697 | sed '/^100... blob /{
698 s,^.* ,,
699 s,$, ,
701 /^120000 blob /{
702 s,^.* ,,
703 s,$, ,
705 /^040000 tree /{
706 s,^.* ,,
707 s,$,/,
709 s/^.* //')" \
710 -- "$cur_"))
712 *...*)
713 pfx="${cur_%...*}..."
714 cur_="${cur_#*...}"
715 __gitcomp "$(__git_refs)" "$pfx" "$cur_"
717 *..*)
718 pfx="${cur_%..*}.."
719 cur_="${cur_#*..}"
720 __gitcomp "$(__git_refs)" "$pfx" "$cur_"
723 __gitcomp "$(__git_refs)"
725 esac
729 __git_complete_file ()
731 __git_complete_revlist_file
734 __git_complete_revlist ()
736 __git_complete_revlist_file
739 __git_complete_remote_or_refspec ()
741 local cur_="$cur" cmd="${words[1]}"
742 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
743 while [ $c -lt $cword ]; do
744 i="${words[c]}"
745 case "$i" in
746 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
747 --all)
748 case "$cmd" in
749 push) no_complete_refspec=1 ;;
750 fetch)
751 COMPREPLY=()
752 return
754 *) ;;
755 esac
757 -*) ;;
758 *) remote="$i"; break ;;
759 esac
760 c=$((++c))
761 done
762 if [ -z "$remote" ]; then
763 __gitcomp "$(__git_remotes)"
764 return
766 if [ $no_complete_refspec = 1 ]; then
767 COMPREPLY=()
768 return
770 [ "$remote" = "." ] && remote=
771 case "$cur_" in
772 *:*)
773 case "$COMP_WORDBREAKS" in
774 *:*) : great ;;
775 *) pfx="${cur_%%:*}:" ;;
776 esac
777 cur_="${cur_#*:}"
778 lhs=0
781 pfx="+"
782 cur_="${cur_#+}"
784 esac
785 case "$cmd" in
786 fetch)
787 if [ $lhs = 1 ]; then
788 __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur_"
789 else
790 __gitcomp "$(__git_refs)" "$pfx" "$cur_"
793 pull)
794 if [ $lhs = 1 ]; then
795 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur_"
796 else
797 __gitcomp "$(__git_refs)" "$pfx" "$cur_"
800 push)
801 if [ $lhs = 1 ]; then
802 __gitcomp "$(__git_refs)" "$pfx" "$cur_"
803 else
804 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur_"
807 esac
810 __git_complete_strategy ()
812 __git_compute_merge_strategies
813 case "$prev" in
814 -s|--strategy)
815 __gitcomp "$__git_merge_strategies"
816 return 0
817 esac
818 case "$cur" in
819 --strategy=*)
820 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
821 return 0
823 esac
824 return 1
827 __git_list_all_commands ()
829 local i IFS=" "$'\n'
830 for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
832 case $i in
833 *--*) : helper pattern;;
834 *) echo $i;;
835 esac
836 done
839 __git_all_commands=
840 __git_compute_all_commands ()
842 : ${__git_all_commands:=$(__git_list_all_commands)}
845 __git_list_porcelain_commands ()
847 local i IFS=" "$'\n'
848 __git_compute_all_commands
849 for i in "help" $__git_all_commands
851 case $i in
852 *--*) : helper pattern;;
853 applymbox) : ask gittus;;
854 applypatch) : ask gittus;;
855 archimport) : import;;
856 cat-file) : plumbing;;
857 check-attr) : plumbing;;
858 check-ref-format) : plumbing;;
859 checkout-index) : plumbing;;
860 commit-tree) : plumbing;;
861 count-objects) : infrequent;;
862 cvsexportcommit) : export;;
863 cvsimport) : import;;
864 cvsserver) : daemon;;
865 daemon) : daemon;;
866 diff-files) : plumbing;;
867 diff-index) : plumbing;;
868 diff-tree) : plumbing;;
869 fast-import) : import;;
870 fast-export) : export;;
871 fsck-objects) : plumbing;;
872 fetch-pack) : plumbing;;
873 fmt-merge-msg) : plumbing;;
874 for-each-ref) : plumbing;;
875 hash-object) : plumbing;;
876 http-*) : transport;;
877 index-pack) : plumbing;;
878 init-db) : deprecated;;
879 local-fetch) : plumbing;;
880 lost-found) : infrequent;;
881 ls-files) : plumbing;;
882 ls-remote) : plumbing;;
883 ls-tree) : plumbing;;
884 mailinfo) : plumbing;;
885 mailsplit) : plumbing;;
886 merge-*) : plumbing;;
887 mktree) : plumbing;;
888 mktag) : plumbing;;
889 pack-objects) : plumbing;;
890 pack-redundant) : plumbing;;
891 pack-refs) : plumbing;;
892 parse-remote) : plumbing;;
893 patch-id) : plumbing;;
894 peek-remote) : plumbing;;
895 prune) : plumbing;;
896 prune-packed) : plumbing;;
897 quiltimport) : import;;
898 read-tree) : plumbing;;
899 receive-pack) : plumbing;;
900 remote-*) : transport;;
901 repo-config) : deprecated;;
902 rerere) : plumbing;;
903 rev-list) : plumbing;;
904 rev-parse) : plumbing;;
905 runstatus) : plumbing;;
906 sh-setup) : internal;;
907 shell) : daemon;;
908 show-ref) : plumbing;;
909 send-pack) : plumbing;;
910 show-index) : plumbing;;
911 ssh-*) : transport;;
912 stripspace) : plumbing;;
913 symbolic-ref) : plumbing;;
914 tar-tree) : deprecated;;
915 unpack-file) : plumbing;;
916 unpack-objects) : plumbing;;
917 update-index) : plumbing;;
918 update-ref) : plumbing;;
919 update-server-info) : daemon;;
920 upload-archive) : plumbing;;
921 upload-pack) : plumbing;;
922 write-tree) : plumbing;;
923 var) : infrequent;;
924 verify-pack) : infrequent;;
925 verify-tag) : plumbing;;
926 *) echo $i;;
927 esac
928 done
931 __git_porcelain_commands=
932 __git_compute_porcelain_commands ()
934 __git_compute_all_commands
935 : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
938 __git_pretty_aliases ()
940 local i IFS=$'\n'
941 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
942 case "$i" in
943 pretty.*)
944 i="${i#pretty.}"
945 echo "${i/ */}"
947 esac
948 done
951 __git_aliases ()
953 local i IFS=$'\n'
954 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
955 case "$i" in
956 alias.*)
957 i="${i#alias.}"
958 echo "${i/ */}"
960 esac
961 done
964 # __git_aliased_command requires 1 argument
965 __git_aliased_command ()
967 local word cmdline=$(git --git-dir="$(__gitdir)" \
968 config --get "alias.$1")
969 for word in $cmdline; do
970 case "$word" in
971 \!gitk|gitk)
972 echo "gitk"
973 return
975 \!*) : shell command alias ;;
976 -*) : option ;;
977 *=*) : setting env ;;
978 git) : git itself ;;
980 echo "$word"
981 return
982 esac
983 done
986 # __git_find_on_cmdline requires 1 argument
987 __git_find_on_cmdline ()
989 local word subcommand c=1
990 while [ $c -lt $cword ]; do
991 word="${words[c]}"
992 for subcommand in $1; do
993 if [ "$subcommand" = "$word" ]; then
994 echo "$subcommand"
995 return
997 done
998 c=$((++c))
999 done
1002 __git_has_doubledash ()
1004 local c=1
1005 while [ $c -lt $cword ]; do
1006 if [ "--" = "${words[c]}" ]; then
1007 return 0
1009 c=$((++c))
1010 done
1011 return 1
1014 __git_whitespacelist="nowarn warn error error-all fix"
1016 _git_am ()
1018 local dir="$(__gitdir)"
1019 if [ -d "$dir"/rebase-apply ]; then
1020 __gitcomp "--skip --continue --resolved --abort"
1021 return
1023 case "$cur" in
1024 --whitespace=*)
1025 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1026 return
1028 --*)
1029 __gitcomp "
1030 --3way --committer-date-is-author-date --ignore-date
1031 --ignore-whitespace --ignore-space-change
1032 --interactive --keep --no-utf8 --signoff --utf8
1033 --whitespace= --scissors
1035 return
1036 esac
1037 COMPREPLY=()
1040 _git_apply ()
1042 case "$cur" in
1043 --whitespace=*)
1044 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1045 return
1047 --*)
1048 __gitcomp "
1049 --stat --numstat --summary --check --index
1050 --cached --index-info --reverse --reject --unidiff-zero
1051 --apply --no-add --exclude=
1052 --ignore-whitespace --ignore-space-change
1053 --whitespace= --inaccurate-eof --verbose
1055 return
1056 esac
1057 COMPREPLY=()
1060 _git_add ()
1062 __git_has_doubledash && return
1064 case "$cur" in
1065 --*)
1066 __gitcomp "
1067 --interactive --refresh --patch --update --dry-run
1068 --ignore-errors --intent-to-add
1070 return
1071 esac
1072 COMPREPLY=()
1075 _git_archive ()
1077 case "$cur" in
1078 --format=*)
1079 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
1080 return
1082 --remote=*)
1083 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
1084 return
1086 --*)
1087 __gitcomp "
1088 --format= --list --verbose
1089 --prefix= --remote= --exec=
1091 return
1093 esac
1094 __git_complete_file
1097 _git_bisect ()
1099 __git_has_doubledash && return
1101 local subcommands="start bad good skip reset visualize replay log run"
1102 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1103 if [ -z "$subcommand" ]; then
1104 if [ -f "$(__gitdir)"/BISECT_START ]; then
1105 __gitcomp "$subcommands"
1106 else
1107 __gitcomp "replay start"
1109 return
1112 case "$subcommand" in
1113 bad|good|reset|skip|start)
1114 __gitcomp "$(__git_refs)"
1117 COMPREPLY=()
1119 esac
1122 _git_branch ()
1124 local i c=1 only_local_ref="n" has_r="n"
1126 while [ $c -lt $cword ]; do
1127 i="${words[c]}"
1128 case "$i" in
1129 -d|-m) only_local_ref="y" ;;
1130 -r) has_r="y" ;;
1131 esac
1132 c=$((++c))
1133 done
1135 case "$cur" in
1136 --*)
1137 __gitcomp "
1138 --color --no-color --verbose --abbrev= --no-abbrev
1139 --track --no-track --contains --merged --no-merged
1140 --set-upstream
1144 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1145 __gitcomp "$(__git_heads)"
1146 else
1147 __gitcomp "$(__git_refs)"
1150 esac
1153 _git_bundle ()
1155 local cmd="${words[2]}"
1156 case "$cword" in
1158 __gitcomp "create list-heads verify unbundle"
1161 # looking for a file
1164 case "$cmd" in
1165 create)
1166 __git_complete_revlist
1168 esac
1170 esac
1173 _git_checkout ()
1175 __git_has_doubledash && return
1177 case "$cur" in
1178 --conflict=*)
1179 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1181 --*)
1182 __gitcomp "
1183 --quiet --ours --theirs --track --no-track --merge
1184 --conflict= --orphan --patch
1188 # check if --track, --no-track, or --no-guess was specified
1189 # if so, disable DWIM mode
1190 local flags="--track --no-track --no-guess" track=1
1191 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1192 track=''
1194 __gitcomp "$(__git_refs '' $track)"
1196 esac
1199 _git_cherry ()
1201 __gitcomp "$(__git_refs)"
1204 _git_cherry_pick ()
1206 case "$cur" in
1207 --*)
1208 __gitcomp "--edit --no-commit"
1211 __gitcomp "$(__git_refs)"
1213 esac
1216 _git_clean ()
1218 __git_has_doubledash && return
1220 case "$cur" in
1221 --*)
1222 __gitcomp "--dry-run --quiet"
1223 return
1225 esac
1226 COMPREPLY=()
1229 _git_clone ()
1231 case "$cur" in
1232 --*)
1233 __gitcomp "
1234 --local
1235 --no-hardlinks
1236 --shared
1237 --reference
1238 --quiet
1239 --no-checkout
1240 --bare
1241 --mirror
1242 --origin
1243 --upload-pack
1244 --template=
1245 --depth
1247 return
1249 esac
1250 COMPREPLY=()
1253 _git_commit ()
1255 __git_has_doubledash && return
1257 case "$cur" in
1258 --cleanup=*)
1259 __gitcomp "default strip verbatim whitespace
1260 " "" "${cur##--cleanup=}"
1261 return
1263 --reuse-message=*|--reedit-message=*|\
1264 --fixup=*|--squash=*)
1265 __gitcomp "$(__git_refs)" "" "${cur#*=}"
1266 return
1268 --untracked-files=*)
1269 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1270 return
1272 --*)
1273 __gitcomp "
1274 --all --author= --signoff --verify --no-verify
1275 --edit --amend --include --only --interactive
1276 --dry-run --reuse-message= --reedit-message=
1277 --reset-author --file= --message= --template=
1278 --cleanup= --untracked-files --untracked-files=
1279 --verbose --quiet --fixup= --squash=
1281 return
1282 esac
1283 COMPREPLY=()
1286 _git_describe ()
1288 case "$cur" in
1289 --*)
1290 __gitcomp "
1291 --all --tags --contains --abbrev= --candidates=
1292 --exact-match --debug --long --match --always
1294 return
1295 esac
1296 __gitcomp "$(__git_refs)"
1299 __git_diff_common_options="--stat --numstat --shortstat --summary
1300 --patch-with-stat --name-only --name-status --color
1301 --no-color --color-words --no-renames --check
1302 --full-index --binary --abbrev --diff-filter=
1303 --find-copies-harder
1304 --text --ignore-space-at-eol --ignore-space-change
1305 --ignore-all-space --exit-code --quiet --ext-diff
1306 --no-ext-diff
1307 --no-prefix --src-prefix= --dst-prefix=
1308 --inter-hunk-context=
1309 --patience
1310 --raw
1311 --dirstat --dirstat= --dirstat-by-file
1312 --dirstat-by-file= --cumulative
1315 _git_diff ()
1317 __git_has_doubledash && return
1319 case "$cur" in
1320 --*)
1321 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1322 --base --ours --theirs --no-index
1323 $__git_diff_common_options
1325 return
1327 esac
1328 __git_complete_revlist_file
1331 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1332 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3
1335 _git_difftool ()
1337 __git_has_doubledash && return
1339 case "$cur" in
1340 --tool=*)
1341 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1342 return
1344 --*)
1345 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1346 --base --ours --theirs
1347 --no-renames --diff-filter= --find-copies-harder
1348 --relative --ignore-submodules
1349 --tool="
1350 return
1352 esac
1353 __git_complete_file
1356 __git_fetch_options="
1357 --quiet --verbose --append --upload-pack --force --keep --depth=
1358 --tags --no-tags --all --prune --dry-run
1361 _git_fetch ()
1363 case "$cur" in
1364 --*)
1365 __gitcomp "$__git_fetch_options"
1366 return
1368 esac
1369 __git_complete_remote_or_refspec
1372 _git_format_patch ()
1374 case "$cur" in
1375 --thread=*)
1376 __gitcomp "
1377 deep shallow
1378 " "" "${cur##--thread=}"
1379 return
1381 --*)
1382 __gitcomp "
1383 --stdout --attach --no-attach --thread --thread=
1384 --output-directory
1385 --numbered --start-number
1386 --numbered-files
1387 --keep-subject
1388 --signoff --signature --no-signature
1389 --in-reply-to= --cc=
1390 --full-index --binary
1391 --not --all
1392 --cover-letter
1393 --no-prefix --src-prefix= --dst-prefix=
1394 --inline --suffix= --ignore-if-in-upstream
1395 --subject-prefix=
1397 return
1399 esac
1400 __git_complete_revlist
1403 _git_fsck ()
1405 case "$cur" in
1406 --*)
1407 __gitcomp "
1408 --tags --root --unreachable --cache --no-reflogs --full
1409 --strict --verbose --lost-found
1411 return
1413 esac
1414 COMPREPLY=()
1417 _git_gc ()
1419 case "$cur" in
1420 --*)
1421 __gitcomp "--prune --aggressive"
1422 return
1424 esac
1425 COMPREPLY=()
1428 _git_gitk ()
1430 _gitk
1433 _git_grep ()
1435 __git_has_doubledash && return
1437 case "$cur" in
1438 --*)
1439 __gitcomp "
1440 --cached
1441 --text --ignore-case --word-regexp --invert-match
1442 --full-name --line-number
1443 --extended-regexp --basic-regexp --fixed-strings
1444 --perl-regexp
1445 --files-with-matches --name-only
1446 --files-without-match
1447 --max-depth
1448 --count
1449 --and --or --not --all-match
1451 return
1453 esac
1455 __gitcomp "$(__git_refs)"
1458 _git_help ()
1460 case "$cur" in
1461 --*)
1462 __gitcomp "--all --info --man --web"
1463 return
1465 esac
1466 __git_compute_all_commands
1467 __gitcomp "$__git_all_commands $(__git_aliases)
1468 attributes cli core-tutorial cvs-migration
1469 diffcore gitk glossary hooks ignore modules
1470 namespaces repository-layout tutorial tutorial-2
1471 workflows
1475 _git_init ()
1477 case "$cur" in
1478 --shared=*)
1479 __gitcomp "
1480 false true umask group all world everybody
1481 " "" "${cur##--shared=}"
1482 return
1484 --*)
1485 __gitcomp "--quiet --bare --template= --shared --shared="
1486 return
1488 esac
1489 COMPREPLY=()
1492 _git_ls_files ()
1494 __git_has_doubledash && return
1496 case "$cur" in
1497 --*)
1498 __gitcomp "--cached --deleted --modified --others --ignored
1499 --stage --directory --no-empty-directory --unmerged
1500 --killed --exclude= --exclude-from=
1501 --exclude-per-directory= --exclude-standard
1502 --error-unmatch --with-tree= --full-name
1503 --abbrev --ignored --exclude-per-directory
1505 return
1507 esac
1508 COMPREPLY=()
1511 _git_ls_remote ()
1513 __gitcomp "$(__git_remotes)"
1516 _git_ls_tree ()
1518 __git_complete_file
1521 # Options that go well for log, shortlog and gitk
1522 __git_log_common_options="
1523 --not --all
1524 --branches --tags --remotes
1525 --first-parent --merges --no-merges
1526 --max-count=
1527 --max-age= --since= --after=
1528 --min-age= --until= --before=
1529 --min-parents= --max-parents=
1530 --no-min-parents --no-max-parents
1532 # Options that go well for log and gitk (not shortlog)
1533 __git_log_gitk_options="
1534 --dense --sparse --full-history
1535 --simplify-merges --simplify-by-decoration
1536 --left-right --notes --no-notes
1538 # Options that go well for log and shortlog (not gitk)
1539 __git_log_shortlog_options="
1540 --author= --committer= --grep=
1541 --all-match
1544 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1545 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1547 _git_log ()
1549 __git_has_doubledash && return
1551 local g="$(git rev-parse --git-dir 2>/dev/null)"
1552 local merge=""
1553 if [ -f "$g/MERGE_HEAD" ]; then
1554 merge="--merge"
1556 case "$cur" in
1557 --pretty=*|--format=*)
1558 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1559 " "" "${cur#*=}"
1560 return
1562 --date=*)
1563 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1564 return
1566 --decorate=*)
1567 __gitcomp "long short" "" "${cur##--decorate=}"
1568 return
1570 --*)
1571 __gitcomp "
1572 $__git_log_common_options
1573 $__git_log_shortlog_options
1574 $__git_log_gitk_options
1575 --root --topo-order --date-order --reverse
1576 --follow --full-diff
1577 --abbrev-commit --abbrev=
1578 --relative-date --date=
1579 --pretty= --format= --oneline
1580 --cherry-pick
1581 --graph
1582 --decorate --decorate=
1583 --walk-reflogs
1584 --parents --children
1585 $merge
1586 $__git_diff_common_options
1587 --pickaxe-all --pickaxe-regex
1589 return
1591 esac
1592 __git_complete_revlist
1595 __git_merge_options="
1596 --no-commit --no-stat --log --no-log --squash --strategy
1597 --commit --stat --no-squash --ff --no-ff --ff-only
1600 _git_merge ()
1602 __git_complete_strategy && return
1604 case "$cur" in
1605 --*)
1606 __gitcomp "$__git_merge_options"
1607 return
1608 esac
1609 __gitcomp "$(__git_refs)"
1612 _git_mergetool ()
1614 case "$cur" in
1615 --tool=*)
1616 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1617 return
1619 --*)
1620 __gitcomp "--tool="
1621 return
1623 esac
1624 COMPREPLY=()
1627 _git_merge_base ()
1629 __gitcomp "$(__git_refs)"
1632 _git_mv ()
1634 case "$cur" in
1635 --*)
1636 __gitcomp "--dry-run"
1637 return
1639 esac
1640 COMPREPLY=()
1643 _git_name_rev ()
1645 __gitcomp "--tags --all --stdin"
1648 _git_notes ()
1650 local subcommands='add append copy edit list prune remove show'
1651 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1653 case "$subcommand,$cur" in
1654 ,--*)
1655 __gitcomp '--ref'
1658 case "${words[cword-1]}" in
1659 --ref)
1660 __gitcomp "$(__git_refs)"
1663 __gitcomp "$subcommands --ref"
1665 esac
1667 add,--reuse-message=*|append,--reuse-message=*|\
1668 add,--reedit-message=*|append,--reedit-message=*)
1669 __gitcomp "$(__git_refs)" "" "${cur#*=}"
1671 add,--*|append,--*)
1672 __gitcomp '--file= --message= --reedit-message=
1673 --reuse-message='
1675 copy,--*)
1676 __gitcomp '--stdin'
1678 prune,--*)
1679 __gitcomp '--dry-run --verbose'
1681 prune,*)
1684 case "${words[cword-1]}" in
1685 -m|-F)
1688 __gitcomp "$(__git_refs)"
1690 esac
1692 esac
1695 _git_pull ()
1697 __git_complete_strategy && return
1699 case "$cur" in
1700 --*)
1701 __gitcomp "
1702 --rebase --no-rebase
1703 $__git_merge_options
1704 $__git_fetch_options
1706 return
1708 esac
1709 __git_complete_remote_or_refspec
1712 _git_push ()
1714 case "$prev" in
1715 --repo)
1716 __gitcomp "$(__git_remotes)"
1717 return
1718 esac
1719 case "$cur" in
1720 --repo=*)
1721 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1722 return
1724 --*)
1725 __gitcomp "
1726 --all --mirror --tags --dry-run --force --verbose
1727 --receive-pack= --repo= --set-upstream
1729 return
1731 esac
1732 __git_complete_remote_or_refspec
1735 _git_rebase ()
1737 local dir="$(__gitdir)"
1738 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1739 __gitcomp "--continue --skip --abort"
1740 return
1742 __git_complete_strategy && return
1743 case "$cur" in
1744 --whitespace=*)
1745 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1746 return
1748 --*)
1749 __gitcomp "
1750 --onto --merge --strategy --interactive
1751 --preserve-merges --stat --no-stat
1752 --committer-date-is-author-date --ignore-date
1753 --ignore-whitespace --whitespace=
1754 --autosquash
1757 return
1758 esac
1759 __gitcomp "$(__git_refs)"
1762 _git_reflog ()
1764 local subcommands="show delete expire"
1765 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1767 if [ -z "$subcommand" ]; then
1768 __gitcomp "$subcommands"
1769 else
1770 __gitcomp "$(__git_refs)"
1774 __git_send_email_confirm_options="always never auto cc compose"
1775 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1777 _git_send_email ()
1779 case "$cur" in
1780 --confirm=*)
1781 __gitcomp "
1782 $__git_send_email_confirm_options
1783 " "" "${cur##--confirm=}"
1784 return
1786 --suppress-cc=*)
1787 __gitcomp "
1788 $__git_send_email_suppresscc_options
1789 " "" "${cur##--suppress-cc=}"
1791 return
1793 --smtp-encryption=*)
1794 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1795 return
1797 --*)
1798 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1799 --compose --confirm= --dry-run --envelope-sender
1800 --from --identity
1801 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1802 --no-suppress-from --no-thread --quiet
1803 --signed-off-by-cc --smtp-pass --smtp-server
1804 --smtp-server-port --smtp-encryption= --smtp-user
1805 --subject --suppress-cc= --suppress-from --thread --to
1806 --validate --no-validate"
1807 return
1809 esac
1810 COMPREPLY=()
1813 _git_stage ()
1815 _git_add
1818 __git_config_get_set_variables ()
1820 local prevword word config_file= c=$cword
1821 while [ $c -gt 1 ]; do
1822 word="${words[c]}"
1823 case "$word" in
1824 --global|--system|--file=*)
1825 config_file="$word"
1826 break
1828 -f|--file)
1829 config_file="$word $prevword"
1830 break
1832 esac
1833 prevword=$word
1834 c=$((--c))
1835 done
1837 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1838 while read line
1840 case "$line" in
1841 *.*=*)
1842 echo "${line/=*/}"
1844 esac
1845 done
1848 _git_config ()
1850 case "$prev" in
1851 branch.*.remote)
1852 __gitcomp "$(__git_remotes)"
1853 return
1855 branch.*.merge)
1856 __gitcomp "$(__git_refs)"
1857 return
1859 remote.*.fetch)
1860 local remote="${prev#remote.}"
1861 remote="${remote%.fetch}"
1862 __gitcomp "$(__git_refs_remotes "$remote")"
1863 return
1865 remote.*.push)
1866 local remote="${prev#remote.}"
1867 remote="${remote%.push}"
1868 __gitcomp "$(git --git-dir="$(__gitdir)" \
1869 for-each-ref --format='%(refname):%(refname)' \
1870 refs/heads)"
1871 return
1873 pull.twohead|pull.octopus)
1874 __git_compute_merge_strategies
1875 __gitcomp "$__git_merge_strategies"
1876 return
1878 color.branch|color.diff|color.interactive|\
1879 color.showbranch|color.status|color.ui)
1880 __gitcomp "always never auto"
1881 return
1883 color.pager)
1884 __gitcomp "false true"
1885 return
1887 color.*.*)
1888 __gitcomp "
1889 normal black red green yellow blue magenta cyan white
1890 bold dim ul blink reverse
1892 return
1894 help.format)
1895 __gitcomp "man info web html"
1896 return
1898 log.date)
1899 __gitcomp "$__git_log_date_formats"
1900 return
1902 sendemail.aliasesfiletype)
1903 __gitcomp "mutt mailrc pine elm gnus"
1904 return
1906 sendemail.confirm)
1907 __gitcomp "$__git_send_email_confirm_options"
1908 return
1910 sendemail.suppresscc)
1911 __gitcomp "$__git_send_email_suppresscc_options"
1912 return
1914 --get|--get-all|--unset|--unset-all)
1915 __gitcomp "$(__git_config_get_set_variables)"
1916 return
1918 *.*)
1919 COMPREPLY=()
1920 return
1922 esac
1923 case "$cur" in
1924 --*)
1925 __gitcomp "
1926 --global --system --file=
1927 --list --replace-all
1928 --get --get-all --get-regexp
1929 --add --unset --unset-all
1930 --remove-section --rename-section
1932 return
1934 branch.*.*)
1935 local pfx="${cur%.*}." cur_="${cur##*.}"
1936 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
1937 return
1939 branch.*)
1940 local pfx="${cur%.*}." cur_="${cur#*.}"
1941 __gitcomp "$(__git_heads)" "$pfx" "$cur_" "."
1942 return
1944 guitool.*.*)
1945 local pfx="${cur%.*}." cur_="${cur##*.}"
1946 __gitcomp "
1947 argprompt cmd confirm needsfile noconsole norescan
1948 prompt revprompt revunmerged title
1949 " "$pfx" "$cur_"
1950 return
1952 difftool.*.*)
1953 local pfx="${cur%.*}." cur_="${cur##*.}"
1954 __gitcomp "cmd path" "$pfx" "$cur_"
1955 return
1957 man.*.*)
1958 local pfx="${cur%.*}." cur_="${cur##*.}"
1959 __gitcomp "cmd path" "$pfx" "$cur_"
1960 return
1962 mergetool.*.*)
1963 local pfx="${cur%.*}." cur_="${cur##*.}"
1964 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1965 return
1967 pager.*)
1968 local pfx="${cur%.*}." cur_="${cur#*.}"
1969 __git_compute_all_commands
1970 __gitcomp "$__git_all_commands" "$pfx" "$cur_"
1971 return
1973 remote.*.*)
1974 local pfx="${cur%.*}." cur_="${cur##*.}"
1975 __gitcomp "
1976 url proxy fetch push mirror skipDefaultUpdate
1977 receivepack uploadpack tagopt pushurl
1978 " "$pfx" "$cur_"
1979 return
1981 remote.*)
1982 local pfx="${cur%.*}." cur_="${cur#*.}"
1983 __gitcomp "$(__git_remotes)" "$pfx" "$cur_" "."
1984 return
1986 url.*.*)
1987 local pfx="${cur%.*}." cur_="${cur##*.}"
1988 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1989 return
1991 esac
1992 __gitcomp "
1993 add.ignoreErrors
1994 advice.commitBeforeMerge
1995 advice.detachedHead
1996 advice.implicitIdentity
1997 advice.pushNonFastForward
1998 advice.resolveConflict
1999 advice.statusHints
2000 alias.
2001 am.keepcr
2002 apply.ignorewhitespace
2003 apply.whitespace
2004 branch.autosetupmerge
2005 branch.autosetuprebase
2006 browser.
2007 clean.requireForce
2008 color.branch
2009 color.branch.current
2010 color.branch.local
2011 color.branch.plain
2012 color.branch.remote
2013 color.decorate.HEAD
2014 color.decorate.branch
2015 color.decorate.remoteBranch
2016 color.decorate.stash
2017 color.decorate.tag
2018 color.diff
2019 color.diff.commit
2020 color.diff.frag
2021 color.diff.func
2022 color.diff.meta
2023 color.diff.new
2024 color.diff.old
2025 color.diff.plain
2026 color.diff.whitespace
2027 color.grep
2028 color.grep.context
2029 color.grep.filename
2030 color.grep.function
2031 color.grep.linenumber
2032 color.grep.match
2033 color.grep.selected
2034 color.grep.separator
2035 color.interactive
2036 color.interactive.error
2037 color.interactive.header
2038 color.interactive.help
2039 color.interactive.prompt
2040 color.pager
2041 color.showbranch
2042 color.status
2043 color.status.added
2044 color.status.changed
2045 color.status.header
2046 color.status.nobranch
2047 color.status.untracked
2048 color.status.updated
2049 color.ui
2050 commit.status
2051 commit.template
2052 core.abbrev
2053 core.askpass
2054 core.attributesfile
2055 core.autocrlf
2056 core.bare
2057 core.bigFileThreshold
2058 core.compression
2059 core.createObject
2060 core.deltaBaseCacheLimit
2061 core.editor
2062 core.eol
2063 core.excludesfile
2064 core.fileMode
2065 core.fsyncobjectfiles
2066 core.gitProxy
2067 core.ignoreCygwinFSTricks
2068 core.ignoreStat
2069 core.ignorecase
2070 core.logAllRefUpdates
2071 core.loosecompression
2072 core.notesRef
2073 core.packedGitLimit
2074 core.packedGitWindowSize
2075 core.pager
2076 core.preferSymlinkRefs
2077 core.preloadindex
2078 core.quotepath
2079 core.repositoryFormatVersion
2080 core.safecrlf
2081 core.sharedRepository
2082 core.sparseCheckout
2083 core.symlinks
2084 core.trustctime
2085 core.warnAmbiguousRefs
2086 core.whitespace
2087 core.worktree
2088 diff.autorefreshindex
2089 diff.external
2090 diff.ignoreSubmodules
2091 diff.mnemonicprefix
2092 diff.noprefix
2093 diff.renameLimit
2094 diff.renames
2095 diff.suppressBlankEmpty
2096 diff.tool
2097 diff.wordRegex
2098 difftool.
2099 difftool.prompt
2100 fetch.recurseSubmodules
2101 fetch.unpackLimit
2102 format.attach
2103 format.cc
2104 format.headers
2105 format.numbered
2106 format.pretty
2107 format.signature
2108 format.signoff
2109 format.subjectprefix
2110 format.suffix
2111 format.thread
2112 format.to
2114 gc.aggressiveWindow
2115 gc.auto
2116 gc.autopacklimit
2117 gc.packrefs
2118 gc.pruneexpire
2119 gc.reflogexpire
2120 gc.reflogexpireunreachable
2121 gc.rerereresolved
2122 gc.rerereunresolved
2123 gitcvs.allbinary
2124 gitcvs.commitmsgannotation
2125 gitcvs.dbTableNamePrefix
2126 gitcvs.dbdriver
2127 gitcvs.dbname
2128 gitcvs.dbpass
2129 gitcvs.dbuser
2130 gitcvs.enabled
2131 gitcvs.logfile
2132 gitcvs.usecrlfattr
2133 guitool.
2134 gui.blamehistoryctx
2135 gui.commitmsgwidth
2136 gui.copyblamethreshold
2137 gui.diffcontext
2138 gui.encoding
2139 gui.fastcopyblame
2140 gui.matchtrackingbranch
2141 gui.newbranchtemplate
2142 gui.pruneduringfetch
2143 gui.spellingdictionary
2144 gui.trustmtime
2145 help.autocorrect
2146 help.browser
2147 help.format
2148 http.lowSpeedLimit
2149 http.lowSpeedTime
2150 http.maxRequests
2151 http.minSessions
2152 http.noEPSV
2153 http.postBuffer
2154 http.proxy
2155 http.sslCAInfo
2156 http.sslCAPath
2157 http.sslCert
2158 http.sslCertPasswordProtected
2159 http.sslKey
2160 http.sslVerify
2161 http.useragent
2162 i18n.commitEncoding
2163 i18n.logOutputEncoding
2164 imap.authMethod
2165 imap.folder
2166 imap.host
2167 imap.pass
2168 imap.port
2169 imap.preformattedHTML
2170 imap.sslverify
2171 imap.tunnel
2172 imap.user
2173 init.templatedir
2174 instaweb.browser
2175 instaweb.httpd
2176 instaweb.local
2177 instaweb.modulepath
2178 instaweb.port
2179 interactive.singlekey
2180 log.date
2181 log.decorate
2182 log.showroot
2183 mailmap.file
2184 man.
2185 man.viewer
2186 merge.
2187 merge.conflictstyle
2188 merge.log
2189 merge.renameLimit
2190 merge.renormalize
2191 merge.stat
2192 merge.tool
2193 merge.verbosity
2194 mergetool.
2195 mergetool.keepBackup
2196 mergetool.keepTemporaries
2197 mergetool.prompt
2198 notes.displayRef
2199 notes.rewrite.
2200 notes.rewrite.amend
2201 notes.rewrite.rebase
2202 notes.rewriteMode
2203 notes.rewriteRef
2204 pack.compression
2205 pack.deltaCacheLimit
2206 pack.deltaCacheSize
2207 pack.depth
2208 pack.indexVersion
2209 pack.packSizeLimit
2210 pack.threads
2211 pack.window
2212 pack.windowMemory
2213 pager.
2214 pretty.
2215 pull.octopus
2216 pull.twohead
2217 push.default
2218 rebase.autosquash
2219 rebase.stat
2220 receive.autogc
2221 receive.denyCurrentBranch
2222 receive.denyDeleteCurrent
2223 receive.denyDeletes
2224 receive.denyNonFastForwards
2225 receive.fsckObjects
2226 receive.unpackLimit
2227 receive.updateserverinfo
2228 remotes.
2229 repack.usedeltabaseoffset
2230 rerere.autoupdate
2231 rerere.enabled
2232 sendemail.
2233 sendemail.aliasesfile
2234 sendemail.aliasfiletype
2235 sendemail.bcc
2236 sendemail.cc
2237 sendemail.cccmd
2238 sendemail.chainreplyto
2239 sendemail.confirm
2240 sendemail.envelopesender
2241 sendemail.from
2242 sendemail.identity
2243 sendemail.multiedit
2244 sendemail.signedoffbycc
2245 sendemail.smtpdomain
2246 sendemail.smtpencryption
2247 sendemail.smtppass
2248 sendemail.smtpserver
2249 sendemail.smtpserveroption
2250 sendemail.smtpserverport
2251 sendemail.smtpuser
2252 sendemail.suppresscc
2253 sendemail.suppressfrom
2254 sendemail.thread
2255 sendemail.to
2256 sendemail.validate
2257 showbranch.default
2258 status.relativePaths
2259 status.showUntrackedFiles
2260 status.submodulesummary
2261 submodule.
2262 tar.umask
2263 transfer.unpackLimit
2264 url.
2265 user.email
2266 user.name
2267 user.signingkey
2268 web.browser
2269 branch. remote.
2273 _git_remote ()
2275 local subcommands="add rename rm show prune update set-head"
2276 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2277 if [ -z "$subcommand" ]; then
2278 __gitcomp "$subcommands"
2279 return
2282 case "$subcommand" in
2283 rename|rm|show|prune)
2284 __gitcomp "$(__git_remotes)"
2286 update)
2287 local i c='' IFS=$'\n'
2288 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2289 i="${i#remotes.}"
2290 c="$c ${i/ */}"
2291 done
2292 __gitcomp "$c"
2295 COMPREPLY=()
2297 esac
2300 _git_replace ()
2302 __gitcomp "$(__git_refs)"
2305 _git_reset ()
2307 __git_has_doubledash && return
2309 case "$cur" in
2310 --*)
2311 __gitcomp "--merge --mixed --hard --soft --patch"
2312 return
2314 esac
2315 __gitcomp "$(__git_refs)"
2318 _git_revert ()
2320 case "$cur" in
2321 --*)
2322 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2323 return
2325 esac
2326 __gitcomp "$(__git_refs)"
2329 _git_rm ()
2331 __git_has_doubledash && return
2333 case "$cur" in
2334 --*)
2335 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2336 return
2338 esac
2339 COMPREPLY=()
2342 _git_shortlog ()
2344 __git_has_doubledash && return
2346 case "$cur" in
2347 --*)
2348 __gitcomp "
2349 $__git_log_common_options
2350 $__git_log_shortlog_options
2351 --numbered --summary
2353 return
2355 esac
2356 __git_complete_revlist
2359 _git_show ()
2361 __git_has_doubledash && return
2363 case "$cur" in
2364 --pretty=*|--format=*)
2365 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2366 " "" "${cur#*=}"
2367 return
2369 --*)
2370 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2371 $__git_diff_common_options
2373 return
2375 esac
2376 __git_complete_file
2379 _git_show_branch ()
2381 case "$cur" in
2382 --*)
2383 __gitcomp "
2384 --all --remotes --topo-order --current --more=
2385 --list --independent --merge-base --no-name
2386 --color --no-color
2387 --sha1-name --sparse --topics --reflog
2389 return
2391 esac
2392 __git_complete_revlist
2395 _git_stash ()
2397 local save_opts='--keep-index --no-keep-index --quiet --patch'
2398 local subcommands='save list show apply clear drop pop create branch'
2399 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2400 if [ -z "$subcommand" ]; then
2401 case "$cur" in
2402 --*)
2403 __gitcomp "$save_opts"
2406 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2407 __gitcomp "$subcommands"
2408 else
2409 COMPREPLY=()
2412 esac
2413 else
2414 case "$subcommand,$cur" in
2415 save,--*)
2416 __gitcomp "$save_opts"
2418 apply,--*|pop,--*)
2419 __gitcomp "--index --quiet"
2421 show,--*|drop,--*|branch,--*)
2422 COMPREPLY=()
2424 show,*|apply,*|drop,*|pop,*|branch,*)
2425 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
2426 | sed -n -e 's/:.*//p')"
2429 COMPREPLY=()
2431 esac
2435 _git_submodule ()
2437 __git_has_doubledash && return
2439 local subcommands="add status init update summary foreach sync"
2440 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2441 case "$cur" in
2442 --*)
2443 __gitcomp "--quiet --cached"
2446 __gitcomp "$subcommands"
2448 esac
2449 return
2453 _git_svn ()
2455 local subcommands="
2456 init fetch clone rebase dcommit log find-rev
2457 set-tree commit-diff info create-ignore propget
2458 proplist show-ignore show-externals branch tag blame
2459 migrate mkdirs reset gc
2461 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2462 if [ -z "$subcommand" ]; then
2463 __gitcomp "$subcommands"
2464 else
2465 local remote_opts="--username= --config-dir= --no-auth-cache"
2466 local fc_opts="
2467 --follow-parent --authors-file= --repack=
2468 --no-metadata --use-svm-props --use-svnsync-props
2469 --log-window-size= --no-checkout --quiet
2470 --repack-flags --use-log-author --localtime
2471 --ignore-paths= $remote_opts
2473 local init_opts="
2474 --template= --shared= --trunk= --tags=
2475 --branches= --stdlayout --minimize-url
2476 --no-metadata --use-svm-props --use-svnsync-props
2477 --rewrite-root= --prefix= --use-log-author
2478 --add-author-from $remote_opts
2480 local cmt_opts="
2481 --edit --rmdir --find-copies-harder --copy-similarity=
2484 case "$subcommand,$cur" in
2485 fetch,--*)
2486 __gitcomp "--revision= --fetch-all $fc_opts"
2488 clone,--*)
2489 __gitcomp "--revision= $fc_opts $init_opts"
2491 init,--*)
2492 __gitcomp "$init_opts"
2494 dcommit,--*)
2495 __gitcomp "
2496 --merge --strategy= --verbose --dry-run
2497 --fetch-all --no-rebase --commit-url
2498 --revision $cmt_opts $fc_opts
2501 set-tree,--*)
2502 __gitcomp "--stdin $cmt_opts $fc_opts"
2504 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2505 show-externals,--*|mkdirs,--*)
2506 __gitcomp "--revision="
2508 log,--*)
2509 __gitcomp "
2510 --limit= --revision= --verbose --incremental
2511 --oneline --show-commit --non-recursive
2512 --authors-file= --color
2515 rebase,--*)
2516 __gitcomp "
2517 --merge --verbose --strategy= --local
2518 --fetch-all --dry-run $fc_opts
2521 commit-diff,--*)
2522 __gitcomp "--message= --file= --revision= $cmt_opts"
2524 info,--*)
2525 __gitcomp "--url"
2527 branch,--*)
2528 __gitcomp "--dry-run --message --tag"
2530 tag,--*)
2531 __gitcomp "--dry-run --message"
2533 blame,--*)
2534 __gitcomp "--git-format"
2536 migrate,--*)
2537 __gitcomp "
2538 --config-dir= --ignore-paths= --minimize
2539 --no-auth-cache --username=
2542 reset,--*)
2543 __gitcomp "--revision= --parent"
2546 COMPREPLY=()
2548 esac
2552 _git_tag ()
2554 local i c=1 f=0
2555 while [ $c -lt $cword ]; do
2556 i="${words[c]}"
2557 case "$i" in
2558 -d|-v)
2559 __gitcomp "$(__git_tags)"
2560 return
2565 esac
2566 c=$((++c))
2567 done
2569 case "$prev" in
2570 -m|-F)
2571 COMPREPLY=()
2573 -*|tag)
2574 if [ $f = 1 ]; then
2575 __gitcomp "$(__git_tags)"
2576 else
2577 COMPREPLY=()
2581 __gitcomp "$(__git_refs)"
2583 esac
2586 _git_whatchanged ()
2588 _git_log
2591 _git ()
2593 local i c=1 command __git_dir
2595 if [[ -n ${ZSH_VERSION-} ]]; then
2596 emulate -L bash
2597 setopt KSH_TYPESET
2599 # workaround zsh's bug that leaves 'words' as a special
2600 # variable in versions < 4.3.12
2601 typeset -h words
2604 local cur words cword prev
2605 _get_comp_words_by_ref -n =: cur words cword prev
2606 while [ $c -lt $cword ]; do
2607 i="${words[c]}"
2608 case "$i" in
2609 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2610 --bare) __git_dir="." ;;
2611 --version|-p|--paginate) ;;
2612 --help) command="help"; break ;;
2613 *) command="$i"; break ;;
2614 esac
2615 c=$((++c))
2616 done
2618 if [ -z "$command" ]; then
2619 case "$cur" in
2620 --*) __gitcomp "
2621 --paginate
2622 --no-pager
2623 --git-dir=
2624 --bare
2625 --version
2626 --exec-path
2627 --html-path
2628 --work-tree=
2629 --namespace=
2630 --help
2633 *) __git_compute_porcelain_commands
2634 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2635 esac
2636 return
2639 local completion_func="_git_${command//-/_}"
2640 declare -f $completion_func >/dev/null && $completion_func && return
2642 local expansion=$(__git_aliased_command "$command")
2643 if [ -n "$expansion" ]; then
2644 completion_func="_git_${expansion//-/_}"
2645 declare -f $completion_func >/dev/null && $completion_func
2649 _gitk ()
2651 if [[ -n ${ZSH_VERSION-} ]]; then
2652 emulate -L bash
2653 setopt KSH_TYPESET
2655 # workaround zsh's bug that leaves 'words' as a special
2656 # variable in versions < 4.3.12
2657 typeset -h words
2660 local cur words cword prev
2661 _get_comp_words_by_ref -n =: cur words cword prev
2663 __git_has_doubledash && return
2665 local g="$(__gitdir)"
2666 local merge=""
2667 if [ -f "$g/MERGE_HEAD" ]; then
2668 merge="--merge"
2670 case "$cur" in
2671 --*)
2672 __gitcomp "
2673 $__git_log_common_options
2674 $__git_log_gitk_options
2675 $merge
2677 return
2679 esac
2680 __git_complete_revlist
2683 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2684 || complete -o default -o nospace -F _git git
2685 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2686 || complete -o default -o nospace -F _gitk gitk
2688 # The following are necessary only for Cygwin, and only are needed
2689 # when the user has tab-completed the executable name and consequently
2690 # included the '.exe' suffix.
2692 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2693 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2694 || complete -o default -o nospace -F _git git.exe
2697 if [[ -n ${ZSH_VERSION-} ]]; then
2698 __git_shopt () {
2699 local option
2700 if [ $# -ne 2 ]; then
2701 echo "USAGE: $0 (-q|-s|-u) <option>" >&2
2702 return 1
2704 case "$2" in
2705 nullglob)
2706 option="$2"
2709 echo "$0: invalid option: $2" >&2
2710 return 1
2711 esac
2712 case "$1" in
2713 -q) setopt | grep -q "$option" ;;
2714 -u) unsetopt "$option" ;;
2715 -s) setopt "$option" ;;
2717 echo "$0: invalid flag: $1" >&2
2718 return 1
2719 esac
2721 else
2722 __git_shopt () {
2723 shopt "$@"