completion: add subcommand completion for rerere
[git/git.git] / contrib / completion / git-completion.bash
CommitLineData
b5a49471 1# bash/zsh completion support for core Git.
690d8824 2#
c70680ce 3# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
690d8824 4# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
c70680ce 5# Distributed under the GNU General Public License, version 2.0.
690d8824
JH
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'
dfbe5eeb 13# *) git email aliases for git-send-email
690d8824 14# *) tree paths within 'ref:path/to/file' expressions
fea16b47 15# *) file paths within current working directory and index
c70680ce 16# *) common --long-options
690d8824
JH
17#
18# To use these routines:
19#
0e5ed7cc 20# 1) Copy this file to somewhere (e.g. ~/.git-completion.bash).
b5a49471 21# 2) Add the following line to your .bashrc/.zshrc:
0e5ed7cc 22# source ~/.git-completion.bash
af31a456
FC
23# 3) Consider changing your PS1 to also show the current branch,
24# see git-prompt.sh for details.
56f24e80
SP
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 ; ... '".
690d8824 31
db8a9ff0
SP
32case "$COMP_WORDBREAKS" in
33*:*) : great ;;
34*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
35esac
36
a42577d4
TP
37# __gitdir accepts 0 or 1 arguments (i.e., location)
38# returns location of .git repo
873537fa
SP
39__gitdir ()
40{
25a31f81 41 if [ -z "${1-}" ]; then
5c9cc64a 42 if [ -n "${__git_dir-}" ]; then
67ffa114 43 echo "$__git_dir"
b7be4366
SG
44 elif [ -n "${GIT_DIR-}" ]; then
45 test -d "${GIT_DIR-}" || return 1
46 echo "$GIT_DIR"
67ffa114
SP
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
873537fa
SP
57}
58
dbda3b10
JN
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
da48616f
PD
158if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
159_get_comp_words_by_ref ()
160{
dbda3b10
JN
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_]}
da48616f
PD
168 while [ $# -gt 0 ]; do
169 case "$1" in
170 cur)
dbda3b10 171 cur=$cur_
da48616f
PD
172 ;;
173 prev)
dbda3b10 174 prev=${words_[$cword_-1]}
da48616f
PD
175 ;;
176 words)
dbda3b10 177 words=("${words_[@]}")
da48616f
PD
178 ;;
179 cword)
dbda3b10 180 cword=$cword_
da48616f
PD
181 ;;
182 esac
183 shift
184 done
185}
186fi
187
f33c2c0f 188__gitcompappend ()
1ce23aad 189{
852ff1c3 190 local x i=${#COMPREPLY[@]}
7d13e0a3
FC
191 for x in $1; do
192 if [[ "$x" == "$3"* ]]; then
193 COMPREPLY[i++]="$2$x$4"
194 fi
195 done
1ce23aad
FC
196}
197
f33c2c0f
RR
198__gitcompadd ()
199{
200 COMPREPLY=()
201 __gitcompappend "$@"
202}
203
7d13e0a3
FC
204# Generates completion reply, appending a space to possible completion words,
205# if necessary.
f674bb80
SG
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).
72e5e989
SP
211__gitcomp ()
212{
583e4d57 213 local cur_="${3-$cur}"
9244d69b 214
9244d69b 215 case "$cur_" in
5447aac7 216 --*=)
5447aac7
SG
217 ;;
218 *)
b4cfbc96
FC
219 local c i=0 IFS=$' \t\n'
220 for c in $1; do
221 c="$c${4-}"
b4cfbc96 222 if [[ $c == "$cur_"* ]]; then
ddc996d7
FC
223 case $c in
224 --*=*|*.) ;;
225 *) c="$c " ;;
226 esac
b4cfbc96
FC
227 COMPREPLY[i++]="${2-}$c"
228 fi
229 done
5447aac7
SG
230 ;;
231 esac
72e5e989
SP
232}
233
f33c2c0f
RR
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
7d13e0a3
FC
242# Generates completion reply from newline-separated possible completion words
243# by appending a space to all of them.
a31e6262
SG
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{
f33c2c0f
RR
253 COMPREPLY=()
254 __gitcomp_nl_append "$@"
a31e6262
SG
255}
256
fea16b47
MP
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.
0afe8e9e 272 __gitcompadd "$1" "${2-}" "${3-$cur}" ""
fea16b47 273
3ffa4df4 274 # use a hack to enable file mode in bash < 4
fbe45118 275 compopt -o filenames +o nospace 2>/dev/null ||
3ffa4df4 276 compgen -f /non-existing-dir/ > /dev/null
fea16b47
MP
277}
278
f825972c
FC
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.
fea16b47
MP
283__git_ls_files_helper ()
284{
fca416a4
JH
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
35ba83cc 291}
fea16b47
MP
292
293
fea16b47
MP
294# __git_index_files accepts 1 or 2 arguments:
295# 1: Options to pass to ls-files (required).
fea16b47
MP
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{
c29e3179 302 local dir="$(__gitdir)" root="${2-.}" file
fea16b47
MP
303
304 if [ -d "$dir" ]; then
c29e3179
FC
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
fea16b47
MP
312 fi
313}
314
5de40f59
SP
315__git_heads ()
316{
6486ca6d 317 local dir="$(__gitdir)"
5de40f59 318 if [ -d "$dir" ]; then
05e8b3d6
SG
319 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
320 refs/heads
5de40f59
SP
321 return
322 fi
5de40f59
SP
323}
324
88e21dc7
SP
325__git_tags ()
326{
6486ca6d 327 local dir="$(__gitdir)"
88e21dc7 328 if [ -d "$dir" ]; then
05e8b3d6
SG
329 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
330 refs/tags
88e21dc7
SP
331 return
332 fi
88e21dc7
SP
333}
334
34a6bbb5
KB
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
690d8824
JH
338__git_refs ()
339{
d8c0453e 340 local i hash dir="$(__gitdir "${1-}")" track="${2-}"
49416ad2 341 local format refs pfx
873537fa 342 if [ -d "$dir" ]; then
608efb87
SG
343 case "$cur" in
344 refs|refs/*)
345 format="refname"
346 refs="${cur%/*}"
34a6bbb5 347 track=""
608efb87
SG
348 ;;
349 *)
49416ad2 350 [[ "$cur" == ^* ]] && pfx="^"
d23e7570 351 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
49416ad2 352 if [ -e "$dir/$i" ]; then echo $pfx$i; fi
d23e7570 353 done
608efb87
SG
354 format="refname:short"
355 refs="refs/tags refs/heads refs/remotes"
356 ;;
357 esac
49416ad2 358 git --git-dir="$dir" for-each-ref --format="$pfx%($format)" \
608efb87 359 $refs
34a6bbb5
KB
360 if [ -n "$track" ]; then
361 # employ the heuristic used by git checkout
362 # Try to find a remote branch that matches the completion word
363 # but only output if the branch name is unique
364 local ref entry
365 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
366 "refs/remotes/" | \
6f2dd720 367 while read -r entry; do
34a6bbb5
KB
368 eval "$entry"
369 ref="${ref#*/}"
370 if [[ "$ref" == "$cur"* ]]; then
371 echo "$ref"
372 fi
4db42b38 373 done | sort | uniq -u
34a6bbb5 374 fi
35e65ecc 375 return
690d8824 376 fi
fb772cca
SG
377 case "$cur" in
378 refs|refs/*)
379 git ls-remote "$dir" "$cur*" 2>/dev/null | \
6f2dd720 380 while read -r hash i; do
fb772cca
SG
381 case "$i" in
382 *^{}) ;;
383 *) echo "$i" ;;
384 esac
385 done
386 ;;
387 *)
e832f5c0 388 echo "HEAD"
8f7ff5b2
JS
389 git for-each-ref --format="%(refname:short)" -- \
390 "refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##"
fb772cca
SG
391 ;;
392 esac
690d8824
JH
393}
394
a42577d4 395# __git_refs2 requires 1 argument (to pass to __git_refs)
690d8824
JH
396__git_refs2 ()
397{
67ffa114
SP
398 local i
399 for i in $(__git_refs "$1"); do
400 echo "$i:$i"
690d8824
JH
401 done
402}
403
a42577d4 404# __git_refs_remotes requires 1 argument (to pass to ls-remote)
5de40f59
SP
405__git_refs_remotes ()
406{
48058f5d
SG
407 local i hash
408 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
6f2dd720 409 while read -r hash i; do
48058f5d 410 echo "$i:refs/remotes/$1/${i#refs/heads/}"
5de40f59
SP
411 done
412}
413
690d8824
JH
414__git_remotes ()
415{
53e53c7c 416 local d="$(__gitdir)"
d79f81ad 417 test -d "$d/remotes" && ls -1 "$d/remotes"
53e53c7c 418 git --git-dir="$d" remote
690d8824
JH
419}
420
eaa4e6ee 421__git_list_merge_strategies ()
4ad91321 422{
25b3d4d6
JH
423 git merge -s help 2>&1 |
424 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
425 s/\.$//
426 s/.*://
427 s/^[ ]*//
428 s/[ ]*$//
4ad91321 429 p
25b3d4d6 430 }'
4ad91321 431}
eaa4e6ee
JN
432
433__git_merge_strategies=
434# 'git merge -s help' (and thus detection of the merge strategy
435# list) fails, unfortunately, if run outside of any git working
436# tree. __git_merge_strategies is set to the empty string in
437# that case, and the detection will be repeated the next time it
438# is needed.
439__git_compute_merge_strategies ()
440{
cf0ff02a
FC
441 test -n "$__git_merge_strategies" ||
442 __git_merge_strategies=$(__git_list_merge_strategies)
eaa4e6ee 443}
4ad91321 444
1d66ec58 445__git_complete_revlist_file ()
690d8824 446{
da4902a7 447 local pfx ls ref cur_="$cur"
9244d69b 448 case "$cur_" in
1d66ec58
SG
449 *..?*:*)
450 return
451 ;;
690d8824 452 ?*:*)
9244d69b
SG
453 ref="${cur_%%:*}"
454 cur_="${cur_#*:}"
455 case "$cur_" in
690d8824 456 ?*/*)
9244d69b
SG
457 pfx="${cur_%/*}"
458 cur_="${cur_##*/}"
690d8824
JH
459 ls="$ref:$pfx"
460 pfx="$pfx/"
461 ;;
462 *)
463 ls="$ref"
464 ;;
80152b09 465 esac
db8a9ff0
SP
466
467 case "$COMP_WORDBREAKS" in
468 *:*) : great ;;
469 *) pfx="$ref:$pfx" ;;
470 esac
471
ca87dd62 472 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
778306e4
SP
473 | sed '/^100... blob /{
474 s,^.* ,,
475 s,$, ,
476 }
477 /^120000 blob /{
478 s,^.* ,,
479 s,$, ,
480 }
690d8824
JH
481 /^040000 tree /{
482 s,^.* ,,
483 s,$,/,
484 }
485 s/^.* //')" \
41e6229d 486 "$pfx" "$cur_" ""
690d8824 487 ;;
f53352fb 488 *...*)
9244d69b
SG
489 pfx="${cur_%...*}..."
490 cur_="${cur_#*...}"
a31e6262 491 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
f53352fb
SP
492 ;;
493 *..*)
9244d69b
SG
494 pfx="${cur_%..*}.."
495 cur_="${cur_#*..}"
a31e6262 496 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
b3391775 497 ;;
f53352fb 498 *)
a31e6262 499 __gitcomp_nl "$(__git_refs)"
f53352fb
SP
500 ;;
501 esac
502}
503
1d66ec58 504
f825972c
FC
505# __git_complete_index_file requires 1 argument:
506# 1: the options to pass to ls-file
507#
508# The exception is --committable, which finds the files appropriate commit.
fea16b47
MP
509__git_complete_index_file ()
510{
fda54ef1 511 local pfx="" cur_="$cur"
fea16b47
MP
512
513 case "$cur_" in
514 ?*/*)
515 pfx="${cur_%/*}"
516 cur_="${cur_##*/}"
517 pfx="${pfx}/"
fea16b47
MP
518 ;;
519 esac
fea16b47 520
fca416a4 521 __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
fea16b47
MP
522}
523
1d66ec58
SG
524__git_complete_file ()
525{
526 __git_complete_revlist_file
527}
528
529__git_complete_revlist ()
530{
531 __git_complete_revlist_file
532}
533
52d5c3b5
JS
534__git_complete_remote_or_refspec ()
535{
9244d69b 536 local cur_="$cur" cmd="${words[1]}"
0a4e1472 537 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
f1c6ffe6 538 if [ "$cmd" = "remote" ]; then
6e8c755f 539 ((c++))
f1c6ffe6 540 fi
da48616f
PD
541 while [ $c -lt $cword ]; do
542 i="${words[c]}"
52d5c3b5 543 case "$i" in
e25e2b42
BG
544 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
545 --all)
546 case "$cmd" in
547 push) no_complete_refspec=1 ;;
548 fetch)
e25e2b42
BG
549 return
550 ;;
551 *) ;;
552 esac
553 ;;
52d5c3b5
JS
554 -*) ;;
555 *) remote="$i"; break ;;
556 esac
6e8c755f 557 ((c++))
52d5c3b5
JS
558 done
559 if [ -z "$remote" ]; then
a31e6262 560 __gitcomp_nl "$(__git_remotes)"
52d5c3b5
JS
561 return
562 fi
0a4e1472 563 if [ $no_complete_refspec = 1 ]; then
0a4e1472
JS
564 return
565 fi
52d5c3b5 566 [ "$remote" = "." ] && remote=
9244d69b 567 case "$cur_" in
52d5c3b5
JS
568 *:*)
569 case "$COMP_WORDBREAKS" in
570 *:*) : great ;;
9244d69b 571 *) pfx="${cur_%%:*}:" ;;
52d5c3b5 572 esac
9244d69b 573 cur_="${cur_#*:}"
52d5c3b5
JS
574 lhs=0
575 ;;
576 +*)
577 pfx="+"
9244d69b 578 cur_="${cur_#+}"
52d5c3b5
JS
579 ;;
580 esac
581 case "$cmd" in
582 fetch)
583 if [ $lhs = 1 ]; then
a31e6262 584 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
52d5c3b5 585 else
a31e6262 586 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
52d5c3b5
JS
587 fi
588 ;;
f1c6ffe6 589 pull|remote)
52d5c3b5 590 if [ $lhs = 1 ]; then
a31e6262 591 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
52d5c3b5 592 else
a31e6262 593 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
52d5c3b5
JS
594 fi
595 ;;
596 push)
597 if [ $lhs = 1 ]; then
a31e6262 598 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
52d5c3b5 599 else
a31e6262 600 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
52d5c3b5
JS
601 fi
602 ;;
603 esac
604}
605
3c7b480a
JS
606__git_complete_strategy ()
607{
eaa4e6ee 608 __git_compute_merge_strategies
da48616f 609 case "$prev" in
3c7b480a 610 -s|--strategy)
eaa4e6ee 611 __gitcomp "$__git_merge_strategies"
3c7b480a
JS
612 return 0
613 esac
3c7b480a
JS
614 case "$cur" in
615 --strategy=*)
eaa4e6ee 616 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
3c7b480a
JS
617 return 0
618 ;;
619 esac
620 return 1
621}
622
50478223
JH
623__git_commands () {
624 if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
625 then
626 printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
627 else
628 git help -a|egrep '^ [a-zA-Z0-9]'
629 fi
630}
631
eaa4e6ee 632__git_list_all_commands ()
f2bb9f88
SP
633{
634 local i IFS=" "$'\n'
50478223 635 for i in $(__git_commands)
1eb7e2f8
LM
636 do
637 case $i in
638 *--*) : helper pattern;;
639 *) echo $i;;
640 esac
641 done
642}
1eb7e2f8 643
eaa4e6ee
JN
644__git_all_commands=
645__git_compute_all_commands ()
646{
cf0ff02a
FC
647 test -n "$__git_all_commands" ||
648 __git_all_commands=$(__git_list_all_commands)
eaa4e6ee
JN
649}
650
651__git_list_porcelain_commands ()
1eb7e2f8 652{
1eb7e2f8 653 local i IFS=" "$'\n'
eaa4e6ee 654 __git_compute_all_commands
585b96bd 655 for i in $__git_all_commands
f2bb9f88
SP
656 do
657 case $i in
718a087a 658 *--*) : helper pattern;;
a925c6f1
SP
659 applymbox) : ask gittus;;
660 applypatch) : ask gittus;;
661 archimport) : import;;
2e3a430a 662 cat-file) : plumbing;;
56d99c67 663 check-attr) : plumbing;;
368aa529 664 check-ignore) : plumbing;;
226ad348 665 check-mailmap) : plumbing;;
f2bb9f88 666 check-ref-format) : plumbing;;
ff2549dc 667 checkout-index) : plumbing;;
160fcdb0 668 column) : internal helper;;
f2bb9f88 669 commit-tree) : plumbing;;
ff2549dc 670 count-objects) : infrequent;;
a074aa90
SG
671 credential) : credentials;;
672 credential-*) : credentials helper;;
a925c6f1
SP
673 cvsexportcommit) : export;;
674 cvsimport) : import;;
f2bb9f88
SP
675 cvsserver) : daemon;;
676 daemon) : daemon;;
5cfb4fe5
SP
677 diff-files) : plumbing;;
678 diff-index) : plumbing;;
679 diff-tree) : plumbing;;
c6ec3b13 680 fast-import) : import;;
ff2549dc 681 fast-export) : export;;
a925c6f1 682 fsck-objects) : plumbing;;
f2bb9f88 683 fetch-pack) : plumbing;;
a925c6f1 684 fmt-merge-msg) : plumbing;;
56d99c67 685 for-each-ref) : plumbing;;
f2bb9f88
SP
686 hash-object) : plumbing;;
687 http-*) : transport;;
688 index-pack) : plumbing;;
a925c6f1 689 init-db) : deprecated;;
f2bb9f88 690 local-fetch) : plumbing;;
ff2549dc
PB
691 ls-files) : plumbing;;
692 ls-remote) : plumbing;;
693 ls-tree) : plumbing;;
f2bb9f88
SP
694 mailinfo) : plumbing;;
695 mailsplit) : plumbing;;
696 merge-*) : plumbing;;
697 mktree) : plumbing;;
698 mktag) : plumbing;;
699 pack-objects) : plumbing;;
700 pack-redundant) : plumbing;;
701 pack-refs) : plumbing;;
702 parse-remote) : plumbing;;
703 patch-id) : plumbing;;
a925c6f1
SP
704 prune) : plumbing;;
705 prune-packed) : plumbing;;
706 quiltimport) : import;;
f2bb9f88
SP
707 read-tree) : plumbing;;
708 receive-pack) : plumbing;;
63d04a78 709 remote-*) : transport;;
f2bb9f88
SP
710 rerere) : plumbing;;
711 rev-list) : plumbing;;
712 rev-parse) : plumbing;;
713 runstatus) : plumbing;;
714 sh-setup) : internal;;
715 shell) : daemon;;
ff2549dc 716 show-ref) : plumbing;;
f2bb9f88
SP
717 send-pack) : plumbing;;
718 show-index) : plumbing;;
719 ssh-*) : transport;;
720 stripspace) : plumbing;;
721 symbolic-ref) : plumbing;;
722 unpack-file) : plumbing;;
723 unpack-objects) : plumbing;;
a925c6f1 724 update-index) : plumbing;;
f2bb9f88
SP
725 update-ref) : plumbing;;
726 update-server-info) : daemon;;
727 upload-archive) : plumbing;;
728 upload-pack) : plumbing;;
729 write-tree) : plumbing;;
ff2549dc
PB
730 var) : infrequent;;
731 verify-pack) : infrequent;;
a925c6f1 732 verify-tag) : plumbing;;
f2bb9f88
SP
733 *) echo $i;;
734 esac
735 done
736}
eaa4e6ee
JN
737
738__git_porcelain_commands=
739__git_compute_porcelain_commands ()
740{
cf0ff02a
FC
741 test -n "$__git_porcelain_commands" ||
742 __git_porcelain_commands=$(__git_list_porcelain_commands)
eaa4e6ee 743}
f2bb9f88 744
e8f9e428
SG
745# Lists all set config variables starting with the given section prefix,
746# with the prefix removed.
747__git_get_config_variables ()
c3898111 748{
e8f9e428 749 local section="$1" i IFS=$'\n'
905f2036
SG
750 for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do
751 echo "${i#$section.}"
c3898111
SG
752 done
753}
754
c3898111
SG
755__git_pretty_aliases ()
756{
e8f9e428 757 __git_get_config_variables "pretty"
c3898111
SG
758}
759
367dce2a
DS
760__git_aliases ()
761{
e8f9e428 762 __git_get_config_variables "alias"
367dce2a
DS
763}
764
a42577d4 765# __git_aliased_command requires 1 argument
367dce2a
DS
766__git_aliased_command ()
767{
873537fa 768 local word cmdline=$(git --git-dir="$(__gitdir)" \
e0d10e1c 769 config --get "alias.$1")
367dce2a 770 for word in $cmdline; do
c63437cb 771 case "$word" in
66729509
SG
772 \!gitk|gitk)
773 echo "gitk"
367dce2a 774 return
66729509 775 ;;
c63437cb
SG
776 \!*) : shell command alias ;;
777 -*) : option ;;
778 *=*) : setting env ;;
779 git) : git itself ;;
56f24e80
SP
780 \(\)) : skip parens of shell function definition ;;
781 {) : skip start of shell helper function ;;
782 :) : skip null command ;;
783 \'*) : skip opening quote after sh -c ;;
c63437cb
SG
784 *)
785 echo "$word"
367dce2a 786 return
c63437cb 787 esac
367dce2a
DS
788 done
789}
790
918c03c2
SG
791# __git_find_on_cmdline requires 1 argument
792__git_find_on_cmdline ()
3ff1320d 793{
da4902a7 794 local word subcommand c=1
da48616f
PD
795 while [ $c -lt $cword ]; do
796 word="${words[c]}"
3ff1320d
SG
797 for subcommand in $1; do
798 if [ "$subcommand" = "$word" ]; then
799 echo "$subcommand"
800 return
801 fi
802 done
6e8c755f 803 ((c++))
3ff1320d
SG
804 done
805}
806
7c599e92
TB
807# Echo the value of an option set on the command line or config
808#
809# $1: short option name
810# $2: long option name including =
811# $3: list of possible values
812# $4: config string (optional)
813#
814# example:
815# result="$(__git_get_option_value "-d" "--do-something=" \
816# "yes no" "core.doSomething")"
817#
818# result is then either empty (no option set) or "yes" or "no"
819#
820# __git_get_option_value requires 3 arguments
821__git_get_option_value ()
822{
823 local c short_opt long_opt val
824 local result= values config_key word
825
826 short_opt="$1"
827 long_opt="$2"
828 values="$3"
829 config_key="$4"
830
831 ((c = $cword - 1))
832 while [ $c -ge 0 ]; do
833 word="${words[c]}"
834 for val in $values; do
835 if [ "$short_opt$val" = "$word" ] ||
836 [ "$long_opt$val" = "$word" ]; then
837 result="$val"
838 break 2
839 fi
840 done
841 ((c--))
842 done
843
844 if [ -n "$config_key" ] && [ -z "$result" ]; then
845 result="$(git --git-dir="$(__gitdir)" config "$config_key")"
846 fi
847
848 echo "$result"
849}
850
d773c631
SG
851__git_has_doubledash ()
852{
da4902a7 853 local c=1
da48616f
PD
854 while [ $c -lt $cword ]; do
855 if [ "--" = "${words[c]}" ]; then
d773c631
SG
856 return 0
857 fi
6e8c755f 858 ((c++))
d773c631
SG
859 done
860 return 1
861}
862
fea16b47
MP
863# Try to count non option arguments passed on the command line for the
864# specified git command.
865# When options are used, it is necessary to use the special -- option to
866# tell the implementation were non option arguments begin.
867# XXX this can not be improved, since options can appear everywhere, as
868# an example:
869# git mv x -n y
870#
871# __git_count_arguments requires 1 argument: the git command executed.
872__git_count_arguments ()
873{
874 local word i c=0
875
876 # Skip "git" (first argument)
877 for ((i=1; i < ${#words[@]}; i++)); do
878 word="${words[i]}"
879
880 case "$word" in
881 --)
882 # Good; we can assume that the following are only non
883 # option arguments.
884 ((c = 0))
885 ;;
886 "$1")
887 # Skip the specified git command and discard git
888 # main options
889 ((c = 0))
890 ;;
891 ?*)
892 ((c++))
893 ;;
894 esac
895 done
896
897 printf "%d" $c
898}
899
7950659d 900__git_whitespacelist="nowarn warn error error-all fix"
88329195
SP
901
902_git_am ()
903{
da4902a7 904 local dir="$(__gitdir)"
51ef1daa 905 if [ -d "$dir"/rebase-apply ]; then
85f6b439 906 __gitcomp "--skip --continue --resolved --abort"
88329195
SP
907 return
908 fi
909 case "$cur" in
910 --whitespace=*)
b3391775 911 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
912 return
913 ;;
914 --*)
b3391775 915 __gitcomp "
43acdf24 916 --3way --committer-date-is-author-date --ignore-date
86c91f91 917 --ignore-whitespace --ignore-space-change
43acdf24 918 --interactive --keep --no-utf8 --signoff --utf8
af4e9e8c 919 --whitespace= --scissors
b3391775 920 "
88329195
SP
921 return
922 esac
88329195
SP
923}
924
925_git_apply ()
926{
88329195
SP
927 case "$cur" in
928 --whitespace=*)
b3391775 929 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
930 return
931 ;;
932 --*)
b3391775 933 __gitcomp "
88329195
SP
934 --stat --numstat --summary --check --index
935 --cached --index-info --reverse --reject --unidiff-zero
936 --apply --no-add --exclude=
86c91f91 937 --ignore-whitespace --ignore-space-change
88329195 938 --whitespace= --inaccurate-eof --verbose
b3391775 939 "
88329195
SP
940 return
941 esac
88329195
SP
942}
943
8435b548
SP
944_git_add ()
945{
8435b548
SP
946 case "$cur" in
947 --*)
1d284cba
SG
948 __gitcomp "
949 --interactive --refresh --patch --update --dry-run
c9a114b5 950 --ignore-errors --intent-to-add
1d284cba 951 "
8435b548
SP
952 return
953 esac
fea16b47
MP
954
955 # XXX should we check for --update and --all options ?
ea95c7b8 956 __git_complete_index_file "--others --modified --directory --no-empty-directory"
8435b548
SP
957}
958
b3191ce2
LM
959_git_archive ()
960{
b3191ce2
LM
961 case "$cur" in
962 --format=*)
963 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
964 return
965 ;;
966 --remote=*)
a31e6262 967 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
b3191ce2
LM
968 return
969 ;;
970 --*)
971 __gitcomp "
972 --format= --list --verbose
973 --prefix= --remote= --exec=
974 "
975 return
976 ;;
977 esac
978 __git_complete_file
979}
980
b2e69f62
SP
981_git_bisect ()
982{
d773c631
SG
983 __git_has_doubledash && return
984
bf11d461 985 local subcommands="start bad good skip reset visualize replay log run"
918c03c2 986 local subcommand="$(__git_find_on_cmdline "$subcommands")"
3ff1320d 987 if [ -z "$subcommand" ]; then
128191f5
SG
988 if [ -f "$(__gitdir)"/BISECT_START ]; then
989 __gitcomp "$subcommands"
990 else
991 __gitcomp "replay start"
992 fi
b2e69f62
SP
993 return
994 fi
995
3ff1320d 996 case "$subcommand" in
8205ff8e 997 bad|good|reset|skip|start)
a31e6262 998 __gitcomp_nl "$(__git_refs)"
b2e69f62
SP
999 ;;
1000 *)
b2e69f62
SP
1001 ;;
1002 esac
1003}
1004
690d8824
JH
1005_git_branch ()
1006{
da4902a7 1007 local i c=1 only_local_ref="n" has_r="n"
b9217642 1008
da48616f
PD
1009 while [ $c -lt $cword ]; do
1010 i="${words[c]}"
b9217642 1011 case "$i" in
2703c22f
VS
1012 -d|--delete|-m|--move) only_local_ref="y" ;;
1013 -r|--remotes) has_r="y" ;;
b9217642 1014 esac
6e8c755f 1015 ((c++))
b9217642
SG
1016 done
1017
da48616f 1018 case "$cur" in
ca45d0fa 1019 --set-upstream-to=*)
260d5850 1020 __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}"
ca45d0fa 1021 ;;
3b376b0c
SG
1022 --*)
1023 __gitcomp "
1024 --color --no-color --verbose --abbrev= --no-abbrev
50e61025 1025 --track --no-track --contains --merged --no-merged
04308e9d 1026 --set-upstream-to= --edit-description --list
2703c22f 1027 --unset-upstream --delete --move --remotes
3b376b0c
SG
1028 "
1029 ;;
b9217642
SG
1030 *)
1031 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
a31e6262 1032 __gitcomp_nl "$(__git_heads)"
b9217642 1033 else
a31e6262 1034 __gitcomp_nl "$(__git_refs)"
b9217642
SG
1035 fi
1036 ;;
3b376b0c 1037 esac
690d8824
JH
1038}
1039
374a58c9
ML
1040_git_bundle ()
1041{
da48616f
PD
1042 local cmd="${words[2]}"
1043 case "$cword" in
8d8163f3 1044 2)
374a58c9
ML
1045 __gitcomp "create list-heads verify unbundle"
1046 ;;
8d8163f3 1047 3)
374a58c9
ML
1048 # looking for a file
1049 ;;
1050 *)
1051 case "$cmd" in
1052 create)
1053 __git_complete_revlist
1054 ;;
1055 esac
1056 ;;
1057 esac
1058}
1059
690d8824
JH
1060_git_checkout ()
1061{
c84bb14c
SG
1062 __git_has_doubledash && return
1063
e648f8b6
SG
1064 case "$cur" in
1065 --conflict=*)
1066 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1067 ;;
1068 --*)
1069 __gitcomp "
1070 --quiet --ours --theirs --track --no-track --merge
86e8e7a5 1071 --conflict= --orphan --patch
e648f8b6
SG
1072 "
1073 ;;
1074 *)
34a6bbb5
KB
1075 # check if --track, --no-track, or --no-guess was specified
1076 # if so, disable DWIM mode
1077 local flags="--track --no-track --no-guess" track=1
1078 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1079 track=''
1080 fi
a31e6262 1081 __gitcomp_nl "$(__git_refs '' $track)"
e648f8b6
SG
1082 ;;
1083 esac
690d8824
JH
1084}
1085
d8a9fea5
SP
1086_git_cherry ()
1087{
260d5850 1088 __gitcomp_nl "$(__git_refs)"
d8a9fea5
SP
1089}
1090
1273231e
SP
1091_git_cherry_pick ()
1092{
7655fa7f
FC
1093 local dir="$(__gitdir)"
1094 if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1095 __gitcomp "--continue --quit --abort"
1096 return
1097 fi
1273231e
SP
1098 case "$cur" in
1099 --*)
7655fa7f 1100 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1273231e
SP
1101 ;;
1102 *)
a31e6262 1103 __gitcomp_nl "$(__git_refs)"
1273231e
SP
1104 ;;
1105 esac
1106}
1107
4181c7e8
LM
1108_git_clean ()
1109{
4181c7e8
LM
1110 case "$cur" in
1111 --*)
1112 __gitcomp "--dry-run --quiet"
1113 return
1114 ;;
1115 esac
fea16b47
MP
1116
1117 # XXX should we check for -x option ?
ea95c7b8 1118 __git_complete_index_file "--others --directory"
4181c7e8
LM
1119}
1120
3eb11012
LM
1121_git_clone ()
1122{
3eb11012
LM
1123 case "$cur" in
1124 --*)
1125 __gitcomp "
1126 --local
1127 --no-hardlinks
1128 --shared
1129 --reference
1130 --quiet
1131 --no-checkout
1132 --bare
1133 --mirror
1134 --origin
1135 --upload-pack
1136 --template=
1137 --depth
4047fecf
RT
1138 --single-branch
1139 --branch
5f072e00 1140 --recurse-submodules
3eb11012
LM
1141 "
1142 return
1143 ;;
1144 esac
3eb11012
LM
1145}
1146
21d2a9e3
TB
1147__git_untracked_file_modes="all no normal"
1148
4548e855
SP
1149_git_commit ()
1150{
fea16b47
MP
1151 case "$prev" in
1152 -c|-C)
1153 __gitcomp_nl "$(__git_refs)" "" "${cur}"
1154 return
1155 ;;
1156 esac
d773c631 1157
4548e855 1158 case "$cur" in
9a424b27 1159 --cleanup=*)
72dbb365 1160 __gitcomp "default scissors strip verbatim whitespace
9a424b27
SG
1161 " "" "${cur##--cleanup=}"
1162 return
1163 ;;
77653abd
TM
1164 --reuse-message=*|--reedit-message=*|\
1165 --fixup=*|--squash=*)
a31e6262 1166 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
9a424b27
SG
1167 return
1168 ;;
1169 --untracked-files=*)
21d2a9e3 1170 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
9a424b27
SG
1171 return
1172 ;;
4548e855 1173 --*)
b3391775 1174 __gitcomp "
4548e855 1175 --all --author= --signoff --verify --no-verify
7dd9ab0c
YB
1176 --edit --no-edit
1177 --amend --include --only --interactive
9a424b27
SG
1178 --dry-run --reuse-message= --reedit-message=
1179 --reset-author --file= --message= --template=
1180 --cleanup= --untracked-files --untracked-files=
77653abd 1181 --verbose --quiet --fixup= --squash=
b3391775 1182 "
4548e855
SP
1183 return
1184 esac
fea16b47
MP
1185
1186 if git rev-parse --verify --quiet HEAD >/dev/null; then
f825972c 1187 __git_complete_index_file "--committable"
fea16b47
MP
1188 else
1189 # This is the first commit
1190 __git_complete_index_file "--cached"
1191 fi
4548e855
SP
1192}
1193
217926c0
SP
1194_git_describe ()
1195{
cbb504c9
TR
1196 case "$cur" in
1197 --*)
1198 __gitcomp "
1199 --all --tags --contains --abbrev= --candidates=
1200 --exact-match --debug --long --match --always
1201 "
1202 return
1203 esac
a31e6262 1204 __gitcomp_nl "$(__git_refs)"
217926c0
SP
1205}
1206
07924d4d
MP
1207__git_diff_algorithms="myers minimal patience histogram"
1208
462f2134 1209__git_diff_submodule_formats="diff log short"
ac76fd54 1210
20bf7292 1211__git_diff_common_options="--stat --numstat --shortstat --summary
b3a4f858
JS
1212 --patch-with-stat --name-only --name-status --color
1213 --no-color --color-words --no-renames --check
f135aacb 1214 --full-index --binary --abbrev --diff-filter=
47d5a8fa 1215 --find-copies-harder
b3a4f858 1216 --text --ignore-space-at-eol --ignore-space-change
c2545167
TB
1217 --ignore-all-space --ignore-blank-lines --exit-code
1218 --quiet --ext-diff --no-ext-diff
aba201c6 1219 --no-prefix --src-prefix= --dst-prefix=
6d0e674a 1220 --inter-hunk-context=
216120ab 1221 --patience --histogram --minimal
e6414b46 1222 --raw --word-diff --word-diff-regex=
8fd2cfa7
SB
1223 --dirstat --dirstat= --dirstat-by-file
1224 --dirstat-by-file= --cumulative
07924d4d 1225 --diff-algorithm=
ac76fd54 1226 --submodule --submodule=
20bf7292
TR
1227"
1228
1229_git_diff ()
1230{
1231 __git_has_doubledash && return
1232
20bf7292 1233 case "$cur" in
07924d4d
MP
1234 --diff-algorithm=*)
1235 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1236 return
1237 ;;
ac76fd54
JK
1238 --submodule=*)
1239 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1240 return
1241 ;;
20bf7292 1242 --*)
ebd15bf0 1243 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
861514d3 1244 --base --ours --theirs --no-index
20bf7292 1245 $__git_diff_common_options
aba201c6 1246 "
b3a4f858
JS
1247 return
1248 ;;
1249 esac
1d66ec58 1250 __git_complete_revlist_file
690d8824
JH
1251}
1252
c5f424fd 1253__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
f13f9b0e 1254 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
e2dc2de9
DA
1255"
1256
1257_git_difftool ()
1258{
f7ad96cf
MH
1259 __git_has_doubledash && return
1260
e2dc2de9
DA
1261 case "$cur" in
1262 --tool=*)
1263 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1264 return
1265 ;;
1266 --*)
f7ad96cf
MH
1267 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1268 --base --ours --theirs
1269 --no-renames --diff-filter= --find-copies-harder
1270 --relative --ignore-submodules
1271 --tool="
e2dc2de9
DA
1272 return
1273 ;;
1274 esac
d8517cc6 1275 __git_complete_revlist_file
e2dc2de9
DA
1276}
1277
4dd5c470
SYS
1278__git_fetch_recurse_submodules="yes on-demand no"
1279
0a4e1472
JS
1280__git_fetch_options="
1281 --quiet --verbose --append --upload-pack --force --keep --depth=
4dd5c470 1282 --tags --no-tags --all --prune --dry-run --recurse-submodules=
0a4e1472
JS
1283"
1284
690d8824
JH
1285_git_fetch ()
1286{
0a4e1472 1287 case "$cur" in
4dd5c470
SYS
1288 --recurse-submodules=*)
1289 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1290 return
1291 ;;
0a4e1472
JS
1292 --*)
1293 __gitcomp "$__git_fetch_options"
1294 return
1295 ;;
1296 esac
52d5c3b5 1297 __git_complete_remote_or_refspec
690d8824
JH
1298}
1299
2f65494d 1300__git_format_patch_options="
ea573521 1301 --stdout --attach --no-attach --thread --thread= --no-thread
2f65494d
FC
1302 --numbered --start-number --numbered-files --keep-subject --signoff
1303 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1304 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1305 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
ea573521 1306 --output-directory --reroll-count --to= --quiet --notes
2f65494d
FC
1307"
1308
f53352fb
SP
1309_git_format_patch ()
1310{
f53352fb 1311 case "$cur" in
e1d37937
SB
1312 --thread=*)
1313 __gitcomp "
1314 deep shallow
1315 " "" "${cur##--thread=}"
1316 return
1317 ;;
f53352fb 1318 --*)
2f65494d 1319 __gitcomp "$__git_format_patch_options"
f53352fb
SP
1320 return
1321 ;;
1322 esac
1323 __git_complete_revlist
1324}
1325
4bca8636
AJ
1326_git_fsck ()
1327{
4bca8636
AJ
1328 case "$cur" in
1329 --*)
1330 __gitcomp "
1331 --tags --root --unreachable --cache --no-reflogs --full
1332 --strict --verbose --lost-found
1333 "
1334 return
1335 ;;
1336 esac
4bca8636
AJ
1337}
1338
b26c8748
SP
1339_git_gc ()
1340{
b26c8748
SP
1341 case "$cur" in
1342 --*)
47e98eec 1343 __gitcomp "--prune --aggressive"
b26c8748
SP
1344 return
1345 ;;
1346 esac
b26c8748
SP
1347}
1348
66729509
SG
1349_git_gitk ()
1350{
1351 _gitk
1352}
1353
29eec71f 1354__git_match_ctag() {
db8d7508 1355 awk "/^${1//\//\\/}/ { print \$1 }" "$2"
29eec71f
JK
1356}
1357
c72e0db1
LM
1358_git_grep ()
1359{
1360 __git_has_doubledash && return
1361
c72e0db1
LM
1362 case "$cur" in
1363 --*)
1364 __gitcomp "
1365 --cached
1366 --text --ignore-case --word-regexp --invert-match
5a69eaf5 1367 --full-name --line-number
c72e0db1 1368 --extended-regexp --basic-regexp --fixed-strings
63e7e9d8 1369 --perl-regexp
89f09dd3 1370 --threads
c72e0db1
LM
1371 --files-with-matches --name-only
1372 --files-without-match
a91f453f 1373 --max-depth
c72e0db1
LM
1374 --count
1375 --and --or --not --all-match
1376 "
1377 return
1378 ;;
1379 esac
17225c49 1380
29eec71f
JK
1381 case "$cword,$prev" in
1382 2,*|*,-*)
1383 if test -r tags; then
d2c78075 1384 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
29eec71f
JK
1385 return
1386 fi
1387 ;;
1388 esac
1389
a31e6262 1390 __gitcomp_nl "$(__git_refs)"
c72e0db1
LM
1391}
1392
1eb7e2f8
LM
1393_git_help ()
1394{
1eb7e2f8
LM
1395 case "$cur" in
1396 --*)
716b29db 1397 __gitcomp "--all --guides --info --man --web"
1eb7e2f8
LM
1398 return
1399 ;;
1400 esac
eaa4e6ee 1401 __git_compute_all_commands
f85a6f0b 1402 __gitcomp "$__git_all_commands $(__git_aliases)
2946cccf 1403 attributes cli core-tutorial cvs-migration
4d10b7e1
RT
1404 diffcore everyday gitk glossary hooks ignore modules
1405 namespaces repository-layout revisions tutorial tutorial-2
99f0b599 1406 workflows
2946cccf 1407 "
1eb7e2f8
LM
1408}
1409
5dad868b
LM
1410_git_init ()
1411{
5dad868b
LM
1412 case "$cur" in
1413 --shared=*)
1414 __gitcomp "
1415 false true umask group all world everybody
1416 " "" "${cur##--shared=}"
1417 return
1418 ;;
1419 --*)
1420 __gitcomp "--quiet --bare --template= --shared --shared="
1421 return
1422 ;;
1423 esac
5dad868b
LM
1424}
1425
b1bc1494
LM
1426_git_ls_files ()
1427{
b1bc1494
LM
1428 case "$cur" in
1429 --*)
1430 __gitcomp "--cached --deleted --modified --others --ignored
1431 --stage --directory --no-empty-directory --unmerged
1432 --killed --exclude= --exclude-from=
1433 --exclude-per-directory= --exclude-standard
1434 --error-unmatch --with-tree= --full-name
1435 --abbrev --ignored --exclude-per-directory
1436 "
1437 return
1438 ;;
1439 esac
fea16b47
MP
1440
1441 # XXX ignore options like --modified and always suggest all cached
1442 # files.
1443 __git_complete_index_file "--cached"
b1bc1494
LM
1444}
1445
690d8824
JH
1446_git_ls_remote ()
1447{
a31e6262 1448 __gitcomp_nl "$(__git_remotes)"
690d8824
JH
1449}
1450
1451_git_ls_tree ()
1452{
1453 __git_complete_file
1454}
1455
a393777e
TR
1456# Options that go well for log, shortlog and gitk
1457__git_log_common_options="
1458 --not --all
1459 --branches --tags --remotes
4fe1a619 1460 --first-parent --merges --no-merges
a393777e
TR
1461 --max-count=
1462 --max-age= --since= --after=
1463 --min-age= --until= --before=
6a6ebded
MG
1464 --min-parents= --max-parents=
1465 --no-min-parents --no-max-parents
a393777e
TR
1466"
1467# Options that go well for log and gitk (not shortlog)
1468__git_log_gitk_options="
1469 --dense --sparse --full-history
1470 --simplify-merges --simplify-by-decoration
3925b575 1471 --left-right --notes --no-notes
a393777e
TR
1472"
1473# Options that go well for log and shortlog (not gitk)
1474__git_log_shortlog_options="
1475 --author= --committer= --grep=
22dfa8a2 1476 --all-match --invert-grep
a393777e
TR
1477"
1478
3d279863 1479__git_log_pretty_formats="oneline short medium full fuller email raw format:"
672c68cb 1480__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
3d279863 1481
690d8824
JH
1482_git_log ()
1483{
d773c631
SG
1484 __git_has_doubledash && return
1485
bf3c20f6
TR
1486 local g="$(git rev-parse --git-dir 2>/dev/null)"
1487 local merge=""
ba7906f2 1488 if [ -f "$g/MERGE_HEAD" ]; then
bf3c20f6
TR
1489 merge="--merge"
1490 fi
6e31b866 1491 case "$cur" in
e67d71e5 1492 --pretty=*|--format=*)
c3898111 1493 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
e67d71e5 1494 " "" "${cur#*=}"
72de29c2
TL
1495 return
1496 ;;
47e98eec 1497 --date=*)
672c68cb 1498 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
47e98eec
SP
1499 return
1500 ;;
af4e9e8c 1501 --decorate=*)
af16bdaa 1502 __gitcomp "full short no" "" "${cur##--decorate=}"
af4e9e8c
SB
1503 return
1504 ;;
ac76fd54
JK
1505 --diff-algorithm=*)
1506 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1507 return
1508 ;;
1509 --submodule=*)
1510 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1511 return
1512 ;;
6e31b866 1513 --*)
b3391775 1514 __gitcomp "
a393777e
TR
1515 $__git_log_common_options
1516 $__git_log_shortlog_options
1517 $__git_log_gitk_options
8f87fae6 1518 --root --topo-order --date-order --reverse
5d0e6343 1519 --follow --full-diff
6e31b866 1520 --abbrev-commit --abbrev=
47e98eec 1521 --relative-date --date=
72de29c2 1522 --pretty= --format= --oneline
2ca0b197 1523 --show-signature
d3bfbf91 1524 --cherry-mark
a393777e 1525 --cherry-pick
20827d99 1526 --graph
af4e9e8c 1527 --decorate --decorate=
20bf7292 1528 --walk-reflogs
a393777e 1529 --parents --children
bf3c20f6 1530 $merge
20bf7292 1531 $__git_diff_common_options
47d5a8fa 1532 --pickaxe-all --pickaxe-regex
b3391775 1533 "
6e31b866
SP
1534 return
1535 ;;
1536 esac
f53352fb 1537 __git_complete_revlist
690d8824
JH
1538}
1539
6d2b06f0 1540# Common merge options shared by git-merge(1) and git-pull(1).
0a4e1472
JS
1541__git_merge_options="
1542 --no-commit --no-stat --log --no-log --squash --strategy
2ff14e31 1543 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
8fee8726
JK
1544 --verify-signatures --no-verify-signatures --gpg-sign
1545 --quiet --verbose --progress --no-progress
0a4e1472
JS
1546"
1547
4ad91321
SP
1548_git_merge ()
1549{
3c7b480a
JS
1550 __git_complete_strategy && return
1551
4ad91321
SP
1552 case "$cur" in
1553 --*)
8fee8726 1554 __gitcomp "$__git_merge_options
c261a87e 1555 --rerere-autoupdate --no-rerere-autoupdate --abort --continue"
4ad91321
SP
1556 return
1557 esac
a31e6262 1558 __gitcomp_nl "$(__git_refs)"
4ad91321
SP
1559}
1560
b4c72162
LM
1561_git_mergetool ()
1562{
b4c72162
LM
1563 case "$cur" in
1564 --tool=*)
e2dc2de9 1565 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
b4c72162
LM
1566 return
1567 ;;
1568 --*)
1569 __gitcomp "--tool="
1570 return
1571 ;;
1572 esac
b4c72162
LM
1573}
1574
690d8824
JH
1575_git_merge_base ()
1576{
85453fd1
JK
1577 case "$cur" in
1578 --*)
1579 __gitcomp "--octopus --independent --is-ancestor --fork-point"
1580 return
1581 ;;
1582 esac
a31e6262 1583 __gitcomp_nl "$(__git_refs)"
690d8824
JH
1584}
1585
1127c51c
LM
1586_git_mv ()
1587{
1127c51c
LM
1588 case "$cur" in
1589 --*)
1590 __gitcomp "--dry-run"
1591 return
1592 ;;
1593 esac
fea16b47
MP
1594
1595 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1596 # We need to show both cached and untracked files (including
1597 # empty directories) since this may not be the last argument.
1598 __git_complete_index_file "--cached --others --directory"
1599 else
1600 __git_complete_index_file "--cached"
1601 fi
1127c51c
LM
1602}
1603
d33909bf
SP
1604_git_name_rev ()
1605{
b3391775 1606 __gitcomp "--tags --all --stdin"
d33909bf
SP
1607}
1608
00f09d0e
SG
1609_git_notes ()
1610{
2a5da755
SG
1611 local subcommands='add append copy edit list prune remove show'
1612 local subcommand="$(__git_find_on_cmdline "$subcommands")"
00f09d0e 1613
2a5da755
SG
1614 case "$subcommand,$cur" in
1615 ,--*)
1616 __gitcomp '--ref'
1617 ;;
1618 ,*)
39540681 1619 case "$prev" in
2a5da755 1620 --ref)
a31e6262 1621 __gitcomp_nl "$(__git_refs)"
2a5da755
SG
1622 ;;
1623 *)
1624 __gitcomp "$subcommands --ref"
1625 ;;
1626 esac
1627 ;;
a8f89bfa 1628 add,--reuse-message=*|append,--reuse-message=*|\
2a5da755 1629 add,--reedit-message=*|append,--reedit-message=*)
a31e6262 1630 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
2a5da755
SG
1631 ;;
1632 add,--*|append,--*)
1633 __gitcomp '--file= --message= --reedit-message=
1634 --reuse-message='
1635 ;;
1636 copy,--*)
1637 __gitcomp '--stdin'
1638 ;;
1639 prune,--*)
1640 __gitcomp '--dry-run --verbose'
1641 ;;
1642 prune,*)
00f09d0e
SG
1643 ;;
1644 *)
39540681 1645 case "$prev" in
2a5da755
SG
1646 -m|-F)
1647 ;;
1648 *)
a31e6262 1649 __gitcomp_nl "$(__git_refs)"
2a5da755
SG
1650 ;;
1651 esac
00f09d0e
SG
1652 ;;
1653 esac
1654}
1655
690d8824
JH
1656_git_pull ()
1657{
0a4e1472
JS
1658 __git_complete_strategy && return
1659
0a4e1472 1660 case "$cur" in
4dd5c470
SYS
1661 --recurse-submodules=*)
1662 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1663 return
1664 ;;
0a4e1472
JS
1665 --*)
1666 __gitcomp "
1667 --rebase --no-rebase
1668 $__git_merge_options
1669 $__git_fetch_options
1670 "
1671 return
1672 ;;
1673 esac
52d5c3b5 1674 __git_complete_remote_or_refspec
690d8824
JH
1675}
1676
4dd5c470
SYS
1677__git_push_recurse_submodules="check on-demand"
1678
aaf7253f
JK
1679__git_complete_force_with_lease ()
1680{
1681 local cur_=$1
1682
1683 case "$cur_" in
1684 --*=)
1685 ;;
1686 *:*)
1687 __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
1688 ;;
1689 *)
1690 __gitcomp_nl "$(__git_refs)" "" "$cur_"
1691 ;;
1692 esac
1693}
1694
690d8824
JH
1695_git_push ()
1696{
da48616f 1697 case "$prev" in
0a4e1472 1698 --repo)
a31e6262 1699 __gitcomp_nl "$(__git_remotes)"
0a4e1472 1700 return
3a224ff2
JK
1701 ;;
1702 --recurse-submodules)
1703 __gitcomp "$__git_push_recurse_submodules"
1704 return
1705 ;;
0a4e1472
JS
1706 esac
1707 case "$cur" in
1708 --repo=*)
a31e6262 1709 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
0a4e1472
JS
1710 return
1711 ;;
4dd5c470
SYS
1712 --recurse-submodules=*)
1713 __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1714 return
1715 ;;
aaf7253f
JK
1716 --force-with-lease=*)
1717 __git_complete_force_with_lease "${cur##--force-with-lease=}"
1718 return
1719 ;;
0a4e1472
JS
1720 --*)
1721 __gitcomp "
1722 --all --mirror --tags --dry-run --force --verbose
9e8a6a94 1723 --quiet --prune --delete --follow-tags
3623dc03 1724 --receive-pack= --repo= --set-upstream
aaf7253f 1725 --force-with-lease --force-with-lease= --recurse-submodules=
0a4e1472
JS
1726 "
1727 return
1728 ;;
1729 esac
52d5c3b5 1730 __git_complete_remote_or_refspec
690d8824
JH
1731}
1732
61d926a3
SP
1733_git_rebase ()
1734{
da48616f 1735 local dir="$(__gitdir)"
09bb6520 1736 if [ -f "$dir"/rebase-merge/interactive ]; then
9512177b 1737 __gitcomp "--continue --skip --abort --quit --edit-todo"
09bb6520
TB
1738 return
1739 elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
9512177b 1740 __gitcomp "--continue --skip --abort --quit"
61d926a3
SP
1741 return
1742 fi
3c7b480a 1743 __git_complete_strategy && return
61d926a3 1744 case "$cur" in
93cf50a4
BG
1745 --whitespace=*)
1746 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1747 return
1748 ;;
61d926a3 1749 --*)
93cf50a4
BG
1750 __gitcomp "
1751 --onto --merge --strategy --interactive
1752 --preserve-merges --stat --no-stat
1753 --committer-date-is-author-date --ignore-date
1754 --ignore-whitespace --whitespace=
fa4b5e3a
JK
1755 --autosquash --no-autosquash
1756 --fork-point --no-fork-point
1757 --autostash --no-autostash
1758 --verify --no-verify
1759 --keep-empty --root --force-rebase --no-ff
1760 --exec
93cf50a4
BG
1761 "
1762
61d926a3
SP
1763 return
1764 esac
a31e6262 1765 __gitcomp_nl "$(__git_refs)"
61d926a3
SP
1766}
1767
057f3279
TRC
1768_git_reflog ()
1769{
1770 local subcommands="show delete expire"
1771 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1772
1773 if [ -z "$subcommand" ]; then
1774 __gitcomp "$subcommands"
1775 else
a31e6262 1776 __gitcomp_nl "$(__git_refs)"
057f3279
TRC
1777 fi
1778}
1779
ae616de6 1780__git_send_email_confirm_options="always never auto cc compose"
cb8a9bd5 1781__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
ae616de6 1782
25a1f374
TL
1783_git_send_email ()
1784{
dfbe5eeb
JK
1785 case "$prev" in
1786 --to|--cc|--bcc|--from)
1787 __gitcomp "
1788 $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
ccab28a9 1789 "
dfbe5eeb
JK
1790 return
1791 ;;
1792 esac
1793
25a1f374 1794 case "$cur" in
ae616de6
SB
1795 --confirm=*)
1796 __gitcomp "
1797 $__git_send_email_confirm_options
1798 " "" "${cur##--confirm=}"
1799 return
1800 ;;
1801 --suppress-cc=*)
1802 __gitcomp "
1803 $__git_send_email_suppresscc_options
1804 " "" "${cur##--suppress-cc=}"
1805
1806 return
1807 ;;
1808 --smtp-encryption=*)
1809 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1810 return
1811 ;;
2f65494d
FC
1812 --thread=*)
1813 __gitcomp "
1814 deep shallow
1815 " "" "${cur##--thread=}"
1816 return
1817 ;;
dfbe5eeb
JK
1818 --to=*|--cc=*|--bcc=*|--from=*)
1819 __gitcomp "
1820 $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1821 " "" "${cur#--*=}"
1822 return
1823 ;;
25a1f374 1824 --*)
77813151 1825 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
ae616de6
SB
1826 --compose --confirm= --dry-run --envelope-sender
1827 --from --identity
25a1f374
TL
1828 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1829 --no-suppress-from --no-thread --quiet
1830 --signed-off-by-cc --smtp-pass --smtp-server
ae616de6
SB
1831 --smtp-server-port --smtp-encryption= --smtp-user
1832 --subject --suppress-cc= --suppress-from --thread --to
2f65494d
FC
1833 --validate --no-validate
1834 $__git_format_patch_options"
25a1f374
TL
1835 return
1836 ;;
1837 esac
2f65494d 1838 __git_complete_revlist
25a1f374
TL
1839}
1840
424cce83
SG
1841_git_stage ()
1842{
1843 _git_add
1844}
1845
634d2344
TB
1846_git_status ()
1847{
1848 local complete_opt
1849 local untracked_state
1850
1851 case "$cur" in
1852 --ignore-submodules=*)
1853 __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
1854 return
1855 ;;
1856 --untracked-files=*)
1857 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1858 return
1859 ;;
1860 --column=*)
1861 __gitcomp "
1862 always never auto column row plain dense nodense
1863 " "" "${cur##--column=}"
1864 return
1865 ;;
1866 --*)
1867 __gitcomp "
1868 --short --branch --porcelain --long --verbose
1869 --untracked-files= --ignore-submodules= --ignored
1870 --column= --no-column
1871 "
1872 return
1873 ;;
1874 esac
1875
1876 untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
1877 "$__git_untracked_file_modes" "status.showUntrackedFiles")"
1878
1879 case "$untracked_state" in
1880 no)
1881 # --ignored option does not matter
1882 complete_opt=
1883 ;;
1884 all|normal|*)
1885 complete_opt="--cached --directory --no-empty-directory --others"
1886
1887 if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
1888 complete_opt="$complete_opt --ignored --exclude=*"
1889 fi
1890 ;;
1891 esac
1892
1893 __git_complete_index_file "$complete_opt"
1894}
1895
00652369
SB
1896__git_config_get_set_variables ()
1897{
da48616f 1898 local prevword word config_file= c=$cword
00652369 1899 while [ $c -gt 1 ]; do
da48616f 1900 word="${words[c]}"
00652369 1901 case "$word" in
66c0786c 1902 --system|--global|--local|--file=*)
00652369
SB
1903 config_file="$word"
1904 break
1905 ;;
1906 -f|--file)
1907 config_file="$word $prevword"
1908 break
1909 ;;
1910 esac
1911 prevword=$word
1912 c=$((--c))
1913 done
1914
905f2036 1915 git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
00652369
SB
1916}
1917
e0d10e1c 1918_git_config ()
5de40f59 1919{
da48616f 1920 case "$prev" in
72f75077 1921 branch.*.remote|branch.*.pushremote)
a31e6262 1922 __gitcomp_nl "$(__git_remotes)"
5de40f59
SP
1923 return
1924 ;;
1925 branch.*.merge)
a31e6262 1926 __gitcomp_nl "$(__git_refs)"
5de40f59
SP
1927 return
1928 ;;
a05490ed 1929 branch.*.rebase)
17c4ddbb 1930 __gitcomp "false true preserve interactive"
a05490ed
RR
1931 return
1932 ;;
7e6a0cc4
RR
1933 remote.pushdefault)
1934 __gitcomp_nl "$(__git_remotes)"
1935 return
1936 ;;
5de40f59 1937 remote.*.fetch)
da48616f 1938 local remote="${prev#remote.}"
5de40f59 1939 remote="${remote%.fetch}"
d51a8ecd 1940 if [ -z "$cur" ]; then
73704451 1941 __gitcomp_nl "refs/heads/" "" "" ""
d51a8ecd
SG
1942 return
1943 fi
a31e6262 1944 __gitcomp_nl "$(__git_refs_remotes "$remote")"
5de40f59
SP
1945 return
1946 ;;
1947 remote.*.push)
da48616f 1948 local remote="${prev#remote.}"
5de40f59 1949 remote="${remote%.push}"
a31e6262 1950 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
5de40f59 1951 for-each-ref --format='%(refname):%(refname)' \
78d4d6a2
SP
1952 refs/heads)"
1953 return
1954 ;;
1955 pull.twohead|pull.octopus)
eaa4e6ee
JN
1956 __git_compute_merge_strategies
1957 __gitcomp "$__git_merge_strategies"
78d4d6a2
SP
1958 return
1959 ;;
6123d719
MH
1960 color.branch|color.diff|color.interactive|\
1961 color.showbranch|color.status|color.ui)
78d4d6a2
SP
1962 __gitcomp "always never auto"
1963 return
1964 ;;
901d615c
MK
1965 color.pager)
1966 __gitcomp "false true"
1967 return
1968 ;;
78d4d6a2
SP
1969 color.*.*)
1970 __gitcomp "
98171a07 1971 normal black red green yellow blue magenta cyan white
78d4d6a2
SP
1972 bold dim ul blink reverse
1973 "
5de40f59
SP
1974 return
1975 ;;
2651baae
RR
1976 diff.submodule)
1977 __gitcomp "log short"
1978 return
1979 ;;
9b82d63b
SB
1980 help.format)
1981 __gitcomp "man info web html"
1982 return
1983 ;;
672c68cb
SB
1984 log.date)
1985 __gitcomp "$__git_log_date_formats"
1986 return
1987 ;;
ae616de6
SB
1988 sendemail.aliasesfiletype)
1989 __gitcomp "mutt mailrc pine elm gnus"
1990 return
1991 ;;
1992 sendemail.confirm)
1993 __gitcomp "$__git_send_email_confirm_options"
1994 return
1995 ;;
1996 sendemail.suppresscc)
1997 __gitcomp "$__git_send_email_suppresscc_options"
1998 return
1999 ;;
8d814084
PB
2000 sendemail.transferencoding)
2001 __gitcomp "7bit 8bit quoted-printable base64"
2002 return
2003 ;;
00652369 2004 --get|--get-all|--unset|--unset-all)
a31e6262 2005 __gitcomp_nl "$(__git_config_get_set_variables)"
00652369
SB
2006 return
2007 ;;
5de40f59 2008 *.*)
5de40f59
SP
2009 return
2010 ;;
2011 esac
2012 case "$cur" in
2013 --*)
78d4d6a2 2014 __gitcomp "
66c0786c 2015 --system --global --local --file=
12977705 2016 --list --replace-all
5de40f59 2017 --get --get-all --get-regexp
1b71eb35 2018 --add --unset --unset-all
12977705 2019 --remove-section --rename-section
578625fa 2020 --name-only
78d4d6a2 2021 "
5de40f59
SP
2022 return
2023 ;;
2024 branch.*.*)
9244d69b 2025 local pfx="${cur%.*}." cur_="${cur##*.}"
72f75077 2026 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
5de40f59
SP
2027 return
2028 ;;
2029 branch.*)
9244d69b 2030 local pfx="${cur%.*}." cur_="${cur#*.}"
a31e6262 2031 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
422553df 2032 __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
5de40f59
SP
2033 return
2034 ;;
0aa62fd0 2035 guitool.*.*)
9244d69b 2036 local pfx="${cur%.*}." cur_="${cur##*.}"
0aa62fd0
SB
2037 __gitcomp "
2038 argprompt cmd confirm needsfile noconsole norescan
2039 prompt revprompt revunmerged title
9244d69b 2040 " "$pfx" "$cur_"
0aa62fd0
SB
2041 return
2042 ;;
2043 difftool.*.*)
9244d69b
SG
2044 local pfx="${cur%.*}." cur_="${cur##*.}"
2045 __gitcomp "cmd path" "$pfx" "$cur_"
0aa62fd0
SB
2046 return
2047 ;;
2048 man.*.*)
9244d69b
SG
2049 local pfx="${cur%.*}." cur_="${cur##*.}"
2050 __gitcomp "cmd path" "$pfx" "$cur_"
0aa62fd0
SB
2051 return
2052 ;;
2053 mergetool.*.*)
9244d69b
SG
2054 local pfx="${cur%.*}." cur_="${cur##*.}"
2055 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
0aa62fd0
SB
2056 return
2057 ;;
2058 pager.*)
9244d69b 2059 local pfx="${cur%.*}." cur_="${cur#*.}"
eaa4e6ee 2060 __git_compute_all_commands
a31e6262 2061 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
0aa62fd0
SB
2062 return
2063 ;;
5de40f59 2064 remote.*.*)
9244d69b 2065 local pfx="${cur%.*}." cur_="${cur##*.}"
12977705 2066 __gitcomp "
98171a07 2067 url proxy fetch push mirror skipDefaultUpdate
6fac1b83 2068 receivepack uploadpack tagopt pushurl
9244d69b 2069 " "$pfx" "$cur_"
5de40f59
SP
2070 return
2071 ;;
2072 remote.*)
9244d69b 2073 local pfx="${cur%.*}." cur_="${cur#*.}"
a31e6262 2074 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
c39a2f11 2075 __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
5de40f59
SP
2076 return
2077 ;;
0aa62fd0 2078 url.*.*)
9244d69b
SG
2079 local pfx="${cur%.*}." cur_="${cur##*.}"
2080 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
0aa62fd0
SB
2081 return
2082 ;;
5de40f59 2083 esac
78d4d6a2 2084 __gitcomp "
6068ac88
MZ
2085 add.ignoreErrors
2086 advice.commitBeforeMerge
2087 advice.detachedHead
2088 advice.implicitIdentity
2089 advice.pushNonFastForward
2090 advice.resolveConflict
2091 advice.statusHints
226b343c 2092 alias.
6068ac88 2093 am.keepcr
86c91f91 2094 apply.ignorewhitespace
5de40f59 2095 apply.whitespace
98171a07
LM
2096 branch.autosetupmerge
2097 branch.autosetuprebase
6068ac88 2098 browser.
2122591b 2099 clean.requireForce
78d4d6a2
SP
2100 color.branch
2101 color.branch.current
2102 color.branch.local
78d4d6a2 2103 color.branch.plain
025a1929 2104 color.branch.remote
6068ac88
MZ
2105 color.decorate.HEAD
2106 color.decorate.branch
2107 color.decorate.remoteBranch
2108 color.decorate.stash
2109 color.decorate.tag
a159ca0c 2110 color.diff
025a1929 2111 color.diff.commit
78d4d6a2 2112 color.diff.frag
6068ac88 2113 color.diff.func
025a1929 2114 color.diff.meta
78d4d6a2 2115 color.diff.new
025a1929
LM
2116 color.diff.old
2117 color.diff.plain
78d4d6a2 2118 color.diff.whitespace
226b343c 2119 color.grep
6068ac88
MZ
2120 color.grep.context
2121 color.grep.filename
2122 color.grep.function
2123 color.grep.linenumber
226b343c 2124 color.grep.match
6068ac88
MZ
2125 color.grep.selected
2126 color.grep.separator
98171a07 2127 color.interactive
6068ac88 2128 color.interactive.error
98171a07
LM
2129 color.interactive.header
2130 color.interactive.help
2131 color.interactive.prompt
a159ca0c 2132 color.pager
6123d719 2133 color.showbranch
a159ca0c 2134 color.status
78d4d6a2
SP
2135 color.status.added
2136 color.status.changed
025a1929 2137 color.status.header
98171a07 2138 color.status.nobranch
0d6accc0 2139 color.status.unmerged
78d4d6a2 2140 color.status.untracked
98171a07
LM
2141 color.status.updated
2142 color.ui
6068ac88 2143 commit.status
98171a07 2144 commit.template
cdb791f6 2145 core.abbrev
6068ac88
MZ
2146 core.askpass
2147 core.attributesfile
98171a07
LM
2148 core.autocrlf
2149 core.bare
6068ac88 2150 core.bigFileThreshold
025a1929 2151 core.compression
226b343c 2152 core.createObject
98171a07
LM
2153 core.deltaBaseCacheLimit
2154 core.editor
6068ac88 2155 core.eol
98171a07 2156 core.excludesfile
025a1929 2157 core.fileMode
98171a07 2158 core.fsyncobjectfiles
025a1929
LM
2159 core.gitProxy
2160 core.ignoreStat
6068ac88 2161 core.ignorecase
025a1929
LM
2162 core.logAllRefUpdates
2163 core.loosecompression
6068ac88 2164 core.notesRef
025a1929
LM
2165 core.packedGitLimit
2166 core.packedGitWindowSize
98171a07 2167 core.pager
025a1929 2168 core.preferSymlinkRefs
98171a07
LM
2169 core.preloadindex
2170 core.quotepath
025a1929 2171 core.repositoryFormatVersion
98171a07 2172 core.safecrlf
025a1929 2173 core.sharedRepository
6068ac88 2174 core.sparseCheckout
98171a07
LM
2175 core.symlinks
2176 core.trustctime
435ec090 2177 core.untrackedCache
025a1929 2178 core.warnAmbiguousRefs
98171a07
LM
2179 core.whitespace
2180 core.worktree
2181 diff.autorefreshindex
2182 diff.external
6068ac88 2183 diff.ignoreSubmodules
98171a07 2184 diff.mnemonicprefix
6068ac88 2185 diff.noprefix
78d4d6a2
SP
2186 diff.renameLimit
2187 diff.renames
de7c201a 2188 diff.statGraphWidth
2651baae 2189 diff.submodule
226b343c
SB
2190 diff.suppressBlankEmpty
2191 diff.tool
2192 diff.wordRegex
07ab4dec 2193 diff.algorithm
0aa62fd0 2194 difftool.
226b343c 2195 difftool.prompt
6068ac88 2196 fetch.recurseSubmodules
78d4d6a2 2197 fetch.unpackLimit
226b343c
SB
2198 format.attach
2199 format.cc
de06c13a 2200 format.coverLetter
6bc6b6c0 2201 format.from
78d4d6a2 2202 format.headers
98171a07
LM
2203 format.numbered
2204 format.pretty
d8e1e5df 2205 format.signature
226b343c
SB
2206 format.signoff
2207 format.subjectprefix
98171a07 2208 format.suffix
226b343c 2209 format.thread
6068ac88
MZ
2210 format.to
2211 gc.
98171a07
LM
2212 gc.aggressiveWindow
2213 gc.auto
2214 gc.autopacklimit
12977705 2215 gc.packrefs
98171a07 2216 gc.pruneexpire
78d4d6a2
SP
2217 gc.reflogexpire
2218 gc.reflogexpireunreachable
2219 gc.rerereresolved
2220 gc.rerereunresolved
025a1929 2221 gitcvs.allbinary
226b343c 2222 gitcvs.commitmsgannotation
98171a07 2223 gitcvs.dbTableNamePrefix
025a1929
LM
2224 gitcvs.dbdriver
2225 gitcvs.dbname
2226 gitcvs.dbpass
025a1929
LM
2227 gitcvs.dbuser
2228 gitcvs.enabled
2229 gitcvs.logfile
98171a07 2230 gitcvs.usecrlfattr
0aa62fd0 2231 guitool.
98171a07
LM
2232 gui.blamehistoryctx
2233 gui.commitmsgwidth
2234 gui.copyblamethreshold
2235 gui.diffcontext
2236 gui.encoding
2237 gui.fastcopyblame
2238 gui.matchtrackingbranch
2239 gui.newbranchtemplate
2240 gui.pruneduringfetch
2241 gui.spellingdictionary
2242 gui.trustmtime
2243 help.autocorrect
2244 help.browser
2245 help.format
78d4d6a2
SP
2246 http.lowSpeedLimit
2247 http.lowSpeedTime
025a1929 2248 http.maxRequests
6068ac88 2249 http.minSessions
5de40f59 2250 http.noEPSV
6068ac88 2251 http.postBuffer
98171a07 2252 http.proxy
f6f2a9e4 2253 http.sslCipherList
01861cb7 2254 http.sslVersion
025a1929
LM
2255 http.sslCAInfo
2256 http.sslCAPath
2257 http.sslCert
6068ac88 2258 http.sslCertPasswordProtected
025a1929
LM
2259 http.sslKey
2260 http.sslVerify
6068ac88 2261 http.useragent
78d4d6a2
SP
2262 i18n.commitEncoding
2263 i18n.logOutputEncoding
6068ac88 2264 imap.authMethod
226b343c
SB
2265 imap.folder
2266 imap.host
2267 imap.pass
2268 imap.port
2269 imap.preformattedHTML
2270 imap.sslverify
2271 imap.tunnel
2272 imap.user
6068ac88 2273 init.templatedir
98171a07
LM
2274 instaweb.browser
2275 instaweb.httpd
2276 instaweb.local
2277 instaweb.modulepath
2278 instaweb.port
226b343c 2279 interactive.singlekey
98171a07 2280 log.date
6068ac88 2281 log.decorate
78d4d6a2 2282 log.showroot
226b343c 2283 mailmap.file
0aa62fd0 2284 man.
98171a07 2285 man.viewer
6068ac88 2286 merge.
98171a07
LM
2287 merge.conflictstyle
2288 merge.log
2289 merge.renameLimit
6068ac88 2290 merge.renormalize
98171a07 2291 merge.stat
025a1929 2292 merge.tool
78d4d6a2 2293 merge.verbosity
0aa62fd0 2294 mergetool.
98171a07 2295 mergetool.keepBackup
6068ac88 2296 mergetool.keepTemporaries
226b343c 2297 mergetool.prompt
6068ac88
MZ
2298 notes.displayRef
2299 notes.rewrite.
2300 notes.rewrite.amend
2301 notes.rewrite.rebase
2302 notes.rewriteMode
2303 notes.rewriteRef
47e98eec 2304 pack.compression
47e98eec 2305 pack.deltaCacheLimit
025a1929
LM
2306 pack.deltaCacheSize
2307 pack.depth
98171a07
LM
2308 pack.indexVersion
2309 pack.packSizeLimit
2310 pack.threads
025a1929
LM
2311 pack.window
2312 pack.windowMemory
0aa62fd0 2313 pager.
6068ac88 2314 pretty.
78d4d6a2
SP
2315 pull.octopus
2316 pull.twohead
226b343c 2317 push.default
a8bc269f 2318 push.followTags
6068ac88 2319 rebase.autosquash
226b343c 2320 rebase.stat
6068ac88 2321 receive.autogc
98171a07 2322 receive.denyCurrentBranch
6068ac88 2323 receive.denyDeleteCurrent
98171a07 2324 receive.denyDeletes
025a1929 2325 receive.denyNonFastForwards
98171a07 2326 receive.fsckObjects
025a1929 2327 receive.unpackLimit
6068ac88 2328 receive.updateserverinfo
7e6a0cc4 2329 remote.pushdefault
6068ac88 2330 remotes.
98171a07
LM
2331 repack.usedeltabaseoffset
2332 rerere.autoupdate
2333 rerere.enabled
6068ac88 2334 sendemail.
226b343c 2335 sendemail.aliasesfile
6068ac88 2336 sendemail.aliasfiletype
226b343c
SB
2337 sendemail.bcc
2338 sendemail.cc
2339 sendemail.cccmd
2340 sendemail.chainreplyto
2341 sendemail.confirm
2342 sendemail.envelopesender
6068ac88
MZ
2343 sendemail.from
2344 sendemail.identity
226b343c
SB
2345 sendemail.multiedit
2346 sendemail.signedoffbycc
6068ac88 2347 sendemail.smtpdomain
226b343c
SB
2348 sendemail.smtpencryption
2349 sendemail.smtppass
2350 sendemail.smtpserver
6068ac88 2351 sendemail.smtpserveroption
226b343c
SB
2352 sendemail.smtpserverport
2353 sendemail.smtpuser
2354 sendemail.suppresscc
2355 sendemail.suppressfrom
2356 sendemail.thread
2357 sendemail.to
2358 sendemail.validate
78d4d6a2 2359 showbranch.default
98171a07
LM
2360 status.relativePaths
2361 status.showUntrackedFiles
6068ac88
MZ
2362 status.submodulesummary
2363 submodule.
78d4d6a2
SP
2364 tar.umask
2365 transfer.unpackLimit
0aa62fd0 2366 url.
78d4d6a2 2367 user.email
025a1929 2368 user.name
78d4d6a2 2369 user.signingkey
98171a07 2370 web.browser
5de40f59 2371 branch. remote.
78d4d6a2 2372 "
5de40f59
SP
2373}
2374
88293c67
SP
2375_git_remote ()
2376{
e17dba8f 2377 local subcommands="add rename remove set-head set-branches set-url show prune update"
918c03c2 2378 local subcommand="$(__git_find_on_cmdline "$subcommands")"
3ff1320d 2379 if [ -z "$subcommand" ]; then
3903c618 2380 __gitcomp "$subcommands"
88293c67
SP
2381 return
2382 fi
2383
3ff1320d 2384 case "$subcommand" in
e17dba8f 2385 rename|remove|set-url|show|prune)
a31e6262 2386 __gitcomp_nl "$(__git_remotes)"
88293c67 2387 ;;
f1c6ffe6
PJ
2388 set-head|set-branches)
2389 __git_complete_remote_or_refspec
2390 ;;
fb72759b 2391 update)
e8f9e428 2392 __gitcomp "$(__git_get_config_variables "remotes")"
fb72759b 2393 ;;
88293c67 2394 *)
88293c67
SP
2395 ;;
2396 esac
2397}
2398
e1c1a067
BG
2399_git_replace ()
2400{
a31e6262 2401 __gitcomp_nl "$(__git_refs)"
e1c1a067
BG
2402}
2403
e24a256b
CW
2404_git_rerere ()
2405{
2406 local subcommands="clear forget diff remaining status gc"
2407 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2408 if test -z "$subcommand"
2409 then
2410 __gitcomp "$subcommands"
2411 return
2412 fi
2413}
2414
67e78c3b
SP
2415_git_reset ()
2416{
d773c631
SG
2417 __git_has_doubledash && return
2418
b3391775
SP
2419 case "$cur" in
2420 --*)
9f040e95 2421 __gitcomp "--merge --mixed --hard --soft --patch"
b3391775
SP
2422 return
2423 ;;
2424 esac
a31e6262 2425 __gitcomp_nl "$(__git_refs)"
67e78c3b
SP
2426}
2427
a6c2be24
LM
2428_git_revert ()
2429{
956352b6
TB
2430 local dir="$(__gitdir)"
2431 if [ -f "$dir"/REVERT_HEAD ]; then
2432 __gitcomp "--continue --quit --abort"
2433 return
2434 fi
a6c2be24
LM
2435 case "$cur" in
2436 --*)
2437 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2438 return
2439 ;;
2440 esac
a31e6262 2441 __gitcomp_nl "$(__git_refs)"
a6c2be24
LM
2442}
2443
08c701d4
LM
2444_git_rm ()
2445{
08c701d4
LM
2446 case "$cur" in
2447 --*)
2448 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2449 return
2450 ;;
2451 esac
fea16b47
MP
2452
2453 __git_complete_index_file "--cached"
08c701d4
LM
2454}
2455
1fd6bec9
SP
2456_git_shortlog ()
2457{
d773c631
SG
2458 __git_has_doubledash && return
2459
1fd6bec9
SP
2460 case "$cur" in
2461 --*)
2462 __gitcomp "
a393777e
TR
2463 $__git_log_common_options
2464 $__git_log_shortlog_options
1fd6bec9
SP
2465 --numbered --summary
2466 "
2467 return
2468 ;;
2469 esac
2470 __git_complete_revlist
2471}
2472
90131924
SP
2473_git_show ()
2474{
41d8cf7d
MH
2475 __git_has_doubledash && return
2476
90131924 2477 case "$cur" in
e67d71e5 2478 --pretty=*|--format=*)
c3898111 2479 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
e67d71e5 2480 " "" "${cur#*=}"
72de29c2
TL
2481 return
2482 ;;
07924d4d
MP
2483 --diff-algorithm=*)
2484 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2485 return
2486 ;;
ac76fd54
JK
2487 --submodule=*)
2488 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
2489 return
2490 ;;
90131924 2491 --*)
076c3237 2492 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2ca0b197 2493 --show-signature
20bf7292
TR
2494 $__git_diff_common_options
2495 "
90131924
SP
2496 return
2497 ;;
2498 esac
5269f7f8 2499 __git_complete_revlist_file
90131924
SP
2500}
2501
2ca880fe
TR
2502_git_show_branch ()
2503{
2ca880fe
TR
2504 case "$cur" in
2505 --*)
2506 __gitcomp "
f7c2e1a0 2507 --all --remotes --topo-order --date-order --current --more=
2ca880fe 2508 --list --independent --merge-base --no-name
6123d719 2509 --color --no-color
076c3237 2510 --sha1-name --sparse --topics --reflog
2ca880fe
TR
2511 "
2512 return
2513 ;;
2514 esac
2515 __git_complete_revlist
2516}
2517
7fd53fce
JH
2518_git_stash ()
2519{
d7d4ca87 2520 local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
95d43780 2521 local subcommands='save list show apply clear drop pop create branch'
918c03c2 2522 local subcommand="$(__git_find_on_cmdline "$subcommands")"
7bedebca 2523 if [ -z "$subcommand" ]; then
59d5eeee
SG
2524 case "$cur" in
2525 --*)
2526 __gitcomp "$save_opts"
2527 ;;
2528 *)
2529 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2530 __gitcomp "$subcommands"
59d5eeee
SG
2531 fi
2532 ;;
2533 esac
7bedebca 2534 else
7bedebca
SG
2535 case "$subcommand,$cur" in
2536 save,--*)
59d5eeee 2537 __gitcomp "$save_opts"
7bedebca 2538 ;;
8513c54b 2539 apply,--*|pop,--*)
59d5eeee 2540 __gitcomp "--index --quiet"
95d43780 2541 ;;
d7d4ca87
PW
2542 drop,--*)
2543 __gitcomp "--quiet"
95d43780 2544 ;;
d7d4ca87
PW
2545 show,--*|branch,--*)
2546 ;;
2547 branch,*)
59305aee
SG
2548 if [ $cword -eq 3 ]; then
2549 __gitcomp_nl "$(__git_refs)";
d7d4ca87
PW
2550 else
2551 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2552 | sed -n -e 's/:.*//p')"
2553 fi
2554 ;;
2555 show,*|apply,*|drop,*|pop,*)
a31e6262 2556 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
95d43780
LM
2557 | sed -n -e 's/:.*//p')"
2558 ;;
7bedebca 2559 *)
7bedebca
SG
2560 ;;
2561 esac
3ff1320d 2562 fi
7fd53fce
JH
2563}
2564
be86f7a0
SP
2565_git_submodule ()
2566{
d773c631
SG
2567 __git_has_doubledash && return
2568
cf419828 2569 local subcommands="add status init deinit update summary foreach sync"
65d5a1e0
CW
2570 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2571 if [ -z "$subcommand" ]; then
be86f7a0
SP
2572 case "$cur" in
2573 --*)
65d5a1e0 2574 __gitcomp "--quiet"
be86f7a0
SP
2575 ;;
2576 *)
3ff1320d 2577 __gitcomp "$subcommands"
be86f7a0
SP
2578 ;;
2579 esac
2580 return
2581 fi
65d5a1e0
CW
2582
2583 case "$subcommand,$cur" in
2584 add,--*)
2585 __gitcomp "--branch --force --name --reference --depth"
2586 ;;
2587 status,--*)
2588 __gitcomp "--cached --recursive"
2589 ;;
2590 deinit,--*)
2591 __gitcomp "--force --all"
2592 ;;
2593 update,--*)
2594 __gitcomp "
2595 --init --remote --no-fetch
2596 --recommend-shallow --no-recommend-shallow
2597 --force --rebase --merge --reference --depth --recursive --jobs
2598 "
2599 ;;
2600 summary,--*)
2601 __gitcomp "--cached --files --summary-limit"
2602 ;;
2603 foreach,--*|sync,--*)
2604 __gitcomp "--recursive"
2605 ;;
2606 *)
2607 ;;
2608 esac
be86f7a0
SP
2609}
2610
47f6ee28
SG
2611_git_svn ()
2612{
2613 local subcommands="
2614 init fetch clone rebase dcommit log find-rev
2615 set-tree commit-diff info create-ignore propget
4a5856cb 2616 proplist show-ignore show-externals branch tag blame
c18d5d82 2617 migrate mkdirs reset gc
47f6ee28 2618 "
918c03c2 2619 local subcommand="$(__git_find_on_cmdline "$subcommands")"
47f6ee28
SG
2620 if [ -z "$subcommand" ]; then
2621 __gitcomp "$subcommands"
2622 else
2623 local remote_opts="--username= --config-dir= --no-auth-cache"
2624 local fc_opts="
2625 --follow-parent --authors-file= --repack=
2626 --no-metadata --use-svm-props --use-svnsync-props
2627 --log-window-size= --no-checkout --quiet
4a5856cb 2628 --repack-flags --use-log-author --localtime
a7b10230 2629 --ignore-paths= --include-paths= $remote_opts
47f6ee28
SG
2630 "
2631 local init_opts="
2632 --template= --shared= --trunk= --tags=
2633 --branches= --stdlayout --minimize-url
2634 --no-metadata --use-svm-props --use-svnsync-props
4a5856cb
SG
2635 --rewrite-root= --prefix= --use-log-author
2636 --add-author-from $remote_opts
47f6ee28
SG
2637 "
2638 local cmt_opts="
2639 --edit --rmdir --find-copies-harder --copy-similarity=
2640 "
2641
47f6ee28
SG
2642 case "$subcommand,$cur" in
2643 fetch,--*)
2644 __gitcomp "--revision= --fetch-all $fc_opts"
2645 ;;
2646 clone,--*)
2647 __gitcomp "--revision= $fc_opts $init_opts"
2648 ;;
2649 init,--*)
2650 __gitcomp "$init_opts"
2651 ;;
2652 dcommit,--*)
2653 __gitcomp "
2654 --merge --strategy= --verbose --dry-run
4a5856cb 2655 --fetch-all --no-rebase --commit-url
7b151f49 2656 --revision --interactive $cmt_opts $fc_opts
47f6ee28
SG
2657 "
2658 ;;
2659 set-tree,--*)
2660 __gitcomp "--stdin $cmt_opts $fc_opts"
2661 ;;
2662 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
c18d5d82 2663 show-externals,--*|mkdirs,--*)
47f6ee28
SG
2664 __gitcomp "--revision="
2665 ;;
2666 log,--*)
2667 __gitcomp "
2668 --limit= --revision= --verbose --incremental
2669 --oneline --show-commit --non-recursive
4a5856cb 2670 --authors-file= --color
47f6ee28
SG
2671 "
2672 ;;
2673 rebase,--*)
2674 __gitcomp "
2675 --merge --verbose --strategy= --local
4a5856cb 2676 --fetch-all --dry-run $fc_opts
47f6ee28
SG
2677 "
2678 ;;
2679 commit-diff,--*)
2680 __gitcomp "--message= --file= --revision= $cmt_opts"
2681 ;;
2682 info,--*)
2683 __gitcomp "--url"
2684 ;;
4a5856cb
SG
2685 branch,--*)
2686 __gitcomp "--dry-run --message --tag"
2687 ;;
2688 tag,--*)
2689 __gitcomp "--dry-run --message"
2690 ;;
2691 blame,--*)
2692 __gitcomp "--git-format"
2693 ;;
2694 migrate,--*)
2695 __gitcomp "
2696 --config-dir= --ignore-paths= --minimize
2697 --no-auth-cache --username=
2698 "
2699 ;;
c18d5d82
RZ
2700 reset,--*)
2701 __gitcomp "--revision= --parent"
2702 ;;
47f6ee28 2703 *)
47f6ee28
SG
2704 ;;
2705 esac
2706 fi
2707}
2708
88e21dc7
SP
2709_git_tag ()
2710{
2711 local i c=1 f=0
da48616f
PD
2712 while [ $c -lt $cword ]; do
2713 i="${words[c]}"
88e21dc7
SP
2714 case "$i" in
2715 -d|-v)
a31e6262 2716 __gitcomp_nl "$(__git_tags)"
88e21dc7
SP
2717 return
2718 ;;
2719 -f)
2720 f=1
2721 ;;
2722 esac
6e8c755f 2723 ((c++))
88e21dc7
SP
2724 done
2725
da48616f 2726 case "$prev" in
88e21dc7 2727 -m|-F)
88e21dc7 2728 ;;
8d8163f3 2729 -*|tag)
88e21dc7 2730 if [ $f = 1 ]; then
a31e6262 2731 __gitcomp_nl "$(__git_tags)"
88e21dc7
SP
2732 fi
2733 ;;
2734 *)
a31e6262 2735 __gitcomp_nl "$(__git_refs)"
88e21dc7
SP
2736 ;;
2737 esac
85ed2f32
RT
2738
2739 case "$cur" in
2740 --*)
2741 __gitcomp "
2742 --list --delete --verify --annotate --message --file
2743 --sign --cleanup --local-user --force --column --sort
2744 --contains --points-at
2745 "
2746 ;;
2747 esac
88e21dc7
SP
2748}
2749
424cce83
SG
2750_git_whatchanged ()
2751{
2752 _git_log
2753}
2754
b462c024
NTND
2755_git_worktree ()
2756{
6d308627 2757 local subcommands="add list lock prune unlock"
b462c024
NTND
2758 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2759 if [ -z "$subcommand" ]; then
2760 __gitcomp "$subcommands"
2761 else
2762 case "$subcommand,$cur" in
2763 add,--*)
2764 __gitcomp "--detach"
2765 ;;
2766 list,--*)
2767 __gitcomp "--porcelain"
2768 ;;
58142c09
NTND
2769 lock,--*)
2770 __gitcomp "--reason"
2771 ;;
b462c024
NTND
2772 prune,--*)
2773 __gitcomp "--dry-run --expire --verbose"
2774 ;;
2775 *)
2776 ;;
2777 esac
2778 fi
2779}
2780
93b291e0 2781__git_main ()
690d8824 2782{
873537fa
SP
2783 local i c=1 command __git_dir
2784
da48616f
PD
2785 while [ $c -lt $cword ]; do
2786 i="${words[c]}"
873537fa
SP
2787 case "$i" in
2788 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
776009d1 2789 --git-dir) ((c++)) ; __git_dir="${words[c]}" ;;
873537fa 2790 --bare) __git_dir="." ;;
1eb7e2f8 2791 --help) command="help"; break ;;
776009d1 2792 -c|--work-tree|--namespace) ((c++)) ;;
911d5da6 2793 -*) ;;
873537fa
SP
2794 *) command="$i"; break ;;
2795 esac
6e8c755f 2796 ((c++))
873537fa
SP
2797 done
2798
1d17b22e 2799 if [ -z "$command" ]; then
da48616f 2800 case "$cur" in
47e98eec 2801 --*) __gitcomp "
ce5a2c95 2802 --paginate
47e98eec
SP
2803 --no-pager
2804 --git-dir=
2805 --bare
2806 --version
2807 --exec-path
3ffcd086 2808 --exec-path=
89a56bfb 2809 --html-path
66fb37d0 2810 --man-path
69ef3c02 2811 --info-path
ce5a2c95 2812 --work-tree=
a1bea2c1 2813 --namespace=
69ef3c02 2814 --no-replace-objects
ce5a2c95 2815 --help
47e98eec
SP
2816 "
2817 ;;
eaa4e6ee
JN
2818 *) __git_compute_porcelain_commands
2819 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
72e5e989
SP
2820 esac
2821 return
873537fa 2822 fi
367dce2a 2823
424cce83 2824 local completion_func="_git_${command//-/_}"
06f44c3c 2825 declare -f $completion_func >/dev/null && $completion_func && return
8024ea60 2826
873537fa 2827 local expansion=$(__git_aliased_command "$command")
8024ea60 2828 if [ -n "$expansion" ]; then
880111c1 2829 words[1]=$expansion
8024ea60 2830 completion_func="_git_${expansion//-/_}"
06f44c3c 2831 declare -f $completion_func >/dev/null && $completion_func
8024ea60 2832 fi
690d8824
JH
2833}
2834
93b291e0 2835__gitk_main ()
690d8824 2836{
d773c631
SG
2837 __git_has_doubledash && return
2838
fa26a401 2839 local g="$(__gitdir)"
07ba53f7 2840 local merge=""
ba7906f2 2841 if [ -f "$g/MERGE_HEAD" ]; then
07ba53f7
RQ
2842 merge="--merge"
2843 fi
b3391775
SP
2844 case "$cur" in
2845 --*)
a393777e
TR
2846 __gitcomp "
2847 $__git_log_common_options
2848 $__git_log_gitk_options
2849 $merge
2850 "
b3391775
SP
2851 return
2852 ;;
2853 esac
ec804891 2854 __git_complete_revlist
690d8824
JH
2855}
2856
d8b45314
FC
2857if [[ -n ${ZSH_VERSION-} ]]; then
2858 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
6b179adf 2859
9cd67bd2
FC
2860 autoload -U +X compinit && compinit
2861
d8b45314
FC
2862 __gitcomp ()
2863 {
2864 emulate -L zsh
6b179adf 2865
d8b45314
FC
2866 local cur_="${3-$cur}"
2867
2868 case "$cur_" in
2869 --*=)
2870 ;;
2871 *)
2872 local c IFS=$' \t\n'
2873 local -a array
2874 for c in ${=1}; do
2875 c="$c${4-}"
2876 case $c in
2877 --*=*|*.) ;;
2878 *) c="$c " ;;
2879 esac
5d5812f4 2880 array[${#array[@]}+1]="$c"
d8b45314
FC
2881 done
2882 compset -P '*[=:]'
2883 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2884 ;;
2885 esac
2886 }
2887
2888 __gitcomp_nl ()
2889 {
2890 emulate -L zsh
2891
2892 local IFS=$'\n'
2893 compset -P '*[=:]'
2894 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2895 }
2896
fea16b47
MP
2897 __gitcomp_file ()
2898 {
2899 emulate -L zsh
2900
2901 local IFS=$'\n'
2902 compset -P '*[=:]'
2903 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2904 }
2905
d8b45314
FC
2906 _git ()
2907 {
2bcf694b
FC
2908 local _ret=1 cur cword prev
2909 cur=${words[CURRENT]}
2910 prev=${words[CURRENT-1]}
2911 let cword=CURRENT-1
2912 emulate ksh -c __${service}_main
734b2f05 2913 let _ret && _default && _ret=0
d8b45314
FC
2914 return _ret
2915 }
2916
2917 compdef _git git gitk
2918 return
2919fi
2920
2921__git_func_wrap ()
2922{
6b179adf
FC
2923 local cur words cword prev
2924 _get_comp_words_by_ref -n =: cur words cword prev
2925 $1
2926}
2927
2928# Setup completion for certain functions defined above by setting common
2929# variables and workarounds.
2930# This is NOT a public function; use at your own risk.
2931__git_complete ()
2932{
2933 local wrapper="__git_wrap${2}"
2934 eval "$wrapper () { __git_func_wrap $2 ; }"
2935 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2936 || complete -o default -o nospace -F $wrapper $1
2937}
2938
b0a4b2d2
FC
2939# wrapper for backwards compatibility
2940_git ()
2941{
93b291e0 2942 __git_wrap__git_main
b0a4b2d2
FC
2943}
2944
2945# wrapper for backwards compatibility
2946_gitk ()
2947{
93b291e0 2948 __git_wrap__gitk_main
b0a4b2d2
FC
2949}
2950
93b291e0
SG
2951__git_complete git __git_main
2952__git_complete gitk __gitk_main
690d8824
JH
2953
2954# The following are necessary only for Cygwin, and only are needed
2955# when the user has tab-completed the executable name and consequently
2956# included the '.exe' suffix.
2957#
76c3eb51 2958if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
93b291e0 2959__git_complete git.exe __git_main
76c3eb51 2960fi