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