Merge branch 'cp/completion-clone-recurse-submodules'
[alt-git.git] / contrib / completion / git-completion.bash
blob6a187bc11bc9b8b141f70f81ae256c27921ff00d
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
342 if [ -d "$dir" ]; then
343 case "$cur" in
344 refs|refs/*)
345 format="refname"
346 refs="${cur%/*}"
347 track=""
350 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
351 if [ -e "$dir/$i" ]; then echo $i; fi
352 done
353 format="refname:short"
354 refs="refs/tags refs/heads refs/remotes"
356 esac
357 git --git-dir="$dir" for-each-ref --format="%($format)" \
358 $refs
359 if [ -n "$track" ]; then
360 # employ the heuristic used by git checkout
361 # Try to find a remote branch that matches the completion word
362 # but only output if the branch name is unique
363 local ref entry
364 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
365 "refs/remotes/" | \
366 while read -r entry; do
367 eval "$entry"
368 ref="${ref#*/}"
369 if [[ "$ref" == "$cur"* ]]; then
370 echo "$ref"
372 done | sort | uniq -u
374 return
376 case "$cur" in
377 refs|refs/*)
378 git ls-remote "$dir" "$cur*" 2>/dev/null | \
379 while read -r hash i; do
380 case "$i" in
381 *^{}) ;;
382 *) echo "$i" ;;
383 esac
384 done
387 echo "HEAD"
388 git for-each-ref --format="%(refname:short)" -- \
389 "refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##"
391 esac
394 # __git_refs2 requires 1 argument (to pass to __git_refs)
395 __git_refs2 ()
397 local i
398 for i in $(__git_refs "$1"); do
399 echo "$i:$i"
400 done
403 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
404 __git_refs_remotes ()
406 local i hash
407 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
408 while read -r hash i; do
409 echo "$i:refs/remotes/$1/${i#refs/heads/}"
410 done
413 __git_remotes ()
415 local d="$(__gitdir)"
416 test -d "$d/remotes" && ls -1 "$d/remotes"
417 git --git-dir="$d" remote
420 __git_list_merge_strategies ()
422 git merge -s help 2>&1 |
423 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
424 s/\.$//
425 s/.*://
426 s/^[ ]*//
427 s/[ ]*$//
432 __git_merge_strategies=
433 # 'git merge -s help' (and thus detection of the merge strategy
434 # list) fails, unfortunately, if run outside of any git working
435 # tree. __git_merge_strategies is set to the empty string in
436 # that case, and the detection will be repeated the next time it
437 # is needed.
438 __git_compute_merge_strategies ()
440 test -n "$__git_merge_strategies" ||
441 __git_merge_strategies=$(__git_list_merge_strategies)
444 __git_complete_revlist_file ()
446 local pfx ls ref cur_="$cur"
447 case "$cur_" in
448 *..?*:*)
449 return
451 ?*:*)
452 ref="${cur_%%:*}"
453 cur_="${cur_#*:}"
454 case "$cur_" in
455 ?*/*)
456 pfx="${cur_%/*}"
457 cur_="${cur_##*/}"
458 ls="$ref:$pfx"
459 pfx="$pfx/"
462 ls="$ref"
464 esac
466 case "$COMP_WORDBREAKS" in
467 *:*) : great ;;
468 *) pfx="$ref:$pfx" ;;
469 esac
471 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
472 | sed '/^100... blob /{
473 s,^.* ,,
474 s,$, ,
476 /^120000 blob /{
477 s,^.* ,,
478 s,$, ,
480 /^040000 tree /{
481 s,^.* ,,
482 s,$,/,
484 s/^.* //')" \
485 "$pfx" "$cur_" ""
487 *...*)
488 pfx="${cur_%...*}..."
489 cur_="${cur_#*...}"
490 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
492 *..*)
493 pfx="${cur_%..*}.."
494 cur_="${cur_#*..}"
495 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
498 __gitcomp_nl "$(__git_refs)"
500 esac
504 # __git_complete_index_file requires 1 argument:
505 # 1: the options to pass to ls-file
507 # The exception is --committable, which finds the files appropriate commit.
508 __git_complete_index_file ()
510 local pfx="" cur_="$cur"
512 case "$cur_" in
513 ?*/*)
514 pfx="${cur_%/*}"
515 cur_="${cur_##*/}"
516 pfx="${pfx}/"
518 esac
520 __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
523 __git_complete_file ()
525 __git_complete_revlist_file
528 __git_complete_revlist ()
530 __git_complete_revlist_file
533 __git_complete_remote_or_refspec ()
535 local cur_="$cur" cmd="${words[1]}"
536 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
537 if [ "$cmd" = "remote" ]; then
538 ((c++))
540 while [ $c -lt $cword ]; do
541 i="${words[c]}"
542 case "$i" in
543 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
544 --all)
545 case "$cmd" in
546 push) no_complete_refspec=1 ;;
547 fetch)
548 return
550 *) ;;
551 esac
553 -*) ;;
554 *) remote="$i"; break ;;
555 esac
556 ((c++))
557 done
558 if [ -z "$remote" ]; then
559 __gitcomp_nl "$(__git_remotes)"
560 return
562 if [ $no_complete_refspec = 1 ]; then
563 return
565 [ "$remote" = "." ] && remote=
566 case "$cur_" in
567 *:*)
568 case "$COMP_WORDBREAKS" in
569 *:*) : great ;;
570 *) pfx="${cur_%%:*}:" ;;
571 esac
572 cur_="${cur_#*:}"
573 lhs=0
576 pfx="+"
577 cur_="${cur_#+}"
579 esac
580 case "$cmd" in
581 fetch)
582 if [ $lhs = 1 ]; then
583 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
584 else
585 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
588 pull|remote)
589 if [ $lhs = 1 ]; then
590 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
591 else
592 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
595 push)
596 if [ $lhs = 1 ]; then
597 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
598 else
599 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
602 esac
605 __git_complete_strategy ()
607 __git_compute_merge_strategies
608 case "$prev" in
609 -s|--strategy)
610 __gitcomp "$__git_merge_strategies"
611 return 0
612 esac
613 case "$cur" in
614 --strategy=*)
615 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
616 return 0
618 esac
619 return 1
622 __git_commands () {
623 if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
624 then
625 printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
626 else
627 git help -a|egrep '^ [a-zA-Z0-9]'
631 __git_list_all_commands ()
633 local i IFS=" "$'\n'
634 for i in $(__git_commands)
636 case $i in
637 *--*) : helper pattern;;
638 *) echo $i;;
639 esac
640 done
643 __git_all_commands=
644 __git_compute_all_commands ()
646 test -n "$__git_all_commands" ||
647 __git_all_commands=$(__git_list_all_commands)
650 __git_list_porcelain_commands ()
652 local i IFS=" "$'\n'
653 __git_compute_all_commands
654 for i in $__git_all_commands
656 case $i in
657 *--*) : helper pattern;;
658 applymbox) : ask gittus;;
659 applypatch) : ask gittus;;
660 archimport) : import;;
661 cat-file) : plumbing;;
662 check-attr) : plumbing;;
663 check-ignore) : plumbing;;
664 check-mailmap) : plumbing;;
665 check-ref-format) : plumbing;;
666 checkout-index) : plumbing;;
667 column) : internal helper;;
668 commit-tree) : plumbing;;
669 count-objects) : infrequent;;
670 credential) : credentials;;
671 credential-*) : credentials helper;;
672 cvsexportcommit) : export;;
673 cvsimport) : import;;
674 cvsserver) : daemon;;
675 daemon) : daemon;;
676 diff-files) : plumbing;;
677 diff-index) : plumbing;;
678 diff-tree) : plumbing;;
679 fast-import) : import;;
680 fast-export) : export;;
681 fsck-objects) : plumbing;;
682 fetch-pack) : plumbing;;
683 fmt-merge-msg) : plumbing;;
684 for-each-ref) : plumbing;;
685 hash-object) : plumbing;;
686 http-*) : transport;;
687 index-pack) : plumbing;;
688 init-db) : deprecated;;
689 local-fetch) : plumbing;;
690 ls-files) : plumbing;;
691 ls-remote) : plumbing;;
692 ls-tree) : plumbing;;
693 mailinfo) : plumbing;;
694 mailsplit) : plumbing;;
695 merge-*) : plumbing;;
696 mktree) : plumbing;;
697 mktag) : plumbing;;
698 pack-objects) : plumbing;;
699 pack-redundant) : plumbing;;
700 pack-refs) : plumbing;;
701 parse-remote) : plumbing;;
702 patch-id) : plumbing;;
703 prune) : plumbing;;
704 prune-packed) : plumbing;;
705 quiltimport) : import;;
706 read-tree) : plumbing;;
707 receive-pack) : plumbing;;
708 remote-*) : transport;;
709 rerere) : plumbing;;
710 rev-list) : plumbing;;
711 rev-parse) : plumbing;;
712 runstatus) : plumbing;;
713 sh-setup) : internal;;
714 shell) : daemon;;
715 show-ref) : plumbing;;
716 send-pack) : plumbing;;
717 show-index) : plumbing;;
718 ssh-*) : transport;;
719 stripspace) : plumbing;;
720 symbolic-ref) : plumbing;;
721 unpack-file) : plumbing;;
722 unpack-objects) : plumbing;;
723 update-index) : plumbing;;
724 update-ref) : plumbing;;
725 update-server-info) : daemon;;
726 upload-archive) : plumbing;;
727 upload-pack) : plumbing;;
728 write-tree) : plumbing;;
729 var) : infrequent;;
730 verify-pack) : infrequent;;
731 verify-tag) : plumbing;;
732 *) echo $i;;
733 esac
734 done
737 __git_porcelain_commands=
738 __git_compute_porcelain_commands ()
740 test -n "$__git_porcelain_commands" ||
741 __git_porcelain_commands=$(__git_list_porcelain_commands)
744 # Lists all set config variables starting with the given section prefix,
745 # with the prefix removed.
746 __git_get_config_variables ()
748 local section="$1" i IFS=$'\n'
749 for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do
750 echo "${i#$section.}"
751 done
754 __git_pretty_aliases ()
756 __git_get_config_variables "pretty"
759 __git_aliases ()
761 __git_get_config_variables "alias"
764 # __git_aliased_command requires 1 argument
765 __git_aliased_command ()
767 local word cmdline=$(git --git-dir="$(__gitdir)" \
768 config --get "alias.$1")
769 for word in $cmdline; do
770 case "$word" in
771 \!gitk|gitk)
772 echo "gitk"
773 return
775 \!*) : shell command alias ;;
776 -*) : option ;;
777 *=*) : setting env ;;
778 git) : git itself ;;
779 \(\)) : skip parens of shell function definition ;;
780 {) : skip start of shell helper function ;;
781 :) : skip null command ;;
782 \'*) : skip opening quote after sh -c ;;
784 echo "$word"
785 return
786 esac
787 done
790 # __git_find_on_cmdline requires 1 argument
791 __git_find_on_cmdline ()
793 local word subcommand c=1
794 while [ $c -lt $cword ]; do
795 word="${words[c]}"
796 for subcommand in $1; do
797 if [ "$subcommand" = "$word" ]; then
798 echo "$subcommand"
799 return
801 done
802 ((c++))
803 done
806 # Echo the value of an option set on the command line or config
808 # $1: short option name
809 # $2: long option name including =
810 # $3: list of possible values
811 # $4: config string (optional)
813 # example:
814 # result="$(__git_get_option_value "-d" "--do-something=" \
815 # "yes no" "core.doSomething")"
817 # result is then either empty (no option set) or "yes" or "no"
819 # __git_get_option_value requires 3 arguments
820 __git_get_option_value ()
822 local c short_opt long_opt val
823 local result= values config_key word
825 short_opt="$1"
826 long_opt="$2"
827 values="$3"
828 config_key="$4"
830 ((c = $cword - 1))
831 while [ $c -ge 0 ]; do
832 word="${words[c]}"
833 for val in $values; do
834 if [ "$short_opt$val" = "$word" ] ||
835 [ "$long_opt$val" = "$word" ]; then
836 result="$val"
837 break 2
839 done
840 ((c--))
841 done
843 if [ -n "$config_key" ] && [ -z "$result" ]; then
844 result="$(git --git-dir="$(__gitdir)" config "$config_key")"
847 echo "$result"
850 __git_has_doubledash ()
852 local c=1
853 while [ $c -lt $cword ]; do
854 if [ "--" = "${words[c]}" ]; then
855 return 0
857 ((c++))
858 done
859 return 1
862 # Try to count non option arguments passed on the command line for the
863 # specified git command.
864 # When options are used, it is necessary to use the special -- option to
865 # tell the implementation were non option arguments begin.
866 # XXX this can not be improved, since options can appear everywhere, as
867 # an example:
868 # git mv x -n y
870 # __git_count_arguments requires 1 argument: the git command executed.
871 __git_count_arguments ()
873 local word i c=0
875 # Skip "git" (first argument)
876 for ((i=1; i < ${#words[@]}; i++)); do
877 word="${words[i]}"
879 case "$word" in
881 # Good; we can assume that the following are only non
882 # option arguments.
883 ((c = 0))
885 "$1")
886 # Skip the specified git command and discard git
887 # main options
888 ((c = 0))
891 ((c++))
893 esac
894 done
896 printf "%d" $c
899 __git_whitespacelist="nowarn warn error error-all fix"
901 _git_am ()
903 local dir="$(__gitdir)"
904 if [ -d "$dir"/rebase-apply ]; then
905 __gitcomp "--skip --continue --resolved --abort"
906 return
908 case "$cur" in
909 --whitespace=*)
910 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
911 return
913 --*)
914 __gitcomp "
915 --3way --committer-date-is-author-date --ignore-date
916 --ignore-whitespace --ignore-space-change
917 --interactive --keep --no-utf8 --signoff --utf8
918 --whitespace= --scissors
920 return
921 esac
924 _git_apply ()
926 case "$cur" in
927 --whitespace=*)
928 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
929 return
931 --*)
932 __gitcomp "
933 --stat --numstat --summary --check --index
934 --cached --index-info --reverse --reject --unidiff-zero
935 --apply --no-add --exclude=
936 --ignore-whitespace --ignore-space-change
937 --whitespace= --inaccurate-eof --verbose
939 return
940 esac
943 _git_add ()
945 case "$cur" in
946 --*)
947 __gitcomp "
948 --interactive --refresh --patch --update --dry-run
949 --ignore-errors --intent-to-add
951 return
952 esac
954 # XXX should we check for --update and --all options ?
955 __git_complete_index_file "--others --modified --directory --no-empty-directory"
958 _git_archive ()
960 case "$cur" in
961 --format=*)
962 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
963 return
965 --remote=*)
966 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
967 return
969 --*)
970 __gitcomp "
971 --format= --list --verbose
972 --prefix= --remote= --exec=
974 return
976 esac
977 __git_complete_file
980 _git_bisect ()
982 __git_has_doubledash && return
984 local subcommands="start bad good skip reset visualize replay log run"
985 local subcommand="$(__git_find_on_cmdline "$subcommands")"
986 if [ -z "$subcommand" ]; then
987 if [ -f "$(__gitdir)"/BISECT_START ]; then
988 __gitcomp "$subcommands"
989 else
990 __gitcomp "replay start"
992 return
995 case "$subcommand" in
996 bad|good|reset|skip|start)
997 __gitcomp_nl "$(__git_refs)"
1001 esac
1004 _git_branch ()
1006 local i c=1 only_local_ref="n" has_r="n"
1008 while [ $c -lt $cword ]; do
1009 i="${words[c]}"
1010 case "$i" in
1011 -d|-m) only_local_ref="y" ;;
1012 -r) has_r="y" ;;
1013 esac
1014 ((c++))
1015 done
1017 case "$cur" in
1018 --set-upstream-to=*)
1019 __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}"
1021 --*)
1022 __gitcomp "
1023 --color --no-color --verbose --abbrev= --no-abbrev
1024 --track --no-track --contains --merged --no-merged
1025 --set-upstream-to= --edit-description --list
1026 --unset-upstream
1030 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1031 __gitcomp_nl "$(__git_heads)"
1032 else
1033 __gitcomp_nl "$(__git_refs)"
1036 esac
1039 _git_bundle ()
1041 local cmd="${words[2]}"
1042 case "$cword" in
1044 __gitcomp "create list-heads verify unbundle"
1047 # looking for a file
1050 case "$cmd" in
1051 create)
1052 __git_complete_revlist
1054 esac
1056 esac
1059 _git_checkout ()
1061 __git_has_doubledash && return
1063 case "$cur" in
1064 --conflict=*)
1065 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1067 --*)
1068 __gitcomp "
1069 --quiet --ours --theirs --track --no-track --merge
1070 --conflict= --orphan --patch
1074 # check if --track, --no-track, or --no-guess was specified
1075 # if so, disable DWIM mode
1076 local flags="--track --no-track --no-guess" track=1
1077 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1078 track=''
1080 __gitcomp_nl "$(__git_refs '' $track)"
1082 esac
1085 _git_cherry ()
1087 __gitcomp_nl "$(__git_refs)"
1090 _git_cherry_pick ()
1092 local dir="$(__gitdir)"
1093 if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1094 __gitcomp "--continue --quit --abort"
1095 return
1097 case "$cur" in
1098 --*)
1099 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1102 __gitcomp_nl "$(__git_refs)"
1104 esac
1107 _git_clean ()
1109 case "$cur" in
1110 --*)
1111 __gitcomp "--dry-run --quiet"
1112 return
1114 esac
1116 # XXX should we check for -x option ?
1117 __git_complete_index_file "--others --directory"
1120 _git_clone ()
1122 case "$cur" in
1123 --*)
1124 __gitcomp "
1125 --local
1126 --no-hardlinks
1127 --shared
1128 --reference
1129 --quiet
1130 --no-checkout
1131 --bare
1132 --mirror
1133 --origin
1134 --upload-pack
1135 --template=
1136 --depth
1137 --single-branch
1138 --branch
1139 --recurse-submodules
1141 return
1143 esac
1146 __git_untracked_file_modes="all no normal"
1148 _git_commit ()
1150 case "$prev" in
1151 -c|-C)
1152 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1153 return
1155 esac
1157 case "$cur" in
1158 --cleanup=*)
1159 __gitcomp "default scissors strip verbatim whitespace
1160 " "" "${cur##--cleanup=}"
1161 return
1163 --reuse-message=*|--reedit-message=*|\
1164 --fixup=*|--squash=*)
1165 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1166 return
1168 --untracked-files=*)
1169 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1170 return
1172 --*)
1173 __gitcomp "
1174 --all --author= --signoff --verify --no-verify
1175 --edit --no-edit
1176 --amend --include --only --interactive
1177 --dry-run --reuse-message= --reedit-message=
1178 --reset-author --file= --message= --template=
1179 --cleanup= --untracked-files --untracked-files=
1180 --verbose --quiet --fixup= --squash=
1182 return
1183 esac
1185 if git rev-parse --verify --quiet HEAD >/dev/null; then
1186 __git_complete_index_file "--committable"
1187 else
1188 # This is the first commit
1189 __git_complete_index_file "--cached"
1193 _git_describe ()
1195 case "$cur" in
1196 --*)
1197 __gitcomp "
1198 --all --tags --contains --abbrev= --candidates=
1199 --exact-match --debug --long --match --always
1201 return
1202 esac
1203 __gitcomp_nl "$(__git_refs)"
1206 __git_diff_algorithms="myers minimal patience histogram"
1208 __git_diff_common_options="--stat --numstat --shortstat --summary
1209 --patch-with-stat --name-only --name-status --color
1210 --no-color --color-words --no-renames --check
1211 --full-index --binary --abbrev --diff-filter=
1212 --find-copies-harder
1213 --text --ignore-space-at-eol --ignore-space-change
1214 --ignore-all-space --ignore-blank-lines --exit-code
1215 --quiet --ext-diff --no-ext-diff
1216 --no-prefix --src-prefix= --dst-prefix=
1217 --inter-hunk-context=
1218 --patience --histogram --minimal
1219 --raw --word-diff --word-diff-regex=
1220 --dirstat --dirstat= --dirstat-by-file
1221 --dirstat-by-file= --cumulative
1222 --diff-algorithm=
1225 _git_diff ()
1227 __git_has_doubledash && return
1229 case "$cur" in
1230 --diff-algorithm=*)
1231 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1232 return
1234 --*)
1235 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1236 --base --ours --theirs --no-index
1237 $__git_diff_common_options
1239 return
1241 esac
1242 __git_complete_revlist_file
1245 __git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1246 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
1249 _git_difftool ()
1251 __git_has_doubledash && return
1253 case "$cur" in
1254 --tool=*)
1255 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1256 return
1258 --*)
1259 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1260 --base --ours --theirs
1261 --no-renames --diff-filter= --find-copies-harder
1262 --relative --ignore-submodules
1263 --tool="
1264 return
1266 esac
1267 __git_complete_revlist_file
1270 __git_fetch_recurse_submodules="yes on-demand no"
1272 __git_fetch_options="
1273 --quiet --verbose --append --upload-pack --force --keep --depth=
1274 --tags --no-tags --all --prune --dry-run --recurse-submodules=
1277 _git_fetch ()
1279 case "$cur" in
1280 --recurse-submodules=*)
1281 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1282 return
1284 --*)
1285 __gitcomp "$__git_fetch_options"
1286 return
1288 esac
1289 __git_complete_remote_or_refspec
1292 __git_format_patch_options="
1293 --stdout --attach --no-attach --thread --thread= --no-thread
1294 --numbered --start-number --numbered-files --keep-subject --signoff
1295 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1296 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1297 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1298 --output-directory --reroll-count --to= --quiet --notes
1301 _git_format_patch ()
1303 case "$cur" in
1304 --thread=*)
1305 __gitcomp "
1306 deep shallow
1307 " "" "${cur##--thread=}"
1308 return
1310 --*)
1311 __gitcomp "$__git_format_patch_options"
1312 return
1314 esac
1315 __git_complete_revlist
1318 _git_fsck ()
1320 case "$cur" in
1321 --*)
1322 __gitcomp "
1323 --tags --root --unreachable --cache --no-reflogs --full
1324 --strict --verbose --lost-found
1326 return
1328 esac
1331 _git_gc ()
1333 case "$cur" in
1334 --*)
1335 __gitcomp "--prune --aggressive"
1336 return
1338 esac
1341 _git_gitk ()
1343 _gitk
1346 __git_match_ctag() {
1347 awk "/^${1//\//\\/}/ { print \$1 }" "$2"
1350 _git_grep ()
1352 __git_has_doubledash && return
1354 case "$cur" in
1355 --*)
1356 __gitcomp "
1357 --cached
1358 --text --ignore-case --word-regexp --invert-match
1359 --full-name --line-number
1360 --extended-regexp --basic-regexp --fixed-strings
1361 --perl-regexp
1362 --threads
1363 --files-with-matches --name-only
1364 --files-without-match
1365 --max-depth
1366 --count
1367 --and --or --not --all-match
1369 return
1371 esac
1373 case "$cword,$prev" in
1374 2,*|*,-*)
1375 if test -r tags; then
1376 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1377 return
1380 esac
1382 __gitcomp_nl "$(__git_refs)"
1385 _git_help ()
1387 case "$cur" in
1388 --*)
1389 __gitcomp "--all --guides --info --man --web"
1390 return
1392 esac
1393 __git_compute_all_commands
1394 __gitcomp "$__git_all_commands $(__git_aliases)
1395 attributes cli core-tutorial cvs-migration
1396 diffcore everyday gitk glossary hooks ignore modules
1397 namespaces repository-layout revisions tutorial tutorial-2
1398 workflows
1402 _git_init ()
1404 case "$cur" in
1405 --shared=*)
1406 __gitcomp "
1407 false true umask group all world everybody
1408 " "" "${cur##--shared=}"
1409 return
1411 --*)
1412 __gitcomp "--quiet --bare --template= --shared --shared="
1413 return
1415 esac
1418 _git_ls_files ()
1420 case "$cur" in
1421 --*)
1422 __gitcomp "--cached --deleted --modified --others --ignored
1423 --stage --directory --no-empty-directory --unmerged
1424 --killed --exclude= --exclude-from=
1425 --exclude-per-directory= --exclude-standard
1426 --error-unmatch --with-tree= --full-name
1427 --abbrev --ignored --exclude-per-directory
1429 return
1431 esac
1433 # XXX ignore options like --modified and always suggest all cached
1434 # files.
1435 __git_complete_index_file "--cached"
1438 _git_ls_remote ()
1440 __gitcomp_nl "$(__git_remotes)"
1443 _git_ls_tree ()
1445 __git_complete_file
1448 # Options that go well for log, shortlog and gitk
1449 __git_log_common_options="
1450 --not --all
1451 --branches --tags --remotes
1452 --first-parent --merges --no-merges
1453 --max-count=
1454 --max-age= --since= --after=
1455 --min-age= --until= --before=
1456 --min-parents= --max-parents=
1457 --no-min-parents --no-max-parents
1459 # Options that go well for log and gitk (not shortlog)
1460 __git_log_gitk_options="
1461 --dense --sparse --full-history
1462 --simplify-merges --simplify-by-decoration
1463 --left-right --notes --no-notes
1465 # Options that go well for log and shortlog (not gitk)
1466 __git_log_shortlog_options="
1467 --author= --committer= --grep=
1468 --all-match --invert-grep
1471 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1472 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1474 _git_log ()
1476 __git_has_doubledash && return
1478 local g="$(git rev-parse --git-dir 2>/dev/null)"
1479 local merge=""
1480 if [ -f "$g/MERGE_HEAD" ]; then
1481 merge="--merge"
1483 case "$cur" in
1484 --pretty=*|--format=*)
1485 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1486 " "" "${cur#*=}"
1487 return
1489 --date=*)
1490 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1491 return
1493 --decorate=*)
1494 __gitcomp "full short no" "" "${cur##--decorate=}"
1495 return
1497 --*)
1498 __gitcomp "
1499 $__git_log_common_options
1500 $__git_log_shortlog_options
1501 $__git_log_gitk_options
1502 --root --topo-order --date-order --reverse
1503 --follow --full-diff
1504 --abbrev-commit --abbrev=
1505 --relative-date --date=
1506 --pretty= --format= --oneline
1507 --show-signature
1508 --cherry-mark
1509 --cherry-pick
1510 --graph
1511 --decorate --decorate=
1512 --walk-reflogs
1513 --parents --children
1514 $merge
1515 $__git_diff_common_options
1516 --pickaxe-all --pickaxe-regex
1518 return
1520 esac
1521 __git_complete_revlist
1524 # Common merge options shared by git-merge(1) and git-pull(1).
1525 __git_merge_options="
1526 --no-commit --no-stat --log --no-log --squash --strategy
1527 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1528 --verify-signatures --no-verify-signatures --gpg-sign
1529 --quiet --verbose --progress --no-progress
1532 _git_merge ()
1534 __git_complete_strategy && return
1536 case "$cur" in
1537 --*)
1538 __gitcomp "$__git_merge_options
1539 --rerere-autoupdate --no-rerere-autoupdate --abort"
1540 return
1541 esac
1542 __gitcomp_nl "$(__git_refs)"
1545 _git_mergetool ()
1547 case "$cur" in
1548 --tool=*)
1549 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1550 return
1552 --*)
1553 __gitcomp "--tool="
1554 return
1556 esac
1559 _git_merge_base ()
1561 case "$cur" in
1562 --*)
1563 __gitcomp "--octopus --independent --is-ancestor --fork-point"
1564 return
1566 esac
1567 __gitcomp_nl "$(__git_refs)"
1570 _git_mv ()
1572 case "$cur" in
1573 --*)
1574 __gitcomp "--dry-run"
1575 return
1577 esac
1579 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1580 # We need to show both cached and untracked files (including
1581 # empty directories) since this may not be the last argument.
1582 __git_complete_index_file "--cached --others --directory"
1583 else
1584 __git_complete_index_file "--cached"
1588 _git_name_rev ()
1590 __gitcomp "--tags --all --stdin"
1593 _git_notes ()
1595 local subcommands='add append copy edit list prune remove show'
1596 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1598 case "$subcommand,$cur" in
1599 ,--*)
1600 __gitcomp '--ref'
1603 case "$prev" in
1604 --ref)
1605 __gitcomp_nl "$(__git_refs)"
1608 __gitcomp "$subcommands --ref"
1610 esac
1612 add,--reuse-message=*|append,--reuse-message=*|\
1613 add,--reedit-message=*|append,--reedit-message=*)
1614 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1616 add,--*|append,--*)
1617 __gitcomp '--file= --message= --reedit-message=
1618 --reuse-message='
1620 copy,--*)
1621 __gitcomp '--stdin'
1623 prune,--*)
1624 __gitcomp '--dry-run --verbose'
1626 prune,*)
1629 case "$prev" in
1630 -m|-F)
1633 __gitcomp_nl "$(__git_refs)"
1635 esac
1637 esac
1640 _git_pull ()
1642 __git_complete_strategy && return
1644 case "$cur" in
1645 --recurse-submodules=*)
1646 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1647 return
1649 --*)
1650 __gitcomp "
1651 --rebase --no-rebase
1652 $__git_merge_options
1653 $__git_fetch_options
1655 return
1657 esac
1658 __git_complete_remote_or_refspec
1661 __git_push_recurse_submodules="check on-demand"
1663 __git_complete_force_with_lease ()
1665 local cur_=$1
1667 case "$cur_" in
1668 --*=)
1670 *:*)
1671 __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
1674 __gitcomp_nl "$(__git_refs)" "" "$cur_"
1676 esac
1679 _git_push ()
1681 case "$prev" in
1682 --repo)
1683 __gitcomp_nl "$(__git_remotes)"
1684 return
1686 --recurse-submodules)
1687 __gitcomp "$__git_push_recurse_submodules"
1688 return
1690 esac
1691 case "$cur" in
1692 --repo=*)
1693 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1694 return
1696 --recurse-submodules=*)
1697 __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1698 return
1700 --force-with-lease=*)
1701 __git_complete_force_with_lease "${cur##--force-with-lease=}"
1702 return
1704 --*)
1705 __gitcomp "
1706 --all --mirror --tags --dry-run --force --verbose
1707 --quiet --prune --delete --follow-tags
1708 --receive-pack= --repo= --set-upstream
1709 --force-with-lease --force-with-lease= --recurse-submodules=
1711 return
1713 esac
1714 __git_complete_remote_or_refspec
1717 _git_rebase ()
1719 local dir="$(__gitdir)"
1720 if [ -f "$dir"/rebase-merge/interactive ]; then
1721 __gitcomp "--continue --skip --abort --edit-todo"
1722 return
1723 elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1724 __gitcomp "--continue --skip --abort"
1725 return
1727 __git_complete_strategy && return
1728 case "$cur" in
1729 --whitespace=*)
1730 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1731 return
1733 --*)
1734 __gitcomp "
1735 --onto --merge --strategy --interactive
1736 --preserve-merges --stat --no-stat
1737 --committer-date-is-author-date --ignore-date
1738 --ignore-whitespace --whitespace=
1739 --autosquash --no-autosquash
1740 --fork-point --no-fork-point
1741 --autostash --no-autostash
1742 --verify --no-verify
1743 --keep-empty --root --force-rebase --no-ff
1744 --exec
1747 return
1748 esac
1749 __gitcomp_nl "$(__git_refs)"
1752 _git_reflog ()
1754 local subcommands="show delete expire"
1755 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1757 if [ -z "$subcommand" ]; then
1758 __gitcomp "$subcommands"
1759 else
1760 __gitcomp_nl "$(__git_refs)"
1764 __git_send_email_confirm_options="always never auto cc compose"
1765 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1767 _git_send_email ()
1769 case "$prev" in
1770 --to|--cc|--bcc|--from)
1771 __gitcomp "
1772 $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1774 return
1776 esac
1778 case "$cur" in
1779 --confirm=*)
1780 __gitcomp "
1781 $__git_send_email_confirm_options
1782 " "" "${cur##--confirm=}"
1783 return
1785 --suppress-cc=*)
1786 __gitcomp "
1787 $__git_send_email_suppresscc_options
1788 " "" "${cur##--suppress-cc=}"
1790 return
1792 --smtp-encryption=*)
1793 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1794 return
1796 --thread=*)
1797 __gitcomp "
1798 deep shallow
1799 " "" "${cur##--thread=}"
1800 return
1802 --to=*|--cc=*|--bcc=*|--from=*)
1803 __gitcomp "
1804 $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1805 " "" "${cur#--*=}"
1806 return
1808 --*)
1809 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1810 --compose --confirm= --dry-run --envelope-sender
1811 --from --identity
1812 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1813 --no-suppress-from --no-thread --quiet
1814 --signed-off-by-cc --smtp-pass --smtp-server
1815 --smtp-server-port --smtp-encryption= --smtp-user
1816 --subject --suppress-cc= --suppress-from --thread --to
1817 --validate --no-validate
1818 $__git_format_patch_options"
1819 return
1821 esac
1822 __git_complete_revlist
1825 _git_stage ()
1827 _git_add
1830 _git_status ()
1832 local complete_opt
1833 local untracked_state
1835 case "$cur" in
1836 --ignore-submodules=*)
1837 __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
1838 return
1840 --untracked-files=*)
1841 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1842 return
1844 --column=*)
1845 __gitcomp "
1846 always never auto column row plain dense nodense
1847 " "" "${cur##--column=}"
1848 return
1850 --*)
1851 __gitcomp "
1852 --short --branch --porcelain --long --verbose
1853 --untracked-files= --ignore-submodules= --ignored
1854 --column= --no-column
1856 return
1858 esac
1860 untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
1861 "$__git_untracked_file_modes" "status.showUntrackedFiles")"
1863 case "$untracked_state" in
1865 # --ignored option does not matter
1866 complete_opt=
1868 all|normal|*)
1869 complete_opt="--cached --directory --no-empty-directory --others"
1871 if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
1872 complete_opt="$complete_opt --ignored --exclude=*"
1875 esac
1877 __git_complete_index_file "$complete_opt"
1880 __git_config_get_set_variables ()
1882 local prevword word config_file= c=$cword
1883 while [ $c -gt 1 ]; do
1884 word="${words[c]}"
1885 case "$word" in
1886 --system|--global|--local|--file=*)
1887 config_file="$word"
1888 break
1890 -f|--file)
1891 config_file="$word $prevword"
1892 break
1894 esac
1895 prevword=$word
1896 c=$((--c))
1897 done
1899 git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
1902 _git_config ()
1904 case "$prev" in
1905 branch.*.remote|branch.*.pushremote)
1906 __gitcomp_nl "$(__git_remotes)"
1907 return
1909 branch.*.merge)
1910 __gitcomp_nl "$(__git_refs)"
1911 return
1913 branch.*.rebase)
1914 __gitcomp "false true preserve interactive"
1915 return
1917 remote.pushdefault)
1918 __gitcomp_nl "$(__git_remotes)"
1919 return
1921 remote.*.fetch)
1922 local remote="${prev#remote.}"
1923 remote="${remote%.fetch}"
1924 if [ -z "$cur" ]; then
1925 __gitcomp_nl "refs/heads/" "" "" ""
1926 return
1928 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1929 return
1931 remote.*.push)
1932 local remote="${prev#remote.}"
1933 remote="${remote%.push}"
1934 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1935 for-each-ref --format='%(refname):%(refname)' \
1936 refs/heads)"
1937 return
1939 pull.twohead|pull.octopus)
1940 __git_compute_merge_strategies
1941 __gitcomp "$__git_merge_strategies"
1942 return
1944 color.branch|color.diff|color.interactive|\
1945 color.showbranch|color.status|color.ui)
1946 __gitcomp "always never auto"
1947 return
1949 color.pager)
1950 __gitcomp "false true"
1951 return
1953 color.*.*)
1954 __gitcomp "
1955 normal black red green yellow blue magenta cyan white
1956 bold dim ul blink reverse
1958 return
1960 diff.submodule)
1961 __gitcomp "log short"
1962 return
1964 help.format)
1965 __gitcomp "man info web html"
1966 return
1968 log.date)
1969 __gitcomp "$__git_log_date_formats"
1970 return
1972 sendemail.aliasesfiletype)
1973 __gitcomp "mutt mailrc pine elm gnus"
1974 return
1976 sendemail.confirm)
1977 __gitcomp "$__git_send_email_confirm_options"
1978 return
1980 sendemail.suppresscc)
1981 __gitcomp "$__git_send_email_suppresscc_options"
1982 return
1984 sendemail.transferencoding)
1985 __gitcomp "7bit 8bit quoted-printable base64"
1986 return
1988 --get|--get-all|--unset|--unset-all)
1989 __gitcomp_nl "$(__git_config_get_set_variables)"
1990 return
1992 *.*)
1993 return
1995 esac
1996 case "$cur" in
1997 --*)
1998 __gitcomp "
1999 --system --global --local --file=
2000 --list --replace-all
2001 --get --get-all --get-regexp
2002 --add --unset --unset-all
2003 --remove-section --rename-section
2004 --name-only
2006 return
2008 branch.*.*)
2009 local pfx="${cur%.*}." cur_="${cur##*.}"
2010 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
2011 return
2013 branch.*)
2014 local pfx="${cur%.*}." cur_="${cur#*.}"
2015 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
2016 __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
2017 return
2019 guitool.*.*)
2020 local pfx="${cur%.*}." cur_="${cur##*.}"
2021 __gitcomp "
2022 argprompt cmd confirm needsfile noconsole norescan
2023 prompt revprompt revunmerged title
2024 " "$pfx" "$cur_"
2025 return
2027 difftool.*.*)
2028 local pfx="${cur%.*}." cur_="${cur##*.}"
2029 __gitcomp "cmd path" "$pfx" "$cur_"
2030 return
2032 man.*.*)
2033 local pfx="${cur%.*}." cur_="${cur##*.}"
2034 __gitcomp "cmd path" "$pfx" "$cur_"
2035 return
2037 mergetool.*.*)
2038 local pfx="${cur%.*}." cur_="${cur##*.}"
2039 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
2040 return
2042 pager.*)
2043 local pfx="${cur%.*}." cur_="${cur#*.}"
2044 __git_compute_all_commands
2045 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
2046 return
2048 remote.*.*)
2049 local pfx="${cur%.*}." cur_="${cur##*.}"
2050 __gitcomp "
2051 url proxy fetch push mirror skipDefaultUpdate
2052 receivepack uploadpack tagopt pushurl
2053 " "$pfx" "$cur_"
2054 return
2056 remote.*)
2057 local pfx="${cur%.*}." cur_="${cur#*.}"
2058 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
2059 __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
2060 return
2062 url.*.*)
2063 local pfx="${cur%.*}." cur_="${cur##*.}"
2064 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2065 return
2067 esac
2068 __gitcomp "
2069 add.ignoreErrors
2070 advice.commitBeforeMerge
2071 advice.detachedHead
2072 advice.implicitIdentity
2073 advice.pushNonFastForward
2074 advice.resolveConflict
2075 advice.statusHints
2076 alias.
2077 am.keepcr
2078 apply.ignorewhitespace
2079 apply.whitespace
2080 branch.autosetupmerge
2081 branch.autosetuprebase
2082 browser.
2083 clean.requireForce
2084 color.branch
2085 color.branch.current
2086 color.branch.local
2087 color.branch.plain
2088 color.branch.remote
2089 color.decorate.HEAD
2090 color.decorate.branch
2091 color.decorate.remoteBranch
2092 color.decorate.stash
2093 color.decorate.tag
2094 color.diff
2095 color.diff.commit
2096 color.diff.frag
2097 color.diff.func
2098 color.diff.meta
2099 color.diff.new
2100 color.diff.old
2101 color.diff.plain
2102 color.diff.whitespace
2103 color.grep
2104 color.grep.context
2105 color.grep.filename
2106 color.grep.function
2107 color.grep.linenumber
2108 color.grep.match
2109 color.grep.selected
2110 color.grep.separator
2111 color.interactive
2112 color.interactive.error
2113 color.interactive.header
2114 color.interactive.help
2115 color.interactive.prompt
2116 color.pager
2117 color.showbranch
2118 color.status
2119 color.status.added
2120 color.status.changed
2121 color.status.header
2122 color.status.nobranch
2123 color.status.unmerged
2124 color.status.untracked
2125 color.status.updated
2126 color.ui
2127 commit.status
2128 commit.template
2129 core.abbrev
2130 core.askpass
2131 core.attributesfile
2132 core.autocrlf
2133 core.bare
2134 core.bigFileThreshold
2135 core.compression
2136 core.createObject
2137 core.deltaBaseCacheLimit
2138 core.editor
2139 core.eol
2140 core.excludesfile
2141 core.fileMode
2142 core.fsyncobjectfiles
2143 core.gitProxy
2144 core.ignoreStat
2145 core.ignorecase
2146 core.logAllRefUpdates
2147 core.loosecompression
2148 core.notesRef
2149 core.packedGitLimit
2150 core.packedGitWindowSize
2151 core.pager
2152 core.preferSymlinkRefs
2153 core.preloadindex
2154 core.quotepath
2155 core.repositoryFormatVersion
2156 core.safecrlf
2157 core.sharedRepository
2158 core.sparseCheckout
2159 core.symlinks
2160 core.trustctime
2161 core.untrackedCache
2162 core.warnAmbiguousRefs
2163 core.whitespace
2164 core.worktree
2165 diff.autorefreshindex
2166 diff.external
2167 diff.ignoreSubmodules
2168 diff.mnemonicprefix
2169 diff.noprefix
2170 diff.renameLimit
2171 diff.renames
2172 diff.statGraphWidth
2173 diff.submodule
2174 diff.suppressBlankEmpty
2175 diff.tool
2176 diff.wordRegex
2177 diff.algorithm
2178 difftool.
2179 difftool.prompt
2180 fetch.recurseSubmodules
2181 fetch.unpackLimit
2182 format.attach
2183 format.cc
2184 format.coverLetter
2185 format.headers
2186 format.numbered
2187 format.pretty
2188 format.signature
2189 format.signoff
2190 format.subjectprefix
2191 format.suffix
2192 format.thread
2193 format.to
2195 gc.aggressiveWindow
2196 gc.auto
2197 gc.autopacklimit
2198 gc.packrefs
2199 gc.pruneexpire
2200 gc.reflogexpire
2201 gc.reflogexpireunreachable
2202 gc.rerereresolved
2203 gc.rerereunresolved
2204 gitcvs.allbinary
2205 gitcvs.commitmsgannotation
2206 gitcvs.dbTableNamePrefix
2207 gitcvs.dbdriver
2208 gitcvs.dbname
2209 gitcvs.dbpass
2210 gitcvs.dbuser
2211 gitcvs.enabled
2212 gitcvs.logfile
2213 gitcvs.usecrlfattr
2214 guitool.
2215 gui.blamehistoryctx
2216 gui.commitmsgwidth
2217 gui.copyblamethreshold
2218 gui.diffcontext
2219 gui.encoding
2220 gui.fastcopyblame
2221 gui.matchtrackingbranch
2222 gui.newbranchtemplate
2223 gui.pruneduringfetch
2224 gui.spellingdictionary
2225 gui.trustmtime
2226 help.autocorrect
2227 help.browser
2228 help.format
2229 http.lowSpeedLimit
2230 http.lowSpeedTime
2231 http.maxRequests
2232 http.minSessions
2233 http.noEPSV
2234 http.postBuffer
2235 http.proxy
2236 http.sslCipherList
2237 http.sslVersion
2238 http.sslCAInfo
2239 http.sslCAPath
2240 http.sslCert
2241 http.sslCertPasswordProtected
2242 http.sslKey
2243 http.sslVerify
2244 http.useragent
2245 i18n.commitEncoding
2246 i18n.logOutputEncoding
2247 imap.authMethod
2248 imap.folder
2249 imap.host
2250 imap.pass
2251 imap.port
2252 imap.preformattedHTML
2253 imap.sslverify
2254 imap.tunnel
2255 imap.user
2256 init.templatedir
2257 instaweb.browser
2258 instaweb.httpd
2259 instaweb.local
2260 instaweb.modulepath
2261 instaweb.port
2262 interactive.singlekey
2263 log.date
2264 log.decorate
2265 log.showroot
2266 mailmap.file
2267 man.
2268 man.viewer
2269 merge.
2270 merge.conflictstyle
2271 merge.log
2272 merge.renameLimit
2273 merge.renormalize
2274 merge.stat
2275 merge.tool
2276 merge.verbosity
2277 mergetool.
2278 mergetool.keepBackup
2279 mergetool.keepTemporaries
2280 mergetool.prompt
2281 notes.displayRef
2282 notes.rewrite.
2283 notes.rewrite.amend
2284 notes.rewrite.rebase
2285 notes.rewriteMode
2286 notes.rewriteRef
2287 pack.compression
2288 pack.deltaCacheLimit
2289 pack.deltaCacheSize
2290 pack.depth
2291 pack.indexVersion
2292 pack.packSizeLimit
2293 pack.threads
2294 pack.window
2295 pack.windowMemory
2296 pager.
2297 pretty.
2298 pull.octopus
2299 pull.twohead
2300 push.default
2301 push.followTags
2302 rebase.autosquash
2303 rebase.stat
2304 receive.autogc
2305 receive.denyCurrentBranch
2306 receive.denyDeleteCurrent
2307 receive.denyDeletes
2308 receive.denyNonFastForwards
2309 receive.fsckObjects
2310 receive.unpackLimit
2311 receive.updateserverinfo
2312 remote.pushdefault
2313 remotes.
2314 repack.usedeltabaseoffset
2315 rerere.autoupdate
2316 rerere.enabled
2317 sendemail.
2318 sendemail.aliasesfile
2319 sendemail.aliasfiletype
2320 sendemail.bcc
2321 sendemail.cc
2322 sendemail.cccmd
2323 sendemail.chainreplyto
2324 sendemail.confirm
2325 sendemail.envelopesender
2326 sendemail.from
2327 sendemail.identity
2328 sendemail.multiedit
2329 sendemail.signedoffbycc
2330 sendemail.smtpdomain
2331 sendemail.smtpencryption
2332 sendemail.smtppass
2333 sendemail.smtpserver
2334 sendemail.smtpserveroption
2335 sendemail.smtpserverport
2336 sendemail.smtpuser
2337 sendemail.suppresscc
2338 sendemail.suppressfrom
2339 sendemail.thread
2340 sendemail.to
2341 sendemail.validate
2342 showbranch.default
2343 status.relativePaths
2344 status.showUntrackedFiles
2345 status.submodulesummary
2346 submodule.
2347 tar.umask
2348 transfer.unpackLimit
2349 url.
2350 user.email
2351 user.name
2352 user.signingkey
2353 web.browser
2354 branch. remote.
2358 _git_remote ()
2360 local subcommands="add rename remove set-head set-branches set-url show prune update"
2361 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2362 if [ -z "$subcommand" ]; then
2363 __gitcomp "$subcommands"
2364 return
2367 case "$subcommand" in
2368 rename|remove|set-url|show|prune)
2369 __gitcomp_nl "$(__git_remotes)"
2371 set-head|set-branches)
2372 __git_complete_remote_or_refspec
2374 update)
2375 __gitcomp "$(__git_get_config_variables "remotes")"
2379 esac
2382 _git_replace ()
2384 __gitcomp_nl "$(__git_refs)"
2387 _git_reset ()
2389 __git_has_doubledash && return
2391 case "$cur" in
2392 --*)
2393 __gitcomp "--merge --mixed --hard --soft --patch"
2394 return
2396 esac
2397 __gitcomp_nl "$(__git_refs)"
2400 _git_revert ()
2402 local dir="$(__gitdir)"
2403 if [ -f "$dir"/REVERT_HEAD ]; then
2404 __gitcomp "--continue --quit --abort"
2405 return
2407 case "$cur" in
2408 --*)
2409 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2410 return
2412 esac
2413 __gitcomp_nl "$(__git_refs)"
2416 _git_rm ()
2418 case "$cur" in
2419 --*)
2420 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2421 return
2423 esac
2425 __git_complete_index_file "--cached"
2428 _git_shortlog ()
2430 __git_has_doubledash && return
2432 case "$cur" in
2433 --*)
2434 __gitcomp "
2435 $__git_log_common_options
2436 $__git_log_shortlog_options
2437 --numbered --summary
2439 return
2441 esac
2442 __git_complete_revlist
2445 _git_show ()
2447 __git_has_doubledash && return
2449 case "$cur" in
2450 --pretty=*|--format=*)
2451 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2452 " "" "${cur#*=}"
2453 return
2455 --diff-algorithm=*)
2456 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2457 return
2459 --*)
2460 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2461 --show-signature
2462 $__git_diff_common_options
2464 return
2466 esac
2467 __git_complete_revlist_file
2470 _git_show_branch ()
2472 case "$cur" in
2473 --*)
2474 __gitcomp "
2475 --all --remotes --topo-order --date-order --current --more=
2476 --list --independent --merge-base --no-name
2477 --color --no-color
2478 --sha1-name --sparse --topics --reflog
2480 return
2482 esac
2483 __git_complete_revlist
2486 _git_stash ()
2488 local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
2489 local subcommands='save list show apply clear drop pop create branch'
2490 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2491 if [ -z "$subcommand" ]; then
2492 case "$cur" in
2493 --*)
2494 __gitcomp "$save_opts"
2497 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2498 __gitcomp "$subcommands"
2501 esac
2502 else
2503 case "$subcommand,$cur" in
2504 save,--*)
2505 __gitcomp "$save_opts"
2507 apply,--*|pop,--*)
2508 __gitcomp "--index --quiet"
2510 drop,--*)
2511 __gitcomp "--quiet"
2513 show,--*|branch,--*)
2515 branch,*)
2516 if [ $cword -eq 3 ]; then
2517 __gitcomp_nl "$(__git_refs)";
2518 else
2519 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2520 | sed -n -e 's/:.*//p')"
2523 show,*|apply,*|drop,*|pop,*)
2524 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2525 | sed -n -e 's/:.*//p')"
2529 esac
2533 _git_submodule ()
2535 __git_has_doubledash && return
2537 local subcommands="add status init deinit update summary foreach sync"
2538 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2539 case "$cur" in
2540 --*)
2541 __gitcomp "--quiet --cached"
2544 __gitcomp "$subcommands"
2546 esac
2547 return
2551 _git_svn ()
2553 local subcommands="
2554 init fetch clone rebase dcommit log find-rev
2555 set-tree commit-diff info create-ignore propget
2556 proplist show-ignore show-externals branch tag blame
2557 migrate mkdirs reset gc
2559 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2560 if [ -z "$subcommand" ]; then
2561 __gitcomp "$subcommands"
2562 else
2563 local remote_opts="--username= --config-dir= --no-auth-cache"
2564 local fc_opts="
2565 --follow-parent --authors-file= --repack=
2566 --no-metadata --use-svm-props --use-svnsync-props
2567 --log-window-size= --no-checkout --quiet
2568 --repack-flags --use-log-author --localtime
2569 --ignore-paths= --include-paths= $remote_opts
2571 local init_opts="
2572 --template= --shared= --trunk= --tags=
2573 --branches= --stdlayout --minimize-url
2574 --no-metadata --use-svm-props --use-svnsync-props
2575 --rewrite-root= --prefix= --use-log-author
2576 --add-author-from $remote_opts
2578 local cmt_opts="
2579 --edit --rmdir --find-copies-harder --copy-similarity=
2582 case "$subcommand,$cur" in
2583 fetch,--*)
2584 __gitcomp "--revision= --fetch-all $fc_opts"
2586 clone,--*)
2587 __gitcomp "--revision= $fc_opts $init_opts"
2589 init,--*)
2590 __gitcomp "$init_opts"
2592 dcommit,--*)
2593 __gitcomp "
2594 --merge --strategy= --verbose --dry-run
2595 --fetch-all --no-rebase --commit-url
2596 --revision --interactive $cmt_opts $fc_opts
2599 set-tree,--*)
2600 __gitcomp "--stdin $cmt_opts $fc_opts"
2602 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2603 show-externals,--*|mkdirs,--*)
2604 __gitcomp "--revision="
2606 log,--*)
2607 __gitcomp "
2608 --limit= --revision= --verbose --incremental
2609 --oneline --show-commit --non-recursive
2610 --authors-file= --color
2613 rebase,--*)
2614 __gitcomp "
2615 --merge --verbose --strategy= --local
2616 --fetch-all --dry-run $fc_opts
2619 commit-diff,--*)
2620 __gitcomp "--message= --file= --revision= $cmt_opts"
2622 info,--*)
2623 __gitcomp "--url"
2625 branch,--*)
2626 __gitcomp "--dry-run --message --tag"
2628 tag,--*)
2629 __gitcomp "--dry-run --message"
2631 blame,--*)
2632 __gitcomp "--git-format"
2634 migrate,--*)
2635 __gitcomp "
2636 --config-dir= --ignore-paths= --minimize
2637 --no-auth-cache --username=
2640 reset,--*)
2641 __gitcomp "--revision= --parent"
2645 esac
2649 _git_tag ()
2651 local i c=1 f=0
2652 while [ $c -lt $cword ]; do
2653 i="${words[c]}"
2654 case "$i" in
2655 -d|-v)
2656 __gitcomp_nl "$(__git_tags)"
2657 return
2662 esac
2663 ((c++))
2664 done
2666 case "$prev" in
2667 -m|-F)
2669 -*|tag)
2670 if [ $f = 1 ]; then
2671 __gitcomp_nl "$(__git_tags)"
2675 __gitcomp_nl "$(__git_refs)"
2677 esac
2679 case "$cur" in
2680 --*)
2681 __gitcomp "
2682 --list --delete --verify --annotate --message --file
2683 --sign --cleanup --local-user --force --column --sort
2684 --contains --points-at
2687 esac
2690 _git_whatchanged ()
2692 _git_log
2695 _git_worktree ()
2697 local subcommands="add list lock prune unlock"
2698 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2699 if [ -z "$subcommand" ]; then
2700 __gitcomp "$subcommands"
2701 else
2702 case "$subcommand,$cur" in
2703 add,--*)
2704 __gitcomp "--detach"
2706 list,--*)
2707 __gitcomp "--porcelain"
2709 lock,--*)
2710 __gitcomp "--reason"
2712 prune,--*)
2713 __gitcomp "--dry-run --expire --verbose"
2717 esac
2721 __git_main ()
2723 local i c=1 command __git_dir
2725 while [ $c -lt $cword ]; do
2726 i="${words[c]}"
2727 case "$i" in
2728 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2729 --git-dir) ((c++)) ; __git_dir="${words[c]}" ;;
2730 --bare) __git_dir="." ;;
2731 --help) command="help"; break ;;
2732 -c|--work-tree|--namespace) ((c++)) ;;
2733 -*) ;;
2734 *) command="$i"; break ;;
2735 esac
2736 ((c++))
2737 done
2739 if [ -z "$command" ]; then
2740 case "$cur" in
2741 --*) __gitcomp "
2742 --paginate
2743 --no-pager
2744 --git-dir=
2745 --bare
2746 --version
2747 --exec-path
2748 --exec-path=
2749 --html-path
2750 --man-path
2751 --info-path
2752 --work-tree=
2753 --namespace=
2754 --no-replace-objects
2755 --help
2758 *) __git_compute_porcelain_commands
2759 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2760 esac
2761 return
2764 local completion_func="_git_${command//-/_}"
2765 declare -f $completion_func >/dev/null && $completion_func && return
2767 local expansion=$(__git_aliased_command "$command")
2768 if [ -n "$expansion" ]; then
2769 words[1]=$expansion
2770 completion_func="_git_${expansion//-/_}"
2771 declare -f $completion_func >/dev/null && $completion_func
2775 __gitk_main ()
2777 __git_has_doubledash && return
2779 local g="$(__gitdir)"
2780 local merge=""
2781 if [ -f "$g/MERGE_HEAD" ]; then
2782 merge="--merge"
2784 case "$cur" in
2785 --*)
2786 __gitcomp "
2787 $__git_log_common_options
2788 $__git_log_gitk_options
2789 $merge
2791 return
2793 esac
2794 __git_complete_revlist
2797 if [[ -n ${ZSH_VERSION-} ]]; then
2798 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2800 autoload -U +X compinit && compinit
2802 __gitcomp ()
2804 emulate -L zsh
2806 local cur_="${3-$cur}"
2808 case "$cur_" in
2809 --*=)
2812 local c IFS=$' \t\n'
2813 local -a array
2814 for c in ${=1}; do
2815 c="$c${4-}"
2816 case $c in
2817 --*=*|*.) ;;
2818 *) c="$c " ;;
2819 esac
2820 array[${#array[@]}+1]="$c"
2821 done
2822 compset -P '*[=:]'
2823 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2825 esac
2828 __gitcomp_nl ()
2830 emulate -L zsh
2832 local IFS=$'\n'
2833 compset -P '*[=:]'
2834 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2837 __gitcomp_file ()
2839 emulate -L zsh
2841 local IFS=$'\n'
2842 compset -P '*[=:]'
2843 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2846 _git ()
2848 local _ret=1 cur cword prev
2849 cur=${words[CURRENT]}
2850 prev=${words[CURRENT-1]}
2851 let cword=CURRENT-1
2852 emulate ksh -c __${service}_main
2853 let _ret && _default && _ret=0
2854 return _ret
2857 compdef _git git gitk
2858 return
2861 __git_func_wrap ()
2863 local cur words cword prev
2864 _get_comp_words_by_ref -n =: cur words cword prev
2868 # Setup completion for certain functions defined above by setting common
2869 # variables and workarounds.
2870 # This is NOT a public function; use at your own risk.
2871 __git_complete ()
2873 local wrapper="__git_wrap${2}"
2874 eval "$wrapper () { __git_func_wrap $2 ; }"
2875 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2876 || complete -o default -o nospace -F $wrapper $1
2879 # wrapper for backwards compatibility
2880 _git ()
2882 __git_wrap__git_main
2885 # wrapper for backwards compatibility
2886 _gitk ()
2888 __git_wrap__gitk_main
2891 __git_complete git __git_main
2892 __git_complete gitk __gitk_main
2894 # The following are necessary only for Cygwin, and only are needed
2895 # when the user has tab-completed the executable name and consequently
2896 # included the '.exe' suffix.
2898 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2899 __git_complete git.exe __git_main