]> git.ipfire.org Git - thirdparty/git.git/blame - contrib/completion/git-completion.bash
pay attention to DESTDIR when building with NO_PERL_MAKEMAKER
[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
SP
498 local i IFS=" "$'\n'
499 for i in $(git help -a|egrep '^ ')
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
TZ
604 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
605 i="${i#alias.}"
606 echo "${i/ */}"
56fc25f2 607 done
367dce2a
DS
608}
609
a42577d4 610# __git_aliased_command requires 1 argument
367dce2a
DS
611__git_aliased_command ()
612{
873537fa 613 local word cmdline=$(git --git-dir="$(__gitdir)" \
e0d10e1c 614 config --get "alias.$1")
367dce2a
DS
615 for word in $cmdline; do
616 if [ "${word##-*}" ]; then
617 echo $word
618 return
619 fi
620 done
621}
622
a42577d4 623# __git_find_subcommand requires 1 argument
3ff1320d
SG
624__git_find_subcommand ()
625{
626 local word subcommand c=1
627
628 while [ $c -lt $COMP_CWORD ]; do
629 word="${COMP_WORDS[c]}"
630 for subcommand in $1; do
631 if [ "$subcommand" = "$word" ]; then
632 echo "$subcommand"
633 return
634 fi
635 done
636 c=$((++c))
637 done
638}
639
d773c631
SG
640__git_has_doubledash ()
641{
642 local c=1
643 while [ $c -lt $COMP_CWORD ]; do
644 if [ "--" = "${COMP_WORDS[c]}" ]; then
645 return 0
646 fi
647 c=$((++c))
648 done
649 return 1
650}
651
7950659d 652__git_whitespacelist="nowarn warn error error-all fix"
88329195
SP
653
654_git_am ()
655{
28ed6e7b 656 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
51ef1daa 657 if [ -d "$dir"/rebase-apply ]; then
a31c00b0 658 __gitcomp "--skip --resolved --abort"
88329195
SP
659 return
660 fi
661 case "$cur" in
662 --whitespace=*)
b3391775 663 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
664 return
665 ;;
666 --*)
b3391775 667 __gitcomp "
43acdf24 668 --3way --committer-date-is-author-date --ignore-date
86c91f91 669 --ignore-whitespace --ignore-space-change
43acdf24 670 --interactive --keep --no-utf8 --signoff --utf8
88329195 671 --whitespace=
b3391775 672 "
88329195
SP
673 return
674 esac
675 COMPREPLY=()
676}
677
678_git_apply ()
679{
680 local cur="${COMP_WORDS[COMP_CWORD]}"
681 case "$cur" in
682 --whitespace=*)
b3391775 683 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
684 return
685 ;;
686 --*)
b3391775 687 __gitcomp "
88329195
SP
688 --stat --numstat --summary --check --index
689 --cached --index-info --reverse --reject --unidiff-zero
690 --apply --no-add --exclude=
86c91f91 691 --ignore-whitespace --ignore-space-change
88329195 692 --whitespace= --inaccurate-eof --verbose
b3391775 693 "
88329195
SP
694 return
695 esac
696 COMPREPLY=()
697}
698
8435b548
SP
699_git_add ()
700{
d773c631
SG
701 __git_has_doubledash && return
702
8435b548
SP
703 local cur="${COMP_WORDS[COMP_CWORD]}"
704 case "$cur" in
705 --*)
1d284cba
SG
706 __gitcomp "
707 --interactive --refresh --patch --update --dry-run
c9a114b5 708 --ignore-errors --intent-to-add
1d284cba 709 "
8435b548
SP
710 return
711 esac
712 COMPREPLY=()
713}
714
b3191ce2
LM
715_git_archive ()
716{
717 local cur="${COMP_WORDS[COMP_CWORD]}"
718 case "$cur" in
719 --format=*)
720 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
721 return
722 ;;
723 --remote=*)
724 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
725 return
726 ;;
727 --*)
728 __gitcomp "
729 --format= --list --verbose
730 --prefix= --remote= --exec=
731 "
732 return
733 ;;
734 esac
735 __git_complete_file
736}
737
b2e69f62
SP
738_git_bisect ()
739{
d773c631
SG
740 __git_has_doubledash && return
741
bf11d461 742 local subcommands="start bad good skip reset visualize replay log run"
3ff1320d
SG
743 local subcommand="$(__git_find_subcommand "$subcommands")"
744 if [ -z "$subcommand" ]; then
745 __gitcomp "$subcommands"
b2e69f62
SP
746 return
747 fi
748
3ff1320d 749 case "$subcommand" in
bf11d461 750 bad|good|reset|skip)
b2e69f62
SP
751 __gitcomp "$(__git_refs)"
752 ;;
753 *)
754 COMPREPLY=()
755 ;;
756 esac
757}
758
690d8824
JH
759_git_branch ()
760{
b9217642
SG
761 local i c=1 only_local_ref="n" has_r="n"
762
763 while [ $c -lt $COMP_CWORD ]; do
764 i="${COMP_WORDS[c]}"
765 case "$i" in
766 -d|-m) only_local_ref="y" ;;
767 -r) has_r="y" ;;
768 esac
769 c=$((++c))
770 done
771
3b376b0c 772 case "${COMP_WORDS[COMP_CWORD]}" in
3b376b0c
SG
773 --*)
774 __gitcomp "
775 --color --no-color --verbose --abbrev= --no-abbrev
50e61025 776 --track --no-track --contains --merged --no-merged
3b376b0c
SG
777 "
778 ;;
b9217642
SG
779 *)
780 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
781 __gitcomp "$(__git_heads)"
782 else
783 __gitcomp "$(__git_refs)"
784 fi
785 ;;
3b376b0c 786 esac
690d8824
JH
787}
788
374a58c9
ML
789_git_bundle ()
790{
8d8163f3
SG
791 local cmd="${COMP_WORDS[2]}"
792 case "$COMP_CWORD" in
793 2)
374a58c9
ML
794 __gitcomp "create list-heads verify unbundle"
795 ;;
8d8163f3 796 3)
374a58c9
ML
797 # looking for a file
798 ;;
799 *)
800 case "$cmd" in
801 create)
802 __git_complete_revlist
803 ;;
804 esac
805 ;;
806 esac
807}
808
690d8824
JH
809_git_checkout ()
810{
c84bb14c
SG
811 __git_has_doubledash && return
812
b3391775 813 __gitcomp "$(__git_refs)"
690d8824
JH
814}
815
d8a9fea5
SP
816_git_cherry ()
817{
818 __gitcomp "$(__git_refs)"
819}
820
1273231e
SP
821_git_cherry_pick ()
822{
823 local cur="${COMP_WORDS[COMP_CWORD]}"
824 case "$cur" in
825 --*)
b3391775 826 __gitcomp "--edit --no-commit"
1273231e
SP
827 ;;
828 *)
b3391775 829 __gitcomp "$(__git_refs)"
1273231e
SP
830 ;;
831 esac
832}
833
4181c7e8
LM
834_git_clean ()
835{
836 __git_has_doubledash && return
837
838 local cur="${COMP_WORDS[COMP_CWORD]}"
839 case "$cur" in
840 --*)
841 __gitcomp "--dry-run --quiet"
842 return
843 ;;
844 esac
845 COMPREPLY=()
846}
847
3eb11012
LM
848_git_clone ()
849{
850 local cur="${COMP_WORDS[COMP_CWORD]}"
851 case "$cur" in
852 --*)
853 __gitcomp "
854 --local
855 --no-hardlinks
856 --shared
857 --reference
858 --quiet
859 --no-checkout
860 --bare
861 --mirror
862 --origin
863 --upload-pack
864 --template=
865 --depth
866 "
867 return
868 ;;
869 esac
870 COMPREPLY=()
871}
872
4548e855
SP
873_git_commit ()
874{
d773c631
SG
875 __git_has_doubledash && return
876
4548e855
SP
877 local cur="${COMP_WORDS[COMP_CWORD]}"
878 case "$cur" in
879 --*)
b3391775 880 __gitcomp "
4548e855 881 --all --author= --signoff --verify --no-verify
aa5735be 882 --edit --amend --include --only --interactive
b3391775 883 "
4548e855
SP
884 return
885 esac
886 COMPREPLY=()
887}
888
217926c0
SP
889_git_describe ()
890{
cbb504c9
TR
891 local cur="${COMP_WORDS[COMP_CWORD]}"
892 case "$cur" in
893 --*)
894 __gitcomp "
895 --all --tags --contains --abbrev= --candidates=
896 --exact-match --debug --long --match --always
897 "
898 return
899 esac
217926c0
SP
900 __gitcomp "$(__git_refs)"
901}
902
20bf7292 903__git_diff_common_options="--stat --numstat --shortstat --summary
b3a4f858
JS
904 --patch-with-stat --name-only --name-status --color
905 --no-color --color-words --no-renames --check
f135aacb 906 --full-index --binary --abbrev --diff-filter=
47d5a8fa 907 --find-copies-harder
b3a4f858
JS
908 --text --ignore-space-at-eol --ignore-space-change
909 --ignore-all-space --exit-code --quiet --ext-diff
aba201c6
PO
910 --no-ext-diff
911 --no-prefix --src-prefix= --dst-prefix=
6d0e674a 912 --inter-hunk-context=
cc545709 913 --patience
20bf7292
TR
914 --raw
915"
916
917_git_diff ()
918{
919 __git_has_doubledash && return
920
921 local cur="${COMP_WORDS[COMP_CWORD]}"
922 case "$cur" in
923 --*)
ebd15bf0 924 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
20bf7292
TR
925 --base --ours --theirs
926 $__git_diff_common_options
aba201c6 927 "
b3a4f858
JS
928 return
929 ;;
930 esac
690d8824
JH
931 __git_complete_file
932}
933
e2dc2de9 934__git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
b6f0621a 935 tkdiff vimdiff gvimdiff xxdiff araxis
e2dc2de9
DA
936"
937
938_git_difftool ()
939{
940 local cur="${COMP_WORDS[COMP_CWORD]}"
941 case "$cur" in
942 --tool=*)
943 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
944 return
945 ;;
946 --*)
947 __gitcomp "--tool="
948 return
949 ;;
950 esac
951 COMPREPLY=()
952}
953
0a4e1472
JS
954__git_fetch_options="
955 --quiet --verbose --append --upload-pack --force --keep --depth=
956 --tags --no-tags
957"
958
690d8824
JH
959_git_fetch ()
960{
0a4e1472
JS
961 local cur="${COMP_WORDS[COMP_CWORD]}"
962 case "$cur" in
963 --*)
964 __gitcomp "$__git_fetch_options"
965 return
966 ;;
967 esac
52d5c3b5 968 __git_complete_remote_or_refspec
690d8824
JH
969}
970
f53352fb
SP
971_git_format_patch ()
972{
973 local cur="${COMP_WORDS[COMP_CWORD]}"
974 case "$cur" in
e1d37937
SB
975 --thread=*)
976 __gitcomp "
977 deep shallow
978 " "" "${cur##--thread=}"
979 return
980 ;;
f53352fb 981 --*)
b3391775 982 __gitcomp "
e1d37937 983 --stdout --attach --no-attach --thread --thread=
f53352fb
SP
984 --output-directory
985 --numbered --start-number
47e98eec 986 --numbered-files
f53352fb
SP
987 --keep-subject
988 --signoff
3f7df3a7 989 --in-reply-to= --cc=
f53352fb 990 --full-index --binary
ec804891 991 --not --all
be5f5bf0 992 --cover-letter
aba201c6 993 --no-prefix --src-prefix= --dst-prefix=
81085134
SG
994 --inline --suffix= --ignore-if-in-upstream
995 --subject-prefix=
b3391775 996 "
f53352fb
SP
997 return
998 ;;
999 esac
1000 __git_complete_revlist
1001}
1002
4bca8636
AJ
1003_git_fsck ()
1004{
1005 local cur="${COMP_WORDS[COMP_CWORD]}"
1006 case "$cur" in
1007 --*)
1008 __gitcomp "
1009 --tags --root --unreachable --cache --no-reflogs --full
1010 --strict --verbose --lost-found
1011 "
1012 return
1013 ;;
1014 esac
1015 COMPREPLY=()
1016}
1017
b26c8748
SP
1018_git_gc ()
1019{
1020 local cur="${COMP_WORDS[COMP_CWORD]}"
1021 case "$cur" in
1022 --*)
47e98eec 1023 __gitcomp "--prune --aggressive"
b26c8748
SP
1024 return
1025 ;;
1026 esac
1027 COMPREPLY=()
1028}
1029
c72e0db1
LM
1030_git_grep ()
1031{
1032 __git_has_doubledash && return
1033
1034 local cur="${COMP_WORDS[COMP_CWORD]}"
1035 case "$cur" in
1036 --*)
1037 __gitcomp "
1038 --cached
1039 --text --ignore-case --word-regexp --invert-match
1040 --full-name
1041 --extended-regexp --basic-regexp --fixed-strings
1042 --files-with-matches --name-only
1043 --files-without-match
a91f453f 1044 --max-depth
c72e0db1
LM
1045 --count
1046 --and --or --not --all-match
1047 "
1048 return
1049 ;;
1050 esac
1051 COMPREPLY=()
1052}
1053
1eb7e2f8
LM
1054_git_help ()
1055{
1056 local cur="${COMP_WORDS[COMP_CWORD]}"
1057 case "$cur" in
1058 --*)
1059 __gitcomp "--all --info --man --web"
1060 return
1061 ;;
1062 esac
2946cccf
MG
1063 __gitcomp "$(__git_all_commands)
1064 attributes cli core-tutorial cvs-migration
1065 diffcore gitk glossary hooks ignore modules
1066 repository-layout tutorial tutorial-2
99f0b599 1067 workflows
2946cccf 1068 "
1eb7e2f8
LM
1069}
1070
5dad868b
LM
1071_git_init ()
1072{
1073 local cur="${COMP_WORDS[COMP_CWORD]}"
1074 case "$cur" in
1075 --shared=*)
1076 __gitcomp "
1077 false true umask group all world everybody
1078 " "" "${cur##--shared=}"
1079 return
1080 ;;
1081 --*)
1082 __gitcomp "--quiet --bare --template= --shared --shared="
1083 return
1084 ;;
1085 esac
1086 COMPREPLY=()
1087}
1088
b1bc1494
LM
1089_git_ls_files ()
1090{
1091 __git_has_doubledash && return
1092
1093 local cur="${COMP_WORDS[COMP_CWORD]}"
1094 case "$cur" in
1095 --*)
1096 __gitcomp "--cached --deleted --modified --others --ignored
1097 --stage --directory --no-empty-directory --unmerged
1098 --killed --exclude= --exclude-from=
1099 --exclude-per-directory= --exclude-standard
1100 --error-unmatch --with-tree= --full-name
1101 --abbrev --ignored --exclude-per-directory
1102 "
1103 return
1104 ;;
1105 esac
1106 COMPREPLY=()
1107}
1108
690d8824
JH
1109_git_ls_remote ()
1110{
b3391775 1111 __gitcomp "$(__git_remotes)"
690d8824
JH
1112}
1113
1114_git_ls_tree ()
1115{
1116 __git_complete_file
1117}
1118
a393777e
TR
1119# Options that go well for log, shortlog and gitk
1120__git_log_common_options="
1121 --not --all
1122 --branches --tags --remotes
4fe1a619 1123 --first-parent --merges --no-merges
a393777e
TR
1124 --max-count=
1125 --max-age= --since= --after=
1126 --min-age= --until= --before=
1127"
1128# Options that go well for log and gitk (not shortlog)
1129__git_log_gitk_options="
1130 --dense --sparse --full-history
1131 --simplify-merges --simplify-by-decoration
1132 --left-right
1133"
1134# Options that go well for log and shortlog (not gitk)
1135__git_log_shortlog_options="
1136 --author= --committer= --grep=
1137 --all-match
1138"
1139
3d279863 1140__git_log_pretty_formats="oneline short medium full fuller email raw format:"
672c68cb 1141__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
3d279863 1142
690d8824
JH
1143_git_log ()
1144{
d773c631
SG
1145 __git_has_doubledash && return
1146
6e31b866 1147 local cur="${COMP_WORDS[COMP_CWORD]}"
bf3c20f6
TR
1148 local g="$(git rev-parse --git-dir 2>/dev/null)"
1149 local merge=""
ba7906f2 1150 if [ -f "$g/MERGE_HEAD" ]; then
bf3c20f6
TR
1151 merge="--merge"
1152 fi
6e31b866
SP
1153 case "$cur" in
1154 --pretty=*)
3d279863 1155 __gitcomp "$__git_log_pretty_formats
b3391775 1156 " "" "${cur##--pretty=}"
6e31b866
SP
1157 return
1158 ;;
72de29c2
TL
1159 --format=*)
1160 __gitcomp "$__git_log_pretty_formats
1161 " "" "${cur##--format=}"
1162 return
1163 ;;
47e98eec 1164 --date=*)
672c68cb 1165 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
47e98eec
SP
1166 return
1167 ;;
6e31b866 1168 --*)
b3391775 1169 __gitcomp "
a393777e
TR
1170 $__git_log_common_options
1171 $__git_log_shortlog_options
1172 $__git_log_gitk_options
8f87fae6 1173 --root --topo-order --date-order --reverse
5d0e6343 1174 --follow --full-diff
6e31b866 1175 --abbrev-commit --abbrev=
47e98eec 1176 --relative-date --date=
72de29c2 1177 --pretty= --format= --oneline
a393777e 1178 --cherry-pick
20827d99 1179 --graph
20bf7292
TR
1180 --decorate
1181 --walk-reflogs
a393777e 1182 --parents --children
bf3c20f6 1183 $merge
20bf7292 1184 $__git_diff_common_options
47d5a8fa 1185 --pickaxe-all --pickaxe-regex
b3391775 1186 "
6e31b866
SP
1187 return
1188 ;;
1189 esac
f53352fb 1190 __git_complete_revlist
690d8824
JH
1191}
1192
0a4e1472
JS
1193__git_merge_options="
1194 --no-commit --no-stat --log --no-log --squash --strategy
1195 --commit --stat --no-squash --ff --no-ff
1196"
1197
4ad91321
SP
1198_git_merge ()
1199{
3c7b480a
JS
1200 __git_complete_strategy && return
1201
4ad91321
SP
1202 local cur="${COMP_WORDS[COMP_CWORD]}"
1203 case "$cur" in
1204 --*)
0a4e1472 1205 __gitcomp "$__git_merge_options"
4ad91321
SP
1206 return
1207 esac
b3391775 1208 __gitcomp "$(__git_refs)"
4ad91321
SP
1209}
1210
b4c72162
LM
1211_git_mergetool ()
1212{
1213 local cur="${COMP_WORDS[COMP_CWORD]}"
1214 case "$cur" in
1215 --tool=*)
e2dc2de9 1216 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
b4c72162
LM
1217 return
1218 ;;
1219 --*)
1220 __gitcomp "--tool="
1221 return
1222 ;;
1223 esac
1224 COMPREPLY=()
1225}
1226
690d8824
JH
1227_git_merge_base ()
1228{
b3391775 1229 __gitcomp "$(__git_refs)"
690d8824
JH
1230}
1231
1127c51c
LM
1232_git_mv ()
1233{
1234 local cur="${COMP_WORDS[COMP_CWORD]}"
1235 case "$cur" in
1236 --*)
1237 __gitcomp "--dry-run"
1238 return
1239 ;;
1240 esac
1241 COMPREPLY=()
1242}
1243
d33909bf
SP
1244_git_name_rev ()
1245{
b3391775 1246 __gitcomp "--tags --all --stdin"
d33909bf
SP
1247}
1248
690d8824
JH
1249_git_pull ()
1250{
0a4e1472
JS
1251 __git_complete_strategy && return
1252
1253 local cur="${COMP_WORDS[COMP_CWORD]}"
1254 case "$cur" in
1255 --*)
1256 __gitcomp "
1257 --rebase --no-rebase
1258 $__git_merge_options
1259 $__git_fetch_options
1260 "
1261 return
1262 ;;
1263 esac
52d5c3b5 1264 __git_complete_remote_or_refspec
690d8824
JH
1265}
1266
1267_git_push ()
1268{
0a4e1472
JS
1269 local cur="${COMP_WORDS[COMP_CWORD]}"
1270 case "${COMP_WORDS[COMP_CWORD-1]}" in
1271 --repo)
1272 __gitcomp "$(__git_remotes)"
1273 return
1274 esac
1275 case "$cur" in
1276 --repo=*)
1277 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1278 return
1279 ;;
1280 --*)
1281 __gitcomp "
1282 --all --mirror --tags --dry-run --force --verbose
1283 --receive-pack= --repo=
1284 "
1285 return
1286 ;;
1287 esac
52d5c3b5 1288 __git_complete_remote_or_refspec
690d8824
JH
1289}
1290
61d926a3
SP
1291_git_rebase ()
1292{
51fe1209 1293 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
51ef1daa 1294 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
b3391775 1295 __gitcomp "--continue --skip --abort"
61d926a3
SP
1296 return
1297 fi
3c7b480a 1298 __git_complete_strategy && return
61d926a3
SP
1299 case "$cur" in
1300 --*)
d9e3b702 1301 __gitcomp "--onto --merge --strategy --interactive"
61d926a3
SP
1302 return
1303 esac
b3391775 1304 __gitcomp "$(__git_refs)"
61d926a3
SP
1305}
1306
ae616de6 1307__git_send_email_confirm_options="always never auto cc compose"
cb8a9bd5 1308__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
ae616de6 1309
25a1f374
TL
1310_git_send_email ()
1311{
1312 local cur="${COMP_WORDS[COMP_CWORD]}"
1313 case "$cur" in
ae616de6
SB
1314 --confirm=*)
1315 __gitcomp "
1316 $__git_send_email_confirm_options
1317 " "" "${cur##--confirm=}"
1318 return
1319 ;;
1320 --suppress-cc=*)
1321 __gitcomp "
1322 $__git_send_email_suppresscc_options
1323 " "" "${cur##--suppress-cc=}"
1324
1325 return
1326 ;;
1327 --smtp-encryption=*)
1328 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1329 return
1330 ;;
25a1f374 1331 --*)
77813151 1332 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
ae616de6
SB
1333 --compose --confirm= --dry-run --envelope-sender
1334 --from --identity
25a1f374
TL
1335 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1336 --no-suppress-from --no-thread --quiet
1337 --signed-off-by-cc --smtp-pass --smtp-server
ae616de6
SB
1338 --smtp-server-port --smtp-encryption= --smtp-user
1339 --subject --suppress-cc= --suppress-from --thread --to
fd3a8dcb 1340 --validate --no-validate"
25a1f374
TL
1341 return
1342 ;;
1343 esac
1344 COMPREPLY=()
1345}
1346
00652369
SB
1347__git_config_get_set_variables ()
1348{
1349 local prevword word config_file= c=$COMP_CWORD
1350 while [ $c -gt 1 ]; do
1351 word="${COMP_WORDS[c]}"
1352 case "$word" in
1353 --global|--system|--file=*)
1354 config_file="$word"
1355 break
1356 ;;
1357 -f|--file)
1358 config_file="$word $prevword"
1359 break
1360 ;;
1361 esac
1362 prevword=$word
1363 c=$((--c))
1364 done
1365
f581de1b
SB
1366 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1367 while read line
1368 do
1369 case "$line" in
1370 *.*=*)
1371 echo "${line/=*/}"
00652369
SB
1372 ;;
1373 esac
1374 done
1375}
1376
e0d10e1c 1377_git_config ()
5de40f59
SP
1378{
1379 local cur="${COMP_WORDS[COMP_CWORD]}"
1380 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1381 case "$prv" in
1382 branch.*.remote)
78d4d6a2 1383 __gitcomp "$(__git_remotes)"
5de40f59
SP
1384 return
1385 ;;
1386 branch.*.merge)
78d4d6a2 1387 __gitcomp "$(__git_refs)"
5de40f59
SP
1388 return
1389 ;;
1390 remote.*.fetch)
1391 local remote="${prv#remote.}"
1392 remote="${remote%.fetch}"
78d4d6a2 1393 __gitcomp "$(__git_refs_remotes "$remote")"
5de40f59
SP
1394 return
1395 ;;
1396 remote.*.push)
1397 local remote="${prv#remote.}"
1398 remote="${remote%.push}"
78d4d6a2 1399 __gitcomp "$(git --git-dir="$(__gitdir)" \
5de40f59 1400 for-each-ref --format='%(refname):%(refname)' \
78d4d6a2
SP
1401 refs/heads)"
1402 return
1403 ;;
1404 pull.twohead|pull.octopus)
1405 __gitcomp "$(__git_merge_strategies)"
1406 return
1407 ;;
6123d719
MH
1408 color.branch|color.diff|color.interactive|\
1409 color.showbranch|color.status|color.ui)
78d4d6a2
SP
1410 __gitcomp "always never auto"
1411 return
1412 ;;
901d615c
MK
1413 color.pager)
1414 __gitcomp "false true"
1415 return
1416 ;;
78d4d6a2
SP
1417 color.*.*)
1418 __gitcomp "
98171a07 1419 normal black red green yellow blue magenta cyan white
78d4d6a2
SP
1420 bold dim ul blink reverse
1421 "
5de40f59
SP
1422 return
1423 ;;
9b82d63b
SB
1424 help.format)
1425 __gitcomp "man info web html"
1426 return
1427 ;;
672c68cb
SB
1428 log.date)
1429 __gitcomp "$__git_log_date_formats"
1430 return
1431 ;;
ae616de6
SB
1432 sendemail.aliasesfiletype)
1433 __gitcomp "mutt mailrc pine elm gnus"
1434 return
1435 ;;
1436 sendemail.confirm)
1437 __gitcomp "$__git_send_email_confirm_options"
1438 return
1439 ;;
1440 sendemail.suppresscc)
1441 __gitcomp "$__git_send_email_suppresscc_options"
1442 return
1443 ;;
00652369
SB
1444 --get|--get-all|--unset|--unset-all)
1445 __gitcomp "$(__git_config_get_set_variables)"
1446 return
1447 ;;
5de40f59
SP
1448 *.*)
1449 COMPREPLY=()
1450 return
1451 ;;
1452 esac
1453 case "$cur" in
1454 --*)
78d4d6a2 1455 __gitcomp "
47e98eec 1456 --global --system --file=
12977705 1457 --list --replace-all
5de40f59 1458 --get --get-all --get-regexp
1b71eb35 1459 --add --unset --unset-all
12977705 1460 --remove-section --rename-section
78d4d6a2 1461 "
5de40f59
SP
1462 return
1463 ;;
1464 branch.*.*)
1465 local pfx="${cur%.*}."
1466 cur="${cur##*.}"
6fac1b83 1467 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
5de40f59
SP
1468 return
1469 ;;
1470 branch.*)
1471 local pfx="${cur%.*}."
1472 cur="${cur#*.}"
78d4d6a2 1473 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
5de40f59
SP
1474 return
1475 ;;
0aa62fd0
SB
1476 guitool.*.*)
1477 local pfx="${cur%.*}."
1478 cur="${cur##*.}"
1479 __gitcomp "
1480 argprompt cmd confirm needsfile noconsole norescan
1481 prompt revprompt revunmerged title
1482 " "$pfx" "$cur"
1483 return
1484 ;;
1485 difftool.*.*)
1486 local pfx="${cur%.*}."
1487 cur="${cur##*.}"
1488 __gitcomp "cmd path" "$pfx" "$cur"
1489 return
1490 ;;
1491 man.*.*)
1492 local pfx="${cur%.*}."
1493 cur="${cur##*.}"
1494 __gitcomp "cmd path" "$pfx" "$cur"
1495 return
1496 ;;
1497 mergetool.*.*)
1498 local pfx="${cur%.*}."
1499 cur="${cur##*.}"
1500 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1501 return
1502 ;;
1503 pager.*)
1504 local pfx="${cur%.*}."
1505 cur="${cur#*.}"
1506 __gitcomp "$(__git_all_commands)" "$pfx" "$cur"
1507 return
1508 ;;
5de40f59
SP
1509 remote.*.*)
1510 local pfx="${cur%.*}."
1511 cur="${cur##*.}"
12977705 1512 __gitcomp "
98171a07 1513 url proxy fetch push mirror skipDefaultUpdate
6fac1b83 1514 receivepack uploadpack tagopt pushurl
12977705 1515 " "$pfx" "$cur"
5de40f59
SP
1516 return
1517 ;;
1518 remote.*)
1519 local pfx="${cur%.*}."
1520 cur="${cur#*.}"
78d4d6a2 1521 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
5de40f59
SP
1522 return
1523 ;;
0aa62fd0
SB
1524 url.*.*)
1525 local pfx="${cur%.*}."
1526 cur="${cur##*.}"
1c2eafb8 1527 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur"
0aa62fd0
SB
1528 return
1529 ;;
5de40f59 1530 esac
78d4d6a2 1531 __gitcomp "
6fac1b83 1532 add.ignore-errors
226b343c 1533 alias.
86c91f91 1534 apply.ignorewhitespace
5de40f59 1535 apply.whitespace
98171a07
LM
1536 branch.autosetupmerge
1537 branch.autosetuprebase
2122591b 1538 clean.requireForce
78d4d6a2
SP
1539 color.branch
1540 color.branch.current
1541 color.branch.local
78d4d6a2 1542 color.branch.plain
025a1929 1543 color.branch.remote
a159ca0c 1544 color.diff
025a1929 1545 color.diff.commit
78d4d6a2 1546 color.diff.frag
025a1929 1547 color.diff.meta
78d4d6a2 1548 color.diff.new
025a1929
LM
1549 color.diff.old
1550 color.diff.plain
78d4d6a2 1551 color.diff.whitespace
226b343c
SB
1552 color.grep
1553 color.grep.external
1554 color.grep.match
98171a07
LM
1555 color.interactive
1556 color.interactive.header
1557 color.interactive.help
1558 color.interactive.prompt
a159ca0c 1559 color.pager
6123d719 1560 color.showbranch
a159ca0c 1561 color.status
78d4d6a2
SP
1562 color.status.added
1563 color.status.changed
025a1929 1564 color.status.header
98171a07 1565 color.status.nobranch
78d4d6a2 1566 color.status.untracked
98171a07
LM
1567 color.status.updated
1568 color.ui
1569 commit.template
1570 core.autocrlf
1571 core.bare
025a1929 1572 core.compression
226b343c 1573 core.createObject
98171a07
LM
1574 core.deltaBaseCacheLimit
1575 core.editor
1576 core.excludesfile
025a1929 1577 core.fileMode
98171a07 1578 core.fsyncobjectfiles
025a1929 1579 core.gitProxy
98171a07 1580 core.ignoreCygwinFSTricks
025a1929
LM
1581 core.ignoreStat
1582 core.logAllRefUpdates
1583 core.loosecompression
1584 core.packedGitLimit
1585 core.packedGitWindowSize
98171a07 1586 core.pager
025a1929 1587 core.preferSymlinkRefs
98171a07
LM
1588 core.preloadindex
1589 core.quotepath
025a1929 1590 core.repositoryFormatVersion
98171a07 1591 core.safecrlf
025a1929 1592 core.sharedRepository
98171a07
LM
1593 core.symlinks
1594 core.trustctime
025a1929 1595 core.warnAmbiguousRefs
98171a07
LM
1596 core.whitespace
1597 core.worktree
1598 diff.autorefreshindex
1599 diff.external
1600 diff.mnemonicprefix
78d4d6a2 1601 diff.renameLimit
98171a07 1602 diff.renameLimit.
78d4d6a2 1603 diff.renames
226b343c
SB
1604 diff.suppressBlankEmpty
1605 diff.tool
1606 diff.wordRegex
0aa62fd0 1607 difftool.
226b343c 1608 difftool.prompt
78d4d6a2 1609 fetch.unpackLimit
226b343c
SB
1610 format.attach
1611 format.cc
78d4d6a2 1612 format.headers
98171a07
LM
1613 format.numbered
1614 format.pretty
226b343c
SB
1615 format.signoff
1616 format.subjectprefix
98171a07 1617 format.suffix
226b343c 1618 format.thread
98171a07
LM
1619 gc.aggressiveWindow
1620 gc.auto
1621 gc.autopacklimit
12977705 1622 gc.packrefs
98171a07 1623 gc.pruneexpire
78d4d6a2
SP
1624 gc.reflogexpire
1625 gc.reflogexpireunreachable
1626 gc.rerereresolved
1627 gc.rerereunresolved
025a1929 1628 gitcvs.allbinary
226b343c 1629 gitcvs.commitmsgannotation
98171a07 1630 gitcvs.dbTableNamePrefix
025a1929
LM
1631 gitcvs.dbdriver
1632 gitcvs.dbname
1633 gitcvs.dbpass
025a1929
LM
1634 gitcvs.dbuser
1635 gitcvs.enabled
1636 gitcvs.logfile
98171a07 1637 gitcvs.usecrlfattr
0aa62fd0 1638 guitool.
98171a07
LM
1639 gui.blamehistoryctx
1640 gui.commitmsgwidth
1641 gui.copyblamethreshold
1642 gui.diffcontext
1643 gui.encoding
1644 gui.fastcopyblame
1645 gui.matchtrackingbranch
1646 gui.newbranchtemplate
1647 gui.pruneduringfetch
1648 gui.spellingdictionary
1649 gui.trustmtime
1650 help.autocorrect
1651 help.browser
1652 help.format
78d4d6a2
SP
1653 http.lowSpeedLimit
1654 http.lowSpeedTime
025a1929 1655 http.maxRequests
5de40f59 1656 http.noEPSV
98171a07 1657 http.proxy
025a1929
LM
1658 http.sslCAInfo
1659 http.sslCAPath
1660 http.sslCert
1661 http.sslKey
1662 http.sslVerify
78d4d6a2
SP
1663 i18n.commitEncoding
1664 i18n.logOutputEncoding
226b343c
SB
1665 imap.folder
1666 imap.host
1667 imap.pass
1668 imap.port
1669 imap.preformattedHTML
1670 imap.sslverify
1671 imap.tunnel
1672 imap.user
98171a07
LM
1673 instaweb.browser
1674 instaweb.httpd
1675 instaweb.local
1676 instaweb.modulepath
1677 instaweb.port
226b343c 1678 interactive.singlekey
98171a07 1679 log.date
78d4d6a2 1680 log.showroot
226b343c 1681 mailmap.file
0aa62fd0 1682 man.
98171a07
LM
1683 man.viewer
1684 merge.conflictstyle
1685 merge.log
1686 merge.renameLimit
1687 merge.stat
025a1929 1688 merge.tool
78d4d6a2 1689 merge.verbosity
0aa62fd0 1690 mergetool.
98171a07 1691 mergetool.keepBackup
226b343c 1692 mergetool.prompt
47e98eec 1693 pack.compression
47e98eec 1694 pack.deltaCacheLimit
025a1929
LM
1695 pack.deltaCacheSize
1696 pack.depth
98171a07
LM
1697 pack.indexVersion
1698 pack.packSizeLimit
1699 pack.threads
025a1929
LM
1700 pack.window
1701 pack.windowMemory
0aa62fd0 1702 pager.
78d4d6a2
SP
1703 pull.octopus
1704 pull.twohead
226b343c
SB
1705 push.default
1706 rebase.stat
98171a07
LM
1707 receive.denyCurrentBranch
1708 receive.denyDeletes
025a1929 1709 receive.denyNonFastForwards
98171a07 1710 receive.fsckObjects
025a1929 1711 receive.unpackLimit
98171a07
LM
1712 repack.usedeltabaseoffset
1713 rerere.autoupdate
1714 rerere.enabled
226b343c
SB
1715 sendemail.aliasesfile
1716 sendemail.aliasesfiletype
1717 sendemail.bcc
1718 sendemail.cc
1719 sendemail.cccmd
1720 sendemail.chainreplyto
1721 sendemail.confirm
1722 sendemail.envelopesender
1723 sendemail.multiedit
1724 sendemail.signedoffbycc
1725 sendemail.smtpencryption
1726 sendemail.smtppass
1727 sendemail.smtpserver
1728 sendemail.smtpserverport
1729 sendemail.smtpuser
1730 sendemail.suppresscc
1731 sendemail.suppressfrom
1732 sendemail.thread
1733 sendemail.to
1734 sendemail.validate
78d4d6a2 1735 showbranch.default
98171a07
LM
1736 status.relativePaths
1737 status.showUntrackedFiles
78d4d6a2
SP
1738 tar.umask
1739 transfer.unpackLimit
0aa62fd0 1740 url.
78d4d6a2 1741 user.email
025a1929 1742 user.name
78d4d6a2 1743 user.signingkey
98171a07 1744 web.browser
5de40f59 1745 branch. remote.
78d4d6a2 1746 "
5de40f59
SP
1747}
1748
88293c67
SP
1749_git_remote ()
1750{
bc14fac8 1751 local subcommands="add rename rm show prune update set-head"
3ff1320d
SG
1752 local subcommand="$(__git_find_subcommand "$subcommands")"
1753 if [ -z "$subcommand" ]; then
3903c618 1754 __gitcomp "$subcommands"
88293c67
SP
1755 return
1756 fi
1757
3ff1320d 1758 case "$subcommand" in
f135e72d 1759 rename|rm|show|prune)
88293c67
SP
1760 __gitcomp "$(__git_remotes)"
1761 ;;
fb72759b
SP
1762 update)
1763 local i c='' IFS=$'\n'
518ef8f0
TZ
1764 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
1765 i="${i#remotes.}"
1766 c="$c ${i/ */}"
fb72759b
SP
1767 done
1768 __gitcomp "$c"
1769 ;;
88293c67
SP
1770 *)
1771 COMPREPLY=()
1772 ;;
1773 esac
1774}
1775
67e78c3b
SP
1776_git_reset ()
1777{
d773c631
SG
1778 __git_has_doubledash && return
1779
67e78c3b 1780 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775
SP
1781 case "$cur" in
1782 --*)
e89e2ed7 1783 __gitcomp "--merge --mixed --hard --soft"
b3391775
SP
1784 return
1785 ;;
1786 esac
1787 __gitcomp "$(__git_refs)"
67e78c3b
SP
1788}
1789
a6c2be24
LM
1790_git_revert ()
1791{
1792 local cur="${COMP_WORDS[COMP_CWORD]}"
1793 case "$cur" in
1794 --*)
1795 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1796 return
1797 ;;
1798 esac
c0783837 1799 __gitcomp "$(__git_refs)"
a6c2be24
LM
1800}
1801
08c701d4
LM
1802_git_rm ()
1803{
1804 __git_has_doubledash && return
1805
1806 local cur="${COMP_WORDS[COMP_CWORD]}"
1807 case "$cur" in
1808 --*)
1809 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1810 return
1811 ;;
1812 esac
1813 COMPREPLY=()
1814}
1815
1fd6bec9
SP
1816_git_shortlog ()
1817{
d773c631
SG
1818 __git_has_doubledash && return
1819
1fd6bec9
SP
1820 local cur="${COMP_WORDS[COMP_CWORD]}"
1821 case "$cur" in
1822 --*)
1823 __gitcomp "
a393777e
TR
1824 $__git_log_common_options
1825 $__git_log_shortlog_options
1fd6bec9
SP
1826 --numbered --summary
1827 "
1828 return
1829 ;;
1830 esac
1831 __git_complete_revlist
1832}
1833
90131924
SP
1834_git_show ()
1835{
41d8cf7d
MH
1836 __git_has_doubledash && return
1837
90131924
SP
1838 local cur="${COMP_WORDS[COMP_CWORD]}"
1839 case "$cur" in
1840 --pretty=*)
3d279863 1841 __gitcomp "$__git_log_pretty_formats
b3391775 1842 " "" "${cur##--pretty=}"
90131924
SP
1843 return
1844 ;;
72de29c2
TL
1845 --format=*)
1846 __gitcomp "$__git_log_pretty_formats
1847 " "" "${cur##--format=}"
1848 return
1849 ;;
90131924 1850 --*)
076c3237 1851 __gitcomp "--pretty= --format= --abbrev-commit --oneline
20bf7292
TR
1852 $__git_diff_common_options
1853 "
90131924
SP
1854 return
1855 ;;
1856 esac
1857 __git_complete_file
1858}
1859
2ca880fe
TR
1860_git_show_branch ()
1861{
1862 local cur="${COMP_WORDS[COMP_CWORD]}"
1863 case "$cur" in
1864 --*)
1865 __gitcomp "
1866 --all --remotes --topo-order --current --more=
1867 --list --independent --merge-base --no-name
6123d719 1868 --color --no-color
076c3237 1869 --sha1-name --sparse --topics --reflog
2ca880fe
TR
1870 "
1871 return
1872 ;;
1873 esac
1874 __git_complete_revlist
1875}
1876
7fd53fce
JH
1877_git_stash ()
1878{
95d43780 1879 local subcommands='save list show apply clear drop pop create branch'
7bedebca
SG
1880 local subcommand="$(__git_find_subcommand "$subcommands")"
1881 if [ -z "$subcommand" ]; then
3ff1320d 1882 __gitcomp "$subcommands"
7bedebca
SG
1883 else
1884 local cur="${COMP_WORDS[COMP_CWORD]}"
1885 case "$subcommand,$cur" in
1886 save,--*)
1887 __gitcomp "--keep-index"
1888 ;;
8513c54b 1889 apply,--*|pop,--*)
95d43780
LM
1890 __gitcomp "--index"
1891 ;;
8513c54b 1892 show,--*|drop,--*|branch,--*)
95d43780
LM
1893 COMPREPLY=()
1894 ;;
1895 show,*|apply,*|drop,*|pop,*|branch,*)
1896 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1897 | sed -n -e 's/:.*//p')"
1898 ;;
7bedebca
SG
1899 *)
1900 COMPREPLY=()
1901 ;;
1902 esac
3ff1320d 1903 fi
7fd53fce
JH
1904}
1905
be86f7a0
SP
1906_git_submodule ()
1907{
d773c631
SG
1908 __git_has_doubledash && return
1909
1b0f7978 1910 local subcommands="add status init update summary foreach sync"
3ff1320d 1911 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
be86f7a0
SP
1912 local cur="${COMP_WORDS[COMP_CWORD]}"
1913 case "$cur" in
1914 --*)
1915 __gitcomp "--quiet --cached"
1916 ;;
1917 *)
3ff1320d 1918 __gitcomp "$subcommands"
be86f7a0
SP
1919 ;;
1920 esac
1921 return
1922 fi
1923}
1924
47f6ee28
SG
1925_git_svn ()
1926{
1927 local subcommands="
1928 init fetch clone rebase dcommit log find-rev
1929 set-tree commit-diff info create-ignore propget
4a5856cb
SG
1930 proplist show-ignore show-externals branch tag blame
1931 migrate
47f6ee28
SG
1932 "
1933 local subcommand="$(__git_find_subcommand "$subcommands")"
1934 if [ -z "$subcommand" ]; then
1935 __gitcomp "$subcommands"
1936 else
1937 local remote_opts="--username= --config-dir= --no-auth-cache"
1938 local fc_opts="
1939 --follow-parent --authors-file= --repack=
1940 --no-metadata --use-svm-props --use-svnsync-props
1941 --log-window-size= --no-checkout --quiet
4a5856cb
SG
1942 --repack-flags --use-log-author --localtime
1943 --ignore-paths= $remote_opts
47f6ee28
SG
1944 "
1945 local init_opts="
1946 --template= --shared= --trunk= --tags=
1947 --branches= --stdlayout --minimize-url
1948 --no-metadata --use-svm-props --use-svnsync-props
4a5856cb
SG
1949 --rewrite-root= --prefix= --use-log-author
1950 --add-author-from $remote_opts
47f6ee28
SG
1951 "
1952 local cmt_opts="
1953 --edit --rmdir --find-copies-harder --copy-similarity=
1954 "
1955
1956 local cur="${COMP_WORDS[COMP_CWORD]}"
1957 case "$subcommand,$cur" in
1958 fetch,--*)
1959 __gitcomp "--revision= --fetch-all $fc_opts"
1960 ;;
1961 clone,--*)
1962 __gitcomp "--revision= $fc_opts $init_opts"
1963 ;;
1964 init,--*)
1965 __gitcomp "$init_opts"
1966 ;;
1967 dcommit,--*)
1968 __gitcomp "
1969 --merge --strategy= --verbose --dry-run
4a5856cb
SG
1970 --fetch-all --no-rebase --commit-url
1971 --revision $cmt_opts $fc_opts
47f6ee28
SG
1972 "
1973 ;;
1974 set-tree,--*)
1975 __gitcomp "--stdin $cmt_opts $fc_opts"
1976 ;;
1977 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1978 show-externals,--*)
1979 __gitcomp "--revision="
1980 ;;
1981 log,--*)
1982 __gitcomp "
1983 --limit= --revision= --verbose --incremental
1984 --oneline --show-commit --non-recursive
4a5856cb 1985 --authors-file= --color
47f6ee28
SG
1986 "
1987 ;;
1988 rebase,--*)
1989 __gitcomp "
1990 --merge --verbose --strategy= --local
4a5856cb 1991 --fetch-all --dry-run $fc_opts
47f6ee28
SG
1992 "
1993 ;;
1994 commit-diff,--*)
1995 __gitcomp "--message= --file= --revision= $cmt_opts"
1996 ;;
1997 info,--*)
1998 __gitcomp "--url"
1999 ;;
4a5856cb
SG
2000 branch,--*)
2001 __gitcomp "--dry-run --message --tag"
2002 ;;
2003 tag,--*)
2004 __gitcomp "--dry-run --message"
2005 ;;
2006 blame,--*)
2007 __gitcomp "--git-format"
2008 ;;
2009 migrate,--*)
2010 __gitcomp "
2011 --config-dir= --ignore-paths= --minimize
2012 --no-auth-cache --username=
2013 "
2014 ;;
47f6ee28
SG
2015 *)
2016 COMPREPLY=()
2017 ;;
2018 esac
2019 fi
2020}
2021
88e21dc7
SP
2022_git_tag ()
2023{
2024 local i c=1 f=0
2025 while [ $c -lt $COMP_CWORD ]; do
2026 i="${COMP_WORDS[c]}"
2027 case "$i" in
2028 -d|-v)
2029 __gitcomp "$(__git_tags)"
2030 return
2031 ;;
2032 -f)
2033 f=1
2034 ;;
2035 esac
2036 c=$((++c))
2037 done
2038
2039 case "${COMP_WORDS[COMP_CWORD-1]}" in
2040 -m|-F)
2041 COMPREPLY=()
2042 ;;
8d8163f3 2043 -*|tag)
88e21dc7
SP
2044 if [ $f = 1 ]; then
2045 __gitcomp "$(__git_tags)"
2046 else
2047 COMPREPLY=()
2048 fi
2049 ;;
2050 *)
2051 __gitcomp "$(__git_refs)"
2052 ;;
2053 esac
2054}
2055
690d8824
JH
2056_git ()
2057{
873537fa
SP
2058 local i c=1 command __git_dir
2059
2060 while [ $c -lt $COMP_CWORD ]; do
2061 i="${COMP_WORDS[c]}"
2062 case "$i" in
2063 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2064 --bare) __git_dir="." ;;
1eb7e2f8
LM
2065 --version|-p|--paginate) ;;
2066 --help) command="help"; break ;;
873537fa
SP
2067 *) command="$i"; break ;;
2068 esac
2069 c=$((++c))
2070 done
2071
1d17b22e 2072 if [ -z "$command" ]; then
72e5e989 2073 case "${COMP_WORDS[COMP_CWORD]}" in
47e98eec 2074 --*) __gitcomp "
ce5a2c95 2075 --paginate
47e98eec
SP
2076 --no-pager
2077 --git-dir=
2078 --bare
2079 --version
2080 --exec-path
89a56bfb 2081 --html-path
ce5a2c95
TL
2082 --work-tree=
2083 --help
47e98eec
SP
2084 "
2085 ;;
1eb7e2f8 2086 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
72e5e989
SP
2087 esac
2088 return
873537fa 2089 fi
367dce2a 2090
873537fa
SP
2091 local expansion=$(__git_aliased_command "$command")
2092 [ "$expansion" ] && command="$expansion"
367dce2a 2093
873537fa 2094 case "$command" in
88329195 2095 am) _git_am ;;
8435b548 2096 add) _git_add ;;
88329195 2097 apply) _git_apply ;;
b3191ce2 2098 archive) _git_archive ;;
b2e69f62 2099 bisect) _git_bisect ;;
374a58c9 2100 bundle) _git_bundle ;;
873537fa 2101 branch) _git_branch ;;
873537fa 2102 checkout) _git_checkout ;;
d8a9fea5 2103 cherry) _git_cherry ;;
1273231e 2104 cherry-pick) _git_cherry_pick ;;
4181c7e8 2105 clean) _git_clean ;;
3eb11012 2106 clone) _git_clone ;;
4548e855 2107 commit) _git_commit ;;
e0d10e1c 2108 config) _git_config ;;
217926c0 2109 describe) _git_describe ;;
873537fa 2110 diff) _git_diff ;;
e2dc2de9 2111 difftool) _git_difftool ;;
873537fa 2112 fetch) _git_fetch ;;
f53352fb 2113 format-patch) _git_format_patch ;;
4bca8636 2114 fsck) _git_fsck ;;
b26c8748 2115 gc) _git_gc ;;
c72e0db1 2116 grep) _git_grep ;;
1eb7e2f8 2117 help) _git_help ;;
5dad868b 2118 init) _git_init ;;
873537fa 2119 log) _git_log ;;
b1bc1494 2120 ls-files) _git_ls_files ;;
873537fa
SP
2121 ls-remote) _git_ls_remote ;;
2122 ls-tree) _git_ls_tree ;;
4ad91321 2123 merge) _git_merge;;
b4c72162 2124 mergetool) _git_mergetool;;
873537fa 2125 merge-base) _git_merge_base ;;
1127c51c 2126 mv) _git_mv ;;
d33909bf 2127 name-rev) _git_name_rev ;;
873537fa
SP
2128 pull) _git_pull ;;
2129 push) _git_push ;;
61d926a3 2130 rebase) _git_rebase ;;
88293c67 2131 remote) _git_remote ;;
873537fa 2132 reset) _git_reset ;;
a6c2be24 2133 revert) _git_revert ;;
08c701d4 2134 rm) _git_rm ;;
25a1f374 2135 send-email) _git_send_email ;;
1fd6bec9 2136 shortlog) _git_shortlog ;;
90131924 2137 show) _git_show ;;
2ca880fe 2138 show-branch) _git_show_branch ;;
7fd53fce 2139 stash) _git_stash ;;
df398771 2140 stage) _git_add ;;
be86f7a0 2141 submodule) _git_submodule ;;
47f6ee28 2142 svn) _git_svn ;;
88e21dc7 2143 tag) _git_tag ;;
873537fa
SP
2144 whatchanged) _git_log ;;
2145 *) COMPREPLY=() ;;
2146 esac
690d8824
JH
2147}
2148
2149_gitk ()
2150{
d773c631
SG
2151 __git_has_doubledash && return
2152
690d8824 2153 local cur="${COMP_WORDS[COMP_CWORD]}"
fa26a401 2154 local g="$(__gitdir)"
07ba53f7 2155 local merge=""
ba7906f2 2156 if [ -f "$g/MERGE_HEAD" ]; then
07ba53f7
RQ
2157 merge="--merge"
2158 fi
b3391775
SP
2159 case "$cur" in
2160 --*)
a393777e
TR
2161 __gitcomp "
2162 $__git_log_common_options
2163 $__git_log_gitk_options
2164 $merge
2165 "
b3391775
SP
2166 return
2167 ;;
2168 esac
ec804891 2169 __git_complete_revlist
690d8824
JH
2170}
2171
50e126e1
TP
2172complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2173 || complete -o default -o nospace -F _git git
2174complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2175 || complete -o default -o nospace -F _gitk gitk
690d8824
JH
2176
2177# The following are necessary only for Cygwin, and only are needed
2178# when the user has tab-completed the executable name and consequently
2179# included the '.exe' suffix.
2180#
76c3eb51 2181if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
50e126e1
TP
2182complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2183 || complete -o default -o nospace -F _git git.exe
76c3eb51 2184fi