]> git.ipfire.org Git - thirdparty/git.git/blame - contrib/completion/git-completion.bash
completion: add new zsh completion
[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
2f65494d
FC
1119__git_format_patch_options="
1120 --stdout --attach --no-attach --thread --thread= --output-directory
1121 --numbered --start-number --numbered-files --keep-subject --signoff
1122 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1123 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1124 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1125"
1126
f53352fb
SP
1127_git_format_patch ()
1128{
f53352fb 1129 case "$cur" in
e1d37937
SB
1130 --thread=*)
1131 __gitcomp "
1132 deep shallow
1133 " "" "${cur##--thread=}"
1134 return
1135 ;;
f53352fb 1136 --*)
2f65494d 1137 __gitcomp "$__git_format_patch_options"
f53352fb
SP
1138 return
1139 ;;
1140 esac
1141 __git_complete_revlist
1142}
1143
4bca8636
AJ
1144_git_fsck ()
1145{
4bca8636
AJ
1146 case "$cur" in
1147 --*)
1148 __gitcomp "
1149 --tags --root --unreachable --cache --no-reflogs --full
1150 --strict --verbose --lost-found
1151 "
1152 return
1153 ;;
1154 esac
1155 COMPREPLY=()
1156}
1157
b26c8748
SP
1158_git_gc ()
1159{
b26c8748
SP
1160 case "$cur" in
1161 --*)
47e98eec 1162 __gitcomp "--prune --aggressive"
b26c8748
SP
1163 return
1164 ;;
1165 esac
1166 COMPREPLY=()
1167}
1168
66729509
SG
1169_git_gitk ()
1170{
1171 _gitk
1172}
1173
29eec71f
JK
1174__git_match_ctag() {
1175 awk "/^${1////\\/}/ { print \$1 }" "$2"
1176}
1177
c72e0db1
LM
1178_git_grep ()
1179{
1180 __git_has_doubledash && return
1181
c72e0db1
LM
1182 case "$cur" in
1183 --*)
1184 __gitcomp "
1185 --cached
1186 --text --ignore-case --word-regexp --invert-match
5a69eaf5 1187 --full-name --line-number
c72e0db1 1188 --extended-regexp --basic-regexp --fixed-strings
63e7e9d8 1189 --perl-regexp
c72e0db1
LM
1190 --files-with-matches --name-only
1191 --files-without-match
a91f453f 1192 --max-depth
c72e0db1
LM
1193 --count
1194 --and --or --not --all-match
1195 "
1196 return
1197 ;;
1198 esac
17225c49 1199
29eec71f
JK
1200 case "$cword,$prev" in
1201 2,*|*,-*)
1202 if test -r tags; then
d2c78075 1203 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
29eec71f
JK
1204 return
1205 fi
1206 ;;
1207 esac
1208
a31e6262 1209 __gitcomp_nl "$(__git_refs)"
c72e0db1
LM
1210}
1211
1eb7e2f8
LM
1212_git_help ()
1213{
1eb7e2f8
LM
1214 case "$cur" in
1215 --*)
1216 __gitcomp "--all --info --man --web"
1217 return
1218 ;;
1219 esac
eaa4e6ee 1220 __git_compute_all_commands
f85a6f0b 1221 __gitcomp "$__git_all_commands $(__git_aliases)
2946cccf
MG
1222 attributes cli core-tutorial cvs-migration
1223 diffcore gitk glossary hooks ignore modules
d49483f0 1224 namespaces repository-layout tutorial tutorial-2
99f0b599 1225 workflows
2946cccf 1226 "
1eb7e2f8
LM
1227}
1228
5dad868b
LM
1229_git_init ()
1230{
5dad868b
LM
1231 case "$cur" in
1232 --shared=*)
1233 __gitcomp "
1234 false true umask group all world everybody
1235 " "" "${cur##--shared=}"
1236 return
1237 ;;
1238 --*)
1239 __gitcomp "--quiet --bare --template= --shared --shared="
1240 return
1241 ;;
1242 esac
1243 COMPREPLY=()
1244}
1245
b1bc1494
LM
1246_git_ls_files ()
1247{
1248 __git_has_doubledash && return
1249
b1bc1494
LM
1250 case "$cur" in
1251 --*)
1252 __gitcomp "--cached --deleted --modified --others --ignored
1253 --stage --directory --no-empty-directory --unmerged
1254 --killed --exclude= --exclude-from=
1255 --exclude-per-directory= --exclude-standard
1256 --error-unmatch --with-tree= --full-name
1257 --abbrev --ignored --exclude-per-directory
1258 "
1259 return
1260 ;;
1261 esac
1262 COMPREPLY=()
1263}
1264
690d8824
JH
1265_git_ls_remote ()
1266{
a31e6262 1267 __gitcomp_nl "$(__git_remotes)"
690d8824
JH
1268}
1269
1270_git_ls_tree ()
1271{
1272 __git_complete_file
1273}
1274
a393777e
TR
1275# Options that go well for log, shortlog and gitk
1276__git_log_common_options="
1277 --not --all
1278 --branches --tags --remotes
4fe1a619 1279 --first-parent --merges --no-merges
a393777e
TR
1280 --max-count=
1281 --max-age= --since= --after=
1282 --min-age= --until= --before=
6a6ebded
MG
1283 --min-parents= --max-parents=
1284 --no-min-parents --no-max-parents
a393777e
TR
1285"
1286# Options that go well for log and gitk (not shortlog)
1287__git_log_gitk_options="
1288 --dense --sparse --full-history
1289 --simplify-merges --simplify-by-decoration
3925b575 1290 --left-right --notes --no-notes
a393777e
TR
1291"
1292# Options that go well for log and shortlog (not gitk)
1293__git_log_shortlog_options="
1294 --author= --committer= --grep=
1295 --all-match
1296"
1297
3d279863 1298__git_log_pretty_formats="oneline short medium full fuller email raw format:"
672c68cb 1299__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
3d279863 1300
690d8824
JH
1301_git_log ()
1302{
d773c631
SG
1303 __git_has_doubledash && return
1304
bf3c20f6
TR
1305 local g="$(git rev-parse --git-dir 2>/dev/null)"
1306 local merge=""
ba7906f2 1307 if [ -f "$g/MERGE_HEAD" ]; then
bf3c20f6
TR
1308 merge="--merge"
1309 fi
6e31b866 1310 case "$cur" in
e67d71e5 1311 --pretty=*|--format=*)
c3898111 1312 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
e67d71e5 1313 " "" "${cur#*=}"
72de29c2
TL
1314 return
1315 ;;
47e98eec 1316 --date=*)
672c68cb 1317 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
47e98eec
SP
1318 return
1319 ;;
af4e9e8c
SB
1320 --decorate=*)
1321 __gitcomp "long short" "" "${cur##--decorate=}"
1322 return
1323 ;;
6e31b866 1324 --*)
b3391775 1325 __gitcomp "
a393777e
TR
1326 $__git_log_common_options
1327 $__git_log_shortlog_options
1328 $__git_log_gitk_options
8f87fae6 1329 --root --topo-order --date-order --reverse
5d0e6343 1330 --follow --full-diff
6e31b866 1331 --abbrev-commit --abbrev=
47e98eec 1332 --relative-date --date=
72de29c2 1333 --pretty= --format= --oneline
a393777e 1334 --cherry-pick
20827d99 1335 --graph
af4e9e8c 1336 --decorate --decorate=
20bf7292 1337 --walk-reflogs
a393777e 1338 --parents --children
bf3c20f6 1339 $merge
20bf7292 1340 $__git_diff_common_options
47d5a8fa 1341 --pickaxe-all --pickaxe-regex
b3391775 1342 "
6e31b866
SP
1343 return
1344 ;;
1345 esac
f53352fb 1346 __git_complete_revlist
690d8824
JH
1347}
1348
0a4e1472
JS
1349__git_merge_options="
1350 --no-commit --no-stat --log --no-log --squash --strategy
2ff14e31 1351 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
0a4e1472
JS
1352"
1353
4ad91321
SP
1354_git_merge ()
1355{
3c7b480a
JS
1356 __git_complete_strategy && return
1357
4ad91321
SP
1358 case "$cur" in
1359 --*)
0a4e1472 1360 __gitcomp "$__git_merge_options"
4ad91321
SP
1361 return
1362 esac
a31e6262 1363 __gitcomp_nl "$(__git_refs)"
4ad91321
SP
1364}
1365
b4c72162
LM
1366_git_mergetool ()
1367{
b4c72162
LM
1368 case "$cur" in
1369 --tool=*)
e2dc2de9 1370 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
b4c72162
LM
1371 return
1372 ;;
1373 --*)
1374 __gitcomp "--tool="
1375 return
1376 ;;
1377 esac
1378 COMPREPLY=()
1379}
1380
690d8824
JH
1381_git_merge_base ()
1382{
a31e6262 1383 __gitcomp_nl "$(__git_refs)"
690d8824
JH
1384}
1385
1127c51c
LM
1386_git_mv ()
1387{
1127c51c
LM
1388 case "$cur" in
1389 --*)
1390 __gitcomp "--dry-run"
1391 return
1392 ;;
1393 esac
1394 COMPREPLY=()
1395}
1396
d33909bf
SP
1397_git_name_rev ()
1398{
b3391775 1399 __gitcomp "--tags --all --stdin"
d33909bf
SP
1400}
1401
00f09d0e
SG
1402_git_notes ()
1403{
2a5da755
SG
1404 local subcommands='add append copy edit list prune remove show'
1405 local subcommand="$(__git_find_on_cmdline "$subcommands")"
00f09d0e 1406
2a5da755
SG
1407 case "$subcommand,$cur" in
1408 ,--*)
1409 __gitcomp '--ref'
1410 ;;
1411 ,*)
39540681 1412 case "$prev" in
2a5da755 1413 --ref)
a31e6262 1414 __gitcomp_nl "$(__git_refs)"
2a5da755
SG
1415 ;;
1416 *)
1417 __gitcomp "$subcommands --ref"
1418 ;;
1419 esac
1420 ;;
a8f89bfa 1421 add,--reuse-message=*|append,--reuse-message=*|\
2a5da755 1422 add,--reedit-message=*|append,--reedit-message=*)
a31e6262 1423 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
2a5da755
SG
1424 ;;
1425 add,--*|append,--*)
1426 __gitcomp '--file= --message= --reedit-message=
1427 --reuse-message='
1428 ;;
1429 copy,--*)
1430 __gitcomp '--stdin'
1431 ;;
1432 prune,--*)
1433 __gitcomp '--dry-run --verbose'
1434 ;;
1435 prune,*)
00f09d0e
SG
1436 ;;
1437 *)
39540681 1438 case "$prev" in
2a5da755
SG
1439 -m|-F)
1440 ;;
1441 *)
a31e6262 1442 __gitcomp_nl "$(__git_refs)"
2a5da755
SG
1443 ;;
1444 esac
00f09d0e
SG
1445 ;;
1446 esac
1447}
1448
690d8824
JH
1449_git_pull ()
1450{
0a4e1472
JS
1451 __git_complete_strategy && return
1452
0a4e1472
JS
1453 case "$cur" in
1454 --*)
1455 __gitcomp "
1456 --rebase --no-rebase
1457 $__git_merge_options
1458 $__git_fetch_options
1459 "
1460 return
1461 ;;
1462 esac
52d5c3b5 1463 __git_complete_remote_or_refspec
690d8824
JH
1464}
1465
1466_git_push ()
1467{
da48616f 1468 case "$prev" in
0a4e1472 1469 --repo)
a31e6262 1470 __gitcomp_nl "$(__git_remotes)"
0a4e1472
JS
1471 return
1472 esac
1473 case "$cur" in
1474 --repo=*)
a31e6262 1475 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
0a4e1472
JS
1476 return
1477 ;;
1478 --*)
1479 __gitcomp "
1480 --all --mirror --tags --dry-run --force --verbose
3623dc03 1481 --receive-pack= --repo= --set-upstream
0a4e1472
JS
1482 "
1483 return
1484 ;;
1485 esac
52d5c3b5 1486 __git_complete_remote_or_refspec
690d8824
JH
1487}
1488
61d926a3
SP
1489_git_rebase ()
1490{
da48616f 1491 local dir="$(__gitdir)"
51ef1daa 1492 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
b3391775 1493 __gitcomp "--continue --skip --abort"
61d926a3
SP
1494 return
1495 fi
3c7b480a 1496 __git_complete_strategy && return
61d926a3 1497 case "$cur" in
93cf50a4
BG
1498 --whitespace=*)
1499 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1500 return
1501 ;;
61d926a3 1502 --*)
93cf50a4
BG
1503 __gitcomp "
1504 --onto --merge --strategy --interactive
1505 --preserve-merges --stat --no-stat
1506 --committer-date-is-author-date --ignore-date
1507 --ignore-whitespace --whitespace=
6d0d465e 1508 --autosquash
93cf50a4
BG
1509 "
1510
61d926a3
SP
1511 return
1512 esac
a31e6262 1513 __gitcomp_nl "$(__git_refs)"
61d926a3
SP
1514}
1515
057f3279
TRC
1516_git_reflog ()
1517{
1518 local subcommands="show delete expire"
1519 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1520
1521 if [ -z "$subcommand" ]; then
1522 __gitcomp "$subcommands"
1523 else
a31e6262 1524 __gitcomp_nl "$(__git_refs)"
057f3279
TRC
1525 fi
1526}
1527
ae616de6 1528__git_send_email_confirm_options="always never auto cc compose"
cb8a9bd5 1529__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
ae616de6 1530
25a1f374
TL
1531_git_send_email ()
1532{
25a1f374 1533 case "$cur" in
ae616de6
SB
1534 --confirm=*)
1535 __gitcomp "
1536 $__git_send_email_confirm_options
1537 " "" "${cur##--confirm=}"
1538 return
1539 ;;
1540 --suppress-cc=*)
1541 __gitcomp "
1542 $__git_send_email_suppresscc_options
1543 " "" "${cur##--suppress-cc=}"
1544
1545 return
1546 ;;
1547 --smtp-encryption=*)
1548 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1549 return
1550 ;;
2f65494d
FC
1551 --thread=*)
1552 __gitcomp "
1553 deep shallow
1554 " "" "${cur##--thread=}"
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
2f65494d
FC
1566 --validate --no-validate
1567 $__git_format_patch_options"
25a1f374
TL
1568 return
1569 ;;
1570 esac
2f65494d 1571 __git_complete_revlist
25a1f374
TL
1572}
1573
424cce83
SG
1574_git_stage ()
1575{
1576 _git_add
1577}
1578
00652369
SB
1579__git_config_get_set_variables ()
1580{
da48616f 1581 local prevword word config_file= c=$cword
00652369 1582 while [ $c -gt 1 ]; do
da48616f 1583 word="${words[c]}"
00652369
SB
1584 case "$word" in
1585 --global|--system|--file=*)
1586 config_file="$word"
1587 break
1588 ;;
1589 -f|--file)
1590 config_file="$word $prevword"
1591 break
1592 ;;
1593 esac
1594 prevword=$word
1595 c=$((--c))
1596 done
1597
f581de1b 1598 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
6f2dd720 1599 while read -r line
f581de1b
SB
1600 do
1601 case "$line" in
1602 *.*=*)
1603 echo "${line/=*/}"
00652369
SB
1604 ;;
1605 esac
1606 done
1607}
1608
e0d10e1c 1609_git_config ()
5de40f59 1610{
da48616f 1611 case "$prev" in
5de40f59 1612 branch.*.remote)
a31e6262 1613 __gitcomp_nl "$(__git_remotes)"
5de40f59
SP
1614 return
1615 ;;
1616 branch.*.merge)
a31e6262 1617 __gitcomp_nl "$(__git_refs)"
5de40f59
SP
1618 return
1619 ;;
1620 remote.*.fetch)
da48616f 1621 local remote="${prev#remote.}"
5de40f59 1622 remote="${remote%.fetch}"
d51a8ecd
SG
1623 if [ -z "$cur" ]; then
1624 COMPREPLY=("refs/heads/")
1625 return
1626 fi
a31e6262 1627 __gitcomp_nl "$(__git_refs_remotes "$remote")"
5de40f59
SP
1628 return
1629 ;;
1630 remote.*.push)
da48616f 1631 local remote="${prev#remote.}"
5de40f59 1632 remote="${remote%.push}"
a31e6262 1633 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
5de40f59 1634 for-each-ref --format='%(refname):%(refname)' \
78d4d6a2
SP
1635 refs/heads)"
1636 return
1637 ;;
1638 pull.twohead|pull.octopus)
eaa4e6ee
JN
1639 __git_compute_merge_strategies
1640 __gitcomp "$__git_merge_strategies"
78d4d6a2
SP
1641 return
1642 ;;
6123d719
MH
1643 color.branch|color.diff|color.interactive|\
1644 color.showbranch|color.status|color.ui)
78d4d6a2
SP
1645 __gitcomp "always never auto"
1646 return
1647 ;;
901d615c
MK
1648 color.pager)
1649 __gitcomp "false true"
1650 return
1651 ;;
78d4d6a2
SP
1652 color.*.*)
1653 __gitcomp "
98171a07 1654 normal black red green yellow blue magenta cyan white
78d4d6a2
SP
1655 bold dim ul blink reverse
1656 "
5de40f59
SP
1657 return
1658 ;;
9b82d63b
SB
1659 help.format)
1660 __gitcomp "man info web html"
1661 return
1662 ;;
672c68cb
SB
1663 log.date)
1664 __gitcomp "$__git_log_date_formats"
1665 return
1666 ;;
ae616de6
SB
1667 sendemail.aliasesfiletype)
1668 __gitcomp "mutt mailrc pine elm gnus"
1669 return
1670 ;;
1671 sendemail.confirm)
1672 __gitcomp "$__git_send_email_confirm_options"
1673 return
1674 ;;
1675 sendemail.suppresscc)
1676 __gitcomp "$__git_send_email_suppresscc_options"
1677 return
1678 ;;
00652369 1679 --get|--get-all|--unset|--unset-all)
a31e6262 1680 __gitcomp_nl "$(__git_config_get_set_variables)"
00652369
SB
1681 return
1682 ;;
5de40f59
SP
1683 *.*)
1684 COMPREPLY=()
1685 return
1686 ;;
1687 esac
1688 case "$cur" in
1689 --*)
78d4d6a2 1690 __gitcomp "
47e98eec 1691 --global --system --file=
12977705 1692 --list --replace-all
5de40f59 1693 --get --get-all --get-regexp
1b71eb35 1694 --add --unset --unset-all
12977705 1695 --remove-section --rename-section
78d4d6a2 1696 "
5de40f59
SP
1697 return
1698 ;;
1699 branch.*.*)
9244d69b
SG
1700 local pfx="${cur%.*}." cur_="${cur##*.}"
1701 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
5de40f59
SP
1702 return
1703 ;;
1704 branch.*)
9244d69b 1705 local pfx="${cur%.*}." cur_="${cur#*.}"
a31e6262 1706 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
5de40f59
SP
1707 return
1708 ;;
0aa62fd0 1709 guitool.*.*)
9244d69b 1710 local pfx="${cur%.*}." cur_="${cur##*.}"
0aa62fd0
SB
1711 __gitcomp "
1712 argprompt cmd confirm needsfile noconsole norescan
1713 prompt revprompt revunmerged title
9244d69b 1714 " "$pfx" "$cur_"
0aa62fd0
SB
1715 return
1716 ;;
1717 difftool.*.*)
9244d69b
SG
1718 local pfx="${cur%.*}." cur_="${cur##*.}"
1719 __gitcomp "cmd path" "$pfx" "$cur_"
0aa62fd0
SB
1720 return
1721 ;;
1722 man.*.*)
9244d69b
SG
1723 local pfx="${cur%.*}." cur_="${cur##*.}"
1724 __gitcomp "cmd path" "$pfx" "$cur_"
0aa62fd0
SB
1725 return
1726 ;;
1727 mergetool.*.*)
9244d69b
SG
1728 local pfx="${cur%.*}." cur_="${cur##*.}"
1729 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
0aa62fd0
SB
1730 return
1731 ;;
1732 pager.*)
9244d69b 1733 local pfx="${cur%.*}." cur_="${cur#*.}"
eaa4e6ee 1734 __git_compute_all_commands
a31e6262 1735 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
0aa62fd0
SB
1736 return
1737 ;;
5de40f59 1738 remote.*.*)
9244d69b 1739 local pfx="${cur%.*}." cur_="${cur##*.}"
12977705 1740 __gitcomp "
98171a07 1741 url proxy fetch push mirror skipDefaultUpdate
6fac1b83 1742 receivepack uploadpack tagopt pushurl
9244d69b 1743 " "$pfx" "$cur_"
5de40f59
SP
1744 return
1745 ;;
1746 remote.*)
9244d69b 1747 local pfx="${cur%.*}." cur_="${cur#*.}"
a31e6262 1748 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
5de40f59
SP
1749 return
1750 ;;
0aa62fd0 1751 url.*.*)
9244d69b
SG
1752 local pfx="${cur%.*}." cur_="${cur##*.}"
1753 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
0aa62fd0
SB
1754 return
1755 ;;
5de40f59 1756 esac
78d4d6a2 1757 __gitcomp "
6068ac88
MZ
1758 add.ignoreErrors
1759 advice.commitBeforeMerge
1760 advice.detachedHead
1761 advice.implicitIdentity
1762 advice.pushNonFastForward
1763 advice.resolveConflict
1764 advice.statusHints
226b343c 1765 alias.
6068ac88 1766 am.keepcr
86c91f91 1767 apply.ignorewhitespace
5de40f59 1768 apply.whitespace
98171a07
LM
1769 branch.autosetupmerge
1770 branch.autosetuprebase
6068ac88 1771 browser.
2122591b 1772 clean.requireForce
78d4d6a2
SP
1773 color.branch
1774 color.branch.current
1775 color.branch.local
78d4d6a2 1776 color.branch.plain
025a1929 1777 color.branch.remote
6068ac88
MZ
1778 color.decorate.HEAD
1779 color.decorate.branch
1780 color.decorate.remoteBranch
1781 color.decorate.stash
1782 color.decorate.tag
a159ca0c 1783 color.diff
025a1929 1784 color.diff.commit
78d4d6a2 1785 color.diff.frag
6068ac88 1786 color.diff.func
025a1929 1787 color.diff.meta
78d4d6a2 1788 color.diff.new
025a1929
LM
1789 color.diff.old
1790 color.diff.plain
78d4d6a2 1791 color.diff.whitespace
226b343c 1792 color.grep
6068ac88
MZ
1793 color.grep.context
1794 color.grep.filename
1795 color.grep.function
1796 color.grep.linenumber
226b343c 1797 color.grep.match
6068ac88
MZ
1798 color.grep.selected
1799 color.grep.separator
98171a07 1800 color.interactive
6068ac88 1801 color.interactive.error
98171a07
LM
1802 color.interactive.header
1803 color.interactive.help
1804 color.interactive.prompt
a159ca0c 1805 color.pager
6123d719 1806 color.showbranch
a159ca0c 1807 color.status
78d4d6a2
SP
1808 color.status.added
1809 color.status.changed
025a1929 1810 color.status.header
98171a07 1811 color.status.nobranch
78d4d6a2 1812 color.status.untracked
98171a07
LM
1813 color.status.updated
1814 color.ui
6068ac88 1815 commit.status
98171a07 1816 commit.template
cdb791f6 1817 core.abbrev
6068ac88
MZ
1818 core.askpass
1819 core.attributesfile
98171a07
LM
1820 core.autocrlf
1821 core.bare
6068ac88 1822 core.bigFileThreshold
025a1929 1823 core.compression
226b343c 1824 core.createObject
98171a07
LM
1825 core.deltaBaseCacheLimit
1826 core.editor
6068ac88 1827 core.eol
98171a07 1828 core.excludesfile
025a1929 1829 core.fileMode
98171a07 1830 core.fsyncobjectfiles
025a1929 1831 core.gitProxy
98171a07 1832 core.ignoreCygwinFSTricks
025a1929 1833 core.ignoreStat
6068ac88 1834 core.ignorecase
025a1929
LM
1835 core.logAllRefUpdates
1836 core.loosecompression
6068ac88 1837 core.notesRef
025a1929
LM
1838 core.packedGitLimit
1839 core.packedGitWindowSize
98171a07 1840 core.pager
025a1929 1841 core.preferSymlinkRefs
98171a07
LM
1842 core.preloadindex
1843 core.quotepath
025a1929 1844 core.repositoryFormatVersion
98171a07 1845 core.safecrlf
025a1929 1846 core.sharedRepository
6068ac88 1847 core.sparseCheckout
98171a07
LM
1848 core.symlinks
1849 core.trustctime
025a1929 1850 core.warnAmbiguousRefs
98171a07
LM
1851 core.whitespace
1852 core.worktree
1853 diff.autorefreshindex
df44483a 1854 diff.statGraphWidth
98171a07 1855 diff.external
6068ac88 1856 diff.ignoreSubmodules
98171a07 1857 diff.mnemonicprefix
6068ac88 1858 diff.noprefix
78d4d6a2
SP
1859 diff.renameLimit
1860 diff.renames
226b343c
SB
1861 diff.suppressBlankEmpty
1862 diff.tool
1863 diff.wordRegex
0aa62fd0 1864 difftool.
226b343c 1865 difftool.prompt
6068ac88 1866 fetch.recurseSubmodules
78d4d6a2 1867 fetch.unpackLimit
226b343c
SB
1868 format.attach
1869 format.cc
78d4d6a2 1870 format.headers
98171a07
LM
1871 format.numbered
1872 format.pretty
d8e1e5df 1873 format.signature
226b343c
SB
1874 format.signoff
1875 format.subjectprefix
98171a07 1876 format.suffix
226b343c 1877 format.thread
6068ac88
MZ
1878 format.to
1879 gc.
98171a07
LM
1880 gc.aggressiveWindow
1881 gc.auto
1882 gc.autopacklimit
12977705 1883 gc.packrefs
98171a07 1884 gc.pruneexpire
78d4d6a2
SP
1885 gc.reflogexpire
1886 gc.reflogexpireunreachable
1887 gc.rerereresolved
1888 gc.rerereunresolved
025a1929 1889 gitcvs.allbinary
226b343c 1890 gitcvs.commitmsgannotation
98171a07 1891 gitcvs.dbTableNamePrefix
025a1929
LM
1892 gitcvs.dbdriver
1893 gitcvs.dbname
1894 gitcvs.dbpass
025a1929
LM
1895 gitcvs.dbuser
1896 gitcvs.enabled
1897 gitcvs.logfile
98171a07 1898 gitcvs.usecrlfattr
0aa62fd0 1899 guitool.
98171a07
LM
1900 gui.blamehistoryctx
1901 gui.commitmsgwidth
1902 gui.copyblamethreshold
1903 gui.diffcontext
1904 gui.encoding
1905 gui.fastcopyblame
1906 gui.matchtrackingbranch
1907 gui.newbranchtemplate
1908 gui.pruneduringfetch
1909 gui.spellingdictionary
1910 gui.trustmtime
1911 help.autocorrect
1912 help.browser
1913 help.format
78d4d6a2
SP
1914 http.lowSpeedLimit
1915 http.lowSpeedTime
025a1929 1916 http.maxRequests
6068ac88 1917 http.minSessions
5de40f59 1918 http.noEPSV
6068ac88 1919 http.postBuffer
98171a07 1920 http.proxy
025a1929
LM
1921 http.sslCAInfo
1922 http.sslCAPath
1923 http.sslCert
6068ac88 1924 http.sslCertPasswordProtected
025a1929
LM
1925 http.sslKey
1926 http.sslVerify
6068ac88 1927 http.useragent
78d4d6a2
SP
1928 i18n.commitEncoding
1929 i18n.logOutputEncoding
6068ac88 1930 imap.authMethod
226b343c
SB
1931 imap.folder
1932 imap.host
1933 imap.pass
1934 imap.port
1935 imap.preformattedHTML
1936 imap.sslverify
1937 imap.tunnel
1938 imap.user
6068ac88 1939 init.templatedir
98171a07
LM
1940 instaweb.browser
1941 instaweb.httpd
1942 instaweb.local
1943 instaweb.modulepath
1944 instaweb.port
226b343c 1945 interactive.singlekey
98171a07 1946 log.date
6068ac88 1947 log.decorate
78d4d6a2 1948 log.showroot
226b343c 1949 mailmap.file
0aa62fd0 1950 man.
98171a07 1951 man.viewer
6068ac88 1952 merge.
98171a07
LM
1953 merge.conflictstyle
1954 merge.log
1955 merge.renameLimit
6068ac88 1956 merge.renormalize
98171a07 1957 merge.stat
025a1929 1958 merge.tool
78d4d6a2 1959 merge.verbosity
0aa62fd0 1960 mergetool.
98171a07 1961 mergetool.keepBackup
6068ac88 1962 mergetool.keepTemporaries
226b343c 1963 mergetool.prompt
6068ac88
MZ
1964 notes.displayRef
1965 notes.rewrite.
1966 notes.rewrite.amend
1967 notes.rewrite.rebase
1968 notes.rewriteMode
1969 notes.rewriteRef
47e98eec 1970 pack.compression
47e98eec 1971 pack.deltaCacheLimit
025a1929
LM
1972 pack.deltaCacheSize
1973 pack.depth
98171a07
LM
1974 pack.indexVersion
1975 pack.packSizeLimit
1976 pack.threads
025a1929
LM
1977 pack.window
1978 pack.windowMemory
0aa62fd0 1979 pager.
6068ac88 1980 pretty.
78d4d6a2
SP
1981 pull.octopus
1982 pull.twohead
226b343c 1983 push.default
6068ac88 1984 rebase.autosquash
226b343c 1985 rebase.stat
6068ac88 1986 receive.autogc
98171a07 1987 receive.denyCurrentBranch
6068ac88 1988 receive.denyDeleteCurrent
98171a07 1989 receive.denyDeletes
025a1929 1990 receive.denyNonFastForwards
98171a07 1991 receive.fsckObjects
025a1929 1992 receive.unpackLimit
6068ac88
MZ
1993 receive.updateserverinfo
1994 remotes.
98171a07
LM
1995 repack.usedeltabaseoffset
1996 rerere.autoupdate
1997 rerere.enabled
6068ac88 1998 sendemail.
226b343c 1999 sendemail.aliasesfile
6068ac88 2000 sendemail.aliasfiletype
226b343c
SB
2001 sendemail.bcc
2002 sendemail.cc
2003 sendemail.cccmd
2004 sendemail.chainreplyto
2005 sendemail.confirm
2006 sendemail.envelopesender
6068ac88
MZ
2007 sendemail.from
2008 sendemail.identity
226b343c
SB
2009 sendemail.multiedit
2010 sendemail.signedoffbycc
6068ac88 2011 sendemail.smtpdomain
226b343c
SB
2012 sendemail.smtpencryption
2013 sendemail.smtppass
2014 sendemail.smtpserver
6068ac88 2015 sendemail.smtpserveroption
226b343c
SB
2016 sendemail.smtpserverport
2017 sendemail.smtpuser
2018 sendemail.suppresscc
2019 sendemail.suppressfrom
2020 sendemail.thread
2021 sendemail.to
2022 sendemail.validate
78d4d6a2 2023 showbranch.default
98171a07
LM
2024 status.relativePaths
2025 status.showUntrackedFiles
6068ac88
MZ
2026 status.submodulesummary
2027 submodule.
78d4d6a2
SP
2028 tar.umask
2029 transfer.unpackLimit
0aa62fd0 2030 url.
78d4d6a2 2031 user.email
025a1929 2032 user.name
78d4d6a2 2033 user.signingkey
98171a07 2034 web.browser
5de40f59 2035 branch. remote.
78d4d6a2 2036 "
5de40f59
SP
2037}
2038
88293c67
SP
2039_git_remote ()
2040{
e17dba8f 2041 local subcommands="add rename remove set-head set-branches set-url show prune update"
918c03c2 2042 local subcommand="$(__git_find_on_cmdline "$subcommands")"
3ff1320d 2043 if [ -z "$subcommand" ]; then
3903c618 2044 __gitcomp "$subcommands"
88293c67
SP
2045 return
2046 fi
2047
3ff1320d 2048 case "$subcommand" in
e17dba8f 2049 rename|remove|set-url|show|prune)
a31e6262 2050 __gitcomp_nl "$(__git_remotes)"
88293c67 2051 ;;
f1c6ffe6
PJ
2052 set-head|set-branches)
2053 __git_complete_remote_or_refspec
2054 ;;
fb72759b
SP
2055 update)
2056 local i c='' IFS=$'\n'
518ef8f0
TZ
2057 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2058 i="${i#remotes.}"
2059 c="$c ${i/ */}"
fb72759b
SP
2060 done
2061 __gitcomp "$c"
2062 ;;
88293c67
SP
2063 *)
2064 COMPREPLY=()
2065 ;;
2066 esac
2067}
2068
e1c1a067
BG
2069_git_replace ()
2070{
a31e6262 2071 __gitcomp_nl "$(__git_refs)"
e1c1a067
BG
2072}
2073
67e78c3b
SP
2074_git_reset ()
2075{
d773c631
SG
2076 __git_has_doubledash && return
2077
b3391775
SP
2078 case "$cur" in
2079 --*)
9f040e95 2080 __gitcomp "--merge --mixed --hard --soft --patch"
b3391775
SP
2081 return
2082 ;;
2083 esac
a31e6262 2084 __gitcomp_nl "$(__git_refs)"
67e78c3b
SP
2085}
2086
a6c2be24
LM
2087_git_revert ()
2088{
a6c2be24
LM
2089 case "$cur" in
2090 --*)
2091 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2092 return
2093 ;;
2094 esac
a31e6262 2095 __gitcomp_nl "$(__git_refs)"
a6c2be24
LM
2096}
2097
08c701d4
LM
2098_git_rm ()
2099{
2100 __git_has_doubledash && return
2101
08c701d4
LM
2102 case "$cur" in
2103 --*)
2104 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2105 return
2106 ;;
2107 esac
2108 COMPREPLY=()
2109}
2110
1fd6bec9
SP
2111_git_shortlog ()
2112{
d773c631
SG
2113 __git_has_doubledash && return
2114
1fd6bec9
SP
2115 case "$cur" in
2116 --*)
2117 __gitcomp "
a393777e
TR
2118 $__git_log_common_options
2119 $__git_log_shortlog_options
1fd6bec9
SP
2120 --numbered --summary
2121 "
2122 return
2123 ;;
2124 esac
2125 __git_complete_revlist
2126}
2127
90131924
SP
2128_git_show ()
2129{
41d8cf7d
MH
2130 __git_has_doubledash && return
2131
90131924 2132 case "$cur" in
e67d71e5 2133 --pretty=*|--format=*)
c3898111 2134 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
e67d71e5 2135 " "" "${cur#*=}"
72de29c2
TL
2136 return
2137 ;;
90131924 2138 --*)
076c3237 2139 __gitcomp "--pretty= --format= --abbrev-commit --oneline
20bf7292
TR
2140 $__git_diff_common_options
2141 "
90131924
SP
2142 return
2143 ;;
2144 esac
2145 __git_complete_file
2146}
2147
2ca880fe
TR
2148_git_show_branch ()
2149{
2ca880fe
TR
2150 case "$cur" in
2151 --*)
2152 __gitcomp "
2153 --all --remotes --topo-order --current --more=
2154 --list --independent --merge-base --no-name
6123d719 2155 --color --no-color
076c3237 2156 --sha1-name --sparse --topics --reflog
2ca880fe
TR
2157 "
2158 return
2159 ;;
2160 esac
2161 __git_complete_revlist
2162}
2163
7fd53fce
JH
2164_git_stash ()
2165{
59d5eeee 2166 local save_opts='--keep-index --no-keep-index --quiet --patch'
95d43780 2167 local subcommands='save list show apply clear drop pop create branch'
918c03c2 2168 local subcommand="$(__git_find_on_cmdline "$subcommands")"
7bedebca 2169 if [ -z "$subcommand" ]; then
59d5eeee
SG
2170 case "$cur" in
2171 --*)
2172 __gitcomp "$save_opts"
2173 ;;
2174 *)
2175 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2176 __gitcomp "$subcommands"
2177 else
2178 COMPREPLY=()
2179 fi
2180 ;;
2181 esac
7bedebca 2182 else
7bedebca
SG
2183 case "$subcommand,$cur" in
2184 save,--*)
59d5eeee 2185 __gitcomp "$save_opts"
7bedebca 2186 ;;
8513c54b 2187 apply,--*|pop,--*)
59d5eeee 2188 __gitcomp "--index --quiet"
95d43780 2189 ;;
8513c54b 2190 show,--*|drop,--*|branch,--*)
95d43780
LM
2191 COMPREPLY=()
2192 ;;
2193 show,*|apply,*|drop,*|pop,*|branch,*)
a31e6262 2194 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
95d43780
LM
2195 | sed -n -e 's/:.*//p')"
2196 ;;
7bedebca
SG
2197 *)
2198 COMPREPLY=()
2199 ;;
2200 esac
3ff1320d 2201 fi
7fd53fce
JH
2202}
2203
be86f7a0
SP
2204_git_submodule ()
2205{
d773c631
SG
2206 __git_has_doubledash && return
2207
1b0f7978 2208 local subcommands="add status init update summary foreach sync"
918c03c2 2209 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
be86f7a0
SP
2210 case "$cur" in
2211 --*)
2212 __gitcomp "--quiet --cached"
2213 ;;
2214 *)
3ff1320d 2215 __gitcomp "$subcommands"
be86f7a0
SP
2216 ;;
2217 esac
2218 return
2219 fi
2220}
2221
47f6ee28
SG
2222_git_svn ()
2223{
2224 local subcommands="
2225 init fetch clone rebase dcommit log find-rev
2226 set-tree commit-diff info create-ignore propget
4a5856cb 2227 proplist show-ignore show-externals branch tag blame
c18d5d82 2228 migrate mkdirs reset gc
47f6ee28 2229 "
918c03c2 2230 local subcommand="$(__git_find_on_cmdline "$subcommands")"
47f6ee28
SG
2231 if [ -z "$subcommand" ]; then
2232 __gitcomp "$subcommands"
2233 else
2234 local remote_opts="--username= --config-dir= --no-auth-cache"
2235 local fc_opts="
2236 --follow-parent --authors-file= --repack=
2237 --no-metadata --use-svm-props --use-svnsync-props
2238 --log-window-size= --no-checkout --quiet
4a5856cb
SG
2239 --repack-flags --use-log-author --localtime
2240 --ignore-paths= $remote_opts
47f6ee28
SG
2241 "
2242 local init_opts="
2243 --template= --shared= --trunk= --tags=
2244 --branches= --stdlayout --minimize-url
2245 --no-metadata --use-svm-props --use-svnsync-props
4a5856cb
SG
2246 --rewrite-root= --prefix= --use-log-author
2247 --add-author-from $remote_opts
47f6ee28
SG
2248 "
2249 local cmt_opts="
2250 --edit --rmdir --find-copies-harder --copy-similarity=
2251 "
2252
47f6ee28
SG
2253 case "$subcommand,$cur" in
2254 fetch,--*)
2255 __gitcomp "--revision= --fetch-all $fc_opts"
2256 ;;
2257 clone,--*)
2258 __gitcomp "--revision= $fc_opts $init_opts"
2259 ;;
2260 init,--*)
2261 __gitcomp "$init_opts"
2262 ;;
2263 dcommit,--*)
2264 __gitcomp "
2265 --merge --strategy= --verbose --dry-run
4a5856cb 2266 --fetch-all --no-rebase --commit-url
7b151f49 2267 --revision --interactive $cmt_opts $fc_opts
47f6ee28
SG
2268 "
2269 ;;
2270 set-tree,--*)
2271 __gitcomp "--stdin $cmt_opts $fc_opts"
2272 ;;
2273 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
c18d5d82 2274 show-externals,--*|mkdirs,--*)
47f6ee28
SG
2275 __gitcomp "--revision="
2276 ;;
2277 log,--*)
2278 __gitcomp "
2279 --limit= --revision= --verbose --incremental
2280 --oneline --show-commit --non-recursive
4a5856cb 2281 --authors-file= --color
47f6ee28
SG
2282 "
2283 ;;
2284 rebase,--*)
2285 __gitcomp "
2286 --merge --verbose --strategy= --local
4a5856cb 2287 --fetch-all --dry-run $fc_opts
47f6ee28
SG
2288 "
2289 ;;
2290 commit-diff,--*)
2291 __gitcomp "--message= --file= --revision= $cmt_opts"
2292 ;;
2293 info,--*)
2294 __gitcomp "--url"
2295 ;;
4a5856cb
SG
2296 branch,--*)
2297 __gitcomp "--dry-run --message --tag"
2298 ;;
2299 tag,--*)
2300 __gitcomp "--dry-run --message"
2301 ;;
2302 blame,--*)
2303 __gitcomp "--git-format"
2304 ;;
2305 migrate,--*)
2306 __gitcomp "
2307 --config-dir= --ignore-paths= --minimize
2308 --no-auth-cache --username=
2309 "
2310 ;;
c18d5d82
RZ
2311 reset,--*)
2312 __gitcomp "--revision= --parent"
2313 ;;
47f6ee28
SG
2314 *)
2315 COMPREPLY=()
2316 ;;
2317 esac
2318 fi
2319}
2320
88e21dc7
SP
2321_git_tag ()
2322{
2323 local i c=1 f=0
da48616f
PD
2324 while [ $c -lt $cword ]; do
2325 i="${words[c]}"
88e21dc7
SP
2326 case "$i" in
2327 -d|-v)
a31e6262 2328 __gitcomp_nl "$(__git_tags)"
88e21dc7
SP
2329 return
2330 ;;
2331 -f)
2332 f=1
2333 ;;
2334 esac
6e8c755f 2335 ((c++))
88e21dc7
SP
2336 done
2337
da48616f 2338 case "$prev" in
88e21dc7
SP
2339 -m|-F)
2340 COMPREPLY=()
2341 ;;
8d8163f3 2342 -*|tag)
88e21dc7 2343 if [ $f = 1 ]; then
a31e6262 2344 __gitcomp_nl "$(__git_tags)"
88e21dc7
SP
2345 else
2346 COMPREPLY=()
2347 fi
2348 ;;
2349 *)
a31e6262 2350 __gitcomp_nl "$(__git_refs)"
88e21dc7
SP
2351 ;;
2352 esac
2353}
2354
424cce83
SG
2355_git_whatchanged ()
2356{
2357 _git_log
2358}
2359
93b291e0 2360__git_main ()
690d8824 2361{
873537fa
SP
2362 local i c=1 command __git_dir
2363
da48616f
PD
2364 while [ $c -lt $cword ]; do
2365 i="${words[c]}"
873537fa
SP
2366 case "$i" in
2367 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2368 --bare) __git_dir="." ;;
1eb7e2f8 2369 --help) command="help"; break ;;
911d5da6
SG
2370 -c) c=$((++c)) ;;
2371 -*) ;;
873537fa
SP
2372 *) command="$i"; break ;;
2373 esac
6e8c755f 2374 ((c++))
873537fa
SP
2375 done
2376
1d17b22e 2377 if [ -z "$command" ]; then
da48616f 2378 case "$cur" in
47e98eec 2379 --*) __gitcomp "
ce5a2c95 2380 --paginate
47e98eec
SP
2381 --no-pager
2382 --git-dir=
2383 --bare
2384 --version
2385 --exec-path
3ffcd086 2386 --exec-path=
89a56bfb 2387 --html-path
69ef3c02 2388 --info-path
ce5a2c95 2389 --work-tree=
a1bea2c1 2390 --namespace=
69ef3c02 2391 --no-replace-objects
ce5a2c95 2392 --help
47e98eec
SP
2393 "
2394 ;;
eaa4e6ee
JN
2395 *) __git_compute_porcelain_commands
2396 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
72e5e989
SP
2397 esac
2398 return
873537fa 2399 fi
367dce2a 2400
424cce83 2401 local completion_func="_git_${command//-/_}"
06f44c3c 2402 declare -f $completion_func >/dev/null && $completion_func && return
8024ea60 2403
873537fa 2404 local expansion=$(__git_aliased_command "$command")
8024ea60
SG
2405 if [ -n "$expansion" ]; then
2406 completion_func="_git_${expansion//-/_}"
06f44c3c 2407 declare -f $completion_func >/dev/null && $completion_func
8024ea60 2408 fi
690d8824
JH
2409}
2410
93b291e0 2411__gitk_main ()
690d8824 2412{
d773c631
SG
2413 __git_has_doubledash && return
2414
fa26a401 2415 local g="$(__gitdir)"
07ba53f7 2416 local merge=""
ba7906f2 2417 if [ -f "$g/MERGE_HEAD" ]; then
07ba53f7
RQ
2418 merge="--merge"
2419 fi
b3391775
SP
2420 case "$cur" in
2421 --*)
a393777e
TR
2422 __gitcomp "
2423 $__git_log_common_options
2424 $__git_log_gitk_options
2425 $merge
2426 "
b3391775
SP
2427 return
2428 ;;
2429 esac
ec804891 2430 __git_complete_revlist
690d8824
JH
2431}
2432
6b179adf
FC
2433__git_func_wrap ()
2434{
2435 if [[ -n ${ZSH_VERSION-} ]]; then
2436 emulate -L bash
2437 setopt KSH_TYPESET
2438
2439 # workaround zsh's bug that leaves 'words' as a special
2440 # variable in versions < 4.3.12
2441 typeset -h words
2442
2443 # workaround zsh's bug that quotes spaces in the COMPREPLY
2444 # array if IFS doesn't contain spaces.
2445 typeset -h IFS
2446 fi
2447 local cur words cword prev
2448 _get_comp_words_by_ref -n =: cur words cword prev
2449 $1
2450}
2451
2452# Setup completion for certain functions defined above by setting common
2453# variables and workarounds.
2454# This is NOT a public function; use at your own risk.
2455__git_complete ()
2456{
2457 local wrapper="__git_wrap${2}"
2458 eval "$wrapper () { __git_func_wrap $2 ; }"
2459 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2460 || complete -o default -o nospace -F $wrapper $1
2461}
2462
b0a4b2d2
FC
2463# wrapper for backwards compatibility
2464_git ()
2465{
93b291e0 2466 __git_wrap__git_main
b0a4b2d2
FC
2467}
2468
2469# wrapper for backwards compatibility
2470_gitk ()
2471{
93b291e0 2472 __git_wrap__gitk_main
b0a4b2d2
FC
2473}
2474
93b291e0
SG
2475__git_complete git __git_main
2476__git_complete gitk __gitk_main
690d8824
JH
2477
2478# The following are necessary only for Cygwin, and only are needed
2479# when the user has tab-completed the executable name and consequently
2480# included the '.exe' suffix.
2481#
76c3eb51 2482if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
93b291e0 2483__git_complete git.exe __git_main
76c3eb51 2484fi