bash: add git-branch options
[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
873537fa
SP
48__gitdir ()
49{
67ffa114
SP
50 if [ -z "$1" ]; then
51 if [ -n "$__git_dir" ]; then
52 echo "$__git_dir"
53 elif [ -d .git ]; then
54 echo .git
55 else
56 git rev-parse --git-dir 2>/dev/null
57 fi
58 elif [ -d "$1/.git" ]; then
59 echo "$1/.git"
60 else
61 echo "$1"
62 fi
873537fa
SP
63}
64
d3d717a4
SP
65__git_ps1 ()
66{
e7520196
RR
67 local g="$(git rev-parse --git-dir 2>/dev/null)"
68 if [ -n "$g" ]; then
69 local r
70 local b
71 if [ -d "$g/../.dotest" ]
72 then
73 r="|AM/REBASE"
74 b="$(git symbolic-ref HEAD 2>/dev/null)"
75 elif [ -f "$g/.dotest-merge/interactive" ]
76 then
77 r="|REBASE-i"
78 b="$(cat $g/.dotest-merge/head-name)"
79 elif [ -d "$g/.dotest-merge" ]
80 then
81 r="|REBASE-m"
82 b="$(cat $g/.dotest-merge/head-name)"
83 elif [ -f "$g/MERGE_HEAD" ]
84 then
85 r="|MERGING"
86 b="$(git symbolic-ref HEAD 2>/dev/null)"
87 else
88 if [ -f $g/BISECT_LOG ]
89 then
90 r="|BISECTING"
91 fi
92 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
93 then
27c57888
SP
94 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
95 then
96 b="$(cut -c1-7 $g/HEAD)..."
97 fi
e7520196
RR
98 fi
99 fi
100
d3d717a4 101 if [ -n "$1" ]; then
e7520196 102 printf "$1" "${b##refs/heads/}$r"
d3d717a4 103 else
e7520196 104 printf " (%s)" "${b##refs/heads/}$r"
d3d717a4
SP
105 fi
106 fi
107}
108
72e5e989
SP
109__gitcomp ()
110{
111 local all c s=$'\n' IFS=' '$'\t'$'\n'
78d4d6a2 112 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775 113 if [ $# -gt 2 ]; then
78d4d6a2
SP
114 cur="$3"
115 fi
72e5e989 116 for c in $1; do
78d4d6a2
SP
117 case "$c$4" in
118 --*=*) all="$all$c$4$s" ;;
119 *.) all="$all$c$4$s" ;;
120 *) all="$all$c$4 $s" ;;
72e5e989
SP
121 esac
122 done
123 IFS=$s
78d4d6a2 124 COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
72e5e989
SP
125 return
126}
127
5de40f59
SP
128__git_heads ()
129{
67ffa114 130 local cmd i is_hash=y dir="$(__gitdir "$1")"
5de40f59
SP
131 if [ -d "$dir" ]; then
132 for i in $(git --git-dir="$dir" \
133 for-each-ref --format='%(refname)' \
134 refs/heads ); do
135 echo "${i#refs/heads/}"
136 done
137 return
138 fi
67ffa114 139 for i in $(git-ls-remote "$1" 2>/dev/null); do
5de40f59
SP
140 case "$is_hash,$i" in
141 y,*) is_hash=n ;;
142 n,*^{}) is_hash=y ;;
143 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
144 n,*) is_hash=y; echo "$i" ;;
145 esac
146 done
147}
148
88e21dc7
SP
149__git_tags ()
150{
151 local cmd i is_hash=y dir="$(__gitdir "$1")"
152 if [ -d "$dir" ]; then
153 for i in $(git --git-dir="$dir" \
154 for-each-ref --format='%(refname)' \
155 refs/tags ); do
156 echo "${i#refs/tags/}"
157 done
158 return
159 fi
160 for i in $(git-ls-remote "$1" 2>/dev/null); do
161 case "$is_hash,$i" in
162 y,*) is_hash=n ;;
163 n,*^{}) is_hash=y ;;
164 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
165 n,*) is_hash=y; echo "$i" ;;
166 esac
167 done
168}
169
690d8824
JH
170__git_refs ()
171{
67ffa114 172 local cmd i is_hash=y dir="$(__gitdir "$1")"
873537fa 173 if [ -d "$dir" ]; then
35e65ecc
SP
174 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
175 for i in $(git --git-dir="$dir" \
176 for-each-ref --format='%(refname)' \
177 refs/tags refs/heads refs/remotes); do
178 case "$i" in
179 refs/tags/*) echo "${i#refs/tags/}" ;;
180 refs/heads/*) echo "${i#refs/heads/}" ;;
181 refs/remotes/*) echo "${i#refs/remotes/}" ;;
182 *) echo "$i" ;;
183 esac
184 done
185 return
690d8824 186 fi
35e65ecc 187 for i in $(git-ls-remote "$dir" 2>/dev/null); do
690d8824
JH
188 case "$is_hash,$i" in
189 y,*) is_hash=n ;;
190 n,*^{}) is_hash=y ;;
191 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
192 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
35e65ecc 193 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
690d8824
JH
194 n,*) is_hash=y; echo "$i" ;;
195 esac
196 done
197}
198
199__git_refs2 ()
200{
67ffa114
SP
201 local i
202 for i in $(__git_refs "$1"); do
203 echo "$i:$i"
690d8824
JH
204 done
205}
206
5de40f59
SP
207__git_refs_remotes ()
208{
209 local cmd i is_hash=y
210 for i in $(git-ls-remote "$1" 2>/dev/null); do
211 case "$is_hash,$i" in
212 n,refs/heads/*)
213 is_hash=y
214 echo "$i:refs/remotes/$1/${i#refs/heads/}"
215 ;;
216 y,*) is_hash=n ;;
217 n,*^{}) is_hash=y ;;
218 n,refs/tags/*) is_hash=y;;
219 n,*) is_hash=y; ;;
220 esac
221 done
222}
223
690d8824
JH
224__git_remotes ()
225{
873537fa 226 local i ngoff IFS=$'\n' d="$(__gitdir)"
56fc25f2 227 shopt -q nullglob || ngoff=1
690d8824 228 shopt -s nullglob
873537fa
SP
229 for i in "$d/remotes"/*; do
230 echo ${i#$d/remotes/}
690d8824 231 done
56fc25f2 232 [ "$ngoff" ] && shopt -u nullglob
e0d10e1c 233 for i in $(git --git-dir="$d" config --list); do
56fc25f2
SP
234 case "$i" in
235 remote.*.url=*)
236 i="${i#remote.}"
237 echo "${i/.url=*/}"
238 ;;
239 esac
240 done
690d8824
JH
241}
242
4ad91321
SP
243__git_merge_strategies ()
244{
b51ec6bd
SP
245 if [ -n "$__git_merge_strategylist" ]; then
246 echo "$__git_merge_strategylist"
247 return
248 fi
4ad91321
SP
249 sed -n "/^all_strategies='/{
250 s/^all_strategies='//
251 s/'//
252 p
253 q
254 }" "$(git --exec-path)/git-merge"
255}
b51ec6bd
SP
256__git_merge_strategylist=
257__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
4ad91321 258
690d8824
JH
259__git_complete_file ()
260{
a79c6551 261 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
690d8824
JH
262 case "$cur" in
263 ?*:*)
a79c6551
SP
264 ref="${cur%%:*}"
265 cur="${cur#*:}"
690d8824
JH
266 case "$cur" in
267 ?*/*)
a79c6551
SP
268 pfx="${cur%/*}"
269 cur="${cur##*/}"
690d8824
JH
270 ls="$ref:$pfx"
271 pfx="$pfx/"
272 ;;
273 *)
274 ls="$ref"
275 ;;
276 esac
277 COMPREPLY=($(compgen -P "$pfx" \
873537fa 278 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
690d8824
JH
279 | sed '/^100... blob /s,^.* ,,
280 /^040000 tree /{
281 s,^.* ,,
282 s,$,/,
283 }
284 s/^.* //')" \
285 -- "$cur"))
286 ;;
287 *)
b3391775 288 __gitcomp "$(__git_refs)"
690d8824
JH
289 ;;
290 esac
291}
292
f53352fb
SP
293__git_complete_revlist ()
294{
295 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
296 case "$cur" in
297 *...*)
298 pfx="${cur%...*}..."
299 cur="${cur#*...}"
b3391775 300 __gitcomp "$(__git_refs)" "$pfx" "$cur"
f53352fb
SP
301 ;;
302 *..*)
303 pfx="${cur%..*}.."
304 cur="${cur#*..}"
b3391775
SP
305 __gitcomp "$(__git_refs)" "$pfx" "$cur"
306 ;;
307 *.)
308 __gitcomp "$cur."
f53352fb
SP
309 ;;
310 *)
b3391775 311 __gitcomp "$(__git_refs)"
f53352fb
SP
312 ;;
313 esac
314}
315
f2bb9f88
SP
316__git_commands ()
317{
b51ec6bd
SP
318 if [ -n "$__git_commandlist" ]; then
319 echo "$__git_commandlist"
320 return
321 fi
f2bb9f88
SP
322 local i IFS=" "$'\n'
323 for i in $(git help -a|egrep '^ ')
324 do
325 case $i in
718a087a 326 *--*) : helper pattern;;
a925c6f1
SP
327 applymbox) : ask gittus;;
328 applypatch) : ask gittus;;
329 archimport) : import;;
2e3a430a 330 cat-file) : plumbing;;
56d99c67 331 check-attr) : plumbing;;
f2bb9f88
SP
332 check-ref-format) : plumbing;;
333 commit-tree) : plumbing;;
a925c6f1
SP
334 cvsexportcommit) : export;;
335 cvsimport) : import;;
f2bb9f88
SP
336 cvsserver) : daemon;;
337 daemon) : daemon;;
5cfb4fe5
SP
338 diff-files) : plumbing;;
339 diff-index) : plumbing;;
340 diff-tree) : plumbing;;
c6ec3b13 341 fast-import) : import;;
a925c6f1 342 fsck-objects) : plumbing;;
f2bb9f88 343 fetch-pack) : plumbing;;
a925c6f1 344 fmt-merge-msg) : plumbing;;
56d99c67 345 for-each-ref) : plumbing;;
f2bb9f88
SP
346 hash-object) : plumbing;;
347 http-*) : transport;;
348 index-pack) : plumbing;;
a925c6f1 349 init-db) : deprecated;;
f2bb9f88
SP
350 local-fetch) : plumbing;;
351 mailinfo) : plumbing;;
352 mailsplit) : plumbing;;
353 merge-*) : plumbing;;
354 mktree) : plumbing;;
355 mktag) : plumbing;;
356 pack-objects) : plumbing;;
357 pack-redundant) : plumbing;;
358 pack-refs) : plumbing;;
359 parse-remote) : plumbing;;
360 patch-id) : plumbing;;
361 peek-remote) : plumbing;;
a925c6f1
SP
362 prune) : plumbing;;
363 prune-packed) : plumbing;;
364 quiltimport) : import;;
f2bb9f88
SP
365 read-tree) : plumbing;;
366 receive-pack) : plumbing;;
2e3a430a 367 reflog) : plumbing;;
5c66d0d4 368 repo-config) : deprecated;;
f2bb9f88
SP
369 rerere) : plumbing;;
370 rev-list) : plumbing;;
371 rev-parse) : plumbing;;
372 runstatus) : plumbing;;
373 sh-setup) : internal;;
374 shell) : daemon;;
375 send-pack) : plumbing;;
376 show-index) : plumbing;;
377 ssh-*) : transport;;
378 stripspace) : plumbing;;
a925c6f1 379 svn) : import export;;
f2bb9f88 380 symbolic-ref) : plumbing;;
a925c6f1 381 tar-tree) : deprecated;;
f2bb9f88
SP
382 unpack-file) : plumbing;;
383 unpack-objects) : plumbing;;
a925c6f1 384 update-index) : plumbing;;
f2bb9f88
SP
385 update-ref) : plumbing;;
386 update-server-info) : daemon;;
387 upload-archive) : plumbing;;
388 upload-pack) : plumbing;;
389 write-tree) : plumbing;;
a925c6f1 390 verify-tag) : plumbing;;
f2bb9f88
SP
391 *) echo $i;;
392 esac
393 done
394}
b51ec6bd
SP
395__git_commandlist=
396__git_commandlist="$(__git_commands 2>/dev/null)"
f2bb9f88 397
367dce2a
DS
398__git_aliases ()
399{
56fc25f2 400 local i IFS=$'\n'
e0d10e1c 401 for i in $(git --git-dir="$(__gitdir)" config --list); do
56fc25f2
SP
402 case "$i" in
403 alias.*)
404 i="${i#alias.}"
405 echo "${i/=*/}"
406 ;;
407 esac
408 done
367dce2a
DS
409}
410
411__git_aliased_command ()
412{
873537fa 413 local word cmdline=$(git --git-dir="$(__gitdir)" \
e0d10e1c 414 config --get "alias.$1")
367dce2a
DS
415 for word in $cmdline; do
416 if [ "${word##-*}" ]; then
417 echo $word
418 return
419 fi
420 done
421}
422
88329195
SP
423__git_whitespacelist="nowarn warn error error-all strip"
424
425_git_am ()
426{
427 local cur="${COMP_WORDS[COMP_CWORD]}"
428 if [ -d .dotest ]; then
b3391775 429 __gitcomp "--skip --resolved"
88329195
SP
430 return
431 fi
432 case "$cur" in
433 --whitespace=*)
b3391775 434 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
435 return
436 ;;
437 --*)
b3391775 438 __gitcomp "
88329195
SP
439 --signoff --utf8 --binary --3way --interactive
440 --whitespace=
b3391775 441 "
88329195
SP
442 return
443 esac
444 COMPREPLY=()
445}
446
447_git_apply ()
448{
449 local cur="${COMP_WORDS[COMP_CWORD]}"
450 case "$cur" in
451 --whitespace=*)
b3391775 452 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
453 return
454 ;;
455 --*)
b3391775 456 __gitcomp "
88329195
SP
457 --stat --numstat --summary --check --index
458 --cached --index-info --reverse --reject --unidiff-zero
459 --apply --no-add --exclude=
460 --whitespace= --inaccurate-eof --verbose
b3391775 461 "
88329195
SP
462 return
463 esac
464 COMPREPLY=()
465}
466
8435b548
SP
467_git_add ()
468{
469 local cur="${COMP_WORDS[COMP_CWORD]}"
470 case "$cur" in
471 --*)
47e98eec 472 __gitcomp "--interactive --refresh"
8435b548
SP
473 return
474 esac
475 COMPREPLY=()
476}
477
b2e69f62
SP
478_git_bisect ()
479{
480 local i c=1 command
481 while [ $c -lt $COMP_CWORD ]; do
482 i="${COMP_WORDS[c]}"
483 case "$i" in
484 start|bad|good|reset|visualize|replay|log)
485 command="$i"
486 break
487 ;;
488 esac
489 c=$((++c))
490 done
491
492 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
493 __gitcomp "start bad good reset visualize replay log"
494 return
495 fi
496
497 case "$command" in
498 bad|good|reset)
499 __gitcomp "$(__git_refs)"
500 ;;
501 *)
502 COMPREPLY=()
503 ;;
504 esac
505}
506
690d8824
JH
507_git_branch ()
508{
3b376b0c
SG
509 case "${COMP_WORDS[COMP_CWORD]}" in
510 --*=*) COMPREPLY=() ;;
511 --*)
512 __gitcomp "
513 --color --no-color --verbose --abbrev= --no-abbrev
514 --track --no-track
515 "
516 ;;
517 *) __gitcomp "$(__git_refs)" ;;
518 esac
690d8824
JH
519}
520
374a58c9
ML
521_git_bundle ()
522{
523 local mycword="$COMP_CWORD"
524 case "${COMP_WORDS[0]}" in
525 git)
526 local cmd="${COMP_WORDS[2]}"
527 mycword="$((mycword-1))"
528 ;;
529 git-bundle*)
530 local cmd="${COMP_WORDS[1]}"
531 ;;
532 esac
533 case "$mycword" in
534 1)
535 __gitcomp "create list-heads verify unbundle"
536 ;;
537 2)
538 # looking for a file
539 ;;
540 *)
541 case "$cmd" in
542 create)
543 __git_complete_revlist
544 ;;
545 esac
546 ;;
547 esac
548}
549
690d8824
JH
550_git_checkout ()
551{
b3391775 552 __gitcomp "$(__git_refs)"
690d8824
JH
553}
554
d8a9fea5
SP
555_git_cherry ()
556{
557 __gitcomp "$(__git_refs)"
558}
559
1273231e
SP
560_git_cherry_pick ()
561{
562 local cur="${COMP_WORDS[COMP_CWORD]}"
563 case "$cur" in
564 --*)
b3391775 565 __gitcomp "--edit --no-commit"
1273231e
SP
566 ;;
567 *)
b3391775 568 __gitcomp "$(__git_refs)"
1273231e
SP
569 ;;
570 esac
571}
572
4548e855
SP
573_git_commit ()
574{
575 local cur="${COMP_WORDS[COMP_CWORD]}"
576 case "$cur" in
577 --*)
b3391775 578 __gitcomp "
4548e855
SP
579 --all --author= --signoff --verify --no-verify
580 --edit --amend --include --only
b3391775 581 "
4548e855
SP
582 return
583 esac
584 COMPREPLY=()
585}
586
217926c0
SP
587_git_describe ()
588{
589 __gitcomp "$(__git_refs)"
590}
591
690d8824
JH
592_git_diff ()
593{
b3a4f858
JS
594 local cur="${COMP_WORDS[COMP_CWORD]}"
595 case "$cur" in
596 --*)
597 __gitcomp "--cached --stat --numstat --shortstat --summary
598 --patch-with-stat --name-only --name-status --color
599 --no-color --color-words --no-renames --check
600 --full-index --binary --abbrev --diff-filter
601 --find-copies-harder --pickaxe-all --pickaxe-regex
602 --text --ignore-space-at-eol --ignore-space-change
603 --ignore-all-space --exit-code --quiet --ext-diff
604 --no-ext-diff"
605 return
606 ;;
607 esac
690d8824
JH
608 __git_complete_file
609}
610
611_git_diff_tree ()
612{
b3391775 613 __gitcomp "$(__git_refs)"
690d8824
JH
614}
615
616_git_fetch ()
617{
618 local cur="${COMP_WORDS[COMP_CWORD]}"
619
620 case "${COMP_WORDS[0]},$COMP_CWORD" in
621 git-fetch*,1)
b3391775 622 __gitcomp "$(__git_remotes)"
690d8824
JH
623 ;;
624 git,2)
b3391775 625 __gitcomp "$(__git_remotes)"
690d8824
JH
626 ;;
627 *)
628 case "$cur" in
629 *:*)
b3391775 630 __gitcomp "$(__git_refs)" "" "${cur#*:}"
690d8824
JH
631 ;;
632 *)
633 local remote
634 case "${COMP_WORDS[0]}" in
635 git-fetch) remote="${COMP_WORDS[1]}" ;;
636 git) remote="${COMP_WORDS[2]}" ;;
637 esac
b3391775 638 __gitcomp "$(__git_refs2 "$remote")"
690d8824
JH
639 ;;
640 esac
641 ;;
642 esac
643}
644
f53352fb
SP
645_git_format_patch ()
646{
647 local cur="${COMP_WORDS[COMP_CWORD]}"
648 case "$cur" in
649 --*)
b3391775 650 __gitcomp "
f53352fb
SP
651 --stdout --attach --thread
652 --output-directory
653 --numbered --start-number
47e98eec 654 --numbered-files
f53352fb
SP
655 --keep-subject
656 --signoff
657 --in-reply-to=
658 --full-index --binary
ec804891 659 --not --all
be5f5bf0 660 --cover-letter
b3391775 661 "
f53352fb
SP
662 return
663 ;;
664 esac
665 __git_complete_revlist
666}
667
b26c8748
SP
668_git_gc ()
669{
670 local cur="${COMP_WORDS[COMP_CWORD]}"
671 case "$cur" in
672 --*)
47e98eec 673 __gitcomp "--prune --aggressive"
b26c8748
SP
674 return
675 ;;
676 esac
677 COMPREPLY=()
678}
679
690d8824
JH
680_git_ls_remote ()
681{
b3391775 682 __gitcomp "$(__git_remotes)"
690d8824
JH
683}
684
685_git_ls_tree ()
686{
687 __git_complete_file
688}
689
690_git_log ()
691{
6e31b866
SP
692 local cur="${COMP_WORDS[COMP_CWORD]}"
693 case "$cur" in
694 --pretty=*)
b3391775 695 __gitcomp "
6e31b866 696 oneline short medium full fuller email raw
b3391775 697 " "" "${cur##--pretty=}"
6e31b866
SP
698 return
699 ;;
47e98eec
SP
700 --date=*)
701 __gitcomp "
702 relative iso8601 rfc2822 short local default
703 " "" "${cur##--date=}"
704 return
705 ;;
6e31b866 706 --*)
b3391775 707 __gitcomp "
6e31b866
SP
708 --max-count= --max-age= --since= --after=
709 --min-age= --before= --until=
8f87fae6 710 --root --topo-order --date-order --reverse
47e98eec 711 --no-merges --follow
6e31b866 712 --abbrev-commit --abbrev=
47e98eec 713 --relative-date --date=
6e31b866
SP
714 --author= --committer= --grep=
715 --all-match
8f87fae6 716 --pretty= --name-status --name-only --raw
ec804891 717 --not --all
7d37b5bf 718 --left-right --cherry-pick
b3391775 719 "
6e31b866
SP
720 return
721 ;;
722 esac
f53352fb 723 __git_complete_revlist
690d8824
JH
724}
725
4ad91321
SP
726_git_merge ()
727{
728 local cur="${COMP_WORDS[COMP_CWORD]}"
ce1e39d2
SP
729 case "${COMP_WORDS[COMP_CWORD-1]}" in
730 -s|--strategy)
b3391775 731 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
732 return
733 esac
4ad91321 734 case "$cur" in
ce1e39d2 735 --strategy=*)
b3391775 736 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
737 return
738 ;;
4ad91321 739 --*)
b3391775 740 __gitcomp "
61d926a3 741 --no-commit --no-summary --squash --strategy
b3391775 742 "
4ad91321
SP
743 return
744 esac
b3391775 745 __gitcomp "$(__git_refs)"
4ad91321
SP
746}
747
690d8824
JH
748_git_merge_base ()
749{
b3391775 750 __gitcomp "$(__git_refs)"
690d8824
JH
751}
752
d33909bf
SP
753_git_name_rev ()
754{
b3391775 755 __gitcomp "--tags --all --stdin"
d33909bf
SP
756}
757
690d8824
JH
758_git_pull ()
759{
760 local cur="${COMP_WORDS[COMP_CWORD]}"
761
762 case "${COMP_WORDS[0]},$COMP_CWORD" in
763 git-pull*,1)
b3391775 764 __gitcomp "$(__git_remotes)"
690d8824
JH
765 ;;
766 git,2)
b3391775 767 __gitcomp "$(__git_remotes)"
690d8824
JH
768 ;;
769 *)
770 local remote
771 case "${COMP_WORDS[0]}" in
772 git-pull) remote="${COMP_WORDS[1]}" ;;
773 git) remote="${COMP_WORDS[2]}" ;;
774 esac
b3391775 775 __gitcomp "$(__git_refs "$remote")"
690d8824
JH
776 ;;
777 esac
778}
779
780_git_push ()
781{
782 local cur="${COMP_WORDS[COMP_CWORD]}"
783
784 case "${COMP_WORDS[0]},$COMP_CWORD" in
785 git-push*,1)
b3391775 786 __gitcomp "$(__git_remotes)"
690d8824
JH
787 ;;
788 git,2)
b3391775 789 __gitcomp "$(__git_remotes)"
690d8824
JH
790 ;;
791 *)
792 case "$cur" in
793 *:*)
794 local remote
795 case "${COMP_WORDS[0]}" in
796 git-push) remote="${COMP_WORDS[1]}" ;;
797 git) remote="${COMP_WORDS[2]}" ;;
798 esac
b3391775 799 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
690d8824 800 ;;
161fea83
SP
801 +*)
802 __gitcomp "$(__git_refs)" + "${cur#+}"
803 ;;
690d8824 804 *)
92d7c8e3 805 __gitcomp "$(__git_refs)"
690d8824
JH
806 ;;
807 esac
808 ;;
809 esac
810}
811
61d926a3
SP
812_git_rebase ()
813{
814 local cur="${COMP_WORDS[COMP_CWORD]}"
c5650b08 815 if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
b3391775 816 __gitcomp "--continue --skip --abort"
61d926a3
SP
817 return
818 fi
ce1e39d2
SP
819 case "${COMP_WORDS[COMP_CWORD-1]}" in
820 -s|--strategy)
b3391775 821 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
822 return
823 esac
61d926a3 824 case "$cur" in
ce1e39d2 825 --strategy=*)
b3391775 826 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
827 return
828 ;;
61d926a3 829 --*)
b3391775 830 __gitcomp "--onto --merge --strategy"
61d926a3
SP
831 return
832 esac
b3391775 833 __gitcomp "$(__git_refs)"
61d926a3
SP
834}
835
e0d10e1c 836_git_config ()
5de40f59
SP
837{
838 local cur="${COMP_WORDS[COMP_CWORD]}"
839 local prv="${COMP_WORDS[COMP_CWORD-1]}"
840 case "$prv" in
841 branch.*.remote)
78d4d6a2 842 __gitcomp "$(__git_remotes)"
5de40f59
SP
843 return
844 ;;
845 branch.*.merge)
78d4d6a2 846 __gitcomp "$(__git_refs)"
5de40f59
SP
847 return
848 ;;
849 remote.*.fetch)
850 local remote="${prv#remote.}"
851 remote="${remote%.fetch}"
78d4d6a2 852 __gitcomp "$(__git_refs_remotes "$remote")"
5de40f59
SP
853 return
854 ;;
855 remote.*.push)
856 local remote="${prv#remote.}"
857 remote="${remote%.push}"
78d4d6a2 858 __gitcomp "$(git --git-dir="$(__gitdir)" \
5de40f59 859 for-each-ref --format='%(refname):%(refname)' \
78d4d6a2
SP
860 refs/heads)"
861 return
862 ;;
863 pull.twohead|pull.octopus)
864 __gitcomp "$(__git_merge_strategies)"
865 return
866 ;;
867 color.branch|color.diff|color.status)
868 __gitcomp "always never auto"
869 return
870 ;;
871 color.*.*)
872 __gitcomp "
873 black red green yellow blue magenta cyan white
874 bold dim ul blink reverse
875 "
5de40f59
SP
876 return
877 ;;
878 *.*)
879 COMPREPLY=()
880 return
881 ;;
882 esac
883 case "$cur" in
884 --*)
78d4d6a2 885 __gitcomp "
47e98eec 886 --global --system --file=
12977705 887 --list --replace-all
5de40f59 888 --get --get-all --get-regexp
1b71eb35 889 --add --unset --unset-all
12977705 890 --remove-section --rename-section
78d4d6a2 891 "
5de40f59
SP
892 return
893 ;;
894 branch.*.*)
895 local pfx="${cur%.*}."
896 cur="${cur##*.}"
78d4d6a2 897 __gitcomp "remote merge" "$pfx" "$cur"
5de40f59
SP
898 return
899 ;;
900 branch.*)
901 local pfx="${cur%.*}."
902 cur="${cur#*.}"
78d4d6a2 903 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
5de40f59
SP
904 return
905 ;;
906 remote.*.*)
907 local pfx="${cur%.*}."
908 cur="${cur##*.}"
12977705
SP
909 __gitcomp "
910 url fetch push skipDefaultUpdate
911 receivepack uploadpack tagopt
912 " "$pfx" "$cur"
5de40f59
SP
913 return
914 ;;
915 remote.*)
916 local pfx="${cur%.*}."
917 cur="${cur#*.}"
78d4d6a2 918 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
5de40f59
SP
919 return
920 ;;
921 esac
78d4d6a2 922 __gitcomp "
5de40f59
SP
923 apply.whitespace
924 core.fileMode
925 core.gitProxy
926 core.ignoreStat
927 core.preferSymlinkRefs
928 core.logAllRefUpdates
47e98eec 929 core.loosecompression
5de40f59
SP
930 core.repositoryFormatVersion
931 core.sharedRepository
932 core.warnAmbiguousRefs
933 core.compression
934 core.legacyHeaders
78d4d6a2
SP
935 core.packedGitWindowSize
936 core.packedGitLimit
2122591b 937 clean.requireForce
78d4d6a2
SP
938 color.branch
939 color.branch.current
940 color.branch.local
941 color.branch.remote
942 color.branch.plain
a159ca0c 943 color.diff
78d4d6a2
SP
944 color.diff.plain
945 color.diff.meta
946 color.diff.frag
947 color.diff.old
948 color.diff.new
949 color.diff.commit
950 color.diff.whitespace
a159ca0c 951 color.pager
a159ca0c 952 color.status
78d4d6a2
SP
953 color.status.header
954 color.status.added
955 color.status.changed
956 color.status.untracked
957 diff.renameLimit
958 diff.renames
959 fetch.unpackLimit
960 format.headers
47e98eec 961 format.subjectprefix
78d4d6a2
SP
962 gitcvs.enabled
963 gitcvs.logfile
12977705
SP
964 gitcvs.allbinary
965 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
966 gc.packrefs
78d4d6a2
SP
967 gc.reflogexpire
968 gc.reflogexpireunreachable
969 gc.rerereresolved
970 gc.rerereunresolved
5de40f59
SP
971 http.sslVerify
972 http.sslCert
973 http.sslKey
974 http.sslCAInfo
975 http.sslCAPath
976 http.maxRequests
78d4d6a2
SP
977 http.lowSpeedLimit
978 http.lowSpeedTime
5de40f59 979 http.noEPSV
78d4d6a2
SP
980 i18n.commitEncoding
981 i18n.logOutputEncoding
982 log.showroot
12977705 983 merge.tool
78d4d6a2
SP
984 merge.summary
985 merge.verbosity
5de40f59 986 pack.window
12977705 987 pack.depth
47e98eec
SP
988 pack.windowMemory
989 pack.compression
990 pack.deltaCacheSize
991 pack.deltaCacheLimit
78d4d6a2
SP
992 pull.octopus
993 pull.twohead
5de40f59 994 repack.useDeltaBaseOffset
78d4d6a2
SP
995 show.difftree
996 showbranch.default
997 tar.umask
998 transfer.unpackLimit
5de40f59
SP
999 receive.unpackLimit
1000 receive.denyNonFastForwards
78d4d6a2
SP
1001 user.name
1002 user.email
1003 user.signingkey
1004 whatchanged.difftree
5de40f59 1005 branch. remote.
78d4d6a2 1006 "
5de40f59
SP
1007}
1008
88293c67
SP
1009_git_remote ()
1010{
1011 local i c=1 command
1012 while [ $c -lt $COMP_CWORD ]; do
1013 i="${COMP_WORDS[c]}"
1014 case "$i" in
a3b811a4 1015 add|rm|show|prune|update) command="$i"; break ;;
88293c67
SP
1016 esac
1017 c=$((++c))
1018 done
1019
1020 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
a3b811a4 1021 __gitcomp "add rm show prune update"
88293c67
SP
1022 return
1023 fi
1024
1025 case "$command" in
a3b811a4 1026 rm|show|prune)
88293c67
SP
1027 __gitcomp "$(__git_remotes)"
1028 ;;
fb72759b
SP
1029 update)
1030 local i c='' IFS=$'\n'
1031 for i in $(git --git-dir="$(__gitdir)" config --list); do
1032 case "$i" in
1033 remotes.*)
1034 i="${i#remotes.}"
1035 c="$c ${i/=*/}"
1036 ;;
1037 esac
1038 done
1039 __gitcomp "$c"
1040 ;;
88293c67
SP
1041 *)
1042 COMPREPLY=()
1043 ;;
1044 esac
1045}
1046
67e78c3b
SP
1047_git_reset ()
1048{
1049 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775
SP
1050 case "$cur" in
1051 --*)
1052 __gitcomp "--mixed --hard --soft"
1053 return
1054 ;;
1055 esac
1056 __gitcomp "$(__git_refs)"
67e78c3b
SP
1057}
1058
1fd6bec9
SP
1059_git_shortlog ()
1060{
1061 local cur="${COMP_WORDS[COMP_CWORD]}"
1062 case "$cur" in
1063 --*)
1064 __gitcomp "
1065 --max-count= --max-age= --since= --after=
1066 --min-age= --before= --until=
1067 --no-merges
1068 --author= --committer= --grep=
1069 --all-match
1070 --not --all
1071 --numbered --summary
1072 "
1073 return
1074 ;;
1075 esac
1076 __git_complete_revlist
1077}
1078
90131924
SP
1079_git_show ()
1080{
1081 local cur="${COMP_WORDS[COMP_CWORD]}"
1082 case "$cur" in
1083 --pretty=*)
b3391775 1084 __gitcomp "
90131924 1085 oneline short medium full fuller email raw
b3391775 1086 " "" "${cur##--pretty=}"
90131924
SP
1087 return
1088 ;;
1089 --*)
b3391775 1090 __gitcomp "--pretty="
90131924
SP
1091 return
1092 ;;
1093 esac
1094 __git_complete_file
1095}
1096
7fd53fce
JH
1097_git_stash ()
1098{
1099 __gitcomp 'list show apply clear'
1100}
1101
be86f7a0
SP
1102_git_submodule ()
1103{
1104 local i c=1 command
1105 while [ $c -lt $COMP_CWORD ]; do
1106 i="${COMP_WORDS[c]}"
1107 case "$i" in
1108 add|status|init|update) command="$i"; break ;;
1109 esac
1110 c=$((++c))
1111 done
1112
1113 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1114 local cur="${COMP_WORDS[COMP_CWORD]}"
1115 case "$cur" in
1116 --*)
1117 __gitcomp "--quiet --cached"
1118 ;;
1119 *)
1120 __gitcomp "add status init update"
1121 ;;
1122 esac
1123 return
1124 fi
1125}
1126
88e21dc7
SP
1127_git_tag ()
1128{
1129 local i c=1 f=0
1130 while [ $c -lt $COMP_CWORD ]; do
1131 i="${COMP_WORDS[c]}"
1132 case "$i" in
1133 -d|-v)
1134 __gitcomp "$(__git_tags)"
1135 return
1136 ;;
1137 -f)
1138 f=1
1139 ;;
1140 esac
1141 c=$((++c))
1142 done
1143
1144 case "${COMP_WORDS[COMP_CWORD-1]}" in
1145 -m|-F)
1146 COMPREPLY=()
1147 ;;
1148 -*|tag|git-tag)
1149 if [ $f = 1 ]; then
1150 __gitcomp "$(__git_tags)"
1151 else
1152 COMPREPLY=()
1153 fi
1154 ;;
1155 *)
1156 __gitcomp "$(__git_refs)"
1157 ;;
1158 esac
1159}
1160
690d8824
JH
1161_git ()
1162{
873537fa
SP
1163 local i c=1 command __git_dir
1164
1165 while [ $c -lt $COMP_CWORD ]; do
1166 i="${COMP_WORDS[c]}"
1167 case "$i" in
1168 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1169 --bare) __git_dir="." ;;
1170 --version|--help|-p|--paginate) ;;
1171 *) command="$i"; break ;;
1172 esac
1173 c=$((++c))
1174 done
1175
1176 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
72e5e989
SP
1177 case "${COMP_WORDS[COMP_CWORD]}" in
1178 --*=*) COMPREPLY=() ;;
47e98eec
SP
1179 --*) __gitcomp "
1180 --no-pager
1181 --git-dir=
1182 --bare
1183 --version
1184 --exec-path
1185 "
1186 ;;
72e5e989
SP
1187 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1188 esac
1189 return
873537fa 1190 fi
367dce2a 1191
873537fa
SP
1192 local expansion=$(__git_aliased_command "$command")
1193 [ "$expansion" ] && command="$expansion"
367dce2a 1194
873537fa 1195 case "$command" in
88329195 1196 am) _git_am ;;
8435b548 1197 add) _git_add ;;
88329195 1198 apply) _git_apply ;;
b2e69f62 1199 bisect) _git_bisect ;;
374a58c9 1200 bundle) _git_bundle ;;
873537fa 1201 branch) _git_branch ;;
873537fa 1202 checkout) _git_checkout ;;
d8a9fea5 1203 cherry) _git_cherry ;;
1273231e 1204 cherry-pick) _git_cherry_pick ;;
4548e855 1205 commit) _git_commit ;;
e0d10e1c 1206 config) _git_config ;;
217926c0 1207 describe) _git_describe ;;
873537fa 1208 diff) _git_diff ;;
873537fa 1209 fetch) _git_fetch ;;
f53352fb 1210 format-patch) _git_format_patch ;;
b26c8748 1211 gc) _git_gc ;;
873537fa
SP
1212 log) _git_log ;;
1213 ls-remote) _git_ls_remote ;;
1214 ls-tree) _git_ls_tree ;;
4ad91321 1215 merge) _git_merge;;
873537fa 1216 merge-base) _git_merge_base ;;
d33909bf 1217 name-rev) _git_name_rev ;;
873537fa
SP
1218 pull) _git_pull ;;
1219 push) _git_push ;;
61d926a3 1220 rebase) _git_rebase ;;
88293c67 1221 remote) _git_remote ;;
873537fa 1222 reset) _git_reset ;;
1fd6bec9 1223 shortlog) _git_shortlog ;;
90131924 1224 show) _git_show ;;
873537fa 1225 show-branch) _git_log ;;
7fd53fce 1226 stash) _git_stash ;;
be86f7a0 1227 submodule) _git_submodule ;;
88e21dc7 1228 tag) _git_tag ;;
873537fa
SP
1229 whatchanged) _git_log ;;
1230 *) COMPREPLY=() ;;
1231 esac
690d8824
JH
1232}
1233
1234_gitk ()
1235{
1236 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775
SP
1237 case "$cur" in
1238 --*)
1239 __gitcomp "--not --all"
1240 return
1241 ;;
1242 esac
ec804891 1243 __git_complete_revlist
690d8824
JH
1244}
1245
1246complete -o default -o nospace -F _git git
b3391775
SP
1247complete -o default -o nospace -F _gitk gitk
1248complete -o default -o nospace -F _git_am git-am
1249complete -o default -o nospace -F _git_apply git-apply
b2e69f62 1250complete -o default -o nospace -F _git_bisect git-bisect
b3391775 1251complete -o default -o nospace -F _git_branch git-branch
374a58c9 1252complete -o default -o nospace -F _git_bundle git-bundle
b3391775 1253complete -o default -o nospace -F _git_checkout git-checkout
d8a9fea5 1254complete -o default -o nospace -F _git_cherry git-cherry
b3391775
SP
1255complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1256complete -o default -o nospace -F _git_commit git-commit
217926c0 1257complete -o default -o nospace -F _git_describe git-describe
690d8824 1258complete -o default -o nospace -F _git_diff git-diff
690d8824 1259complete -o default -o nospace -F _git_fetch git-fetch
f53352fb 1260complete -o default -o nospace -F _git_format_patch git-format-patch
b26c8748 1261complete -o default -o nospace -F _git_gc git-gc
690d8824 1262complete -o default -o nospace -F _git_log git-log
b3391775 1263complete -o default -o nospace -F _git_ls_remote git-ls-remote
690d8824 1264complete -o default -o nospace -F _git_ls_tree git-ls-tree
b3391775
SP
1265complete -o default -o nospace -F _git_merge git-merge
1266complete -o default -o nospace -F _git_merge_base git-merge-base
1267complete -o default -o nospace -F _git_name_rev git-name-rev
690d8824
JH
1268complete -o default -o nospace -F _git_pull git-pull
1269complete -o default -o nospace -F _git_push git-push
b3391775
SP
1270complete -o default -o nospace -F _git_rebase git-rebase
1271complete -o default -o nospace -F _git_config git-config
88293c67 1272complete -o default -o nospace -F _git_remote git-remote
b3391775 1273complete -o default -o nospace -F _git_reset git-reset
1fd6bec9 1274complete -o default -o nospace -F _git_shortlog git-shortlog
90131924 1275complete -o default -o nospace -F _git_show git-show
7fd53fce 1276complete -o default -o nospace -F _git_stash git-stash
be86f7a0 1277complete -o default -o nospace -F _git_submodule git-submodule
144d33de 1278complete -o default -o nospace -F _git_log git-show-branch
88e21dc7 1279complete -o default -o nospace -F _git_tag git-tag
690d8824
JH
1280complete -o default -o nospace -F _git_log git-whatchanged
1281
1282# The following are necessary only for Cygwin, and only are needed
1283# when the user has tab-completed the executable name and consequently
1284# included the '.exe' suffix.
1285#
76c3eb51 1286if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
b3391775
SP
1287complete -o default -o nospace -F _git_add git-add.exe
1288complete -o default -o nospace -F _git_apply git-apply.exe
144d33de 1289complete -o default -o nospace -F _git git.exe
b3391775 1290complete -o default -o nospace -F _git_branch git-branch.exe
374a58c9 1291complete -o default -o nospace -F _git_bundle git-bundle.exe
d8a9fea5 1292complete -o default -o nospace -F _git_cherry git-cherry.exe
217926c0 1293complete -o default -o nospace -F _git_describe git-describe.exe
690d8824 1294complete -o default -o nospace -F _git_diff git-diff.exe
f53352fb 1295complete -o default -o nospace -F _git_format_patch git-format-patch.exe
690d8824
JH
1296complete -o default -o nospace -F _git_log git-log.exe
1297complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
b3391775
SP
1298complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1299complete -o default -o nospace -F _git_name_rev git-name-rev.exe
690d8824 1300complete -o default -o nospace -F _git_push git-push.exe
b3391775 1301complete -o default -o nospace -F _git_config git-config
1fd6bec9 1302complete -o default -o nospace -F _git_shortlog git-shortlog.exe
90131924 1303complete -o default -o nospace -F _git_show git-show.exe
144d33de 1304complete -o default -o nospace -F _git_log git-show-branch.exe
88e21dc7 1305complete -o default -o nospace -F _git_tag git-tag.exe
690d8824 1306complete -o default -o nospace -F _git_log git-whatchanged.exe
76c3eb51 1307fi