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