]> git.ipfire.org Git - thirdparty/git.git/blame - contrib/completion/git-completion.bash
bash-completion: Try bash completions before simple filetype
[thirdparty/git.git] / contrib / completion / git-completion.bash
CommitLineData
690d8824
JH
1#
2# bash completion support for core Git.
3#
c70680ce 4# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
690d8824 5# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
c70680ce 6# Distributed under the GNU General Public License, version 2.0.
690d8824
JH
7#
8# The contained completion routines provide support for completing:
9#
10# *) local and remote branch names
11# *) local and remote tag names
12# *) .git/remotes file names
13# *) git 'subcommands'
14# *) tree paths within 'ref:path/to/file' expressions
c70680ce 15# *) common --long-options
690d8824
JH
16#
17# To use these routines:
18#
19# 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
20# 2) Added the following line to your .bashrc:
21# source ~/.git-completion.sh
22#
b51ec6bd
SP
23# 3) You may want to make sure the git executable is available
24# in your PATH before this script is sourced, as some caching
25# is performed while the script loads. If git isn't found
26# at source time then all lookups will be done on demand,
27# which may be slightly slower.
28#
29# 4) Consider changing your PS1 to also show the current branch:
d3d717a4
SP
30# PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
31#
32# The argument to __git_ps1 will be displayed only if you
33# are currently in a git repository. The %s token will be
34# the name of the current branch.
35#
c70680ce
SP
36# To submit patches:
37#
38# *) Read Documentation/SubmittingPatches
39# *) Send all patches to the current maintainer:
40#
41# "Shawn O. Pearce" <spearce@spearce.org>
42#
43# *) Always CC the Git mailing list:
44#
45# git@vger.kernel.org
46#
690d8824 47
db8a9ff0
SP
48case "$COMP_WORDBREAKS" in
49*:*) : great ;;
50*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
51esac
52
873537fa
SP
53__gitdir ()
54{
25a31f81 55 if [ -z "${1-}" ]; then
67ffa114
SP
56 if [ -n "$__git_dir" ]; then
57 echo "$__git_dir"
58 elif [ -d .git ]; then
59 echo .git
60 else
61 git rev-parse --git-dir 2>/dev/null
62 fi
63 elif [ -d "$1/.git" ]; then
64 echo "$1/.git"
65 else
66 echo "$1"
67 fi
873537fa
SP
68}
69
d3d717a4
SP
70__git_ps1 ()
71{
e7520196
RR
72 local g="$(git rev-parse --git-dir 2>/dev/null)"
73 if [ -n "$g" ]; then
74 local r
75 local b
51ef1daa 76 if [ -d "$g/rebase-apply" ]
e7520196 77 then
51ef1daa 78 if test -f "$g/rebase-apply/rebasing"
3041c324
JH
79 then
80 r="|REBASE"
51ef1daa 81 elif test -f "$g/rebase-apply/applying"
3041c324
JH
82 then
83 r="|AM"
84 else
85 r="|AM/REBASE"
86 fi
e7520196 87 b="$(git symbolic-ref HEAD 2>/dev/null)"
28ed6e7b 88 elif [ -f "$g/rebase-merge/interactive" ]
e7520196
RR
89 then
90 r="|REBASE-i"
28ed6e7b
JS
91 b="$(cat "$g/rebase-merge/head-name")"
92 elif [ -d "$g/rebase-merge" ]
e7520196
RR
93 then
94 r="|REBASE-m"
28ed6e7b 95 b="$(cat "$g/rebase-merge/head-name")"
e7520196
RR
96 elif [ -f "$g/MERGE_HEAD" ]
97 then
98 r="|MERGING"
99 b="$(git symbolic-ref HEAD 2>/dev/null)"
100 else
a5c4f85b 101 if [ -f "$g/BISECT_LOG" ]
e7520196
RR
102 then
103 r="|BISECTING"
104 fi
105 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
106 then
27c57888
SP
107 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
108 then
a5c4f85b 109 b="$(cut -c1-7 "$g/HEAD")..."
27c57888 110 fi
e7520196
RR
111 fi
112 fi
113
25a31f81 114 if [ -n "${1-}" ]; then
e7520196 115 printf "$1" "${b##refs/heads/}$r"
d3d717a4 116 else
e7520196 117 printf " (%s)" "${b##refs/heads/}$r"
d3d717a4
SP
118 fi
119 fi
120}
121
ab02dfe5
SP
122__gitcomp_1 ()
123{
124 local c IFS=' '$'\t'$'\n'
125 for c in $1; do
126 case "$c$2" in
127 --*=*) printf %s$'\n' "$c$2" ;;
128 *.) printf %s$'\n' "$c$2" ;;
129 *) printf %s$'\n' "$c$2 " ;;
130 esac
131 done
132}
133
72e5e989
SP
134__gitcomp ()
135{
78d4d6a2 136 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775 137 if [ $# -gt 2 ]; then
78d4d6a2
SP
138 cur="$3"
139 fi
5447aac7
SG
140 case "$cur" in
141 --*=)
142 COMPREPLY=()
5447aac7
SG
143 ;;
144 *)
ab02dfe5 145 local IFS=$'\n'
25a31f81
TP
146 COMPREPLY=($(compgen -P "${2-}" \
147 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
ab02dfe5 148 -- "$cur"))
5447aac7
SG
149 ;;
150 esac
72e5e989
SP
151}
152
5de40f59
SP
153__git_heads ()
154{
25a31f81 155 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
5de40f59 156 if [ -d "$dir" ]; then
05e8b3d6
SG
157 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
158 refs/heads
5de40f59
SP
159 return
160 fi
25a31f81 161 for i in $(git ls-remote "${1-}" 2>/dev/null); do
5de40f59
SP
162 case "$is_hash,$i" in
163 y,*) is_hash=n ;;
164 n,*^{}) is_hash=y ;;
165 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
166 n,*) is_hash=y; echo "$i" ;;
167 esac
168 done
169}
170
88e21dc7
SP
171__git_tags ()
172{
25a31f81 173 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
88e21dc7 174 if [ -d "$dir" ]; then
05e8b3d6
SG
175 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
176 refs/tags
88e21dc7
SP
177 return
178 fi
25a31f81 179 for i in $(git ls-remote "${1-}" 2>/dev/null); do
88e21dc7
SP
180 case "$is_hash,$i" in
181 y,*) is_hash=n ;;
182 n,*^{}) is_hash=y ;;
183 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
184 n,*) is_hash=y; echo "$i" ;;
185 esac
186 done
187}
188
690d8824
JH
189__git_refs ()
190{
25a31f81 191 local i is_hash=y dir="$(__gitdir "${1-}")"
608efb87 192 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
873537fa 193 if [ -d "$dir" ]; then
608efb87
SG
194 case "$cur" in
195 refs|refs/*)
196 format="refname"
197 refs="${cur%/*}"
198 ;;
199 *)
200 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
201 format="refname:short"
202 refs="refs/tags refs/heads refs/remotes"
203 ;;
204 esac
205 git --git-dir="$dir" for-each-ref --format="%($format)" \
206 $refs
35e65ecc 207 return
690d8824 208 fi
799596a5 209 for i in $(git ls-remote "$dir" 2>/dev/null); do
690d8824
JH
210 case "$is_hash,$i" in
211 y,*) is_hash=n ;;
212 n,*^{}) is_hash=y ;;
213 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
214 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
35e65ecc 215 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
690d8824
JH
216 n,*) is_hash=y; echo "$i" ;;
217 esac
218 done
219}
220
221__git_refs2 ()
222{
67ffa114
SP
223 local i
224 for i in $(__git_refs "$1"); do
225 echo "$i:$i"
690d8824
JH
226 done
227}
228
5de40f59
SP
229__git_refs_remotes ()
230{
231 local cmd i is_hash=y
799596a5 232 for i in $(git ls-remote "$1" 2>/dev/null); do
5de40f59
SP
233 case "$is_hash,$i" in
234 n,refs/heads/*)
235 is_hash=y
236 echo "$i:refs/remotes/$1/${i#refs/heads/}"
237 ;;
238 y,*) is_hash=n ;;
239 n,*^{}) is_hash=y ;;
240 n,refs/tags/*) is_hash=y;;
241 n,*) is_hash=y; ;;
242 esac
243 done
244}
245
690d8824
JH
246__git_remotes ()
247{
873537fa 248 local i ngoff IFS=$'\n' d="$(__gitdir)"
56fc25f2 249 shopt -q nullglob || ngoff=1
690d8824 250 shopt -s nullglob
873537fa
SP
251 for i in "$d/remotes"/*; do
252 echo ${i#$d/remotes/}
690d8824 253 done
56fc25f2 254 [ "$ngoff" ] && shopt -u nullglob
e0d10e1c 255 for i in $(git --git-dir="$d" config --list); do
56fc25f2
SP
256 case "$i" in
257 remote.*.url=*)
258 i="${i#remote.}"
259 echo "${i/.url=*/}"
260 ;;
261 esac
262 done
690d8824
JH
263}
264
4ad91321
SP
265__git_merge_strategies ()
266{
b51ec6bd
SP
267 if [ -n "$__git_merge_strategylist" ]; then
268 echo "$__git_merge_strategylist"
269 return
270 fi
25b3d4d6
JH
271 git merge -s help 2>&1 |
272 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
273 s/\.$//
274 s/.*://
275 s/^[ ]*//
276 s/[ ]*$//
4ad91321 277 p
25b3d4d6 278 }'
4ad91321 279}
b51ec6bd 280__git_merge_strategylist=
25b3d4d6 281__git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
4ad91321 282
690d8824
JH
283__git_complete_file ()
284{
a79c6551 285 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
690d8824
JH
286 case "$cur" in
287 ?*:*)
a79c6551
SP
288 ref="${cur%%:*}"
289 cur="${cur#*:}"
690d8824
JH
290 case "$cur" in
291 ?*/*)
a79c6551
SP
292 pfx="${cur%/*}"
293 cur="${cur##*/}"
690d8824
JH
294 ls="$ref:$pfx"
295 pfx="$pfx/"
296 ;;
297 *)
298 ls="$ref"
299 ;;
300 esac
db8a9ff0
SP
301
302 case "$COMP_WORDBREAKS" in
303 *:*) : great ;;
304 *) pfx="$ref:$pfx" ;;
305 esac
306
778306e4 307 local IFS=$'\n'
690d8824 308 COMPREPLY=($(compgen -P "$pfx" \
873537fa 309 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
778306e4
SP
310 | sed '/^100... blob /{
311 s,^.* ,,
312 s,$, ,
313 }
314 /^120000 blob /{
315 s,^.* ,,
316 s,$, ,
317 }
690d8824
JH
318 /^040000 tree /{
319 s,^.* ,,
320 s,$,/,
321 }
322 s/^.* //')" \
323 -- "$cur"))
324 ;;
325 *)
b3391775 326 __gitcomp "$(__git_refs)"
690d8824
JH
327 ;;
328 esac
329}
330
f53352fb
SP
331__git_complete_revlist ()
332{
333 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
334 case "$cur" in
335 *...*)
336 pfx="${cur%...*}..."
337 cur="${cur#*...}"
b3391775 338 __gitcomp "$(__git_refs)" "$pfx" "$cur"
f53352fb
SP
339 ;;
340 *..*)
341 pfx="${cur%..*}.."
342 cur="${cur#*..}"
b3391775
SP
343 __gitcomp "$(__git_refs)" "$pfx" "$cur"
344 ;;
f53352fb 345 *)
b3391775 346 __gitcomp "$(__git_refs)"
f53352fb
SP
347 ;;
348 esac
349}
350
1eb7e2f8 351__git_all_commands ()
f2bb9f88 352{
1eb7e2f8
LM
353 if [ -n "$__git_all_commandlist" ]; then
354 echo "$__git_all_commandlist"
b51ec6bd
SP
355 return
356 fi
f2bb9f88
SP
357 local i IFS=" "$'\n'
358 for i in $(git help -a|egrep '^ ')
1eb7e2f8
LM
359 do
360 case $i in
361 *--*) : helper pattern;;
362 *) echo $i;;
363 esac
364 done
365}
366__git_all_commandlist=
367__git_all_commandlist="$(__git_all_commands 2>/dev/null)"
368
369__git_porcelain_commands ()
370{
371 if [ -n "$__git_porcelain_commandlist" ]; then
372 echo "$__git_porcelain_commandlist"
373 return
374 fi
375 local i IFS=" "$'\n'
376 for i in "help" $(__git_all_commands)
f2bb9f88
SP
377 do
378 case $i in
718a087a 379 *--*) : helper pattern;;
a925c6f1
SP
380 applymbox) : ask gittus;;
381 applypatch) : ask gittus;;
382 archimport) : import;;
2e3a430a 383 cat-file) : plumbing;;
56d99c67 384 check-attr) : plumbing;;
f2bb9f88 385 check-ref-format) : plumbing;;
ff2549dc 386 checkout-index) : plumbing;;
f2bb9f88 387 commit-tree) : plumbing;;
ff2549dc 388 count-objects) : infrequent;;
a925c6f1
SP
389 cvsexportcommit) : export;;
390 cvsimport) : import;;
f2bb9f88
SP
391 cvsserver) : daemon;;
392 daemon) : daemon;;
5cfb4fe5
SP
393 diff-files) : plumbing;;
394 diff-index) : plumbing;;
395 diff-tree) : plumbing;;
c6ec3b13 396 fast-import) : import;;
ff2549dc 397 fast-export) : export;;
a925c6f1 398 fsck-objects) : plumbing;;
f2bb9f88 399 fetch-pack) : plumbing;;
a925c6f1 400 fmt-merge-msg) : plumbing;;
56d99c67 401 for-each-ref) : plumbing;;
f2bb9f88
SP
402 hash-object) : plumbing;;
403 http-*) : transport;;
404 index-pack) : plumbing;;
a925c6f1 405 init-db) : deprecated;;
f2bb9f88 406 local-fetch) : plumbing;;
ff2549dc
PB
407 lost-found) : infrequent;;
408 ls-files) : plumbing;;
409 ls-remote) : plumbing;;
410 ls-tree) : plumbing;;
f2bb9f88
SP
411 mailinfo) : plumbing;;
412 mailsplit) : plumbing;;
413 merge-*) : plumbing;;
414 mktree) : plumbing;;
415 mktag) : plumbing;;
416 pack-objects) : plumbing;;
417 pack-redundant) : plumbing;;
418 pack-refs) : plumbing;;
419 parse-remote) : plumbing;;
420 patch-id) : plumbing;;
421 peek-remote) : plumbing;;
a925c6f1
SP
422 prune) : plumbing;;
423 prune-packed) : plumbing;;
424 quiltimport) : import;;
f2bb9f88
SP
425 read-tree) : plumbing;;
426 receive-pack) : plumbing;;
2e3a430a 427 reflog) : plumbing;;
5c66d0d4 428 repo-config) : deprecated;;
f2bb9f88
SP
429 rerere) : plumbing;;
430 rev-list) : plumbing;;
431 rev-parse) : plumbing;;
432 runstatus) : plumbing;;
433 sh-setup) : internal;;
434 shell) : daemon;;
ff2549dc 435 show-ref) : plumbing;;
f2bb9f88
SP
436 send-pack) : plumbing;;
437 show-index) : plumbing;;
438 ssh-*) : transport;;
439 stripspace) : plumbing;;
440 symbolic-ref) : plumbing;;
a925c6f1 441 tar-tree) : deprecated;;
f2bb9f88
SP
442 unpack-file) : plumbing;;
443 unpack-objects) : plumbing;;
a925c6f1 444 update-index) : plumbing;;
f2bb9f88
SP
445 update-ref) : plumbing;;
446 update-server-info) : daemon;;
447 upload-archive) : plumbing;;
448 upload-pack) : plumbing;;
449 write-tree) : plumbing;;
ff2549dc
PB
450 var) : infrequent;;
451 verify-pack) : infrequent;;
a925c6f1 452 verify-tag) : plumbing;;
f2bb9f88
SP
453 *) echo $i;;
454 esac
455 done
456}
1eb7e2f8
LM
457__git_porcelain_commandlist=
458__git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
f2bb9f88 459
367dce2a
DS
460__git_aliases ()
461{
56fc25f2 462 local i IFS=$'\n'
e0d10e1c 463 for i in $(git --git-dir="$(__gitdir)" config --list); do
56fc25f2
SP
464 case "$i" in
465 alias.*)
466 i="${i#alias.}"
467 echo "${i/=*/}"
468 ;;
469 esac
470 done
367dce2a
DS
471}
472
473__git_aliased_command ()
474{
873537fa 475 local word cmdline=$(git --git-dir="$(__gitdir)" \
e0d10e1c 476 config --get "alias.$1")
367dce2a
DS
477 for word in $cmdline; do
478 if [ "${word##-*}" ]; then
479 echo $word
480 return
481 fi
482 done
483}
484
3ff1320d
SG
485__git_find_subcommand ()
486{
487 local word subcommand c=1
488
489 while [ $c -lt $COMP_CWORD ]; do
490 word="${COMP_WORDS[c]}"
491 for subcommand in $1; do
492 if [ "$subcommand" = "$word" ]; then
493 echo "$subcommand"
494 return
495 fi
496 done
497 c=$((++c))
498 done
499}
500
d773c631
SG
501__git_has_doubledash ()
502{
503 local c=1
504 while [ $c -lt $COMP_CWORD ]; do
505 if [ "--" = "${COMP_WORDS[c]}" ]; then
506 return 0
507 fi
508 c=$((++c))
509 done
510 return 1
511}
512
7950659d 513__git_whitespacelist="nowarn warn error error-all fix"
88329195
SP
514
515_git_am ()
516{
28ed6e7b 517 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
51ef1daa 518 if [ -d "$dir"/rebase-apply ]; then
a31c00b0 519 __gitcomp "--skip --resolved --abort"
88329195
SP
520 return
521 fi
522 case "$cur" in
523 --whitespace=*)
b3391775 524 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
525 return
526 ;;
527 --*)
b3391775 528 __gitcomp "
88329195
SP
529 --signoff --utf8 --binary --3way --interactive
530 --whitespace=
b3391775 531 "
88329195
SP
532 return
533 esac
534 COMPREPLY=()
535}
536
537_git_apply ()
538{
539 local cur="${COMP_WORDS[COMP_CWORD]}"
540 case "$cur" in
541 --whitespace=*)
b3391775 542 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
543 return
544 ;;
545 --*)
b3391775 546 __gitcomp "
88329195
SP
547 --stat --numstat --summary --check --index
548 --cached --index-info --reverse --reject --unidiff-zero
549 --apply --no-add --exclude=
550 --whitespace= --inaccurate-eof --verbose
b3391775 551 "
88329195
SP
552 return
553 esac
554 COMPREPLY=()
555}
556
8435b548
SP
557_git_add ()
558{
d773c631
SG
559 __git_has_doubledash && return
560
8435b548
SP
561 local cur="${COMP_WORDS[COMP_CWORD]}"
562 case "$cur" in
563 --*)
1d284cba
SG
564 __gitcomp "
565 --interactive --refresh --patch --update --dry-run
c9a114b5 566 --ignore-errors --intent-to-add
1d284cba 567 "
8435b548
SP
568 return
569 esac
570 COMPREPLY=()
571}
572
b3191ce2
LM
573_git_archive ()
574{
575 local cur="${COMP_WORDS[COMP_CWORD]}"
576 case "$cur" in
577 --format=*)
578 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
579 return
580 ;;
581 --remote=*)
582 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
583 return
584 ;;
585 --*)
586 __gitcomp "
587 --format= --list --verbose
588 --prefix= --remote= --exec=
589 "
590 return
591 ;;
592 esac
593 __git_complete_file
594}
595
b2e69f62
SP
596_git_bisect ()
597{
d773c631
SG
598 __git_has_doubledash && return
599
bf11d461 600 local subcommands="start bad good skip reset visualize replay log run"
3ff1320d
SG
601 local subcommand="$(__git_find_subcommand "$subcommands")"
602 if [ -z "$subcommand" ]; then
603 __gitcomp "$subcommands"
b2e69f62
SP
604 return
605 fi
606
3ff1320d 607 case "$subcommand" in
bf11d461 608 bad|good|reset|skip)
b2e69f62
SP
609 __gitcomp "$(__git_refs)"
610 ;;
611 *)
612 COMPREPLY=()
613 ;;
614 esac
615}
616
690d8824
JH
617_git_branch ()
618{
b9217642
SG
619 local i c=1 only_local_ref="n" has_r="n"
620
621 while [ $c -lt $COMP_CWORD ]; do
622 i="${COMP_WORDS[c]}"
623 case "$i" in
624 -d|-m) only_local_ref="y" ;;
625 -r) has_r="y" ;;
626 esac
627 c=$((++c))
628 done
629
3b376b0c
SG
630 case "${COMP_WORDS[COMP_CWORD]}" in
631 --*=*) COMPREPLY=() ;;
632 --*)
633 __gitcomp "
634 --color --no-color --verbose --abbrev= --no-abbrev
50e61025 635 --track --no-track --contains --merged --no-merged
3b376b0c
SG
636 "
637 ;;
b9217642
SG
638 *)
639 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
640 __gitcomp "$(__git_heads)"
641 else
642 __gitcomp "$(__git_refs)"
643 fi
644 ;;
3b376b0c 645 esac
690d8824
JH
646}
647
374a58c9
ML
648_git_bundle ()
649{
8d8163f3
SG
650 local cmd="${COMP_WORDS[2]}"
651 case "$COMP_CWORD" in
652 2)
374a58c9
ML
653 __gitcomp "create list-heads verify unbundle"
654 ;;
8d8163f3 655 3)
374a58c9
ML
656 # looking for a file
657 ;;
658 *)
659 case "$cmd" in
660 create)
661 __git_complete_revlist
662 ;;
663 esac
664 ;;
665 esac
666}
667
690d8824
JH
668_git_checkout ()
669{
c84bb14c
SG
670 __git_has_doubledash && return
671
b3391775 672 __gitcomp "$(__git_refs)"
690d8824
JH
673}
674
d8a9fea5
SP
675_git_cherry ()
676{
677 __gitcomp "$(__git_refs)"
678}
679
1273231e
SP
680_git_cherry_pick ()
681{
682 local cur="${COMP_WORDS[COMP_CWORD]}"
683 case "$cur" in
684 --*)
b3391775 685 __gitcomp "--edit --no-commit"
1273231e
SP
686 ;;
687 *)
b3391775 688 __gitcomp "$(__git_refs)"
1273231e
SP
689 ;;
690 esac
691}
692
4181c7e8
LM
693_git_clean ()
694{
695 __git_has_doubledash && return
696
697 local cur="${COMP_WORDS[COMP_CWORD]}"
698 case "$cur" in
699 --*)
700 __gitcomp "--dry-run --quiet"
701 return
702 ;;
703 esac
704 COMPREPLY=()
705}
706
3eb11012
LM
707_git_clone ()
708{
709 local cur="${COMP_WORDS[COMP_CWORD]}"
710 case "$cur" in
711 --*)
712 __gitcomp "
713 --local
714 --no-hardlinks
715 --shared
716 --reference
717 --quiet
718 --no-checkout
719 --bare
720 --mirror
721 --origin
722 --upload-pack
723 --template=
724 --depth
725 "
726 return
727 ;;
728 esac
729 COMPREPLY=()
730}
731
4548e855
SP
732_git_commit ()
733{
d773c631
SG
734 __git_has_doubledash && return
735
4548e855
SP
736 local cur="${COMP_WORDS[COMP_CWORD]}"
737 case "$cur" in
738 --*)
b3391775 739 __gitcomp "
4548e855 740 --all --author= --signoff --verify --no-verify
aa5735be 741 --edit --amend --include --only --interactive
b3391775 742 "
4548e855
SP
743 return
744 esac
745 COMPREPLY=()
746}
747
217926c0
SP
748_git_describe ()
749{
cbb504c9
TR
750 local cur="${COMP_WORDS[COMP_CWORD]}"
751 case "$cur" in
752 --*)
753 __gitcomp "
754 --all --tags --contains --abbrev= --candidates=
755 --exact-match --debug --long --match --always
756 "
757 return
758 esac
217926c0
SP
759 __gitcomp "$(__git_refs)"
760}
761
690d8824
JH
762_git_diff ()
763{
d773c631
SG
764 __git_has_doubledash && return
765
b3a4f858
JS
766 local cur="${COMP_WORDS[COMP_CWORD]}"
767 case "$cur" in
768 --*)
769 __gitcomp "--cached --stat --numstat --shortstat --summary
770 --patch-with-stat --name-only --name-status --color
771 --no-color --color-words --no-renames --check
f135aacb 772 --full-index --binary --abbrev --diff-filter=
b3a4f858
JS
773 --find-copies-harder --pickaxe-all --pickaxe-regex
774 --text --ignore-space-at-eol --ignore-space-change
775 --ignore-all-space --exit-code --quiet --ext-diff
aba201c6
PO
776 --no-ext-diff
777 --no-prefix --src-prefix= --dst-prefix=
f4574139 778 --base --ours --theirs
6d0e674a 779 --inter-hunk-context=
aba201c6 780 "
b3a4f858
JS
781 return
782 ;;
783 esac
690d8824
JH
784 __git_complete_file
785}
786
690d8824
JH
787_git_fetch ()
788{
789 local cur="${COMP_WORDS[COMP_CWORD]}"
790
5a625b07 791 if [ "$COMP_CWORD" = 2 ]; then
b3391775 792 __gitcomp "$(__git_remotes)"
5a625b07 793 else
690d8824
JH
794 case "$cur" in
795 *:*)
db8a9ff0
SP
796 local pfx=""
797 case "$COMP_WORDBREAKS" in
798 *:*) : great ;;
799 *) pfx="${cur%%:*}:" ;;
800 esac
801 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
690d8824
JH
802 ;;
803 *)
8d8163f3 804 __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
690d8824
JH
805 ;;
806 esac
5a625b07 807 fi
690d8824
JH
808}
809
f53352fb
SP
810_git_format_patch ()
811{
812 local cur="${COMP_WORDS[COMP_CWORD]}"
813 case "$cur" in
814 --*)
b3391775 815 __gitcomp "
f53352fb
SP
816 --stdout --attach --thread
817 --output-directory
818 --numbered --start-number
47e98eec 819 --numbered-files
f53352fb
SP
820 --keep-subject
821 --signoff
822 --in-reply-to=
823 --full-index --binary
ec804891 824 --not --all
be5f5bf0 825 --cover-letter
aba201c6 826 --no-prefix --src-prefix= --dst-prefix=
b3391775 827 "
f53352fb
SP
828 return
829 ;;
830 esac
831 __git_complete_revlist
832}
833
b26c8748
SP
834_git_gc ()
835{
836 local cur="${COMP_WORDS[COMP_CWORD]}"
837 case "$cur" in
838 --*)
47e98eec 839 __gitcomp "--prune --aggressive"
b26c8748
SP
840 return
841 ;;
842 esac
843 COMPREPLY=()
844}
845
c72e0db1
LM
846_git_grep ()
847{
848 __git_has_doubledash && return
849
850 local cur="${COMP_WORDS[COMP_CWORD]}"
851 case "$cur" in
852 --*)
853 __gitcomp "
854 --cached
855 --text --ignore-case --word-regexp --invert-match
856 --full-name
857 --extended-regexp --basic-regexp --fixed-strings
858 --files-with-matches --name-only
859 --files-without-match
860 --count
861 --and --or --not --all-match
862 "
863 return
864 ;;
865 esac
866 COMPREPLY=()
867}
868
1eb7e2f8
LM
869_git_help ()
870{
871 local cur="${COMP_WORDS[COMP_CWORD]}"
872 case "$cur" in
873 --*)
874 __gitcomp "--all --info --man --web"
875 return
876 ;;
877 esac
2946cccf
MG
878 __gitcomp "$(__git_all_commands)
879 attributes cli core-tutorial cvs-migration
880 diffcore gitk glossary hooks ignore modules
881 repository-layout tutorial tutorial-2
99f0b599 882 workflows
2946cccf 883 "
1eb7e2f8
LM
884}
885
5dad868b
LM
886_git_init ()
887{
888 local cur="${COMP_WORDS[COMP_CWORD]}"
889 case "$cur" in
890 --shared=*)
891 __gitcomp "
892 false true umask group all world everybody
893 " "" "${cur##--shared=}"
894 return
895 ;;
896 --*)
897 __gitcomp "--quiet --bare --template= --shared --shared="
898 return
899 ;;
900 esac
901 COMPREPLY=()
902}
903
b1bc1494
LM
904_git_ls_files ()
905{
906 __git_has_doubledash && return
907
908 local cur="${COMP_WORDS[COMP_CWORD]}"
909 case "$cur" in
910 --*)
911 __gitcomp "--cached --deleted --modified --others --ignored
912 --stage --directory --no-empty-directory --unmerged
913 --killed --exclude= --exclude-from=
914 --exclude-per-directory= --exclude-standard
915 --error-unmatch --with-tree= --full-name
916 --abbrev --ignored --exclude-per-directory
917 "
918 return
919 ;;
920 esac
921 COMPREPLY=()
922}
923
690d8824
JH
924_git_ls_remote ()
925{
b3391775 926 __gitcomp "$(__git_remotes)"
690d8824
JH
927}
928
929_git_ls_tree ()
930{
931 __git_complete_file
932}
933
934_git_log ()
935{
d773c631
SG
936 __git_has_doubledash && return
937
6e31b866
SP
938 local cur="${COMP_WORDS[COMP_CWORD]}"
939 case "$cur" in
940 --pretty=*)
b3391775 941 __gitcomp "
6e31b866 942 oneline short medium full fuller email raw
b3391775 943 " "" "${cur##--pretty=}"
6e31b866
SP
944 return
945 ;;
47e98eec
SP
946 --date=*)
947 __gitcomp "
948 relative iso8601 rfc2822 short local default
949 " "" "${cur##--date=}"
950 return
951 ;;
6e31b866 952 --*)
b3391775 953 __gitcomp "
6e31b866
SP
954 --max-count= --max-age= --since= --after=
955 --min-age= --before= --until=
8f87fae6 956 --root --topo-order --date-order --reverse
47e98eec 957 --no-merges --follow
6e31b866 958 --abbrev-commit --abbrev=
47e98eec 959 --relative-date --date=
6e31b866
SP
960 --author= --committer= --grep=
961 --all-match
8f87fae6 962 --pretty= --name-status --name-only --raw
ec804891 963 --not --all
7d37b5bf 964 --left-right --cherry-pick
20827d99 965 --graph
66aafad5
TL
966 --stat --numstat --shortstat
967 --decorate --diff-filter=
968 --color-words --walk-reflogs
e49b99a6 969 --parents --children --full-history
5a13c8f6 970 --merge
6d0e674a 971 --inter-hunk-context=
b3391775 972 "
6e31b866
SP
973 return
974 ;;
975 esac
f53352fb 976 __git_complete_revlist
690d8824
JH
977}
978
4ad91321
SP
979_git_merge ()
980{
981 local cur="${COMP_WORDS[COMP_CWORD]}"
ce1e39d2
SP
982 case "${COMP_WORDS[COMP_CWORD-1]}" in
983 -s|--strategy)
b3391775 984 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
985 return
986 esac
4ad91321 987 case "$cur" in
ce1e39d2 988 --strategy=*)
b3391775 989 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
990 return
991 ;;
4ad91321 992 --*)
b3391775 993 __gitcomp "
efb779f8 994 --no-commit --no-stat --log --no-log --squash --strategy
b3391775 995 "
4ad91321
SP
996 return
997 esac
b3391775 998 __gitcomp "$(__git_refs)"
4ad91321
SP
999}
1000
b4c72162
LM
1001_git_mergetool ()
1002{
1003 local cur="${COMP_WORDS[COMP_CWORD]}"
1004 case "$cur" in
1005 --tool=*)
1006 __gitcomp "
1007 kdiff3 tkdiff meld xxdiff emerge
1008 vimdiff gvimdiff ecmerge opendiff
1009 " "" "${cur##--tool=}"
1010 return
1011 ;;
1012 --*)
1013 __gitcomp "--tool="
1014 return
1015 ;;
1016 esac
1017 COMPREPLY=()
1018}
1019
690d8824
JH
1020_git_merge_base ()
1021{
b3391775 1022 __gitcomp "$(__git_refs)"
690d8824
JH
1023}
1024
1127c51c
LM
1025_git_mv ()
1026{
1027 local cur="${COMP_WORDS[COMP_CWORD]}"
1028 case "$cur" in
1029 --*)
1030 __gitcomp "--dry-run"
1031 return
1032 ;;
1033 esac
1034 COMPREPLY=()
1035}
1036
d33909bf
SP
1037_git_name_rev ()
1038{
b3391775 1039 __gitcomp "--tags --all --stdin"
d33909bf
SP
1040}
1041
690d8824
JH
1042_git_pull ()
1043{
1044 local cur="${COMP_WORDS[COMP_CWORD]}"
1045
5a625b07 1046 if [ "$COMP_CWORD" = 2 ]; then
b3391775 1047 __gitcomp "$(__git_remotes)"
5a625b07 1048 else
8d8163f3 1049 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
5a625b07 1050 fi
690d8824
JH
1051}
1052
1053_git_push ()
1054{
1055 local cur="${COMP_WORDS[COMP_CWORD]}"
1056
5a625b07 1057 if [ "$COMP_CWORD" = 2 ]; then
b3391775 1058 __gitcomp "$(__git_remotes)"
5a625b07 1059 else
690d8824
JH
1060 case "$cur" in
1061 *:*)
db8a9ff0
SP
1062 local pfx=""
1063 case "$COMP_WORDBREAKS" in
1064 *:*) : great ;;
1065 *) pfx="${cur%%:*}:" ;;
1066 esac
1067
8d8163f3 1068 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
690d8824 1069 ;;
161fea83
SP
1070 +*)
1071 __gitcomp "$(__git_refs)" + "${cur#+}"
1072 ;;
690d8824 1073 *)
92d7c8e3 1074 __gitcomp "$(__git_refs)"
690d8824
JH
1075 ;;
1076 esac
5a625b07 1077 fi
690d8824
JH
1078}
1079
61d926a3
SP
1080_git_rebase ()
1081{
51fe1209 1082 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
51ef1daa 1083 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
b3391775 1084 __gitcomp "--continue --skip --abort"
61d926a3
SP
1085 return
1086 fi
ce1e39d2
SP
1087 case "${COMP_WORDS[COMP_CWORD-1]}" in
1088 -s|--strategy)
b3391775 1089 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
1090 return
1091 esac
61d926a3 1092 case "$cur" in
ce1e39d2 1093 --strategy=*)
b3391775 1094 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
1095 return
1096 ;;
61d926a3 1097 --*)
d9e3b702 1098 __gitcomp "--onto --merge --strategy --interactive"
61d926a3
SP
1099 return
1100 esac
b3391775 1101 __gitcomp "$(__git_refs)"
61d926a3
SP
1102}
1103
25a1f374
TL
1104_git_send_email ()
1105{
1106 local cur="${COMP_WORDS[COMP_CWORD]}"
1107 case "$cur" in
1108 --*)
1109 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1110 --dry-run --envelope-sender --from --identity
1111 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1112 --no-suppress-from --no-thread --quiet
1113 --signed-off-by-cc --smtp-pass --smtp-server
1114 --smtp-server-port --smtp-ssl --smtp-user --subject
fd3a8dcb
TL
1115 --suppress-cc --suppress-from --thread --to
1116 --validate --no-validate"
25a1f374
TL
1117 return
1118 ;;
1119 esac
1120 COMPREPLY=()
1121}
1122
e0d10e1c 1123_git_config ()
5de40f59
SP
1124{
1125 local cur="${COMP_WORDS[COMP_CWORD]}"
1126 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1127 case "$prv" in
1128 branch.*.remote)
78d4d6a2 1129 __gitcomp "$(__git_remotes)"
5de40f59
SP
1130 return
1131 ;;
1132 branch.*.merge)
78d4d6a2 1133 __gitcomp "$(__git_refs)"
5de40f59
SP
1134 return
1135 ;;
1136 remote.*.fetch)
1137 local remote="${prv#remote.}"
1138 remote="${remote%.fetch}"
78d4d6a2 1139 __gitcomp "$(__git_refs_remotes "$remote")"
5de40f59
SP
1140 return
1141 ;;
1142 remote.*.push)
1143 local remote="${prv#remote.}"
1144 remote="${remote%.push}"
78d4d6a2 1145 __gitcomp "$(git --git-dir="$(__gitdir)" \
5de40f59 1146 for-each-ref --format='%(refname):%(refname)' \
78d4d6a2
SP
1147 refs/heads)"
1148 return
1149 ;;
1150 pull.twohead|pull.octopus)
1151 __gitcomp "$(__git_merge_strategies)"
1152 return
1153 ;;
1154 color.branch|color.diff|color.status)
1155 __gitcomp "always never auto"
1156 return
1157 ;;
1158 color.*.*)
1159 __gitcomp "
98171a07 1160 normal black red green yellow blue magenta cyan white
78d4d6a2
SP
1161 bold dim ul blink reverse
1162 "
5de40f59
SP
1163 return
1164 ;;
1165 *.*)
1166 COMPREPLY=()
1167 return
1168 ;;
1169 esac
1170 case "$cur" in
1171 --*)
78d4d6a2 1172 __gitcomp "
47e98eec 1173 --global --system --file=
12977705 1174 --list --replace-all
5de40f59 1175 --get --get-all --get-regexp
1b71eb35 1176 --add --unset --unset-all
12977705 1177 --remove-section --rename-section
78d4d6a2 1178 "
5de40f59
SP
1179 return
1180 ;;
1181 branch.*.*)
1182 local pfx="${cur%.*}."
1183 cur="${cur##*.}"
98171a07 1184 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
5de40f59
SP
1185 return
1186 ;;
1187 branch.*)
1188 local pfx="${cur%.*}."
1189 cur="${cur#*.}"
78d4d6a2 1190 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
5de40f59
SP
1191 return
1192 ;;
1193 remote.*.*)
1194 local pfx="${cur%.*}."
1195 cur="${cur##*.}"
12977705 1196 __gitcomp "
98171a07 1197 url proxy fetch push mirror skipDefaultUpdate
12977705
SP
1198 receivepack uploadpack tagopt
1199 " "$pfx" "$cur"
5de40f59
SP
1200 return
1201 ;;
1202 remote.*)
1203 local pfx="${cur%.*}."
1204 cur="${cur#*.}"
78d4d6a2 1205 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
5de40f59
SP
1206 return
1207 ;;
1208 esac
78d4d6a2 1209 __gitcomp "
5de40f59 1210 apply.whitespace
98171a07
LM
1211 branch.autosetupmerge
1212 branch.autosetuprebase
2122591b 1213 clean.requireForce
78d4d6a2
SP
1214 color.branch
1215 color.branch.current
1216 color.branch.local
78d4d6a2 1217 color.branch.plain
025a1929 1218 color.branch.remote
a159ca0c 1219 color.diff
025a1929 1220 color.diff.commit
78d4d6a2 1221 color.diff.frag
025a1929 1222 color.diff.meta
78d4d6a2 1223 color.diff.new
025a1929
LM
1224 color.diff.old
1225 color.diff.plain
78d4d6a2 1226 color.diff.whitespace
98171a07
LM
1227 color.interactive
1228 color.interactive.header
1229 color.interactive.help
1230 color.interactive.prompt
a159ca0c 1231 color.pager
a159ca0c 1232 color.status
78d4d6a2
SP
1233 color.status.added
1234 color.status.changed
025a1929 1235 color.status.header
98171a07 1236 color.status.nobranch
78d4d6a2 1237 color.status.untracked
98171a07
LM
1238 color.status.updated
1239 color.ui
1240 commit.template
1241 core.autocrlf
1242 core.bare
025a1929 1243 core.compression
98171a07
LM
1244 core.deltaBaseCacheLimit
1245 core.editor
1246 core.excludesfile
025a1929 1247 core.fileMode
98171a07 1248 core.fsyncobjectfiles
025a1929 1249 core.gitProxy
98171a07 1250 core.ignoreCygwinFSTricks
025a1929
LM
1251 core.ignoreStat
1252 core.logAllRefUpdates
1253 core.loosecompression
1254 core.packedGitLimit
1255 core.packedGitWindowSize
98171a07 1256 core.pager
025a1929 1257 core.preferSymlinkRefs
98171a07
LM
1258 core.preloadindex
1259 core.quotepath
025a1929 1260 core.repositoryFormatVersion
98171a07 1261 core.safecrlf
025a1929 1262 core.sharedRepository
98171a07
LM
1263 core.symlinks
1264 core.trustctime
025a1929 1265 core.warnAmbiguousRefs
98171a07
LM
1266 core.whitespace
1267 core.worktree
1268 diff.autorefreshindex
1269 diff.external
1270 diff.mnemonicprefix
78d4d6a2 1271 diff.renameLimit
98171a07 1272 diff.renameLimit.
78d4d6a2
SP
1273 diff.renames
1274 fetch.unpackLimit
1275 format.headers
98171a07
LM
1276 format.numbered
1277 format.pretty
1278 format.suffix
1279 gc.aggressiveWindow
1280 gc.auto
1281 gc.autopacklimit
12977705 1282 gc.packrefs
98171a07 1283 gc.pruneexpire
78d4d6a2
SP
1284 gc.reflogexpire
1285 gc.reflogexpireunreachable
1286 gc.rerereresolved
1287 gc.rerereunresolved
025a1929 1288 gitcvs.allbinary
98171a07 1289 gitcvs.dbTableNamePrefix
025a1929
LM
1290 gitcvs.dbdriver
1291 gitcvs.dbname
1292 gitcvs.dbpass
025a1929
LM
1293 gitcvs.dbuser
1294 gitcvs.enabled
1295 gitcvs.logfile
98171a07
LM
1296 gitcvs.usecrlfattr
1297 gui.blamehistoryctx
1298 gui.commitmsgwidth
1299 gui.copyblamethreshold
1300 gui.diffcontext
1301 gui.encoding
1302 gui.fastcopyblame
1303 gui.matchtrackingbranch
1304 gui.newbranchtemplate
1305 gui.pruneduringfetch
1306 gui.spellingdictionary
1307 gui.trustmtime
1308 help.autocorrect
1309 help.browser
1310 help.format
78d4d6a2
SP
1311 http.lowSpeedLimit
1312 http.lowSpeedTime
025a1929 1313 http.maxRequests
5de40f59 1314 http.noEPSV
98171a07 1315 http.proxy
025a1929
LM
1316 http.sslCAInfo
1317 http.sslCAPath
1318 http.sslCert
1319 http.sslKey
1320 http.sslVerify
78d4d6a2
SP
1321 i18n.commitEncoding
1322 i18n.logOutputEncoding
98171a07
LM
1323 instaweb.browser
1324 instaweb.httpd
1325 instaweb.local
1326 instaweb.modulepath
1327 instaweb.port
1328 log.date
78d4d6a2 1329 log.showroot
98171a07
LM
1330 man.viewer
1331 merge.conflictstyle
1332 merge.log
1333 merge.renameLimit
1334 merge.stat
025a1929 1335 merge.tool
78d4d6a2 1336 merge.verbosity
98171a07 1337 mergetool.keepBackup
47e98eec 1338 pack.compression
47e98eec 1339 pack.deltaCacheLimit
025a1929
LM
1340 pack.deltaCacheSize
1341 pack.depth
98171a07
LM
1342 pack.indexVersion
1343 pack.packSizeLimit
1344 pack.threads
025a1929
LM
1345 pack.window
1346 pack.windowMemory
78d4d6a2
SP
1347 pull.octopus
1348 pull.twohead
98171a07
LM
1349 receive.denyCurrentBranch
1350 receive.denyDeletes
025a1929 1351 receive.denyNonFastForwards
98171a07 1352 receive.fsckObjects
025a1929 1353 receive.unpackLimit
98171a07
LM
1354 repack.usedeltabaseoffset
1355 rerere.autoupdate
1356 rerere.enabled
78d4d6a2 1357 showbranch.default
98171a07
LM
1358 status.relativePaths
1359 status.showUntrackedFiles
78d4d6a2
SP
1360 tar.umask
1361 transfer.unpackLimit
78d4d6a2 1362 user.email
025a1929 1363 user.name
78d4d6a2 1364 user.signingkey
98171a07 1365 web.browser
5de40f59 1366 branch. remote.
78d4d6a2 1367 "
5de40f59
SP
1368}
1369
88293c67
SP
1370_git_remote ()
1371{
3ff1320d
SG
1372 local subcommands="add rm show prune update"
1373 local subcommand="$(__git_find_subcommand "$subcommands")"
1374 if [ -z "$subcommand" ]; then
3903c618 1375 __gitcomp "$subcommands"
88293c67
SP
1376 return
1377 fi
1378
3ff1320d 1379 case "$subcommand" in
a3b811a4 1380 rm|show|prune)
88293c67
SP
1381 __gitcomp "$(__git_remotes)"
1382 ;;
fb72759b
SP
1383 update)
1384 local i c='' IFS=$'\n'
1385 for i in $(git --git-dir="$(__gitdir)" config --list); do
1386 case "$i" in
1387 remotes.*)
1388 i="${i#remotes.}"
1389 c="$c ${i/=*/}"
1390 ;;
1391 esac
1392 done
1393 __gitcomp "$c"
1394 ;;
88293c67
SP
1395 *)
1396 COMPREPLY=()
1397 ;;
1398 esac
1399}
1400
67e78c3b
SP
1401_git_reset ()
1402{
d773c631
SG
1403 __git_has_doubledash && return
1404
67e78c3b 1405 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775
SP
1406 case "$cur" in
1407 --*)
e89e2ed7 1408 __gitcomp "--merge --mixed --hard --soft"
b3391775
SP
1409 return
1410 ;;
1411 esac
1412 __gitcomp "$(__git_refs)"
67e78c3b
SP
1413}
1414
a6c2be24
LM
1415_git_revert ()
1416{
1417 local cur="${COMP_WORDS[COMP_CWORD]}"
1418 case "$cur" in
1419 --*)
1420 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1421 return
1422 ;;
1423 esac
c0783837 1424 __gitcomp "$(__git_refs)"
a6c2be24
LM
1425}
1426
08c701d4
LM
1427_git_rm ()
1428{
1429 __git_has_doubledash && return
1430
1431 local cur="${COMP_WORDS[COMP_CWORD]}"
1432 case "$cur" in
1433 --*)
1434 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1435 return
1436 ;;
1437 esac
1438 COMPREPLY=()
1439}
1440
1fd6bec9
SP
1441_git_shortlog ()
1442{
d773c631
SG
1443 __git_has_doubledash && return
1444
1fd6bec9
SP
1445 local cur="${COMP_WORDS[COMP_CWORD]}"
1446 case "$cur" in
1447 --*)
1448 __gitcomp "
1449 --max-count= --max-age= --since= --after=
1450 --min-age= --before= --until=
1451 --no-merges
1452 --author= --committer= --grep=
1453 --all-match
1454 --not --all
1455 --numbered --summary
1456 "
1457 return
1458 ;;
1459 esac
1460 __git_complete_revlist
1461}
1462
90131924
SP
1463_git_show ()
1464{
41d8cf7d
MH
1465 __git_has_doubledash && return
1466
90131924
SP
1467 local cur="${COMP_WORDS[COMP_CWORD]}"
1468 case "$cur" in
1469 --pretty=*)
b3391775 1470 __gitcomp "
90131924 1471 oneline short medium full fuller email raw
b3391775 1472 " "" "${cur##--pretty=}"
90131924
SP
1473 return
1474 ;;
1475 --*)
b3391775 1476 __gitcomp "--pretty="
90131924
SP
1477 return
1478 ;;
1479 esac
1480 __git_complete_file
1481}
1482
2ca880fe
TR
1483_git_show_branch ()
1484{
1485 local cur="${COMP_WORDS[COMP_CWORD]}"
1486 case "$cur" in
1487 --*)
1488 __gitcomp "
1489 --all --remotes --topo-order --current --more=
1490 --list --independent --merge-base --no-name
1491 --sha1-name --topics --reflog
1492 "
1493 return
1494 ;;
1495 esac
1496 __git_complete_revlist
1497}
1498
7fd53fce
JH
1499_git_stash ()
1500{
95d43780 1501 local subcommands='save list show apply clear drop pop create branch'
7bedebca
SG
1502 local subcommand="$(__git_find_subcommand "$subcommands")"
1503 if [ -z "$subcommand" ]; then
3ff1320d 1504 __gitcomp "$subcommands"
7bedebca
SG
1505 else
1506 local cur="${COMP_WORDS[COMP_CWORD]}"
1507 case "$subcommand,$cur" in
1508 save,--*)
1509 __gitcomp "--keep-index"
1510 ;;
95d43780
LM
1511 apply,--*)
1512 __gitcomp "--index"
1513 ;;
5a7ebd4f 1514 show,--*|drop,--*|pop,--*|branch,--*)
95d43780
LM
1515 COMPREPLY=()
1516 ;;
1517 show,*|apply,*|drop,*|pop,*|branch,*)
1518 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1519 | sed -n -e 's/:.*//p')"
1520 ;;
7bedebca
SG
1521 *)
1522 COMPREPLY=()
1523 ;;
1524 esac
3ff1320d 1525 fi
7fd53fce
JH
1526}
1527
be86f7a0
SP
1528_git_submodule ()
1529{
d773c631
SG
1530 __git_has_doubledash && return
1531
1b0f7978 1532 local subcommands="add status init update summary foreach sync"
3ff1320d 1533 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
be86f7a0
SP
1534 local cur="${COMP_WORDS[COMP_CWORD]}"
1535 case "$cur" in
1536 --*)
1537 __gitcomp "--quiet --cached"
1538 ;;
1539 *)
3ff1320d 1540 __gitcomp "$subcommands"
be86f7a0
SP
1541 ;;
1542 esac
1543 return
1544 fi
1545}
1546
47f6ee28
SG
1547_git_svn ()
1548{
1549 local subcommands="
1550 init fetch clone rebase dcommit log find-rev
1551 set-tree commit-diff info create-ignore propget
1552 proplist show-ignore show-externals
1553 "
1554 local subcommand="$(__git_find_subcommand "$subcommands")"
1555 if [ -z "$subcommand" ]; then
1556 __gitcomp "$subcommands"
1557 else
1558 local remote_opts="--username= --config-dir= --no-auth-cache"
1559 local fc_opts="
1560 --follow-parent --authors-file= --repack=
1561 --no-metadata --use-svm-props --use-svnsync-props
1562 --log-window-size= --no-checkout --quiet
1563 --repack-flags --user-log-author $remote_opts
1564 "
1565 local init_opts="
1566 --template= --shared= --trunk= --tags=
1567 --branches= --stdlayout --minimize-url
1568 --no-metadata --use-svm-props --use-svnsync-props
1569 --rewrite-root= $remote_opts
1570 "
1571 local cmt_opts="
1572 --edit --rmdir --find-copies-harder --copy-similarity=
1573 "
1574
1575 local cur="${COMP_WORDS[COMP_CWORD]}"
1576 case "$subcommand,$cur" in
1577 fetch,--*)
1578 __gitcomp "--revision= --fetch-all $fc_opts"
1579 ;;
1580 clone,--*)
1581 __gitcomp "--revision= $fc_opts $init_opts"
1582 ;;
1583 init,--*)
1584 __gitcomp "$init_opts"
1585 ;;
1586 dcommit,--*)
1587 __gitcomp "
1588 --merge --strategy= --verbose --dry-run
1589 --fetch-all --no-rebase $cmt_opts $fc_opts
1590 "
1591 ;;
1592 set-tree,--*)
1593 __gitcomp "--stdin $cmt_opts $fc_opts"
1594 ;;
1595 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1596 show-externals,--*)
1597 __gitcomp "--revision="
1598 ;;
1599 log,--*)
1600 __gitcomp "
1601 --limit= --revision= --verbose --incremental
1602 --oneline --show-commit --non-recursive
1603 --authors-file=
1604 "
1605 ;;
1606 rebase,--*)
1607 __gitcomp "
1608 --merge --verbose --strategy= --local
1609 --fetch-all $fc_opts
1610 "
1611 ;;
1612 commit-diff,--*)
1613 __gitcomp "--message= --file= --revision= $cmt_opts"
1614 ;;
1615 info,--*)
1616 __gitcomp "--url"
1617 ;;
1618 *)
1619 COMPREPLY=()
1620 ;;
1621 esac
1622 fi
1623}
1624
88e21dc7
SP
1625_git_tag ()
1626{
1627 local i c=1 f=0
1628 while [ $c -lt $COMP_CWORD ]; do
1629 i="${COMP_WORDS[c]}"
1630 case "$i" in
1631 -d|-v)
1632 __gitcomp "$(__git_tags)"
1633 return
1634 ;;
1635 -f)
1636 f=1
1637 ;;
1638 esac
1639 c=$((++c))
1640 done
1641
1642 case "${COMP_WORDS[COMP_CWORD-1]}" in
1643 -m|-F)
1644 COMPREPLY=()
1645 ;;
8d8163f3 1646 -*|tag)
88e21dc7
SP
1647 if [ $f = 1 ]; then
1648 __gitcomp "$(__git_tags)"
1649 else
1650 COMPREPLY=()
1651 fi
1652 ;;
1653 *)
1654 __gitcomp "$(__git_refs)"
1655 ;;
1656 esac
1657}
1658
690d8824
JH
1659_git ()
1660{
873537fa
SP
1661 local i c=1 command __git_dir
1662
1663 while [ $c -lt $COMP_CWORD ]; do
1664 i="${COMP_WORDS[c]}"
1665 case "$i" in
1666 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1667 --bare) __git_dir="." ;;
1eb7e2f8
LM
1668 --version|-p|--paginate) ;;
1669 --help) command="help"; break ;;
873537fa
SP
1670 *) command="$i"; break ;;
1671 esac
1672 c=$((++c))
1673 done
1674
1d17b22e 1675 if [ -z "$command" ]; then
72e5e989
SP
1676 case "${COMP_WORDS[COMP_CWORD]}" in
1677 --*=*) COMPREPLY=() ;;
47e98eec 1678 --*) __gitcomp "
ce5a2c95 1679 --paginate
47e98eec
SP
1680 --no-pager
1681 --git-dir=
1682 --bare
1683 --version
1684 --exec-path
ce5a2c95
TL
1685 --work-tree=
1686 --help
47e98eec
SP
1687 "
1688 ;;
1eb7e2f8 1689 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
72e5e989
SP
1690 esac
1691 return
873537fa 1692 fi
367dce2a 1693
873537fa
SP
1694 local expansion=$(__git_aliased_command "$command")
1695 [ "$expansion" ] && command="$expansion"
367dce2a 1696
873537fa 1697 case "$command" in
88329195 1698 am) _git_am ;;
8435b548 1699 add) _git_add ;;
88329195 1700 apply) _git_apply ;;
b3191ce2 1701 archive) _git_archive ;;
b2e69f62 1702 bisect) _git_bisect ;;
374a58c9 1703 bundle) _git_bundle ;;
873537fa 1704 branch) _git_branch ;;
873537fa 1705 checkout) _git_checkout ;;
d8a9fea5 1706 cherry) _git_cherry ;;
1273231e 1707 cherry-pick) _git_cherry_pick ;;
4181c7e8 1708 clean) _git_clean ;;
3eb11012 1709 clone) _git_clone ;;
4548e855 1710 commit) _git_commit ;;
e0d10e1c 1711 config) _git_config ;;
217926c0 1712 describe) _git_describe ;;
873537fa 1713 diff) _git_diff ;;
873537fa 1714 fetch) _git_fetch ;;
f53352fb 1715 format-patch) _git_format_patch ;;
b26c8748 1716 gc) _git_gc ;;
c72e0db1 1717 grep) _git_grep ;;
1eb7e2f8 1718 help) _git_help ;;
5dad868b 1719 init) _git_init ;;
873537fa 1720 log) _git_log ;;
b1bc1494 1721 ls-files) _git_ls_files ;;
873537fa
SP
1722 ls-remote) _git_ls_remote ;;
1723 ls-tree) _git_ls_tree ;;
4ad91321 1724 merge) _git_merge;;
b4c72162 1725 mergetool) _git_mergetool;;
873537fa 1726 merge-base) _git_merge_base ;;
1127c51c 1727 mv) _git_mv ;;
d33909bf 1728 name-rev) _git_name_rev ;;
873537fa
SP
1729 pull) _git_pull ;;
1730 push) _git_push ;;
61d926a3 1731 rebase) _git_rebase ;;
88293c67 1732 remote) _git_remote ;;
873537fa 1733 reset) _git_reset ;;
a6c2be24 1734 revert) _git_revert ;;
08c701d4 1735 rm) _git_rm ;;
25a1f374 1736 send-email) _git_send_email ;;
1fd6bec9 1737 shortlog) _git_shortlog ;;
90131924 1738 show) _git_show ;;
2ca880fe 1739 show-branch) _git_show_branch ;;
7fd53fce 1740 stash) _git_stash ;;
df398771 1741 stage) _git_add ;;
be86f7a0 1742 submodule) _git_submodule ;;
47f6ee28 1743 svn) _git_svn ;;
88e21dc7 1744 tag) _git_tag ;;
873537fa
SP
1745 whatchanged) _git_log ;;
1746 *) COMPREPLY=() ;;
1747 esac
690d8824
JH
1748}
1749
1750_gitk ()
1751{
d773c631
SG
1752 __git_has_doubledash && return
1753
690d8824 1754 local cur="${COMP_WORDS[COMP_CWORD]}"
07ba53f7
RQ
1755 local g="$(git rev-parse --git-dir 2>/dev/null)"
1756 local merge=""
1757 if [ -f $g/MERGE_HEAD ]; then
1758 merge="--merge"
1759 fi
b3391775
SP
1760 case "$cur" in
1761 --*)
07ba53f7 1762 __gitcomp "--not --all $merge"
b3391775
SP
1763 return
1764 ;;
1765 esac
ec804891 1766 __git_complete_revlist
690d8824
JH
1767}
1768
50e126e1
TP
1769complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1770 || complete -o default -o nospace -F _git git
1771complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1772 || complete -o default -o nospace -F _gitk gitk
690d8824
JH
1773
1774# The following are necessary only for Cygwin, and only are needed
1775# when the user has tab-completed the executable name and consequently
1776# included the '.exe' suffix.
1777#
76c3eb51 1778if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
50e126e1
TP
1779complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1780 || complete -o default -o nospace -F _git git.exe
76c3eb51 1781fi