41ee52991d0c1b1fa2a6021133cffecd3ca9deb0
[git.git] / contrib / completion / git-completion.bash
blob41ee52991d0c1b1fa2a6021133cffecd3ca9deb0
1 # bash/zsh completion support for core Git.
3 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
4 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
5 # Distributed under the GNU General Public License, version 2.0.
7 # The contained completion routines provide support for completing:
9 # *) local and remote branch names
10 # *) local and remote tag names
11 # *) .git/remotes file names
12 # *) git 'subcommands'
13 # *) git email aliases for git-send-email
14 # *) tree paths within 'ref:path/to/file' expressions
15 # *) file paths within current working directory and index
16 # *) common --long-options
18 # To use these routines:
20 # 1) Copy this file to somewhere (e.g. ~/.git-completion.bash).
21 # 2) Add the following line to your .bashrc/.zshrc:
22 # source ~/.git-completion.bash
23 # 3) Consider changing your PS1 to also show the current branch,
24 # see git-prompt.sh for details.
26 # If you use complex aliases of form '!f() { ... }; f', you can use the null
27 # command ':' as the first command in the function body to declare the desired
28 # completion style. For example '!f() { : git commit ; ... }; f' will
29 # tell the completion to use commit completion. This also works with aliases
30 # of form "!sh -c '...'". For example, "!sh -c ': git commit ; ... '".
32 case "$COMP_WORDBREAKS" in
33 *:*) : great ;;
34 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
35 esac
37 # __gitdir accepts 0 or 1 arguments (i.e., location)
38 # returns location of .git repo
39 __gitdir ()
41 if [ -z "${1-}" ]; then
42 if [ -n "${__git_dir-}" ]; then
43 echo "$__git_dir"
44 elif [ -n "${GIT_DIR-}" ]; then
45 test -d "${GIT_DIR-}" || return 1
46 echo "$GIT_DIR"
47 elif [ -d .git ]; then
48 echo .git
49 else
50 git rev-parse --git-dir 2>/dev/null
52 elif [ -d "$1/.git" ]; then
53 echo "$1/.git"
54 else
55 echo "$1"
59 # The following function is based on code from:
61 # bash_completion - programmable completion functions for bash 3.2+
63 # Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
64 # © 2009-2010, Bash Completion Maintainers
65 # <bash-completion-devel@lists.alioth.debian.org>
67 # This program is free software; you can redistribute it and/or modify
68 # it under the terms of the GNU General Public License as published by
69 # the Free Software Foundation; either version 2, or (at your option)
70 # any later version.
72 # This program is distributed in the hope that it will be useful,
73 # but WITHOUT ANY WARRANTY; without even the implied warranty of
74 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
75 # GNU General Public License for more details.
77 # You should have received a copy of the GNU General Public License
78 # along with this program; if not, write to the Free Software Foundation,
79 # Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
81 # The latest version of this software can be obtained here:
83 # http://bash-completion.alioth.debian.org/
85 # RELEASE: 2.x
87 # This function can be used to access a tokenized list of words
88 # on the command line:
90 # __git_reassemble_comp_words_by_ref '=:'
91 # if test "${words_[cword_-1]}" = -w
92 # then
93 # ...
94 # fi
96 # The argument should be a collection of characters from the list of
97 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
98 # characters.
100 # This is roughly equivalent to going back in time and setting
101 # COMP_WORDBREAKS to exclude those characters. The intent is to
102 # make option types like --date=<type> and <rev>:<path> easy to
103 # recognize by treating each shell word as a single token.
105 # It is best not to set COMP_WORDBREAKS directly because the value is
106 # shared with other completion scripts. By the time the completion
107 # function gets called, COMP_WORDS has already been populated so local
108 # changes to COMP_WORDBREAKS have no effect.
110 # Output: words_, cword_, cur_.
112 __git_reassemble_comp_words_by_ref()
114 local exclude i j first
115 # Which word separators to exclude?
116 exclude="${1//[^$COMP_WORDBREAKS]}"
117 cword_=$COMP_CWORD
118 if [ -z "$exclude" ]; then
119 words_=("${COMP_WORDS[@]}")
120 return
122 # List of word completion separators has shrunk;
123 # re-assemble words to complete.
124 for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
125 # Append each nonempty word consisting of just
126 # word separator characters to the current word.
127 first=t
128 while
129 [ $i -gt 0 ] &&
130 [ -n "${COMP_WORDS[$i]}" ] &&
131 # word consists of excluded word separators
132 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
134 # Attach to the previous token,
135 # unless the previous token is the command name.
136 if [ $j -ge 2 ] && [ -n "$first" ]; then
137 ((j--))
139 first=
140 words_[$j]=${words_[j]}${COMP_WORDS[i]}
141 if [ $i = $COMP_CWORD ]; then
142 cword_=$j
144 if (($i < ${#COMP_WORDS[@]} - 1)); then
145 ((i++))
146 else
147 # Done.
148 return
150 done
151 words_[$j]=${words_[j]}${COMP_WORDS[i]}
152 if [ $i = $COMP_CWORD ]; then
153 cword_=$j
155 done
158 if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
159 _get_comp_words_by_ref ()
161 local exclude cur_ words_ cword_
162 if [ "$1" = "-n" ]; then
163 exclude=$2
164 shift 2
166 __git_reassemble_comp_words_by_ref "$exclude"
167 cur_=${words_[cword_]}
168 while [ $# -gt 0 ]; do
169 case "$1" in
170 cur)
171 cur=$cur_
173 prev)
174 prev=${words_[$cword_-1]}
176 words)
177 words=("${words_[@]}")
179 cword)
180 cword=$cword_
182 esac
183 shift
184 done
188 __gitcompappend ()
190 local x i=${#COMPREPLY[@]}
191 for x in $1; do
192 if [[ "$x" == "$3"* ]]; then
193 COMPREPLY[i++]="$2$x$4"
195 done
198 __gitcompadd ()
200 COMPREPLY=()
201 __gitcompappend "$@"
204 # Generates completion reply, appending a space to possible completion words,
205 # if necessary.
206 # It accepts 1 to 4 arguments:
207 # 1: List of possible completion words.
208 # 2: A prefix to be added to each possible completion word (optional).
209 # 3: Generate possible completion matches for this word (optional).
210 # 4: A suffix to be appended to each possible completion word (optional).
211 __gitcomp ()
213 local cur_="${3-$cur}"
215 case "$cur_" in
216 --*=)
219 local c i=0 IFS=$' \t\n'
220 for c in $1; do
221 c="$c${4-}"
222 if [[ $c == "$cur_"* ]]; then
223 case $c in
224 --*=*|*.) ;;
225 *) c="$c " ;;
226 esac
227 COMPREPLY[i++]="${2-}$c"
229 done
231 esac
234 # Variation of __gitcomp_nl () that appends to the existing list of
235 # completion candidates, COMPREPLY.
236 __gitcomp_nl_append ()
238 local IFS=$'\n'
239 __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }"
242 # Generates completion reply from newline-separated possible completion words
243 # by appending a space to all of them.
244 # It accepts 1 to 4 arguments:
245 # 1: List of possible completion words, separated by a single newline.
246 # 2: A prefix to be added to each possible completion word (optional).
247 # 3: Generate possible completion matches for this word (optional).
248 # 4: A suffix to be appended to each possible completion word instead of
249 # the default space (optional). If specified but empty, nothing is
250 # appended.
251 __gitcomp_nl ()
253 COMPREPLY=()
254 __gitcomp_nl_append "$@"
257 # Generates completion reply with compgen from newline-separated possible
258 # completion filenames.
259 # It accepts 1 to 3 arguments:
260 # 1: List of possible completion filenames, separated by a single newline.
261 # 2: A directory prefix to be added to each possible completion filename
262 # (optional).
263 # 3: Generate possible completion matches for this word (optional).
264 __gitcomp_file ()
266 local IFS=$'\n'
268 # XXX does not work when the directory prefix contains a tilde,
269 # since tilde expansion is not applied.
270 # This means that COMPREPLY will be empty and Bash default
271 # completion will be used.
272 __gitcompadd "$1" "${2-}" "${3-$cur}" ""
274 # use a hack to enable file mode in bash < 4
275 compopt -o filenames +o nospace 2>/dev/null ||
276 compgen -f /non-existing-dir/ > /dev/null
279 # Execute 'git ls-files', unless the --committable option is specified, in
280 # which case it runs 'git diff-index' to find out the files that can be
281 # committed. It return paths relative to the directory specified in the first
282 # argument, and using the options specified in the second argument.
283 __git_ls_files_helper ()
285 if [ "$2" == "--committable" ]; then
286 git -C "$1" diff-index --name-only --relative HEAD
287 else
288 # NOTE: $2 is not quoted in order to support multiple options
289 git -C "$1" ls-files --exclude-standard $2
290 fi 2>/dev/null
294 # __git_index_files accepts 1 or 2 arguments:
295 # 1: Options to pass to ls-files (required).
296 # 2: A directory path (optional).
297 # If provided, only files within the specified directory are listed.
298 # Sub directories are never recursed. Path must have a trailing
299 # slash.
300 __git_index_files ()
302 local dir="$(__gitdir)" root="${2-.}" file
304 if [ -d "$dir" ]; then
305 __git_ls_files_helper "$root" "$1" |
306 while read -r file; do
307 case "$file" in
308 ?*/*) echo "${file%%/*}" ;;
309 *) echo "$file" ;;
310 esac
311 done | sort | uniq
315 __git_heads ()
317 local dir="$(__gitdir)"
318 if [ -d "$dir" ]; then
319 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
320 refs/heads
321 return
325 __git_tags ()
327 local dir="$(__gitdir)"
328 if [ -d "$dir" ]; then
329 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
330 refs/tags
331 return
335 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
336 # presence of 2nd argument means use the guess heuristic employed
337 # by checkout for tracking branches
338 __git_refs ()
340 local i hash dir="$(__gitdir "${1-}")" track="${2-}"
341 local format refs pfx
342 if [ -d "$dir" ]; then
343 case "$cur" in
344 refs|refs/*)
345 format="refname"
346 refs="${cur%/*}"
347 track=""
350 [[ "$cur" == ^* ]] && pfx="^"
351 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
352 if [ -e "$dir/$i" ]; then echo $pfx$i; fi
353 done
354 format="refname:short"
355 refs="refs/tags refs/heads refs/remotes"
357 esac
358 git --git-dir="$dir" for-each-ref --format="$pfx%($format)" \
359 $refs
360 if [ -n "$track" ]; then
361 # employ the heuristic used by git checkout
362 # Try to find a remote branch that matches the completion word
363 # but only output if the branch name is unique
364 local ref entry
365 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
366 "refs/remotes/" | \
367 while read -r entry; do
368 eval "$entry"
369 ref="${ref#*/}"
370 if [[ "$ref" == "$cur"* ]]; then
371 echo "$ref"
373 done | sort | uniq -u
375 return
377 case "$cur" in
378 refs|refs/*)
379 git ls-remote "$dir" "$cur*" 2>/dev/null | \
380 while read -r hash i; do
381 case "$i" in
382 *^{}) ;;
383 *) echo "$i" ;;
384 esac
385 done
388 echo "HEAD"
389 git for-each-ref --format="%(refname:short)" -- \
390 "refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##"
392 esac
395 # __git_refs2 requires 1 argument (to pass to __git_refs)
396 __git_refs2 ()
398 local i
399 for i in $(__git_refs "$1"); do
400 echo "$i:$i"
401 done
404 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
405 __git_refs_remotes ()
407 local i hash
408 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
409 while read -r hash i; do
410 echo "$i:refs/remotes/$1/${i#refs/heads/}"
411 done
414 __git_remotes ()
416 local d="$(__gitdir)"
417 test -d "$d/remotes" && ls -1 "$d/remotes"
418 git --git-dir="$d" remote
421 __git_list_merge_strategies ()
423 git merge -s help 2>&1 |
424 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
425 s/\.$//
426 s/.*://
427 s/^[ ]*//
428 s/[ ]*$//
433 __git_merge_strategies=
434 # 'git merge -s help' (and thus detection of the merge strategy
435 # list) fails, unfortunately, if run outside of any git working
436 # tree. __git_merge_strategies is set to the empty string in
437 # that case, and the detection will be repeated the next time it
438 # is needed.
439 __git_compute_merge_strategies ()
441 test -n "$__git_merge_strategies" ||
442 __git_merge_strategies=$(__git_list_merge_strategies)
445 __git_complete_revlist_file ()
447 local pfx ls ref cur_="$cur"
448 case "$cur_" in
449 *..?*:*)
450 return
452 ?*:*)
453 ref="${cur_%%:*}"
454 cur_="${cur_#*:}"
455 case "$cur_" in
456 ?*/*)
457 pfx="${cur_%/*}"
458 cur_="${cur_##*/}"
459 ls="$ref:$pfx"
460 pfx="$pfx/"
463 ls="$ref"
465 esac
467 case "$COMP_WORDBREAKS" in
468 *:*) : great ;;
469 *) pfx="$ref:$pfx" ;;
470 esac
472 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
473 | sed '/^100... blob /{
474 s,^.* ,,
475 s,$, ,
477 /^120000 blob /{
478 s,^.* ,,
479 s,$, ,
481 /^040000 tree /{
482 s,^.* ,,
483 s,$,/,
485 s/^.* //')" \
486 "$pfx" "$cur_" ""
488 *...*)
489 pfx="${cur_%...*}..."
490 cur_="${cur_#*...}"
491 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
493 *..*)
494 pfx="${cur_%..*}.."
495 cur_="${cur_#*..}"
496 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
499 __gitcomp_nl "$(__git_refs)"
501 esac
505 # __git_complete_index_file requires 1 argument:
506 # 1: the options to pass to ls-file
508 # The exception is --committable, which finds the files appropriate commit.
509 __git_complete_index_file ()
511 local pfx="" cur_="$cur"
513 case "$cur_" in
514 ?*/*)
515 pfx="${cur_%/*}"
516 cur_="${cur_##*/}"
517 pfx="${pfx}/"
519 esac
521 __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
524 __git_complete_file ()
526 __git_complete_revlist_file
529 __git_complete_revlist ()
531 __git_complete_revlist_file
534 __git_complete_remote_or_refspec ()
536 local cur_="$cur" cmd="${words[1]}"
537 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
538 if [ "$cmd" = "remote" ]; then
539 ((c++))
541 while [ $c -lt $cword ]; do
542 i="${words[c]}"
543 case "$i" in
544 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
545 --all)
546 case "$cmd" in
547 push) no_complete_refspec=1 ;;
548 fetch)
549 return
551 *) ;;
552 esac
554 -*) ;;
555 *) remote="$i"; break ;;
556 esac
557 ((c++))
558 done
559 if [ -z "$remote" ]; then
560 __gitcomp_nl "$(__git_remotes)"
561 return
563 if [ $no_complete_refspec = 1 ]; then
564 return
566 [ "$remote" = "." ] && remote=
567 case "$cur_" in
568 *:*)
569 case "$COMP_WORDBREAKS" in
570 *:*) : great ;;
571 *) pfx="${cur_%%:*}:" ;;
572 esac
573 cur_="${cur_#*:}"
574 lhs=0
577 pfx="+"
578 cur_="${cur_#+}"
580 esac
581 case "$cmd" in
582 fetch)
583 if [ $lhs = 1 ]; then
584 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
585 else
586 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
589 pull|remote)
590 if [ $lhs = 1 ]; then
591 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
592 else
593 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
596 push)
597 if [ $lhs = 1 ]; then
598 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
599 else
600 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
603 esac
606 __git_complete_strategy ()
608 __git_compute_merge_strategies
609 case "$prev" in
610 -s|--strategy)
611 __gitcomp "$__git_merge_strategies"
612 return 0
613 esac
614 case "$cur" in
615 --strategy=*)
616 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
617 return 0
619 esac
620 return 1
623 __git_commands () {
624 if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
625 then
626 printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
627 else
628 git help -a|egrep '^ [a-zA-Z0-9]'
632 __git_list_all_commands ()
634 local i IFS=" "$'\n'
635 for i in $(__git_commands)
637 case $i in
638 *--*) : helper pattern;;
639 *) echo $i;;
640 esac
641 done
644 __git_all_commands=
645 __git_compute_all_commands ()
647 test -n "$__git_all_commands" ||
648 __git_all_commands=$(__git_list_all_commands)
651 __git_list_porcelain_commands ()
653 local i IFS=" "$'\n'
654 __git_compute_all_commands
655 for i in $__git_all_commands
657 case $i in
658 *--*) : helper pattern;;
659 applymbox) : ask gittus;;
660 applypatch) : ask gittus;;
661 archimport) : import;;
662 cat-file) : plumbing;;
663 check-attr) : plumbing;;
664 check-ignore) : plumbing;;
665 check-mailmap) : plumbing;;
666 check-ref-format) : plumbing;;
667 checkout-index) : plumbing;;
668 column) : internal helper;;
669 commit-tree) : plumbing;;
670 count-objects) : infrequent;;
671 credential) : credentials;;
672 credential-*) : credentials helper;;
673 cvsexportcommit) : export;;
674 cvsimport) : import;;
675 cvsserver) : daemon;;
676 daemon) : daemon;;
677 diff-files) : plumbing;;
678 diff-index) : plumbing;;
679 diff-tree) : plumbing;;
680 fast-import) : import;;
681 fast-export) : export;;
682 fsck-objects) : plumbing;;
683 fetch-pack) : plumbing;;
684 fmt-merge-msg) : plumbing;;
685 for-each-ref) : plumbing;;
686 hash-object) : plumbing;;
687 http-*) : transport;;
688 index-pack) : plumbing;;
689 init-db) : deprecated;;
690 local-fetch) : plumbing;;
691 ls-files) : plumbing;;
692 ls-remote) : plumbing;;
693 ls-tree) : plumbing;;
694 mailinfo) : plumbing;;
695 mailsplit) : plumbing;;
696 merge-*) : plumbing;;
697 mktree) : plumbing;;
698 mktag) : plumbing;;
699 pack-objects) : plumbing;;
700 pack-redundant) : plumbing;;
701 pack-refs) : plumbing;;
702 parse-remote) : plumbing;;
703 patch-id) : plumbing;;
704 prune) : plumbing;;
705 prune-packed) : plumbing;;
706 quiltimport) : import;;
707 read-tree) : plumbing;;
708 receive-pack) : plumbing;;
709 remote-*) : transport;;
710 rerere) : plumbing;;
711 rev-list) : plumbing;;
712 rev-parse) : plumbing;;
713 runstatus) : plumbing;;
714 sh-setup) : internal;;
715 shell) : daemon;;
716 show-ref) : plumbing;;
717 send-pack) : plumbing;;
718 show-index) : plumbing;;
719 ssh-*) : transport;;
720 stripspace) : plumbing;;
721 symbolic-ref) : plumbing;;
722 unpack-file) : plumbing;;
723 unpack-objects) : plumbing;;
724 update-index) : plumbing;;
725 update-ref) : plumbing;;
726 update-server-info) : daemon;;
727 upload-archive) : plumbing;;
728 upload-pack) : plumbing;;
729 write-tree) : plumbing;;
730 var) : infrequent;;
731 verify-pack) : infrequent;;
732 verify-tag) : plumbing;;
733 *) echo $i;;
734 esac
735 done
738 __git_porcelain_commands=
739 __git_compute_porcelain_commands ()
741 test -n "$__git_porcelain_commands" ||
742 __git_porcelain_commands=$(__git_list_porcelain_commands)
745 # Lists all set config variables starting with the given section prefix,
746 # with the prefix removed.
747 __git_get_config_variables ()
749 local section="$1" i IFS=$'\n'
750 for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do
751 echo "${i#$section.}"
752 done
755 __git_pretty_aliases ()
757 __git_get_config_variables "pretty"
760 __git_aliases ()
762 __git_get_config_variables "alias"
765 # __git_aliased_command requires 1 argument
766 __git_aliased_command ()
768 local word cmdline=$(git --git-dir="$(__gitdir)" \
769 config --get "alias.$1")
770 for word in $cmdline; do
771 case "$word" in
772 \!gitk|gitk)
773 echo "gitk"
774 return
776 \!*) : shell command alias ;;
777 -*) : option ;;
778 *=*) : setting env ;;
779 git) : git itself ;;
780 \(\)) : skip parens of shell function definition ;;
781 {) : skip start of shell helper function ;;
782 :) : skip null command ;;
783 \'*) : skip opening quote after sh -c ;;
785 echo "$word"
786 return
787 esac
788 done
791 # __git_find_on_cmdline requires 1 argument
792 __git_find_on_cmdline ()
794 local word subcommand c=1
795 while [ $c -lt $cword ]; do
796 word="${words[c]}"
797 for subcommand in $1; do
798 if [ "$subcommand" = "$word" ]; then
799 echo "$subcommand"
800 return
802 done
803 ((c++))
804 done
807 # Echo the value of an option set on the command line or config
809 # $1: short option name
810 # $2: long option name including =
811 # $3: list of possible values
812 # $4: config string (optional)
814 # example:
815 # result="$(__git_get_option_value "-d" "--do-something=" \
816 # "yes no" "core.doSomething")"
818 # result is then either empty (no option set) or "yes" or "no"
820 # __git_get_option_value requires 3 arguments
821 __git_get_option_value ()
823 local c short_opt long_opt val
824 local result= values config_key word
826 short_opt="$1"
827 long_opt="$2"
828 values="$3"
829 config_key="$4"
831 ((c = $cword - 1))
832 while [ $c -ge 0 ]; do
833 word="${words[c]}"
834 for val in $values; do
835 if [ "$short_opt$val" = "$word" ] ||
836 [ "$long_opt$val" = "$word" ]; then
837 result="$val"
838 break 2
840 done
841 ((c--))
842 done
844 if [ -n "$config_key" ] && [ -z "$result" ]; then
845 result="$(git --git-dir="$(__gitdir)" config "$config_key")"
848 echo "$result"
851 __git_has_doubledash ()
853 local c=1
854 while [ $c -lt $cword ]; do
855 if [ "--" = "${words[c]}" ]; then
856 return 0
858 ((c++))
859 done
860 return 1
863 # Try to count non option arguments passed on the command line for the
864 # specified git command.
865 # When options are used, it is necessary to use the special -- option to
866 # tell the implementation were non option arguments begin.
867 # XXX this can not be improved, since options can appear everywhere, as
868 # an example:
869 # git mv x -n y
871 # __git_count_arguments requires 1 argument: the git command executed.
872 __git_count_arguments ()
874 local word i c=0
876 # Skip "git" (first argument)
877 for ((i=1; i < ${#words[@]}; i++)); do
878 word="${words[i]}"
880 case "$word" in
882 # Good; we can assume that the following are only non
883 # option arguments.
884 ((c = 0))
886 "$1")
887 # Skip the specified git command and discard git
888 # main options
889 ((c = 0))
892 ((c++))
894 esac
895 done
897 printf "%d" $c
900 __git_whitespacelist="nowarn warn error error-all fix"
902 _git_am ()
904 local dir="$(__gitdir)"
905 if [ -d "$dir"/rebase-apply ]; then
906 __gitcomp "--skip --continue --resolved --abort"
907 return
909 case "$cur" in
910 --whitespace=*)
911 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
912 return
914 --*)
915 __gitcomp "
916 --3way --committer-date-is-author-date --ignore-date
917 --ignore-whitespace --ignore-space-change
918 --interactive --keep --no-utf8 --signoff --utf8
919 --whitespace= --scissors
921 return
922 esac
925 _git_apply ()
927 case "$cur" in
928 --whitespace=*)
929 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
930 return
932 --*)
933 __gitcomp "
934 --stat --numstat --summary --check --index
935 --cached --index-info --reverse --reject --unidiff-zero
936 --apply --no-add --exclude=
937 --ignore-whitespace --ignore-space-change
938 --whitespace= --inaccurate-eof --verbose
939 --recount --directory=
941 return
942 esac
945 _git_add ()
947 case "$cur" in
948 --*)
949 __gitcomp "
950 --interactive --refresh --patch --update --dry-run
951 --ignore-errors --intent-to-add --force --edit --chmod=
953 return
954 esac
956 local complete_opt="--others --modified --directory --no-empty-directory"
957 if test -n "$(__git_find_on_cmdline "-u --update")"
958 then
959 complete_opt="--modified"
961 __git_complete_index_file "$complete_opt"
964 _git_archive ()
966 case "$cur" in
967 --format=*)
968 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
969 return
971 --remote=*)
972 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
973 return
975 --*)
976 __gitcomp "
977 --format= --list --verbose
978 --prefix= --remote= --exec= --output
980 return
982 esac
983 __git_complete_file
986 _git_bisect ()
988 __git_has_doubledash && return
990 local subcommands="start bad good skip reset visualize replay log run"
991 local subcommand="$(__git_find_on_cmdline "$subcommands")"
992 if [ -z "$subcommand" ]; then
993 if [ -f "$(__gitdir)"/BISECT_START ]; then
994 __gitcomp "$subcommands"
995 else
996 __gitcomp "replay start"
998 return
1001 case "$subcommand" in
1002 bad|good|reset|skip|start)
1003 __gitcomp_nl "$(__git_refs)"
1007 esac
1010 _git_branch ()
1012 local i c=1 only_local_ref="n" has_r="n"
1014 while [ $c -lt $cword ]; do
1015 i="${words[c]}"
1016 case "$i" in
1017 -d|--delete|-m|--move) only_local_ref="y" ;;
1018 -r|--remotes) has_r="y" ;;
1019 esac
1020 ((c++))
1021 done
1023 case "$cur" in
1024 --set-upstream-to=*)
1025 __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}"
1027 --*)
1028 __gitcomp "
1029 --color --no-color --verbose --abbrev= --no-abbrev
1030 --track --no-track --contains --merged --no-merged
1031 --set-upstream-to= --edit-description --list
1032 --unset-upstream --delete --move --remotes
1033 --column --no-column --sort= --points-at
1037 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1038 __gitcomp_nl "$(__git_heads)"
1039 else
1040 __gitcomp_nl "$(__git_refs)"
1043 esac
1046 _git_bundle ()
1048 local cmd="${words[2]}"
1049 case "$cword" in
1051 __gitcomp "create list-heads verify unbundle"
1054 # looking for a file
1057 case "$cmd" in
1058 create)
1059 __git_complete_revlist
1061 esac
1063 esac
1066 _git_checkout ()
1068 __git_has_doubledash && return
1070 case "$cur" in
1071 --conflict=*)
1072 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1074 --*)
1075 __gitcomp "
1076 --quiet --ours --theirs --track --no-track --merge
1077 --conflict= --orphan --patch
1081 # check if --track, --no-track, or --no-guess was specified
1082 # if so, disable DWIM mode
1083 local flags="--track --no-track --no-guess" track=1
1084 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1085 track=''
1087 __gitcomp_nl "$(__git_refs '' $track)"
1089 esac
1092 _git_cherry ()
1094 __gitcomp_nl "$(__git_refs)"
1097 _git_cherry_pick ()
1099 local dir="$(__gitdir)"
1100 if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1101 __gitcomp "--continue --quit --abort"
1102 return
1104 case "$cur" in
1105 --*)
1106 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1109 __gitcomp_nl "$(__git_refs)"
1111 esac
1114 _git_clean ()
1116 case "$cur" in
1117 --*)
1118 __gitcomp "--dry-run --quiet"
1119 return
1121 esac
1123 # XXX should we check for -x option ?
1124 __git_complete_index_file "--others --directory"
1127 _git_clone ()
1129 case "$cur" in
1130 --*)
1131 __gitcomp "
1132 --local
1133 --no-hardlinks
1134 --shared
1135 --reference
1136 --quiet
1137 --no-checkout
1138 --bare
1139 --mirror
1140 --origin
1141 --upload-pack
1142 --template=
1143 --depth
1144 --single-branch
1145 --branch
1146 --recurse-submodules
1147 --no-single-branch
1148 --shallow-submodules
1150 return
1152 esac
1155 __git_untracked_file_modes="all no normal"
1157 _git_commit ()
1159 case "$prev" in
1160 -c|-C)
1161 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1162 return
1164 esac
1166 case "$cur" in
1167 --cleanup=*)
1168 __gitcomp "default scissors strip verbatim whitespace
1169 " "" "${cur##--cleanup=}"
1170 return
1172 --reuse-message=*|--reedit-message=*|\
1173 --fixup=*|--squash=*)
1174 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1175 return
1177 --untracked-files=*)
1178 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1179 return
1181 --*)
1182 __gitcomp "
1183 --all --author= --signoff --verify --no-verify
1184 --edit --no-edit
1185 --amend --include --only --interactive
1186 --dry-run --reuse-message= --reedit-message=
1187 --reset-author --file= --message= --template=
1188 --cleanup= --untracked-files --untracked-files=
1189 --verbose --quiet --fixup= --squash=
1190 --patch --short --date --allow-empty
1192 return
1193 esac
1195 if git rev-parse --verify --quiet HEAD >/dev/null; then
1196 __git_complete_index_file "--committable"
1197 else
1198 # This is the first commit
1199 __git_complete_index_file "--cached"
1203 _git_describe ()
1205 case "$cur" in
1206 --*)
1207 __gitcomp "
1208 --all --tags --contains --abbrev= --candidates=
1209 --exact-match --debug --long --match --always --first-parent
1211 return
1212 esac
1213 __gitcomp_nl "$(__git_refs)"
1216 __git_diff_algorithms="myers minimal patience histogram"
1218 __git_diff_submodule_formats="diff log short"
1220 __git_diff_common_options="--stat --numstat --shortstat --summary
1221 --patch-with-stat --name-only --name-status --color
1222 --no-color --color-words --no-renames --check
1223 --full-index --binary --abbrev --diff-filter=
1224 --find-copies-harder
1225 --text --ignore-space-at-eol --ignore-space-change
1226 --ignore-all-space --ignore-blank-lines --exit-code
1227 --quiet --ext-diff --no-ext-diff
1228 --no-prefix --src-prefix= --dst-prefix=
1229 --inter-hunk-context=
1230 --patience --histogram --minimal
1231 --raw --word-diff --word-diff-regex=
1232 --dirstat --dirstat= --dirstat-by-file
1233 --dirstat-by-file= --cumulative
1234 --diff-algorithm=
1235 --submodule --submodule=
1238 _git_diff ()
1240 __git_has_doubledash && return
1242 case "$cur" in
1243 --diff-algorithm=*)
1244 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1245 return
1247 --submodule=*)
1248 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1249 return
1251 --*)
1252 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1253 --base --ours --theirs --no-index
1254 $__git_diff_common_options
1256 return
1258 esac
1259 __git_complete_revlist_file
1262 __git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1263 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
1266 _git_difftool ()
1268 __git_has_doubledash && return
1270 case "$cur" in
1271 --tool=*)
1272 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1273 return
1275 --*)
1276 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1277 --base --ours --theirs
1278 --no-renames --diff-filter= --find-copies-harder
1279 --relative --ignore-submodules
1280 --tool="
1281 return
1283 esac
1284 __git_complete_revlist_file
1287 __git_fetch_recurse_submodules="yes on-demand no"
1289 __git_fetch_options="
1290 --quiet --verbose --append --upload-pack --force --keep --depth=
1291 --tags --no-tags --all --prune --dry-run --recurse-submodules=
1292 --unshallow --update-shallow
1295 _git_fetch ()
1297 case "$cur" in
1298 --recurse-submodules=*)
1299 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1300 return
1302 --*)
1303 __gitcomp "$__git_fetch_options"
1304 return
1306 esac
1307 __git_complete_remote_or_refspec
1310 __git_format_patch_options="
1311 --stdout --attach --no-attach --thread --thread= --no-thread
1312 --numbered --start-number --numbered-files --keep-subject --signoff
1313 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1314 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1315 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1316 --output-directory --reroll-count --to= --quiet --notes
1319 _git_format_patch ()
1321 case "$cur" in
1322 --thread=*)
1323 __gitcomp "
1324 deep shallow
1325 " "" "${cur##--thread=}"
1326 return
1328 --*)
1329 __gitcomp "$__git_format_patch_options"
1330 return
1332 esac
1333 __git_complete_revlist
1336 _git_fsck ()
1338 case "$cur" in
1339 --*)
1340 __gitcomp "
1341 --tags --root --unreachable --cache --no-reflogs --full
1342 --strict --verbose --lost-found --name-objects
1344 return
1346 esac
1349 _git_gc ()
1351 case "$cur" in
1352 --*)
1353 __gitcomp "--prune --aggressive"
1354 return
1356 esac
1359 _git_gitk ()
1361 _gitk
1364 __git_match_ctag() {
1365 awk "/^${1//\//\\/}/ { print \$1 }" "$2"
1368 _git_grep ()
1370 __git_has_doubledash && return
1372 case "$cur" in
1373 --*)
1374 __gitcomp "
1375 --cached
1376 --text --ignore-case --word-regexp --invert-match
1377 --full-name --line-number
1378 --extended-regexp --basic-regexp --fixed-strings
1379 --perl-regexp
1380 --threads
1381 --files-with-matches --name-only
1382 --files-without-match
1383 --max-depth
1384 --count
1385 --and --or --not --all-match
1386 --break --heading --show-function --function-context
1387 --untracked --no-index
1389 return
1391 esac
1393 case "$cword,$prev" in
1394 2,*|*,-*)
1395 if test -r tags; then
1396 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1397 return
1400 esac
1402 __gitcomp_nl "$(__git_refs)"
1405 _git_help ()
1407 case "$cur" in
1408 --*)
1409 __gitcomp "--all --guides --info --man --web"
1410 return
1412 esac
1413 __git_compute_all_commands
1414 __gitcomp "$__git_all_commands $(__git_aliases)
1415 attributes cli core-tutorial cvs-migration
1416 diffcore everyday gitk glossary hooks ignore modules
1417 namespaces repository-layout revisions tutorial tutorial-2
1418 workflows
1422 _git_init ()
1424 case "$cur" in
1425 --shared=*)
1426 __gitcomp "
1427 false true umask group all world everybody
1428 " "" "${cur##--shared=}"
1429 return
1431 --*)
1432 __gitcomp "--quiet --bare --template= --shared --shared="
1433 return
1435 esac
1438 _git_ls_files ()
1440 case "$cur" in
1441 --*)
1442 __gitcomp "--cached --deleted --modified --others --ignored
1443 --stage --directory --no-empty-directory --unmerged
1444 --killed --exclude= --exclude-from=
1445 --exclude-per-directory= --exclude-standard
1446 --error-unmatch --with-tree= --full-name
1447 --abbrev --ignored --exclude-per-directory
1449 return
1451 esac
1453 # XXX ignore options like --modified and always suggest all cached
1454 # files.
1455 __git_complete_index_file "--cached"
1458 _git_ls_remote ()
1460 case "$cur" in
1461 --*)
1462 __gitcomp "--heads --tags --refs --get-url --symref"
1463 return
1465 esac
1466 __gitcomp_nl "$(__git_remotes)"
1469 _git_ls_tree ()
1471 __git_complete_file
1474 # Options that go well for log, shortlog and gitk
1475 __git_log_common_options="
1476 --not --all
1477 --branches --tags --remotes
1478 --first-parent --merges --no-merges
1479 --max-count=
1480 --max-age= --since= --after=
1481 --min-age= --until= --before=
1482 --min-parents= --max-parents=
1483 --no-min-parents --no-max-parents
1485 # Options that go well for log and gitk (not shortlog)
1486 __git_log_gitk_options="
1487 --dense --sparse --full-history
1488 --simplify-merges --simplify-by-decoration
1489 --left-right --notes --no-notes
1491 # Options that go well for log and shortlog (not gitk)
1492 __git_log_shortlog_options="
1493 --author= --committer= --grep=
1494 --all-match --invert-grep
1497 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1498 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1500 _git_log ()
1502 __git_has_doubledash && return
1504 local g="$(git rev-parse --git-dir 2>/dev/null)"
1505 local merge=""
1506 if [ -f "$g/MERGE_HEAD" ]; then
1507 merge="--merge"
1509 case "$cur" in
1510 --pretty=*|--format=*)
1511 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1512 " "" "${cur#*=}"
1513 return
1515 --date=*)
1516 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1517 return
1519 --decorate=*)
1520 __gitcomp "full short no" "" "${cur##--decorate=}"
1521 return
1523 --diff-algorithm=*)
1524 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1525 return
1527 --submodule=*)
1528 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1529 return
1531 --*)
1532 __gitcomp "
1533 $__git_log_common_options
1534 $__git_log_shortlog_options
1535 $__git_log_gitk_options
1536 --root --topo-order --date-order --reverse
1537 --follow --full-diff
1538 --abbrev-commit --abbrev=
1539 --relative-date --date=
1540 --pretty= --format= --oneline
1541 --show-signature
1542 --cherry-mark
1543 --cherry-pick
1544 --graph
1545 --decorate --decorate=
1546 --walk-reflogs
1547 --parents --children
1548 $merge
1549 $__git_diff_common_options
1550 --pickaxe-all --pickaxe-regex
1552 return
1554 esac
1555 __git_complete_revlist
1558 # Common merge options shared by git-merge(1) and git-pull(1).
1559 __git_merge_options="
1560 --no-commit --no-stat --log --no-log --squash --strategy
1561 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1562 --verify-signatures --no-verify-signatures --gpg-sign
1563 --quiet --verbose --progress --no-progress
1566 _git_merge ()
1568 __git_complete_strategy && return
1570 case "$cur" in
1571 --*)
1572 __gitcomp "$__git_merge_options
1573 --rerere-autoupdate --no-rerere-autoupdate --abort --continue"
1574 return
1575 esac
1576 __gitcomp_nl "$(__git_refs)"
1579 _git_mergetool ()
1581 case "$cur" in
1582 --tool=*)
1583 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1584 return
1586 --*)
1587 __gitcomp "--tool= --prompt --no-prompt"
1588 return
1590 esac
1593 _git_merge_base ()
1595 case "$cur" in
1596 --*)
1597 __gitcomp "--octopus --independent --is-ancestor --fork-point"
1598 return
1600 esac
1601 __gitcomp_nl "$(__git_refs)"
1604 _git_mv ()
1606 case "$cur" in
1607 --*)
1608 __gitcomp "--dry-run"
1609 return
1611 esac
1613 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1614 # We need to show both cached and untracked files (including
1615 # empty directories) since this may not be the last argument.
1616 __git_complete_index_file "--cached --others --directory"
1617 else
1618 __git_complete_index_file "--cached"
1622 _git_name_rev ()
1624 __gitcomp "--tags --all --stdin"
1627 _git_notes ()
1629 local subcommands='add append copy edit list prune remove show'
1630 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1632 case "$subcommand,$cur" in
1633 ,--*)
1634 __gitcomp '--ref'
1637 case "$prev" in
1638 --ref)
1639 __gitcomp_nl "$(__git_refs)"
1642 __gitcomp "$subcommands --ref"
1644 esac
1646 add,--reuse-message=*|append,--reuse-message=*|\
1647 add,--reedit-message=*|append,--reedit-message=*)
1648 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1650 add,--*|append,--*)
1651 __gitcomp '--file= --message= --reedit-message=
1652 --reuse-message='
1654 copy,--*)
1655 __gitcomp '--stdin'
1657 prune,--*)
1658 __gitcomp '--dry-run --verbose'
1660 prune,*)
1663 case "$prev" in
1664 -m|-F)
1667 __gitcomp_nl "$(__git_refs)"
1669 esac
1671 esac
1674 _git_pull ()
1676 __git_complete_strategy && return
1678 case "$cur" in
1679 --recurse-submodules=*)
1680 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1681 return
1683 --*)
1684 __gitcomp "
1685 --rebase --no-rebase
1686 $__git_merge_options
1687 $__git_fetch_options
1689 return
1691 esac
1692 __git_complete_remote_or_refspec
1695 __git_push_recurse_submodules="check on-demand only"
1697 __git_complete_force_with_lease ()
1699 local cur_=$1
1701 case "$cur_" in
1702 --*=)
1704 *:*)
1705 __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
1708 __gitcomp_nl "$(__git_refs)" "" "$cur_"
1710 esac
1713 _git_push ()
1715 case "$prev" in
1716 --repo)
1717 __gitcomp_nl "$(__git_remotes)"
1718 return
1720 --recurse-submodules)
1721 __gitcomp "$__git_push_recurse_submodules"
1722 return
1724 esac
1725 case "$cur" in
1726 --repo=*)
1727 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1728 return
1730 --recurse-submodules=*)
1731 __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1732 return
1734 --force-with-lease=*)
1735 __git_complete_force_with_lease "${cur##--force-with-lease=}"
1736 return
1738 --*)
1739 __gitcomp "
1740 --all --mirror --tags --dry-run --force --verbose
1741 --quiet --prune --delete --follow-tags
1742 --receive-pack= --repo= --set-upstream
1743 --force-with-lease --force-with-lease= --recurse-submodules=
1745 return
1747 esac
1748 __git_complete_remote_or_refspec
1751 _git_rebase ()
1753 local dir="$(__gitdir)"
1754 if [ -f "$dir"/rebase-merge/interactive ]; then
1755 __gitcomp "--continue --skip --abort --quit --edit-todo"
1756 return
1757 elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1758 __gitcomp "--continue --skip --abort --quit"
1759 return
1761 __git_complete_strategy && return
1762 case "$cur" in
1763 --whitespace=*)
1764 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1765 return
1767 --*)
1768 __gitcomp "
1769 --onto --merge --strategy --interactive
1770 --preserve-merges --stat --no-stat
1771 --committer-date-is-author-date --ignore-date
1772 --ignore-whitespace --whitespace=
1773 --autosquash --no-autosquash
1774 --fork-point --no-fork-point
1775 --autostash --no-autostash
1776 --verify --no-verify
1777 --keep-empty --root --force-rebase --no-ff
1778 --exec
1781 return
1782 esac
1783 __gitcomp_nl "$(__git_refs)"
1786 _git_reflog ()
1788 local subcommands="show delete expire"
1789 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1791 if [ -z "$subcommand" ]; then
1792 __gitcomp "$subcommands"
1793 else
1794 __gitcomp_nl "$(__git_refs)"
1798 __git_send_email_confirm_options="always never auto cc compose"
1799 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1801 _git_send_email ()
1803 case "$prev" in
1804 --to|--cc|--bcc|--from)
1805 __gitcomp "
1806 $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1808 return
1810 esac
1812 case "$cur" in
1813 --confirm=*)
1814 __gitcomp "
1815 $__git_send_email_confirm_options
1816 " "" "${cur##--confirm=}"
1817 return
1819 --suppress-cc=*)
1820 __gitcomp "
1821 $__git_send_email_suppresscc_options
1822 " "" "${cur##--suppress-cc=}"
1824 return
1826 --smtp-encryption=*)
1827 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1828 return
1830 --thread=*)
1831 __gitcomp "
1832 deep shallow
1833 " "" "${cur##--thread=}"
1834 return
1836 --to=*|--cc=*|--bcc=*|--from=*)
1837 __gitcomp "
1838 $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1839 " "" "${cur#--*=}"
1840 return
1842 --*)
1843 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1844 --compose --confirm= --dry-run --envelope-sender
1845 --from --identity
1846 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1847 --no-suppress-from --no-thread --quiet
1848 --signed-off-by-cc --smtp-pass --smtp-server
1849 --smtp-server-port --smtp-encryption= --smtp-user
1850 --subject --suppress-cc= --suppress-from --thread --to
1851 --validate --no-validate
1852 $__git_format_patch_options"
1853 return
1855 esac
1856 __git_complete_revlist
1859 _git_stage ()
1861 _git_add
1864 _git_status ()
1866 local complete_opt
1867 local untracked_state
1869 case "$cur" in
1870 --ignore-submodules=*)
1871 __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
1872 return
1874 --untracked-files=*)
1875 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1876 return
1878 --column=*)
1879 __gitcomp "
1880 always never auto column row plain dense nodense
1881 " "" "${cur##--column=}"
1882 return
1884 --*)
1885 __gitcomp "
1886 --short --branch --porcelain --long --verbose
1887 --untracked-files= --ignore-submodules= --ignored
1888 --column= --no-column
1890 return
1892 esac
1894 untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
1895 "$__git_untracked_file_modes" "status.showUntrackedFiles")"
1897 case "$untracked_state" in
1899 # --ignored option does not matter
1900 complete_opt=
1902 all|normal|*)
1903 complete_opt="--cached --directory --no-empty-directory --others"
1905 if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
1906 complete_opt="$complete_opt --ignored --exclude=*"
1909 esac
1911 __git_complete_index_file "$complete_opt"
1914 __git_config_get_set_variables ()
1916 local prevword word config_file= c=$cword
1917 while [ $c -gt 1 ]; do
1918 word="${words[c]}"
1919 case "$word" in
1920 --system|--global|--local|--file=*)
1921 config_file="$word"
1922 break
1924 -f|--file)
1925 config_file="$word $prevword"
1926 break
1928 esac
1929 prevword=$word
1930 c=$((--c))
1931 done
1933 git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
1936 _git_config ()
1938 case "$prev" in
1939 branch.*.remote|branch.*.pushremote)
1940 __gitcomp_nl "$(__git_remotes)"
1941 return
1943 branch.*.merge)
1944 __gitcomp_nl "$(__git_refs)"
1945 return
1947 branch.*.rebase)
1948 __gitcomp "false true preserve interactive"
1949 return
1951 remote.pushdefault)
1952 __gitcomp_nl "$(__git_remotes)"
1953 return
1955 remote.*.fetch)
1956 local remote="${prev#remote.}"
1957 remote="${remote%.fetch}"
1958 if [ -z "$cur" ]; then
1959 __gitcomp_nl "refs/heads/" "" "" ""
1960 return
1962 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1963 return
1965 remote.*.push)
1966 local remote="${prev#remote.}"
1967 remote="${remote%.push}"
1968 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1969 for-each-ref --format='%(refname):%(refname)' \
1970 refs/heads)"
1971 return
1973 pull.twohead|pull.octopus)
1974 __git_compute_merge_strategies
1975 __gitcomp "$__git_merge_strategies"
1976 return
1978 color.branch|color.diff|color.interactive|\
1979 color.showbranch|color.status|color.ui)
1980 __gitcomp "always never auto"
1981 return
1983 color.pager)
1984 __gitcomp "false true"
1985 return
1987 color.*.*)
1988 __gitcomp "
1989 normal black red green yellow blue magenta cyan white
1990 bold dim ul blink reverse
1992 return
1994 diff.submodule)
1995 __gitcomp "log short"
1996 return
1998 help.format)
1999 __gitcomp "man info web html"
2000 return
2002 log.date)
2003 __gitcomp "$__git_log_date_formats"
2004 return
2006 sendemail.aliasesfiletype)
2007 __gitcomp "mutt mailrc pine elm gnus"
2008 return
2010 sendemail.confirm)
2011 __gitcomp "$__git_send_email_confirm_options"
2012 return
2014 sendemail.suppresscc)
2015 __gitcomp "$__git_send_email_suppresscc_options"
2016 return
2018 sendemail.transferencoding)
2019 __gitcomp "7bit 8bit quoted-printable base64"
2020 return
2022 --get|--get-all|--unset|--unset-all)
2023 __gitcomp_nl "$(__git_config_get_set_variables)"
2024 return
2026 *.*)
2027 return
2029 esac
2030 case "$cur" in
2031 --*)
2032 __gitcomp "
2033 --system --global --local --file=
2034 --list --replace-all
2035 --get --get-all --get-regexp
2036 --add --unset --unset-all
2037 --remove-section --rename-section
2038 --name-only
2040 return
2042 branch.*.*)
2043 local pfx="${cur%.*}." cur_="${cur##*.}"
2044 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
2045 return
2047 branch.*)
2048 local pfx="${cur%.*}." cur_="${cur#*.}"
2049 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
2050 __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
2051 return
2053 guitool.*.*)
2054 local pfx="${cur%.*}." cur_="${cur##*.}"
2055 __gitcomp "
2056 argprompt cmd confirm needsfile noconsole norescan
2057 prompt revprompt revunmerged title
2058 " "$pfx" "$cur_"
2059 return
2061 difftool.*.*)
2062 local pfx="${cur%.*}." cur_="${cur##*.}"
2063 __gitcomp "cmd path" "$pfx" "$cur_"
2064 return
2066 man.*.*)
2067 local pfx="${cur%.*}." cur_="${cur##*.}"
2068 __gitcomp "cmd path" "$pfx" "$cur_"
2069 return
2071 mergetool.*.*)
2072 local pfx="${cur%.*}." cur_="${cur##*.}"
2073 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
2074 return
2076 pager.*)
2077 local pfx="${cur%.*}." cur_="${cur#*.}"
2078 __git_compute_all_commands
2079 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
2080 return
2082 remote.*.*)
2083 local pfx="${cur%.*}." cur_="${cur##*.}"
2084 __gitcomp "
2085 url proxy fetch push mirror skipDefaultUpdate
2086 receivepack uploadpack tagopt pushurl
2087 " "$pfx" "$cur_"
2088 return
2090 remote.*)
2091 local pfx="${cur%.*}." cur_="${cur#*.}"
2092 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
2093 __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
2094 return
2096 url.*.*)
2097 local pfx="${cur%.*}." cur_="${cur##*.}"
2098 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2099 return
2101 esac
2102 __gitcomp "
2103 add.ignoreErrors
2104 advice.commitBeforeMerge
2105 advice.detachedHead
2106 advice.implicitIdentity
2107 advice.pushNonFastForward
2108 advice.resolveConflict
2109 advice.statusHints
2110 alias.
2111 am.keepcr
2112 apply.ignorewhitespace
2113 apply.whitespace
2114 branch.autosetupmerge
2115 branch.autosetuprebase
2116 browser.
2117 clean.requireForce
2118 color.branch
2119 color.branch.current
2120 color.branch.local
2121 color.branch.plain
2122 color.branch.remote
2123 color.decorate.HEAD
2124 color.decorate.branch
2125 color.decorate.remoteBranch
2126 color.decorate.stash
2127 color.decorate.tag
2128 color.diff
2129 color.diff.commit
2130 color.diff.frag
2131 color.diff.func
2132 color.diff.meta
2133 color.diff.new
2134 color.diff.old
2135 color.diff.plain
2136 color.diff.whitespace
2137 color.grep
2138 color.grep.context
2139 color.grep.filename
2140 color.grep.function
2141 color.grep.linenumber
2142 color.grep.match
2143 color.grep.selected
2144 color.grep.separator
2145 color.interactive
2146 color.interactive.error
2147 color.interactive.header
2148 color.interactive.help
2149 color.interactive.prompt
2150 color.pager
2151 color.showbranch
2152 color.status
2153 color.status.added
2154 color.status.changed
2155 color.status.header
2156 color.status.nobranch
2157 color.status.unmerged
2158 color.status.untracked
2159 color.status.updated
2160 color.ui
2161 commit.status
2162 commit.template
2163 core.abbrev
2164 core.askpass
2165 core.attributesfile
2166 core.autocrlf
2167 core.bare
2168 core.bigFileThreshold
2169 core.compression
2170 core.createObject
2171 core.deltaBaseCacheLimit
2172 core.editor
2173 core.eol
2174 core.excludesfile
2175 core.fileMode
2176 core.fsyncobjectfiles
2177 core.gitProxy
2178 core.ignoreStat
2179 core.ignorecase
2180 core.logAllRefUpdates
2181 core.loosecompression
2182 core.notesRef
2183 core.packedGitLimit
2184 core.packedGitWindowSize
2185 core.pager
2186 core.preferSymlinkRefs
2187 core.preloadindex
2188 core.quotepath
2189 core.repositoryFormatVersion
2190 core.safecrlf
2191 core.sharedRepository
2192 core.sparseCheckout
2193 core.symlinks
2194 core.trustctime
2195 core.untrackedCache
2196 core.warnAmbiguousRefs
2197 core.whitespace
2198 core.worktree
2199 diff.autorefreshindex
2200 diff.external
2201 diff.ignoreSubmodules
2202 diff.mnemonicprefix
2203 diff.noprefix
2204 diff.renameLimit
2205 diff.renames
2206 diff.statGraphWidth
2207 diff.submodule
2208 diff.suppressBlankEmpty
2209 diff.tool
2210 diff.wordRegex
2211 diff.algorithm
2212 difftool.
2213 difftool.prompt
2214 fetch.recurseSubmodules
2215 fetch.unpackLimit
2216 format.attach
2217 format.cc
2218 format.coverLetter
2219 format.from
2220 format.headers
2221 format.numbered
2222 format.pretty
2223 format.signature
2224 format.signoff
2225 format.subjectprefix
2226 format.suffix
2227 format.thread
2228 format.to
2230 gc.aggressiveWindow
2231 gc.auto
2232 gc.autopacklimit
2233 gc.packrefs
2234 gc.pruneexpire
2235 gc.reflogexpire
2236 gc.reflogexpireunreachable
2237 gc.rerereresolved
2238 gc.rerereunresolved
2239 gitcvs.allbinary
2240 gitcvs.commitmsgannotation
2241 gitcvs.dbTableNamePrefix
2242 gitcvs.dbdriver
2243 gitcvs.dbname
2244 gitcvs.dbpass
2245 gitcvs.dbuser
2246 gitcvs.enabled
2247 gitcvs.logfile
2248 gitcvs.usecrlfattr
2249 guitool.
2250 gui.blamehistoryctx
2251 gui.commitmsgwidth
2252 gui.copyblamethreshold
2253 gui.diffcontext
2254 gui.encoding
2255 gui.fastcopyblame
2256 gui.matchtrackingbranch
2257 gui.newbranchtemplate
2258 gui.pruneduringfetch
2259 gui.spellingdictionary
2260 gui.trustmtime
2261 help.autocorrect
2262 help.browser
2263 help.format
2264 http.lowSpeedLimit
2265 http.lowSpeedTime
2266 http.maxRequests
2267 http.minSessions
2268 http.noEPSV
2269 http.postBuffer
2270 http.proxy
2271 http.sslCipherList
2272 http.sslVersion
2273 http.sslCAInfo
2274 http.sslCAPath
2275 http.sslCert
2276 http.sslCertPasswordProtected
2277 http.sslKey
2278 http.sslVerify
2279 http.useragent
2280 i18n.commitEncoding
2281 i18n.logOutputEncoding
2282 imap.authMethod
2283 imap.folder
2284 imap.host
2285 imap.pass
2286 imap.port
2287 imap.preformattedHTML
2288 imap.sslverify
2289 imap.tunnel
2290 imap.user
2291 init.templatedir
2292 instaweb.browser
2293 instaweb.httpd
2294 instaweb.local
2295 instaweb.modulepath
2296 instaweb.port
2297 interactive.singlekey
2298 log.date
2299 log.decorate
2300 log.showroot
2301 mailmap.file
2302 man.
2303 man.viewer
2304 merge.
2305 merge.conflictstyle
2306 merge.log
2307 merge.renameLimit
2308 merge.renormalize
2309 merge.stat
2310 merge.tool
2311 merge.verbosity
2312 mergetool.
2313 mergetool.keepBackup
2314 mergetool.keepTemporaries
2315 mergetool.prompt
2316 notes.displayRef
2317 notes.rewrite.
2318 notes.rewrite.amend
2319 notes.rewrite.rebase
2320 notes.rewriteMode
2321 notes.rewriteRef
2322 pack.compression
2323 pack.deltaCacheLimit
2324 pack.deltaCacheSize
2325 pack.depth
2326 pack.indexVersion
2327 pack.packSizeLimit
2328 pack.threads
2329 pack.window
2330 pack.windowMemory
2331 pager.
2332 pretty.
2333 pull.octopus
2334 pull.twohead
2335 push.default
2336 push.followTags
2337 rebase.autosquash
2338 rebase.stat
2339 receive.autogc
2340 receive.denyCurrentBranch
2341 receive.denyDeleteCurrent
2342 receive.denyDeletes
2343 receive.denyNonFastForwards
2344 receive.fsckObjects
2345 receive.unpackLimit
2346 receive.updateserverinfo
2347 remote.pushdefault
2348 remotes.
2349 repack.usedeltabaseoffset
2350 rerere.autoupdate
2351 rerere.enabled
2352 sendemail.
2353 sendemail.aliasesfile
2354 sendemail.aliasfiletype
2355 sendemail.bcc
2356 sendemail.cc
2357 sendemail.cccmd
2358 sendemail.chainreplyto
2359 sendemail.confirm
2360 sendemail.envelopesender
2361 sendemail.from
2362 sendemail.identity
2363 sendemail.multiedit
2364 sendemail.signedoffbycc
2365 sendemail.smtpdomain
2366 sendemail.smtpencryption
2367 sendemail.smtppass
2368 sendemail.smtpserver
2369 sendemail.smtpserveroption
2370 sendemail.smtpserverport
2371 sendemail.smtpuser
2372 sendemail.suppresscc
2373 sendemail.suppressfrom
2374 sendemail.thread
2375 sendemail.to
2376 sendemail.validate
2377 showbranch.default
2378 status.relativePaths
2379 status.showUntrackedFiles
2380 status.submodulesummary
2381 submodule.
2382 tar.umask
2383 transfer.unpackLimit
2384 url.
2385 user.email
2386 user.name
2387 user.signingkey
2388 web.browser
2389 branch. remote.
2393 _git_remote ()
2395 local subcommands="
2396 add rename remove set-head set-branches
2397 get-url set-url show prune update
2399 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2400 if [ -z "$subcommand" ]; then
2401 case "$cur" in
2402 --*)
2403 __gitcomp "--verbose"
2406 __gitcomp "$subcommands"
2408 esac
2409 return
2412 case "$subcommand,$cur" in
2413 add,--*)
2414 __gitcomp "--track --master --fetch --tags --no-tags --mirror="
2416 add,*)
2418 set-head,--*)
2419 __gitcomp "--auto --delete"
2421 set-branches,--*)
2422 __gitcomp "--add"
2424 set-head,*|set-branches,*)
2425 __git_complete_remote_or_refspec
2427 update,--*)
2428 __gitcomp "--prune"
2430 update,*)
2431 __gitcomp "$(__git_get_config_variables "remotes")"
2433 set-url,--*)
2434 __gitcomp "--push --add --delete"
2436 get-url,--*)
2437 __gitcomp "--push --all"
2439 prune,--*)
2440 __gitcomp "--dry-run"
2443 __gitcomp_nl "$(__git_remotes)"
2445 esac
2448 _git_replace ()
2450 case "$cur" in
2451 --*)
2452 __gitcomp "--edit --graft --format= --list --delete"
2453 return
2455 esac
2456 __gitcomp_nl "$(__git_refs)"
2459 _git_rerere ()
2461 local subcommands="clear forget diff remaining status gc"
2462 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2463 if test -z "$subcommand"
2464 then
2465 __gitcomp "$subcommands"
2466 return
2470 _git_reset ()
2472 __git_has_doubledash && return
2474 case "$cur" in
2475 --*)
2476 __gitcomp "--merge --mixed --hard --soft --patch --keep"
2477 return
2479 esac
2480 __gitcomp_nl "$(__git_refs)"
2483 _git_revert ()
2485 local dir="$(__gitdir)"
2486 if [ -f "$dir"/REVERT_HEAD ]; then
2487 __gitcomp "--continue --quit --abort"
2488 return
2490 case "$cur" in
2491 --*)
2492 __gitcomp "
2493 --edit --mainline --no-edit --no-commit --signoff
2494 --strategy= --strategy-option=
2496 return
2498 esac
2499 __gitcomp_nl "$(__git_refs)"
2502 _git_rm ()
2504 case "$cur" in
2505 --*)
2506 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2507 return
2509 esac
2511 __git_complete_index_file "--cached"
2514 _git_shortlog ()
2516 __git_has_doubledash && return
2518 case "$cur" in
2519 --*)
2520 __gitcomp "
2521 $__git_log_common_options
2522 $__git_log_shortlog_options
2523 --numbered --summary --email
2525 return
2527 esac
2528 __git_complete_revlist
2531 _git_show ()
2533 __git_has_doubledash && return
2535 case "$cur" in
2536 --pretty=*|--format=*)
2537 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2538 " "" "${cur#*=}"
2539 return
2541 --diff-algorithm=*)
2542 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2543 return
2545 --submodule=*)
2546 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
2547 return
2549 --*)
2550 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2551 --show-signature
2552 $__git_diff_common_options
2554 return
2556 esac
2557 __git_complete_revlist_file
2560 _git_show_branch ()
2562 case "$cur" in
2563 --*)
2564 __gitcomp "
2565 --all --remotes --topo-order --date-order --current --more=
2566 --list --independent --merge-base --no-name
2567 --color --no-color
2568 --sha1-name --sparse --topics --reflog
2570 return
2572 esac
2573 __git_complete_revlist
2576 _git_stash ()
2578 local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
2579 local subcommands='save list show apply clear drop pop create branch'
2580 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2581 if [ -z "$subcommand" ]; then
2582 case "$cur" in
2583 --*)
2584 __gitcomp "$save_opts"
2587 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2588 __gitcomp "$subcommands"
2591 esac
2592 else
2593 case "$subcommand,$cur" in
2594 save,--*)
2595 __gitcomp "$save_opts"
2597 apply,--*|pop,--*)
2598 __gitcomp "--index --quiet"
2600 drop,--*)
2601 __gitcomp "--quiet"
2603 show,--*|branch,--*)
2605 branch,*)
2606 if [ $cword -eq 3 ]; then
2607 __gitcomp_nl "$(__git_refs)";
2608 else
2609 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2610 | sed -n -e 's/:.*//p')"
2613 show,*|apply,*|drop,*|pop,*)
2614 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2615 | sed -n -e 's/:.*//p')"
2619 esac
2623 _git_submodule ()
2625 __git_has_doubledash && return
2627 local subcommands="add status init deinit update summary foreach sync"
2628 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2629 if [ -z "$subcommand" ]; then
2630 case "$cur" in
2631 --*)
2632 __gitcomp "--quiet"
2635 __gitcomp "$subcommands"
2637 esac
2638 return
2641 case "$subcommand,$cur" in
2642 add,--*)
2643 __gitcomp "--branch --force --name --reference --depth"
2645 status,--*)
2646 __gitcomp "--cached --recursive"
2648 deinit,--*)
2649 __gitcomp "--force --all"
2651 update,--*)
2652 __gitcomp "
2653 --init --remote --no-fetch
2654 --recommend-shallow --no-recommend-shallow
2655 --force --rebase --merge --reference --depth --recursive --jobs
2658 summary,--*)
2659 __gitcomp "--cached --files --summary-limit"
2661 foreach,--*|sync,--*)
2662 __gitcomp "--recursive"
2666 esac
2669 _git_svn ()
2671 local subcommands="
2672 init fetch clone rebase dcommit log find-rev
2673 set-tree commit-diff info create-ignore propget
2674 proplist show-ignore show-externals branch tag blame
2675 migrate mkdirs reset gc
2677 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2678 if [ -z "$subcommand" ]; then
2679 __gitcomp "$subcommands"
2680 else
2681 local remote_opts="--username= --config-dir= --no-auth-cache"
2682 local fc_opts="
2683 --follow-parent --authors-file= --repack=
2684 --no-metadata --use-svm-props --use-svnsync-props
2685 --log-window-size= --no-checkout --quiet
2686 --repack-flags --use-log-author --localtime
2687 --add-author-from
2688 --ignore-paths= --include-paths= $remote_opts
2690 local init_opts="
2691 --template= --shared= --trunk= --tags=
2692 --branches= --stdlayout --minimize-url
2693 --no-metadata --use-svm-props --use-svnsync-props
2694 --rewrite-root= --prefix= $remote_opts
2696 local cmt_opts="
2697 --edit --rmdir --find-copies-harder --copy-similarity=
2700 case "$subcommand,$cur" in
2701 fetch,--*)
2702 __gitcomp "--revision= --fetch-all $fc_opts"
2704 clone,--*)
2705 __gitcomp "--revision= $fc_opts $init_opts"
2707 init,--*)
2708 __gitcomp "$init_opts"
2710 dcommit,--*)
2711 __gitcomp "
2712 --merge --strategy= --verbose --dry-run
2713 --fetch-all --no-rebase --commit-url
2714 --revision --interactive $cmt_opts $fc_opts
2717 set-tree,--*)
2718 __gitcomp "--stdin $cmt_opts $fc_opts"
2720 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2721 show-externals,--*|mkdirs,--*)
2722 __gitcomp "--revision="
2724 log,--*)
2725 __gitcomp "
2726 --limit= --revision= --verbose --incremental
2727 --oneline --show-commit --non-recursive
2728 --authors-file= --color
2731 rebase,--*)
2732 __gitcomp "
2733 --merge --verbose --strategy= --local
2734 --fetch-all --dry-run $fc_opts
2737 commit-diff,--*)
2738 __gitcomp "--message= --file= --revision= $cmt_opts"
2740 info,--*)
2741 __gitcomp "--url"
2743 branch,--*)
2744 __gitcomp "--dry-run --message --tag"
2746 tag,--*)
2747 __gitcomp "--dry-run --message"
2749 blame,--*)
2750 __gitcomp "--git-format"
2752 migrate,--*)
2753 __gitcomp "
2754 --config-dir= --ignore-paths= --minimize
2755 --no-auth-cache --username=
2758 reset,--*)
2759 __gitcomp "--revision= --parent"
2763 esac
2767 _git_tag ()
2769 local i c=1 f=0
2770 while [ $c -lt $cword ]; do
2771 i="${words[c]}"
2772 case "$i" in
2773 -d|-v)
2774 __gitcomp_nl "$(__git_tags)"
2775 return
2780 esac
2781 ((c++))
2782 done
2784 case "$prev" in
2785 -m|-F)
2787 -*|tag)
2788 if [ $f = 1 ]; then
2789 __gitcomp_nl "$(__git_tags)"
2793 __gitcomp_nl "$(__git_refs)"
2795 esac
2797 case "$cur" in
2798 --*)
2799 __gitcomp "
2800 --list --delete --verify --annotate --message --file
2801 --sign --cleanup --local-user --force --column --sort=
2802 --contains --points-at --merged --no-merged --create-reflog
2805 esac
2808 _git_whatchanged ()
2810 _git_log
2813 _git_worktree ()
2815 local subcommands="add list lock prune unlock"
2816 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2817 if [ -z "$subcommand" ]; then
2818 __gitcomp "$subcommands"
2819 else
2820 case "$subcommand,$cur" in
2821 add,--*)
2822 __gitcomp "--detach"
2824 list,--*)
2825 __gitcomp "--porcelain"
2827 lock,--*)
2828 __gitcomp "--reason"
2830 prune,--*)
2831 __gitcomp "--dry-run --expire --verbose"
2835 esac
2839 __git_main ()
2841 local i c=1 command __git_dir
2843 while [ $c -lt $cword ]; do
2844 i="${words[c]}"
2845 case "$i" in
2846 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2847 --git-dir) ((c++)) ; __git_dir="${words[c]}" ;;
2848 --bare) __git_dir="." ;;
2849 --help) command="help"; break ;;
2850 -c|--work-tree|--namespace) ((c++)) ;;
2851 -*) ;;
2852 *) command="$i"; break ;;
2853 esac
2854 ((c++))
2855 done
2857 if [ -z "$command" ]; then
2858 case "$cur" in
2859 --*) __gitcomp "
2860 --paginate
2861 --no-pager
2862 --git-dir=
2863 --bare
2864 --version
2865 --exec-path
2866 --exec-path=
2867 --html-path
2868 --man-path
2869 --info-path
2870 --work-tree=
2871 --namespace=
2872 --no-replace-objects
2873 --help
2876 *) __git_compute_porcelain_commands
2877 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2878 esac
2879 return
2882 local completion_func="_git_${command//-/_}"
2883 declare -f $completion_func >/dev/null && $completion_func && return
2885 local expansion=$(__git_aliased_command "$command")
2886 if [ -n "$expansion" ]; then
2887 words[1]=$expansion
2888 completion_func="_git_${expansion//-/_}"
2889 declare -f $completion_func >/dev/null && $completion_func
2893 __gitk_main ()
2895 __git_has_doubledash && return
2897 local g="$(__gitdir)"
2898 local merge=""
2899 if [ -f "$g/MERGE_HEAD" ]; then
2900 merge="--merge"
2902 case "$cur" in
2903 --*)
2904 __gitcomp "
2905 $__git_log_common_options
2906 $__git_log_gitk_options
2907 $merge
2909 return
2911 esac
2912 __git_complete_revlist
2915 if [[ -n ${ZSH_VERSION-} ]]; then
2916 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2918 autoload -U +X compinit && compinit
2920 __gitcomp ()
2922 emulate -L zsh
2924 local cur_="${3-$cur}"
2926 case "$cur_" in
2927 --*=)
2930 local c IFS=$' \t\n'
2931 local -a array
2932 for c in ${=1}; do
2933 c="$c${4-}"
2934 case $c in
2935 --*=*|*.) ;;
2936 *) c="$c " ;;
2937 esac
2938 array[${#array[@]}+1]="$c"
2939 done
2940 compset -P '*[=:]'
2941 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2943 esac
2946 __gitcomp_nl ()
2948 emulate -L zsh
2950 local IFS=$'\n'
2951 compset -P '*[=:]'
2952 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2955 __gitcomp_file ()
2957 emulate -L zsh
2959 local IFS=$'\n'
2960 compset -P '*[=:]'
2961 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2964 _git ()
2966 local _ret=1 cur cword prev
2967 cur=${words[CURRENT]}
2968 prev=${words[CURRENT-1]}
2969 let cword=CURRENT-1
2970 emulate ksh -c __${service}_main
2971 let _ret && _default && _ret=0
2972 return _ret
2975 compdef _git git gitk
2976 return
2979 __git_func_wrap ()
2981 local cur words cword prev
2982 _get_comp_words_by_ref -n =: cur words cword prev
2986 # Setup completion for certain functions defined above by setting common
2987 # variables and workarounds.
2988 # This is NOT a public function; use at your own risk.
2989 __git_complete ()
2991 local wrapper="__git_wrap${2}"
2992 eval "$wrapper () { __git_func_wrap $2 ; }"
2993 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2994 || complete -o default -o nospace -F $wrapper $1
2997 # wrapper for backwards compatibility
2998 _git ()
3000 __git_wrap__git_main
3003 # wrapper for backwards compatibility
3004 _gitk ()
3006 __git_wrap__gitk_main
3009 __git_complete git __git_main
3010 __git_complete gitk __gitk_main
3012 # The following are necessary only for Cygwin, and only are needed
3013 # when the user has tab-completed the executable name and consequently
3014 # included the '.exe' suffix.
3016 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
3017 __git_complete git.exe __git_main