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.from
2186 format.headers
2187 format.numbered
2188 format.pretty
2189 format.signature
2190 format.signoff
2191 format.subjectprefix
2192 format.suffix
2193 format.thread
2194 format.to
2195 gc.
2196 gc.aggressiveWindow
2197 gc.auto
2198 gc.autopacklimit
2199 gc.packrefs
2200 gc.pruneexpire
2201 gc.reflogexpire
2202 gc.reflogexpireunreachable
2203 gc.rerereresolved
2204 gc.rerereunresolved
2205 gitcvs.allbinary
2206 gitcvs.commitmsgannotation
2207 gitcvs.dbTableNamePrefix
2208 gitcvs.dbdriver
2209 gitcvs.dbname
2210 gitcvs.dbpass
2211 gitcvs.dbuser
2212 gitcvs.enabled
2213 gitcvs.logfile
2214 gitcvs.usecrlfattr
2215 guitool.
2216 gui.blamehistoryctx
2217 gui.commitmsgwidth
2218 gui.copyblamethreshold
2219 gui.diffcontext
2220 gui.encoding
2221 gui.fastcopyblame
2222 gui.matchtrackingbranch
2223 gui.newbranchtemplate
2224 gui.pruneduringfetch
2225 gui.spellingdictionary
2226 gui.trustmtime
2227 help.autocorrect
2228 help.browser
2229 help.format
2230 http.lowSpeedLimit
2231 http.lowSpeedTime
2232 http.maxRequests
2233 http.minSessions
2234 http.noEPSV
2235 http.postBuffer
2236 http.proxy
2237 http.sslCipherList
2238 http.sslVersion
2239 http.sslCAInfo
2240 http.sslCAPath
2241 http.sslCert
2242 http.sslCertPasswordProtected
2243 http.sslKey
2244 http.sslVerify
2245 http.useragent
2246 i18n.commitEncoding
2247 i18n.logOutputEncoding
2248 imap.authMethod
2249 imap.folder
2250 imap.host
2251 imap.pass
2252 imap.port
2253 imap.preformattedHTML
2254 imap.sslverify
2255 imap.tunnel
2256 imap.user
2257 init.templatedir
2258 instaweb.browser
2259 instaweb.httpd
2260 instaweb.local
2261 instaweb.modulepath
2262 instaweb.port
2263 interactive.singlekey
2264 log.date
2265 log.decorate
2266 log.showroot
2267 mailmap.file
2268 man.
2269 man.viewer
2270 merge.
2271 merge.conflictstyle
2272 merge.log
2273 merge.renameLimit
2274 merge.renormalize
2275 merge.stat
2276 merge.tool
2277 merge.verbosity
2278 mergetool.
2279 mergetool.keepBackup
2280 mergetool.keepTemporaries
2281 mergetool.prompt
2282 notes.displayRef
2283 notes.rewrite.
2284 notes.rewrite.amend
2285 notes.rewrite.rebase
2286 notes.rewriteMode
2287 notes.rewriteRef
2288 pack.compression
2289 pack.deltaCacheLimit
2290 pack.deltaCacheSize
2291 pack.depth
2292 pack.indexVersion
2293 pack.packSizeLimit
2294 pack.threads
2295 pack.window
2296 pack.windowMemory
2297 pager.
2298 pretty.
2299 pull.octopus
2300 pull.twohead
2301 push.default
2302 push.followTags
2303 rebase.autosquash
2304 rebase.stat
2305 receive.autogc
2306 receive.denyCurrentBranch
2307 receive.denyDeleteCurrent
2308 receive.denyDeletes
2309 receive.denyNonFastForwards
2310 receive.fsckObjects
2311 receive.unpackLimit
2312 receive.updateserverinfo
2313 remote.pushdefault
2314 remotes.
2315 repack.usedeltabaseoffset
2316 rerere.autoupdate
2317 rerere.enabled
2318 sendemail.
2319 sendemail.aliasesfile
2320 sendemail.aliasfiletype
2321 sendemail.bcc
2322 sendemail.cc
2323 sendemail.cccmd
2324 sendemail.chainreplyto
2325 sendemail.confirm
2326 sendemail.envelopesender
2327 sendemail.from
2328 sendemail.identity
2329 sendemail.multiedit
2330 sendemail.signedoffbycc
2331 sendemail.smtpdomain
2332 sendemail.smtpencryption
2333 sendemail.smtppass
2334 sendemail.smtpserver
2335 sendemail.smtpserveroption
2336 sendemail.smtpserverport
2337 sendemail.smtpuser
2338 sendemail.suppresscc
2339 sendemail.suppressfrom
2340 sendemail.thread
2341 sendemail.to
2342 sendemail.validate
2343 showbranch.default
2344 status.relativePaths
2345 status.showUntrackedFiles
2346 status.submodulesummary
2347 submodule.
2348 tar.umask
2349 transfer.unpackLimit
2350 url.
2351 user.email
2352 user.name
2353 user.signingkey
2354 web.browser
2355 branch. remote.
2356 "
2357}
2358
2359_git_remote ()
2360{
2361 local subcommands="add rename remove set-head set-branches set-url show prune update"
2362 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2363 if [ -z "$subcommand" ]; then
2364 __gitcomp "$subcommands"
2365 return
2366 fi
2367
2368 case "$subcommand" in
2369 rename|remove|set-url|show|prune)
2370 __gitcomp_nl "$(__git_remotes)"
2371 ;;
2372 set-head|set-branches)
2373 __git_complete_remote_or_refspec
2374 ;;
2375 update)
2376 __gitcomp "$(__git_get_config_variables "remotes")"
2377 ;;
2378 *)
2379 ;;
2380 esac
2381}
2382
2383_git_replace ()
2384{
2385 __gitcomp_nl "$(__git_refs)"
2386}
2387
2388_git_reset ()
2389{
2390 __git_has_doubledash && return
2391
2392 case "$cur" in
2393 --*)
2394 __gitcomp "--merge --mixed --hard --soft --patch"
2395 return
2396 ;;
2397 esac
2398 __gitcomp_nl "$(__git_refs)"
2399}
2400
2401_git_revert ()
2402{
2403 local dir="$(__gitdir)"
2404 if [ -f "$dir"/REVERT_HEAD ]; then
2405 __gitcomp "--continue --quit --abort"
2406 return
2407 fi
2408 case "$cur" in
2409 --*)
2410 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2411 return
2412 ;;
2413 esac
2414 __gitcomp_nl "$(__git_refs)"
2415}
2416
2417_git_rm ()
2418{
2419 case "$cur" in
2420 --*)
2421 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2422 return
2423 ;;
2424 esac
2425
2426 __git_complete_index_file "--cached"
2427}
2428
2429_git_shortlog ()
2430{
2431 __git_has_doubledash && return
2432
2433 case "$cur" in
2434 --*)
2435 __gitcomp "
2436 $__git_log_common_options
2437 $__git_log_shortlog_options
2438 --numbered --summary
2439 "
2440 return
2441 ;;
2442 esac
2443 __git_complete_revlist
2444}
2445
2446_git_show ()
2447{
2448 __git_has_doubledash && return
2449
2450 case "$cur" in
2451 --pretty=*|--format=*)
2452 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2453 " "" "${cur#*=}"
2454 return
2455 ;;
2456 --diff-algorithm=*)
2457 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2458 return
2459 ;;
2460 --*)
2461 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2462 --show-signature
2463 $__git_diff_common_options
2464 "
2465 return
2466 ;;
2467 esac
2468 __git_complete_revlist_file
2469}
2470
2471_git_show_branch ()
2472{
2473 case "$cur" in
2474 --*)
2475 __gitcomp "
2476 --all --remotes --topo-order --date-order --current --more=
2477 --list --independent --merge-base --no-name
2478 --color --no-color
2479 --sha1-name --sparse --topics --reflog
2480 "
2481 return
2482 ;;
2483 esac
2484 __git_complete_revlist
2485}
2486
2487_git_stash ()
2488{
2489 local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
2490 local subcommands='save list show apply clear drop pop create branch'
2491 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2492 if [ -z "$subcommand" ]; then
2493 case "$cur" in
2494 --*)
2495 __gitcomp "$save_opts"
2496 ;;
2497 *)
2498 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2499 __gitcomp "$subcommands"
2500 fi
2501 ;;
2502 esac
2503 else
2504 case "$subcommand,$cur" in
2505 save,--*)
2506 __gitcomp "$save_opts"
2507 ;;
2508 apply,--*|pop,--*)
2509 __gitcomp "--index --quiet"
2510 ;;
2511 drop,--*)
2512 __gitcomp "--quiet"
2513 ;;
2514 show,--*|branch,--*)
2515 ;;
2516 branch,*)
2517 if [ $cword -eq 3 ]; then
2518 __gitcomp_nl "$(__git_refs)";
2519 else
2520 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2521 | sed -n -e 's/:.*//p')"
2522 fi
2523 ;;
2524 show,*|apply,*|drop,*|pop,*)
2525 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2526 | sed -n -e 's/:.*//p')"
2527 ;;
2528 *)
2529 ;;
2530 esac
2531 fi
2532}
2533
2534_git_submodule ()
2535{
2536 __git_has_doubledash && return
2537
2538 local subcommands="add status init deinit update summary foreach sync"
2539 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2540 case "$cur" in
2541 --*)
2542 __gitcomp "--quiet --cached"
2543 ;;
2544 *)
2545 __gitcomp "$subcommands"
2546 ;;
2547 esac
2548 return
2549 fi
2550}
2551
2552_git_svn ()
2553{
2554 local subcommands="
2555 init fetch clone rebase dcommit log find-rev
2556 set-tree commit-diff info create-ignore propget
2557 proplist show-ignore show-externals branch tag blame
2558 migrate mkdirs reset gc
2559 "
2560 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2561 if [ -z "$subcommand" ]; then
2562 __gitcomp "$subcommands"
2563 else
2564 local remote_opts="--username= --config-dir= --no-auth-cache"
2565 local fc_opts="
2566 --follow-parent --authors-file= --repack=
2567 --no-metadata --use-svm-props --use-svnsync-props
2568 --log-window-size= --no-checkout --quiet
2569 --repack-flags --use-log-author --localtime
2570 --ignore-paths= --include-paths= $remote_opts
2571 "
2572 local init_opts="
2573 --template= --shared= --trunk= --tags=
2574 --branches= --stdlayout --minimize-url
2575 --no-metadata --use-svm-props --use-svnsync-props
2576 --rewrite-root= --prefix= --use-log-author
2577 --add-author-from $remote_opts
2578 "
2579 local cmt_opts="
2580 --edit --rmdir --find-copies-harder --copy-similarity=
2581 "
2582
2583 case "$subcommand,$cur" in
2584 fetch,--*)
2585 __gitcomp "--revision= --fetch-all $fc_opts"
2586 ;;
2587 clone,--*)
2588 __gitcomp "--revision= $fc_opts $init_opts"
2589 ;;
2590 init,--*)
2591 __gitcomp "$init_opts"
2592 ;;
2593 dcommit,--*)
2594 __gitcomp "
2595 --merge --strategy= --verbose --dry-run
2596 --fetch-all --no-rebase --commit-url
2597 --revision --interactive $cmt_opts $fc_opts
2598 "
2599 ;;
2600 set-tree,--*)
2601 __gitcomp "--stdin $cmt_opts $fc_opts"
2602 ;;
2603 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2604 show-externals,--*|mkdirs,--*)
2605 __gitcomp "--revision="
2606 ;;
2607 log,--*)
2608 __gitcomp "
2609 --limit= --revision= --verbose --incremental
2610 --oneline --show-commit --non-recursive
2611 --authors-file= --color
2612 "
2613 ;;
2614 rebase,--*)
2615 __gitcomp "
2616 --merge --verbose --strategy= --local
2617 --fetch-all --dry-run $fc_opts
2618 "
2619 ;;
2620 commit-diff,--*)
2621 __gitcomp "--message= --file= --revision= $cmt_opts"
2622 ;;
2623 info,--*)
2624 __gitcomp "--url"
2625 ;;
2626 branch,--*)
2627 __gitcomp "--dry-run --message --tag"
2628 ;;
2629 tag,--*)
2630 __gitcomp "--dry-run --message"
2631 ;;
2632 blame,--*)
2633 __gitcomp "--git-format"
2634 ;;
2635 migrate,--*)
2636 __gitcomp "
2637 --config-dir= --ignore-paths= --minimize
2638 --no-auth-cache --username=
2639 "
2640 ;;
2641 reset,--*)
2642 __gitcomp "--revision= --parent"
2643 ;;
2644 *)
2645 ;;
2646 esac
2647 fi
2648}
2649
2650_git_tag ()
2651{
2652 local i c=1 f=0
2653 while [ $c -lt $cword ]; do
2654 i="${words[c]}"
2655 case "$i" in
2656 -d|-v)
2657 __gitcomp_nl "$(__git_tags)"
2658 return
2659 ;;
2660 -f)
2661 f=1
2662 ;;
2663 esac
2664 ((c++))
2665 done
2666
2667 case "$prev" in
2668 -m|-F)
2669 ;;
2670 -*|tag)
2671 if [ $f = 1 ]; then
2672 __gitcomp_nl "$(__git_tags)"
2673 fi
2674 ;;
2675 *)
2676 __gitcomp_nl "$(__git_refs)"
2677 ;;
2678 esac
2679
2680 case "$cur" in
2681 --*)
2682 __gitcomp "
2683 --list --delete --verify --annotate --message --file
2684 --sign --cleanup --local-user --force --column --sort
2685 --contains --points-at
2686 "
2687 ;;
2688 esac
2689}
2690
2691_git_whatchanged ()
2692{
2693 _git_log
2694}
2695
2696_git_worktree ()
2697{
2698 local subcommands="add list lock prune unlock"
2699 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2700 if [ -z "$subcommand" ]; then
2701 __gitcomp "$subcommands"
2702 else
2703 case "$subcommand,$cur" in
2704 add,--*)
2705 __gitcomp "--detach"
2706 ;;
2707 list,--*)
2708 __gitcomp "--porcelain"
2709 ;;
2710 lock,--*)
2711 __gitcomp "--reason"
2712 ;;
2713 prune,--*)
2714 __gitcomp "--dry-run --expire --verbose"
2715 ;;
2716 *)
2717 ;;
2718 esac
2719 fi
2720}
2721
2722__git_main ()
2723{
2724 local i c=1 command __git_dir
2725
2726 while [ $c -lt $cword ]; do
2727 i="${words[c]}"
2728 case "$i" in
2729 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2730 --git-dir) ((c++)) ; __git_dir="${words[c]}" ;;
2731 --bare) __git_dir="." ;;
2732 --help) command="help"; break ;;
2733 -c|--work-tree|--namespace) ((c++)) ;;
2734 -*) ;;
2735 *) command="$i"; break ;;
2736 esac
2737 ((c++))
2738 done
2739
2740 if [ -z "$command" ]; then
2741 case "$cur" in
2742 --*) __gitcomp "
2743 --paginate
2744 --no-pager
2745 --git-dir=
2746 --bare
2747 --version
2748 --exec-path
2749 --exec-path=
2750 --html-path
2751 --man-path
2752 --info-path
2753 --work-tree=
2754 --namespace=
2755 --no-replace-objects
2756 --help
2757 "
2758 ;;
2759 *) __git_compute_porcelain_commands
2760 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2761 esac
2762 return
2763 fi
2764
2765 local completion_func="_git_${command//-/_}"
2766 declare -f $completion_func >/dev/null && $completion_func && return
2767
2768 local expansion=$(__git_aliased_command "$command")
2769 if [ -n "$expansion" ]; then
2770 words[1]=$expansion
2771 completion_func="_git_${expansion//-/_}"
2772 declare -f $completion_func >/dev/null && $completion_func
2773 fi
2774}
2775
2776__gitk_main ()
2777{
2778 __git_has_doubledash && return
2779
2780 local g="$(__gitdir)"
2781 local merge=""
2782 if [ -f "$g/MERGE_HEAD" ]; then
2783 merge="--merge"
2784 fi
2785 case "$cur" in
2786 --*)
2787 __gitcomp "
2788 $__git_log_common_options
2789 $__git_log_gitk_options
2790 $merge
2791 "
2792 return
2793 ;;
2794 esac
2795 __git_complete_revlist
2796}
2797
2798if [[ -n ${ZSH_VERSION-} ]]; then
2799 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2800
2801 autoload -U +X compinit && compinit
2802
2803 __gitcomp ()
2804 {
2805 emulate -L zsh
2806
2807 local cur_="${3-$cur}"
2808
2809 case "$cur_" in
2810 --*=)
2811 ;;
2812 *)
2813 local c IFS=$' \t\n'
2814 local -a array
2815 for c in ${=1}; do
2816 c="$c${4-}"
2817 case $c in
2818 --*=*|*.) ;;
2819 *) c="$c " ;;
2820 esac
2821 array[${#array[@]}+1]="$c"
2822 done
2823 compset -P '*[=:]'
2824 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2825 ;;
2826 esac
2827 }
2828
2829 __gitcomp_nl ()
2830 {
2831 emulate -L zsh
2832
2833 local IFS=$'\n'
2834 compset -P '*[=:]'
2835 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2836 }
2837
2838 __gitcomp_file ()
2839 {
2840 emulate -L zsh
2841
2842 local IFS=$'\n'
2843 compset -P '*[=:]'
2844 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2845 }
2846
2847 _git ()
2848 {
2849 local _ret=1 cur cword prev
2850 cur=${words[CURRENT]}
2851 prev=${words[CURRENT-1]}
2852 let cword=CURRENT-1
2853 emulate ksh -c __${service}_main
2854 let _ret && _default && _ret=0
2855 return _ret
2856 }
2857
2858 compdef _git git gitk
2859 return
2860fi
2861
2862__git_func_wrap ()
2863{
2864 local cur words cword prev
2865 _get_comp_words_by_ref -n =: cur words cword prev
2866 $1
2867}
2868
2869# Setup completion for certain functions defined above by setting common
2870# variables and workarounds.
2871# This is NOT a public function; use at your own risk.
2872__git_complete ()
2873{
2874 local wrapper="__git_wrap${2}"
2875 eval "$wrapper () { __git_func_wrap $2 ; }"
2876 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2877 || complete -o default -o nospace -F $wrapper $1
2878}
2879
2880# wrapper for backwards compatibility
2881_git ()
2882{
2883 __git_wrap__git_main
2884}
2885
2886# wrapper for backwards compatibility
2887_gitk ()
2888{
2889 __git_wrap__gitk_main
2890}
2891
2892__git_complete git __git_main
2893__git_complete gitk __gitk_main
2894
2895# The following are necessary only for Cygwin, and only are needed
2896# when the user has tab-completed the executable name and consequently
2897# included the '.exe' suffix.
2898#
2899if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2900__git_complete git.exe __git_main
2901fi