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