]> git.ipfire.org Git - thirdparty/git.git/blame - contrib/completion/git-completion.bash
bash completion: Add completion for 'git grep'
[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{
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
4548e855
SP
670_git_commit ()
671{
d773c631
SG
672 __git_has_doubledash && return
673
4548e855
SP
674 local cur="${COMP_WORDS[COMP_CWORD]}"
675 case "$cur" in
676 --*)
b3391775 677 __gitcomp "
4548e855
SP
678 --all --author= --signoff --verify --no-verify
679 --edit --amend --include --only
b3391775 680 "
4548e855
SP
681 return
682 esac
683 COMPREPLY=()
684}
685
217926c0
SP
686_git_describe ()
687{
cbb504c9
TR
688 local cur="${COMP_WORDS[COMP_CWORD]}"
689 case "$cur" in
690 --*)
691 __gitcomp "
692 --all --tags --contains --abbrev= --candidates=
693 --exact-match --debug --long --match --always
694 "
695 return
696 esac
217926c0
SP
697 __gitcomp "$(__git_refs)"
698}
699
690d8824
JH
700_git_diff ()
701{
d773c631
SG
702 __git_has_doubledash && return
703
b3a4f858
JS
704 local cur="${COMP_WORDS[COMP_CWORD]}"
705 case "$cur" in
706 --*)
707 __gitcomp "--cached --stat --numstat --shortstat --summary
708 --patch-with-stat --name-only --name-status --color
709 --no-color --color-words --no-renames --check
710 --full-index --binary --abbrev --diff-filter
711 --find-copies-harder --pickaxe-all --pickaxe-regex
712 --text --ignore-space-at-eol --ignore-space-change
713 --ignore-all-space --exit-code --quiet --ext-diff
aba201c6
PO
714 --no-ext-diff
715 --no-prefix --src-prefix= --dst-prefix=
f4574139 716 --base --ours --theirs
aba201c6 717 "
b3a4f858
JS
718 return
719 ;;
720 esac
690d8824
JH
721 __git_complete_file
722}
723
690d8824
JH
724_git_fetch ()
725{
726 local cur="${COMP_WORDS[COMP_CWORD]}"
727
728 case "${COMP_WORDS[0]},$COMP_CWORD" in
729 git-fetch*,1)
b3391775 730 __gitcomp "$(__git_remotes)"
690d8824
JH
731 ;;
732 git,2)
b3391775 733 __gitcomp "$(__git_remotes)"
690d8824
JH
734 ;;
735 *)
736 case "$cur" in
737 *:*)
db8a9ff0
SP
738 local pfx=""
739 case "$COMP_WORDBREAKS" in
740 *:*) : great ;;
741 *) pfx="${cur%%:*}:" ;;
742 esac
743 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
690d8824
JH
744 ;;
745 *)
746 local remote
747 case "${COMP_WORDS[0]}" in
748 git-fetch) remote="${COMP_WORDS[1]}" ;;
749 git) remote="${COMP_WORDS[2]}" ;;
750 esac
b3391775 751 __gitcomp "$(__git_refs2 "$remote")"
690d8824
JH
752 ;;
753 esac
754 ;;
755 esac
756}
757
f53352fb
SP
758_git_format_patch ()
759{
760 local cur="${COMP_WORDS[COMP_CWORD]}"
761 case "$cur" in
762 --*)
b3391775 763 __gitcomp "
f53352fb
SP
764 --stdout --attach --thread
765 --output-directory
766 --numbered --start-number
47e98eec 767 --numbered-files
f53352fb
SP
768 --keep-subject
769 --signoff
770 --in-reply-to=
771 --full-index --binary
ec804891 772 --not --all
be5f5bf0 773 --cover-letter
aba201c6 774 --no-prefix --src-prefix= --dst-prefix=
b3391775 775 "
f53352fb
SP
776 return
777 ;;
778 esac
779 __git_complete_revlist
780}
781
b26c8748
SP
782_git_gc ()
783{
784 local cur="${COMP_WORDS[COMP_CWORD]}"
785 case "$cur" in
786 --*)
47e98eec 787 __gitcomp "--prune --aggressive"
b26c8748
SP
788 return
789 ;;
790 esac
791 COMPREPLY=()
792}
793
c72e0db1
LM
794_git_grep ()
795{
796 __git_has_doubledash && return
797
798 local cur="${COMP_WORDS[COMP_CWORD]}"
799 case "$cur" in
800 --*)
801 __gitcomp "
802 --cached
803 --text --ignore-case --word-regexp --invert-match
804 --full-name
805 --extended-regexp --basic-regexp --fixed-strings
806 --files-with-matches --name-only
807 --files-without-match
808 --count
809 --and --or --not --all-match
810 "
811 return
812 ;;
813 esac
814 COMPREPLY=()
815}
816
1eb7e2f8
LM
817_git_help ()
818{
819 local cur="${COMP_WORDS[COMP_CWORD]}"
820 case "$cur" in
821 --*)
822 __gitcomp "--all --info --man --web"
823 return
824 ;;
825 esac
826 __gitcomp "$(__git_all_commands)"
827}
828
690d8824
JH
829_git_ls_remote ()
830{
b3391775 831 __gitcomp "$(__git_remotes)"
690d8824
JH
832}
833
834_git_ls_tree ()
835{
836 __git_complete_file
837}
838
839_git_log ()
840{
d773c631
SG
841 __git_has_doubledash && return
842
6e31b866
SP
843 local cur="${COMP_WORDS[COMP_CWORD]}"
844 case "$cur" in
845 --pretty=*)
b3391775 846 __gitcomp "
6e31b866 847 oneline short medium full fuller email raw
b3391775 848 " "" "${cur##--pretty=}"
6e31b866
SP
849 return
850 ;;
47e98eec
SP
851 --date=*)
852 __gitcomp "
853 relative iso8601 rfc2822 short local default
854 " "" "${cur##--date=}"
855 return
856 ;;
6e31b866 857 --*)
b3391775 858 __gitcomp "
6e31b866
SP
859 --max-count= --max-age= --since= --after=
860 --min-age= --before= --until=
8f87fae6 861 --root --topo-order --date-order --reverse
47e98eec 862 --no-merges --follow
6e31b866 863 --abbrev-commit --abbrev=
47e98eec 864 --relative-date --date=
6e31b866
SP
865 --author= --committer= --grep=
866 --all-match
8f87fae6 867 --pretty= --name-status --name-only --raw
ec804891 868 --not --all
7d37b5bf 869 --left-right --cherry-pick
20827d99 870 --graph
66aafad5
TL
871 --stat --numstat --shortstat
872 --decorate --diff-filter=
873 --color-words --walk-reflogs
e49b99a6 874 --parents --children --full-history
b3391775 875 "
6e31b866
SP
876 return
877 ;;
878 esac
f53352fb 879 __git_complete_revlist
690d8824
JH
880}
881
4ad91321
SP
882_git_merge ()
883{
884 local cur="${COMP_WORDS[COMP_CWORD]}"
ce1e39d2
SP
885 case "${COMP_WORDS[COMP_CWORD-1]}" in
886 -s|--strategy)
b3391775 887 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
888 return
889 esac
4ad91321 890 case "$cur" in
ce1e39d2 891 --strategy=*)
b3391775 892 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
893 return
894 ;;
4ad91321 895 --*)
b3391775 896 __gitcomp "
efb779f8 897 --no-commit --no-stat --log --no-log --squash --strategy
b3391775 898 "
4ad91321
SP
899 return
900 esac
b3391775 901 __gitcomp "$(__git_refs)"
4ad91321
SP
902}
903
690d8824
JH
904_git_merge_base ()
905{
b3391775 906 __gitcomp "$(__git_refs)"
690d8824
JH
907}
908
d33909bf
SP
909_git_name_rev ()
910{
b3391775 911 __gitcomp "--tags --all --stdin"
d33909bf
SP
912}
913
690d8824
JH
914_git_pull ()
915{
916 local cur="${COMP_WORDS[COMP_CWORD]}"
917
918 case "${COMP_WORDS[0]},$COMP_CWORD" in
919 git-pull*,1)
b3391775 920 __gitcomp "$(__git_remotes)"
690d8824
JH
921 ;;
922 git,2)
b3391775 923 __gitcomp "$(__git_remotes)"
690d8824
JH
924 ;;
925 *)
926 local remote
927 case "${COMP_WORDS[0]}" in
928 git-pull) remote="${COMP_WORDS[1]}" ;;
929 git) remote="${COMP_WORDS[2]}" ;;
930 esac
b3391775 931 __gitcomp "$(__git_refs "$remote")"
690d8824
JH
932 ;;
933 esac
934}
935
936_git_push ()
937{
938 local cur="${COMP_WORDS[COMP_CWORD]}"
939
940 case "${COMP_WORDS[0]},$COMP_CWORD" in
941 git-push*,1)
b3391775 942 __gitcomp "$(__git_remotes)"
690d8824
JH
943 ;;
944 git,2)
b3391775 945 __gitcomp "$(__git_remotes)"
690d8824
JH
946 ;;
947 *)
948 case "$cur" in
949 *:*)
950 local remote
951 case "${COMP_WORDS[0]}" in
952 git-push) remote="${COMP_WORDS[1]}" ;;
953 git) remote="${COMP_WORDS[2]}" ;;
954 esac
db8a9ff0
SP
955
956 local pfx=""
957 case "$COMP_WORDBREAKS" in
958 *:*) : great ;;
959 *) pfx="${cur%%:*}:" ;;
960 esac
961
962 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
690d8824 963 ;;
161fea83
SP
964 +*)
965 __gitcomp "$(__git_refs)" + "${cur#+}"
966 ;;
690d8824 967 *)
92d7c8e3 968 __gitcomp "$(__git_refs)"
690d8824
JH
969 ;;
970 esac
971 ;;
972 esac
973}
974
61d926a3
SP
975_git_rebase ()
976{
51fe1209 977 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
51ef1daa 978 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
b3391775 979 __gitcomp "--continue --skip --abort"
61d926a3
SP
980 return
981 fi
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
61d926a3 987 case "$cur" in
ce1e39d2 988 --strategy=*)
b3391775 989 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
990 return
991 ;;
61d926a3 992 --*)
d9e3b702 993 __gitcomp "--onto --merge --strategy --interactive"
61d926a3
SP
994 return
995 esac
b3391775 996 __gitcomp "$(__git_refs)"
61d926a3
SP
997}
998
25a1f374
TL
999_git_send_email ()
1000{
1001 local cur="${COMP_WORDS[COMP_CWORD]}"
1002 case "$cur" in
1003 --*)
1004 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1005 --dry-run --envelope-sender --from --identity
1006 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1007 --no-suppress-from --no-thread --quiet
1008 --signed-off-by-cc --smtp-pass --smtp-server
1009 --smtp-server-port --smtp-ssl --smtp-user --subject
1010 --suppress-cc --suppress-from --thread --to"
1011 return
1012 ;;
1013 esac
1014 COMPREPLY=()
1015}
1016
e0d10e1c 1017_git_config ()
5de40f59
SP
1018{
1019 local cur="${COMP_WORDS[COMP_CWORD]}"
1020 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1021 case "$prv" in
1022 branch.*.remote)
78d4d6a2 1023 __gitcomp "$(__git_remotes)"
5de40f59
SP
1024 return
1025 ;;
1026 branch.*.merge)
78d4d6a2 1027 __gitcomp "$(__git_refs)"
5de40f59
SP
1028 return
1029 ;;
1030 remote.*.fetch)
1031 local remote="${prv#remote.}"
1032 remote="${remote%.fetch}"
78d4d6a2 1033 __gitcomp "$(__git_refs_remotes "$remote")"
5de40f59
SP
1034 return
1035 ;;
1036 remote.*.push)
1037 local remote="${prv#remote.}"
1038 remote="${remote%.push}"
78d4d6a2 1039 __gitcomp "$(git --git-dir="$(__gitdir)" \
5de40f59 1040 for-each-ref --format='%(refname):%(refname)' \
78d4d6a2
SP
1041 refs/heads)"
1042 return
1043 ;;
1044 pull.twohead|pull.octopus)
1045 __gitcomp "$(__git_merge_strategies)"
1046 return
1047 ;;
1048 color.branch|color.diff|color.status)
1049 __gitcomp "always never auto"
1050 return
1051 ;;
1052 color.*.*)
1053 __gitcomp "
1054 black red green yellow blue magenta cyan white
1055 bold dim ul blink reverse
1056 "
5de40f59
SP
1057 return
1058 ;;
1059 *.*)
1060 COMPREPLY=()
1061 return
1062 ;;
1063 esac
1064 case "$cur" in
1065 --*)
78d4d6a2 1066 __gitcomp "
47e98eec 1067 --global --system --file=
12977705 1068 --list --replace-all
5de40f59 1069 --get --get-all --get-regexp
1b71eb35 1070 --add --unset --unset-all
12977705 1071 --remove-section --rename-section
78d4d6a2 1072 "
5de40f59
SP
1073 return
1074 ;;
1075 branch.*.*)
1076 local pfx="${cur%.*}."
1077 cur="${cur##*.}"
78d4d6a2 1078 __gitcomp "remote merge" "$pfx" "$cur"
5de40f59
SP
1079 return
1080 ;;
1081 branch.*)
1082 local pfx="${cur%.*}."
1083 cur="${cur#*.}"
78d4d6a2 1084 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
5de40f59
SP
1085 return
1086 ;;
1087 remote.*.*)
1088 local pfx="${cur%.*}."
1089 cur="${cur##*.}"
12977705
SP
1090 __gitcomp "
1091 url fetch push skipDefaultUpdate
1092 receivepack uploadpack tagopt
1093 " "$pfx" "$cur"
5de40f59
SP
1094 return
1095 ;;
1096 remote.*)
1097 local pfx="${cur%.*}."
1098 cur="${cur#*.}"
78d4d6a2 1099 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
5de40f59
SP
1100 return
1101 ;;
1102 esac
78d4d6a2 1103 __gitcomp "
5de40f59
SP
1104 apply.whitespace
1105 core.fileMode
1106 core.gitProxy
1107 core.ignoreStat
1108 core.preferSymlinkRefs
1109 core.logAllRefUpdates
47e98eec 1110 core.loosecompression
5de40f59
SP
1111 core.repositoryFormatVersion
1112 core.sharedRepository
1113 core.warnAmbiguousRefs
1114 core.compression
78d4d6a2
SP
1115 core.packedGitWindowSize
1116 core.packedGitLimit
2122591b 1117 clean.requireForce
78d4d6a2
SP
1118 color.branch
1119 color.branch.current
1120 color.branch.local
1121 color.branch.remote
1122 color.branch.plain
a159ca0c 1123 color.diff
78d4d6a2
SP
1124 color.diff.plain
1125 color.diff.meta
1126 color.diff.frag
1127 color.diff.old
1128 color.diff.new
1129 color.diff.commit
1130 color.diff.whitespace
a159ca0c 1131 color.pager
a159ca0c 1132 color.status
78d4d6a2
SP
1133 color.status.header
1134 color.status.added
1135 color.status.changed
1136 color.status.untracked
1137 diff.renameLimit
1138 diff.renames
1139 fetch.unpackLimit
1140 format.headers
47e98eec 1141 format.subjectprefix
78d4d6a2
SP
1142 gitcvs.enabled
1143 gitcvs.logfile
12977705 1144 gitcvs.allbinary
6aeeffd1
JE
1145 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1146 gitcvs.dbtablenameprefix
12977705 1147 gc.packrefs
78d4d6a2
SP
1148 gc.reflogexpire
1149 gc.reflogexpireunreachable
1150 gc.rerereresolved
1151 gc.rerereunresolved
5de40f59
SP
1152 http.sslVerify
1153 http.sslCert
1154 http.sslKey
1155 http.sslCAInfo
1156 http.sslCAPath
1157 http.maxRequests
78d4d6a2
SP
1158 http.lowSpeedLimit
1159 http.lowSpeedTime
5de40f59 1160 http.noEPSV
78d4d6a2
SP
1161 i18n.commitEncoding
1162 i18n.logOutputEncoding
1163 log.showroot
12977705 1164 merge.tool
78d4d6a2
SP
1165 merge.summary
1166 merge.verbosity
5de40f59 1167 pack.window
12977705 1168 pack.depth
47e98eec
SP
1169 pack.windowMemory
1170 pack.compression
1171 pack.deltaCacheSize
1172 pack.deltaCacheLimit
78d4d6a2
SP
1173 pull.octopus
1174 pull.twohead
5de40f59 1175 repack.useDeltaBaseOffset
78d4d6a2
SP
1176 showbranch.default
1177 tar.umask
1178 transfer.unpackLimit
5de40f59
SP
1179 receive.unpackLimit
1180 receive.denyNonFastForwards
78d4d6a2
SP
1181 user.name
1182 user.email
1183 user.signingkey
5de40f59 1184 branch. remote.
78d4d6a2 1185 "
5de40f59
SP
1186}
1187
88293c67
SP
1188_git_remote ()
1189{
3ff1320d
SG
1190 local subcommands="add rm show prune update"
1191 local subcommand="$(__git_find_subcommand "$subcommands")"
1192 if [ -z "$subcommand" ]; then
3903c618 1193 __gitcomp "$subcommands"
88293c67
SP
1194 return
1195 fi
1196
3ff1320d 1197 case "$subcommand" in
a3b811a4 1198 rm|show|prune)
88293c67
SP
1199 __gitcomp "$(__git_remotes)"
1200 ;;
fb72759b
SP
1201 update)
1202 local i c='' IFS=$'\n'
1203 for i in $(git --git-dir="$(__gitdir)" config --list); do
1204 case "$i" in
1205 remotes.*)
1206 i="${i#remotes.}"
1207 c="$c ${i/=*/}"
1208 ;;
1209 esac
1210 done
1211 __gitcomp "$c"
1212 ;;
88293c67
SP
1213 *)
1214 COMPREPLY=()
1215 ;;
1216 esac
1217}
1218
67e78c3b
SP
1219_git_reset ()
1220{
d773c631
SG
1221 __git_has_doubledash && return
1222
67e78c3b 1223 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775
SP
1224 case "$cur" in
1225 --*)
1226 __gitcomp "--mixed --hard --soft"
1227 return
1228 ;;
1229 esac
1230 __gitcomp "$(__git_refs)"
67e78c3b
SP
1231}
1232
08c701d4
LM
1233_git_rm ()
1234{
1235 __git_has_doubledash && return
1236
1237 local cur="${COMP_WORDS[COMP_CWORD]}"
1238 case "$cur" in
1239 --*)
1240 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1241 return
1242 ;;
1243 esac
1244 COMPREPLY=()
1245}
1246
1fd6bec9
SP
1247_git_shortlog ()
1248{
d773c631
SG
1249 __git_has_doubledash && return
1250
1fd6bec9
SP
1251 local cur="${COMP_WORDS[COMP_CWORD]}"
1252 case "$cur" in
1253 --*)
1254 __gitcomp "
1255 --max-count= --max-age= --since= --after=
1256 --min-age= --before= --until=
1257 --no-merges
1258 --author= --committer= --grep=
1259 --all-match
1260 --not --all
1261 --numbered --summary
1262 "
1263 return
1264 ;;
1265 esac
1266 __git_complete_revlist
1267}
1268
90131924
SP
1269_git_show ()
1270{
1271 local cur="${COMP_WORDS[COMP_CWORD]}"
1272 case "$cur" in
1273 --pretty=*)
b3391775 1274 __gitcomp "
90131924 1275 oneline short medium full fuller email raw
b3391775 1276 " "" "${cur##--pretty=}"
90131924
SP
1277 return
1278 ;;
1279 --*)
b3391775 1280 __gitcomp "--pretty="
90131924
SP
1281 return
1282 ;;
1283 esac
1284 __git_complete_file
1285}
1286
2ca880fe
TR
1287_git_show_branch ()
1288{
1289 local cur="${COMP_WORDS[COMP_CWORD]}"
1290 case "$cur" in
1291 --*)
1292 __gitcomp "
1293 --all --remotes --topo-order --current --more=
1294 --list --independent --merge-base --no-name
1295 --sha1-name --topics --reflog
1296 "
1297 return
1298 ;;
1299 esac
1300 __git_complete_revlist
1301}
1302
7fd53fce
JH
1303_git_stash ()
1304{
88b302f5 1305 local subcommands='save list show apply clear drop pop create'
7bedebca
SG
1306 local subcommand="$(__git_find_subcommand "$subcommands")"
1307 if [ -z "$subcommand" ]; then
3ff1320d 1308 __gitcomp "$subcommands"
7bedebca
SG
1309 else
1310 local cur="${COMP_WORDS[COMP_CWORD]}"
1311 case "$subcommand,$cur" in
1312 save,--*)
1313 __gitcomp "--keep-index"
1314 ;;
1315 *)
1316 COMPREPLY=()
1317 ;;
1318 esac
3ff1320d 1319 fi
7fd53fce
JH
1320}
1321
be86f7a0
SP
1322_git_submodule ()
1323{
d773c631
SG
1324 __git_has_doubledash && return
1325
3ff1320d
SG
1326 local subcommands="add status init update"
1327 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
be86f7a0
SP
1328 local cur="${COMP_WORDS[COMP_CWORD]}"
1329 case "$cur" in
1330 --*)
1331 __gitcomp "--quiet --cached"
1332 ;;
1333 *)
3ff1320d 1334 __gitcomp "$subcommands"
be86f7a0
SP
1335 ;;
1336 esac
1337 return
1338 fi
1339}
1340
47f6ee28
SG
1341_git_svn ()
1342{
1343 local subcommands="
1344 init fetch clone rebase dcommit log find-rev
1345 set-tree commit-diff info create-ignore propget
1346 proplist show-ignore show-externals
1347 "
1348 local subcommand="$(__git_find_subcommand "$subcommands")"
1349 if [ -z "$subcommand" ]; then
1350 __gitcomp "$subcommands"
1351 else
1352 local remote_opts="--username= --config-dir= --no-auth-cache"
1353 local fc_opts="
1354 --follow-parent --authors-file= --repack=
1355 --no-metadata --use-svm-props --use-svnsync-props
1356 --log-window-size= --no-checkout --quiet
1357 --repack-flags --user-log-author $remote_opts
1358 "
1359 local init_opts="
1360 --template= --shared= --trunk= --tags=
1361 --branches= --stdlayout --minimize-url
1362 --no-metadata --use-svm-props --use-svnsync-props
1363 --rewrite-root= $remote_opts
1364 "
1365 local cmt_opts="
1366 --edit --rmdir --find-copies-harder --copy-similarity=
1367 "
1368
1369 local cur="${COMP_WORDS[COMP_CWORD]}"
1370 case "$subcommand,$cur" in
1371 fetch,--*)
1372 __gitcomp "--revision= --fetch-all $fc_opts"
1373 ;;
1374 clone,--*)
1375 __gitcomp "--revision= $fc_opts $init_opts"
1376 ;;
1377 init,--*)
1378 __gitcomp "$init_opts"
1379 ;;
1380 dcommit,--*)
1381 __gitcomp "
1382 --merge --strategy= --verbose --dry-run
1383 --fetch-all --no-rebase $cmt_opts $fc_opts
1384 "
1385 ;;
1386 set-tree,--*)
1387 __gitcomp "--stdin $cmt_opts $fc_opts"
1388 ;;
1389 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1390 show-externals,--*)
1391 __gitcomp "--revision="
1392 ;;
1393 log,--*)
1394 __gitcomp "
1395 --limit= --revision= --verbose --incremental
1396 --oneline --show-commit --non-recursive
1397 --authors-file=
1398 "
1399 ;;
1400 rebase,--*)
1401 __gitcomp "
1402 --merge --verbose --strategy= --local
1403 --fetch-all $fc_opts
1404 "
1405 ;;
1406 commit-diff,--*)
1407 __gitcomp "--message= --file= --revision= $cmt_opts"
1408 ;;
1409 info,--*)
1410 __gitcomp "--url"
1411 ;;
1412 *)
1413 COMPREPLY=()
1414 ;;
1415 esac
1416 fi
1417}
1418
88e21dc7
SP
1419_git_tag ()
1420{
1421 local i c=1 f=0
1422 while [ $c -lt $COMP_CWORD ]; do
1423 i="${COMP_WORDS[c]}"
1424 case "$i" in
1425 -d|-v)
1426 __gitcomp "$(__git_tags)"
1427 return
1428 ;;
1429 -f)
1430 f=1
1431 ;;
1432 esac
1433 c=$((++c))
1434 done
1435
1436 case "${COMP_WORDS[COMP_CWORD-1]}" in
1437 -m|-F)
1438 COMPREPLY=()
1439 ;;
1440 -*|tag|git-tag)
1441 if [ $f = 1 ]; then
1442 __gitcomp "$(__git_tags)"
1443 else
1444 COMPREPLY=()
1445 fi
1446 ;;
1447 *)
1448 __gitcomp "$(__git_refs)"
1449 ;;
1450 esac
1451}
1452
690d8824
JH
1453_git ()
1454{
873537fa
SP
1455 local i c=1 command __git_dir
1456
1457 while [ $c -lt $COMP_CWORD ]; do
1458 i="${COMP_WORDS[c]}"
1459 case "$i" in
1460 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1461 --bare) __git_dir="." ;;
1eb7e2f8
LM
1462 --version|-p|--paginate) ;;
1463 --help) command="help"; break ;;
873537fa
SP
1464 *) command="$i"; break ;;
1465 esac
1466 c=$((++c))
1467 done
1468
1d17b22e 1469 if [ -z "$command" ]; then
72e5e989
SP
1470 case "${COMP_WORDS[COMP_CWORD]}" in
1471 --*=*) COMPREPLY=() ;;
47e98eec 1472 --*) __gitcomp "
ce5a2c95 1473 --paginate
47e98eec
SP
1474 --no-pager
1475 --git-dir=
1476 --bare
1477 --version
1478 --exec-path
ce5a2c95
TL
1479 --work-tree=
1480 --help
47e98eec
SP
1481 "
1482 ;;
1eb7e2f8 1483 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
72e5e989
SP
1484 esac
1485 return
873537fa 1486 fi
367dce2a 1487
873537fa
SP
1488 local expansion=$(__git_aliased_command "$command")
1489 [ "$expansion" ] && command="$expansion"
367dce2a 1490
873537fa 1491 case "$command" in
88329195 1492 am) _git_am ;;
8435b548 1493 add) _git_add ;;
88329195 1494 apply) _git_apply ;;
b2e69f62 1495 bisect) _git_bisect ;;
374a58c9 1496 bundle) _git_bundle ;;
873537fa 1497 branch) _git_branch ;;
873537fa 1498 checkout) _git_checkout ;;
d8a9fea5 1499 cherry) _git_cherry ;;
1273231e 1500 cherry-pick) _git_cherry_pick ;;
4548e855 1501 commit) _git_commit ;;
e0d10e1c 1502 config) _git_config ;;
217926c0 1503 describe) _git_describe ;;
873537fa 1504 diff) _git_diff ;;
873537fa 1505 fetch) _git_fetch ;;
f53352fb 1506 format-patch) _git_format_patch ;;
b26c8748 1507 gc) _git_gc ;;
c72e0db1 1508 grep) _git_grep ;;
1eb7e2f8 1509 help) _git_help ;;
873537fa
SP
1510 log) _git_log ;;
1511 ls-remote) _git_ls_remote ;;
1512 ls-tree) _git_ls_tree ;;
4ad91321 1513 merge) _git_merge;;
873537fa 1514 merge-base) _git_merge_base ;;
d33909bf 1515 name-rev) _git_name_rev ;;
873537fa
SP
1516 pull) _git_pull ;;
1517 push) _git_push ;;
61d926a3 1518 rebase) _git_rebase ;;
88293c67 1519 remote) _git_remote ;;
873537fa 1520 reset) _git_reset ;;
08c701d4 1521 rm) _git_rm ;;
25a1f374 1522 send-email) _git_send_email ;;
1fd6bec9 1523 shortlog) _git_shortlog ;;
90131924 1524 show) _git_show ;;
2ca880fe 1525 show-branch) _git_show_branch ;;
7fd53fce 1526 stash) _git_stash ;;
be86f7a0 1527 submodule) _git_submodule ;;
47f6ee28 1528 svn) _git_svn ;;
88e21dc7 1529 tag) _git_tag ;;
873537fa
SP
1530 whatchanged) _git_log ;;
1531 *) COMPREPLY=() ;;
1532 esac
690d8824
JH
1533}
1534
1535_gitk ()
1536{
d773c631
SG
1537 __git_has_doubledash && return
1538
690d8824 1539 local cur="${COMP_WORDS[COMP_CWORD]}"
07ba53f7
RQ
1540 local g="$(git rev-parse --git-dir 2>/dev/null)"
1541 local merge=""
1542 if [ -f $g/MERGE_HEAD ]; then
1543 merge="--merge"
1544 fi
b3391775
SP
1545 case "$cur" in
1546 --*)
07ba53f7 1547 __gitcomp "--not --all $merge"
b3391775
SP
1548 return
1549 ;;
1550 esac
ec804891 1551 __git_complete_revlist
690d8824
JH
1552}
1553
1554complete -o default -o nospace -F _git git
b3391775 1555complete -o default -o nospace -F _gitk gitk
690d8824
JH
1556
1557# The following are necessary only for Cygwin, and only are needed
1558# when the user has tab-completed the executable name and consequently
1559# included the '.exe' suffix.
1560#
76c3eb51 1561if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
144d33de 1562complete -o default -o nospace -F _git git.exe
76c3eb51 1563fi