]> git.ipfire.org Git - thirdparty/git.git/blame - contrib/completion/git-completion.bash
completion: replace overloaded track term for __git_complete_refs
[thirdparty/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 ; ... '".
60e71bbc 31#
d23bb387
NTND
32# Compatible with bash 3.2.57.
33#
60e71bbc
JK
34# You can set the following environment variables to influence the behavior of
35# the completion routines:
36#
37# GIT_COMPLETION_CHECKOUT_NO_GUESS
38#
39# When set to "1", do not include "DWIM" suggestions in git-checkout
ae36fe69
NTND
40# and git-switch completion (e.g., completing "foo" when "origin/foo"
41# exists).
690d8824 42
db8a9ff0
SP
43case "$COMP_WORDBREAKS" in
44*:*) : great ;;
45*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
46esac
47
beb6ee71
SG
48# Discovers the path to the git repository taking any '--git-dir=<path>' and
49# '-C <path>' options into account and stores it in the $__git_repo_path
50# variable.
51__git_find_repo_path ()
52{
fad9484f
SG
53 if [ -n "$__git_repo_path" ]; then
54 # we already know where it is
55 return
56 fi
57
beb6ee71
SG
58 if [ -n "${__git_C_args-}" ]; then
59 __git_repo_path="$(git "${__git_C_args[@]}" \
60 ${__git_dir:+--git-dir="$__git_dir"} \
61 rev-parse --absolute-git-dir 2>/dev/null)"
62 elif [ -n "${__git_dir-}" ]; then
63 test -d "$__git_dir" &&
64 __git_repo_path="$__git_dir"
65 elif [ -n "${GIT_DIR-}" ]; then
66 test -d "${GIT_DIR-}" &&
67 __git_repo_path="$GIT_DIR"
68 elif [ -d .git ]; then
69 __git_repo_path=.git
70 else
71 __git_repo_path="$(git rev-parse --git-dir 2>/dev/null)"
72 fi
73}
74
fad9484f 75# Deprecated: use __git_find_repo_path() and $__git_repo_path instead
a42577d4
TP
76# __gitdir accepts 0 or 1 arguments (i.e., location)
77# returns location of .git repo
873537fa
SP
78__gitdir ()
79{
25a31f81 80 if [ -z "${1-}" ]; then
beb6ee71
SG
81 __git_find_repo_path || return 1
82 echo "$__git_repo_path"
67ffa114
SP
83 elif [ -d "$1/.git" ]; then
84 echo "$1/.git"
85 else
86 echo "$1"
87 fi
873537fa
SP
88}
89
1cd23e9e
SG
90# Runs git with all the options given as argument, respecting any
91# '--git-dir=<path>' and '-C <path>' options present on the command line
92__git ()
93{
94 git ${__git_C_args:+"${__git_C_args[@]}"} \
e15098a3 95 ${__git_dir:+--git-dir="$__git_dir"} "$@" 2>/dev/null
1cd23e9e
SG
96}
97
f12785a3
SG
98# Removes backslash escaping, single quotes and double quotes from a word,
99# stores the result in the variable $dequoted_word.
100# 1: The word to dequote.
101__git_dequote ()
102{
103 local rest="$1" len ch
104
105 dequoted_word=""
106
107 while test -n "$rest"; do
108 len=${#dequoted_word}
109 dequoted_word="$dequoted_word${rest%%[\\\'\"]*}"
110 rest="${rest:$((${#dequoted_word}-$len))}"
111
112 case "${rest:0:1}" in
113 \\)
114 ch="${rest:1:1}"
115 case "$ch" in
116 $'\n')
117 ;;
118 *)
119 dequoted_word="$dequoted_word$ch"
120 ;;
121 esac
122 rest="${rest:2}"
123 ;;
124 \')
125 rest="${rest:1}"
126 len=${#dequoted_word}
127 dequoted_word="$dequoted_word${rest%%\'*}"
128 rest="${rest:$((${#dequoted_word}-$len+1))}"
129 ;;
130 \")
131 rest="${rest:1}"
132 while test -n "$rest" ; do
133 len=${#dequoted_word}
134 dequoted_word="$dequoted_word${rest%%[\\\"]*}"
135 rest="${rest:$((${#dequoted_word}-$len))}"
136 case "${rest:0:1}" in
137 \\)
138 ch="${rest:1:1}"
139 case "$ch" in
140 \"|\\|\$|\`)
141 dequoted_word="$dequoted_word$ch"
142 ;;
143 $'\n')
144 ;;
145 *)
146 dequoted_word="$dequoted_word\\$ch"
147 ;;
148 esac
149 rest="${rest:2}"
150 ;;
151 \")
152 rest="${rest:1}"
153 break
154 ;;
155 esac
156 done
157 ;;
158 esac
159 done
160}
161
dbda3b10
JN
162# The following function is based on code from:
163#
164# bash_completion - programmable completion functions for bash 3.2+
165#
166# Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
167# © 2009-2010, Bash Completion Maintainers
168# <bash-completion-devel@lists.alioth.debian.org>
169#
170# This program is free software; you can redistribute it and/or modify
171# it under the terms of the GNU General Public License as published by
172# the Free Software Foundation; either version 2, or (at your option)
173# any later version.
174#
175# This program is distributed in the hope that it will be useful,
176# but WITHOUT ANY WARRANTY; without even the implied warranty of
177# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
178# GNU General Public License for more details.
179#
180# You should have received a copy of the GNU General Public License
48425792 181# along with this program; if not, see <http://www.gnu.org/licenses/>.
dbda3b10
JN
182#
183# The latest version of this software can be obtained here:
184#
185# http://bash-completion.alioth.debian.org/
186#
187# RELEASE: 2.x
188
189# This function can be used to access a tokenized list of words
190# on the command line:
191#
192# __git_reassemble_comp_words_by_ref '=:'
193# if test "${words_[cword_-1]}" = -w
194# then
195# ...
196# fi
197#
198# The argument should be a collection of characters from the list of
199# word completion separators (COMP_WORDBREAKS) to treat as ordinary
200# characters.
201#
202# This is roughly equivalent to going back in time and setting
203# COMP_WORDBREAKS to exclude those characters. The intent is to
204# make option types like --date=<type> and <rev>:<path> easy to
205# recognize by treating each shell word as a single token.
206#
207# It is best not to set COMP_WORDBREAKS directly because the value is
208# shared with other completion scripts. By the time the completion
209# function gets called, COMP_WORDS has already been populated so local
210# changes to COMP_WORDBREAKS have no effect.
211#
212# Output: words_, cword_, cur_.
213
214__git_reassemble_comp_words_by_ref()
215{
216 local exclude i j first
217 # Which word separators to exclude?
218 exclude="${1//[^$COMP_WORDBREAKS]}"
219 cword_=$COMP_CWORD
220 if [ -z "$exclude" ]; then
221 words_=("${COMP_WORDS[@]}")
222 return
223 fi
224 # List of word completion separators has shrunk;
225 # re-assemble words to complete.
226 for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
227 # Append each nonempty word consisting of just
228 # word separator characters to the current word.
229 first=t
230 while
231 [ $i -gt 0 ] &&
232 [ -n "${COMP_WORDS[$i]}" ] &&
233 # word consists of excluded word separators
234 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
235 do
236 # Attach to the previous token,
237 # unless the previous token is the command name.
238 if [ $j -ge 2 ] && [ -n "$first" ]; then
239 ((j--))
240 fi
241 first=
242 words_[$j]=${words_[j]}${COMP_WORDS[i]}
243 if [ $i = $COMP_CWORD ]; then
244 cword_=$j
245 fi
246 if (($i < ${#COMP_WORDS[@]} - 1)); then
247 ((i++))
248 else
249 # Done.
250 return
251 fi
252 done
253 words_[$j]=${words_[j]}${COMP_WORDS[i]}
254 if [ $i = $COMP_CWORD ]; then
255 cword_=$j
256 fi
257 done
258}
259
da48616f
PD
260if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
261_get_comp_words_by_ref ()
262{
dbda3b10
JN
263 local exclude cur_ words_ cword_
264 if [ "$1" = "-n" ]; then
265 exclude=$2
266 shift 2
267 fi
268 __git_reassemble_comp_words_by_ref "$exclude"
269 cur_=${words_[cword_]}
da48616f
PD
270 while [ $# -gt 0 ]; do
271 case "$1" in
272 cur)
dbda3b10 273 cur=$cur_
da48616f
PD
274 ;;
275 prev)
dbda3b10 276 prev=${words_[$cword_-1]}
da48616f
PD
277 ;;
278 words)
dbda3b10 279 words=("${words_[@]}")
da48616f
PD
280 ;;
281 cword)
dbda3b10 282 cword=$cword_
da48616f
PD
283 ;;
284 esac
285 shift
286 done
287}
288fi
289
fef56eb0
SG
290# Fills the COMPREPLY array with prefiltered words without any additional
291# processing.
292# Callers must take care of providing only words that match the current word
293# to be completed and adding any prefix and/or suffix (trailing space!), if
294# necessary.
295# 1: List of newline-separated matching completion words, complete with
296# prefix and suffix.
297__gitcomp_direct ()
298{
299 local IFS=$'\n'
300
301 COMPREPLY=($1)
302}
303
f33c2c0f 304__gitcompappend ()
1ce23aad 305{
852ff1c3 306 local x i=${#COMPREPLY[@]}
7d13e0a3
FC
307 for x in $1; do
308 if [[ "$x" == "$3"* ]]; then
309 COMPREPLY[i++]="$2$x$4"
310 fi
311 done
1ce23aad
FC
312}
313
f33c2c0f
RR
314__gitcompadd ()
315{
316 COMPREPLY=()
317 __gitcompappend "$@"
318}
319
7d13e0a3
FC
320# Generates completion reply, appending a space to possible completion words,
321# if necessary.
f674bb80
SG
322# It accepts 1 to 4 arguments:
323# 1: List of possible completion words.
324# 2: A prefix to be added to each possible completion word (optional).
325# 3: Generate possible completion matches for this word (optional).
326# 4: A suffix to be appended to each possible completion word (optional).
72e5e989
SP
327__gitcomp ()
328{
583e4d57 329 local cur_="${3-$cur}"
9244d69b 330
9244d69b 331 case "$cur_" in
5447aac7 332 --*=)
5447aac7 333 ;;
b221b5ab
NTND
334 --no-*)
335 local c i=0 IFS=$' \t\n'
336 for c in $1; do
337 if [[ $c == "--" ]]; then
338 continue
339 fi
340 c="$c${4-}"
341 if [[ $c == "$cur_"* ]]; then
342 case $c in
d9ee1e06 343 --*=|*.) ;;
b221b5ab
NTND
344 *) c="$c " ;;
345 esac
346 COMPREPLY[i++]="${2-}$c"
347 fi
348 done
349 ;;
5447aac7 350 *)
b4cfbc96
FC
351 local c i=0 IFS=$' \t\n'
352 for c in $1; do
b221b5ab
NTND
353 if [[ $c == "--" ]]; then
354 c="--no-...${4-}"
355 if [[ $c == "$cur_"* ]]; then
356 COMPREPLY[i++]="${2-}$c "
357 fi
358 break
359 fi
b4cfbc96 360 c="$c${4-}"
b4cfbc96 361 if [[ $c == "$cur_"* ]]; then
ddc996d7 362 case $c in
e1e00089 363 *=|*.) ;;
ddc996d7
FC
364 *) c="$c " ;;
365 esac
b4cfbc96
FC
366 COMPREPLY[i++]="${2-}$c"
367 fi
368 done
5447aac7
SG
369 ;;
370 esac
72e5e989
SP
371}
372
8b0eaa41
SG
373# Clear the variables caching builtins' options when (re-)sourcing
374# the completion script.
94408dc7
SG
375if [[ -n ${ZSH_VERSION-} ]]; then
376 unset $(set |sed -ne 's/^\(__gitcomp_builtin_[a-zA-Z0-9_][a-zA-Z0-9_]*\)=.*/\1/p') 2>/dev/null
377else
378 unset $(compgen -v __gitcomp_builtin_)
379fi
8b0eaa41 380
d401f3de
NTND
381# This function is equivalent to
382#
383# __gitcomp "$(git xxx --git-completion-helper) ..."
384#
385# except that the output is cached. Accept 1-3 arguments:
386# 1: the git command to execute, this is also the cache key
387# 2: extra options to be added on top (e.g. negative forms)
388# 3: options to be excluded
389__gitcomp_builtin ()
390{
391 # spaces must be replaced with underscore for multi-word
392 # commands, e.g. "git remote add" becomes remote_add.
393 local cmd="$1"
394 local incl="$2"
395 local excl="$3"
396
397 local var=__gitcomp_builtin_"${cmd/-/_}"
398 local options
399 eval "options=\$$var"
400
401 if [ -z "$options" ]; then
402 # leading and trailing spaces are significant to make
403 # option removal work correctly.
69702523
NTND
404 options=" $incl $(__git ${cmd/_/ } --git-completion-helper) " || return
405
d401f3de
NTND
406 for i in $excl; do
407 options="${options/ $i / }"
408 done
409 eval "$var=\"$options\""
410 fi
411
412 __gitcomp "$options"
413}
414
f33c2c0f
RR
415# Variation of __gitcomp_nl () that appends to the existing list of
416# completion candidates, COMPREPLY.
417__gitcomp_nl_append ()
418{
419 local IFS=$'\n'
420 __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }"
421}
422
7d13e0a3
FC
423# Generates completion reply from newline-separated possible completion words
424# by appending a space to all of them.
a31e6262
SG
425# It accepts 1 to 4 arguments:
426# 1: List of possible completion words, separated by a single newline.
427# 2: A prefix to be added to each possible completion word (optional).
428# 3: Generate possible completion matches for this word (optional).
429# 4: A suffix to be appended to each possible completion word instead of
430# the default space (optional). If specified but empty, nothing is
431# appended.
432__gitcomp_nl ()
433{
f33c2c0f
RR
434 COMPREPLY=()
435 __gitcomp_nl_append "$@"
a31e6262
SG
436}
437
7b003420
SG
438# Fills the COMPREPLY array with prefiltered paths without any additional
439# processing.
440# Callers must take care of providing only paths that match the current path
441# to be completed and adding any prefix path components, if necessary.
442# 1: List of newline-separated matching paths, complete with all prefix
06506149 443# path components.
7b003420
SG
444__gitcomp_file_direct ()
445{
446 local IFS=$'\n'
447
448 COMPREPLY=($1)
449
450 # use a hack to enable file mode in bash < 4
451 compopt -o filenames +o nospace 2>/dev/null ||
8b4c2e0b
SG
452 compgen -f /non-existing-dir/ >/dev/null ||
453 true
7b003420
SG
454}
455
fea16b47
MP
456# Generates completion reply with compgen from newline-separated possible
457# completion filenames.
458# It accepts 1 to 3 arguments:
459# 1: List of possible completion filenames, separated by a single newline.
460# 2: A directory prefix to be added to each possible completion filename
461# (optional).
462# 3: Generate possible completion matches for this word (optional).
463__gitcomp_file ()
464{
465 local IFS=$'\n'
466
467 # XXX does not work when the directory prefix contains a tilde,
468 # since tilde expansion is not applied.
469 # This means that COMPREPLY will be empty and Bash default
470 # completion will be used.
0afe8e9e 471 __gitcompadd "$1" "${2-}" "${3-$cur}" ""
fea16b47 472
3ffa4df4 473 # use a hack to enable file mode in bash < 4
fbe45118 474 compopt -o filenames +o nospace 2>/dev/null ||
8b4c2e0b
SG
475 compgen -f /non-existing-dir/ >/dev/null ||
476 true
fea16b47
MP
477}
478
f825972c
FC
479# Execute 'git ls-files', unless the --committable option is specified, in
480# which case it runs 'git diff-index' to find out the files that can be
481# committed. It return paths relative to the directory specified in the first
482# argument, and using the options specified in the second argument.
fea16b47
MP
483__git_ls_files_helper ()
484{
fca416a4 485 if [ "$2" == "--committable" ]; then
3dfe23ba 486 __git -C "$1" -c core.quotePath=false diff-index \
a364e984 487 --name-only --relative HEAD -- "${3//\\/\\\\}*"
fca416a4
JH
488 else
489 # NOTE: $2 is not quoted in order to support multiple options
3dfe23ba 490 __git -C "$1" -c core.quotePath=false ls-files \
a364e984 491 --exclude-standard $2 -- "${3//\\/\\\\}*"
e15098a3 492 fi
35ba83cc 493}
fea16b47
MP
494
495
fea16b47
MP
496# __git_index_files accepts 1 or 2 arguments:
497# 1: Options to pass to ls-files (required).
fea16b47
MP
498# 2: A directory path (optional).
499# If provided, only files within the specified directory are listed.
500# Sub directories are never recursed. Path must have a trailing
501# slash.
a364e984 502# 3: List only paths matching this path component (optional).
fea16b47
MP
503__git_index_files ()
504{
105c0eff 505 local root="$2" match="$3"
fea16b47 506
a364e984 507 __git_ls_files_helper "$root" "$1" "$match" |
7b003420 508 awk -F / -v pfx="${2//\\/\\\\}" '{
c1bc0a0e
SG
509 paths[$1] = 1
510 }
511 END {
193757f8
SG
512 for (p in paths) {
513 if (substr(p, 1, 1) != "\"") {
514 # No special characters, easy!
7b003420 515 print pfx p
193757f8
SG
516 continue
517 }
518
519 # The path is quoted.
520 p = dequote(p)
521 if (p == "")
522 continue
523
524 # Even when a directory name itself does not contain
525 # any special characters, it will still be quoted if
526 # any of its (stripped) trailing path components do.
08a12175 527 # Because of this we may have seen the same directory
193757f8
SG
528 # both quoted and unquoted.
529 if (p in paths)
530 # We have seen the same directory unquoted,
531 # skip it.
532 continue
533 else
7b003420 534 print pfx p
193757f8
SG
535 }
536 }
537 function dequote(p, bs_idx, out, esc, esc_idx, dec) {
538 # Skip opening double quote.
539 p = substr(p, 2)
540
541 # Interpret backslash escape sequences.
542 while ((bs_idx = index(p, "\\")) != 0) {
543 out = out substr(p, 1, bs_idx - 1)
544 esc = substr(p, bs_idx + 1, 1)
545 p = substr(p, bs_idx + 2)
546
547 if ((esc_idx = index("abtvfr\"\\", esc)) != 0) {
548 # C-style one-character escape sequence.
549 out = out substr("\a\b\t\v\f\r\"\\",
550 esc_idx, 1)
551 } else if (esc == "n") {
552 # Uh-oh, a newline character.
15beaaa3 553 # We cannot reliably put a pathname
193757f8
SG
554 # containing a newline into COMPREPLY,
555 # and the newline would create a mess.
556 # Skip this path.
557 return ""
558 } else {
559 # Must be a \nnn octal value, then.
560 dec = esc * 64 + \
561 substr(p, 1, 1) * 8 + \
562 substr(p, 2, 1)
563 out = out sprintf("%c", dec)
564 p = substr(p, 3)
565 }
566 }
567 # Drop closing double quote, if there is one.
15beaaa3 568 # (There is not any if this is a directory, as it was
193757f8
SG
569 # already stripped with the trailing path components.)
570 if (substr(p, length(p), 1) == "\"")
571 out = out substr(p, 1, length(p) - 1)
572 else
573 out = out p
574
575 return out
c1bc0a0e 576 }'
fea16b47
MP
577}
578
722e31c7
SG
579# __git_complete_index_file requires 1 argument:
580# 1: the options to pass to ls-file
581#
582# The exception is --committable, which finds the files appropriate commit.
583__git_complete_index_file ()
584{
f12785a3 585 local dequoted_word pfx="" cur_
722e31c7 586
f12785a3
SG
587 __git_dequote "$cur"
588
589 case "$dequoted_word" in
722e31c7 590 ?*/*)
f12785a3
SG
591 pfx="${dequoted_word%/*}/"
592 cur_="${dequoted_word##*/}"
722e31c7 593 ;;
f12785a3
SG
594 *)
595 cur_="$dequoted_word"
722e31c7
SG
596 esac
597
7b003420 598 __gitcomp_file_direct "$(__git_index_files "$1" "$pfx" "$cur_")"
fea16b47
MP
599}
600
227307a6
SG
601# Lists branches from the local repository.
602# 1: A prefix to be added to each listed branch (optional).
603# 2: List only branches matching this word (optional; list all branches if
604# unset or empty).
605# 3: A suffix to be appended to each listed branch (optional).
5de40f59
SP
606__git_heads ()
607{
227307a6
SG
608 local pfx="${1-}" cur_="${2-}" sfx="${3-}"
609
610 __git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
611 "refs/heads/$cur_*" "refs/heads/$cur_*/**"
5de40f59
SP
612}
613
227307a6
SG
614# Lists tags from the local repository.
615# Accepts the same positional parameters as __git_heads() above.
88e21dc7
SP
616__git_tags ()
617{
227307a6
SG
618 local pfx="${1-}" cur_="${2-}" sfx="${3-}"
619
620 __git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
621 "refs/tags/$cur_*" "refs/tags/$cur_*/**"
88e21dc7
SP
622}
623
be6fbdb5
SG
624# Lists refs from the local (by default) or from a remote repository.
625# It accepts 0, 1 or 2 arguments:
626# 1: The remote to list refs from (optional; ignored, if set but empty).
91b7ea81 627# Can be the name of a configured remote, a path, or a URL.
be6fbdb5
SG
628# 2: In addition to local refs, list unique branches from refs/remotes/ for
629# 'git checkout's tracking DWIMery (optional; ignored, if set but empty).
fef56eb0 630# 3: A prefix to be added to each listed ref (optional).
e896369b
SG
631# 4: List only refs matching this word (optional; list all refs if unset or
632# empty).
fef56eb0
SG
633# 5: A suffix to be appended to each listed ref (optional; ignored, if set
634# but empty).
15b4a163
SG
635#
636# Use __git_complete_refs() instead.
690d8824
JH
637__git_refs ()
638{
fad9484f 639 local i hash dir track="${2-}"
5c12f642 640 local list_refs_from=path remote="${1-}"
fef56eb0
SG
641 local format refs
642 local pfx="${3-}" cur_="${4-$cur}" sfx="${5-}"
e896369b 643 local match="${4-}"
fef56eb0 644 local fer_pfx="${pfx//\%/%%}" # "escape" for-each-ref format specifiers
5c12f642 645
fad9484f
SG
646 __git_find_repo_path
647 dir="$__git_repo_path"
648
62a1b732
SG
649 if [ -z "$remote" ]; then
650 if [ -z "$dir" ]; then
651 return
652 fi
653 else
69a77596
SG
654 if __git_is_configured_remote "$remote"; then
655 # configured remote takes precedence over a
656 # local directory with the same name
657 list_refs_from=remote
658 elif [ -d "$remote/.git" ]; then
5c12f642
SG
659 dir="$remote/.git"
660 elif [ -d "$remote" ]; then
661 dir="$remote"
662 else
69a77596 663 list_refs_from=url
5c12f642
SG
664 fi
665 fi
666
62a1b732 667 if [ "$list_refs_from" = path ]; then
aed38813 668 if [[ "$cur_" == ^* ]]; then
fef56eb0
SG
669 pfx="$pfx^"
670 fer_pfx="$fer_pfx^"
aed38813 671 cur_=${cur_#^}
e896369b 672 match=${match#^}
aed38813 673 fi
2ea328a1 674 case "$cur_" in
608efb87
SG
675 refs|refs/*)
676 format="refname"
e896369b 677 refs=("$match*" "$match*/**")
34a6bbb5 678 track=""
608efb87
SG
679 ;;
680 *)
fbd7a232 681 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD REBASE_HEAD; do
e896369b
SG
682 case "$i" in
683 $match*)
684 if [ -e "$dir/$i" ]; then
fef56eb0 685 echo "$pfx$i$sfx"
e896369b
SG
686 fi
687 ;;
688 esac
d23e7570 689 done
b2b68114 690 format="refname:strip=2"
e896369b
SG
691 refs=("refs/tags/$match*" "refs/tags/$match*/**"
692 "refs/heads/$match*" "refs/heads/$match*/**"
693 "refs/remotes/$match*" "refs/remotes/$match*/**")
608efb87
SG
694 ;;
695 esac
fef56eb0 696 __git_dir="$dir" __git for-each-ref --format="$fer_pfx%($format)$sfx" \
e896369b 697 "${refs[@]}"
34a6bbb5
KB
698 if [ -n "$track" ]; then
699 # employ the heuristic used by git checkout
700 # Try to find a remote branch that matches the completion word
701 # but only output if the branch name is unique
fef56eb0 702 __git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
400a7553 703 --sort="refname:strip=3" \
824388d5 704 "refs/remotes/*/$match*" "refs/remotes/*/$match*/**" | \
400a7553 705 uniq -u
34a6bbb5 706 fi
35e65ecc 707 return
690d8824 708 fi
2ea328a1 709 case "$cur_" in
fb772cca 710 refs|refs/*)
e896369b 711 __git ls-remote "$remote" "$match*" | \
6f2dd720 712 while read -r hash i; do
fb772cca
SG
713 case "$i" in
714 *^{}) ;;
fef56eb0 715 *) echo "$pfx$i$sfx" ;;
fb772cca
SG
716 esac
717 done
718 ;;
719 *)
91b7ea81 720 if [ "$list_refs_from" = remote ]; then
e896369b 721 case "HEAD" in
fef56eb0 722 $match*) echo "${pfx}HEAD$sfx" ;;
e896369b 723 esac
fef56eb0 724 __git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
e896369b 725 "refs/remotes/$remote/$match*" \
e8cb0234 726 "refs/remotes/$remote/$match*/**"
91b7ea81 727 else
e896369b
SG
728 local query_symref
729 case "HEAD" in
730 $match*) query_symref="HEAD" ;;
731 esac
732 __git ls-remote "$remote" $query_symref \
733 "refs/tags/$match*" "refs/heads/$match*" \
734 "refs/remotes/$match*" |
91b7ea81
SG
735 while read -r hash i; do
736 case "$i" in
737 *^{}) ;;
fef56eb0
SG
738 refs/*) echo "$pfx${i#refs/*/}$sfx" ;;
739 *) echo "$pfx$i$sfx" ;; # symbolic refs
91b7ea81
SG
740 esac
741 done
742 fi
fb772cca
SG
743 ;;
744 esac
690d8824
JH
745}
746
15b4a163
SG
747# Completes refs, short and long, local and remote, symbolic and pseudo.
748#
749# Usage: __git_complete_refs [<option>]...
750# --remote=<remote>: The remote to list refs from, can be the name of a
751# configured remote, a path, or a URL.
0408c6b4 752# --dwim: List unique remote branches for 'git switch's tracking DWIMery.
15b4a163
SG
753# --pfx=<prefix>: A prefix to be added to each ref.
754# --cur=<word>: The current ref to be completed. Defaults to the current
755# word to be completed.
756# --sfx=<suffix>: A suffix to be appended to each ref instead of the default
757# space.
758__git_complete_refs ()
759{
0408c6b4 760 local remote dwim pfx cur_="$cur" sfx=" "
15b4a163
SG
761
762 while test $# != 0; do
763 case "$1" in
764 --remote=*) remote="${1##--remote=}" ;;
0408c6b4
JK
765 --dwim) dwim="yes" ;;
766 # --track is an old spelling of --dwim
767 --track) dwim="yes" ;;
15b4a163
SG
768 --pfx=*) pfx="${1##--pfx=}" ;;
769 --cur=*) cur_="${1##--cur=}" ;;
770 --sfx=*) sfx="${1##--sfx=}" ;;
771 *) return 1 ;;
772 esac
773 shift
774 done
775
0408c6b4 776 __gitcomp_direct "$(__git_refs "$remote" "$dwim" "$pfx" "$cur_" "$sfx")"
15b4a163
SG
777}
778
a42577d4 779# __git_refs2 requires 1 argument (to pass to __git_refs)
aa0644f7 780# Deprecated: use __git_complete_fetch_refspecs() instead.
690d8824
JH
781__git_refs2 ()
782{
67ffa114
SP
783 local i
784 for i in $(__git_refs "$1"); do
785 echo "$i:$i"
690d8824
JH
786 done
787}
788
aa0644f7
SG
789# Completes refspecs for fetching from a remote repository.
790# 1: The remote repository.
791# 2: A prefix to be added to each listed refspec (optional).
792# 3: The ref to be completed as a refspec instead of the current word to be
793# completed (optional)
794# 4: A suffix to be appended to each listed refspec instead of the default
795# space (optional).
796__git_complete_fetch_refspecs ()
797{
798 local i remote="$1" pfx="${2-}" cur_="${3-$cur}" sfx="${4- }"
799
745d655d 800 __gitcomp_direct "$(
aa0644f7 801 for i in $(__git_refs "$remote" "" "" "$cur_") ; do
745d655d 802 echo "$pfx$i:$i$sfx"
aa0644f7 803 done
745d655d 804 )"
aa0644f7
SG
805}
806
a42577d4 807# __git_refs_remotes requires 1 argument (to pass to ls-remote)
5de40f59
SP
808__git_refs_remotes ()
809{
48058f5d 810 local i hash
e15098a3 811 __git ls-remote "$1" 'refs/heads/*' | \
6f2dd720 812 while read -r hash i; do
48058f5d 813 echo "$i:refs/remotes/$1/${i#refs/heads/}"
5de40f59
SP
814 done
815}
816
690d8824
JH
817__git_remotes ()
818{
fad9484f
SG
819 __git_find_repo_path
820 test -d "$__git_repo_path/remotes" && ls -1 "$__git_repo_path/remotes"
1cd23e9e 821 __git remote
690d8824
JH
822}
823
69a77596
SG
824# Returns true if $1 matches the name of a configured remote, false otherwise.
825__git_is_configured_remote ()
826{
827 local remote
828 for remote in $(__git_remotes); do
829 if [ "$remote" = "$1" ]; then
830 return 0
831 fi
832 done
833 return 1
690d8824
JH
834}
835
eaa4e6ee 836__git_list_merge_strategies ()
4ad91321 837{
7cc763aa 838 LANG=C LC_ALL=C git merge -s help 2>&1 |
25b3d4d6
JH
839 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
840 s/\.$//
841 s/.*://
842 s/^[ ]*//
843 s/[ ]*$//
4ad91321 844 p
25b3d4d6 845 }'
4ad91321 846}
eaa4e6ee
JN
847
848__git_merge_strategies=
849# 'git merge -s help' (and thus detection of the merge strategy
850# list) fails, unfortunately, if run outside of any git working
851# tree. __git_merge_strategies is set to the empty string in
852# that case, and the detection will be repeated the next time it
853# is needed.
854__git_compute_merge_strategies ()
855{
cf0ff02a
FC
856 test -n "$__git_merge_strategies" ||
857 __git_merge_strategies=$(__git_list_merge_strategies)
eaa4e6ee 858}
4ad91321 859
5a59a230
NTND
860__git_merge_strategy_options="ours theirs subtree subtree= patience
861 histogram diff-algorithm= ignore-space-change ignore-all-space
862 ignore-space-at-eol renormalize no-renormalize no-renames
863 find-renames find-renames= rename-threshold="
864
1d66ec58 865__git_complete_revlist_file ()
690d8824 866{
6d54f528 867 local dequoted_word pfx ls ref cur_="$cur"
9244d69b 868 case "$cur_" in
1d66ec58
SG
869 *..?*:*)
870 return
871 ;;
690d8824 872 ?*:*)
9244d69b
SG
873 ref="${cur_%%:*}"
874 cur_="${cur_#*:}"
6d54f528
CY
875
876 __git_dequote "$cur_"
877
878 case "$dequoted_word" in
690d8824 879 ?*/*)
6d54f528
CY
880 pfx="${dequoted_word%/*}"
881 cur_="${dequoted_word##*/}"
690d8824
JH
882 ls="$ref:$pfx"
883 pfx="$pfx/"
884 ;;
885 *)
6d54f528 886 cur_="$dequoted_word"
690d8824
JH
887 ls="$ref"
888 ;;
80152b09 889 esac
db8a9ff0
SP
890
891 case "$COMP_WORDBREAKS" in
892 *:*) : great ;;
893 *) pfx="$ref:$pfx" ;;
894 esac
895
6d54f528
CY
896 __gitcomp_file "$(__git ls-tree "$ls" \
897 | sed 's/^.* //
898 s/$//')" \
899 "$pfx" "$cur_"
690d8824 900 ;;
f53352fb 901 *...*)
9244d69b
SG
902 pfx="${cur_%...*}..."
903 cur_="${cur_#*...}"
15b4a163 904 __git_complete_refs --pfx="$pfx" --cur="$cur_"
f53352fb
SP
905 ;;
906 *..*)
9244d69b
SG
907 pfx="${cur_%..*}.."
908 cur_="${cur_#*..}"
15b4a163 909 __git_complete_refs --pfx="$pfx" --cur="$cur_"
b3391775 910 ;;
f53352fb 911 *)
15b4a163 912 __git_complete_refs
f53352fb
SP
913 ;;
914 esac
915}
916
1d66ec58
SG
917__git_complete_file ()
918{
919 __git_complete_revlist_file
920}
921
922__git_complete_revlist ()
923{
924 __git_complete_revlist_file
925}
926
52d5c3b5
JS
927__git_complete_remote_or_refspec ()
928{
9244d69b 929 local cur_="$cur" cmd="${words[1]}"
0a4e1472 930 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
f1c6ffe6 931 if [ "$cmd" = "remote" ]; then
6e8c755f 932 ((c++))
f1c6ffe6 933 fi
da48616f
PD
934 while [ $c -lt $cword ]; do
935 i="${words[c]}"
52d5c3b5 936 case "$i" in
e25e2b42 937 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
723c1d52 938 -d|--delete) [ "$cmd" = "push" ] && lhs=0 ;;
e25e2b42
BG
939 --all)
940 case "$cmd" in
941 push) no_complete_refspec=1 ;;
942 fetch)
e25e2b42
BG
943 return
944 ;;
945 *) ;;
946 esac
947 ;;
b5619f6d 948 --multiple) no_complete_refspec=1; break ;;
52d5c3b5
JS
949 -*) ;;
950 *) remote="$i"; break ;;
951 esac
6e8c755f 952 ((c++))
52d5c3b5
JS
953 done
954 if [ -z "$remote" ]; then
a31e6262 955 __gitcomp_nl "$(__git_remotes)"
52d5c3b5
JS
956 return
957 fi
0a4e1472 958 if [ $no_complete_refspec = 1 ]; then
0a4e1472
JS
959 return
960 fi
52d5c3b5 961 [ "$remote" = "." ] && remote=
9244d69b 962 case "$cur_" in
52d5c3b5
JS
963 *:*)
964 case "$COMP_WORDBREAKS" in
965 *:*) : great ;;
9244d69b 966 *) pfx="${cur_%%:*}:" ;;
52d5c3b5 967 esac
9244d69b 968 cur_="${cur_#*:}"
52d5c3b5
JS
969 lhs=0
970 ;;
971 +*)
972 pfx="+"
9244d69b 973 cur_="${cur_#+}"
52d5c3b5
JS
974 ;;
975 esac
976 case "$cmd" in
977 fetch)
978 if [ $lhs = 1 ]; then
aa0644f7 979 __git_complete_fetch_refspecs "$remote" "$pfx" "$cur_"
52d5c3b5 980 else
15b4a163 981 __git_complete_refs --pfx="$pfx" --cur="$cur_"
52d5c3b5
JS
982 fi
983 ;;
f1c6ffe6 984 pull|remote)
52d5c3b5 985 if [ $lhs = 1 ]; then
15b4a163 986 __git_complete_refs --remote="$remote" --pfx="$pfx" --cur="$cur_"
52d5c3b5 987 else
15b4a163 988 __git_complete_refs --pfx="$pfx" --cur="$cur_"
52d5c3b5
JS
989 fi
990 ;;
991 push)
992 if [ $lhs = 1 ]; then
15b4a163 993 __git_complete_refs --pfx="$pfx" --cur="$cur_"
52d5c3b5 994 else
15b4a163 995 __git_complete_refs --remote="$remote" --pfx="$pfx" --cur="$cur_"
52d5c3b5
JS
996 fi
997 ;;
998 esac
999}
1000
3c7b480a
JS
1001__git_complete_strategy ()
1002{
eaa4e6ee 1003 __git_compute_merge_strategies
da48616f 1004 case "$prev" in
3c7b480a 1005 -s|--strategy)
eaa4e6ee 1006 __gitcomp "$__git_merge_strategies"
3c7b480a 1007 return 0
5a59a230
NTND
1008 ;;
1009 -X)
1010 __gitcomp "$__git_merge_strategy_options"
1011 return 0
1012 ;;
3c7b480a 1013 esac
3c7b480a
JS
1014 case "$cur" in
1015 --strategy=*)
eaa4e6ee 1016 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
3c7b480a
JS
1017 return 0
1018 ;;
5a59a230
NTND
1019 --strategy-option=*)
1020 __gitcomp "$__git_merge_strategy_options" "" "${cur##--strategy-option=}"
1021 return 0
1022 ;;
3c7b480a
JS
1023 esac
1024 return 1
1025}
1026
eaa4e6ee
JN
1027__git_all_commands=
1028__git_compute_all_commands ()
1029{
cf0ff02a 1030 test -n "$__git_all_commands" ||
2eb6f09f 1031 __git_all_commands=$(__git --list-cmds=main,others,alias,nohelpers)
eaa4e6ee 1032}
f2bb9f88 1033
e8f9e428
SG
1034# Lists all set config variables starting with the given section prefix,
1035# with the prefix removed.
1036__git_get_config_variables ()
c3898111 1037{
e8f9e428 1038 local section="$1" i IFS=$'\n'
e15098a3 1039 for i in $(__git config --name-only --get-regexp "^$section\..*"); do
905f2036 1040 echo "${i#$section.}"
c3898111
SG
1041 done
1042}
1043
c3898111
SG
1044__git_pretty_aliases ()
1045{
e8f9e428 1046 __git_get_config_variables "pretty"
c3898111
SG
1047}
1048
a42577d4 1049# __git_aliased_command requires 1 argument
367dce2a
DS
1050__git_aliased_command ()
1051{
e15098a3 1052 local word cmdline=$(__git config --get "alias.$1")
367dce2a 1053 for word in $cmdline; do
c63437cb 1054 case "$word" in
66729509
SG
1055 \!gitk|gitk)
1056 echo "gitk"
367dce2a 1057 return
66729509 1058 ;;
c63437cb
SG
1059 \!*) : shell command alias ;;
1060 -*) : option ;;
1061 *=*) : setting env ;;
1062 git) : git itself ;;
56f24e80
SP
1063 \(\)) : skip parens of shell function definition ;;
1064 {) : skip start of shell helper function ;;
1065 :) : skip null command ;;
1066 \'*) : skip opening quote after sh -c ;;
c63437cb
SG
1067 *)
1068 echo "$word"
367dce2a 1069 return
c63437cb 1070 esac
367dce2a
DS
1071 done
1072}
1073
d447fe2b
SG
1074# Check whether one of the given words is present on the command line,
1075# and print the first word found.
367efd54
SG
1076#
1077# Usage: __git_find_on_cmdline [<option>]... "<wordlist>"
1078# --show-idx: Optionally show the index of the found word in the $words array.
918c03c2 1079__git_find_on_cmdline ()
3ff1320d 1080{
367efd54
SG
1081 local word c=1 show_idx
1082
1083 while test $# -gt 1; do
1084 case "$1" in
1085 --show-idx) show_idx=y ;;
1086 *) return 1 ;;
1087 esac
1088 shift
1089 done
d447fe2b
SG
1090 local wordlist="$1"
1091
da48616f 1092 while [ $c -lt $cword ]; do
d447fe2b
SG
1093 for word in $wordlist; do
1094 if [ "$word" = "${words[c]}" ]; then
367efd54
SG
1095 if [ -n "$show_idx" ]; then
1096 echo "$c $word"
1097 else
1098 echo "$word"
1099 fi
3ff1320d
SG
1100 return
1101 fi
1102 done
6e8c755f 1103 ((c++))
3ff1320d
SG
1104 done
1105}
1106
7c599e92
TB
1107# Echo the value of an option set on the command line or config
1108#
1109# $1: short option name
1110# $2: long option name including =
1111# $3: list of possible values
1112# $4: config string (optional)
1113#
1114# example:
1115# result="$(__git_get_option_value "-d" "--do-something=" \
1116# "yes no" "core.doSomething")"
1117#
1118# result is then either empty (no option set) or "yes" or "no"
1119#
1120# __git_get_option_value requires 3 arguments
1121__git_get_option_value ()
1122{
1123 local c short_opt long_opt val
1124 local result= values config_key word
1125
1126 short_opt="$1"
1127 long_opt="$2"
1128 values="$3"
1129 config_key="$4"
1130
1131 ((c = $cword - 1))
1132 while [ $c -ge 0 ]; do
1133 word="${words[c]}"
1134 for val in $values; do
1135 if [ "$short_opt$val" = "$word" ] ||
1136 [ "$long_opt$val" = "$word" ]; then
1137 result="$val"
1138 break 2
1139 fi
1140 done
1141 ((c--))
1142 done
1143
1144 if [ -n "$config_key" ] && [ -z "$result" ]; then
1cd23e9e 1145 result="$(__git config "$config_key")"
7c599e92
TB
1146 fi
1147
1148 echo "$result"
1149}
1150
d773c631
SG
1151__git_has_doubledash ()
1152{
da4902a7 1153 local c=1
da48616f
PD
1154 while [ $c -lt $cword ]; do
1155 if [ "--" = "${words[c]}" ]; then
d773c631
SG
1156 return 0
1157 fi
6e8c755f 1158 ((c++))
d773c631
SG
1159 done
1160 return 1
1161}
1162
fea16b47
MP
1163# Try to count non option arguments passed on the command line for the
1164# specified git command.
1165# When options are used, it is necessary to use the special -- option to
1166# tell the implementation were non option arguments begin.
1167# XXX this can not be improved, since options can appear everywhere, as
1168# an example:
1169# git mv x -n y
1170#
1171# __git_count_arguments requires 1 argument: the git command executed.
1172__git_count_arguments ()
1173{
1174 local word i c=0
1175
1176 # Skip "git" (first argument)
1177 for ((i=1; i < ${#words[@]}; i++)); do
1178 word="${words[i]}"
1179
1180 case "$word" in
1181 --)
1182 # Good; we can assume that the following are only non
1183 # option arguments.
1184 ((c = 0))
1185 ;;
1186 "$1")
1187 # Skip the specified git command and discard git
1188 # main options
1189 ((c = 0))
1190 ;;
1191 ?*)
1192 ((c++))
1193 ;;
1194 esac
1195 done
1196
1197 printf "%d" $c
1198}
1199
7950659d 1200__git_whitespacelist="nowarn warn error error-all fix"
5a59a230 1201__git_patchformat="mbox stgit stgit-series hg mboxrd"
aa416b22 1202__git_showcurrentpatch="diff raw"
7fb6aefd 1203__git_am_inprogress_options="--skip --continue --resolved --abort --quit --show-current-patch"
88329195
SP
1204
1205_git_am ()
1206{
fad9484f
SG
1207 __git_find_repo_path
1208 if [ -d "$__git_repo_path"/rebase-apply ]; then
be3ce6b2 1209 __gitcomp "$__git_am_inprogress_options"
88329195
SP
1210 return
1211 fi
1212 case "$cur" in
1213 --whitespace=*)
b3391775 1214 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
1215 return
1216 ;;
5a59a230
NTND
1217 --patch-format=*)
1218 __gitcomp "$__git_patchformat" "" "${cur##--patch-format=}"
1219 return
1220 ;;
f3b48228
PB
1221 --show-current-patch=*)
1222 __gitcomp "$__git_showcurrentpatch" "" "${cur##--show-current-patch=}"
1223 return
1224 ;;
88329195 1225 --*)
2b1c01d2 1226 __gitcomp_builtin am "" \
be3ce6b2 1227 "$__git_am_inprogress_options"
88329195
SP
1228 return
1229 esac
88329195
SP
1230}
1231
1232_git_apply ()
1233{
88329195
SP
1234 case "$cur" in
1235 --whitespace=*)
b3391775 1236 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
1237 return
1238 ;;
1239 --*)
b8e9d662 1240 __gitcomp_builtin apply
88329195
SP
1241 return
1242 esac
88329195
SP
1243}
1244
8435b548
SP
1245_git_add ()
1246{
8435b548 1247 case "$cur" in
5a59a230
NTND
1248 --chmod=*)
1249 __gitcomp "+x -x" "" "${cur##--chmod=}"
1250 return
1251 ;;
8435b548 1252 --*)
e1bea2c0 1253 __gitcomp_builtin add
8435b548
SP
1254 return
1255 esac
fea16b47 1256
bd9ab9df
CW
1257 local complete_opt="--others --modified --directory --no-empty-directory"
1258 if test -n "$(__git_find_on_cmdline "-u --update")"
1259 then
1260 complete_opt="--modified"
1261 fi
1262 __git_complete_index_file "$complete_opt"
8435b548
SP
1263}
1264
b3191ce2
LM
1265_git_archive ()
1266{
b3191ce2
LM
1267 case "$cur" in
1268 --format=*)
1269 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
1270 return
1271 ;;
1272 --remote=*)
a31e6262 1273 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
b3191ce2
LM
1274 return
1275 ;;
1276 --*)
aeeb978b 1277 __gitcomp_builtin archive "--format= --list --verbose --prefix= --worktree-attributes"
b3191ce2
LM
1278 return
1279 ;;
1280 esac
1281 __git_complete_file
1282}
1283
b2e69f62
SP
1284_git_bisect ()
1285{
d773c631
SG
1286 __git_has_doubledash && return
1287
bf11d461 1288 local subcommands="start bad good skip reset visualize replay log run"
918c03c2 1289 local subcommand="$(__git_find_on_cmdline "$subcommands")"
3ff1320d 1290 if [ -z "$subcommand" ]; then
fad9484f
SG
1291 __git_find_repo_path
1292 if [ -f "$__git_repo_path"/BISECT_START ]; then
128191f5
SG
1293 __gitcomp "$subcommands"
1294 else
1295 __gitcomp "replay start"
1296 fi
b2e69f62
SP
1297 return
1298 fi
1299
3ff1320d 1300 case "$subcommand" in
8205ff8e 1301 bad|good|reset|skip|start)
15b4a163 1302 __git_complete_refs
b2e69f62
SP
1303 ;;
1304 *)
b2e69f62
SP
1305 ;;
1306 esac
1307}
1308
5a59a230
NTND
1309__git_ref_fieldlist="refname objecttype objectsize objectname upstream push HEAD symref"
1310
690d8824
JH
1311_git_branch ()
1312{
da4902a7 1313 local i c=1 only_local_ref="n" has_r="n"
b9217642 1314
da48616f
PD
1315 while [ $c -lt $cword ]; do
1316 i="${words[c]}"
b9217642 1317 case "$i" in
2703c22f
VS
1318 -d|--delete|-m|--move) only_local_ref="y" ;;
1319 -r|--remotes) has_r="y" ;;
b9217642 1320 esac
6e8c755f 1321 ((c++))
b9217642
SG
1322 done
1323
da48616f 1324 case "$cur" in
ca45d0fa 1325 --set-upstream-to=*)
15b4a163 1326 __git_complete_refs --cur="${cur##--set-upstream-to=}"
ca45d0fa 1327 ;;
3b376b0c 1328 --*)
2b1c01d2 1329 __gitcomp_builtin branch
3b376b0c 1330 ;;
b9217642
SG
1331 *)
1332 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
227307a6 1333 __gitcomp_direct "$(__git_heads "" "$cur" " ")"
b9217642 1334 else
15b4a163 1335 __git_complete_refs
b9217642
SG
1336 fi
1337 ;;
3b376b0c 1338 esac
690d8824
JH
1339}
1340
374a58c9
ML
1341_git_bundle ()
1342{
da48616f
PD
1343 local cmd="${words[2]}"
1344 case "$cword" in
8d8163f3 1345 2)
374a58c9
ML
1346 __gitcomp "create list-heads verify unbundle"
1347 ;;
8d8163f3 1348 3)
374a58c9
ML
1349 # looking for a file
1350 ;;
1351 *)
1352 case "$cmd" in
1353 create)
1354 __git_complete_revlist
1355 ;;
1356 esac
1357 ;;
1358 esac
1359}
1360
690d8824
JH
1361_git_checkout ()
1362{
c84bb14c
SG
1363 __git_has_doubledash && return
1364
e648f8b6
SG
1365 case "$cur" in
1366 --conflict=*)
1367 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1368 ;;
1369 --*)
2b1c01d2 1370 __gitcomp_builtin checkout
e648f8b6
SG
1371 ;;
1372 *)
34a6bbb5
KB
1373 # check if --track, --no-track, or --no-guess was specified
1374 # if so, disable DWIM mode
0408c6b4 1375 local flags="--track --no-track --no-guess" dwim_opt="--dwim"
60e71bbc
JK
1376 if [ "$GIT_COMPLETION_CHECKOUT_NO_GUESS" = "1" ] ||
1377 [ -n "$(__git_find_on_cmdline "$flags")" ]; then
0408c6b4 1378 dwim_opt=''
34a6bbb5 1379 fi
0408c6b4 1380 __git_complete_refs $dwim_opt
e648f8b6
SG
1381 ;;
1382 esac
690d8824
JH
1383}
1384
b1b16bba 1385__git_sequencer_inprogress_options="--continue --quit --abort --skip"
deaa65a7
DL
1386
1387__git_cherry_pick_inprogress_options=$__git_sequencer_inprogress_options
660003e2 1388
1273231e
SP
1389_git_cherry_pick ()
1390{
fad9484f
SG
1391 __git_find_repo_path
1392 if [ -f "$__git_repo_path"/CHERRY_PICK_HEAD ]; then
660003e2 1393 __gitcomp "$__git_cherry_pick_inprogress_options"
7655fa7f
FC
1394 return
1395 fi
5a59a230
NTND
1396
1397 __git_complete_strategy && return
1398
1273231e
SP
1399 case "$cur" in
1400 --*)
660003e2
NTND
1401 __gitcomp_builtin cherry-pick "" \
1402 "$__git_cherry_pick_inprogress_options"
1273231e
SP
1403 ;;
1404 *)
15b4a163 1405 __git_complete_refs
1273231e
SP
1406 ;;
1407 esac
1408}
1409
4181c7e8
LM
1410_git_clean ()
1411{
4181c7e8
LM
1412 case "$cur" in
1413 --*)
26e90958 1414 __gitcomp_builtin clean
4181c7e8
LM
1415 return
1416 ;;
1417 esac
fea16b47
MP
1418
1419 # XXX should we check for -x option ?
ea95c7b8 1420 __git_complete_index_file "--others --directory"
4181c7e8
LM
1421}
1422
3eb11012
LM
1423_git_clone ()
1424{
88cd790d
SG
1425 case "$prev" in
1426 -c|--config)
1427 __git_complete_config_variable_name_and_value
1428 return
1429 ;;
1430 esac
3eb11012 1431 case "$cur" in
5af9d5f6
SG
1432 --config=*)
1433 __git_complete_config_variable_name_and_value \
1434 --cur="${cur##--config=}"
1435 return
1436 ;;
3eb11012 1437 --*)
2b1c01d2 1438 __gitcomp_builtin clone
3eb11012
LM
1439 return
1440 ;;
1441 esac
3eb11012
LM
1442}
1443
21d2a9e3
TB
1444__git_untracked_file_modes="all no normal"
1445
4548e855
SP
1446_git_commit ()
1447{
fea16b47
MP
1448 case "$prev" in
1449 -c|-C)
15b4a163 1450 __git_complete_refs
fea16b47
MP
1451 return
1452 ;;
1453 esac
d773c631 1454
4548e855 1455 case "$cur" in
9a424b27 1456 --cleanup=*)
72dbb365 1457 __gitcomp "default scissors strip verbatim whitespace
9a424b27
SG
1458 " "" "${cur##--cleanup=}"
1459 return
1460 ;;
77653abd
TM
1461 --reuse-message=*|--reedit-message=*|\
1462 --fixup=*|--squash=*)
15b4a163 1463 __git_complete_refs --cur="${cur#*=}"
9a424b27
SG
1464 return
1465 ;;
1466 --untracked-files=*)
21d2a9e3 1467 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
9a424b27
SG
1468 return
1469 ;;
4548e855 1470 --*)
2b1c01d2 1471 __gitcomp_builtin commit
4548e855
SP
1472 return
1473 esac
fea16b47 1474
1cd23e9e 1475 if __git rev-parse --verify --quiet HEAD >/dev/null; then
f825972c 1476 __git_complete_index_file "--committable"
fea16b47
MP
1477 else
1478 # This is the first commit
1479 __git_complete_index_file "--cached"
1480 fi
4548e855
SP
1481}
1482
217926c0
SP
1483_git_describe ()
1484{
cbb504c9
TR
1485 case "$cur" in
1486 --*)
ddced834 1487 __gitcomp_builtin describe
cbb504c9
TR
1488 return
1489 esac
15b4a163 1490 __git_complete_refs
217926c0
SP
1491}
1492
07924d4d
MP
1493__git_diff_algorithms="myers minimal patience histogram"
1494
462f2134 1495__git_diff_submodule_formats="diff log short"
ac76fd54 1496
fd0bc175
KK
1497__git_color_moved_opts="no default plain blocks zebra dimmed-zebra"
1498
1499__git_color_moved_ws_opts="no ignore-space-at-eol ignore-space-change
1500 ignore-all-space allow-indentation-change"
1501
20bf7292 1502__git_diff_common_options="--stat --numstat --shortstat --summary
b3a4f858
JS
1503 --patch-with-stat --name-only --name-status --color
1504 --no-color --color-words --no-renames --check
fd0bc175
KK
1505 --color-moved --color-moved= --no-color-moved
1506 --color-moved-ws= --no-color-moved-ws
f135aacb 1507 --full-index --binary --abbrev --diff-filter=
e9282f02 1508 --find-copies-harder --ignore-cr-at-eol
b3a4f858 1509 --text --ignore-space-at-eol --ignore-space-change
c2545167
TB
1510 --ignore-all-space --ignore-blank-lines --exit-code
1511 --quiet --ext-diff --no-ext-diff
aba201c6 1512 --no-prefix --src-prefix= --dst-prefix=
6d0e674a 1513 --inter-hunk-context=
216120ab 1514 --patience --histogram --minimal
e6414b46 1515 --raw --word-diff --word-diff-regex=
8fd2cfa7
SB
1516 --dirstat --dirstat= --dirstat-by-file
1517 --dirstat-by-file= --cumulative
07924d4d 1518 --diff-algorithm=
6cc4bc15 1519 --submodule --submodule= --ignore-submodules
d49dffde
MR
1520 --indent-heuristic --no-indent-heuristic
1521 --textconv --no-textconv
20bf7292
TR
1522"
1523
1524_git_diff ()
1525{
1526 __git_has_doubledash && return
1527
20bf7292 1528 case "$cur" in
07924d4d
MP
1529 --diff-algorithm=*)
1530 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1531 return
1532 ;;
ac76fd54
JK
1533 --submodule=*)
1534 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1535 return
1536 ;;
fd0bc175
KK
1537 --color-moved=*)
1538 __gitcomp "$__git_color_moved_opts" "" "${cur##--color-moved=}"
1539 return
1540 ;;
1541 --color-moved-ws=*)
1542 __gitcomp "$__git_color_moved_ws_opts" "" "${cur##--color-moved-ws=}"
1543 return
1544 ;;
20bf7292 1545 --*)
ebd15bf0 1546 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
861514d3 1547 --base --ours --theirs --no-index
20bf7292 1548 $__git_diff_common_options
aba201c6 1549 "
b3a4f858
JS
1550 return
1551 ;;
1552 esac
1d66ec58 1553 __git_complete_revlist_file
690d8824
JH
1554}
1555
c5f424fd 1556__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
f57b2ae3
DA
1557 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc
1558 codecompare smerge
e2dc2de9
DA
1559"
1560
1561_git_difftool ()
1562{
f7ad96cf
MH
1563 __git_has_doubledash && return
1564
e2dc2de9
DA
1565 case "$cur" in
1566 --tool=*)
1567 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1568 return
1569 ;;
1570 --*)
6cc4bc15
NTND
1571 __gitcomp_builtin difftool "$__git_diff_common_options
1572 --base --cached --ours --theirs
1573 --pickaxe-all --pickaxe-regex
1574 --relative --staged
1575 "
e2dc2de9
DA
1576 return
1577 ;;
1578 esac
d8517cc6 1579 __git_complete_revlist_file
e2dc2de9
DA
1580}
1581
4dd5c470
SYS
1582__git_fetch_recurse_submodules="yes on-demand no"
1583
690d8824
JH
1584_git_fetch ()
1585{
0a4e1472 1586 case "$cur" in
4dd5c470
SYS
1587 --recurse-submodules=*)
1588 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1589 return
1590 ;;
5a59a230 1591 --filter=*)
e693237e 1592 __gitcomp "blob:none blob:limit= sparse:oid=" "" "${cur##--filter=}"
5a59a230
NTND
1593 return
1594 ;;
0a4e1472 1595 --*)
2b1c01d2 1596 __gitcomp_builtin fetch
0a4e1472
JS
1597 return
1598 ;;
1599 esac
52d5c3b5 1600 __git_complete_remote_or_refspec
690d8824
JH
1601}
1602
13374987
NTND
1603__git_format_patch_extra_options="
1604 --full-index --not --all --no-prefix --src-prefix=
1605 --dst-prefix= --notes
2f65494d
FC
1606"
1607
f53352fb
SP
1608_git_format_patch ()
1609{
f53352fb 1610 case "$cur" in
e1d37937
SB
1611 --thread=*)
1612 __gitcomp "
1613 deep shallow
1614 " "" "${cur##--thread=}"
1615 return
1616 ;;
f53352fb 1617 --*)
13374987 1618 __gitcomp_builtin format-patch "$__git_format_patch_extra_options"
f53352fb
SP
1619 return
1620 ;;
1621 esac
1622 __git_complete_revlist
1623}
1624
4bca8636
AJ
1625_git_fsck ()
1626{
4bca8636
AJ
1627 case "$cur" in
1628 --*)
2b1c01d2 1629 __gitcomp_builtin fsck
4bca8636
AJ
1630 return
1631 ;;
1632 esac
4bca8636
AJ
1633}
1634
66729509
SG
1635_git_gitk ()
1636{
1637 _gitk
1638}
1639
7826a786
SG
1640# Lists matching symbol names from a tag (as in ctags) file.
1641# 1: List symbol names matching this word.
1642# 2: The tag file to list symbol names from.
1643# 3: A prefix to be added to each listed symbol name (optional).
1644# 4: A suffix to be appended to each listed symbol name (optional).
1645__git_match_ctag () {
1646 awk -v pfx="${3-}" -v sfx="${4-}" "
1647 /^${1//\//\\/}/ { print pfx \$1 sfx }
1648 " "$2"
29eec71f
JK
1649}
1650
2f779f91
SG
1651# Complete symbol names from a tag file.
1652# Usage: __git_complete_symbol [<option>]...
1653# --tags=<file>: The tag file to list symbol names from instead of the
1654# default "tags".
1655# --pfx=<prefix>: A prefix to be added to each symbol name.
1656# --cur=<word>: The current symbol name to be completed. Defaults to
1657# the current word to be completed.
1658# --sfx=<suffix>: A suffix to be appended to each symbol name instead
1659# of the default space.
1660__git_complete_symbol () {
1661 local tags=tags pfx="" cur_="${cur-}" sfx=" "
1662
1663 while test $# != 0; do
1664 case "$1" in
1665 --tags=*) tags="${1##--tags=}" ;;
1666 --pfx=*) pfx="${1##--pfx=}" ;;
1667 --cur=*) cur_="${1##--cur=}" ;;
1668 --sfx=*) sfx="${1##--sfx=}" ;;
1669 *) return 1 ;;
1670 esac
1671 shift
1672 done
1673
1674 if test -r "$tags"; then
1675 __gitcomp_direct "$(__git_match_ctag "$cur_" "$tags" "$pfx" "$sfx")"
1676 fi
29eec71f
JK
1677}
1678
c72e0db1
LM
1679_git_grep ()
1680{
1681 __git_has_doubledash && return
1682
c72e0db1
LM
1683 case "$cur" in
1684 --*)
caf2de33 1685 __gitcomp_builtin grep
c72e0db1
LM
1686 return
1687 ;;
1688 esac
17225c49 1689
29eec71f
JK
1690 case "$cword,$prev" in
1691 2,*|*,-*)
2f779f91 1692 __git_complete_symbol && return
29eec71f
JK
1693 ;;
1694 esac
1695
15b4a163 1696 __git_complete_refs
c72e0db1
LM
1697}
1698
1eb7e2f8
LM
1699_git_help ()
1700{
1eb7e2f8
LM
1701 case "$cur" in
1702 --*)
8c13a8d7 1703 __gitcomp_builtin help
1eb7e2f8
LM
1704 return
1705 ;;
1706 esac
3301d36b
NTND
1707 if test -n "$GIT_TESTING_ALL_COMMAND_LIST"
1708 then
2eb6f09f 1709 __gitcomp "$GIT_TESTING_ALL_COMMAND_LIST $(__git --list-cmds=alias,list-guide) gitk"
3301d36b 1710 else
2eb6f09f 1711 __gitcomp "$(__git --list-cmds=main,nohelpers,alias,list-guide) gitk"
3301d36b 1712 fi
1eb7e2f8
LM
1713}
1714
5dad868b
LM
1715_git_init ()
1716{
5dad868b
LM
1717 case "$cur" in
1718 --shared=*)
1719 __gitcomp "
1720 false true umask group all world everybody
1721 " "" "${cur##--shared=}"
1722 return
1723 ;;
1724 --*)
b00116b7 1725 __gitcomp_builtin init
5dad868b
LM
1726 return
1727 ;;
1728 esac
5dad868b
LM
1729}
1730
b1bc1494
LM
1731_git_ls_files ()
1732{
b1bc1494
LM
1733 case "$cur" in
1734 --*)
2b1c01d2 1735 __gitcomp_builtin ls-files
b1bc1494
LM
1736 return
1737 ;;
1738 esac
fea16b47
MP
1739
1740 # XXX ignore options like --modified and always suggest all cached
1741 # files.
1742 __git_complete_index_file "--cached"
b1bc1494
LM
1743}
1744
690d8824
JH
1745_git_ls_remote ()
1746{
2c0f3a53
CW
1747 case "$cur" in
1748 --*)
cdc71c1c 1749 __gitcomp_builtin ls-remote
2c0f3a53
CW
1750 return
1751 ;;
1752 esac
a31e6262 1753 __gitcomp_nl "$(__git_remotes)"
690d8824
JH
1754}
1755
1756_git_ls_tree ()
1757{
be6d1b24
NTND
1758 case "$cur" in
1759 --*)
1760 __gitcomp_builtin ls-tree
1761 return
1762 ;;
1763 esac
1764
690d8824
JH
1765 __git_complete_file
1766}
1767
a393777e
TR
1768# Options that go well for log, shortlog and gitk
1769__git_log_common_options="
1770 --not --all
1771 --branches --tags --remotes
4fe1a619 1772 --first-parent --merges --no-merges
a393777e
TR
1773 --max-count=
1774 --max-age= --since= --after=
1775 --min-age= --until= --before=
6a6ebded
MG
1776 --min-parents= --max-parents=
1777 --no-min-parents --no-max-parents
a393777e
TR
1778"
1779# Options that go well for log and gitk (not shortlog)
1780__git_log_gitk_options="
1781 --dense --sparse --full-history
1782 --simplify-merges --simplify-by-decoration
3925b575 1783 --left-right --notes --no-notes
a393777e
TR
1784"
1785# Options that go well for log and shortlog (not gitk)
1786__git_log_shortlog_options="
1787 --author= --committer= --grep=
22dfa8a2 1788 --all-match --invert-grep
a393777e
TR
1789"
1790
1f0fc1db 1791__git_log_pretty_formats="oneline short medium full fuller reference email raw format: tformat: mboxrd"
5a59a230 1792__git_log_date_formats="relative iso8601 iso8601-strict rfc2822 short local default raw unix format:"
3d279863 1793
690d8824
JH
1794_git_log ()
1795{
d773c631 1796 __git_has_doubledash && return
fad9484f 1797 __git_find_repo_path
d773c631 1798
bf3c20f6 1799 local merge=""
fad9484f 1800 if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
bf3c20f6
TR
1801 merge="--merge"
1802 fi
41d2716c
SG
1803 case "$prev,$cur" in
1804 -L,:*:*)
1805 return # fall back to Bash filename completion
1806 ;;
1807 -L,:*)
1808 __git_complete_symbol --cur="${cur#:}" --sfx=":"
1809 return
1810 ;;
1811 -G,*|-S,*)
1812 __git_complete_symbol
1813 return
1814 ;;
1815 esac
6e31b866 1816 case "$cur" in
e67d71e5 1817 --pretty=*|--format=*)
c3898111 1818 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
e67d71e5 1819 " "" "${cur#*=}"
72de29c2
TL
1820 return
1821 ;;
47e98eec 1822 --date=*)
672c68cb 1823 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
47e98eec
SP
1824 return
1825 ;;
af4e9e8c 1826 --decorate=*)
af16bdaa 1827 __gitcomp "full short no" "" "${cur##--decorate=}"
af4e9e8c
SB
1828 return
1829 ;;
ac76fd54
JK
1830 --diff-algorithm=*)
1831 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1832 return
1833 ;;
1834 --submodule=*)
1835 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1836 return
1837 ;;
d49dffde
MR
1838 --no-walk=*)
1839 __gitcomp "sorted unsorted" "" "${cur##--no-walk=}"
1840 return
1841 ;;
6e31b866 1842 --*)
b3391775 1843 __gitcomp "
a393777e
TR
1844 $__git_log_common_options
1845 $__git_log_shortlog_options
1846 $__git_log_gitk_options
8f87fae6 1847 --root --topo-order --date-order --reverse
5d0e6343 1848 --follow --full-diff
d49dffde 1849 --abbrev-commit --no-abbrev-commit --abbrev=
47e98eec 1850 --relative-date --date=
72de29c2 1851 --pretty= --format= --oneline
2ca0b197 1852 --show-signature
d3bfbf91 1853 --cherry-mark
a393777e 1854 --cherry-pick
20827d99 1855 --graph
d49dffde 1856 --decorate --decorate= --no-decorate
20bf7292 1857 --walk-reflogs
d49dffde 1858 --no-walk --no-walk= --do-walk
a393777e 1859 --parents --children
d49dffde
MR
1860 --expand-tabs --expand-tabs= --no-expand-tabs
1861 --patch
bf3c20f6 1862 $merge
20bf7292 1863 $__git_diff_common_options
47d5a8fa 1864 --pickaxe-all --pickaxe-regex
b3391775 1865 "
6e31b866
SP
1866 return
1867 ;;
41d2716c
SG
1868 -L:*:*)
1869 return # fall back to Bash filename completion
1870 ;;
1871 -L:*)
1872 __git_complete_symbol --cur="${cur#-L:}" --sfx=":"
1873 return
1874 ;;
1875 -G*)
1876 __git_complete_symbol --pfx="-G" --cur="${cur#-G}"
1877 return
1878 ;;
1879 -S*)
1880 __git_complete_symbol --pfx="-S" --cur="${cur#-S}"
1881 return
1882 ;;
6e31b866 1883 esac
f53352fb 1884 __git_complete_revlist
690d8824
JH
1885}
1886
4ad91321
SP
1887_git_merge ()
1888{
3c7b480a
JS
1889 __git_complete_strategy && return
1890
4ad91321
SP
1891 case "$cur" in
1892 --*)
2b1c01d2 1893 __gitcomp_builtin merge
4ad91321
SP
1894 return
1895 esac
15b4a163 1896 __git_complete_refs
4ad91321
SP
1897}
1898
b4c72162
LM
1899_git_mergetool ()
1900{
b4c72162
LM
1901 case "$cur" in
1902 --tool=*)
e2dc2de9 1903 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
b4c72162
LM
1904 return
1905 ;;
1906 --*)
57ba1812 1907 __gitcomp "--tool= --prompt --no-prompt --gui --no-gui"
b4c72162
LM
1908 return
1909 ;;
1910 esac
b4c72162
LM
1911}
1912
690d8824
JH
1913_git_merge_base ()
1914{
85453fd1
JK
1915 case "$cur" in
1916 --*)
4429d8b2 1917 __gitcomp_builtin merge-base
85453fd1
JK
1918 return
1919 ;;
1920 esac
15b4a163 1921 __git_complete_refs
690d8824
JH
1922}
1923
1127c51c
LM
1924_git_mv ()
1925{
1127c51c
LM
1926 case "$cur" in
1927 --*)
61d15cd6 1928 __gitcomp_builtin mv
1127c51c
LM
1929 return
1930 ;;
1931 esac
fea16b47
MP
1932
1933 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1934 # We need to show both cached and untracked files (including
1935 # empty directories) since this may not be the last argument.
1936 __git_complete_index_file "--cached --others --directory"
1937 else
1938 __git_complete_index_file "--cached"
1939 fi
1127c51c
LM
1940}
1941
00f09d0e
SG
1942_git_notes ()
1943{
27b42d04 1944 local subcommands='add append copy edit get-ref list merge prune remove show'
2a5da755 1945 local subcommand="$(__git_find_on_cmdline "$subcommands")"
00f09d0e 1946
2a5da755
SG
1947 case "$subcommand,$cur" in
1948 ,--*)
7a60e3bb 1949 __gitcomp_builtin notes
2a5da755
SG
1950 ;;
1951 ,*)
39540681 1952 case "$prev" in
2a5da755 1953 --ref)
15b4a163 1954 __git_complete_refs
2a5da755
SG
1955 ;;
1956 *)
1957 __gitcomp "$subcommands --ref"
1958 ;;
1959 esac
1960 ;;
b25e2e64 1961 *,--reuse-message=*|*,--reedit-message=*)
15b4a163 1962 __git_complete_refs --cur="${cur#*=}"
2a5da755 1963 ;;
4ea2c974
NTND
1964 *,--*)
1965 __gitcomp_builtin notes_$subcommand
2a5da755 1966 ;;
27b42d04 1967 prune,*|get-ref,*)
4ea2c974 1968 # this command does not take a ref, do not complete it
00f09d0e
SG
1969 ;;
1970 *)
39540681 1971 case "$prev" in
2a5da755
SG
1972 -m|-F)
1973 ;;
1974 *)
15b4a163 1975 __git_complete_refs
2a5da755
SG
1976 ;;
1977 esac
00f09d0e
SG
1978 ;;
1979 esac
1980}
1981
690d8824
JH
1982_git_pull ()
1983{
0a4e1472
JS
1984 __git_complete_strategy && return
1985
0a4e1472 1986 case "$cur" in
4dd5c470
SYS
1987 --recurse-submodules=*)
1988 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1989 return
1990 ;;
0a4e1472 1991 --*)
2b1c01d2 1992 __gitcomp_builtin pull
32e64e50 1993
0a4e1472
JS
1994 return
1995 ;;
1996 esac
52d5c3b5 1997 __git_complete_remote_or_refspec
690d8824
JH
1998}
1999
446624ce 2000__git_push_recurse_submodules="check on-demand only"
4dd5c470 2001
aaf7253f
JK
2002__git_complete_force_with_lease ()
2003{
2004 local cur_=$1
2005
2006 case "$cur_" in
2007 --*=)
2008 ;;
2009 *:*)
15b4a163 2010 __git_complete_refs --cur="${cur_#*:}"
aaf7253f
JK
2011 ;;
2012 *)
15b4a163 2013 __git_complete_refs --cur="$cur_"
aaf7253f
JK
2014 ;;
2015 esac
2016}
2017
690d8824
JH
2018_git_push ()
2019{
da48616f 2020 case "$prev" in
0a4e1472 2021 --repo)
a31e6262 2022 __gitcomp_nl "$(__git_remotes)"
0a4e1472 2023 return
3a224ff2
JK
2024 ;;
2025 --recurse-submodules)
2026 __gitcomp "$__git_push_recurse_submodules"
2027 return
2028 ;;
0a4e1472
JS
2029 esac
2030 case "$cur" in
2031 --repo=*)
a31e6262 2032 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
0a4e1472
JS
2033 return
2034 ;;
4dd5c470
SYS
2035 --recurse-submodules=*)
2036 __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
2037 return
2038 ;;
aaf7253f
JK
2039 --force-with-lease=*)
2040 __git_complete_force_with_lease "${cur##--force-with-lease=}"
2041 return
2042 ;;
0a4e1472 2043 --*)
f1e1bdd6 2044 __gitcomp_builtin push
0a4e1472
JS
2045 return
2046 ;;
2047 esac
52d5c3b5 2048 __git_complete_remote_or_refspec
690d8824
JH
2049}
2050
7190a67e
JS
2051_git_range_diff ()
2052{
2053 case "$cur" in
2054 --*)
2055 __gitcomp "
27526793 2056 --creation-factor= --no-dual-color
7190a67e
JS
2057 $__git_diff_common_options
2058 "
2059 return
2060 ;;
2061 esac
2062 __git_complete_revlist
2063}
2064
2b9bd488
DL
2065__git_rebase_inprogress_options="--continue --skip --abort --quit --show-current-patch"
2066__git_rebase_interactive_inprogress_options="$__git_rebase_inprogress_options --edit-todo"
2067
61d926a3
SP
2068_git_rebase ()
2069{
fad9484f
SG
2070 __git_find_repo_path
2071 if [ -f "$__git_repo_path"/rebase-merge/interactive ]; then
2b9bd488 2072 __gitcomp "$__git_rebase_interactive_inprogress_options"
09bb6520 2073 return
fad9484f
SG
2074 elif [ -d "$__git_repo_path"/rebase-apply ] || \
2075 [ -d "$__git_repo_path"/rebase-merge ]; then
2b9bd488 2076 __gitcomp "$__git_rebase_inprogress_options"
61d926a3
SP
2077 return
2078 fi
3c7b480a 2079 __git_complete_strategy && return
61d926a3 2080 case "$cur" in
93cf50a4
BG
2081 --whitespace=*)
2082 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
2083 return
2084 ;;
c1ce9c06
DL
2085 --onto=*)
2086 __git_complete_refs --cur="${cur##--onto=}"
2087 return
2088 ;;
61d926a3 2089 --*)
2b9bd488
DL
2090 __gitcomp_builtin rebase "" \
2091 "$__git_rebase_interactive_inprogress_options"
93cf50a4 2092
61d926a3
SP
2093 return
2094 esac
15b4a163 2095 __git_complete_refs
61d926a3
SP
2096}
2097
057f3279
TRC
2098_git_reflog ()
2099{
2100 local subcommands="show delete expire"
2101 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2102
2103 if [ -z "$subcommand" ]; then
2104 __gitcomp "$subcommands"
2105 else
15b4a163 2106 __git_complete_refs
057f3279
TRC
2107 fi
2108}
2109
ae616de6 2110__git_send_email_confirm_options="always never auto cc compose"
cb8a9bd5 2111__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
ae616de6 2112
25a1f374
TL
2113_git_send_email ()
2114{
dfbe5eeb
JK
2115 case "$prev" in
2116 --to|--cc|--bcc|--from)
e15098a3 2117 __gitcomp "$(__git send-email --dump-aliases)"
dfbe5eeb
JK
2118 return
2119 ;;
2120 esac
2121
25a1f374 2122 case "$cur" in
ae616de6
SB
2123 --confirm=*)
2124 __gitcomp "
2125 $__git_send_email_confirm_options
2126 " "" "${cur##--confirm=}"
2127 return
2128 ;;
2129 --suppress-cc=*)
2130 __gitcomp "
2131 $__git_send_email_suppresscc_options
2132 " "" "${cur##--suppress-cc=}"
2133
2134 return
2135 ;;
2136 --smtp-encryption=*)
2137 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
2138 return
2139 ;;
2f65494d
FC
2140 --thread=*)
2141 __gitcomp "
2142 deep shallow
2143 " "" "${cur##--thread=}"
2144 return
2145 ;;
dfbe5eeb 2146 --to=*|--cc=*|--bcc=*|--from=*)
e15098a3 2147 __gitcomp "$(__git send-email --dump-aliases)" "" "${cur#--*=}"
dfbe5eeb
JK
2148 return
2149 ;;
25a1f374 2150 --*)
13374987 2151 __gitcomp_builtin send-email "--annotate --bcc --cc --cc-cmd --chain-reply-to
ae616de6
SB
2152 --compose --confirm= --dry-run --envelope-sender
2153 --from --identity
25a1f374 2154 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
d11c943c 2155 --no-suppress-from --no-thread --quiet --reply-to
25a1f374 2156 --signed-off-by-cc --smtp-pass --smtp-server
ae616de6
SB
2157 --smtp-server-port --smtp-encryption= --smtp-user
2158 --subject --suppress-cc= --suppress-from --thread --to
2f65494d 2159 --validate --no-validate
13374987 2160 $__git_format_patch_extra_options"
25a1f374
TL
2161 return
2162 ;;
2163 esac
2f65494d 2164 __git_complete_revlist
25a1f374
TL
2165}
2166
424cce83
SG
2167_git_stage ()
2168{
2169 _git_add
2170}
2171
634d2344
TB
2172_git_status ()
2173{
2174 local complete_opt
2175 local untracked_state
2176
2177 case "$cur" in
2178 --ignore-submodules=*)
2179 __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
2180 return
2181 ;;
2182 --untracked-files=*)
2183 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
2184 return
2185 ;;
2186 --column=*)
2187 __gitcomp "
2188 always never auto column row plain dense nodense
2189 " "" "${cur##--column=}"
2190 return
2191 ;;
2192 --*)
2b1c01d2 2193 __gitcomp_builtin status
634d2344
TB
2194 return
2195 ;;
2196 esac
2197
2198 untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
2199 "$__git_untracked_file_modes" "status.showUntrackedFiles")"
2200
2201 case "$untracked_state" in
2202 no)
2203 # --ignored option does not matter
2204 complete_opt=
2205 ;;
2206 all|normal|*)
2207 complete_opt="--cached --directory --no-empty-directory --others"
2208
2209 if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
2210 complete_opt="$complete_opt --ignored --exclude=*"
2211 fi
2212 ;;
2213 esac
2214
2215 __git_complete_index_file "$complete_opt"
2216}
2217
ae36fe69
NTND
2218_git_switch ()
2219{
2220 case "$cur" in
2221 --conflict=*)
2222 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
2223 ;;
2224 --*)
2225 __gitcomp_builtin switch
2226 ;;
2227 *)
2228 # check if --track, --no-track, or --no-guess was specified
2229 # if so, disable DWIM mode
0408c6b4 2230 local dwim_opt="--dwim" only_local_ref=n
ae36fe69
NTND
2231 if [ "$GIT_COMPLETION_CHECKOUT_NO_GUESS" = "1" ] ||
2232 [ -n "$(__git_find_on_cmdline "--track --no-track --no-guess")" ]; then
0408c6b4 2233 dwim_opt=''
ae36fe69
NTND
2234 fi
2235 # explicit --guess enables DWIM mode regardless of
2236 # $GIT_COMPLETION_CHECKOUT_NO_GUESS
2237 if [ -n "$(__git_find_on_cmdline "--guess")" ]; then
0408c6b4 2238 dwim_opt='--dwim'
ae36fe69
NTND
2239 fi
2240 if [ -z "$(__git_find_on_cmdline "-d --detach")" ]; then
2241 only_local_ref=y
97ed6857
NTND
2242 else
2243 # --guess --detach is invalid combination, no
2244 # dwim will be done when --detach is specified
0408c6b4 2245 dwim_opt=
ae36fe69 2246 fi
0408c6b4 2247 if [ $only_local_ref = y -a -z "$dwim_opt" ]; then
ae36fe69
NTND
2248 __gitcomp_direct "$(__git_heads "" "$cur" " ")"
2249 else
0408c6b4 2250 __git_complete_refs $dwim_opt
ae36fe69
NTND
2251 fi
2252 ;;
2253 esac
2254}
2255
00652369
SB
2256__git_config_get_set_variables ()
2257{
da48616f 2258 local prevword word config_file= c=$cword
00652369 2259 while [ $c -gt 1 ]; do
da48616f 2260 word="${words[c]}"
00652369 2261 case "$word" in
66c0786c 2262 --system|--global|--local|--file=*)
00652369
SB
2263 config_file="$word"
2264 break
2265 ;;
2266 -f|--file)
2267 config_file="$word $prevword"
2268 break
2269 ;;
2270 esac
2271 prevword=$word
2272 c=$((--c))
2273 done
2274
e15098a3 2275 __git config $config_file --name-only --list
00652369
SB
2276}
2277
e17ca926
NTND
2278__git_config_vars=
2279__git_compute_config_vars ()
2280{
2281 test -n "$__git_config_vars" ||
2675ea1c 2282 __git_config_vars="$(git help --config-for-completion | sort -u)"
e17ca926
NTND
2283}
2284
42d0efec 2285# Completes possible values of various configuration variables.
dd334728
SG
2286#
2287# Usage: __git_complete_config_variable_value [<option>]...
2288# --varname=<word>: The name of the configuration variable whose value is
2289# to be completed. Defaults to the previous word on the
2290# command line.
2291# --cur=<word>: The current value to be completed. Defaults to the current
2292# word to be completed.
42d0efec 2293__git_complete_config_variable_value ()
5de40f59 2294{
dd334728
SG
2295 local varname="$prev" cur_="$cur"
2296
2297 while test $# != 0; do
2298 case "$1" in
2299 --varname=*) varname="${1##--varname=}" ;;
2300 --cur=*) cur_="${1##--cur=}" ;;
2301 *) return 1 ;;
2302 esac
2303 shift
2304 done
bea21259
NTND
2305
2306 if [ "${BASH_VERSINFO[0]:-0}" -ge 4 ]; then
dd334728 2307 varname="${varname,,}"
bea21259 2308 else
dd334728 2309 varname="$(echo "$varname" |tr A-Z a-z)"
bea21259
NTND
2310 fi
2311
2312 case "$varname" in
72f75077 2313 branch.*.remote|branch.*.pushremote)
dd334728 2314 __gitcomp_nl "$(__git_remotes)" "" "$cur_"
5de40f59
SP
2315 return
2316 ;;
2317 branch.*.merge)
dd334728 2318 __git_complete_refs --cur="$cur_"
5de40f59
SP
2319 return
2320 ;;
a05490ed 2321 branch.*.rebase)
dd334728 2322 __gitcomp "false true merges preserve interactive" "" "$cur_"
a05490ed
RR
2323 return
2324 ;;
7e6a0cc4 2325 remote.pushdefault)
dd334728 2326 __gitcomp_nl "$(__git_remotes)" "" "$cur_"
7e6a0cc4
RR
2327 return
2328 ;;
5de40f59 2329 remote.*.fetch)
dd334728 2330 local remote="${varname#remote.}"
5de40f59 2331 remote="${remote%.fetch}"
dd334728 2332 if [ -z "$cur_" ]; then
73704451 2333 __gitcomp_nl "refs/heads/" "" "" ""
d51a8ecd
SG
2334 return
2335 fi
dd334728 2336 __gitcomp_nl "$(__git_refs_remotes "$remote")" "" "$cur_"
5de40f59
SP
2337 return
2338 ;;
2339 remote.*.push)
dd334728 2340 local remote="${varname#remote.}"
5de40f59 2341 remote="${remote%.push}"
3ba04201 2342 __gitcomp_nl "$(__git for-each-ref \
dd334728 2343 --format='%(refname):%(refname)' refs/heads)" "" "$cur_"
78d4d6a2
SP
2344 return
2345 ;;
2346 pull.twohead|pull.octopus)
eaa4e6ee 2347 __git_compute_merge_strategies
dd334728 2348 __gitcomp "$__git_merge_strategies" "" "$cur_"
78d4d6a2
SP
2349 return
2350 ;;
901d615c 2351 color.pager)
dd334728 2352 __gitcomp "false true" "" "$cur_"
901d615c
MK
2353 return
2354 ;;
78d4d6a2
SP
2355 color.*.*)
2356 __gitcomp "
98171a07 2357 normal black red green yellow blue magenta cyan white
78d4d6a2 2358 bold dim ul blink reverse
dd334728 2359 " "" "$cur_"
5de40f59
SP
2360 return
2361 ;;
840d7e5b 2362 color.*)
dd334728 2363 __gitcomp "false true always never auto" "" "$cur_"
840d7e5b
SG
2364 return
2365 ;;
2651baae 2366 diff.submodule)
dd334728 2367 __gitcomp "$__git_diff_submodule_formats" "" "$cur_"
2651baae
RR
2368 return
2369 ;;
9b82d63b 2370 help.format)
dd334728 2371 __gitcomp "man info web html" "" "$cur_"
9b82d63b
SB
2372 return
2373 ;;
672c68cb 2374 log.date)
dd334728 2375 __gitcomp "$__git_log_date_formats" "" "$cur_"
672c68cb
SB
2376 return
2377 ;;
92c4a7a1 2378 sendemail.aliasfiletype)
dd334728 2379 __gitcomp "mutt mailrc pine elm gnus" "" "$cur_"
ae616de6
SB
2380 return
2381 ;;
2382 sendemail.confirm)
dd334728 2383 __gitcomp "$__git_send_email_confirm_options" "" "$cur_"
ae616de6
SB
2384 return
2385 ;;
2386 sendemail.suppresscc)
dd334728 2387 __gitcomp "$__git_send_email_suppresscc_options" "" "$cur_"
ae616de6
SB
2388 return
2389 ;;
8d814084 2390 sendemail.transferencoding)
dd334728 2391 __gitcomp "7bit 8bit quoted-printable base64" "" "$cur_"
8d814084
PB
2392 return
2393 ;;
5de40f59 2394 *.*)
5de40f59
SP
2395 return
2396 ;;
2397 esac
42d0efec
SG
2398}
2399
2400# Completes configuration sections, subsections, variable names.
e1e00089
SG
2401#
2402# Usage: __git_complete_config_variable_name [<option>]...
5af9d5f6
SG
2403# --cur=<word>: The current configuration section/variable name to be
2404# completed. Defaults to the current word to be completed.
e1e00089
SG
2405# --sfx=<suffix>: A suffix to be appended to each fully completed
2406# configuration variable name (but not to sections or
2407# subsections) instead of the default space.
42d0efec
SG
2408__git_complete_config_variable_name ()
2409{
5af9d5f6 2410 local cur_="$cur" sfx
e1e00089
SG
2411
2412 while test $# != 0; do
2413 case "$1" in
5af9d5f6 2414 --cur=*) cur_="${1##--cur=}" ;;
e1e00089
SG
2415 --sfx=*) sfx="${1##--sfx=}" ;;
2416 *) return 1 ;;
2417 esac
2418 shift
2419 done
2420
5af9d5f6 2421 case "$cur_" in
5de40f59 2422 branch.*.*)
5af9d5f6
SG
2423 local pfx="${cur_%.*}."
2424 cur_="${cur_##*.}"
e1e00089 2425 __gitcomp "remote pushRemote merge mergeOptions rebase" "$pfx" "$cur_" "$sfx"
5de40f59
SP
2426 return
2427 ;;
2428 branch.*)
5af9d5f6
SG
2429 local pfx="${cur%.*}."
2430 cur_="${cur#*.}"
227307a6 2431 __gitcomp_direct "$(__git_heads "$pfx" "$cur_" ".")"
e1e00089 2432 __gitcomp_nl_append $'autoSetupMerge\nautoSetupRebase\n' "$pfx" "$cur_" "$sfx"
5de40f59
SP
2433 return
2434 ;;
0aa62fd0 2435 guitool.*.*)
5af9d5f6
SG
2436 local pfx="${cur_%.*}."
2437 cur_="${cur_##*.}"
0aa62fd0 2438 __gitcomp "
f45db831
NTND
2439 argPrompt cmd confirm needsFile noConsole noRescan
2440 prompt revPrompt revUnmerged title
e1e00089 2441 " "$pfx" "$cur_" "$sfx"
0aa62fd0
SB
2442 return
2443 ;;
2444 difftool.*.*)
5af9d5f6
SG
2445 local pfx="${cur_%.*}."
2446 cur_="${cur_##*.}"
e1e00089 2447 __gitcomp "cmd path" "$pfx" "$cur_" "$sfx"
0aa62fd0
SB
2448 return
2449 ;;
2450 man.*.*)
5af9d5f6
SG
2451 local pfx="${cur_%.*}."
2452 cur_="${cur_##*.}"
e1e00089 2453 __gitcomp "cmd path" "$pfx" "$cur_" "$sfx"
0aa62fd0
SB
2454 return
2455 ;;
2456 mergetool.*.*)
5af9d5f6
SG
2457 local pfx="${cur_%.*}."
2458 cur_="${cur_##*.}"
e1e00089 2459 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_" "$sfx"
0aa62fd0
SB
2460 return
2461 ;;
2462 pager.*)
5af9d5f6
SG
2463 local pfx="${cur_%.*}."
2464 cur_="${cur_#*.}"
eaa4e6ee 2465 __git_compute_all_commands
e1e00089 2466 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_" "$sfx"
0aa62fd0
SB
2467 return
2468 ;;
5de40f59 2469 remote.*.*)
5af9d5f6
SG
2470 local pfx="${cur_%.*}."
2471 cur_="${cur_##*.}"
12977705 2472 __gitcomp "
98171a07 2473 url proxy fetch push mirror skipDefaultUpdate
f45db831 2474 receivepack uploadpack tagOpt pushurl
e1e00089 2475 " "$pfx" "$cur_" "$sfx"
5de40f59
SP
2476 return
2477 ;;
2478 remote.*)
5af9d5f6
SG
2479 local pfx="${cur_%.*}."
2480 cur_="${cur_#*.}"
a31e6262 2481 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
e1e00089 2482 __gitcomp_nl_append "pushDefault" "$pfx" "$cur_" "$sfx"
5de40f59
SP
2483 return
2484 ;;
0aa62fd0 2485 url.*.*)
5af9d5f6
SG
2486 local pfx="${cur_%.*}."
2487 cur_="${cur_##*.}"
e1e00089 2488 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_" "$sfx"
0aa62fd0
SB
2489 return
2490 ;;
f22f6826
NTND
2491 *.*)
2492 __git_compute_config_vars
5af9d5f6 2493 __gitcomp "$__git_config_vars" "" "$cur_" "$sfx"
f22f6826
NTND
2494 ;;
2495 *)
2496 __git_compute_config_vars
d9438873
SG
2497 __gitcomp "$(echo "$__git_config_vars" |
2498 awk -F . '{
2499 sections[$1] = 1
2500 }
2501 END {
2502 for (s in sections)
2503 print s "."
2504 }
5af9d5f6 2505 ')" "" "$cur_"
42d0efec
SG
2506 ;;
2507 esac
2508}
2509
e1e00089
SG
2510# Completes '='-separated configuration sections/variable names and values
2511# for 'git -c section.name=value'.
5af9d5f6
SG
2512#
2513# Usage: __git_complete_config_variable_name_and_value [<option>]...
2514# --cur=<word>: The current configuration section/variable name/value to be
2515# completed. Defaults to the current word to be completed.
e1e00089
SG
2516__git_complete_config_variable_name_and_value ()
2517{
5af9d5f6
SG
2518 local cur_="$cur"
2519
2520 while test $# != 0; do
2521 case "$1" in
2522 --cur=*) cur_="${1##--cur=}" ;;
2523 *) return 1 ;;
2524 esac
2525 shift
2526 done
2527
2528 case "$cur_" in
e1e00089 2529 *=*)
dd334728 2530 __git_complete_config_variable_value \
5af9d5f6 2531 --varname="${cur_%%=*}" --cur="${cur_#*=}"
e1e00089
SG
2532 ;;
2533 *)
5af9d5f6 2534 __git_complete_config_variable_name --cur="$cur_" --sfx='='
e1e00089
SG
2535 ;;
2536 esac
2537}
2538
42d0efec
SG
2539_git_config ()
2540{
2541 case "$prev" in
2542 --get|--get-all|--unset|--unset-all)
2543 __gitcomp_nl "$(__git_config_get_set_variables)"
2544 return
2545 ;;
2546 *.*)
2547 __git_complete_config_variable_value
2548 return
2549 ;;
2550 esac
2551 case "$cur" in
2552 --*)
2553 __gitcomp_builtin config
2554 ;;
2555 *)
2556 __git_complete_config_variable_name
2557 ;;
5de40f59 2558 esac
5de40f59
SP
2559}
2560
88293c67
SP
2561_git_remote ()
2562{
cac84960
CW
2563 local subcommands="
2564 add rename remove set-head set-branches
2565 get-url set-url show prune update
2566 "
918c03c2 2567 local subcommand="$(__git_find_on_cmdline "$subcommands")"
3ff1320d 2568 if [ -z "$subcommand" ]; then
cac84960
CW
2569 case "$cur" in
2570 --*)
ab6a11c5 2571 __gitcomp_builtin remote
cac84960
CW
2572 ;;
2573 *)
2574 __gitcomp "$subcommands"
2575 ;;
2576 esac
88293c67
SP
2577 return
2578 fi
2579
cac84960
CW
2580 case "$subcommand,$cur" in
2581 add,--*)
2b1c01d2 2582 __gitcomp_builtin remote_add
88293c67 2583 ;;
cac84960
CW
2584 add,*)
2585 ;;
2586 set-head,--*)
ab6a11c5 2587 __gitcomp_builtin remote_set-head
cac84960
CW
2588 ;;
2589 set-branches,--*)
ab6a11c5 2590 __gitcomp_builtin remote_set-branches
88293c67 2591 ;;
cac84960 2592 set-head,*|set-branches,*)
f1c6ffe6
PJ
2593 __git_complete_remote_or_refspec
2594 ;;
cac84960 2595 update,--*)
ab6a11c5 2596 __gitcomp_builtin remote_update
cac84960
CW
2597 ;;
2598 update,*)
9cd4382a 2599 __gitcomp "$(__git_remotes) $(__git_get_config_variables "remotes")"
fb72759b 2600 ;;
cac84960 2601 set-url,--*)
ab6a11c5 2602 __gitcomp_builtin remote_set-url
cac84960
CW
2603 ;;
2604 get-url,--*)
ab6a11c5 2605 __gitcomp_builtin remote_get-url
cac84960
CW
2606 ;;
2607 prune,--*)
ab6a11c5 2608 __gitcomp_builtin remote_prune
cac84960 2609 ;;
88293c67 2610 *)
cac84960 2611 __gitcomp_nl "$(__git_remotes)"
88293c67
SP
2612 ;;
2613 esac
2614}
2615
e1c1a067
BG
2616_git_replace ()
2617{
188fba11 2618 case "$cur" in
5a59a230
NTND
2619 --format=*)
2620 __gitcomp "short medium long" "" "${cur##--format=}"
2621 return
2622 ;;
188fba11 2623 --*)
1b354755 2624 __gitcomp_builtin replace
188fba11
CW
2625 return
2626 ;;
2627 esac
15b4a163 2628 __git_complete_refs
e1c1a067
BG
2629}
2630
e24a256b
CW
2631_git_rerere ()
2632{
2633 local subcommands="clear forget diff remaining status gc"
2634 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2635 if test -z "$subcommand"
2636 then
2637 __gitcomp "$subcommands"
2638 return
2639 fi
2640}
2641
67e78c3b
SP
2642_git_reset ()
2643{
d773c631
SG
2644 __git_has_doubledash && return
2645
b3391775
SP
2646 case "$cur" in
2647 --*)
39073104 2648 __gitcomp_builtin reset
b3391775
SP
2649 return
2650 ;;
2651 esac
15b4a163 2652 __git_complete_refs
67e78c3b
SP
2653}
2654
75f4c7c1
NTND
2655_git_restore ()
2656{
2657 case "$cur" in
2658 --conflict=*)
2659 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
2660 ;;
2661 --source=*)
2662 __git_complete_refs --cur="${cur##--source=}"
2663 ;;
2664 --*)
2665 __gitcomp_builtin restore
2666 ;;
2667 esac
2668}
2669
deaa65a7 2670__git_revert_inprogress_options=$__git_sequencer_inprogress_options
e5f98518 2671
a6c2be24
LM
2672_git_revert ()
2673{
fad9484f
SG
2674 __git_find_repo_path
2675 if [ -f "$__git_repo_path"/REVERT_HEAD ]; then
e5f98518 2676 __gitcomp "$__git_revert_inprogress_options"
956352b6
TB
2677 return
2678 fi
5a59a230 2679 __git_complete_strategy && return
a6c2be24
LM
2680 case "$cur" in
2681 --*)
2b1c01d2 2682 __gitcomp_builtin revert "" \
e5f98518 2683 "$__git_revert_inprogress_options"
a6c2be24
LM
2684 return
2685 ;;
2686 esac
15b4a163 2687 __git_complete_refs
a6c2be24
LM
2688}
2689
08c701d4
LM
2690_git_rm ()
2691{
08c701d4
LM
2692 case "$cur" in
2693 --*)
44c9a6d2 2694 __gitcomp_builtin rm
08c701d4
LM
2695 return
2696 ;;
2697 esac
fea16b47
MP
2698
2699 __git_complete_index_file "--cached"
08c701d4
LM
2700}
2701
1fd6bec9
SP
2702_git_shortlog ()
2703{
d773c631
SG
2704 __git_has_doubledash && return
2705
1fd6bec9
SP
2706 case "$cur" in
2707 --*)
2708 __gitcomp "
a393777e
TR
2709 $__git_log_common_options
2710 $__git_log_shortlog_options
f483a0aa 2711 --numbered --summary --email
1fd6bec9
SP
2712 "
2713 return
2714 ;;
2715 esac
2716 __git_complete_revlist
2717}
2718
90131924
SP
2719_git_show ()
2720{
41d8cf7d
MH
2721 __git_has_doubledash && return
2722
90131924 2723 case "$cur" in
e67d71e5 2724 --pretty=*|--format=*)
c3898111 2725 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
e67d71e5 2726 " "" "${cur#*=}"
72de29c2
TL
2727 return
2728 ;;
07924d4d
MP
2729 --diff-algorithm=*)
2730 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2731 return
2732 ;;
ac76fd54
JK
2733 --submodule=*)
2734 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
2735 return
2736 ;;
90131924 2737 --*)
d49dffde
MR
2738 __gitcomp "--pretty= --format= --abbrev-commit --no-abbrev-commit
2739 --oneline --show-signature --patch
2740 --expand-tabs --expand-tabs= --no-expand-tabs
20bf7292
TR
2741 $__git_diff_common_options
2742 "
90131924
SP
2743 return
2744 ;;
2745 esac
5269f7f8 2746 __git_complete_revlist_file
90131924
SP
2747}
2748
2ca880fe
TR
2749_git_show_branch ()
2750{
2ca880fe
TR
2751 case "$cur" in
2752 --*)
2b1c01d2 2753 __gitcomp_builtin show-branch
2ca880fe
TR
2754 return
2755 ;;
2756 esac
2757 __git_complete_revlist
2758}
2759
d031049d
MT
2760_git_sparse_checkout ()
2761{
2762 local subcommands="list init set disable"
2763 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2764 if [ -z "$subcommand" ]; then
2765 __gitcomp "$subcommands"
2766 return
2767 fi
2768
2769 case "$subcommand,$cur" in
2770 init,--*)
2771 __gitcomp "--cone"
2772 ;;
2773 set,--*)
2774 __gitcomp "--stdin"
2775 ;;
2776 *)
2777 ;;
2778 esac
2779}
2780
7fd53fce
JH
2781_git_stash ()
2782{
d7d4ca87 2783 local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
0eb5a4f9
TG
2784 local subcommands='push list show apply clear drop pop create branch'
2785 local subcommand="$(__git_find_on_cmdline "$subcommands save")"
df70b190
TG
2786 if [ -n "$(__git_find_on_cmdline "-p")" ]; then
2787 subcommand="push"
2788 fi
7bedebca 2789 if [ -z "$subcommand" ]; then
59d5eeee
SG
2790 case "$cur" in
2791 --*)
2792 __gitcomp "$save_opts"
2793 ;;
0eb5a4f9
TG
2794 sa*)
2795 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2796 __gitcomp "save"
2797 fi
2798 ;;
59d5eeee
SG
2799 *)
2800 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2801 __gitcomp "$subcommands"
59d5eeee
SG
2802 fi
2803 ;;
2804 esac
7bedebca 2805 else
7bedebca 2806 case "$subcommand,$cur" in
3851e448
TG
2807 push,--*)
2808 __gitcomp "$save_opts --message"
2809 ;;
7bedebca 2810 save,--*)
59d5eeee 2811 __gitcomp "$save_opts"
7bedebca 2812 ;;
8513c54b 2813 apply,--*|pop,--*)
59d5eeee 2814 __gitcomp "--index --quiet"
95d43780 2815 ;;
d7d4ca87
PW
2816 drop,--*)
2817 __gitcomp "--quiet"
95d43780 2818 ;;
705f5f12
SF
2819 list,--*)
2820 __gitcomp "--name-status --oneline --patch-with-stat"
2821 ;;
d7d4ca87
PW
2822 show,--*|branch,--*)
2823 ;;
2824 branch,*)
59305aee 2825 if [ $cword -eq 3 ]; then
15b4a163 2826 __git_complete_refs
d7d4ca87 2827 else
1cd23e9e 2828 __gitcomp_nl "$(__git stash list \
d7d4ca87
PW
2829 | sed -n -e 's/:.*//p')"
2830 fi
2831 ;;
2832 show,*|apply,*|drop,*|pop,*)
1cd23e9e 2833 __gitcomp_nl "$(__git stash list \
95d43780
LM
2834 | sed -n -e 's/:.*//p')"
2835 ;;
7bedebca 2836 *)
7bedebca
SG
2837 ;;
2838 esac
3ff1320d 2839 fi
7fd53fce
JH
2840}
2841
be86f7a0
SP
2842_git_submodule ()
2843{
d773c631
SG
2844 __git_has_doubledash && return
2845
26b06100 2846 local subcommands="add status init deinit update set-branch set-url summary foreach sync absorbgitdirs"
65d5a1e0
CW
2847 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2848 if [ -z "$subcommand" ]; then
be86f7a0
SP
2849 case "$cur" in
2850 --*)
65d5a1e0 2851 __gitcomp "--quiet"
be86f7a0
SP
2852 ;;
2853 *)
3ff1320d 2854 __gitcomp "$subcommands"
be86f7a0
SP
2855 ;;
2856 esac
2857 return
2858 fi
65d5a1e0
CW
2859
2860 case "$subcommand,$cur" in
2861 add,--*)
2862 __gitcomp "--branch --force --name --reference --depth"
2863 ;;
2864 status,--*)
2865 __gitcomp "--cached --recursive"
2866 ;;
2867 deinit,--*)
2868 __gitcomp "--force --all"
2869 ;;
2870 update,--*)
2871 __gitcomp "
2872 --init --remote --no-fetch
2873 --recommend-shallow --no-recommend-shallow
2874 --force --rebase --merge --reference --depth --recursive --jobs
2875 "
2876 ;;
b57e8119
DL
2877 set-branch,--*)
2878 __gitcomp "--default --branch"
2879 ;;
65d5a1e0
CW
2880 summary,--*)
2881 __gitcomp "--cached --files --summary-limit"
2882 ;;
2883 foreach,--*|sync,--*)
2884 __gitcomp "--recursive"
2885 ;;
2886 *)
2887 ;;
2888 esac
be86f7a0
SP
2889}
2890
47f6ee28
SG
2891_git_svn ()
2892{
2893 local subcommands="
2894 init fetch clone rebase dcommit log find-rev
2895 set-tree commit-diff info create-ignore propget
4a5856cb 2896 proplist show-ignore show-externals branch tag blame
c18d5d82 2897 migrate mkdirs reset gc
47f6ee28 2898 "
918c03c2 2899 local subcommand="$(__git_find_on_cmdline "$subcommands")"
47f6ee28
SG
2900 if [ -z "$subcommand" ]; then
2901 __gitcomp "$subcommands"
2902 else
2903 local remote_opts="--username= --config-dir= --no-auth-cache"
2904 local fc_opts="
2905 --follow-parent --authors-file= --repack=
2906 --no-metadata --use-svm-props --use-svnsync-props
2907 --log-window-size= --no-checkout --quiet
4a5856cb 2908 --repack-flags --use-log-author --localtime
2cbad176 2909 --add-author-from
1f9247a3 2910 --recursive
a7b10230 2911 --ignore-paths= --include-paths= $remote_opts
47f6ee28
SG
2912 "
2913 local init_opts="
2914 --template= --shared= --trunk= --tags=
2915 --branches= --stdlayout --minimize-url
2916 --no-metadata --use-svm-props --use-svnsync-props
2cbad176 2917 --rewrite-root= --prefix= $remote_opts
47f6ee28
SG
2918 "
2919 local cmt_opts="
2920 --edit --rmdir --find-copies-harder --copy-similarity=
2921 "
2922
47f6ee28
SG
2923 case "$subcommand,$cur" in
2924 fetch,--*)
2925 __gitcomp "--revision= --fetch-all $fc_opts"
2926 ;;
2927 clone,--*)
2928 __gitcomp "--revision= $fc_opts $init_opts"
2929 ;;
2930 init,--*)
2931 __gitcomp "$init_opts"
2932 ;;
2933 dcommit,--*)
2934 __gitcomp "
2935 --merge --strategy= --verbose --dry-run
4a5856cb 2936 --fetch-all --no-rebase --commit-url
7b151f49 2937 --revision --interactive $cmt_opts $fc_opts
47f6ee28
SG
2938 "
2939 ;;
2940 set-tree,--*)
2941 __gitcomp "--stdin $cmt_opts $fc_opts"
2942 ;;
2943 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
c18d5d82 2944 show-externals,--*|mkdirs,--*)
47f6ee28
SG
2945 __gitcomp "--revision="
2946 ;;
2947 log,--*)
2948 __gitcomp "
2949 --limit= --revision= --verbose --incremental
2950 --oneline --show-commit --non-recursive
4a5856cb 2951 --authors-file= --color
47f6ee28
SG
2952 "
2953 ;;
2954 rebase,--*)
2955 __gitcomp "
2956 --merge --verbose --strategy= --local
4a5856cb 2957 --fetch-all --dry-run $fc_opts
47f6ee28
SG
2958 "
2959 ;;
2960 commit-diff,--*)
2961 __gitcomp "--message= --file= --revision= $cmt_opts"
2962 ;;
2963 info,--*)
2964 __gitcomp "--url"
2965 ;;
4a5856cb
SG
2966 branch,--*)
2967 __gitcomp "--dry-run --message --tag"
2968 ;;
2969 tag,--*)
2970 __gitcomp "--dry-run --message"
2971 ;;
2972 blame,--*)
2973 __gitcomp "--git-format"
2974 ;;
2975 migrate,--*)
2976 __gitcomp "
2977 --config-dir= --ignore-paths= --minimize
2978 --no-auth-cache --username=
2979 "
2980 ;;
c18d5d82
RZ
2981 reset,--*)
2982 __gitcomp "--revision= --parent"
2983 ;;
47f6ee28 2984 *)
47f6ee28
SG
2985 ;;
2986 esac
2987 fi
2988}
2989
88e21dc7
SP
2990_git_tag ()
2991{
2992 local i c=1 f=0
da48616f
PD
2993 while [ $c -lt $cword ]; do
2994 i="${words[c]}"
88e21dc7 2995 case "$i" in
1775e990 2996 -d|--delete|-v|--verify)
227307a6 2997 __gitcomp_direct "$(__git_tags "" "$cur" " ")"
88e21dc7
SP
2998 return
2999 ;;
3000 -f)
3001 f=1
3002 ;;
3003 esac
6e8c755f 3004 ((c++))
88e21dc7
SP
3005 done
3006
da48616f 3007 case "$prev" in
88e21dc7 3008 -m|-F)
88e21dc7 3009 ;;
8d8163f3 3010 -*|tag)
88e21dc7 3011 if [ $f = 1 ]; then
227307a6 3012 __gitcomp_direct "$(__git_tags "" "$cur" " ")"
88e21dc7
SP
3013 fi
3014 ;;
3015 *)
15b4a163 3016 __git_complete_refs
88e21dc7
SP
3017 ;;
3018 esac
85ed2f32
RT
3019
3020 case "$cur" in
3021 --*)
80eb5197 3022 __gitcomp_builtin tag
85ed2f32
RT
3023 ;;
3024 esac
88e21dc7
SP
3025}
3026
424cce83
SG
3027_git_whatchanged ()
3028{
3029 _git_log
3030}
3031
3027e4f9
SG
3032__git_complete_worktree_paths ()
3033{
3034 local IFS=$'\n'
3035 __gitcomp_nl "$(git worktree list --porcelain |
3036 # Skip the first entry: it's the path of the main worktree,
3037 # which can't be moved, removed, locked, etc.
3038 sed -n -e '2,$ s/^worktree //p')"
3039}
3040
b462c024
NTND
3041_git_worktree ()
3042{
cc73385c 3043 local subcommands="add list lock move prune remove unlock"
3027e4f9
SG
3044 local subcommand subcommand_idx
3045
3046 subcommand="$(__git_find_on_cmdline --show-idx "$subcommands")"
3047 subcommand_idx="${subcommand% *}"
3048 subcommand="${subcommand#* }"
3c86f6cd
SG
3049
3050 case "$subcommand,$cur" in
3051 ,*)
b462c024 3052 __gitcomp "$subcommands"
3c86f6cd
SG
3053 ;;
3054 *,--*)
3055 __gitcomp_builtin worktree_$subcommand
3056 ;;
7d5ecd77
SG
3057 add,*) # usage: git worktree add [<options>] <path> [<commit-ish>]
3058 # Here we are not completing an --option, it's either the
3059 # path or a ref.
3060 case "$prev" in
3061 -b|-B) # Complete refs for branch to be created/reseted.
3062 __git_complete_refs
b462c024 3063 ;;
7d5ecd77
SG
3064 -*) # The previous word is an -o|--option without an
3065 # unstuck argument: have to complete the path for
3066 # the new worktree, so don't list anything, but let
3067 # Bash fall back to filename completion.
cc73385c 3068 ;;
7d5ecd77
SG
3069 *) # The previous word is not an --option, so it must
3070 # be either the 'add' subcommand, the unstuck
3071 # argument of an option (e.g. branch for -b|-B), or
3072 # the path for the new worktree.
3073 if [ $cword -eq $((subcommand_idx+1)) ]; then
3074 # Right after the 'add' subcommand: have to
3075 # complete the path, so fall back to Bash
3076 # filename completion.
3077 :
3078 else
3079 case "${words[cword-2]}" in
3080 -b|-B) # After '-b <branch>': have to
3081 # complete the path, so fall back
3082 # to Bash filename completion.
3083 ;;
3084 *) # After the path: have to complete
3085 # the ref to be checked out.
3086 __git_complete_refs
3087 ;;
3088 esac
3089 fi
b462c024
NTND
3090 ;;
3091 esac
7d5ecd77 3092 ;;
3027e4f9
SG
3093 lock,*|remove,*|unlock,*)
3094 __git_complete_worktree_paths
3095 ;;
3096 move,*)
3097 if [ $cword -eq $((subcommand_idx+1)) ]; then
3098 # The first parameter must be an existing working
3099 # tree to be moved.
3100 __git_complete_worktree_paths
3101 else
3102 # The second parameter is the destination: it could
3103 # be any path, so don't list anything, but let Bash
3104 # fall back to filename completion.
3105 :
3106 fi
3107 ;;
3c86f6cd 3108 esac
b462c024
NTND
3109}
3110
9f642a71
NTND
3111__git_complete_common () {
3112 local command="$1"
3113
3114 case "$cur" in
3115 --*)
3116 __gitcomp_builtin "$command"
3117 ;;
3118 esac
3119}
3120
3121__git_cmds_with_parseopt_helper=
3122__git_support_parseopt_helper () {
3123 test -n "$__git_cmds_with_parseopt_helper" ||
0089521c 3124 __git_cmds_with_parseopt_helper="$(__git --list-cmds=parseopt)"
9f642a71
NTND
3125
3126 case " $__git_cmds_with_parseopt_helper " in
3127 *" $1 "*)
3128 return 0
3129 ;;
3130 *)
3131 return 1
3132 ;;
3133 esac
3134}
3135
48e1c69a
NTND
3136__git_complete_command () {
3137 local command="$1"
3138 local completion_func="_git_${command//-/_}"
fb3a0cab
JH
3139 if ! declare -f $completion_func >/dev/null 2>/dev/null &&
3140 declare -f _completion_loader >/dev/null 2>/dev/null
3141 then
3142 _completion_loader "git-$command"
3143 fi
3144 if declare -f $completion_func >/dev/null 2>/dev/null
3145 then
48e1c69a
NTND
3146 $completion_func
3147 return 0
fb3a0cab
JH
3148 elif __git_support_parseopt_helper "$command"
3149 then
9f642a71
NTND
3150 __git_complete_common "$command"
3151 return 0
48e1c69a
NTND
3152 else
3153 return 1
3154 fi
3155}
3156
93b291e0 3157__git_main ()
690d8824 3158{
beb6ee71 3159 local i c=1 command __git_dir __git_repo_path
80ac0744 3160 local __git_C_args C_args_count=0
873537fa 3161
da48616f
PD
3162 while [ $c -lt $cword ]; do
3163 i="${words[c]}"
873537fa
SP
3164 case "$i" in
3165 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
776009d1 3166 --git-dir) ((c++)) ; __git_dir="${words[c]}" ;;
873537fa 3167 --bare) __git_dir="." ;;
1eb7e2f8 3168 --help) command="help"; break ;;
776009d1 3169 -c|--work-tree|--namespace) ((c++)) ;;
80ac0744
SG
3170 -C) __git_C_args[C_args_count++]=-C
3171 ((c++))
3172 __git_C_args[C_args_count++]="${words[c]}"
3173 ;;
911d5da6 3174 -*) ;;
873537fa
SP
3175 *) command="$i"; break ;;
3176 esac
6e8c755f 3177 ((c++))
873537fa
SP
3178 done
3179
1d17b22e 3180 if [ -z "$command" ]; then
7b329b9d
SG
3181 case "$prev" in
3182 --git-dir|-C|--work-tree)
3183 # these need a path argument, let's fall back to
3184 # Bash filename completion
3185 return
3186 ;;
e1e00089
SG
3187 -c)
3188 __git_complete_config_variable_name_and_value
3189 return
3190 ;;
3191 --namespace)
7b329b9d
SG
3192 # we don't support completing these options' arguments
3193 return
3194 ;;
3195 esac
da48616f 3196 case "$cur" in
47e98eec 3197 --*) __gitcomp "
ce5a2c95 3198 --paginate
47e98eec
SP
3199 --no-pager
3200 --git-dir=
3201 --bare
3202 --version
3203 --exec-path
3ffcd086 3204 --exec-path=
89a56bfb 3205 --html-path
66fb37d0 3206 --man-path
69ef3c02 3207 --info-path
ce5a2c95 3208 --work-tree=
a1bea2c1 3209 --namespace=
69ef3c02 3210 --no-replace-objects
ce5a2c95 3211 --help
47e98eec
SP
3212 "
3213 ;;
3301d36b
NTND
3214 *)
3215 if test -n "$GIT_TESTING_PORCELAIN_COMMAND_LIST"
3216 then
3217 __gitcomp "$GIT_TESTING_PORCELAIN_COMMAND_LIST"
3218 else
2eb6f09f 3219 __gitcomp "$(__git --list-cmds=list-mainporcelain,others,nohelpers,alias,list-complete,config)"
3301d36b
NTND
3220 fi
3221 ;;
72e5e989
SP
3222 esac
3223 return
873537fa 3224 fi
367dce2a 3225
48e1c69a 3226 __git_complete_command "$command" && return
8024ea60 3227
873537fa 3228 local expansion=$(__git_aliased_command "$command")
8024ea60 3229 if [ -n "$expansion" ]; then
880111c1 3230 words[1]=$expansion
48e1c69a 3231 __git_complete_command "$expansion"
8024ea60 3232 fi
690d8824
JH
3233}
3234
93b291e0 3235__gitk_main ()
690d8824 3236{
d773c631
SG
3237 __git_has_doubledash && return
3238
beb6ee71 3239 local __git_repo_path
fad9484f
SG
3240 __git_find_repo_path
3241
07ba53f7 3242 local merge=""
fad9484f 3243 if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
07ba53f7
RQ
3244 merge="--merge"
3245 fi
b3391775
SP
3246 case "$cur" in
3247 --*)
a393777e
TR
3248 __gitcomp "
3249 $__git_log_common_options
3250 $__git_log_gitk_options
3251 $merge
3252 "
b3391775
SP
3253 return
3254 ;;
3255 esac
ec804891 3256 __git_complete_revlist
690d8824
JH
3257}
3258
61d48c66
SG
3259if [[ -n ${ZSH_VERSION-} ]] &&
3260 # Don't define these functions when sourced from 'git-completion.zsh',
3261 # it has its own implementations.
3262 [[ -z ${GIT_SOURCING_ZSH_COMPLETION-} ]]; then
d8b45314 3263 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
6b179adf 3264
9cd67bd2
FC
3265 autoload -U +X compinit && compinit
3266
d8b45314
FC
3267 __gitcomp ()
3268 {
3269 emulate -L zsh
6b179adf 3270
d8b45314
FC
3271 local cur_="${3-$cur}"
3272
3273 case "$cur_" in
3274 --*=)
3275 ;;
3276 *)
3277 local c IFS=$' \t\n'
3278 local -a array
3279 for c in ${=1}; do
3280 c="$c${4-}"
3281 case $c in
3282 --*=*|*.) ;;
3283 *) c="$c " ;;
3284 esac
5d5812f4 3285 array[${#array[@]}+1]="$c"
d8b45314
FC
3286 done
3287 compset -P '*[=:]'
3288 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
3289 ;;
3290 esac
3291 }
3292
fef56eb0
SG
3293 __gitcomp_direct ()
3294 {
3295 emulate -L zsh
3296
3297 local IFS=$'\n'
3298 compset -P '*[=:]'
3299 compadd -Q -- ${=1} && _ret=0
3300 }
3301
d8b45314
FC
3302 __gitcomp_nl ()
3303 {
3304 emulate -L zsh
3305
3306 local IFS=$'\n'
3307 compset -P '*[=:]'
3308 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
3309 }
3310
7b003420
SG
3311 __gitcomp_file_direct ()
3312 {
3313 emulate -L zsh
3314
3315 local IFS=$'\n'
3316 compset -P '*[=:]'
7a478b36 3317 compadd -f -- ${=1} && _ret=0
7b003420
SG
3318 }
3319
fea16b47
MP
3320 __gitcomp_file ()
3321 {
3322 emulate -L zsh
3323
3324 local IFS=$'\n'
3325 compset -P '*[=:]'
7a478b36 3326 compadd -p "${2-}" -f -- ${=1} && _ret=0
fea16b47
MP
3327 }
3328
d8b45314
FC
3329 _git ()
3330 {
2bcf694b
FC
3331 local _ret=1 cur cword prev
3332 cur=${words[CURRENT]}
3333 prev=${words[CURRENT-1]}
3334 let cword=CURRENT-1
3335 emulate ksh -c __${service}_main
734b2f05 3336 let _ret && _default && _ret=0
d8b45314
FC
3337 return _ret
3338 }
3339
3340 compdef _git git gitk
3341 return
3342fi
3343
3344__git_func_wrap ()
3345{
6b179adf
FC
3346 local cur words cword prev
3347 _get_comp_words_by_ref -n =: cur words cword prev
3348 $1
3349}
3350
3351# Setup completion for certain functions defined above by setting common
3352# variables and workarounds.
3353# This is NOT a public function; use at your own risk.
3354__git_complete ()
3355{
3356 local wrapper="__git_wrap${2}"
3357 eval "$wrapper () { __git_func_wrap $2 ; }"
3358 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
3359 || complete -o default -o nospace -F $wrapper $1
3360}
3361
b0a4b2d2
FC
3362# wrapper for backwards compatibility
3363_git ()
3364{
93b291e0 3365 __git_wrap__git_main
b0a4b2d2
FC
3366}
3367
3368# wrapper for backwards compatibility
3369_gitk ()
3370{
93b291e0 3371 __git_wrap__gitk_main
b0a4b2d2
FC
3372}
3373
93b291e0
SG
3374__git_complete git __git_main
3375__git_complete gitk __gitk_main
690d8824
JH
3376
3377# The following are necessary only for Cygwin, and only are needed
3378# when the user has tab-completed the executable name and consequently
3379# included the '.exe' suffix.
3380#
76c3eb51 3381if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
93b291e0 3382__git_complete git.exe __git_main
76c3eb51 3383fi