]> git.ipfire.org Git - thirdparty/git.git/blame - contrib/completion/git-completion.bash
Merge branch 'maint'
[thirdparty/git.git] / contrib / completion / git-completion.bash
CommitLineData
a42577d4 1#!bash
690d8824 2#
b5a49471 3# bash/zsh completion support for core Git.
690d8824 4#
c70680ce 5# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
690d8824 6# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
c70680ce 7# Distributed under the GNU General Public License, version 2.0.
690d8824
JH
8#
9# The contained completion routines provide support for completing:
10#
11# *) local and remote branch names
12# *) local and remote tag names
13# *) .git/remotes file names
14# *) git 'subcommands'
15# *) tree paths within 'ref:path/to/file' expressions
c70680ce 16# *) common --long-options
690d8824
JH
17#
18# To use these routines:
19#
20# 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
b5a49471 21# 2) Add the following line to your .bashrc/.zshrc:
06f44c3c 22# source ~/.git-completion.sh
af31a456
FC
23# 3) Consider changing your PS1 to also show the current branch,
24# see git-prompt.sh for details.
690d8824 25
b5a49471
MSO
26if [[ -n ${ZSH_VERSION-} ]]; then
27 autoload -U +X bashcompinit && bashcompinit
28fi
29
db8a9ff0
SP
30case "$COMP_WORDBREAKS" in
31*:*) : great ;;
32*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
33esac
34
a42577d4
TP
35# __gitdir accepts 0 or 1 arguments (i.e., location)
36# returns location of .git repo
873537fa
SP
37__gitdir ()
38{
ac3eb1c3
JH
39 # Note: this function is duplicated in git-prompt.sh
40 # When updating it, make sure you update the other one to match.
25a31f81 41 if [ -z "${1-}" ]; then
5c9cc64a 42 if [ -n "${__git_dir-}" ]; then
67ffa114 43 echo "$__git_dir"
b7be4366
SG
44 elif [ -n "${GIT_DIR-}" ]; then
45 test -d "${GIT_DIR-}" || return 1
46 echo "$GIT_DIR"
67ffa114
SP
47 elif [ -d .git ]; then
48 echo .git
49 else
50 git rev-parse --git-dir 2>/dev/null
51 fi
52 elif [ -d "$1/.git" ]; then
53 echo "$1/.git"
54 else
55 echo "$1"
56 fi
873537fa
SP
57}
58
ab02dfe5
SP
59__gitcomp_1 ()
60{
3bf421ea 61 local c IFS=$' \t\n'
ab02dfe5 62 for c in $1; do
3bf421ea
FC
63 c="$c$2"
64 case $c in
65 --*=*|*.) ;;
66 *) c="$c " ;;
ab02dfe5 67 esac
3bf421ea 68 printf '%s\n' "$c"
ab02dfe5
SP
69 done
70}
71
dbda3b10
JN
72# The following function is based on code from:
73#
74# bash_completion - programmable completion functions for bash 3.2+
75#
76# Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
77# © 2009-2010, Bash Completion Maintainers
78# <bash-completion-devel@lists.alioth.debian.org>
79#
80# This program is free software; you can redistribute it and/or modify
81# it under the terms of the GNU General Public License as published by
82# the Free Software Foundation; either version 2, or (at your option)
83# any later version.
84#
85# This program is distributed in the hope that it will be useful,
86# but WITHOUT ANY WARRANTY; without even the implied warranty of
87# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
88# GNU General Public License for more details.
89#
90# You should have received a copy of the GNU General Public License
91# along with this program; if not, write to the Free Software Foundation,
92# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
93#
94# The latest version of this software can be obtained here:
95#
96# http://bash-completion.alioth.debian.org/
97#
98# RELEASE: 2.x
99
100# This function can be used to access a tokenized list of words
101# on the command line:
102#
103# __git_reassemble_comp_words_by_ref '=:'
104# if test "${words_[cword_-1]}" = -w
105# then
106# ...
107# fi
108#
109# The argument should be a collection of characters from the list of
110# word completion separators (COMP_WORDBREAKS) to treat as ordinary
111# characters.
112#
113# This is roughly equivalent to going back in time and setting
114# COMP_WORDBREAKS to exclude those characters. The intent is to
115# make option types like --date=<type> and <rev>:<path> easy to
116# recognize by treating each shell word as a single token.
117#
118# It is best not to set COMP_WORDBREAKS directly because the value is
119# shared with other completion scripts. By the time the completion
120# function gets called, COMP_WORDS has already been populated so local
121# changes to COMP_WORDBREAKS have no effect.
122#
123# Output: words_, cword_, cur_.
124
125__git_reassemble_comp_words_by_ref()
126{
127 local exclude i j first
128 # Which word separators to exclude?
129 exclude="${1//[^$COMP_WORDBREAKS]}"
130 cword_=$COMP_CWORD
131 if [ -z "$exclude" ]; then
132 words_=("${COMP_WORDS[@]}")
133 return
134 fi
135 # List of word completion separators has shrunk;
136 # re-assemble words to complete.
137 for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
138 # Append each nonempty word consisting of just
139 # word separator characters to the current word.
140 first=t
141 while
142 [ $i -gt 0 ] &&
143 [ -n "${COMP_WORDS[$i]}" ] &&
144 # word consists of excluded word separators
145 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
146 do
147 # Attach to the previous token,
148 # unless the previous token is the command name.
149 if [ $j -ge 2 ] && [ -n "$first" ]; then
150 ((j--))
151 fi
152 first=
153 words_[$j]=${words_[j]}${COMP_WORDS[i]}
154 if [ $i = $COMP_CWORD ]; then
155 cword_=$j
156 fi
157 if (($i < ${#COMP_WORDS[@]} - 1)); then
158 ((i++))
159 else
160 # Done.
161 return
162 fi
163 done
164 words_[$j]=${words_[j]}${COMP_WORDS[i]}
165 if [ $i = $COMP_CWORD ]; then
166 cword_=$j
167 fi
168 done
169}
170
da48616f 171if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
52c9d8e2 172if [[ -z ${ZSH_VERSION:+set} ]]; then
da48616f
PD
173_get_comp_words_by_ref ()
174{
dbda3b10
JN
175 local exclude cur_ words_ cword_
176 if [ "$1" = "-n" ]; then
177 exclude=$2
178 shift 2
179 fi
180 __git_reassemble_comp_words_by_ref "$exclude"
181 cur_=${words_[cword_]}
da48616f
PD
182 while [ $# -gt 0 ]; do
183 case "$1" in
184 cur)
dbda3b10 185 cur=$cur_
da48616f
PD
186 ;;
187 prev)
dbda3b10 188 prev=${words_[$cword_-1]}
da48616f
PD
189 ;;
190 words)
dbda3b10 191 words=("${words_[@]}")
da48616f
PD
192 ;;
193 cword)
dbda3b10 194 cword=$cword_
da48616f
PD
195 ;;
196 esac
197 shift
198 done
199}
52c9d8e2
JN
200else
201_get_comp_words_by_ref ()
202{
203 while [ $# -gt 0 ]; do
204 case "$1" in
205 cur)
206 cur=${COMP_WORDS[COMP_CWORD]}
207 ;;
208 prev)
209 prev=${COMP_WORDS[COMP_CWORD-1]}
210 ;;
211 words)
212 words=("${COMP_WORDS[@]}")
213 ;;
214 cword)
215 cword=$COMP_CWORD
216 ;;
217 -n)
218 # assume COMP_WORDBREAKS is already set sanely
219 shift
220 ;;
221 esac
222 shift
223 done
224}
225fi
da48616f
PD
226fi
227
f674bb80
SG
228# Generates completion reply with compgen, appending a space to possible
229# completion words, if necessary.
230# It accepts 1 to 4 arguments:
231# 1: List of possible completion words.
232# 2: A prefix to be added to each possible completion word (optional).
233# 3: Generate possible completion matches for this word (optional).
234# 4: A suffix to be appended to each possible completion word (optional).
72e5e989
SP
235__gitcomp ()
236{
583e4d57 237 local cur_="${3-$cur}"
9244d69b 238
9244d69b 239 case "$cur_" in
5447aac7
SG
240 --*=)
241 COMPREPLY=()
5447aac7
SG
242 ;;
243 *)
ab02dfe5 244 local IFS=$'\n'
25a31f81
TP
245 COMPREPLY=($(compgen -P "${2-}" \
246 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
9244d69b 247 -- "$cur_"))
5447aac7
SG
248 ;;
249 esac
72e5e989
SP
250}
251
a31e6262
SG
252# Generates completion reply with compgen from newline-separated possible
253# completion words by appending a space to all of them.
254# It accepts 1 to 4 arguments:
255# 1: List of possible completion words, separated by a single newline.
256# 2: A prefix to be added to each possible completion word (optional).
257# 3: Generate possible completion matches for this word (optional).
258# 4: A suffix to be appended to each possible completion word instead of
259# the default space (optional). If specified but empty, nothing is
260# appended.
261__gitcomp_nl ()
262{
583e4d57 263 local IFS=$'\n'
666ca59a 264 COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
a31e6262
SG
265}
266
5de40f59
SP
267__git_heads ()
268{
6486ca6d 269 local dir="$(__gitdir)"
5de40f59 270 if [ -d "$dir" ]; then
05e8b3d6
SG
271 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
272 refs/heads
5de40f59
SP
273 return
274 fi
5de40f59
SP
275}
276
88e21dc7
SP
277__git_tags ()
278{
6486ca6d 279 local dir="$(__gitdir)"
88e21dc7 280 if [ -d "$dir" ]; then
05e8b3d6
SG
281 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
282 refs/tags
88e21dc7
SP
283 return
284 fi
88e21dc7
SP
285}
286
34a6bbb5
KB
287# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
288# presence of 2nd argument means use the guess heuristic employed
289# by checkout for tracking branches
690d8824
JH
290__git_refs ()
291{
d8c0453e 292 local i hash dir="$(__gitdir "${1-}")" track="${2-}"
da4902a7 293 local format refs
873537fa 294 if [ -d "$dir" ]; then
608efb87
SG
295 case "$cur" in
296 refs|refs/*)
297 format="refname"
298 refs="${cur%/*}"
34a6bbb5 299 track=""
608efb87
SG
300 ;;
301 *)
d23e7570
IWC
302 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
303 if [ -e "$dir/$i" ]; then echo $i; fi
304 done
608efb87
SG
305 format="refname:short"
306 refs="refs/tags refs/heads refs/remotes"
307 ;;
308 esac
309 git --git-dir="$dir" for-each-ref --format="%($format)" \
310 $refs
34a6bbb5
KB
311 if [ -n "$track" ]; then
312 # employ the heuristic used by git checkout
313 # Try to find a remote branch that matches the completion word
314 # but only output if the branch name is unique
315 local ref entry
316 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
317 "refs/remotes/" | \
6f2dd720 318 while read -r entry; do
34a6bbb5
KB
319 eval "$entry"
320 ref="${ref#*/}"
321 if [[ "$ref" == "$cur"* ]]; then
322 echo "$ref"
323 fi
324 done | uniq -u
325 fi
35e65ecc 326 return
690d8824 327 fi
fb772cca
SG
328 case "$cur" in
329 refs|refs/*)
330 git ls-remote "$dir" "$cur*" 2>/dev/null | \
6f2dd720 331 while read -r hash i; do
fb772cca
SG
332 case "$i" in
333 *^{}) ;;
334 *) echo "$i" ;;
335 esac
336 done
337 ;;
338 *)
339 git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \
6f2dd720 340 while read -r hash i; do
fb772cca
SG
341 case "$i" in
342 *^{}) ;;
343 refs/*) echo "${i#refs/*/}" ;;
344 *) echo "$i" ;;
345 esac
346 done
347 ;;
348 esac
690d8824
JH
349}
350
a42577d4 351# __git_refs2 requires 1 argument (to pass to __git_refs)
690d8824
JH
352__git_refs2 ()
353{
67ffa114
SP
354 local i
355 for i in $(__git_refs "$1"); do
356 echo "$i:$i"
690d8824
JH
357 done
358}
359
a42577d4 360# __git_refs_remotes requires 1 argument (to pass to ls-remote)
5de40f59
SP
361__git_refs_remotes ()
362{
48058f5d
SG
363 local i hash
364 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
6f2dd720 365 while read -r hash i; do
48058f5d 366 echo "$i:refs/remotes/$1/${i#refs/heads/}"
5de40f59
SP
367 done
368}
369
690d8824
JH
370__git_remotes ()
371{
d79f81ad
FC
372 local i IFS=$'\n' d="$(__gitdir)"
373 test -d "$d/remotes" && ls -1 "$d/remotes"
518ef8f0
TZ
374 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
375 i="${i#remote.}"
376 echo "${i/.url*/}"
56fc25f2 377 done
690d8824
JH
378}
379
eaa4e6ee 380__git_list_merge_strategies ()
4ad91321 381{
25b3d4d6
JH
382 git merge -s help 2>&1 |
383 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
384 s/\.$//
385 s/.*://
386 s/^[ ]*//
387 s/[ ]*$//
4ad91321 388 p
25b3d4d6 389 }'
4ad91321 390}
eaa4e6ee
JN
391
392__git_merge_strategies=
393# 'git merge -s help' (and thus detection of the merge strategy
394# list) fails, unfortunately, if run outside of any git working
395# tree. __git_merge_strategies is set to the empty string in
396# that case, and the detection will be repeated the next time it
397# is needed.
398__git_compute_merge_strategies ()
399{
cf0ff02a
FC
400 test -n "$__git_merge_strategies" ||
401 __git_merge_strategies=$(__git_list_merge_strategies)
eaa4e6ee 402}
4ad91321 403
1d66ec58 404__git_complete_revlist_file ()
690d8824 405{
da4902a7 406 local pfx ls ref cur_="$cur"
9244d69b 407 case "$cur_" in
1d66ec58
SG
408 *..?*:*)
409 return
410 ;;
690d8824 411 ?*:*)
9244d69b
SG
412 ref="${cur_%%:*}"
413 cur_="${cur_#*:}"
414 case "$cur_" in
690d8824 415 ?*/*)
9244d69b
SG
416 pfx="${cur_%/*}"
417 cur_="${cur_##*/}"
690d8824
JH
418 ls="$ref:$pfx"
419 pfx="$pfx/"
420 ;;
421 *)
422 ls="$ref"
423 ;;
80152b09 424 esac
db8a9ff0
SP
425
426 case "$COMP_WORDBREAKS" in
427 *:*) : great ;;
428 *) pfx="$ref:$pfx" ;;
429 esac
430
41e6229d 431 __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
778306e4
SP
432 | sed '/^100... blob /{
433 s,^.* ,,
434 s,$, ,
435 }
436 /^120000 blob /{
437 s,^.* ,,
438 s,$, ,
439 }
690d8824
JH
440 /^040000 tree /{
441 s,^.* ,,
442 s,$,/,
443 }
444 s/^.* //')" \
41e6229d 445 "$pfx" "$cur_" ""
690d8824 446 ;;
f53352fb 447 *...*)
9244d69b
SG
448 pfx="${cur_%...*}..."
449 cur_="${cur_#*...}"
a31e6262 450 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
f53352fb
SP
451 ;;
452 *..*)
9244d69b
SG
453 pfx="${cur_%..*}.."
454 cur_="${cur_#*..}"
a31e6262 455 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
b3391775 456 ;;
f53352fb 457 *)
a31e6262 458 __gitcomp_nl "$(__git_refs)"
f53352fb
SP
459 ;;
460 esac
461}
462
1d66ec58
SG
463
464__git_complete_file ()
465{
466 __git_complete_revlist_file
467}
468
469__git_complete_revlist ()
470{
471 __git_complete_revlist_file
472}
473
52d5c3b5
JS
474__git_complete_remote_or_refspec ()
475{
9244d69b 476 local cur_="$cur" cmd="${words[1]}"
0a4e1472 477 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
f1c6ffe6 478 if [ "$cmd" = "remote" ]; then
6e8c755f 479 ((c++))
f1c6ffe6 480 fi
da48616f
PD
481 while [ $c -lt $cword ]; do
482 i="${words[c]}"
52d5c3b5 483 case "$i" in
e25e2b42
BG
484 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
485 --all)
486 case "$cmd" in
487 push) no_complete_refspec=1 ;;
488 fetch)
489 COMPREPLY=()
490 return
491 ;;
492 *) ;;
493 esac
494 ;;
52d5c3b5
JS
495 -*) ;;
496 *) remote="$i"; break ;;
497 esac
6e8c755f 498 ((c++))
52d5c3b5
JS
499 done
500 if [ -z "$remote" ]; then
a31e6262 501 __gitcomp_nl "$(__git_remotes)"
52d5c3b5
JS
502 return
503 fi
0a4e1472
JS
504 if [ $no_complete_refspec = 1 ]; then
505 COMPREPLY=()
506 return
507 fi
52d5c3b5 508 [ "$remote" = "." ] && remote=
9244d69b 509 case "$cur_" in
52d5c3b5
JS
510 *:*)
511 case "$COMP_WORDBREAKS" in
512 *:*) : great ;;
9244d69b 513 *) pfx="${cur_%%:*}:" ;;
52d5c3b5 514 esac
9244d69b 515 cur_="${cur_#*:}"
52d5c3b5
JS
516 lhs=0
517 ;;
518 +*)
519 pfx="+"
9244d69b 520 cur_="${cur_#+}"
52d5c3b5
JS
521 ;;
522 esac
523 case "$cmd" in
524 fetch)
525 if [ $lhs = 1 ]; then
a31e6262 526 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
52d5c3b5 527 else
a31e6262 528 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
52d5c3b5
JS
529 fi
530 ;;
f1c6ffe6 531 pull|remote)
52d5c3b5 532 if [ $lhs = 1 ]; then
a31e6262 533 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
52d5c3b5 534 else
a31e6262 535 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
52d5c3b5
JS
536 fi
537 ;;
538 push)
539 if [ $lhs = 1 ]; then
a31e6262 540 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
52d5c3b5 541 else
a31e6262 542 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
52d5c3b5
JS
543 fi
544 ;;
545 esac
546}
547
3c7b480a
JS
548__git_complete_strategy ()
549{
eaa4e6ee 550 __git_compute_merge_strategies
da48616f 551 case "$prev" in
3c7b480a 552 -s|--strategy)
eaa4e6ee 553 __gitcomp "$__git_merge_strategies"
3c7b480a
JS
554 return 0
555 esac
3c7b480a
JS
556 case "$cur" in
557 --strategy=*)
eaa4e6ee 558 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
3c7b480a
JS
559 return 0
560 ;;
561 esac
562 return 1
563}
564
eaa4e6ee 565__git_list_all_commands ()
f2bb9f88
SP
566{
567 local i IFS=" "$'\n'
427e586b 568 for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
1eb7e2f8
LM
569 do
570 case $i in
571 *--*) : helper pattern;;
572 *) echo $i;;
573 esac
574 done
575}
1eb7e2f8 576
eaa4e6ee
JN
577__git_all_commands=
578__git_compute_all_commands ()
579{
cf0ff02a
FC
580 test -n "$__git_all_commands" ||
581 __git_all_commands=$(__git_list_all_commands)
eaa4e6ee
JN
582}
583
584__git_list_porcelain_commands ()
1eb7e2f8 585{
1eb7e2f8 586 local i IFS=" "$'\n'
eaa4e6ee
JN
587 __git_compute_all_commands
588 for i in "help" $__git_all_commands
f2bb9f88
SP
589 do
590 case $i in
718a087a 591 *--*) : helper pattern;;
a925c6f1
SP
592 applymbox) : ask gittus;;
593 applypatch) : ask gittus;;
594 archimport) : import;;
2e3a430a 595 cat-file) : plumbing;;
56d99c67 596 check-attr) : plumbing;;
f2bb9f88 597 check-ref-format) : plumbing;;
ff2549dc 598 checkout-index) : plumbing;;
f2bb9f88 599 commit-tree) : plumbing;;
ff2549dc 600 count-objects) : infrequent;;
1dad5c14
SG
601 credential-cache) : credentials helper;;
602 credential-store) : credentials helper;;
a925c6f1
SP
603 cvsexportcommit) : export;;
604 cvsimport) : import;;
f2bb9f88
SP
605 cvsserver) : daemon;;
606 daemon) : daemon;;
5cfb4fe5
SP
607 diff-files) : plumbing;;
608 diff-index) : plumbing;;
609 diff-tree) : plumbing;;
c6ec3b13 610 fast-import) : import;;
ff2549dc 611 fast-export) : export;;
a925c6f1 612 fsck-objects) : plumbing;;
f2bb9f88 613 fetch-pack) : plumbing;;
a925c6f1 614 fmt-merge-msg) : plumbing;;
56d99c67 615 for-each-ref) : plumbing;;
f2bb9f88
SP
616 hash-object) : plumbing;;
617 http-*) : transport;;
618 index-pack) : plumbing;;
a925c6f1 619 init-db) : deprecated;;
f2bb9f88 620 local-fetch) : plumbing;;
ff2549dc
PB
621 lost-found) : infrequent;;
622 ls-files) : plumbing;;
623 ls-remote) : plumbing;;
624 ls-tree) : plumbing;;
f2bb9f88
SP
625 mailinfo) : plumbing;;
626 mailsplit) : plumbing;;
627 merge-*) : plumbing;;
628 mktree) : plumbing;;
629 mktag) : plumbing;;
630 pack-objects) : plumbing;;
631 pack-redundant) : plumbing;;
632 pack-refs) : plumbing;;
633 parse-remote) : plumbing;;
634 patch-id) : plumbing;;
635 peek-remote) : plumbing;;
a925c6f1
SP
636 prune) : plumbing;;
637 prune-packed) : plumbing;;
638 quiltimport) : import;;
f2bb9f88
SP
639 read-tree) : plumbing;;
640 receive-pack) : plumbing;;
63d04a78 641 remote-*) : transport;;
5c66d0d4 642 repo-config) : deprecated;;
f2bb9f88
SP
643 rerere) : plumbing;;
644 rev-list) : plumbing;;
645 rev-parse) : plumbing;;
646 runstatus) : plumbing;;
647 sh-setup) : internal;;
648 shell) : daemon;;
ff2549dc 649 show-ref) : plumbing;;
f2bb9f88
SP
650 send-pack) : plumbing;;
651 show-index) : plumbing;;
652 ssh-*) : transport;;
653 stripspace) : plumbing;;
654 symbolic-ref) : plumbing;;
a925c6f1 655 tar-tree) : deprecated;;
f2bb9f88
SP
656 unpack-file) : plumbing;;
657 unpack-objects) : plumbing;;
a925c6f1 658 update-index) : plumbing;;
f2bb9f88
SP
659 update-ref) : plumbing;;
660 update-server-info) : daemon;;
661 upload-archive) : plumbing;;
662 upload-pack) : plumbing;;
663 write-tree) : plumbing;;
ff2549dc
PB
664 var) : infrequent;;
665 verify-pack) : infrequent;;
a925c6f1 666 verify-tag) : plumbing;;
f2bb9f88
SP
667 *) echo $i;;
668 esac
669 done
670}
eaa4e6ee
JN
671
672__git_porcelain_commands=
673__git_compute_porcelain_commands ()
674{
675 __git_compute_all_commands
cf0ff02a
FC
676 test -n "$__git_porcelain_commands" ||
677 __git_porcelain_commands=$(__git_list_porcelain_commands)
eaa4e6ee 678}
f2bb9f88 679
c3898111
SG
680__git_pretty_aliases ()
681{
682 local i IFS=$'\n'
683 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
684 case "$i" in
685 pretty.*)
686 i="${i#pretty.}"
687 echo "${i/ */}"
688 ;;
689 esac
690 done
691}
692
367dce2a
DS
693__git_aliases ()
694{
56fc25f2 695 local i IFS=$'\n'
518ef8f0 696 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
e0d78059
SB
697 case "$i" in
698 alias.*)
699 i="${i#alias.}"
700 echo "${i/ */}"
701 ;;
702 esac
56fc25f2 703 done
367dce2a
DS
704}
705
a42577d4 706# __git_aliased_command requires 1 argument
367dce2a
DS
707__git_aliased_command ()
708{
873537fa 709 local word cmdline=$(git --git-dir="$(__gitdir)" \
e0d10e1c 710 config --get "alias.$1")
367dce2a 711 for word in $cmdline; do
c63437cb 712 case "$word" in
66729509
SG
713 \!gitk|gitk)
714 echo "gitk"
367dce2a 715 return
66729509 716 ;;
c63437cb
SG
717 \!*) : shell command alias ;;
718 -*) : option ;;
719 *=*) : setting env ;;
720 git) : git itself ;;
721 *)
722 echo "$word"
367dce2a 723 return
c63437cb 724 esac
367dce2a
DS
725 done
726}
727
918c03c2
SG
728# __git_find_on_cmdline requires 1 argument
729__git_find_on_cmdline ()
3ff1320d 730{
da4902a7 731 local word subcommand c=1
da48616f
PD
732 while [ $c -lt $cword ]; do
733 word="${words[c]}"
3ff1320d
SG
734 for subcommand in $1; do
735 if [ "$subcommand" = "$word" ]; then
736 echo "$subcommand"
737 return
738 fi
739 done
6e8c755f 740 ((c++))
3ff1320d
SG
741 done
742}
743
d773c631
SG
744__git_has_doubledash ()
745{
da4902a7 746 local c=1
da48616f
PD
747 while [ $c -lt $cword ]; do
748 if [ "--" = "${words[c]}" ]; then
d773c631
SG
749 return 0
750 fi
6e8c755f 751 ((c++))
d773c631
SG
752 done
753 return 1
754}
755
7950659d 756__git_whitespacelist="nowarn warn error error-all fix"
88329195
SP
757
758_git_am ()
759{
da4902a7 760 local dir="$(__gitdir)"
51ef1daa 761 if [ -d "$dir"/rebase-apply ]; then
85f6b439 762 __gitcomp "--skip --continue --resolved --abort"
88329195
SP
763 return
764 fi
765 case "$cur" in
766 --whitespace=*)
b3391775 767 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
768 return
769 ;;
770 --*)
b3391775 771 __gitcomp "
43acdf24 772 --3way --committer-date-is-author-date --ignore-date
86c91f91 773 --ignore-whitespace --ignore-space-change
43acdf24 774 --interactive --keep --no-utf8 --signoff --utf8
af4e9e8c 775 --whitespace= --scissors
b3391775 776 "
88329195
SP
777 return
778 esac
779 COMPREPLY=()
780}
781
782_git_apply ()
783{
88329195
SP
784 case "$cur" in
785 --whitespace=*)
b3391775 786 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
787 return
788 ;;
789 --*)
b3391775 790 __gitcomp "
88329195
SP
791 --stat --numstat --summary --check --index
792 --cached --index-info --reverse --reject --unidiff-zero
793 --apply --no-add --exclude=
86c91f91 794 --ignore-whitespace --ignore-space-change
88329195 795 --whitespace= --inaccurate-eof --verbose
b3391775 796 "
88329195
SP
797 return
798 esac
799 COMPREPLY=()
800}
801
8435b548
SP
802_git_add ()
803{
d773c631
SG
804 __git_has_doubledash && return
805
8435b548
SP
806 case "$cur" in
807 --*)
1d284cba
SG
808 __gitcomp "
809 --interactive --refresh --patch --update --dry-run
c9a114b5 810 --ignore-errors --intent-to-add
1d284cba 811 "
8435b548
SP
812 return
813 esac
814 COMPREPLY=()
815}
816
b3191ce2
LM
817_git_archive ()
818{
b3191ce2
LM
819 case "$cur" in
820 --format=*)
821 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
822 return
823 ;;
824 --remote=*)
a31e6262 825 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
b3191ce2
LM
826 return
827 ;;
828 --*)
829 __gitcomp "
830 --format= --list --verbose
831 --prefix= --remote= --exec=
832 "
833 return
834 ;;
835 esac
836 __git_complete_file
837}
838
b2e69f62
SP
839_git_bisect ()
840{
d773c631
SG
841 __git_has_doubledash && return
842
bf11d461 843 local subcommands="start bad good skip reset visualize replay log run"
918c03c2 844 local subcommand="$(__git_find_on_cmdline "$subcommands")"
3ff1320d 845 if [ -z "$subcommand" ]; then
128191f5
SG
846 if [ -f "$(__gitdir)"/BISECT_START ]; then
847 __gitcomp "$subcommands"
848 else
849 __gitcomp "replay start"
850 fi
b2e69f62
SP
851 return
852 fi
853
3ff1320d 854 case "$subcommand" in
8205ff8e 855 bad|good|reset|skip|start)
a31e6262 856 __gitcomp_nl "$(__git_refs)"
b2e69f62
SP
857 ;;
858 *)
859 COMPREPLY=()
860 ;;
861 esac
862}
863
690d8824
JH
864_git_branch ()
865{
da4902a7 866 local i c=1 only_local_ref="n" has_r="n"
b9217642 867
da48616f
PD
868 while [ $c -lt $cword ]; do
869 i="${words[c]}"
b9217642
SG
870 case "$i" in
871 -d|-m) only_local_ref="y" ;;
872 -r) has_r="y" ;;
873 esac
6e8c755f 874 ((c++))
b9217642
SG
875 done
876
da48616f 877 case "$cur" in
ca45d0fa
MG
878 --set-upstream-to=*)
879 __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}"
880 ;;
3b376b0c
SG
881 --*)
882 __gitcomp "
883 --color --no-color --verbose --abbrev= --no-abbrev
50e61025 884 --track --no-track --contains --merged --no-merged
04308e9d
CMN
885 --set-upstream-to= --edit-description --list
886 --unset-upstream
3b376b0c
SG
887 "
888 ;;
b9217642
SG
889 *)
890 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
a31e6262 891 __gitcomp_nl "$(__git_heads)"
b9217642 892 else
a31e6262 893 __gitcomp_nl "$(__git_refs)"
b9217642
SG
894 fi
895 ;;
3b376b0c 896 esac
690d8824
JH
897}
898
374a58c9
ML
899_git_bundle ()
900{
da48616f
PD
901 local cmd="${words[2]}"
902 case "$cword" in
8d8163f3 903 2)
374a58c9
ML
904 __gitcomp "create list-heads verify unbundle"
905 ;;
8d8163f3 906 3)
374a58c9
ML
907 # looking for a file
908 ;;
909 *)
910 case "$cmd" in
911 create)
912 __git_complete_revlist
913 ;;
914 esac
915 ;;
916 esac
917}
918
690d8824
JH
919_git_checkout ()
920{
c84bb14c
SG
921 __git_has_doubledash && return
922
e648f8b6
SG
923 case "$cur" in
924 --conflict=*)
925 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
926 ;;
927 --*)
928 __gitcomp "
929 --quiet --ours --theirs --track --no-track --merge
86e8e7a5 930 --conflict= --orphan --patch
e648f8b6
SG
931 "
932 ;;
933 *)
34a6bbb5
KB
934 # check if --track, --no-track, or --no-guess was specified
935 # if so, disable DWIM mode
936 local flags="--track --no-track --no-guess" track=1
937 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
938 track=''
939 fi
a31e6262 940 __gitcomp_nl "$(__git_refs '' $track)"
e648f8b6
SG
941 ;;
942 esac
690d8824
JH
943}
944
d8a9fea5
SP
945_git_cherry ()
946{
947 __gitcomp "$(__git_refs)"
948}
949
1273231e
SP
950_git_cherry_pick ()
951{
1273231e
SP
952 case "$cur" in
953 --*)
b3391775 954 __gitcomp "--edit --no-commit"
1273231e
SP
955 ;;
956 *)
a31e6262 957 __gitcomp_nl "$(__git_refs)"
1273231e
SP
958 ;;
959 esac
960}
961
4181c7e8
LM
962_git_clean ()
963{
964 __git_has_doubledash && return
965
4181c7e8
LM
966 case "$cur" in
967 --*)
968 __gitcomp "--dry-run --quiet"
969 return
970 ;;
971 esac
972 COMPREPLY=()
973}
974
3eb11012
LM
975_git_clone ()
976{
3eb11012
LM
977 case "$cur" in
978 --*)
979 __gitcomp "
980 --local
981 --no-hardlinks
982 --shared
983 --reference
984 --quiet
985 --no-checkout
986 --bare
987 --mirror
988 --origin
989 --upload-pack
990 --template=
991 --depth
992 "
993 return
994 ;;
995 esac
996 COMPREPLY=()
997}
998
4548e855
SP
999_git_commit ()
1000{
d773c631
SG
1001 __git_has_doubledash && return
1002
4548e855 1003 case "$cur" in
9a424b27
SG
1004 --cleanup=*)
1005 __gitcomp "default strip verbatim whitespace
1006 " "" "${cur##--cleanup=}"
1007 return
1008 ;;
77653abd
TM
1009 --reuse-message=*|--reedit-message=*|\
1010 --fixup=*|--squash=*)
a31e6262 1011 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
9a424b27
SG
1012 return
1013 ;;
1014 --untracked-files=*)
1015 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1016 return
1017 ;;
4548e855 1018 --*)
b3391775 1019 __gitcomp "
4548e855 1020 --all --author= --signoff --verify --no-verify
7dd9ab0c
YB
1021 --edit --no-edit
1022 --amend --include --only --interactive
9a424b27
SG
1023 --dry-run --reuse-message= --reedit-message=
1024 --reset-author --file= --message= --template=
1025 --cleanup= --untracked-files --untracked-files=
77653abd 1026 --verbose --quiet --fixup= --squash=
b3391775 1027 "
4548e855
SP
1028 return
1029 esac
1030 COMPREPLY=()
1031}
1032
217926c0
SP
1033_git_describe ()
1034{
cbb504c9
TR
1035 case "$cur" in
1036 --*)
1037 __gitcomp "
1038 --all --tags --contains --abbrev= --candidates=
1039 --exact-match --debug --long --match --always
1040 "
1041 return
1042 esac
a31e6262 1043 __gitcomp_nl "$(__git_refs)"
217926c0
SP
1044}
1045
20bf7292 1046__git_diff_common_options="--stat --numstat --shortstat --summary
b3a4f858
JS
1047 --patch-with-stat --name-only --name-status --color
1048 --no-color --color-words --no-renames --check
f135aacb 1049 --full-index --binary --abbrev --diff-filter=
47d5a8fa 1050 --find-copies-harder
b3a4f858
JS
1051 --text --ignore-space-at-eol --ignore-space-change
1052 --ignore-all-space --exit-code --quiet --ext-diff
aba201c6
PO
1053 --no-ext-diff
1054 --no-prefix --src-prefix= --dst-prefix=
6d0e674a 1055 --inter-hunk-context=
cc545709 1056 --patience
20bf7292 1057 --raw
8fd2cfa7
SB
1058 --dirstat --dirstat= --dirstat-by-file
1059 --dirstat-by-file= --cumulative
20bf7292
TR
1060"
1061
1062_git_diff ()
1063{
1064 __git_has_doubledash && return
1065
20bf7292
TR
1066 case "$cur" in
1067 --*)
ebd15bf0 1068 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
861514d3 1069 --base --ours --theirs --no-index
20bf7292 1070 $__git_diff_common_options
aba201c6 1071 "
b3a4f858
JS
1072 return
1073 ;;
1074 esac
1d66ec58 1075 __git_complete_revlist_file
690d8824
JH
1076}
1077
e2dc2de9 1078__git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
755e8b3f 1079 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
e2dc2de9
DA
1080"
1081
1082_git_difftool ()
1083{
f7ad96cf
MH
1084 __git_has_doubledash && return
1085
e2dc2de9
DA
1086 case "$cur" in
1087 --tool=*)
1088 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1089 return
1090 ;;
1091 --*)
f7ad96cf
MH
1092 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1093 --base --ours --theirs
1094 --no-renames --diff-filter= --find-copies-harder
1095 --relative --ignore-submodules
1096 --tool="
e2dc2de9
DA
1097 return
1098 ;;
1099 esac
f7ad96cf 1100 __git_complete_file
e2dc2de9
DA
1101}
1102
0a4e1472
JS
1103__git_fetch_options="
1104 --quiet --verbose --append --upload-pack --force --keep --depth=
e25e2b42 1105 --tags --no-tags --all --prune --dry-run
0a4e1472
JS
1106"
1107
690d8824
JH
1108_git_fetch ()
1109{
0a4e1472
JS
1110 case "$cur" in
1111 --*)
1112 __gitcomp "$__git_fetch_options"
1113 return
1114 ;;
1115 esac
52d5c3b5 1116 __git_complete_remote_or_refspec
690d8824
JH
1117}
1118
f53352fb
SP
1119_git_format_patch ()
1120{
f53352fb 1121 case "$cur" in
e1d37937
SB
1122 --thread=*)
1123 __gitcomp "
1124 deep shallow
1125 " "" "${cur##--thread=}"
1126 return
1127 ;;
f53352fb 1128 --*)
b3391775 1129 __gitcomp "
e1d37937 1130 --stdout --attach --no-attach --thread --thread=
f53352fb
SP
1131 --output-directory
1132 --numbered --start-number
47e98eec 1133 --numbered-files
f53352fb 1134 --keep-subject
d8e1e5df 1135 --signoff --signature --no-signature
3f7df3a7 1136 --in-reply-to= --cc=
f53352fb 1137 --full-index --binary
ec804891 1138 --not --all
be5f5bf0 1139 --cover-letter
aba201c6 1140 --no-prefix --src-prefix= --dst-prefix=
81085134
SG
1141 --inline --suffix= --ignore-if-in-upstream
1142 --subject-prefix=
b3391775 1143 "
f53352fb
SP
1144 return
1145 ;;
1146 esac
1147 __git_complete_revlist
1148}
1149
4bca8636
AJ
1150_git_fsck ()
1151{
4bca8636
AJ
1152 case "$cur" in
1153 --*)
1154 __gitcomp "
1155 --tags --root --unreachable --cache --no-reflogs --full
1156 --strict --verbose --lost-found
1157 "
1158 return
1159 ;;
1160 esac
1161 COMPREPLY=()
1162}
1163
b26c8748
SP
1164_git_gc ()
1165{
b26c8748
SP
1166 case "$cur" in
1167 --*)
47e98eec 1168 __gitcomp "--prune --aggressive"
b26c8748
SP
1169 return
1170 ;;
1171 esac
1172 COMPREPLY=()
1173}
1174
66729509
SG
1175_git_gitk ()
1176{
1177 _gitk
1178}
1179
29eec71f
JK
1180__git_match_ctag() {
1181 awk "/^${1////\\/}/ { print \$1 }" "$2"
1182}
1183
c72e0db1
LM
1184_git_grep ()
1185{
1186 __git_has_doubledash && return
1187
c72e0db1
LM
1188 case "$cur" in
1189 --*)
1190 __gitcomp "
1191 --cached
1192 --text --ignore-case --word-regexp --invert-match
5a69eaf5 1193 --full-name --line-number
c72e0db1 1194 --extended-regexp --basic-regexp --fixed-strings
63e7e9d8 1195 --perl-regexp
c72e0db1
LM
1196 --files-with-matches --name-only
1197 --files-without-match
a91f453f 1198 --max-depth
c72e0db1
LM
1199 --count
1200 --and --or --not --all-match
1201 "
1202 return
1203 ;;
1204 esac
17225c49 1205
29eec71f
JK
1206 case "$cword,$prev" in
1207 2,*|*,-*)
1208 if test -r tags; then
d2c78075 1209 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
29eec71f
JK
1210 return
1211 fi
1212 ;;
1213 esac
1214
a31e6262 1215 __gitcomp_nl "$(__git_refs)"
c72e0db1
LM
1216}
1217
1eb7e2f8
LM
1218_git_help ()
1219{
1eb7e2f8
LM
1220 case "$cur" in
1221 --*)
1222 __gitcomp "--all --info --man --web"
1223 return
1224 ;;
1225 esac
eaa4e6ee 1226 __git_compute_all_commands
f85a6f0b 1227 __gitcomp "$__git_all_commands $(__git_aliases)
2946cccf
MG
1228 attributes cli core-tutorial cvs-migration
1229 diffcore gitk glossary hooks ignore modules
d49483f0 1230 namespaces repository-layout tutorial tutorial-2
99f0b599 1231 workflows
2946cccf 1232 "
1eb7e2f8
LM
1233}
1234
5dad868b
LM
1235_git_init ()
1236{
5dad868b
LM
1237 case "$cur" in
1238 --shared=*)
1239 __gitcomp "
1240 false true umask group all world everybody
1241 " "" "${cur##--shared=}"
1242 return
1243 ;;
1244 --*)
1245 __gitcomp "--quiet --bare --template= --shared --shared="
1246 return
1247 ;;
1248 esac
1249 COMPREPLY=()
1250}
1251
b1bc1494
LM
1252_git_ls_files ()
1253{
1254 __git_has_doubledash && return
1255
b1bc1494
LM
1256 case "$cur" in
1257 --*)
1258 __gitcomp "--cached --deleted --modified --others --ignored
1259 --stage --directory --no-empty-directory --unmerged
1260 --killed --exclude= --exclude-from=
1261 --exclude-per-directory= --exclude-standard
1262 --error-unmatch --with-tree= --full-name
1263 --abbrev --ignored --exclude-per-directory
1264 "
1265 return
1266 ;;
1267 esac
1268 COMPREPLY=()
1269}
1270
690d8824
JH
1271_git_ls_remote ()
1272{
a31e6262 1273 __gitcomp_nl "$(__git_remotes)"
690d8824
JH
1274}
1275
1276_git_ls_tree ()
1277{
1278 __git_complete_file
1279}
1280
a393777e
TR
1281# Options that go well for log, shortlog and gitk
1282__git_log_common_options="
1283 --not --all
1284 --branches --tags --remotes
4fe1a619 1285 --first-parent --merges --no-merges
a393777e
TR
1286 --max-count=
1287 --max-age= --since= --after=
1288 --min-age= --until= --before=
6a6ebded
MG
1289 --min-parents= --max-parents=
1290 --no-min-parents --no-max-parents
a393777e
TR
1291"
1292# Options that go well for log and gitk (not shortlog)
1293__git_log_gitk_options="
1294 --dense --sparse --full-history
1295 --simplify-merges --simplify-by-decoration
3925b575 1296 --left-right --notes --no-notes
a393777e
TR
1297"
1298# Options that go well for log and shortlog (not gitk)
1299__git_log_shortlog_options="
1300 --author= --committer= --grep=
1301 --all-match
1302"
1303
3d279863 1304__git_log_pretty_formats="oneline short medium full fuller email raw format:"
672c68cb 1305__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
3d279863 1306
690d8824
JH
1307_git_log ()
1308{
d773c631
SG
1309 __git_has_doubledash && return
1310
bf3c20f6
TR
1311 local g="$(git rev-parse --git-dir 2>/dev/null)"
1312 local merge=""
ba7906f2 1313 if [ -f "$g/MERGE_HEAD" ]; then
bf3c20f6
TR
1314 merge="--merge"
1315 fi
6e31b866 1316 case "$cur" in
e67d71e5 1317 --pretty=*|--format=*)
c3898111 1318 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
e67d71e5 1319 " "" "${cur#*=}"
72de29c2
TL
1320 return
1321 ;;
47e98eec 1322 --date=*)
672c68cb 1323 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
47e98eec
SP
1324 return
1325 ;;
af4e9e8c
SB
1326 --decorate=*)
1327 __gitcomp "long short" "" "${cur##--decorate=}"
1328 return
1329 ;;
6e31b866 1330 --*)
b3391775 1331 __gitcomp "
a393777e
TR
1332 $__git_log_common_options
1333 $__git_log_shortlog_options
1334 $__git_log_gitk_options
8f87fae6 1335 --root --topo-order --date-order --reverse
5d0e6343 1336 --follow --full-diff
6e31b866 1337 --abbrev-commit --abbrev=
47e98eec 1338 --relative-date --date=
72de29c2 1339 --pretty= --format= --oneline
a393777e 1340 --cherry-pick
20827d99 1341 --graph
af4e9e8c 1342 --decorate --decorate=
20bf7292 1343 --walk-reflogs
a393777e 1344 --parents --children
bf3c20f6 1345 $merge
20bf7292 1346 $__git_diff_common_options
47d5a8fa 1347 --pickaxe-all --pickaxe-regex
b3391775 1348 "
6e31b866
SP
1349 return
1350 ;;
1351 esac
f53352fb 1352 __git_complete_revlist
690d8824
JH
1353}
1354
0a4e1472
JS
1355__git_merge_options="
1356 --no-commit --no-stat --log --no-log --squash --strategy
2ff14e31 1357 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
0a4e1472
JS
1358"
1359
4ad91321
SP
1360_git_merge ()
1361{
3c7b480a
JS
1362 __git_complete_strategy && return
1363
4ad91321
SP
1364 case "$cur" in
1365 --*)
0a4e1472 1366 __gitcomp "$__git_merge_options"
4ad91321
SP
1367 return
1368 esac
a31e6262 1369 __gitcomp_nl "$(__git_refs)"
4ad91321
SP
1370}
1371
b4c72162
LM
1372_git_mergetool ()
1373{
b4c72162
LM
1374 case "$cur" in
1375 --tool=*)
e2dc2de9 1376 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
b4c72162
LM
1377 return
1378 ;;
1379 --*)
1380 __gitcomp "--tool="
1381 return
1382 ;;
1383 esac
1384 COMPREPLY=()
1385}
1386
690d8824
JH
1387_git_merge_base ()
1388{
a31e6262 1389 __gitcomp_nl "$(__git_refs)"
690d8824
JH
1390}
1391
1127c51c
LM
1392_git_mv ()
1393{
1127c51c
LM
1394 case "$cur" in
1395 --*)
1396 __gitcomp "--dry-run"
1397 return
1398 ;;
1399 esac
1400 COMPREPLY=()
1401}
1402
d33909bf
SP
1403_git_name_rev ()
1404{
b3391775 1405 __gitcomp "--tags --all --stdin"
d33909bf
SP
1406}
1407
00f09d0e
SG
1408_git_notes ()
1409{
2a5da755
SG
1410 local subcommands='add append copy edit list prune remove show'
1411 local subcommand="$(__git_find_on_cmdline "$subcommands")"
00f09d0e 1412
2a5da755
SG
1413 case "$subcommand,$cur" in
1414 ,--*)
1415 __gitcomp '--ref'
1416 ;;
1417 ,*)
39540681 1418 case "$prev" in
2a5da755 1419 --ref)
a31e6262 1420 __gitcomp_nl "$(__git_refs)"
2a5da755
SG
1421 ;;
1422 *)
1423 __gitcomp "$subcommands --ref"
1424 ;;
1425 esac
1426 ;;
a8f89bfa 1427 add,--reuse-message=*|append,--reuse-message=*|\
2a5da755 1428 add,--reedit-message=*|append,--reedit-message=*)
a31e6262 1429 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
2a5da755
SG
1430 ;;
1431 add,--*|append,--*)
1432 __gitcomp '--file= --message= --reedit-message=
1433 --reuse-message='
1434 ;;
1435 copy,--*)
1436 __gitcomp '--stdin'
1437 ;;
1438 prune,--*)
1439 __gitcomp '--dry-run --verbose'
1440 ;;
1441 prune,*)
00f09d0e
SG
1442 ;;
1443 *)
39540681 1444 case "$prev" in
2a5da755
SG
1445 -m|-F)
1446 ;;
1447 *)
a31e6262 1448 __gitcomp_nl "$(__git_refs)"
2a5da755
SG
1449 ;;
1450 esac
00f09d0e
SG
1451 ;;
1452 esac
1453}
1454
690d8824
JH
1455_git_pull ()
1456{
0a4e1472
JS
1457 __git_complete_strategy && return
1458
0a4e1472
JS
1459 case "$cur" in
1460 --*)
1461 __gitcomp "
1462 --rebase --no-rebase
1463 $__git_merge_options
1464 $__git_fetch_options
1465 "
1466 return
1467 ;;
1468 esac
52d5c3b5 1469 __git_complete_remote_or_refspec
690d8824
JH
1470}
1471
1472_git_push ()
1473{
da48616f 1474 case "$prev" in
0a4e1472 1475 --repo)
a31e6262 1476 __gitcomp_nl "$(__git_remotes)"
0a4e1472
JS
1477 return
1478 esac
1479 case "$cur" in
1480 --repo=*)
a31e6262 1481 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
0a4e1472
JS
1482 return
1483 ;;
1484 --*)
1485 __gitcomp "
1486 --all --mirror --tags --dry-run --force --verbose
3623dc03 1487 --receive-pack= --repo= --set-upstream
0a4e1472
JS
1488 "
1489 return
1490 ;;
1491 esac
52d5c3b5 1492 __git_complete_remote_or_refspec
690d8824
JH
1493}
1494
61d926a3
SP
1495_git_rebase ()
1496{
da48616f 1497 local dir="$(__gitdir)"
51ef1daa 1498 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
b3391775 1499 __gitcomp "--continue --skip --abort"
61d926a3
SP
1500 return
1501 fi
3c7b480a 1502 __git_complete_strategy && return
61d926a3 1503 case "$cur" in
93cf50a4
BG
1504 --whitespace=*)
1505 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1506 return
1507 ;;
61d926a3 1508 --*)
93cf50a4
BG
1509 __gitcomp "
1510 --onto --merge --strategy --interactive
1511 --preserve-merges --stat --no-stat
1512 --committer-date-is-author-date --ignore-date
1513 --ignore-whitespace --whitespace=
6d0d465e 1514 --autosquash
93cf50a4
BG
1515 "
1516
61d926a3
SP
1517 return
1518 esac
a31e6262 1519 __gitcomp_nl "$(__git_refs)"
61d926a3
SP
1520}
1521
057f3279
TRC
1522_git_reflog ()
1523{
1524 local subcommands="show delete expire"
1525 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1526
1527 if [ -z "$subcommand" ]; then
1528 __gitcomp "$subcommands"
1529 else
a31e6262 1530 __gitcomp_nl "$(__git_refs)"
057f3279
TRC
1531 fi
1532}
1533
ae616de6 1534__git_send_email_confirm_options="always never auto cc compose"
cb8a9bd5 1535__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
ae616de6 1536
25a1f374
TL
1537_git_send_email ()
1538{
25a1f374 1539 case "$cur" in
ae616de6
SB
1540 --confirm=*)
1541 __gitcomp "
1542 $__git_send_email_confirm_options
1543 " "" "${cur##--confirm=}"
1544 return
1545 ;;
1546 --suppress-cc=*)
1547 __gitcomp "
1548 $__git_send_email_suppresscc_options
1549 " "" "${cur##--suppress-cc=}"
1550
1551 return
1552 ;;
1553 --smtp-encryption=*)
1554 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1555 return
1556 ;;
25a1f374 1557 --*)
77813151 1558 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
ae616de6
SB
1559 --compose --confirm= --dry-run --envelope-sender
1560 --from --identity
25a1f374
TL
1561 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1562 --no-suppress-from --no-thread --quiet
1563 --signed-off-by-cc --smtp-pass --smtp-server
ae616de6
SB
1564 --smtp-server-port --smtp-encryption= --smtp-user
1565 --subject --suppress-cc= --suppress-from --thread --to
fd3a8dcb 1566 --validate --no-validate"
25a1f374
TL
1567 return
1568 ;;
1569 esac
1570 COMPREPLY=()
1571}
1572
424cce83
SG
1573_git_stage ()
1574{
1575 _git_add
1576}
1577
00652369
SB
1578__git_config_get_set_variables ()
1579{
da48616f 1580 local prevword word config_file= c=$cword
00652369 1581 while [ $c -gt 1 ]; do
da48616f 1582 word="${words[c]}"
00652369
SB
1583 case "$word" in
1584 --global|--system|--file=*)
1585 config_file="$word"
1586 break
1587 ;;
1588 -f|--file)
1589 config_file="$word $prevword"
1590 break
1591 ;;
1592 esac
1593 prevword=$word
1594 c=$((--c))
1595 done
1596
f581de1b 1597 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
6f2dd720 1598 while read -r line
f581de1b
SB
1599 do
1600 case "$line" in
1601 *.*=*)
1602 echo "${line/=*/}"
00652369
SB
1603 ;;
1604 esac
1605 done
1606}
1607
e0d10e1c 1608_git_config ()
5de40f59 1609{
da48616f 1610 case "$prev" in
5de40f59 1611 branch.*.remote)
a31e6262 1612 __gitcomp_nl "$(__git_remotes)"
5de40f59
SP
1613 return
1614 ;;
1615 branch.*.merge)
a31e6262 1616 __gitcomp_nl "$(__git_refs)"
5de40f59
SP
1617 return
1618 ;;
1619 remote.*.fetch)
da48616f 1620 local remote="${prev#remote.}"
5de40f59 1621 remote="${remote%.fetch}"
d51a8ecd
SG
1622 if [ -z "$cur" ]; then
1623 COMPREPLY=("refs/heads/")
1624 return
1625 fi
a31e6262 1626 __gitcomp_nl "$(__git_refs_remotes "$remote")"
5de40f59
SP
1627 return
1628 ;;
1629 remote.*.push)
da48616f 1630 local remote="${prev#remote.}"
5de40f59 1631 remote="${remote%.push}"
a31e6262 1632 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
5de40f59 1633 for-each-ref --format='%(refname):%(refname)' \
78d4d6a2
SP
1634 refs/heads)"
1635 return
1636 ;;
1637 pull.twohead|pull.octopus)
eaa4e6ee
JN
1638 __git_compute_merge_strategies
1639 __gitcomp "$__git_merge_strategies"
78d4d6a2
SP
1640 return
1641 ;;
6123d719
MH
1642 color.branch|color.diff|color.interactive|\
1643 color.showbranch|color.status|color.ui)
78d4d6a2
SP
1644 __gitcomp "always never auto"
1645 return
1646 ;;
901d615c
MK
1647 color.pager)
1648 __gitcomp "false true"
1649 return
1650 ;;
78d4d6a2
SP
1651 color.*.*)
1652 __gitcomp "
98171a07 1653 normal black red green yellow blue magenta cyan white
78d4d6a2
SP
1654 bold dim ul blink reverse
1655 "
5de40f59
SP
1656 return
1657 ;;
9b82d63b
SB
1658 help.format)
1659 __gitcomp "man info web html"
1660 return
1661 ;;
672c68cb
SB
1662 log.date)
1663 __gitcomp "$__git_log_date_formats"
1664 return
1665 ;;
ae616de6
SB
1666 sendemail.aliasesfiletype)
1667 __gitcomp "mutt mailrc pine elm gnus"
1668 return
1669 ;;
1670 sendemail.confirm)
1671 __gitcomp "$__git_send_email_confirm_options"
1672 return
1673 ;;
1674 sendemail.suppresscc)
1675 __gitcomp "$__git_send_email_suppresscc_options"
1676 return
1677 ;;
00652369 1678 --get|--get-all|--unset|--unset-all)
a31e6262 1679 __gitcomp_nl "$(__git_config_get_set_variables)"
00652369
SB
1680 return
1681 ;;
5de40f59
SP
1682 *.*)
1683 COMPREPLY=()
1684 return
1685 ;;
1686 esac
1687 case "$cur" in
1688 --*)
78d4d6a2 1689 __gitcomp "
47e98eec 1690 --global --system --file=
12977705 1691 --list --replace-all
5de40f59 1692 --get --get-all --get-regexp
1b71eb35 1693 --add --unset --unset-all
12977705 1694 --remove-section --rename-section
78d4d6a2 1695 "
5de40f59
SP
1696 return
1697 ;;
1698 branch.*.*)
9244d69b
SG
1699 local pfx="${cur%.*}." cur_="${cur##*.}"
1700 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
5de40f59
SP
1701 return
1702 ;;
1703 branch.*)
9244d69b 1704 local pfx="${cur%.*}." cur_="${cur#*.}"
a31e6262 1705 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
5de40f59
SP
1706 return
1707 ;;
0aa62fd0 1708 guitool.*.*)
9244d69b 1709 local pfx="${cur%.*}." cur_="${cur##*.}"
0aa62fd0
SB
1710 __gitcomp "
1711 argprompt cmd confirm needsfile noconsole norescan
1712 prompt revprompt revunmerged title
9244d69b 1713 " "$pfx" "$cur_"
0aa62fd0
SB
1714 return
1715 ;;
1716 difftool.*.*)
9244d69b
SG
1717 local pfx="${cur%.*}." cur_="${cur##*.}"
1718 __gitcomp "cmd path" "$pfx" "$cur_"
0aa62fd0
SB
1719 return
1720 ;;
1721 man.*.*)
9244d69b
SG
1722 local pfx="${cur%.*}." cur_="${cur##*.}"
1723 __gitcomp "cmd path" "$pfx" "$cur_"
0aa62fd0
SB
1724 return
1725 ;;
1726 mergetool.*.*)
9244d69b
SG
1727 local pfx="${cur%.*}." cur_="${cur##*.}"
1728 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
0aa62fd0
SB
1729 return
1730 ;;
1731 pager.*)
9244d69b 1732 local pfx="${cur%.*}." cur_="${cur#*.}"
eaa4e6ee 1733 __git_compute_all_commands
a31e6262 1734 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
0aa62fd0
SB
1735 return
1736 ;;
5de40f59 1737 remote.*.*)
9244d69b 1738 local pfx="${cur%.*}." cur_="${cur##*.}"
12977705 1739 __gitcomp "
98171a07 1740 url proxy fetch push mirror skipDefaultUpdate
6fac1b83 1741 receivepack uploadpack tagopt pushurl
9244d69b 1742 " "$pfx" "$cur_"
5de40f59
SP
1743 return
1744 ;;
1745 remote.*)
9244d69b 1746 local pfx="${cur%.*}." cur_="${cur#*.}"
a31e6262 1747 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
5de40f59
SP
1748 return
1749 ;;
0aa62fd0 1750 url.*.*)
9244d69b
SG
1751 local pfx="${cur%.*}." cur_="${cur##*.}"
1752 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
0aa62fd0
SB
1753 return
1754 ;;
5de40f59 1755 esac
78d4d6a2 1756 __gitcomp "
6068ac88
MZ
1757 add.ignoreErrors
1758 advice.commitBeforeMerge
1759 advice.detachedHead
1760 advice.implicitIdentity
1761 advice.pushNonFastForward
1762 advice.resolveConflict
1763 advice.statusHints
226b343c 1764 alias.
6068ac88 1765 am.keepcr
86c91f91 1766 apply.ignorewhitespace
5de40f59 1767 apply.whitespace
98171a07
LM
1768 branch.autosetupmerge
1769 branch.autosetuprebase
6068ac88 1770 browser.
2122591b 1771 clean.requireForce
78d4d6a2
SP
1772 color.branch
1773 color.branch.current
1774 color.branch.local
78d4d6a2 1775 color.branch.plain
025a1929 1776 color.branch.remote
6068ac88
MZ
1777 color.decorate.HEAD
1778 color.decorate.branch
1779 color.decorate.remoteBranch
1780 color.decorate.stash
1781 color.decorate.tag
a159ca0c 1782 color.diff
025a1929 1783 color.diff.commit
78d4d6a2 1784 color.diff.frag
6068ac88 1785 color.diff.func
025a1929 1786 color.diff.meta
78d4d6a2 1787 color.diff.new
025a1929
LM
1788 color.diff.old
1789 color.diff.plain
78d4d6a2 1790 color.diff.whitespace
226b343c 1791 color.grep
6068ac88
MZ
1792 color.grep.context
1793 color.grep.filename
1794 color.grep.function
1795 color.grep.linenumber
226b343c 1796 color.grep.match
6068ac88
MZ
1797 color.grep.selected
1798 color.grep.separator
98171a07 1799 color.interactive
6068ac88 1800 color.interactive.error
98171a07
LM
1801 color.interactive.header
1802 color.interactive.help
1803 color.interactive.prompt
a159ca0c 1804 color.pager
6123d719 1805 color.showbranch
a159ca0c 1806 color.status
78d4d6a2
SP
1807 color.status.added
1808 color.status.changed
025a1929 1809 color.status.header
98171a07 1810 color.status.nobranch
78d4d6a2 1811 color.status.untracked
98171a07
LM
1812 color.status.updated
1813 color.ui
6068ac88 1814 commit.status
98171a07 1815 commit.template
cdb791f6 1816 core.abbrev
6068ac88
MZ
1817 core.askpass
1818 core.attributesfile
98171a07
LM
1819 core.autocrlf
1820 core.bare
6068ac88 1821 core.bigFileThreshold
025a1929 1822 core.compression
226b343c 1823 core.createObject
98171a07
LM
1824 core.deltaBaseCacheLimit
1825 core.editor
6068ac88 1826 core.eol
98171a07 1827 core.excludesfile
025a1929 1828 core.fileMode
98171a07 1829 core.fsyncobjectfiles
025a1929 1830 core.gitProxy
98171a07 1831 core.ignoreCygwinFSTricks
025a1929 1832 core.ignoreStat
6068ac88 1833 core.ignorecase
025a1929
LM
1834 core.logAllRefUpdates
1835 core.loosecompression
6068ac88 1836 core.notesRef
025a1929
LM
1837 core.packedGitLimit
1838 core.packedGitWindowSize
98171a07 1839 core.pager
025a1929 1840 core.preferSymlinkRefs
98171a07
LM
1841 core.preloadindex
1842 core.quotepath
025a1929 1843 core.repositoryFormatVersion
98171a07 1844 core.safecrlf
025a1929 1845 core.sharedRepository
6068ac88 1846 core.sparseCheckout
98171a07
LM
1847 core.symlinks
1848 core.trustctime
025a1929 1849 core.warnAmbiguousRefs
98171a07
LM
1850 core.whitespace
1851 core.worktree
1852 diff.autorefreshindex
df44483a 1853 diff.statGraphWidth
98171a07 1854 diff.external
6068ac88 1855 diff.ignoreSubmodules
98171a07 1856 diff.mnemonicprefix
6068ac88 1857 diff.noprefix
78d4d6a2
SP
1858 diff.renameLimit
1859 diff.renames
226b343c
SB
1860 diff.suppressBlankEmpty
1861 diff.tool
1862 diff.wordRegex
0aa62fd0 1863 difftool.
226b343c 1864 difftool.prompt
6068ac88 1865 fetch.recurseSubmodules
78d4d6a2 1866 fetch.unpackLimit
226b343c
SB
1867 format.attach
1868 format.cc
78d4d6a2 1869 format.headers
98171a07
LM
1870 format.numbered
1871 format.pretty
d8e1e5df 1872 format.signature
226b343c
SB
1873 format.signoff
1874 format.subjectprefix
98171a07 1875 format.suffix
226b343c 1876 format.thread
6068ac88
MZ
1877 format.to
1878 gc.
98171a07
LM
1879 gc.aggressiveWindow
1880 gc.auto
1881 gc.autopacklimit
12977705 1882 gc.packrefs
98171a07 1883 gc.pruneexpire
78d4d6a2
SP
1884 gc.reflogexpire
1885 gc.reflogexpireunreachable
1886 gc.rerereresolved
1887 gc.rerereunresolved
025a1929 1888 gitcvs.allbinary
226b343c 1889 gitcvs.commitmsgannotation
98171a07 1890 gitcvs.dbTableNamePrefix
025a1929
LM
1891 gitcvs.dbdriver
1892 gitcvs.dbname
1893 gitcvs.dbpass
025a1929
LM
1894 gitcvs.dbuser
1895 gitcvs.enabled
1896 gitcvs.logfile
98171a07 1897 gitcvs.usecrlfattr
0aa62fd0 1898 guitool.
98171a07
LM
1899 gui.blamehistoryctx
1900 gui.commitmsgwidth
1901 gui.copyblamethreshold
1902 gui.diffcontext
1903 gui.encoding
1904 gui.fastcopyblame
1905 gui.matchtrackingbranch
1906 gui.newbranchtemplate
1907 gui.pruneduringfetch
1908 gui.spellingdictionary
1909 gui.trustmtime
1910 help.autocorrect
1911 help.browser
1912 help.format
78d4d6a2
SP
1913 http.lowSpeedLimit
1914 http.lowSpeedTime
025a1929 1915 http.maxRequests
6068ac88 1916 http.minSessions
5de40f59 1917 http.noEPSV
6068ac88 1918 http.postBuffer
98171a07 1919 http.proxy
025a1929
LM
1920 http.sslCAInfo
1921 http.sslCAPath
1922 http.sslCert
6068ac88 1923 http.sslCertPasswordProtected
025a1929
LM
1924 http.sslKey
1925 http.sslVerify
6068ac88 1926 http.useragent
78d4d6a2
SP
1927 i18n.commitEncoding
1928 i18n.logOutputEncoding
6068ac88 1929 imap.authMethod
226b343c
SB
1930 imap.folder
1931 imap.host
1932 imap.pass
1933 imap.port
1934 imap.preformattedHTML
1935 imap.sslverify
1936 imap.tunnel
1937 imap.user
6068ac88 1938 init.templatedir
98171a07
LM
1939 instaweb.browser
1940 instaweb.httpd
1941 instaweb.local
1942 instaweb.modulepath
1943 instaweb.port
226b343c 1944 interactive.singlekey
98171a07 1945 log.date
6068ac88 1946 log.decorate
78d4d6a2 1947 log.showroot
226b343c 1948 mailmap.file
0aa62fd0 1949 man.
98171a07 1950 man.viewer
6068ac88 1951 merge.
98171a07
LM
1952 merge.conflictstyle
1953 merge.log
1954 merge.renameLimit
6068ac88 1955 merge.renormalize
98171a07 1956 merge.stat
025a1929 1957 merge.tool
78d4d6a2 1958 merge.verbosity
0aa62fd0 1959 mergetool.
98171a07 1960 mergetool.keepBackup
6068ac88 1961 mergetool.keepTemporaries
226b343c 1962 mergetool.prompt
6068ac88
MZ
1963 notes.displayRef
1964 notes.rewrite.
1965 notes.rewrite.amend
1966 notes.rewrite.rebase
1967 notes.rewriteMode
1968 notes.rewriteRef
47e98eec 1969 pack.compression
47e98eec 1970 pack.deltaCacheLimit
025a1929
LM
1971 pack.deltaCacheSize
1972 pack.depth
98171a07
LM
1973 pack.indexVersion
1974 pack.packSizeLimit
1975 pack.threads
025a1929
LM
1976 pack.window
1977 pack.windowMemory
0aa62fd0 1978 pager.
6068ac88 1979 pretty.
78d4d6a2
SP
1980 pull.octopus
1981 pull.twohead
226b343c 1982 push.default
6068ac88 1983 rebase.autosquash
226b343c 1984 rebase.stat
6068ac88 1985 receive.autogc
98171a07 1986 receive.denyCurrentBranch
6068ac88 1987 receive.denyDeleteCurrent
98171a07 1988 receive.denyDeletes
025a1929 1989 receive.denyNonFastForwards
98171a07 1990 receive.fsckObjects
025a1929 1991 receive.unpackLimit
6068ac88
MZ
1992 receive.updateserverinfo
1993 remotes.
98171a07
LM
1994 repack.usedeltabaseoffset
1995 rerere.autoupdate
1996 rerere.enabled
6068ac88 1997 sendemail.
226b343c 1998 sendemail.aliasesfile
6068ac88 1999 sendemail.aliasfiletype
226b343c
SB
2000 sendemail.bcc
2001 sendemail.cc
2002 sendemail.cccmd
2003 sendemail.chainreplyto
2004 sendemail.confirm
2005 sendemail.envelopesender
6068ac88
MZ
2006 sendemail.from
2007 sendemail.identity
226b343c
SB
2008 sendemail.multiedit
2009 sendemail.signedoffbycc
6068ac88 2010 sendemail.smtpdomain
226b343c
SB
2011 sendemail.smtpencryption
2012 sendemail.smtppass
2013 sendemail.smtpserver
6068ac88 2014 sendemail.smtpserveroption
226b343c
SB
2015 sendemail.smtpserverport
2016 sendemail.smtpuser
2017 sendemail.suppresscc
2018 sendemail.suppressfrom
2019 sendemail.thread
2020 sendemail.to
2021 sendemail.validate
78d4d6a2 2022 showbranch.default
98171a07
LM
2023 status.relativePaths
2024 status.showUntrackedFiles
6068ac88
MZ
2025 status.submodulesummary
2026 submodule.
78d4d6a2
SP
2027 tar.umask
2028 transfer.unpackLimit
0aa62fd0 2029 url.
78d4d6a2 2030 user.email
025a1929 2031 user.name
78d4d6a2 2032 user.signingkey
98171a07 2033 web.browser
5de40f59 2034 branch. remote.
78d4d6a2 2035 "
5de40f59
SP
2036}
2037
88293c67
SP
2038_git_remote ()
2039{
e17dba8f 2040 local subcommands="add rename remove set-head set-branches set-url show prune update"
918c03c2 2041 local subcommand="$(__git_find_on_cmdline "$subcommands")"
3ff1320d 2042 if [ -z "$subcommand" ]; then
3903c618 2043 __gitcomp "$subcommands"
88293c67
SP
2044 return
2045 fi
2046
3ff1320d 2047 case "$subcommand" in
e17dba8f 2048 rename|remove|set-url|show|prune)
a31e6262 2049 __gitcomp_nl "$(__git_remotes)"
88293c67 2050 ;;
f1c6ffe6
PJ
2051 set-head|set-branches)
2052 __git_complete_remote_or_refspec
2053 ;;
fb72759b
SP
2054 update)
2055 local i c='' IFS=$'\n'
518ef8f0
TZ
2056 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2057 i="${i#remotes.}"
2058 c="$c ${i/ */}"
fb72759b
SP
2059 done
2060 __gitcomp "$c"
2061 ;;
88293c67
SP
2062 *)
2063 COMPREPLY=()
2064 ;;
2065 esac
2066}
2067
e1c1a067
BG
2068_git_replace ()
2069{
a31e6262 2070 __gitcomp_nl "$(__git_refs)"
e1c1a067
BG
2071}
2072
67e78c3b
SP
2073_git_reset ()
2074{
d773c631
SG
2075 __git_has_doubledash && return
2076
b3391775
SP
2077 case "$cur" in
2078 --*)
9f040e95 2079 __gitcomp "--merge --mixed --hard --soft --patch"
b3391775
SP
2080 return
2081 ;;
2082 esac
a31e6262 2083 __gitcomp_nl "$(__git_refs)"
67e78c3b
SP
2084}
2085
a6c2be24
LM
2086_git_revert ()
2087{
a6c2be24
LM
2088 case "$cur" in
2089 --*)
2090 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2091 return
2092 ;;
2093 esac
a31e6262 2094 __gitcomp_nl "$(__git_refs)"
a6c2be24
LM
2095}
2096
08c701d4
LM
2097_git_rm ()
2098{
2099 __git_has_doubledash && return
2100
08c701d4
LM
2101 case "$cur" in
2102 --*)
2103 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2104 return
2105 ;;
2106 esac
2107 COMPREPLY=()
2108}
2109
1fd6bec9
SP
2110_git_shortlog ()
2111{
d773c631
SG
2112 __git_has_doubledash && return
2113
1fd6bec9
SP
2114 case "$cur" in
2115 --*)
2116 __gitcomp "
a393777e
TR
2117 $__git_log_common_options
2118 $__git_log_shortlog_options
1fd6bec9
SP
2119 --numbered --summary
2120 "
2121 return
2122 ;;
2123 esac
2124 __git_complete_revlist
2125}
2126
90131924
SP
2127_git_show ()
2128{
41d8cf7d
MH
2129 __git_has_doubledash && return
2130
90131924 2131 case "$cur" in
e67d71e5 2132 --pretty=*|--format=*)
c3898111 2133 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
e67d71e5 2134 " "" "${cur#*=}"
72de29c2
TL
2135 return
2136 ;;
90131924 2137 --*)
076c3237 2138 __gitcomp "--pretty= --format= --abbrev-commit --oneline
20bf7292
TR
2139 $__git_diff_common_options
2140 "
90131924
SP
2141 return
2142 ;;
2143 esac
2144 __git_complete_file
2145}
2146
2ca880fe
TR
2147_git_show_branch ()
2148{
2ca880fe
TR
2149 case "$cur" in
2150 --*)
2151 __gitcomp "
2152 --all --remotes --topo-order --current --more=
2153 --list --independent --merge-base --no-name
6123d719 2154 --color --no-color
076c3237 2155 --sha1-name --sparse --topics --reflog
2ca880fe
TR
2156 "
2157 return
2158 ;;
2159 esac
2160 __git_complete_revlist
2161}
2162
7fd53fce
JH
2163_git_stash ()
2164{
59d5eeee 2165 local save_opts='--keep-index --no-keep-index --quiet --patch'
95d43780 2166 local subcommands='save list show apply clear drop pop create branch'
918c03c2 2167 local subcommand="$(__git_find_on_cmdline "$subcommands")"
7bedebca 2168 if [ -z "$subcommand" ]; then
59d5eeee
SG
2169 case "$cur" in
2170 --*)
2171 __gitcomp "$save_opts"
2172 ;;
2173 *)
2174 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2175 __gitcomp "$subcommands"
2176 else
2177 COMPREPLY=()
2178 fi
2179 ;;
2180 esac
7bedebca 2181 else
7bedebca
SG
2182 case "$subcommand,$cur" in
2183 save,--*)
59d5eeee 2184 __gitcomp "$save_opts"
7bedebca 2185 ;;
8513c54b 2186 apply,--*|pop,--*)
59d5eeee 2187 __gitcomp "--index --quiet"
95d43780 2188 ;;
8513c54b 2189 show,--*|drop,--*|branch,--*)
95d43780
LM
2190 COMPREPLY=()
2191 ;;
2192 show,*|apply,*|drop,*|pop,*|branch,*)
a31e6262 2193 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
95d43780
LM
2194 | sed -n -e 's/:.*//p')"
2195 ;;
7bedebca
SG
2196 *)
2197 COMPREPLY=()
2198 ;;
2199 esac
3ff1320d 2200 fi
7fd53fce
JH
2201}
2202
be86f7a0
SP
2203_git_submodule ()
2204{
d773c631
SG
2205 __git_has_doubledash && return
2206
1b0f7978 2207 local subcommands="add status init update summary foreach sync"
918c03c2 2208 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
be86f7a0
SP
2209 case "$cur" in
2210 --*)
2211 __gitcomp "--quiet --cached"
2212 ;;
2213 *)
3ff1320d 2214 __gitcomp "$subcommands"
be86f7a0
SP
2215 ;;
2216 esac
2217 return
2218 fi
2219}
2220
47f6ee28
SG
2221_git_svn ()
2222{
2223 local subcommands="
2224 init fetch clone rebase dcommit log find-rev
2225 set-tree commit-diff info create-ignore propget
4a5856cb 2226 proplist show-ignore show-externals branch tag blame
c18d5d82 2227 migrate mkdirs reset gc
47f6ee28 2228 "
918c03c2 2229 local subcommand="$(__git_find_on_cmdline "$subcommands")"
47f6ee28
SG
2230 if [ -z "$subcommand" ]; then
2231 __gitcomp "$subcommands"
2232 else
2233 local remote_opts="--username= --config-dir= --no-auth-cache"
2234 local fc_opts="
2235 --follow-parent --authors-file= --repack=
2236 --no-metadata --use-svm-props --use-svnsync-props
2237 --log-window-size= --no-checkout --quiet
4a5856cb
SG
2238 --repack-flags --use-log-author --localtime
2239 --ignore-paths= $remote_opts
47f6ee28
SG
2240 "
2241 local init_opts="
2242 --template= --shared= --trunk= --tags=
2243 --branches= --stdlayout --minimize-url
2244 --no-metadata --use-svm-props --use-svnsync-props
4a5856cb
SG
2245 --rewrite-root= --prefix= --use-log-author
2246 --add-author-from $remote_opts
47f6ee28
SG
2247 "
2248 local cmt_opts="
2249 --edit --rmdir --find-copies-harder --copy-similarity=
2250 "
2251
47f6ee28
SG
2252 case "$subcommand,$cur" in
2253 fetch,--*)
2254 __gitcomp "--revision= --fetch-all $fc_opts"
2255 ;;
2256 clone,--*)
2257 __gitcomp "--revision= $fc_opts $init_opts"
2258 ;;
2259 init,--*)
2260 __gitcomp "$init_opts"
2261 ;;
2262 dcommit,--*)
2263 __gitcomp "
2264 --merge --strategy= --verbose --dry-run
4a5856cb 2265 --fetch-all --no-rebase --commit-url
7b151f49 2266 --revision --interactive $cmt_opts $fc_opts
47f6ee28
SG
2267 "
2268 ;;
2269 set-tree,--*)
2270 __gitcomp "--stdin $cmt_opts $fc_opts"
2271 ;;
2272 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
c18d5d82 2273 show-externals,--*|mkdirs,--*)
47f6ee28
SG
2274 __gitcomp "--revision="
2275 ;;
2276 log,--*)
2277 __gitcomp "
2278 --limit= --revision= --verbose --incremental
2279 --oneline --show-commit --non-recursive
4a5856cb 2280 --authors-file= --color
47f6ee28
SG
2281 "
2282 ;;
2283 rebase,--*)
2284 __gitcomp "
2285 --merge --verbose --strategy= --local
4a5856cb 2286 --fetch-all --dry-run $fc_opts
47f6ee28
SG
2287 "
2288 ;;
2289 commit-diff,--*)
2290 __gitcomp "--message= --file= --revision= $cmt_opts"
2291 ;;
2292 info,--*)
2293 __gitcomp "--url"
2294 ;;
4a5856cb
SG
2295 branch,--*)
2296 __gitcomp "--dry-run --message --tag"
2297 ;;
2298 tag,--*)
2299 __gitcomp "--dry-run --message"
2300 ;;
2301 blame,--*)
2302 __gitcomp "--git-format"
2303 ;;
2304 migrate,--*)
2305 __gitcomp "
2306 --config-dir= --ignore-paths= --minimize
2307 --no-auth-cache --username=
2308 "
2309 ;;
c18d5d82
RZ
2310 reset,--*)
2311 __gitcomp "--revision= --parent"
2312 ;;
47f6ee28
SG
2313 *)
2314 COMPREPLY=()
2315 ;;
2316 esac
2317 fi
2318}
2319
88e21dc7
SP
2320_git_tag ()
2321{
2322 local i c=1 f=0
da48616f
PD
2323 while [ $c -lt $cword ]; do
2324 i="${words[c]}"
88e21dc7
SP
2325 case "$i" in
2326 -d|-v)
a31e6262 2327 __gitcomp_nl "$(__git_tags)"
88e21dc7
SP
2328 return
2329 ;;
2330 -f)
2331 f=1
2332 ;;
2333 esac
6e8c755f 2334 ((c++))
88e21dc7
SP
2335 done
2336
da48616f 2337 case "$prev" in
88e21dc7
SP
2338 -m|-F)
2339 COMPREPLY=()
2340 ;;
8d8163f3 2341 -*|tag)
88e21dc7 2342 if [ $f = 1 ]; then
a31e6262 2343 __gitcomp_nl "$(__git_tags)"
88e21dc7
SP
2344 else
2345 COMPREPLY=()
2346 fi
2347 ;;
2348 *)
a31e6262 2349 __gitcomp_nl "$(__git_refs)"
88e21dc7
SP
2350 ;;
2351 esac
2352}
2353
424cce83
SG
2354_git_whatchanged ()
2355{
2356 _git_log
2357}
2358
93b291e0 2359__git_main ()
690d8824 2360{
873537fa
SP
2361 local i c=1 command __git_dir
2362
da48616f
PD
2363 while [ $c -lt $cword ]; do
2364 i="${words[c]}"
873537fa
SP
2365 case "$i" in
2366 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2367 --bare) __git_dir="." ;;
1eb7e2f8 2368 --help) command="help"; break ;;
911d5da6
SG
2369 -c) c=$((++c)) ;;
2370 -*) ;;
873537fa
SP
2371 *) command="$i"; break ;;
2372 esac
6e8c755f 2373 ((c++))
873537fa
SP
2374 done
2375
1d17b22e 2376 if [ -z "$command" ]; then
da48616f 2377 case "$cur" in
47e98eec 2378 --*) __gitcomp "
ce5a2c95 2379 --paginate
47e98eec
SP
2380 --no-pager
2381 --git-dir=
2382 --bare
2383 --version
2384 --exec-path
3ffcd086 2385 --exec-path=
89a56bfb 2386 --html-path
69ef3c02 2387 --info-path
ce5a2c95 2388 --work-tree=
a1bea2c1 2389 --namespace=
69ef3c02 2390 --no-replace-objects
ce5a2c95 2391 --help
47e98eec
SP
2392 "
2393 ;;
eaa4e6ee
JN
2394 *) __git_compute_porcelain_commands
2395 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
72e5e989
SP
2396 esac
2397 return
873537fa 2398 fi
367dce2a 2399
424cce83 2400 local completion_func="_git_${command//-/_}"
06f44c3c 2401 declare -f $completion_func >/dev/null && $completion_func && return
8024ea60 2402
873537fa 2403 local expansion=$(__git_aliased_command "$command")
8024ea60
SG
2404 if [ -n "$expansion" ]; then
2405 completion_func="_git_${expansion//-/_}"
06f44c3c 2406 declare -f $completion_func >/dev/null && $completion_func
8024ea60 2407 fi
690d8824
JH
2408}
2409
93b291e0 2410__gitk_main ()
690d8824 2411{
d773c631
SG
2412 __git_has_doubledash && return
2413
fa26a401 2414 local g="$(__gitdir)"
07ba53f7 2415 local merge=""
ba7906f2 2416 if [ -f "$g/MERGE_HEAD" ]; then
07ba53f7
RQ
2417 merge="--merge"
2418 fi
b3391775
SP
2419 case "$cur" in
2420 --*)
a393777e
TR
2421 __gitcomp "
2422 $__git_log_common_options
2423 $__git_log_gitk_options
2424 $merge
2425 "
b3391775
SP
2426 return
2427 ;;
2428 esac
ec804891 2429 __git_complete_revlist
690d8824
JH
2430}
2431
6b179adf
FC
2432__git_func_wrap ()
2433{
2434 if [[ -n ${ZSH_VERSION-} ]]; then
2435 emulate -L bash
2436 setopt KSH_TYPESET
2437
2438 # workaround zsh's bug that leaves 'words' as a special
2439 # variable in versions < 4.3.12
2440 typeset -h words
2441
2442 # workaround zsh's bug that quotes spaces in the COMPREPLY
2443 # array if IFS doesn't contain spaces.
2444 typeset -h IFS
2445 fi
2446 local cur words cword prev
2447 _get_comp_words_by_ref -n =: cur words cword prev
2448 $1
2449}
2450
2451# Setup completion for certain functions defined above by setting common
2452# variables and workarounds.
2453# This is NOT a public function; use at your own risk.
2454__git_complete ()
2455{
2456 local wrapper="__git_wrap${2}"
2457 eval "$wrapper () { __git_func_wrap $2 ; }"
2458 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2459 || complete -o default -o nospace -F $wrapper $1
2460}
2461
b0a4b2d2
FC
2462# wrapper for backwards compatibility
2463_git ()
2464{
93b291e0 2465 __git_wrap__git_main
b0a4b2d2
FC
2466}
2467
2468# wrapper for backwards compatibility
2469_gitk ()
2470{
93b291e0 2471 __git_wrap__gitk_main
b0a4b2d2
FC
2472}
2473
93b291e0
SG
2474__git_complete git __git_main
2475__git_complete gitk __gitk_main
690d8824
JH
2476
2477# The following are necessary only for Cygwin, and only are needed
2478# when the user has tab-completed the executable name and consequently
2479# included the '.exe' suffix.
2480#
76c3eb51 2481if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
93b291e0 2482__git_complete git.exe __git_main
76c3eb51 2483fi