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