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