bash completion: Add completion for 'git clone'
[git/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{
67ffa114
SP
55 if [ -z "$1" ]; then
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
d3d717a4 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
SP
145 local IFS=$'\n'
146 COMPREPLY=($(compgen -P "$2" \
147 -W "$(__gitcomp_1 "$1" "$4")" \
148 -- "$cur"))
5447aac7
SG
149 ;;
150 esac
72e5e989
SP
151}
152
5de40f59
SP
153__git_heads ()
154{
67ffa114 155 local cmd i is_hash=y dir="$(__gitdir "$1")"
5de40f59
SP
156 if [ -d "$dir" ]; then
157 for i in $(git --git-dir="$dir" \
158 for-each-ref --format='%(refname)' \
159 refs/heads ); do
160 echo "${i#refs/heads/}"
161 done
162 return
163 fi
799596a5 164 for i in $(git ls-remote "$1" 2>/dev/null); do
5de40f59
SP
165 case "$is_hash,$i" in
166 y,*) is_hash=n ;;
167 n,*^{}) is_hash=y ;;
168 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
169 n,*) is_hash=y; echo "$i" ;;
170 esac
171 done
172}
173
88e21dc7
SP
174__git_tags ()
175{
176 local cmd i is_hash=y dir="$(__gitdir "$1")"
177 if [ -d "$dir" ]; then
178 for i in $(git --git-dir="$dir" \
179 for-each-ref --format='%(refname)' \
180 refs/tags ); do
181 echo "${i#refs/tags/}"
182 done
183 return
184 fi
799596a5 185 for i in $(git ls-remote "$1" 2>/dev/null); do
88e21dc7
SP
186 case "$is_hash,$i" in
187 y,*) is_hash=n ;;
188 n,*^{}) is_hash=y ;;
189 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
190 n,*) is_hash=y; echo "$i" ;;
191 esac
192 done
193}
194
690d8824
JH
195__git_refs ()
196{
67ffa114 197 local cmd i is_hash=y dir="$(__gitdir "$1")"
873537fa 198 if [ -d "$dir" ]; then
35e65ecc
SP
199 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
200 for i in $(git --git-dir="$dir" \
201 for-each-ref --format='%(refname)' \
202 refs/tags refs/heads refs/remotes); do
203 case "$i" in
204 refs/tags/*) echo "${i#refs/tags/}" ;;
205 refs/heads/*) echo "${i#refs/heads/}" ;;
206 refs/remotes/*) echo "${i#refs/remotes/}" ;;
207 *) echo "$i" ;;
208 esac
209 done
210 return
690d8824 211 fi
799596a5 212 for i in $(git ls-remote "$dir" 2>/dev/null); do
690d8824
JH
213 case "$is_hash,$i" in
214 y,*) is_hash=n ;;
215 n,*^{}) is_hash=y ;;
216 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
217 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
35e65ecc 218 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
690d8824
JH
219 n,*) is_hash=y; echo "$i" ;;
220 esac
221 done
222}
223
224__git_refs2 ()
225{
67ffa114
SP
226 local i
227 for i in $(__git_refs "$1"); do
228 echo "$i:$i"
690d8824
JH
229 done
230}
231
5de40f59
SP
232__git_refs_remotes ()
233{
234 local cmd i is_hash=y
799596a5 235 for i in $(git ls-remote "$1" 2>/dev/null); do
5de40f59
SP
236 case "$is_hash,$i" in
237 n,refs/heads/*)
238 is_hash=y
239 echo "$i:refs/remotes/$1/${i#refs/heads/}"
240 ;;
241 y,*) is_hash=n ;;
242 n,*^{}) is_hash=y ;;
243 n,refs/tags/*) is_hash=y;;
244 n,*) is_hash=y; ;;
245 esac
246 done
247}
248
690d8824
JH
249__git_remotes ()
250{
873537fa 251 local i ngoff IFS=$'\n' d="$(__gitdir)"
56fc25f2 252 shopt -q nullglob || ngoff=1
690d8824 253 shopt -s nullglob
873537fa
SP
254 for i in "$d/remotes"/*; do
255 echo ${i#$d/remotes/}
690d8824 256 done
56fc25f2 257 [ "$ngoff" ] && shopt -u nullglob
e0d10e1c 258 for i in $(git --git-dir="$d" config --list); do
56fc25f2
SP
259 case "$i" in
260 remote.*.url=*)
261 i="${i#remote.}"
262 echo "${i/.url=*/}"
263 ;;
264 esac
265 done
690d8824
JH
266}
267
4ad91321
SP
268__git_merge_strategies ()
269{
b51ec6bd
SP
270 if [ -n "$__git_merge_strategylist" ]; then
271 echo "$__git_merge_strategylist"
272 return
273 fi
4ad91321
SP
274 sed -n "/^all_strategies='/{
275 s/^all_strategies='//
276 s/'//
277 p
278 q
279 }" "$(git --exec-path)/git-merge"
280}
b51ec6bd
SP
281__git_merge_strategylist=
282__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
4ad91321 283
690d8824
JH
284__git_complete_file ()
285{
a79c6551 286 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
690d8824
JH
287 case "$cur" in
288 ?*:*)
a79c6551
SP
289 ref="${cur%%:*}"
290 cur="${cur#*:}"
690d8824
JH
291 case "$cur" in
292 ?*/*)
a79c6551
SP
293 pfx="${cur%/*}"
294 cur="${cur##*/}"
690d8824
JH
295 ls="$ref:$pfx"
296 pfx="$pfx/"
297 ;;
298 *)
299 ls="$ref"
300 ;;
301 esac
db8a9ff0
SP
302
303 case "$COMP_WORDBREAKS" in
304 *:*) : great ;;
305 *) pfx="$ref:$pfx" ;;
306 esac
307
778306e4 308 local IFS=$'\n'
690d8824 309 COMPREPLY=($(compgen -P "$pfx" \
873537fa 310 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
778306e4
SP
311 | sed '/^100... blob /{
312 s,^.* ,,
313 s,$, ,
314 }
315 /^120000 blob /{
316 s,^.* ,,
317 s,$, ,
318 }
690d8824
JH
319 /^040000 tree /{
320 s,^.* ,,
321 s,$,/,
322 }
323 s/^.* //')" \
324 -- "$cur"))
325 ;;
326 *)
b3391775 327 __gitcomp "$(__git_refs)"
690d8824
JH
328 ;;
329 esac
330}
331
f53352fb
SP
332__git_complete_revlist ()
333{
334 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
335 case "$cur" in
336 *...*)
337 pfx="${cur%...*}..."
338 cur="${cur#*...}"
b3391775 339 __gitcomp "$(__git_refs)" "$pfx" "$cur"
f53352fb
SP
340 ;;
341 *..*)
342 pfx="${cur%..*}.."
343 cur="${cur#*..}"
b3391775
SP
344 __gitcomp "$(__git_refs)" "$pfx" "$cur"
345 ;;
f53352fb 346 *)
b3391775 347 __gitcomp "$(__git_refs)"
f53352fb
SP
348 ;;
349 esac
350}
351
1eb7e2f8 352__git_all_commands ()
f2bb9f88 353{
1eb7e2f8
LM
354 if [ -n "$__git_all_commandlist" ]; then
355 echo "$__git_all_commandlist"
b51ec6bd
SP
356 return
357 fi
f2bb9f88
SP
358 local i IFS=" "$'\n'
359 for i in $(git help -a|egrep '^ ')
1eb7e2f8
LM
360 do
361 case $i in
362 *--*) : helper pattern;;
363 *) echo $i;;
364 esac
365 done
366}
367__git_all_commandlist=
368__git_all_commandlist="$(__git_all_commands 2>/dev/null)"
369
370__git_porcelain_commands ()
371{
372 if [ -n "$__git_porcelain_commandlist" ]; then
373 echo "$__git_porcelain_commandlist"
374 return
375 fi
376 local i IFS=" "$'\n'
377 for i in "help" $(__git_all_commands)
f2bb9f88
SP
378 do
379 case $i in
718a087a 380 *--*) : helper pattern;;
a925c6f1
SP
381 applymbox) : ask gittus;;
382 applypatch) : ask gittus;;
383 archimport) : import;;
2e3a430a 384 cat-file) : plumbing;;
56d99c67 385 check-attr) : plumbing;;
f2bb9f88
SP
386 check-ref-format) : plumbing;;
387 commit-tree) : plumbing;;
a925c6f1
SP
388 cvsexportcommit) : export;;
389 cvsimport) : import;;
f2bb9f88
SP
390 cvsserver) : daemon;;
391 daemon) : daemon;;
5cfb4fe5
SP
392 diff-files) : plumbing;;
393 diff-index) : plumbing;;
394 diff-tree) : plumbing;;
c6ec3b13 395 fast-import) : import;;
a925c6f1 396 fsck-objects) : plumbing;;
f2bb9f88 397 fetch-pack) : plumbing;;
a925c6f1 398 fmt-merge-msg) : plumbing;;
56d99c67 399 for-each-ref) : plumbing;;
f2bb9f88
SP
400 hash-object) : plumbing;;
401 http-*) : transport;;
402 index-pack) : plumbing;;
a925c6f1 403 init-db) : deprecated;;
f2bb9f88
SP
404 local-fetch) : plumbing;;
405 mailinfo) : plumbing;;
406 mailsplit) : plumbing;;
407 merge-*) : plumbing;;
408 mktree) : plumbing;;
409 mktag) : plumbing;;
410 pack-objects) : plumbing;;
411 pack-redundant) : plumbing;;
412 pack-refs) : plumbing;;
413 parse-remote) : plumbing;;
414 patch-id) : plumbing;;
415 peek-remote) : plumbing;;
a925c6f1
SP
416 prune) : plumbing;;
417 prune-packed) : plumbing;;
418 quiltimport) : import;;
f2bb9f88
SP
419 read-tree) : plumbing;;
420 receive-pack) : plumbing;;
2e3a430a 421 reflog) : plumbing;;
5c66d0d4 422 repo-config) : deprecated;;
f2bb9f88
SP
423 rerere) : plumbing;;
424 rev-list) : plumbing;;
425 rev-parse) : plumbing;;
426 runstatus) : plumbing;;
427 sh-setup) : internal;;
428 shell) : daemon;;
429 send-pack) : plumbing;;
430 show-index) : plumbing;;
431 ssh-*) : transport;;
432 stripspace) : plumbing;;
433 symbolic-ref) : plumbing;;
a925c6f1 434 tar-tree) : deprecated;;
f2bb9f88
SP
435 unpack-file) : plumbing;;
436 unpack-objects) : plumbing;;
a925c6f1 437 update-index) : plumbing;;
f2bb9f88
SP
438 update-ref) : plumbing;;
439 update-server-info) : daemon;;
440 upload-archive) : plumbing;;
441 upload-pack) : plumbing;;
442 write-tree) : plumbing;;
a925c6f1 443 verify-tag) : plumbing;;
f2bb9f88
SP
444 *) echo $i;;
445 esac
446 done
447}
1eb7e2f8
LM
448__git_porcelain_commandlist=
449__git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
f2bb9f88 450
367dce2a
DS
451__git_aliases ()
452{
56fc25f2 453 local i IFS=$'\n'
e0d10e1c 454 for i in $(git --git-dir="$(__gitdir)" config --list); do
56fc25f2
SP
455 case "$i" in
456 alias.*)
457 i="${i#alias.}"
458 echo "${i/=*/}"
459 ;;
460 esac
461 done
367dce2a
DS
462}
463
464__git_aliased_command ()
465{
873537fa 466 local word cmdline=$(git --git-dir="$(__gitdir)" \
e0d10e1c 467 config --get "alias.$1")
367dce2a
DS
468 for word in $cmdline; do
469 if [ "${word##-*}" ]; then
470 echo $word
471 return
472 fi
473 done
474}
475
3ff1320d
SG
476__git_find_subcommand ()
477{
478 local word subcommand c=1
479
480 while [ $c -lt $COMP_CWORD ]; do
481 word="${COMP_WORDS[c]}"
482 for subcommand in $1; do
483 if [ "$subcommand" = "$word" ]; then
484 echo "$subcommand"
485 return
486 fi
487 done
488 c=$((++c))
489 done
490}
491
d773c631
SG
492__git_has_doubledash ()
493{
494 local c=1
495 while [ $c -lt $COMP_CWORD ]; do
496 if [ "--" = "${COMP_WORDS[c]}" ]; then
497 return 0
498 fi
499 c=$((++c))
500 done
501 return 1
502}
503
88329195
SP
504__git_whitespacelist="nowarn warn error error-all strip"
505
506_git_am ()
507{
28ed6e7b 508 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
51ef1daa 509 if [ -d "$dir"/rebase-apply ]; then
a31c00b0 510 __gitcomp "--skip --resolved --abort"
88329195
SP
511 return
512 fi
513 case "$cur" in
514 --whitespace=*)
b3391775 515 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
516 return
517 ;;
518 --*)
b3391775 519 __gitcomp "
88329195
SP
520 --signoff --utf8 --binary --3way --interactive
521 --whitespace=
b3391775 522 "
88329195
SP
523 return
524 esac
525 COMPREPLY=()
526}
527
528_git_apply ()
529{
530 local cur="${COMP_WORDS[COMP_CWORD]}"
531 case "$cur" in
532 --whitespace=*)
b3391775 533 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
534 return
535 ;;
536 --*)
b3391775 537 __gitcomp "
88329195
SP
538 --stat --numstat --summary --check --index
539 --cached --index-info --reverse --reject --unidiff-zero
540 --apply --no-add --exclude=
541 --whitespace= --inaccurate-eof --verbose
b3391775 542 "
88329195
SP
543 return
544 esac
545 COMPREPLY=()
546}
547
8435b548
SP
548_git_add ()
549{
d773c631
SG
550 __git_has_doubledash && return
551
8435b548
SP
552 local cur="${COMP_WORDS[COMP_CWORD]}"
553 case "$cur" in
554 --*)
1d284cba
SG
555 __gitcomp "
556 --interactive --refresh --patch --update --dry-run
557 --ignore-errors
558 "
8435b548
SP
559 return
560 esac
561 COMPREPLY=()
562}
563
b2e69f62
SP
564_git_bisect ()
565{
d773c631
SG
566 __git_has_doubledash && return
567
bf11d461 568 local subcommands="start bad good skip reset visualize replay log run"
3ff1320d
SG
569 local subcommand="$(__git_find_subcommand "$subcommands")"
570 if [ -z "$subcommand" ]; then
571 __gitcomp "$subcommands"
b2e69f62
SP
572 return
573 fi
574
3ff1320d 575 case "$subcommand" in
bf11d461 576 bad|good|reset|skip)
b2e69f62
SP
577 __gitcomp "$(__git_refs)"
578 ;;
579 *)
580 COMPREPLY=()
581 ;;
582 esac
583}
584
690d8824
JH
585_git_branch ()
586{
b9217642
SG
587 local i c=1 only_local_ref="n" has_r="n"
588
589 while [ $c -lt $COMP_CWORD ]; do
590 i="${COMP_WORDS[c]}"
591 case "$i" in
592 -d|-m) only_local_ref="y" ;;
593 -r) has_r="y" ;;
594 esac
595 c=$((++c))
596 done
597
3b376b0c
SG
598 case "${COMP_WORDS[COMP_CWORD]}" in
599 --*=*) COMPREPLY=() ;;
600 --*)
601 __gitcomp "
602 --color --no-color --verbose --abbrev= --no-abbrev
50e61025 603 --track --no-track --contains --merged --no-merged
3b376b0c
SG
604 "
605 ;;
b9217642
SG
606 *)
607 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
608 __gitcomp "$(__git_heads)"
609 else
610 __gitcomp "$(__git_refs)"
611 fi
612 ;;
3b376b0c 613 esac
690d8824
JH
614}
615
374a58c9
ML
616_git_bundle ()
617{
618 local mycword="$COMP_CWORD"
619 case "${COMP_WORDS[0]}" in
620 git)
621 local cmd="${COMP_WORDS[2]}"
622 mycword="$((mycword-1))"
623 ;;
624 git-bundle*)
625 local cmd="${COMP_WORDS[1]}"
626 ;;
627 esac
628 case "$mycword" in
629 1)
630 __gitcomp "create list-heads verify unbundle"
631 ;;
632 2)
633 # looking for a file
634 ;;
635 *)
636 case "$cmd" in
637 create)
638 __git_complete_revlist
639 ;;
640 esac
641 ;;
642 esac
643}
644
690d8824
JH
645_git_checkout ()
646{
c84bb14c
SG
647 __git_has_doubledash && return
648
b3391775 649 __gitcomp "$(__git_refs)"
690d8824
JH
650}
651
d8a9fea5
SP
652_git_cherry ()
653{
654 __gitcomp "$(__git_refs)"
655}
656
1273231e
SP
657_git_cherry_pick ()
658{
659 local cur="${COMP_WORDS[COMP_CWORD]}"
660 case "$cur" in
661 --*)
b3391775 662 __gitcomp "--edit --no-commit"
1273231e
SP
663 ;;
664 *)
b3391775 665 __gitcomp "$(__git_refs)"
1273231e
SP
666 ;;
667 esac
668}
669
3eb11012
LM
670_git_clone ()
671{
672 local cur="${COMP_WORDS[COMP_CWORD]}"
673 case "$cur" in
674 --*)
675 __gitcomp "
676 --local
677 --no-hardlinks
678 --shared
679 --reference
680 --quiet
681 --no-checkout
682 --bare
683 --mirror
684 --origin
685 --upload-pack
686 --template=
687 --depth
688 "
689 return
690 ;;
691 esac
692 COMPREPLY=()
693}
694
4548e855
SP
695_git_commit ()
696{
d773c631
SG
697 __git_has_doubledash && return
698
4548e855
SP
699 local cur="${COMP_WORDS[COMP_CWORD]}"
700 case "$cur" in
701 --*)
b3391775 702 __gitcomp "
4548e855
SP
703 --all --author= --signoff --verify --no-verify
704 --edit --amend --include --only
b3391775 705 "
4548e855
SP
706 return
707 esac
708 COMPREPLY=()
709}
710
217926c0
SP
711_git_describe ()
712{
cbb504c9
TR
713 local cur="${COMP_WORDS[COMP_CWORD]}"
714 case "$cur" in
715 --*)
716 __gitcomp "
717 --all --tags --contains --abbrev= --candidates=
718 --exact-match --debug --long --match --always
719 "
720 return
721 esac
217926c0
SP
722 __gitcomp "$(__git_refs)"
723}
724
690d8824
JH
725_git_diff ()
726{
d773c631
SG
727 __git_has_doubledash && return
728
b3a4f858
JS
729 local cur="${COMP_WORDS[COMP_CWORD]}"
730 case "$cur" in
731 --*)
732 __gitcomp "--cached --stat --numstat --shortstat --summary
733 --patch-with-stat --name-only --name-status --color
734 --no-color --color-words --no-renames --check
735 --full-index --binary --abbrev --diff-filter
736 --find-copies-harder --pickaxe-all --pickaxe-regex
737 --text --ignore-space-at-eol --ignore-space-change
738 --ignore-all-space --exit-code --quiet --ext-diff
aba201c6
PO
739 --no-ext-diff
740 --no-prefix --src-prefix= --dst-prefix=
f4574139 741 --base --ours --theirs
aba201c6 742 "
b3a4f858
JS
743 return
744 ;;
745 esac
690d8824
JH
746 __git_complete_file
747}
748
690d8824
JH
749_git_fetch ()
750{
751 local cur="${COMP_WORDS[COMP_CWORD]}"
752
753 case "${COMP_WORDS[0]},$COMP_CWORD" in
754 git-fetch*,1)
b3391775 755 __gitcomp "$(__git_remotes)"
690d8824
JH
756 ;;
757 git,2)
b3391775 758 __gitcomp "$(__git_remotes)"
690d8824
JH
759 ;;
760 *)
761 case "$cur" in
762 *:*)
db8a9ff0
SP
763 local pfx=""
764 case "$COMP_WORDBREAKS" in
765 *:*) : great ;;
766 *) pfx="${cur%%:*}:" ;;
767 esac
768 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
690d8824
JH
769 ;;
770 *)
771 local remote
772 case "${COMP_WORDS[0]}" in
773 git-fetch) remote="${COMP_WORDS[1]}" ;;
774 git) remote="${COMP_WORDS[2]}" ;;
775 esac
b3391775 776 __gitcomp "$(__git_refs2 "$remote")"
690d8824
JH
777 ;;
778 esac
779 ;;
780 esac
781}
782
f53352fb
SP
783_git_format_patch ()
784{
785 local cur="${COMP_WORDS[COMP_CWORD]}"
786 case "$cur" in
787 --*)
b3391775 788 __gitcomp "
f53352fb
SP
789 --stdout --attach --thread
790 --output-directory
791 --numbered --start-number
47e98eec 792 --numbered-files
f53352fb
SP
793 --keep-subject
794 --signoff
795 --in-reply-to=
796 --full-index --binary
ec804891 797 --not --all
be5f5bf0 798 --cover-letter
aba201c6 799 --no-prefix --src-prefix= --dst-prefix=
b3391775 800 "
f53352fb
SP
801 return
802 ;;
803 esac
804 __git_complete_revlist
805}
806
b26c8748
SP
807_git_gc ()
808{
809 local cur="${COMP_WORDS[COMP_CWORD]}"
810 case "$cur" in
811 --*)
47e98eec 812 __gitcomp "--prune --aggressive"
b26c8748
SP
813 return
814 ;;
815 esac
816 COMPREPLY=()
817}
818
c72e0db1
LM
819_git_grep ()
820{
821 __git_has_doubledash && return
822
823 local cur="${COMP_WORDS[COMP_CWORD]}"
824 case "$cur" in
825 --*)
826 __gitcomp "
827 --cached
828 --text --ignore-case --word-regexp --invert-match
829 --full-name
830 --extended-regexp --basic-regexp --fixed-strings
831 --files-with-matches --name-only
832 --files-without-match
833 --count
834 --and --or --not --all-match
835 "
836 return
837 ;;
838 esac
839 COMPREPLY=()
840}
841
1eb7e2f8
LM
842_git_help ()
843{
844 local cur="${COMP_WORDS[COMP_CWORD]}"
845 case "$cur" in
846 --*)
847 __gitcomp "--all --info --man --web"
848 return
849 ;;
850 esac
851 __gitcomp "$(__git_all_commands)"
852}
853
690d8824
JH
854_git_ls_remote ()
855{
b3391775 856 __gitcomp "$(__git_remotes)"
690d8824
JH
857}
858
859_git_ls_tree ()
860{
861 __git_complete_file
862}
863
864_git_log ()
865{
d773c631
SG
866 __git_has_doubledash && return
867
6e31b866
SP
868 local cur="${COMP_WORDS[COMP_CWORD]}"
869 case "$cur" in
870 --pretty=*)
b3391775 871 __gitcomp "
6e31b866 872 oneline short medium full fuller email raw
b3391775 873 " "" "${cur##--pretty=}"
6e31b866
SP
874 return
875 ;;
47e98eec
SP
876 --date=*)
877 __gitcomp "
878 relative iso8601 rfc2822 short local default
879 " "" "${cur##--date=}"
880 return
881 ;;
6e31b866 882 --*)
b3391775 883 __gitcomp "
6e31b866
SP
884 --max-count= --max-age= --since= --after=
885 --min-age= --before= --until=
8f87fae6 886 --root --topo-order --date-order --reverse
47e98eec 887 --no-merges --follow
6e31b866 888 --abbrev-commit --abbrev=
47e98eec 889 --relative-date --date=
6e31b866
SP
890 --author= --committer= --grep=
891 --all-match
8f87fae6 892 --pretty= --name-status --name-only --raw
ec804891 893 --not --all
7d37b5bf 894 --left-right --cherry-pick
20827d99 895 --graph
66aafad5
TL
896 --stat --numstat --shortstat
897 --decorate --diff-filter=
898 --color-words --walk-reflogs
e49b99a6 899 --parents --children --full-history
b3391775 900 "
6e31b866
SP
901 return
902 ;;
903 esac
f53352fb 904 __git_complete_revlist
690d8824
JH
905}
906
4ad91321
SP
907_git_merge ()
908{
909 local cur="${COMP_WORDS[COMP_CWORD]}"
ce1e39d2
SP
910 case "${COMP_WORDS[COMP_CWORD-1]}" in
911 -s|--strategy)
b3391775 912 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
913 return
914 esac
4ad91321 915 case "$cur" in
ce1e39d2 916 --strategy=*)
b3391775 917 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
918 return
919 ;;
4ad91321 920 --*)
b3391775 921 __gitcomp "
efb779f8 922 --no-commit --no-stat --log --no-log --squash --strategy
b3391775 923 "
4ad91321
SP
924 return
925 esac
b3391775 926 __gitcomp "$(__git_refs)"
4ad91321
SP
927}
928
690d8824
JH
929_git_merge_base ()
930{
b3391775 931 __gitcomp "$(__git_refs)"
690d8824
JH
932}
933
d33909bf
SP
934_git_name_rev ()
935{
b3391775 936 __gitcomp "--tags --all --stdin"
d33909bf
SP
937}
938
690d8824
JH
939_git_pull ()
940{
941 local cur="${COMP_WORDS[COMP_CWORD]}"
942
943 case "${COMP_WORDS[0]},$COMP_CWORD" in
944 git-pull*,1)
b3391775 945 __gitcomp "$(__git_remotes)"
690d8824
JH
946 ;;
947 git,2)
b3391775 948 __gitcomp "$(__git_remotes)"
690d8824
JH
949 ;;
950 *)
951 local remote
952 case "${COMP_WORDS[0]}" in
953 git-pull) remote="${COMP_WORDS[1]}" ;;
954 git) remote="${COMP_WORDS[2]}" ;;
955 esac
b3391775 956 __gitcomp "$(__git_refs "$remote")"
690d8824
JH
957 ;;
958 esac
959}
960
961_git_push ()
962{
963 local cur="${COMP_WORDS[COMP_CWORD]}"
964
965 case "${COMP_WORDS[0]},$COMP_CWORD" in
966 git-push*,1)
b3391775 967 __gitcomp "$(__git_remotes)"
690d8824
JH
968 ;;
969 git,2)
b3391775 970 __gitcomp "$(__git_remotes)"
690d8824
JH
971 ;;
972 *)
973 case "$cur" in
974 *:*)
975 local remote
976 case "${COMP_WORDS[0]}" in
977 git-push) remote="${COMP_WORDS[1]}" ;;
978 git) remote="${COMP_WORDS[2]}" ;;
979 esac
db8a9ff0
SP
980
981 local pfx=""
982 case "$COMP_WORDBREAKS" in
983 *:*) : great ;;
984 *) pfx="${cur%%:*}:" ;;
985 esac
986
987 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
690d8824 988 ;;
161fea83
SP
989 +*)
990 __gitcomp "$(__git_refs)" + "${cur#+}"
991 ;;
690d8824 992 *)
92d7c8e3 993 __gitcomp "$(__git_refs)"
690d8824
JH
994 ;;
995 esac
996 ;;
997 esac
998}
999
61d926a3
SP
1000_git_rebase ()
1001{
51fe1209 1002 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
51ef1daa 1003 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
b3391775 1004 __gitcomp "--continue --skip --abort"
61d926a3
SP
1005 return
1006 fi
ce1e39d2
SP
1007 case "${COMP_WORDS[COMP_CWORD-1]}" in
1008 -s|--strategy)
b3391775 1009 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
1010 return
1011 esac
61d926a3 1012 case "$cur" in
ce1e39d2 1013 --strategy=*)
b3391775 1014 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
1015 return
1016 ;;
61d926a3 1017 --*)
d9e3b702 1018 __gitcomp "--onto --merge --strategy --interactive"
61d926a3
SP
1019 return
1020 esac
b3391775 1021 __gitcomp "$(__git_refs)"
61d926a3
SP
1022}
1023
25a1f374
TL
1024_git_send_email ()
1025{
1026 local cur="${COMP_WORDS[COMP_CWORD]}"
1027 case "$cur" in
1028 --*)
1029 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1030 --dry-run --envelope-sender --from --identity
1031 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1032 --no-suppress-from --no-thread --quiet
1033 --signed-off-by-cc --smtp-pass --smtp-server
1034 --smtp-server-port --smtp-ssl --smtp-user --subject
1035 --suppress-cc --suppress-from --thread --to"
1036 return
1037 ;;
1038 esac
1039 COMPREPLY=()
1040}
1041
e0d10e1c 1042_git_config ()
5de40f59
SP
1043{
1044 local cur="${COMP_WORDS[COMP_CWORD]}"
1045 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1046 case "$prv" in
1047 branch.*.remote)
78d4d6a2 1048 __gitcomp "$(__git_remotes)"
5de40f59
SP
1049 return
1050 ;;
1051 branch.*.merge)
78d4d6a2 1052 __gitcomp "$(__git_refs)"
5de40f59
SP
1053 return
1054 ;;
1055 remote.*.fetch)
1056 local remote="${prv#remote.}"
1057 remote="${remote%.fetch}"
78d4d6a2 1058 __gitcomp "$(__git_refs_remotes "$remote")"
5de40f59
SP
1059 return
1060 ;;
1061 remote.*.push)
1062 local remote="${prv#remote.}"
1063 remote="${remote%.push}"
78d4d6a2 1064 __gitcomp "$(git --git-dir="$(__gitdir)" \
5de40f59 1065 for-each-ref --format='%(refname):%(refname)' \
78d4d6a2
SP
1066 refs/heads)"
1067 return
1068 ;;
1069 pull.twohead|pull.octopus)
1070 __gitcomp "$(__git_merge_strategies)"
1071 return
1072 ;;
1073 color.branch|color.diff|color.status)
1074 __gitcomp "always never auto"
1075 return
1076 ;;
1077 color.*.*)
1078 __gitcomp "
1079 black red green yellow blue magenta cyan white
1080 bold dim ul blink reverse
1081 "
5de40f59
SP
1082 return
1083 ;;
1084 *.*)
1085 COMPREPLY=()
1086 return
1087 ;;
1088 esac
1089 case "$cur" in
1090 --*)
78d4d6a2 1091 __gitcomp "
47e98eec 1092 --global --system --file=
12977705 1093 --list --replace-all
5de40f59 1094 --get --get-all --get-regexp
1b71eb35 1095 --add --unset --unset-all
12977705 1096 --remove-section --rename-section
78d4d6a2 1097 "
5de40f59
SP
1098 return
1099 ;;
1100 branch.*.*)
1101 local pfx="${cur%.*}."
1102 cur="${cur##*.}"
78d4d6a2 1103 __gitcomp "remote merge" "$pfx" "$cur"
5de40f59
SP
1104 return
1105 ;;
1106 branch.*)
1107 local pfx="${cur%.*}."
1108 cur="${cur#*.}"
78d4d6a2 1109 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
5de40f59
SP
1110 return
1111 ;;
1112 remote.*.*)
1113 local pfx="${cur%.*}."
1114 cur="${cur##*.}"
12977705
SP
1115 __gitcomp "
1116 url fetch push skipDefaultUpdate
1117 receivepack uploadpack tagopt
1118 " "$pfx" "$cur"
5de40f59
SP
1119 return
1120 ;;
1121 remote.*)
1122 local pfx="${cur%.*}."
1123 cur="${cur#*.}"
78d4d6a2 1124 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
5de40f59
SP
1125 return
1126 ;;
1127 esac
78d4d6a2 1128 __gitcomp "
5de40f59
SP
1129 apply.whitespace
1130 core.fileMode
1131 core.gitProxy
1132 core.ignoreStat
1133 core.preferSymlinkRefs
1134 core.logAllRefUpdates
47e98eec 1135 core.loosecompression
5de40f59
SP
1136 core.repositoryFormatVersion
1137 core.sharedRepository
1138 core.warnAmbiguousRefs
1139 core.compression
78d4d6a2
SP
1140 core.packedGitWindowSize
1141 core.packedGitLimit
2122591b 1142 clean.requireForce
78d4d6a2
SP
1143 color.branch
1144 color.branch.current
1145 color.branch.local
1146 color.branch.remote
1147 color.branch.plain
a159ca0c 1148 color.diff
78d4d6a2
SP
1149 color.diff.plain
1150 color.diff.meta
1151 color.diff.frag
1152 color.diff.old
1153 color.diff.new
1154 color.diff.commit
1155 color.diff.whitespace
a159ca0c 1156 color.pager
a159ca0c 1157 color.status
78d4d6a2
SP
1158 color.status.header
1159 color.status.added
1160 color.status.changed
1161 color.status.untracked
1162 diff.renameLimit
1163 diff.renames
1164 fetch.unpackLimit
1165 format.headers
47e98eec 1166 format.subjectprefix
78d4d6a2
SP
1167 gitcvs.enabled
1168 gitcvs.logfile
12977705 1169 gitcvs.allbinary
6aeeffd1
JE
1170 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1171 gitcvs.dbtablenameprefix
12977705 1172 gc.packrefs
78d4d6a2
SP
1173 gc.reflogexpire
1174 gc.reflogexpireunreachable
1175 gc.rerereresolved
1176 gc.rerereunresolved
5de40f59
SP
1177 http.sslVerify
1178 http.sslCert
1179 http.sslKey
1180 http.sslCAInfo
1181 http.sslCAPath
1182 http.maxRequests
78d4d6a2
SP
1183 http.lowSpeedLimit
1184 http.lowSpeedTime
5de40f59 1185 http.noEPSV
78d4d6a2
SP
1186 i18n.commitEncoding
1187 i18n.logOutputEncoding
1188 log.showroot
12977705 1189 merge.tool
78d4d6a2
SP
1190 merge.summary
1191 merge.verbosity
5de40f59 1192 pack.window
12977705 1193 pack.depth
47e98eec
SP
1194 pack.windowMemory
1195 pack.compression
1196 pack.deltaCacheSize
1197 pack.deltaCacheLimit
78d4d6a2
SP
1198 pull.octopus
1199 pull.twohead
5de40f59 1200 repack.useDeltaBaseOffset
78d4d6a2
SP
1201 showbranch.default
1202 tar.umask
1203 transfer.unpackLimit
5de40f59
SP
1204 receive.unpackLimit
1205 receive.denyNonFastForwards
78d4d6a2
SP
1206 user.name
1207 user.email
1208 user.signingkey
5de40f59 1209 branch. remote.
78d4d6a2 1210 "
5de40f59
SP
1211}
1212
88293c67
SP
1213_git_remote ()
1214{
3ff1320d
SG
1215 local subcommands="add rm show prune update"
1216 local subcommand="$(__git_find_subcommand "$subcommands")"
1217 if [ -z "$subcommand" ]; then
3903c618 1218 __gitcomp "$subcommands"
88293c67
SP
1219 return
1220 fi
1221
3ff1320d 1222 case "$subcommand" in
a3b811a4 1223 rm|show|prune)
88293c67
SP
1224 __gitcomp "$(__git_remotes)"
1225 ;;
fb72759b
SP
1226 update)
1227 local i c='' IFS=$'\n'
1228 for i in $(git --git-dir="$(__gitdir)" config --list); do
1229 case "$i" in
1230 remotes.*)
1231 i="${i#remotes.}"
1232 c="$c ${i/=*/}"
1233 ;;
1234 esac
1235 done
1236 __gitcomp "$c"
1237 ;;
88293c67
SP
1238 *)
1239 COMPREPLY=()
1240 ;;
1241 esac
1242}
1243
67e78c3b
SP
1244_git_reset ()
1245{
d773c631
SG
1246 __git_has_doubledash && return
1247
67e78c3b 1248 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775
SP
1249 case "$cur" in
1250 --*)
1251 __gitcomp "--mixed --hard --soft"
1252 return
1253 ;;
1254 esac
1255 __gitcomp "$(__git_refs)"
67e78c3b
SP
1256}
1257
08c701d4
LM
1258_git_rm ()
1259{
1260 __git_has_doubledash && return
1261
1262 local cur="${COMP_WORDS[COMP_CWORD]}"
1263 case "$cur" in
1264 --*)
1265 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1266 return
1267 ;;
1268 esac
1269 COMPREPLY=()
1270}
1271
1fd6bec9
SP
1272_git_shortlog ()
1273{
d773c631
SG
1274 __git_has_doubledash && return
1275
1fd6bec9
SP
1276 local cur="${COMP_WORDS[COMP_CWORD]}"
1277 case "$cur" in
1278 --*)
1279 __gitcomp "
1280 --max-count= --max-age= --since= --after=
1281 --min-age= --before= --until=
1282 --no-merges
1283 --author= --committer= --grep=
1284 --all-match
1285 --not --all
1286 --numbered --summary
1287 "
1288 return
1289 ;;
1290 esac
1291 __git_complete_revlist
1292}
1293
90131924
SP
1294_git_show ()
1295{
1296 local cur="${COMP_WORDS[COMP_CWORD]}"
1297 case "$cur" in
1298 --pretty=*)
b3391775 1299 __gitcomp "
90131924 1300 oneline short medium full fuller email raw
b3391775 1301 " "" "${cur##--pretty=}"
90131924
SP
1302 return
1303 ;;
1304 --*)
b3391775 1305 __gitcomp "--pretty="
90131924
SP
1306 return
1307 ;;
1308 esac
1309 __git_complete_file
1310}
1311
2ca880fe
TR
1312_git_show_branch ()
1313{
1314 local cur="${COMP_WORDS[COMP_CWORD]}"
1315 case "$cur" in
1316 --*)
1317 __gitcomp "
1318 --all --remotes --topo-order --current --more=
1319 --list --independent --merge-base --no-name
1320 --sha1-name --topics --reflog
1321 "
1322 return
1323 ;;
1324 esac
1325 __git_complete_revlist
1326}
1327
7fd53fce
JH
1328_git_stash ()
1329{
88b302f5 1330 local subcommands='save list show apply clear drop pop create'
7bedebca
SG
1331 local subcommand="$(__git_find_subcommand "$subcommands")"
1332 if [ -z "$subcommand" ]; then
3ff1320d 1333 __gitcomp "$subcommands"
7bedebca
SG
1334 else
1335 local cur="${COMP_WORDS[COMP_CWORD]}"
1336 case "$subcommand,$cur" in
1337 save,--*)
1338 __gitcomp "--keep-index"
1339 ;;
1340 *)
1341 COMPREPLY=()
1342 ;;
1343 esac
3ff1320d 1344 fi
7fd53fce
JH
1345}
1346
be86f7a0
SP
1347_git_submodule ()
1348{
d773c631
SG
1349 __git_has_doubledash && return
1350
3ff1320d
SG
1351 local subcommands="add status init update"
1352 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
be86f7a0
SP
1353 local cur="${COMP_WORDS[COMP_CWORD]}"
1354 case "$cur" in
1355 --*)
1356 __gitcomp "--quiet --cached"
1357 ;;
1358 *)
3ff1320d 1359 __gitcomp "$subcommands"
be86f7a0
SP
1360 ;;
1361 esac
1362 return
1363 fi
1364}
1365
47f6ee28
SG
1366_git_svn ()
1367{
1368 local subcommands="
1369 init fetch clone rebase dcommit log find-rev
1370 set-tree commit-diff info create-ignore propget
1371 proplist show-ignore show-externals
1372 "
1373 local subcommand="$(__git_find_subcommand "$subcommands")"
1374 if [ -z "$subcommand" ]; then
1375 __gitcomp "$subcommands"
1376 else
1377 local remote_opts="--username= --config-dir= --no-auth-cache"
1378 local fc_opts="
1379 --follow-parent --authors-file= --repack=
1380 --no-metadata --use-svm-props --use-svnsync-props
1381 --log-window-size= --no-checkout --quiet
1382 --repack-flags --user-log-author $remote_opts
1383 "
1384 local init_opts="
1385 --template= --shared= --trunk= --tags=
1386 --branches= --stdlayout --minimize-url
1387 --no-metadata --use-svm-props --use-svnsync-props
1388 --rewrite-root= $remote_opts
1389 "
1390 local cmt_opts="
1391 --edit --rmdir --find-copies-harder --copy-similarity=
1392 "
1393
1394 local cur="${COMP_WORDS[COMP_CWORD]}"
1395 case "$subcommand,$cur" in
1396 fetch,--*)
1397 __gitcomp "--revision= --fetch-all $fc_opts"
1398 ;;
1399 clone,--*)
1400 __gitcomp "--revision= $fc_opts $init_opts"
1401 ;;
1402 init,--*)
1403 __gitcomp "$init_opts"
1404 ;;
1405 dcommit,--*)
1406 __gitcomp "
1407 --merge --strategy= --verbose --dry-run
1408 --fetch-all --no-rebase $cmt_opts $fc_opts
1409 "
1410 ;;
1411 set-tree,--*)
1412 __gitcomp "--stdin $cmt_opts $fc_opts"
1413 ;;
1414 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1415 show-externals,--*)
1416 __gitcomp "--revision="
1417 ;;
1418 log,--*)
1419 __gitcomp "
1420 --limit= --revision= --verbose --incremental
1421 --oneline --show-commit --non-recursive
1422 --authors-file=
1423 "
1424 ;;
1425 rebase,--*)
1426 __gitcomp "
1427 --merge --verbose --strategy= --local
1428 --fetch-all $fc_opts
1429 "
1430 ;;
1431 commit-diff,--*)
1432 __gitcomp "--message= --file= --revision= $cmt_opts"
1433 ;;
1434 info,--*)
1435 __gitcomp "--url"
1436 ;;
1437 *)
1438 COMPREPLY=()
1439 ;;
1440 esac
1441 fi
1442}
1443
88e21dc7
SP
1444_git_tag ()
1445{
1446 local i c=1 f=0
1447 while [ $c -lt $COMP_CWORD ]; do
1448 i="${COMP_WORDS[c]}"
1449 case "$i" in
1450 -d|-v)
1451 __gitcomp "$(__git_tags)"
1452 return
1453 ;;
1454 -f)
1455 f=1
1456 ;;
1457 esac
1458 c=$((++c))
1459 done
1460
1461 case "${COMP_WORDS[COMP_CWORD-1]}" in
1462 -m|-F)
1463 COMPREPLY=()
1464 ;;
1465 -*|tag|git-tag)
1466 if [ $f = 1 ]; then
1467 __gitcomp "$(__git_tags)"
1468 else
1469 COMPREPLY=()
1470 fi
1471 ;;
1472 *)
1473 __gitcomp "$(__git_refs)"
1474 ;;
1475 esac
1476}
1477
690d8824
JH
1478_git ()
1479{
873537fa
SP
1480 local i c=1 command __git_dir
1481
1482 while [ $c -lt $COMP_CWORD ]; do
1483 i="${COMP_WORDS[c]}"
1484 case "$i" in
1485 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1486 --bare) __git_dir="." ;;
1eb7e2f8
LM
1487 --version|-p|--paginate) ;;
1488 --help) command="help"; break ;;
873537fa
SP
1489 *) command="$i"; break ;;
1490 esac
1491 c=$((++c))
1492 done
1493
1d17b22e 1494 if [ -z "$command" ]; then
72e5e989
SP
1495 case "${COMP_WORDS[COMP_CWORD]}" in
1496 --*=*) COMPREPLY=() ;;
47e98eec 1497 --*) __gitcomp "
ce5a2c95 1498 --paginate
47e98eec
SP
1499 --no-pager
1500 --git-dir=
1501 --bare
1502 --version
1503 --exec-path
ce5a2c95
TL
1504 --work-tree=
1505 --help
47e98eec
SP
1506 "
1507 ;;
1eb7e2f8 1508 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
72e5e989
SP
1509 esac
1510 return
873537fa 1511 fi
367dce2a 1512
873537fa
SP
1513 local expansion=$(__git_aliased_command "$command")
1514 [ "$expansion" ] && command="$expansion"
367dce2a 1515
873537fa 1516 case "$command" in
88329195 1517 am) _git_am ;;
8435b548 1518 add) _git_add ;;
88329195 1519 apply) _git_apply ;;
b2e69f62 1520 bisect) _git_bisect ;;
374a58c9 1521 bundle) _git_bundle ;;
873537fa 1522 branch) _git_branch ;;
873537fa 1523 checkout) _git_checkout ;;
d8a9fea5 1524 cherry) _git_cherry ;;
1273231e 1525 cherry-pick) _git_cherry_pick ;;
3eb11012 1526 clone) _git_clone ;;
4548e855 1527 commit) _git_commit ;;
e0d10e1c 1528 config) _git_config ;;
217926c0 1529 describe) _git_describe ;;
873537fa 1530 diff) _git_diff ;;
873537fa 1531 fetch) _git_fetch ;;
f53352fb 1532 format-patch) _git_format_patch ;;
b26c8748 1533 gc) _git_gc ;;
c72e0db1 1534 grep) _git_grep ;;
1eb7e2f8 1535 help) _git_help ;;
873537fa
SP
1536 log) _git_log ;;
1537 ls-remote) _git_ls_remote ;;
1538 ls-tree) _git_ls_tree ;;
4ad91321 1539 merge) _git_merge;;
873537fa 1540 merge-base) _git_merge_base ;;
d33909bf 1541 name-rev) _git_name_rev ;;
873537fa
SP
1542 pull) _git_pull ;;
1543 push) _git_push ;;
61d926a3 1544 rebase) _git_rebase ;;
88293c67 1545 remote) _git_remote ;;
873537fa 1546 reset) _git_reset ;;
08c701d4 1547 rm) _git_rm ;;
25a1f374 1548 send-email) _git_send_email ;;
1fd6bec9 1549 shortlog) _git_shortlog ;;
90131924 1550 show) _git_show ;;
2ca880fe 1551 show-branch) _git_show_branch ;;
7fd53fce 1552 stash) _git_stash ;;
be86f7a0 1553 submodule) _git_submodule ;;
47f6ee28 1554 svn) _git_svn ;;
88e21dc7 1555 tag) _git_tag ;;
873537fa
SP
1556 whatchanged) _git_log ;;
1557 *) COMPREPLY=() ;;
1558 esac
690d8824
JH
1559}
1560
1561_gitk ()
1562{
d773c631
SG
1563 __git_has_doubledash && return
1564
690d8824 1565 local cur="${COMP_WORDS[COMP_CWORD]}"
07ba53f7
RQ
1566 local g="$(git rev-parse --git-dir 2>/dev/null)"
1567 local merge=""
1568 if [ -f $g/MERGE_HEAD ]; then
1569 merge="--merge"
1570 fi
b3391775
SP
1571 case "$cur" in
1572 --*)
07ba53f7 1573 __gitcomp "--not --all $merge"
b3391775
SP
1574 return
1575 ;;
1576 esac
ec804891 1577 __git_complete_revlist
690d8824
JH
1578}
1579
1580complete -o default -o nospace -F _git git
b3391775 1581complete -o default -o nospace -F _gitk gitk
690d8824
JH
1582
1583# The following are necessary only for Cygwin, and only are needed
1584# when the user has tab-completed the executable name and consequently
1585# included the '.exe' suffix.
1586#
76c3eb51 1587if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
144d33de 1588complete -o default -o nospace -F _git git.exe
76c3eb51 1589fi