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