1# bash/zsh completion support for core Git.
2#
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.
6#
7# The contained completion routines provide support for completing:
8#
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
17#
18# To use these routines:
19#
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.
25#
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 ; ... '".
31
32case "$COMP_WORDBREAKS" in
33*:*) : great ;;
34*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
35esac
36
37# __gitdir accepts 0 or 1 arguments (i.e., location)
38# returns location of .git repo
39__gitdir ()
40{
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
51 fi
52 elif [ -d "$1/.git" ]; then
53 echo "$1/.git"
54 else
55 echo "$1"
56 fi
57}
58
59# The following function is based on code from:
60#
61# bash_completion - programmable completion functions for bash 3.2+
62#
63# Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
64# © 2009-2010, Bash Completion Maintainers
65# <bash-completion-devel@lists.alioth.debian.org>
66#
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.
71#
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.
76#
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.
80#
81# The latest version of this software can be obtained here:
82#
83# http://bash-completion.alioth.debian.org/
84#
85# RELEASE: 2.x
86
87# This function can be used to access a tokenized list of words
88# on the command line:
89#
90# __git_reassemble_comp_words_by_ref '=:'
91# if test "${words_[cword_-1]}" = -w
92# then
93# ...
94# fi
95#
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.
99#
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.
104#
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.
109#
110# Output: words_, cword_, cur_.
111
112__git_reassemble_comp_words_by_ref()
113{
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
121 fi
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]}" ]
133 do
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--))
138 fi
139 first=
140 words_[$j]=${words_[j]}${COMP_WORDS[i]}
141 if [ $i = $COMP_CWORD ]; then
142 cword_=$j
143 fi
144 if (($i < ${#COMP_WORDS[@]} - 1)); then
145 ((i++))
146 else
147 # Done.
148 return
149 fi
150 done
151 words_[$j]=${words_[j]}${COMP_WORDS[i]}
152 if [ $i = $COMP_CWORD ]; then
153 cword_=$j
154 fi
155 done
156}
157
158if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
159_get_comp_words_by_ref ()
160{
161 local exclude cur_ words_ cword_
162 if [ "$1" = "-n" ]; then
163 exclude=$2
164 shift 2
165 fi
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_
172 ;;
173 prev)
174 prev=${words_[$cword_-1]}
175 ;;
176 words)
177 words=("${words_[@]}")
178 ;;
179 cword)
180 cword=$cword_
181 ;;
182 esac
183 shift
184 done
185}
186fi
187
188__gitcompappend ()
189{
190 local x i=${#COMPREPLY[@]}
191 for x in $1; do
192 if [[ "$x" == "$3"* ]]; then
193 COMPREPLY[i++]="$2$x$4"
194 fi
195 done
196}
197
198__gitcompadd ()
199{
200 COMPREPLY=()
201 __gitcompappend "$@"
202}
203
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 ()
212{
213 local cur_="${3-$cur}"
214
215 case "$cur_" in
216 --*=)
217 ;;
218 *)
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"
228 fi
229 done
230 ;;
231 esac
232}
233
234# Variation of __gitcomp_nl () that appends to the existing list of
235# completion candidates, COMPREPLY.
236__gitcomp_nl_append ()
237{
238 local IFS=$'\n'
239 __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }"
240}
241
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 ()
252{
253 COMPREPLY=()
254 __gitcomp_nl_append "$@"
255}
256
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 ()
265{
266 local IFS=$'\n'
267
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}" ""
273
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
277}
278
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 ()
284{
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
291}
292
293
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 ()
301{
302 local dir="$(__gitdir)" root="${2-.}" file
303
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
312 fi
313}
314
315__git_heads ()
316{
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
322 fi
323}
324
325__git_tags ()
326{
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
332 fi
333}
334
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 ()
339{
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=""
348 ;;
349 *)
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"
356 ;;
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"
372 fi
373 done | sort | uniq -u
374 fi
375 return
376 fi
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
386 ;;
387 *)
388 echo "HEAD"
389 git for-each-ref --format="%(refname:short)" -- \
390 "refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##"
391 ;;
392 esac
393}
394
395# __git_refs2 requires 1 argument (to pass to __git_refs)
396__git_refs2 ()
397{
398 local i
399 for i in $(__git_refs "$1"); do
400 echo "$i:$i"
401 done
402}
403
404# __git_refs_remotes requires 1 argument (to pass to ls-remote)
405__git_refs_remotes ()
406{
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
412}
413
414__git_remotes ()
415{
416 local d="$(__gitdir)"
417 test -d "$d/remotes" && ls -1 "$d/remotes"
418 git --git-dir="$d" remote
419}
420
421__git_list_merge_strategies ()
422{
423 git merge -s help 2>&1 |
424 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
425 s/\.$//
426 s/.*://
427 s/^[ ]*//
428 s/[ ]*$//
429 p
430 }'
431}
432
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 ()
440{
441 test -n "$__git_merge_strategies" ||
442 __git_merge_strategies=$(__git_list_merge_strategies)
443}
444
445__git_complete_revlist_file ()
446{
447 local pfx ls ref cur_="$cur"
448 case "$cur_" in
449 *..?*:*)
450 return
451 ;;
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/"
461 ;;
462 *)
463 ls="$ref"
464 ;;
465 esac
466
467 case "$COMP_WORDBREAKS" in
468 *:*) : great ;;
469 *) pfx="$ref:$pfx" ;;
470 esac
471
472 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
473 | sed '/^100... blob /{
474 s,^.* ,,
475 s,$, ,
476 }
477 /^120000 blob /{
478 s,^.* ,,
479 s,$, ,
480 }
481 /^040000 tree /{
482 s,^.* ,,
483 s,$,/,
484 }
485 s/^.* //')" \
486 "$pfx" "$cur_" ""
487 ;;
488 *...*)
489 pfx="${cur_%...*}..."
490 cur_="${cur_#*...}"
491 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
492 ;;
493 *..*)
494 pfx="${cur_%..*}.."
495 cur_="${cur_#*..}"
496 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
497 ;;
498 *)
499 __gitcomp_nl "$(__git_refs)"
500 ;;
501 esac
502}
503
504
505# __git_complete_index_file requires 1 argument:
506# 1: the options to pass to ls-file
507#
508# The exception is --committable, which finds the files appropriate commit.
509__git_complete_index_file ()
510{
511 local pfx="" cur_="$cur"
512
513 case "$cur_" in
514 ?*/*)
515 pfx="${cur_%/*}"
516 cur_="${cur_##*/}"
517 pfx="${pfx}/"
518 ;;
519 esac
520
521 __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
522}
523
524__git_complete_file ()
525{
526 __git_complete_revlist_file
527}
528
529__git_complete_revlist ()
530{
531 __git_complete_revlist_file
532}
533
534__git_complete_remote_or_refspec ()
535{
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++))
540 fi
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
550 ;;
551 *) ;;
552 esac
553 ;;
554 -*) ;;
555 *) remote="$i"; break ;;
556 esac
557 ((c++))
558 done
559 if [ -z "$remote" ]; then
560 __gitcomp_nl "$(__git_remotes)"
561 return
562 fi
563 if [ $no_complete_refspec = 1 ]; then
564 return
565 fi
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
575 ;;
576 +*)
577 pfx="+"
578 cur_="${cur_#+}"
579 ;;
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_"
587 fi
588 ;;
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_"
594 fi
595 ;;
596 push)
597 if [ $lhs = 1 ]; then
598 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
599 else
600 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
601 fi
602 ;;
603 esac
604}
605
606__git_complete_strategy ()
607{
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
618 ;;
619 esac
620 return 1
621}
622
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]'
629 fi
630}
631
632__git_list_all_commands ()
633{
634 local i IFS=" "$'\n'
635 for i in $(__git_commands)
636 do
637 case $i in
638 *--*) : helper pattern;;
639 *) echo $i;;
640 esac
641 done
642}
643
644__git_all_commands=
645__git_compute_all_commands ()
646{
647 test -n "$__git_all_commands" ||
648 __git_all_commands=$(__git_list_all_commands)
649}
650
651__git_list_porcelain_commands ()
652{
653 local i IFS=" "$'\n'
654 __git_compute_all_commands
655 for i in $__git_all_commands
656 do
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
736}
737
738__git_porcelain_commands=
739__git_compute_porcelain_commands ()
740{
741 test -n "$__git_porcelain_commands" ||
742 __git_porcelain_commands=$(__git_list_porcelain_commands)
743}
744
745# Lists all set config variables starting with the given section prefix,
746# with the prefix removed.
747__git_get_config_variables ()
748{
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
753}
754
755__git_pretty_aliases ()
756{
757 __git_get_config_variables "pretty"
758}
759
760__git_aliases ()
761{
762 __git_get_config_variables "alias"
763}
764
765# __git_aliased_command requires 1 argument
766__git_aliased_command ()
767{
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
775 ;;
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 ;;
784 *)
785 echo "$word"
786 return
787 esac
788 done
789}
790
791# __git_find_on_cmdline requires 1 argument
792__git_find_on_cmdline ()
793{
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
801 fi
802 done
803 ((c++))
804 done
805}
806
807# Echo the value of an option set on the command line or config
808#
809# $1: short option name
810# $2: long option name including =
811# $3: list of possible values
812# $4: config string (optional)
813#
814# example:
815# result="$(__git_get_option_value "-d" "--do-something=" \
816# "yes no" "core.doSomething")"
817#
818# result is then either empty (no option set) or "yes" or "no"
819#
820# __git_get_option_value requires 3 arguments
821__git_get_option_value ()
822{
823 local c short_opt long_opt val
824 local result= values config_key word
825
826 short_opt="$1"
827 long_opt="$2"
828 values="$3"
829 config_key="$4"
830
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
839 fi
840 done
841 ((c--))
842 done
843
844 if [ -n "$config_key" ] && [ -z "$result" ]; then
845 result="$(git --git-dir="$(__gitdir)" config "$config_key")"
846 fi
847
848 echo "$result"
849}
850
851__git_has_doubledash ()
852{
853 local c=1
854 while [ $c -lt $cword ]; do
855 if [ "--" = "${words[c]}" ]; then
856 return 0
857 fi
858 ((c++))
859 done
860 return 1
861}
862
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
870#
871# __git_count_arguments requires 1 argument: the git command executed.
872__git_count_arguments ()
873{
874 local word i c=0
875
876 # Skip "git" (first argument)
877 for ((i=1; i < ${#words[@]}; i++)); do
878 word="${words[i]}"
879
880 case "$word" in
881 --)
882 # Good; we can assume that the following are only non
883 # option arguments.
884 ((c = 0))
885 ;;
886 "$1")
887 # Skip the specified git command and discard git
888 # main options
889 ((c = 0))
890 ;;
891 ?*)
892 ((c++))
893 ;;
894 esac
895 done
896
897 printf "%d" $c
898}
899
900__git_whitespacelist="nowarn warn error error-all fix"
901
902_git_am ()
903{
904 local dir="$(__gitdir)"
905 if [ -d "$dir"/rebase-apply ]; then
906 __gitcomp "--skip --continue --resolved --abort"
907 return
908 fi
909 case "$cur" in
910 --whitespace=*)
911 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
912 return
913 ;;
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
920 "
921 return
922 esac
923}
924
925_git_apply ()
926{
927 case "$cur" in
928 --whitespace=*)
929 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
930 return
931 ;;
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=
940 "
941 return
942 esac
943}
944
945_git_add ()
946{
947 case "$cur" in
948 --*)
949 __gitcomp "
950 --interactive --refresh --patch --update --dry-run
951 --ignore-errors --intent-to-add --force --edit --chmod=
952 "
953 return
954 esac
955
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"
960 fi
961 __git_complete_index_file "$complete_opt"
962}
963
964_git_archive ()
965{
966 case "$cur" in
967 --format=*)
968 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
969 return
970 ;;
971 --remote=*)
972 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
973 return
974 ;;
975 --*)
976 __gitcomp "
977 --format= --list --verbose
978 --prefix= --remote= --exec= --output
979 "
980 return
981 ;;
982 esac
983 __git_complete_file
984}
985
986_git_bisect ()
987{
988 __git_has_doubledash && return
989
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"
997 fi
998 return
999 fi
1000
1001 case "$subcommand" in
1002 bad|good|reset|skip|start)
1003 __gitcomp_nl "$(__git_refs)"
1004 ;;
1005 *)
1006 ;;
1007 esac
1008}
1009
1010_git_branch ()
1011{
1012 local i c=1 only_local_ref="n" has_r="n"
1013
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
1022
1023 case "$cur" in
1024 --set-upstream-to=*)
1025 __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}"
1026 ;;
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
1034 "
1035 ;;
1036 *)
1037 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1038 __gitcomp_nl "$(__git_heads)"
1039 else
1040 __gitcomp_nl "$(__git_refs)"
1041 fi
1042 ;;
1043 esac
1044}
1045
1046_git_bundle ()
1047{
1048 local cmd="${words[2]}"
1049 case "$cword" in
1050 2)
1051 __gitcomp "create list-heads verify unbundle"
1052 ;;
1053 3)
1054 # looking for a file
1055 ;;
1056 *)
1057 case "$cmd" in
1058 create)
1059 __git_complete_revlist
1060 ;;
1061 esac
1062 ;;
1063 esac
1064}
1065
1066_git_checkout ()
1067{
1068 __git_has_doubledash && return
1069
1070 case "$cur" in
1071 --conflict=*)
1072 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1073 ;;
1074 --*)
1075 __gitcomp "
1076 --quiet --ours --theirs --track --no-track --merge
1077 --conflict= --orphan --patch
1078 "
1079 ;;
1080 *)
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=''
1086 fi
1087 __gitcomp_nl "$(__git_refs '' $track)"
1088 ;;
1089 esac
1090}
1091
1092_git_cherry ()
1093{
1094 __gitcomp_nl "$(__git_refs)"
1095}
1096
1097_git_cherry_pick ()
1098{
1099 local dir="$(__gitdir)"
1100 if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1101 __gitcomp "--continue --quit --abort"
1102 return
1103 fi
1104 case "$cur" in
1105 --*)
1106 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1107 ;;
1108 *)
1109 __gitcomp_nl "$(__git_refs)"
1110 ;;
1111 esac
1112}
1113
1114_git_clean ()
1115{
1116 case "$cur" in
1117 --*)
1118 __gitcomp "--dry-run --quiet"
1119 return
1120 ;;
1121 esac
1122
1123 # XXX should we check for -x option ?
1124 __git_complete_index_file "--others --directory"
1125}
1126
1127_git_clone ()
1128{
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
1149 "
1150 return
1151 ;;
1152 esac
1153}
1154
1155__git_untracked_file_modes="all no normal"
1156
1157_git_commit ()
1158{
1159 case "$prev" in
1160 -c|-C)
1161 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1162 return
1163 ;;
1164 esac
1165
1166 case "$cur" in
1167 --cleanup=*)
1168 __gitcomp "default scissors strip verbatim whitespace
1169 " "" "${cur##--cleanup=}"
1170 return
1171 ;;
1172 --reuse-message=*|--reedit-message=*|\
1173 --fixup=*|--squash=*)
1174 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1175 return
1176 ;;
1177 --untracked-files=*)
1178 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1179 return
1180 ;;
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
1191 "
1192 return
1193 esac
1194
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"
1200 fi
1201}
1202
1203_git_describe ()
1204{
1205 case "$cur" in
1206 --*)
1207 __gitcomp "
1208 --all --tags --contains --abbrev= --candidates=
1209 --exact-match --debug --long --match --always --first-parent
1210 "
1211 return
1212 esac
1213 __gitcomp_nl "$(__git_refs)"
1214}
1215
1216__git_diff_algorithms="myers minimal patience histogram"
1217
1218__git_diff_submodule_formats="diff log short"
1219
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=
1236"
1237
1238_git_diff ()
1239{
1240 __git_has_doubledash && return
1241
1242 case "$cur" in
1243 --diff-algorithm=*)
1244 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1245 return
1246 ;;
1247 --submodule=*)
1248 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1249 return
1250 ;;
1251 --*)
1252 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1253 --base --ours --theirs --no-index
1254 $__git_diff_common_options
1255 "
1256 return
1257 ;;
1258 esac
1259 __git_complete_revlist_file
1260}
1261
1262__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1263 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
1264"
1265
1266_git_difftool ()
1267{
1268 __git_has_doubledash && return
1269
1270 case "$cur" in
1271 --tool=*)
1272 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1273 return
1274 ;;
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
1282 ;;
1283 esac
1284 __git_complete_revlist_file
1285}
1286
1287__git_fetch_recurse_submodules="yes on-demand no"
1288
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
1293"
1294
1295_git_fetch ()
1296{
1297 case "$cur" in
1298 --recurse-submodules=*)
1299 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1300 return
1301 ;;
1302 --*)
1303 __gitcomp "$__git_fetch_options"
1304 return
1305 ;;
1306 esac
1307 __git_complete_remote_or_refspec
1308}
1309
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
1317"
1318
1319_git_format_patch ()
1320{
1321 case "$cur" in
1322 --thread=*)
1323 __gitcomp "
1324 deep shallow
1325 " "" "${cur##--thread=}"
1326 return
1327 ;;
1328 --*)
1329 __gitcomp "$__git_format_patch_options"
1330 return
1331 ;;
1332 esac
1333 __git_complete_revlist
1334}
1335
1336_git_fsck ()
1337{
1338 case "$cur" in
1339 --*)
1340 __gitcomp "
1341 --tags --root --unreachable --cache --no-reflogs --full
1342 --strict --verbose --lost-found --name-objects
1343 "
1344 return
1345 ;;
1346 esac
1347}
1348
1349_git_gc ()
1350{
1351 case "$cur" in
1352 --*)
1353 __gitcomp "--prune --aggressive"
1354 return
1355 ;;
1356 esac
1357}
1358
1359_git_gitk ()
1360{
1361 _gitk
1362}
1363
1364__git_match_ctag() {
1365 awk "/^${1//\//\\/}/ { print \$1 }" "$2"
1366}
1367
1368_git_grep ()
1369{
1370 __git_has_doubledash && return
1371
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
1388 "
1389 return
1390 ;;
1391 esac
1392
1393 case "$cword,$prev" in
1394 2,*|*,-*)
1395 if test -r tags; then
1396 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1397 return
1398 fi
1399 ;;
1400 esac
1401
1402 __gitcomp_nl "$(__git_refs)"
1403}
1404
1405_git_help ()
1406{
1407 case "$cur" in
1408 --*)
1409 __gitcomp "--all --guides --info --man --web"
1410 return
1411 ;;
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
1419 "
1420}
1421
1422_git_init ()
1423{
1424 case "$cur" in
1425 --shared=*)
1426 __gitcomp "
1427 false true umask group all world everybody
1428 " "" "${cur##--shared=}"
1429 return
1430 ;;
1431 --*)
1432 __gitcomp "--quiet --bare --template= --shared --shared="
1433 return
1434 ;;
1435 esac
1436}
1437
1438_git_ls_files ()
1439{
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
1448 "
1449 return
1450 ;;
1451 esac
1452
1453 # XXX ignore options like --modified and always suggest all cached
1454 # files.
1455 __git_complete_index_file "--cached"
1456}
1457
1458_git_ls_remote ()
1459{
1460 case "$cur" in
1461 --*)
1462 __gitcomp "--heads --tags --refs --get-url --symref"
1463 return
1464 ;;
1465 esac
1466 __gitcomp_nl "$(__git_remotes)"
1467}
1468
1469_git_ls_tree ()
1470{
1471 __git_complete_file
1472}
1473
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
1484"
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
1490"
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
1495"
1496
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"
1499
1500_git_log ()
1501{
1502 __git_has_doubledash && return
1503
1504 local g="$(git rev-parse --git-dir 2>/dev/null)"
1505 local merge=""
1506 if [ -f "$g/MERGE_HEAD" ]; then
1507 merge="--merge"
1508 fi
1509 case "$cur" in
1510 --pretty=*|--format=*)
1511 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1512 " "" "${cur#*=}"
1513 return
1514 ;;
1515 --date=*)
1516 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1517 return
1518 ;;
1519 --decorate=*)
1520 __gitcomp "full short no" "" "${cur##--decorate=}"
1521 return
1522 ;;
1523 --diff-algorithm=*)
1524 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1525 return
1526 ;;
1527 --submodule=*)
1528 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1529 return
1530 ;;
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
1551 "
1552 return
1553 ;;
1554 esac
1555 __git_complete_revlist
1556}
1557
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
1564"
1565
1566_git_merge ()
1567{
1568 __git_complete_strategy && return
1569
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)"
1577}
1578
1579_git_mergetool ()
1580{
1581 case "$cur" in
1582 --tool=*)
1583 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1584 return
1585 ;;
1586 --*)
1587 __gitcomp "--tool= --prompt --no-prompt"
1588 return
1589 ;;
1590 esac
1591}
1592
1593_git_merge_base ()
1594{
1595 case "$cur" in
1596 --*)
1597 __gitcomp "--octopus --independent --is-ancestor --fork-point"
1598 return
1599 ;;
1600 esac
1601 __gitcomp_nl "$(__git_refs)"
1602}
1603
1604_git_mv ()
1605{
1606 case "$cur" in
1607 --*)
1608 __gitcomp "--dry-run"
1609 return
1610 ;;
1611 esac
1612
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"
1619 fi
1620}
1621
1622_git_name_rev ()
1623{
1624 __gitcomp "--tags --all --stdin"
1625}
1626
1627_git_notes ()
1628{
1629 local subcommands='add append copy edit list prune remove show'
1630 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1631
1632 case "$subcommand,$cur" in
1633 ,--*)
1634 __gitcomp '--ref'
1635 ;;
1636 ,*)
1637 case "$prev" in
1638 --ref)
1639 __gitcomp_nl "$(__git_refs)"
1640 ;;
1641 *)
1642 __gitcomp "$subcommands --ref"
1643 ;;
1644 esac
1645 ;;
1646 add,--reuse-message=*|append,--reuse-message=*|\
1647 add,--reedit-message=*|append,--reedit-message=*)
1648 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1649 ;;
1650 add,--*|append,--*)
1651 __gitcomp '--file= --message= --reedit-message=
1652 --reuse-message='
1653 ;;
1654 copy,--*)
1655 __gitcomp '--stdin'
1656 ;;
1657 prune,--*)
1658 __gitcomp '--dry-run --verbose'
1659 ;;
1660 prune,*)
1661 ;;
1662 *)
1663 case "$prev" in
1664 -m|-F)
1665 ;;
1666 *)
1667 __gitcomp_nl "$(__git_refs)"
1668 ;;
1669 esac
1670 ;;
1671 esac
1672}
1673
1674_git_pull ()
1675{
1676 __git_complete_strategy && return
1677
1678 case "$cur" in
1679 --recurse-submodules=*)
1680 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1681 return
1682 ;;
1683 --*)
1684 __gitcomp "
1685 --rebase --no-rebase
1686 $__git_merge_options
1687 $__git_fetch_options
1688 "
1689 return
1690 ;;
1691 esac
1692 __git_complete_remote_or_refspec
1693}
1694
1695__git_push_recurse_submodules="check on-demand only"
1696
1697__git_complete_force_with_lease ()
1698{
1699 local cur_=$1
1700
1701 case "$cur_" in
1702 --*=)
1703 ;;
1704 *:*)
1705 __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
1706 ;;
1707 *)
1708 __gitcomp_nl "$(__git_refs)" "" "$cur_"
1709 ;;
1710 esac
1711}
1712
1713_git_push ()
1714{
1715 case "$prev" in
1716 --repo)
1717 __gitcomp_nl "$(__git_remotes)"
1718 return
1719 ;;
1720 --recurse-submodules)
1721 __gitcomp "$__git_push_recurse_submodules"
1722 return
1723 ;;
1724 esac
1725 case "$cur" in
1726 --repo=*)
1727 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1728 return
1729 ;;
1730 --recurse-submodules=*)
1731 __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1732 return
1733 ;;
1734 --force-with-lease=*)
1735 __git_complete_force_with_lease "${cur##--force-with-lease=}"
1736 return
1737 ;;
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=
1744 "
1745 return
1746 ;;
1747 esac
1748 __git_complete_remote_or_refspec
1749}
1750
1751_git_rebase ()
1752{
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
1760 fi
1761 __git_complete_strategy && return
1762 case "$cur" in
1763 --whitespace=*)
1764 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1765 return
1766 ;;
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
1779 "
1780
1781 return
1782 esac
1783 __gitcomp_nl "$(__git_refs)"
1784}
1785
1786_git_reflog ()
1787{
1788 local subcommands="show delete expire"
1789 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1790
1791 if [ -z "$subcommand" ]; then
1792 __gitcomp "$subcommands"
1793 else
1794 __gitcomp_nl "$(__git_refs)"
1795 fi
1796}
1797
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"
1800
1801_git_send_email ()
1802{
1803 case "$prev" in
1804 --to|--cc|--bcc|--from)
1805 __gitcomp "
1806 $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1807 "
1808 return
1809 ;;
1810 esac
1811
1812 case "$cur" in
1813 --confirm=*)
1814 __gitcomp "
1815 $__git_send_email_confirm_options
1816 " "" "${cur##--confirm=}"
1817 return
1818 ;;
1819 --suppress-cc=*)
1820 __gitcomp "
1821 $__git_send_email_suppresscc_options
1822 " "" "${cur##--suppress-cc=}"
1823
1824 return
1825 ;;
1826 --smtp-encryption=*)
1827 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1828 return
1829 ;;
1830 --thread=*)
1831 __gitcomp "
1832 deep shallow
1833 " "" "${cur##--thread=}"
1834 return
1835 ;;
1836 --to=*|--cc=*|--bcc=*|--from=*)
1837 __gitcomp "
1838 $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1839 " "" "${cur#--*=}"
1840 return
1841 ;;
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
1854 ;;
1855 esac
1856 __git_complete_revlist
1857}
1858
1859_git_stage ()
1860{
1861 _git_add
1862}
1863
1864_git_status ()
1865{
1866 local complete_opt
1867 local untracked_state
1868
1869 case "$cur" in
1870 --ignore-submodules=*)
1871 __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
1872 return
1873 ;;
1874 --untracked-files=*)
1875 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1876 return
1877 ;;
1878 --column=*)
1879 __gitcomp "
1880 always never auto column row plain dense nodense
1881 " "" "${cur##--column=}"
1882 return
1883 ;;
1884 --*)
1885 __gitcomp "
1886 --short --branch --porcelain --long --verbose
1887 --untracked-files= --ignore-submodules= --ignored
1888 --column= --no-column
1889 "
1890 return
1891 ;;
1892 esac
1893
1894 untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
1895 "$__git_untracked_file_modes" "status.showUntrackedFiles")"
1896
1897 case "$untracked_state" in
1898 no)
1899 # --ignored option does not matter
1900 complete_opt=
1901 ;;
1902 all|normal|*)
1903 complete_opt="--cached --directory --no-empty-directory --others"
1904
1905 if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
1906 complete_opt="$complete_opt --ignored --exclude=*"
1907 fi
1908 ;;
1909 esac
1910
1911 __git_complete_index_file "$complete_opt"
1912}
1913
1914__git_config_get_set_variables ()
1915{
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
1923 ;;
1924 -f|--file)
1925 config_file="$word $prevword"
1926 break
1927 ;;
1928 esac
1929 prevword=$word
1930 c=$((--c))
1931 done
1932
1933 git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
1934}
1935
1936_git_config ()
1937{
1938 case "$prev" in
1939 branch.*.remote|branch.*.pushremote)
1940 __gitcomp_nl "$(__git_remotes)"
1941 return
1942 ;;
1943 branch.*.merge)
1944 __gitcomp_nl "$(__git_refs)"
1945 return
1946 ;;
1947 branch.*.rebase)
1948 __gitcomp "false true preserve interactive"
1949 return
1950 ;;
1951 remote.pushdefault)
1952 __gitcomp_nl "$(__git_remotes)"
1953 return
1954 ;;
1955 remote.*.fetch)
1956 local remote="${prev#remote.}"
1957 remote="${remote%.fetch}"
1958 if [ -z "$cur" ]; then
1959 __gitcomp_nl "refs/heads/" "" "" ""
1960 return
1961 fi
1962 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1963 return
1964 ;;
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
1972 ;;
1973 pull.twohead|pull.octopus)
1974 __git_compute_merge_strategies
1975 __gitcomp "$__git_merge_strategies"
1976 return
1977 ;;
1978 color.branch|color.diff|color.interactive|\
1979 color.showbranch|color.status|color.ui)
1980 __gitcomp "always never auto"
1981 return
1982 ;;
1983 color.pager)
1984 __gitcomp "false true"
1985 return
1986 ;;
1987 color.*.*)
1988 __gitcomp "
1989 normal black red green yellow blue magenta cyan white
1990 bold dim ul blink reverse
1991 "
1992 return
1993 ;;
1994 diff.submodule)
1995 __gitcomp "log short"
1996 return
1997 ;;
1998 help.format)
1999 __gitcomp "man info web html"
2000 return
2001 ;;
2002 log.date)
2003 __gitcomp "$__git_log_date_formats"
2004 return
2005 ;;
2006 sendemail.aliasesfiletype)
2007 __gitcomp "mutt mailrc pine elm gnus"
2008 return
2009 ;;
2010 sendemail.confirm)
2011 __gitcomp "$__git_send_email_confirm_options"
2012 return
2013 ;;
2014 sendemail.suppresscc)
2015 __gitcomp "$__git_send_email_suppresscc_options"
2016 return
2017 ;;
2018 sendemail.transferencoding)
2019 __gitcomp "7bit 8bit quoted-printable base64"
2020 return
2021 ;;
2022 --get|--get-all|--unset|--unset-all)
2023 __gitcomp_nl "$(__git_config_get_set_variables)"
2024 return
2025 ;;
2026 *.*)
2027 return
2028 ;;
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
2039 "
2040 return
2041 ;;
2042 branch.*.*)
2043 local pfx="${cur%.*}." cur_="${cur##*.}"
2044 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
2045 return
2046 ;;
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
2052 ;;
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
2060 ;;
2061 difftool.*.*)
2062 local pfx="${cur%.*}." cur_="${cur##*.}"
2063 __gitcomp "cmd path" "$pfx" "$cur_"
2064 return
2065 ;;
2066 man.*.*)
2067 local pfx="${cur%.*}." cur_="${cur##*.}"
2068 __gitcomp "cmd path" "$pfx" "$cur_"
2069 return
2070 ;;
2071 mergetool.*.*)
2072 local pfx="${cur%.*}." cur_="${cur##*.}"
2073 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
2074 return
2075 ;;
2076 pager.*)
2077 local pfx="${cur%.*}." cur_="${cur#*.}"
2078 __git_compute_all_commands
2079 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
2080 return
2081 ;;
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
2089 ;;
2090 remote.*)
2091 local pfx="${cur%.*}." cur_="${cur#*.}"
2092 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
2093 __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
2094 return
2095 ;;
2096 url.*.*)
2097 local pfx="${cur%.*}." cur_="${cur##*.}"
2098 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2099 return
2100 ;;
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
2229 gc.
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.
2390 "
2391}
2392
2393_git_remote ()
2394{
2395 local subcommands="
2396 add rename remove set-head set-branches
2397 get-url set-url show prune update
2398 "
2399 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2400 if [ -z "$subcommand" ]; then
2401 case "$cur" in
2402 --*)
2403 __gitcomp "--verbose"
2404 ;;
2405 *)
2406 __gitcomp "$subcommands"
2407 ;;
2408 esac
2409 return
2410 fi
2411
2412 case "$subcommand,$cur" in
2413 add,--*)
2414 __gitcomp "--track --master --fetch --tags --no-tags --mirror="
2415 ;;
2416 add,*)
2417 ;;
2418 set-head,--*)
2419 __gitcomp "--auto --delete"
2420 ;;
2421 set-branches,--*)
2422 __gitcomp "--add"
2423 ;;
2424 set-head,*|set-branches,*)
2425 __git_complete_remote_or_refspec
2426 ;;
2427 update,--*)
2428 __gitcomp "--prune"
2429 ;;
2430 update,*)
2431 __gitcomp "$(__git_get_config_variables "remotes")"
2432 ;;
2433 set-url,--*)
2434 __gitcomp "--push --add --delete"
2435 ;;
2436 get-url,--*)
2437 __gitcomp "--push --all"
2438 ;;
2439 prune,--*)
2440 __gitcomp "--dry-run"
2441 ;;
2442 *)
2443 __gitcomp_nl "$(__git_remotes)"
2444 ;;
2445 esac
2446}
2447
2448_git_replace ()
2449{
2450 case "$cur" in
2451 --*)
2452 __gitcomp "--edit --graft --format= --list --delete"
2453 return
2454 ;;
2455 esac
2456 __gitcomp_nl "$(__git_refs)"
2457}
2458
2459_git_rerere ()
2460{
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
2467 fi
2468}
2469
2470_git_reset ()
2471{
2472 __git_has_doubledash && return
2473
2474 case "$cur" in
2475 --*)
2476 __gitcomp "--merge --mixed --hard --soft --patch --keep"
2477 return
2478 ;;
2479 esac
2480 __gitcomp_nl "$(__git_refs)"
2481}
2482
2483_git_revert ()
2484{
2485 local dir="$(__gitdir)"
2486 if [ -f "$dir"/REVERT_HEAD ]; then
2487 __gitcomp "--continue --quit --abort"
2488 return
2489 fi
2490 case "$cur" in
2491 --*)
2492 __gitcomp "
2493 --edit --mainline --no-edit --no-commit --signoff
2494 --strategy= --strategy-option=
2495 "
2496 return
2497 ;;
2498 esac
2499 __gitcomp_nl "$(__git_refs)"
2500}
2501
2502_git_rm ()
2503{
2504 case "$cur" in
2505 --*)
2506 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2507 return
2508 ;;
2509 esac
2510
2511 __git_complete_index_file "--cached"
2512}
2513
2514_git_shortlog ()
2515{
2516 __git_has_doubledash && return
2517
2518 case "$cur" in
2519 --*)
2520 __gitcomp "
2521 $__git_log_common_options
2522 $__git_log_shortlog_options
2523 --numbered --summary --email
2524 "
2525 return
2526 ;;
2527 esac
2528 __git_complete_revlist
2529}
2530
2531_git_show ()
2532{
2533 __git_has_doubledash && return
2534
2535 case "$cur" in
2536 --pretty=*|--format=*)
2537 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2538 " "" "${cur#*=}"
2539 return
2540 ;;
2541 --diff-algorithm=*)
2542 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2543 return
2544 ;;
2545 --submodule=*)
2546 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
2547 return
2548 ;;
2549 --*)
2550 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2551 --show-signature
2552 $__git_diff_common_options
2553 "
2554 return
2555 ;;
2556 esac
2557 __git_complete_revlist_file
2558}
2559
2560_git_show_branch ()
2561{
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
2569 "
2570 return
2571 ;;
2572 esac
2573 __git_complete_revlist
2574}
2575
2576_git_stash ()
2577{
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"
2585 ;;
2586 *)
2587 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2588 __gitcomp "$subcommands"
2589 fi
2590 ;;
2591 esac
2592 else
2593 case "$subcommand,$cur" in
2594 save,--*)
2595 __gitcomp "$save_opts"
2596 ;;
2597 apply,--*|pop,--*)
2598 __gitcomp "--index --quiet"
2599 ;;
2600 drop,--*)
2601 __gitcomp "--quiet"
2602 ;;
2603 show,--*|branch,--*)
2604 ;;
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')"
2611 fi
2612 ;;
2613 show,*|apply,*|drop,*|pop,*)
2614 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2615 | sed -n -e 's/:.*//p')"
2616 ;;
2617 *)
2618 ;;
2619 esac
2620 fi
2621}
2622
2623_git_submodule ()
2624{
2625 __git_has_doubledash && return
2626
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"
2633 ;;
2634 *)
2635 __gitcomp "$subcommands"
2636 ;;
2637 esac
2638 return
2639 fi
2640
2641 case "$subcommand,$cur" in
2642 add,--*)
2643 __gitcomp "--branch --force --name --reference --depth"
2644 ;;
2645 status,--*)
2646 __gitcomp "--cached --recursive"
2647 ;;
2648 deinit,--*)
2649 __gitcomp "--force --all"
2650 ;;
2651 update,--*)
2652 __gitcomp "
2653 --init --remote --no-fetch
2654 --recommend-shallow --no-recommend-shallow
2655 --force --rebase --merge --reference --depth --recursive --jobs
2656 "
2657 ;;
2658 summary,--*)
2659 __gitcomp "--cached --files --summary-limit"
2660 ;;
2661 foreach,--*|sync,--*)
2662 __gitcomp "--recursive"
2663 ;;
2664 *)
2665 ;;
2666 esac
2667}
2668
2669_git_svn ()
2670{
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
2676 "
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
2689 "
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
2695 "
2696 local cmt_opts="
2697 --edit --rmdir --find-copies-harder --copy-similarity=
2698 "
2699
2700 case "$subcommand,$cur" in
2701 fetch,--*)
2702 __gitcomp "--revision= --fetch-all $fc_opts"
2703 ;;
2704 clone,--*)
2705 __gitcomp "--revision= $fc_opts $init_opts"
2706 ;;
2707 init,--*)
2708 __gitcomp "$init_opts"
2709 ;;
2710 dcommit,--*)
2711 __gitcomp "
2712 --merge --strategy= --verbose --dry-run
2713 --fetch-all --no-rebase --commit-url
2714 --revision --interactive $cmt_opts $fc_opts
2715 "
2716 ;;
2717 set-tree,--*)
2718 __gitcomp "--stdin $cmt_opts $fc_opts"
2719 ;;
2720 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2721 show-externals,--*|mkdirs,--*)
2722 __gitcomp "--revision="
2723 ;;
2724 log,--*)
2725 __gitcomp "
2726 --limit= --revision= --verbose --incremental
2727 --oneline --show-commit --non-recursive
2728 --authors-file= --color
2729 "
2730 ;;
2731 rebase,--*)
2732 __gitcomp "
2733 --merge --verbose --strategy= --local
2734 --fetch-all --dry-run $fc_opts
2735 "
2736 ;;
2737 commit-diff,--*)
2738 __gitcomp "--message= --file= --revision= $cmt_opts"
2739 ;;
2740 info,--*)
2741 __gitcomp "--url"
2742 ;;
2743 branch,--*)
2744 __gitcomp "--dry-run --message --tag"
2745 ;;
2746 tag,--*)
2747 __gitcomp "--dry-run --message"
2748 ;;
2749 blame,--*)
2750 __gitcomp "--git-format"
2751 ;;
2752 migrate,--*)
2753 __gitcomp "
2754 --config-dir= --ignore-paths= --minimize
2755 --no-auth-cache --username=
2756 "
2757 ;;
2758 reset,--*)
2759 __gitcomp "--revision= --parent"
2760 ;;
2761 *)
2762 ;;
2763 esac
2764 fi
2765}
2766
2767_git_tag ()
2768{
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
2776 ;;
2777 -f)
2778 f=1
2779 ;;
2780 esac
2781 ((c++))
2782 done
2783
2784 case "$prev" in
2785 -m|-F)
2786 ;;
2787 -*|tag)
2788 if [ $f = 1 ]; then
2789 __gitcomp_nl "$(__git_tags)"
2790 fi
2791 ;;
2792 *)
2793 __gitcomp_nl "$(__git_refs)"
2794 ;;
2795 esac
2796
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
2803 "
2804 ;;
2805 esac
2806}
2807
2808_git_whatchanged ()
2809{
2810 _git_log
2811}
2812
2813_git_worktree ()
2814{
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"
2823 ;;
2824 list,--*)
2825 __gitcomp "--porcelain"
2826 ;;
2827 lock,--*)
2828 __gitcomp "--reason"
2829 ;;
2830 prune,--*)
2831 __gitcomp "--dry-run --expire --verbose"
2832 ;;
2833 *)
2834 ;;
2835 esac
2836 fi
2837}
2838
2839__git_main ()
2840{
2841 local i c=1 command __git_dir
2842
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
2856
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
2874 "
2875 ;;
2876 *) __git_compute_porcelain_commands
2877 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2878 esac
2879 return
2880 fi
2881
2882 local completion_func="_git_${command//-/_}"
2883 declare -f $completion_func >/dev/null && $completion_func && return
2884
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
2890 fi
2891}
2892
2893__gitk_main ()
2894{
2895 __git_has_doubledash && return
2896
2897 local g="$(__gitdir)"
2898 local merge=""
2899 if [ -f "$g/MERGE_HEAD" ]; then
2900 merge="--merge"
2901 fi
2902 case "$cur" in
2903 --*)
2904 __gitcomp "
2905 $__git_log_common_options
2906 $__git_log_gitk_options
2907 $merge
2908 "
2909 return
2910 ;;
2911 esac
2912 __git_complete_revlist
2913}
2914
2915if [[ -n ${ZSH_VERSION-} ]]; then
2916 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2917
2918 autoload -U +X compinit && compinit
2919
2920 __gitcomp ()
2921 {
2922 emulate -L zsh
2923
2924 local cur_="${3-$cur}"
2925
2926 case "$cur_" in
2927 --*=)
2928 ;;
2929 *)
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
2942 ;;
2943 esac
2944 }
2945
2946 __gitcomp_nl ()
2947 {
2948 emulate -L zsh
2949
2950 local IFS=$'\n'
2951 compset -P '*[=:]'
2952 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2953 }
2954
2955 __gitcomp_file ()
2956 {
2957 emulate -L zsh
2958
2959 local IFS=$'\n'
2960 compset -P '*[=:]'
2961 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2962 }
2963
2964 _git ()
2965 {
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
2973 }
2974
2975 compdef _git git gitk
2976 return
2977fi
2978
2979__git_func_wrap ()
2980{
2981 local cur words cword prev
2982 _get_comp_words_by_ref -n =: cur words cword prev
2983 $1
2984}
2985
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 ()
2990{
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
2995}
2996
2997# wrapper for backwards compatibility
2998_git ()
2999{
3000 __git_wrap__git_main
3001}
3002
3003# wrapper for backwards compatibility
3004_gitk ()
3005{
3006 __git_wrap__gitk_main
3007}
3008
3009__git_complete git __git_main
3010__git_complete gitk __gitk_main
3011
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.
3015#
3016if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
3017__git_complete git.exe __git_main
3018fi