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