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
342 if [ -d "$dir" ]; then
343 case "$cur" in
344 refs|refs/*)
345 format="refname"
346 refs="${cur%/*}"
347 track=""
348 ;;
349 *)
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"
355 ;;
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"
371 fi
372 done | sort | uniq -u
373 fi
374 return
375 fi
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
385 ;;
386 *)
387 echo "HEAD"
388 git for-each-ref --format="%(refname:short)" -- \
389 "refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##"
390 ;;
391 esac
392}
393
394# __git_refs2 requires 1 argument (to pass to __git_refs)
395__git_refs2 ()
396{
397 local i
398 for i in $(__git_refs "$1"); do
399 echo "$i:$i"
400 done
401}
402
403# __git_refs_remotes requires 1 argument (to pass to ls-remote)
404__git_refs_remotes ()
405{
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
411}
412
413__git_remotes ()
414{
415 local d="$(__gitdir)"
416 test -d "$d/remotes" && ls -1 "$d/remotes"
417 git --git-dir="$d" remote
418}
419
420__git_list_merge_strategies ()
421{
422 git merge -s help 2>&1 |
423 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
424 s/\.$//
425 s/.*://
426 s/^[ ]*//
427 s/[ ]*$//
428 p
429 }'
430}
431
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 ()
439{
440 test -n "$__git_merge_strategies" ||
441 __git_merge_strategies=$(__git_list_merge_strategies)
442}
443
444__git_complete_revlist_file ()
445{
446 local pfx ls ref cur_="$cur"
447 case "$cur_" in
448 *..?*:*)
449 return
450 ;;
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/"
460 ;;
461 *)
462 ls="$ref"
463 ;;
464 esac
465
466 case "$COMP_WORDBREAKS" in
467 *:*) : great ;;
468 *) pfx="$ref:$pfx" ;;
469 esac
470
471 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
472 | sed '/^100... blob /{
473 s,^.* ,,
474 s,$, ,
475 }
476 /^120000 blob /{
477 s,^.* ,,
478 s,$, ,
479 }
480 /^040000 tree /{
481 s,^.* ,,
482 s,$,/,
483 }
484 s/^.* //')" \
485 "$pfx" "$cur_" ""
486 ;;
487 *...*)
488 pfx="${cur_%...*}..."
489 cur_="${cur_#*...}"
490 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
491 ;;
492 *..*)
493 pfx="${cur_%..*}.."
494 cur_="${cur_#*..}"
495 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
496 ;;
497 *)
498 __gitcomp_nl "$(__git_refs)"
499 ;;
500 esac
501}
502
503
504# __git_complete_index_file requires 1 argument:
505# 1: the options to pass to ls-file
506#
507# The exception is --committable, which finds the files appropriate commit.
508__git_complete_index_file ()
509{
510 local pfx="" cur_="$cur"
511
512 case "$cur_" in
513 ?*/*)
514 pfx="${cur_%/*}"
515 cur_="${cur_##*/}"
516 pfx="${pfx}/"
517 ;;
518 esac
519
520 __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
521}
522
523__git_complete_file ()
524{
525 __git_complete_revlist_file
526}
527
528__git_complete_revlist ()
529{
530 __git_complete_revlist_file
531}
532
533__git_complete_remote_or_refspec ()
534{
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++))
539 fi
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
549 ;;
550 *) ;;
551 esac
552 ;;
553 -*) ;;
554 *) remote="$i"; break ;;
555 esac
556 ((c++))
557 done
558 if [ -z "$remote" ]; then
559 __gitcomp_nl "$(__git_remotes)"
560 return
561 fi
562 if [ $no_complete_refspec = 1 ]; then
563 return
564 fi
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
574 ;;
575 +*)
576 pfx="+"
577 cur_="${cur_#+}"
578 ;;
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_"
586 fi
587 ;;
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_"
593 fi
594 ;;
595 push)
596 if [ $lhs = 1 ]; then
597 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
598 else
599 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
600 fi
601 ;;
602 esac
603}
604
605__git_complete_strategy ()
606{
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
617 ;;
618 esac
619 return 1
620}
621
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]'
628 fi
629}
630
631__git_list_all_commands ()
632{
633 local i IFS=" "$'\n'
634 for i in $(__git_commands)
635 do
636 case $i in
637 *--*) : helper pattern;;
638 *) echo $i;;
639 esac
640 done
641}
642
643__git_all_commands=
644__git_compute_all_commands ()
645{
646 test -n "$__git_all_commands" ||
647 __git_all_commands=$(__git_list_all_commands)
648}
649
650__git_list_porcelain_commands ()
651{
652 local i IFS=" "$'\n'
653 __git_compute_all_commands
654 for i in $__git_all_commands
655 do
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
735}
736
737__git_porcelain_commands=
738__git_compute_porcelain_commands ()
739{
740 test -n "$__git_porcelain_commands" ||
741 __git_porcelain_commands=$(__git_list_porcelain_commands)
742}
743
744# Lists all set config variables starting with the given section prefix,
745# with the prefix removed.
746__git_get_config_variables ()
747{
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
752}
753
754__git_pretty_aliases ()
755{
756 __git_get_config_variables "pretty"
757}
758
759__git_aliases ()
760{
761 __git_get_config_variables "alias"
762}
763
764# __git_aliased_command requires 1 argument
765__git_aliased_command ()
766{
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
774 ;;
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 ;;
783 *)
784 echo "$word"
785 return
786 esac
787 done
788}
789
790# __git_find_on_cmdline requires 1 argument
791__git_find_on_cmdline ()
792{
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
800 fi
801 done
802 ((c++))
803 done
804}
805
806# Echo the value of an option set on the command line or config
807#
808# $1: short option name
809# $2: long option name including =
810# $3: list of possible values
811# $4: config string (optional)
812#
813# example:
814# result="$(__git_get_option_value "-d" "--do-something=" \
815# "yes no" "core.doSomething")"
816#
817# result is then either empty (no option set) or "yes" or "no"
818#
819# __git_get_option_value requires 3 arguments
820__git_get_option_value ()
821{
822 local c short_opt long_opt val
823 local result= values config_key word
824
825 short_opt="$1"
826 long_opt="$2"
827 values="$3"
828 config_key="$4"
829
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
838 fi
839 done
840 ((c--))
841 done
842
843 if [ -n "$config_key" ] && [ -z "$result" ]; then
844 result="$(git --git-dir="$(__gitdir)" config "$config_key")"
845 fi
846
847 echo "$result"
848}
849
850__git_has_doubledash ()
851{
852 local c=1
853 while [ $c -lt $cword ]; do
854 if [ "--" = "${words[c]}" ]; then
855 return 0
856 fi
857 ((c++))
858 done
859 return 1
860}
861
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
869#
870# __git_count_arguments requires 1 argument: the git command executed.
871__git_count_arguments ()
872{
873 local word i c=0
874
875 # Skip "git" (first argument)
876 for ((i=1; i < ${#words[@]}; i++)); do
877 word="${words[i]}"
878
879 case "$word" in
880 --)
881 # Good; we can assume that the following are only non
882 # option arguments.
883 ((c = 0))
884 ;;
885 "$1")
886 # Skip the specified git command and discard git
887 # main options
888 ((c = 0))
889 ;;
890 ?*)
891 ((c++))
892 ;;
893 esac
894 done
895
896 printf "%d" $c
897}
898
899__git_whitespacelist="nowarn warn error error-all fix"
900
901_git_am ()
902{
903 local dir="$(__gitdir)"
904 if [ -d "$dir"/rebase-apply ]; then
905 __gitcomp "--skip --continue --resolved --abort"
906 return
907 fi
908 case "$cur" in
909 --whitespace=*)
910 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
911 return
912 ;;
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
919 "
920 return
921 esac
922}
923
924_git_apply ()
925{
926 case "$cur" in
927 --whitespace=*)
928 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
929 return
930 ;;
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
938 "
939 return
940 esac
941}
942
943_git_add ()
944{
945 case "$cur" in
946 --*)
947 __gitcomp "
948 --interactive --refresh --patch --update --dry-run
949 --ignore-errors --intent-to-add
950 "
951 return
952 esac
953
954 # XXX should we check for --update and --all options ?
955 __git_complete_index_file "--others --modified --directory --no-empty-directory"
956}
957
958_git_archive ()
959{
960 case "$cur" in
961 --format=*)
962 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
963 return
964 ;;
965 --remote=*)
966 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
967 return
968 ;;
969 --*)
970 __gitcomp "
971 --format= --list --verbose
972 --prefix= --remote= --exec=
973 "
974 return
975 ;;
976 esac
977 __git_complete_file
978}
979
980_git_bisect ()
981{
982 __git_has_doubledash && return
983
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"
991 fi
992 return
993 fi
994
995 case "$subcommand" in
996 bad|good|reset|skip|start)
997 __gitcomp_nl "$(__git_refs)"
998 ;;
999 *)
1000 ;;
1001 esac
1002}
1003
1004_git_branch ()
1005{
1006 local i c=1 only_local_ref="n" has_r="n"
1007
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
1016
1017 case "$cur" in
1018 --set-upstream-to=*)
1019 __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}"
1020 ;;
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
1027 "
1028 ;;
1029 *)
1030 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1031 __gitcomp_nl "$(__git_heads)"
1032 else
1033 __gitcomp_nl "$(__git_refs)"
1034 fi
1035 ;;
1036 esac
1037}
1038
1039_git_bundle ()
1040{
1041 local cmd="${words[2]}"
1042 case "$cword" in
1043 2)
1044 __gitcomp "create list-heads verify unbundle"
1045 ;;
1046 3)
1047 # looking for a file
1048 ;;
1049 *)
1050 case "$cmd" in
1051 create)
1052 __git_complete_revlist
1053 ;;
1054 esac
1055 ;;
1056 esac
1057}
1058
1059_git_checkout ()
1060{
1061 __git_has_doubledash && return
1062
1063 case "$cur" in
1064 --conflict=*)
1065 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1066 ;;
1067 --*)
1068 __gitcomp "
1069 --quiet --ours --theirs --track --no-track --merge
1070 --conflict= --orphan --patch
1071 "
1072 ;;
1073 *)
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=''
1079 fi
1080 __gitcomp_nl "$(__git_refs '' $track)"
1081 ;;
1082 esac
1083}
1084
1085_git_cherry ()
1086{
1087 __gitcomp_nl "$(__git_refs)"
1088}
1089
1090_git_cherry_pick ()
1091{
1092 local dir="$(__gitdir)"
1093 if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1094 __gitcomp "--continue --quit --abort"
1095 return
1096 fi
1097 case "$cur" in
1098 --*)
1099 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1100 ;;
1101 *)
1102 __gitcomp_nl "$(__git_refs)"
1103 ;;
1104 esac
1105}
1106
1107_git_clean ()
1108{
1109 case "$cur" in
1110 --*)
1111 __gitcomp "--dry-run --quiet"
1112 return
1113 ;;
1114 esac
1115
1116 # XXX should we check for -x option ?
1117 __git_complete_index_file "--others --directory"
1118}
1119
1120_git_clone ()
1121{
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
1140 "
1141 return
1142 ;;
1143 esac
1144}
1145
1146__git_untracked_file_modes="all no normal"
1147
1148_git_commit ()
1149{
1150 case "$prev" in
1151 -c|-C)
1152 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1153 return
1154 ;;
1155 esac
1156
1157 case "$cur" in
1158 --cleanup=*)
1159 __gitcomp "default scissors strip verbatim whitespace
1160 " "" "${cur##--cleanup=}"
1161 return
1162 ;;
1163 --reuse-message=*|--reedit-message=*|\
1164 --fixup=*|--squash=*)
1165 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1166 return
1167 ;;
1168 --untracked-files=*)
1169 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1170 return
1171 ;;
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=
1181 "
1182 return
1183 esac
1184
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"
1190 fi
1191}
1192
1193_git_describe ()
1194{
1195 case "$cur" in
1196 --*)
1197 __gitcomp "
1198 --all --tags --contains --abbrev= --candidates=
1199 --exact-match --debug --long --match --always
1200 "
1201 return
1202 esac
1203 __gitcomp_nl "$(__git_refs)"
1204}
1205
1206__git_diff_algorithms="myers minimal patience histogram"
1207
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=
1223"
1224
1225_git_diff ()
1226{
1227 __git_has_doubledash && return
1228
1229 case "$cur" in
1230 --diff-algorithm=*)
1231 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1232 return
1233 ;;
1234 --*)
1235 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1236 --base --ours --theirs --no-index
1237 $__git_diff_common_options
1238 "
1239 return
1240 ;;
1241 esac
1242 __git_complete_revlist_file
1243}
1244
1245__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1246 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
1247"
1248
1249_git_difftool ()
1250{
1251 __git_has_doubledash && return
1252
1253 case "$cur" in
1254 --tool=*)
1255 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1256 return
1257 ;;
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
1265 ;;
1266 esac
1267 __git_complete_revlist_file
1268}
1269
1270__git_fetch_recurse_submodules="yes on-demand no"
1271
1272__git_fetch_options="
1273 --quiet --verbose --append --upload-pack --force --keep --depth=
1274 --tags --no-tags --all --prune --dry-run --recurse-submodules=
1275"
1276
1277_git_fetch ()
1278{
1279 case "$cur" in
1280 --recurse-submodules=*)
1281 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1282 return
1283 ;;
1284 --*)
1285 __gitcomp "$__git_fetch_options"
1286 return
1287 ;;
1288 esac
1289 __git_complete_remote_or_refspec
1290}
1291
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
1299"
1300
1301_git_format_patch ()
1302{
1303 case "$cur" in
1304 --thread=*)
1305 __gitcomp "
1306 deep shallow
1307 " "" "${cur##--thread=}"
1308 return
1309 ;;
1310 --*)
1311 __gitcomp "$__git_format_patch_options"
1312 return
1313 ;;
1314 esac
1315 __git_complete_revlist
1316}
1317
1318_git_fsck ()
1319{
1320 case "$cur" in
1321 --*)
1322 __gitcomp "
1323 --tags --root --unreachable --cache --no-reflogs --full
1324 --strict --verbose --lost-found
1325 "
1326 return
1327 ;;
1328 esac
1329}
1330
1331_git_gc ()
1332{
1333 case "$cur" in
1334 --*)
1335 __gitcomp "--prune --aggressive"
1336 return
1337 ;;
1338 esac
1339}
1340
1341_git_gitk ()
1342{
1343 _gitk
1344}
1345
1346__git_match_ctag() {
1347 awk "/^${1//\//\\/}/ { print \$1 }" "$2"
1348}
1349
1350_git_grep ()
1351{
1352 __git_has_doubledash && return
1353
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
1368 "
1369 return
1370 ;;
1371 esac
1372
1373 case "$cword,$prev" in
1374 2,*|*,-*)
1375 if test -r tags; then
1376 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1377 return
1378 fi
1379 ;;
1380 esac
1381
1382 __gitcomp_nl "$(__git_refs)"
1383}
1384
1385_git_help ()
1386{
1387 case "$cur" in
1388 --*)
1389 __gitcomp "--all --guides --info --man --web"
1390 return
1391 ;;
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
1399 "
1400}
1401
1402_git_init ()
1403{
1404 case "$cur" in
1405 --shared=*)
1406 __gitcomp "
1407 false true umask group all world everybody
1408 " "" "${cur##--shared=}"
1409 return
1410 ;;
1411 --*)
1412 __gitcomp "--quiet --bare --template= --shared --shared="
1413 return
1414 ;;
1415 esac
1416}
1417
1418_git_ls_files ()
1419{
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
1428 "
1429 return
1430 ;;
1431 esac
1432
1433 # XXX ignore options like --modified and always suggest all cached
1434 # files.
1435 __git_complete_index_file "--cached"
1436}
1437
1438_git_ls_remote ()
1439{
1440 __gitcomp_nl "$(__git_remotes)"
1441}
1442
1443_git_ls_tree ()
1444{
1445 __git_complete_file
1446}
1447
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
1458"
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
1464"
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
1469"
1470
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"
1473
1474_git_log ()
1475{
1476 __git_has_doubledash && return
1477
1478 local g="$(git rev-parse --git-dir 2>/dev/null)"
1479 local merge=""
1480 if [ -f "$g/MERGE_HEAD" ]; then
1481 merge="--merge"
1482 fi
1483 case "$cur" in
1484 --pretty=*|--format=*)
1485 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1486 " "" "${cur#*=}"
1487 return
1488 ;;
1489 --date=*)
1490 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1491 return
1492 ;;
1493 --decorate=*)
1494 __gitcomp "full short no" "" "${cur##--decorate=}"
1495 return
1496 ;;
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
1517 "
1518 return
1519 ;;
1520 esac
1521 __git_complete_revlist
1522}
1523
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
1530"
1531
1532_git_merge ()
1533{
1534 __git_complete_strategy && return
1535
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)"
1543}
1544
1545_git_mergetool ()
1546{
1547 case "$cur" in
1548 --tool=*)
1549 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1550 return
1551 ;;
1552 --*)
1553 __gitcomp "--tool="
1554 return
1555 ;;
1556 esac
1557}
1558
1559_git_merge_base ()
1560{
1561 case "$cur" in
1562 --*)
1563 __gitcomp "--octopus --independent --is-ancestor --fork-point"
1564 return
1565 ;;
1566 esac
1567 __gitcomp_nl "$(__git_refs)"
1568}
1569
1570_git_mv ()
1571{
1572 case "$cur" in
1573 --*)
1574 __gitcomp "--dry-run"
1575 return
1576 ;;
1577 esac
1578
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"
1585 fi
1586}
1587
1588_git_name_rev ()
1589{
1590 __gitcomp "--tags --all --stdin"
1591}
1592
1593_git_notes ()
1594{
1595 local subcommands='add append copy edit list prune remove show'
1596 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1597
1598 case "$subcommand,$cur" in
1599 ,--*)
1600 __gitcomp '--ref'
1601 ;;
1602 ,*)
1603 case "$prev" in
1604 --ref)
1605 __gitcomp_nl "$(__git_refs)"
1606 ;;
1607 *)
1608 __gitcomp "$subcommands --ref"
1609 ;;
1610 esac
1611 ;;
1612 add,--reuse-message=*|append,--reuse-message=*|\
1613 add,--reedit-message=*|append,--reedit-message=*)
1614 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1615 ;;
1616 add,--*|append,--*)
1617 __gitcomp '--file= --message= --reedit-message=
1618 --reuse-message='
1619 ;;
1620 copy,--*)
1621 __gitcomp '--stdin'
1622 ;;
1623 prune,--*)
1624 __gitcomp '--dry-run --verbose'
1625 ;;
1626 prune,*)
1627 ;;
1628 *)
1629 case "$prev" in
1630 -m|-F)
1631 ;;
1632 *)
1633 __gitcomp_nl "$(__git_refs)"
1634 ;;
1635 esac
1636 ;;
1637 esac
1638}
1639
1640_git_pull ()
1641{
1642 __git_complete_strategy && return
1643
1644 case "$cur" in
1645 --recurse-submodules=*)
1646 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1647 return
1648 ;;
1649 --*)
1650 __gitcomp "
1651 --rebase --no-rebase
1652 $__git_merge_options
1653 $__git_fetch_options
1654 "
1655 return
1656 ;;
1657 esac
1658 __git_complete_remote_or_refspec
1659}
1660
1661__git_push_recurse_submodules="check on-demand"
1662
1663__git_complete_force_with_lease ()
1664{
1665 local cur_=$1
1666
1667 case "$cur_" in
1668 --*=)
1669 ;;
1670 *:*)
1671 __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
1672 ;;
1673 *)
1674 __gitcomp_nl "$(__git_refs)" "" "$cur_"
1675 ;;
1676 esac
1677}
1678
1679_git_push ()
1680{
1681 case "$prev" in
1682 --repo)
1683 __gitcomp_nl "$(__git_remotes)"
1684 return
1685 ;;
1686 --recurse-submodules)
1687 __gitcomp "$__git_push_recurse_submodules"
1688 return
1689 ;;
1690 esac
1691 case "$cur" in
1692 --repo=*)
1693 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1694 return
1695 ;;
1696 --recurse-submodules=*)
1697 __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1698 return
1699 ;;
1700 --force-with-lease=*)
1701 __git_complete_force_with_lease "${cur##--force-with-lease=}"
1702 return
1703 ;;
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=
1710 "
1711 return
1712 ;;
1713 esac
1714 __git_complete_remote_or_refspec
1715}
1716
1717_git_rebase ()
1718{
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
1726 fi
1727 __git_complete_strategy && return
1728 case "$cur" in
1729 --whitespace=*)
1730 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1731 return
1732 ;;
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
1745 "
1746
1747 return
1748 esac
1749 __gitcomp_nl "$(__git_refs)"
1750}
1751
1752_git_reflog ()
1753{
1754 local subcommands="show delete expire"
1755 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1756
1757 if [ -z "$subcommand" ]; then
1758 __gitcomp "$subcommands"
1759 else
1760 __gitcomp_nl "$(__git_refs)"
1761 fi
1762}
1763
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"
1766
1767_git_send_email ()
1768{
1769 case "$prev" in
1770 --to|--cc|--bcc|--from)
1771 __gitcomp "
1772 $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1773 "
1774 return
1775 ;;
1776 esac
1777
1778 case "$cur" in
1779 --confirm=*)
1780 __gitcomp "
1781 $__git_send_email_confirm_options
1782 " "" "${cur##--confirm=}"
1783 return
1784 ;;
1785 --suppress-cc=*)
1786 __gitcomp "
1787 $__git_send_email_suppresscc_options
1788 " "" "${cur##--suppress-cc=}"
1789
1790 return
1791 ;;
1792 --smtp-encryption=*)
1793 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1794 return
1795 ;;
1796 --thread=*)
1797 __gitcomp "
1798 deep shallow
1799 " "" "${cur##--thread=}"
1800 return
1801 ;;
1802 --to=*|--cc=*|--bcc=*|--from=*)
1803 __gitcomp "
1804 $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1805 " "" "${cur#--*=}"
1806 return
1807 ;;
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
1820 ;;
1821 esac
1822 __git_complete_revlist
1823}
1824
1825_git_stage ()
1826{
1827 _git_add
1828}
1829
1830_git_status ()
1831{
1832 local complete_opt
1833 local untracked_state
1834
1835 case "$cur" in
1836 --ignore-submodules=*)
1837 __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
1838 return
1839 ;;
1840 --untracked-files=*)
1841 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1842 return
1843 ;;
1844 --column=*)
1845 __gitcomp "
1846 always never auto column row plain dense nodense
1847 " "" "${cur##--column=}"
1848 return
1849 ;;
1850 --*)
1851 __gitcomp "
1852 --short --branch --porcelain --long --verbose
1853 --untracked-files= --ignore-submodules= --ignored
1854 --column= --no-column
1855 "
1856 return
1857 ;;
1858 esac
1859
1860 untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
1861 "$__git_untracked_file_modes" "status.showUntrackedFiles")"
1862
1863 case "$untracked_state" in
1864 no)
1865 # --ignored option does not matter
1866 complete_opt=
1867 ;;
1868 all|normal|*)
1869 complete_opt="--cached --directory --no-empty-directory --others"
1870
1871 if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
1872 complete_opt="$complete_opt --ignored --exclude=*"
1873 fi
1874 ;;
1875 esac
1876
1877 __git_complete_index_file "$complete_opt"
1878}
1879
1880__git_config_get_set_variables ()
1881{
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
1889 ;;
1890 -f|--file)
1891 config_file="$word $prevword"
1892 break
1893 ;;
1894 esac
1895 prevword=$word
1896 c=$((--c))
1897 done
1898
1899 git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
1900}
1901
1902_git_config ()
1903{
1904 case "$prev" in
1905 branch.*.remote|branch.*.pushremote)
1906 __gitcomp_nl "$(__git_remotes)"
1907 return
1908 ;;
1909 branch.*.merge)
1910 __gitcomp_nl "$(__git_refs)"
1911 return
1912 ;;
1913 branch.*.rebase)
1914 __gitcomp "false true preserve interactive"
1915 return
1916 ;;
1917 remote.pushdefault)
1918 __gitcomp_nl "$(__git_remotes)"
1919 return
1920 ;;
1921 remote.*.fetch)
1922 local remote="${prev#remote.}"
1923 remote="${remote%.fetch}"
1924 if [ -z "$cur" ]; then
1925 __gitcomp_nl "refs/heads/" "" "" ""
1926 return
1927 fi
1928 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1929 return
1930 ;;
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
1938 ;;
1939 pull.twohead|pull.octopus)
1940 __git_compute_merge_strategies
1941 __gitcomp "$__git_merge_strategies"
1942 return
1943 ;;
1944 color.branch|color.diff|color.interactive|\
1945 color.showbranch|color.status|color.ui)
1946 __gitcomp "always never auto"
1947 return
1948 ;;
1949 color.pager)
1950 __gitcomp "false true"
1951 return
1952 ;;
1953 color.*.*)
1954 __gitcomp "
1955 normal black red green yellow blue magenta cyan white
1956 bold dim ul blink reverse
1957 "
1958 return
1959 ;;
1960 diff.submodule)
1961 __gitcomp "log short"
1962 return
1963 ;;
1964 help.format)
1965 __gitcomp "man info web html"
1966 return
1967 ;;
1968 log.date)
1969 __gitcomp "$__git_log_date_formats"
1970 return
1971 ;;
1972 sendemail.aliasesfiletype)
1973 __gitcomp "mutt mailrc pine elm gnus"
1974 return
1975 ;;
1976 sendemail.confirm)
1977 __gitcomp "$__git_send_email_confirm_options"
1978 return
1979 ;;
1980 sendemail.suppresscc)
1981 __gitcomp "$__git_send_email_suppresscc_options"
1982 return
1983 ;;
1984 sendemail.transferencoding)
1985 __gitcomp "7bit 8bit quoted-printable base64"
1986 return
1987 ;;
1988 --get|--get-all|--unset|--unset-all)
1989 __gitcomp_nl "$(__git_config_get_set_variables)"
1990 return
1991 ;;
1992 *.*)
1993 return
1994 ;;
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
2005 "
2006 return
2007 ;;
2008 branch.*.*)
2009 local pfx="${cur%.*}." cur_="${cur##*.}"
2010 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
2011 return
2012 ;;
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
2018 ;;
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
2026 ;;
2027 difftool.*.*)
2028 local pfx="${cur%.*}." cur_="${cur##*.}"
2029 __gitcomp "cmd path" "$pfx" "$cur_"
2030 return
2031 ;;
2032 man.*.*)
2033 local pfx="${cur%.*}." cur_="${cur##*.}"
2034 __gitcomp "cmd path" "$pfx" "$cur_"
2035 return
2036 ;;
2037 mergetool.*.*)
2038 local pfx="${cur%.*}." cur_="${cur##*.}"
2039 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
2040 return
2041 ;;
2042 pager.*)
2043 local pfx="${cur%.*}." cur_="${cur#*.}"
2044 __git_compute_all_commands
2045 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
2046 return
2047 ;;
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
2055 ;;
2056 remote.*)
2057 local pfx="${cur%.*}." cur_="${cur#*.}"
2058 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
2059 __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
2060 return
2061 ;;
2062 url.*.*)
2063 local pfx="${cur%.*}." cur_="${cur##*.}"
2064 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2065 return
2066 ;;
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
2194 gc.
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.
2355 "
2356}
2357
2358_git_remote ()
2359{
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
2365 fi
2366
2367 case "$subcommand" in
2368 rename|remove|set-url|show|prune)
2369 __gitcomp_nl "$(__git_remotes)"
2370 ;;
2371 set-head|set-branches)
2372 __git_complete_remote_or_refspec
2373 ;;
2374 update)
2375 __gitcomp "$(__git_get_config_variables "remotes")"
2376 ;;
2377 *)
2378 ;;
2379 esac
2380}
2381
2382_git_replace ()
2383{
2384 __gitcomp_nl "$(__git_refs)"
2385}
2386
2387_git_reset ()
2388{
2389 __git_has_doubledash && return
2390
2391 case "$cur" in
2392 --*)
2393 __gitcomp "--merge --mixed --hard --soft --patch"
2394 return
2395 ;;
2396 esac
2397 __gitcomp_nl "$(__git_refs)"
2398}
2399
2400_git_revert ()
2401{
2402 local dir="$(__gitdir)"
2403 if [ -f "$dir"/REVERT_HEAD ]; then
2404 __gitcomp "--continue --quit --abort"
2405 return
2406 fi
2407 case "$cur" in
2408 --*)
2409 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2410 return
2411 ;;
2412 esac
2413 __gitcomp_nl "$(__git_refs)"
2414}
2415
2416_git_rm ()
2417{
2418 case "$cur" in
2419 --*)
2420 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2421 return
2422 ;;
2423 esac
2424
2425 __git_complete_index_file "--cached"
2426}
2427
2428_git_shortlog ()
2429{
2430 __git_has_doubledash && return
2431
2432 case "$cur" in
2433 --*)
2434 __gitcomp "
2435 $__git_log_common_options
2436 $__git_log_shortlog_options
2437 --numbered --summary
2438 "
2439 return
2440 ;;
2441 esac
2442 __git_complete_revlist
2443}
2444
2445_git_show ()
2446{
2447 __git_has_doubledash && return
2448
2449 case "$cur" in
2450 --pretty=*|--format=*)
2451 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2452 " "" "${cur#*=}"
2453 return
2454 ;;
2455 --diff-algorithm=*)
2456 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2457 return
2458 ;;
2459 --*)
2460 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2461 --show-signature
2462 $__git_diff_common_options
2463 "
2464 return
2465 ;;
2466 esac
2467 __git_complete_revlist_file
2468}
2469
2470_git_show_branch ()
2471{
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
2479 "
2480 return
2481 ;;
2482 esac
2483 __git_complete_revlist
2484}
2485
2486_git_stash ()
2487{
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"
2495 ;;
2496 *)
2497 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2498 __gitcomp "$subcommands"
2499 fi
2500 ;;
2501 esac
2502 else
2503 case "$subcommand,$cur" in
2504 save,--*)
2505 __gitcomp "$save_opts"
2506 ;;
2507 apply,--*|pop,--*)
2508 __gitcomp "--index --quiet"
2509 ;;
2510 drop,--*)
2511 __gitcomp "--quiet"
2512 ;;
2513 show,--*|branch,--*)
2514 ;;
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')"
2521 fi
2522 ;;
2523 show,*|apply,*|drop,*|pop,*)
2524 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2525 | sed -n -e 's/:.*//p')"
2526 ;;
2527 *)
2528 ;;
2529 esac
2530 fi
2531}
2532
2533_git_submodule ()
2534{
2535 __git_has_doubledash && return
2536
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"
2542 ;;
2543 *)
2544 __gitcomp "$subcommands"
2545 ;;
2546 esac
2547 return
2548 fi
2549}
2550
2551_git_svn ()
2552{
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
2558 "
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
2570 "
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
2577 "
2578 local cmt_opts="
2579 --edit --rmdir --find-copies-harder --copy-similarity=
2580 "
2581
2582 case "$subcommand,$cur" in
2583 fetch,--*)
2584 __gitcomp "--revision= --fetch-all $fc_opts"
2585 ;;
2586 clone,--*)
2587 __gitcomp "--revision= $fc_opts $init_opts"
2588 ;;
2589 init,--*)
2590 __gitcomp "$init_opts"
2591 ;;
2592 dcommit,--*)
2593 __gitcomp "
2594 --merge --strategy= --verbose --dry-run
2595 --fetch-all --no-rebase --commit-url
2596 --revision --interactive $cmt_opts $fc_opts
2597 "
2598 ;;
2599 set-tree,--*)
2600 __gitcomp "--stdin $cmt_opts $fc_opts"
2601 ;;
2602 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2603 show-externals,--*|mkdirs,--*)
2604 __gitcomp "--revision="
2605 ;;
2606 log,--*)
2607 __gitcomp "
2608 --limit= --revision= --verbose --incremental
2609 --oneline --show-commit --non-recursive
2610 --authors-file= --color
2611 "
2612 ;;
2613 rebase,--*)
2614 __gitcomp "
2615 --merge --verbose --strategy= --local
2616 --fetch-all --dry-run $fc_opts
2617 "
2618 ;;
2619 commit-diff,--*)
2620 __gitcomp "--message= --file= --revision= $cmt_opts"
2621 ;;
2622 info,--*)
2623 __gitcomp "--url"
2624 ;;
2625 branch,--*)
2626 __gitcomp "--dry-run --message --tag"
2627 ;;
2628 tag,--*)
2629 __gitcomp "--dry-run --message"
2630 ;;
2631 blame,--*)
2632 __gitcomp "--git-format"
2633 ;;
2634 migrate,--*)
2635 __gitcomp "
2636 --config-dir= --ignore-paths= --minimize
2637 --no-auth-cache --username=
2638 "
2639 ;;
2640 reset,--*)
2641 __gitcomp "--revision= --parent"
2642 ;;
2643 *)
2644 ;;
2645 esac
2646 fi
2647}
2648
2649_git_tag ()
2650{
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
2658 ;;
2659 -f)
2660 f=1
2661 ;;
2662 esac
2663 ((c++))
2664 done
2665
2666 case "$prev" in
2667 -m|-F)
2668 ;;
2669 -*|tag)
2670 if [ $f = 1 ]; then
2671 __gitcomp_nl "$(__git_tags)"
2672 fi
2673 ;;
2674 *)
2675 __gitcomp_nl "$(__git_refs)"
2676 ;;
2677 esac
2678
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
2685 "
2686 ;;
2687 esac
2688}
2689
2690_git_whatchanged ()
2691{
2692 _git_log
2693}
2694
2695_git_worktree ()
2696{
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"
2705 ;;
2706 list,--*)
2707 __gitcomp "--porcelain"
2708 ;;
2709 lock,--*)
2710 __gitcomp "--reason"
2711 ;;
2712 prune,--*)
2713 __gitcomp "--dry-run --expire --verbose"
2714 ;;
2715 *)
2716 ;;
2717 esac
2718 fi
2719}
2720
2721__git_main ()
2722{
2723 local i c=1 command __git_dir
2724
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
2738
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
2756 "
2757 ;;
2758 *) __git_compute_porcelain_commands
2759 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2760 esac
2761 return
2762 fi
2763
2764 local completion_func="_git_${command//-/_}"
2765 declare -f $completion_func >/dev/null && $completion_func && return
2766
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
2772 fi
2773}
2774
2775__gitk_main ()
2776{
2777 __git_has_doubledash && return
2778
2779 local g="$(__gitdir)"
2780 local merge=""
2781 if [ -f "$g/MERGE_HEAD" ]; then
2782 merge="--merge"
2783 fi
2784 case "$cur" in
2785 --*)
2786 __gitcomp "
2787 $__git_log_common_options
2788 $__git_log_gitk_options
2789 $merge
2790 "
2791 return
2792 ;;
2793 esac
2794 __git_complete_revlist
2795}
2796
2797if [[ -n ${ZSH_VERSION-} ]]; then
2798 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2799
2800 autoload -U +X compinit && compinit
2801
2802 __gitcomp ()
2803 {
2804 emulate -L zsh
2805
2806 local cur_="${3-$cur}"
2807
2808 case "$cur_" in
2809 --*=)
2810 ;;
2811 *)
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
2824 ;;
2825 esac
2826 }
2827
2828 __gitcomp_nl ()
2829 {
2830 emulate -L zsh
2831
2832 local IFS=$'\n'
2833 compset -P '*[=:]'
2834 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2835 }
2836
2837 __gitcomp_file ()
2838 {
2839 emulate -L zsh
2840
2841 local IFS=$'\n'
2842 compset -P '*[=:]'
2843 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2844 }
2845
2846 _git ()
2847 {
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
2855 }
2856
2857 compdef _git git gitk
2858 return
2859fi
2860
2861__git_func_wrap ()
2862{
2863 local cur words cword prev
2864 _get_comp_words_by_ref -n =: cur words cword prev
2865 $1
2866}
2867
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 ()
2872{
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
2877}
2878
2879# wrapper for backwards compatibility
2880_git ()
2881{
2882 __git_wrap__git_main
2883}
2884
2885# wrapper for backwards compatibility
2886_gitk ()
2887{
2888 __git_wrap__gitk_main
2889}
2890
2891__git_complete git __git_main
2892__git_complete gitk __gitk_main
2893
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.
2897#
2898if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2899__git_complete git.exe __git_main
2900fi