]> git.ipfire.org Git - thirdparty/git.git/blame - contrib/completion/git-completion.bash
git-svn: update documentation with CAVEATS section
[thirdparty/git.git] / contrib / completion / git-completion.bash
CommitLineData
690d8824
JH
1#
2# bash completion support for core Git.
3#
c70680ce 4# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
690d8824 5# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
c70680ce 6# Distributed under the GNU General Public License, version 2.0.
690d8824
JH
7#
8# The contained completion routines provide support for completing:
9#
10# *) local and remote branch names
11# *) local and remote tag names
12# *) .git/remotes file names
13# *) git 'subcommands'
14# *) tree paths within 'ref:path/to/file' expressions
c70680ce 15# *) common --long-options
690d8824
JH
16#
17# To use these routines:
18#
19# 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
20# 2) Added the following line to your .bashrc:
21# source ~/.git-completion.sh
22#
b51ec6bd
SP
23# 3) You may want to make sure the git executable is available
24# in your PATH before this script is sourced, as some caching
25# is performed while the script loads. If git isn't found
26# at source time then all lookups will be done on demand,
27# which may be slightly slower.
28#
29# 4) Consider changing your PS1 to also show the current branch:
d3d717a4
SP
30# PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
31#
32# The argument to __git_ps1 will be displayed only if you
33# are currently in a git repository. The %s token will be
34# the name of the current branch.
35#
c70680ce
SP
36# To submit patches:
37#
38# *) Read Documentation/SubmittingPatches
39# *) Send all patches to the current maintainer:
40#
41# "Shawn O. Pearce" <spearce@spearce.org>
42#
43# *) Always CC the Git mailing list:
44#
45# git@vger.kernel.org
46#
690d8824 47
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
374a58c9
ML
462_git_bundle ()
463{
464 local mycword="$COMP_CWORD"
465 case "${COMP_WORDS[0]}" in
466 git)
467 local cmd="${COMP_WORDS[2]}"
468 mycword="$((mycword-1))"
469 ;;
470 git-bundle*)
471 local cmd="${COMP_WORDS[1]}"
472 ;;
473 esac
474 case "$mycword" in
475 1)
476 __gitcomp "create list-heads verify unbundle"
477 ;;
478 2)
479 # looking for a file
480 ;;
481 *)
482 case "$cmd" in
483 create)
484 __git_complete_revlist
485 ;;
486 esac
487 ;;
488 esac
489}
490
690d8824
JH
491_git_checkout ()
492{
b3391775 493 __gitcomp "$(__git_refs)"
690d8824
JH
494}
495
d8a9fea5
SP
496_git_cherry ()
497{
498 __gitcomp "$(__git_refs)"
499}
500
1273231e
SP
501_git_cherry_pick ()
502{
503 local cur="${COMP_WORDS[COMP_CWORD]}"
504 case "$cur" in
505 --*)
b3391775 506 __gitcomp "--edit --no-commit"
1273231e
SP
507 ;;
508 *)
b3391775 509 __gitcomp "$(__git_refs)"
1273231e
SP
510 ;;
511 esac
512}
513
4548e855
SP
514_git_commit ()
515{
516 local cur="${COMP_WORDS[COMP_CWORD]}"
517 case "$cur" in
518 --*)
b3391775 519 __gitcomp "
4548e855
SP
520 --all --author= --signoff --verify --no-verify
521 --edit --amend --include --only
b3391775 522 "
4548e855
SP
523 return
524 esac
525 COMPREPLY=()
526}
527
690d8824
JH
528_git_diff ()
529{
530 __git_complete_file
531}
532
533_git_diff_tree ()
534{
b3391775 535 __gitcomp "$(__git_refs)"
690d8824
JH
536}
537
538_git_fetch ()
539{
540 local cur="${COMP_WORDS[COMP_CWORD]}"
541
542 case "${COMP_WORDS[0]},$COMP_CWORD" in
543 git-fetch*,1)
b3391775 544 __gitcomp "$(__git_remotes)"
690d8824
JH
545 ;;
546 git,2)
b3391775 547 __gitcomp "$(__git_remotes)"
690d8824
JH
548 ;;
549 *)
550 case "$cur" in
551 *:*)
b3391775 552 __gitcomp "$(__git_refs)" "" "${cur#*:}"
690d8824
JH
553 ;;
554 *)
555 local remote
556 case "${COMP_WORDS[0]}" in
557 git-fetch) remote="${COMP_WORDS[1]}" ;;
558 git) remote="${COMP_WORDS[2]}" ;;
559 esac
b3391775 560 __gitcomp "$(__git_refs2 "$remote")"
690d8824
JH
561 ;;
562 esac
563 ;;
564 esac
565}
566
f53352fb
SP
567_git_format_patch ()
568{
569 local cur="${COMP_WORDS[COMP_CWORD]}"
570 case "$cur" in
571 --*)
b3391775 572 __gitcomp "
f53352fb
SP
573 --stdout --attach --thread
574 --output-directory
575 --numbered --start-number
576 --keep-subject
577 --signoff
578 --in-reply-to=
579 --full-index --binary
ec804891 580 --not --all
b3391775 581 "
f53352fb
SP
582 return
583 ;;
584 esac
585 __git_complete_revlist
586}
587
b26c8748
SP
588_git_gc ()
589{
590 local cur="${COMP_WORDS[COMP_CWORD]}"
591 case "$cur" in
592 --*)
593 __gitcomp "--prune"
594 return
595 ;;
596 esac
597 COMPREPLY=()
598}
599
690d8824
JH
600_git_ls_remote ()
601{
b3391775 602 __gitcomp "$(__git_remotes)"
690d8824
JH
603}
604
605_git_ls_tree ()
606{
607 __git_complete_file
608}
609
610_git_log ()
611{
6e31b866
SP
612 local cur="${COMP_WORDS[COMP_CWORD]}"
613 case "$cur" in
614 --pretty=*)
b3391775 615 __gitcomp "
6e31b866 616 oneline short medium full fuller email raw
b3391775 617 " "" "${cur##--pretty=}"
6e31b866
SP
618 return
619 ;;
620 --*)
b3391775 621 __gitcomp "
6e31b866
SP
622 --max-count= --max-age= --since= --after=
623 --min-age= --before= --until=
8f87fae6 624 --root --topo-order --date-order --reverse
6e31b866
SP
625 --no-merges
626 --abbrev-commit --abbrev=
627 --relative-date
628 --author= --committer= --grep=
629 --all-match
8f87fae6 630 --pretty= --name-status --name-only --raw
ec804891 631 --not --all
b3391775 632 "
6e31b866
SP
633 return
634 ;;
635 esac
f53352fb 636 __git_complete_revlist
690d8824
JH
637}
638
4ad91321
SP
639_git_merge ()
640{
641 local cur="${COMP_WORDS[COMP_CWORD]}"
ce1e39d2
SP
642 case "${COMP_WORDS[COMP_CWORD-1]}" in
643 -s|--strategy)
b3391775 644 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
645 return
646 esac
4ad91321 647 case "$cur" in
ce1e39d2 648 --strategy=*)
b3391775 649 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
650 return
651 ;;
4ad91321 652 --*)
b3391775 653 __gitcomp "
61d926a3 654 --no-commit --no-summary --squash --strategy
b3391775 655 "
4ad91321
SP
656 return
657 esac
b3391775 658 __gitcomp "$(__git_refs)"
4ad91321
SP
659}
660
690d8824
JH
661_git_merge_base ()
662{
b3391775 663 __gitcomp "$(__git_refs)"
690d8824
JH
664}
665
d33909bf
SP
666_git_name_rev ()
667{
b3391775 668 __gitcomp "--tags --all --stdin"
d33909bf
SP
669}
670
690d8824
JH
671_git_pull ()
672{
673 local cur="${COMP_WORDS[COMP_CWORD]}"
674
675 case "${COMP_WORDS[0]},$COMP_CWORD" in
676 git-pull*,1)
b3391775 677 __gitcomp "$(__git_remotes)"
690d8824
JH
678 ;;
679 git,2)
b3391775 680 __gitcomp "$(__git_remotes)"
690d8824
JH
681 ;;
682 *)
683 local remote
684 case "${COMP_WORDS[0]}" in
685 git-pull) remote="${COMP_WORDS[1]}" ;;
686 git) remote="${COMP_WORDS[2]}" ;;
687 esac
b3391775 688 __gitcomp "$(__git_refs "$remote")"
690d8824
JH
689 ;;
690 esac
691}
692
693_git_push ()
694{
695 local cur="${COMP_WORDS[COMP_CWORD]}"
696
697 case "${COMP_WORDS[0]},$COMP_CWORD" in
698 git-push*,1)
b3391775 699 __gitcomp "$(__git_remotes)"
690d8824
JH
700 ;;
701 git,2)
b3391775 702 __gitcomp "$(__git_remotes)"
690d8824
JH
703 ;;
704 *)
705 case "$cur" in
706 *:*)
707 local remote
708 case "${COMP_WORDS[0]}" in
709 git-push) remote="${COMP_WORDS[1]}" ;;
710 git) remote="${COMP_WORDS[2]}" ;;
711 esac
b3391775 712 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
690d8824 713 ;;
161fea83
SP
714 +*)
715 __gitcomp "$(__git_refs)" + "${cur#+}"
716 ;;
690d8824 717 *)
92d7c8e3 718 __gitcomp "$(__git_refs)"
690d8824
JH
719 ;;
720 esac
721 ;;
722 esac
723}
724
61d926a3
SP
725_git_rebase ()
726{
727 local cur="${COMP_WORDS[COMP_CWORD]}"
c5650b08 728 if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
b3391775 729 __gitcomp "--continue --skip --abort"
61d926a3
SP
730 return
731 fi
ce1e39d2
SP
732 case "${COMP_WORDS[COMP_CWORD-1]}" in
733 -s|--strategy)
b3391775 734 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
735 return
736 esac
61d926a3 737 case "$cur" in
ce1e39d2 738 --strategy=*)
b3391775 739 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
740 return
741 ;;
61d926a3 742 --*)
b3391775 743 __gitcomp "--onto --merge --strategy"
61d926a3
SP
744 return
745 esac
b3391775 746 __gitcomp "$(__git_refs)"
61d926a3
SP
747}
748
e0d10e1c 749_git_config ()
5de40f59
SP
750{
751 local cur="${COMP_WORDS[COMP_CWORD]}"
752 local prv="${COMP_WORDS[COMP_CWORD-1]}"
753 case "$prv" in
754 branch.*.remote)
78d4d6a2 755 __gitcomp "$(__git_remotes)"
5de40f59
SP
756 return
757 ;;
758 branch.*.merge)
78d4d6a2 759 __gitcomp "$(__git_refs)"
5de40f59
SP
760 return
761 ;;
762 remote.*.fetch)
763 local remote="${prv#remote.}"
764 remote="${remote%.fetch}"
78d4d6a2 765 __gitcomp "$(__git_refs_remotes "$remote")"
5de40f59
SP
766 return
767 ;;
768 remote.*.push)
769 local remote="${prv#remote.}"
770 remote="${remote%.push}"
78d4d6a2 771 __gitcomp "$(git --git-dir="$(__gitdir)" \
5de40f59 772 for-each-ref --format='%(refname):%(refname)' \
78d4d6a2
SP
773 refs/heads)"
774 return
775 ;;
776 pull.twohead|pull.octopus)
777 __gitcomp "$(__git_merge_strategies)"
778 return
779 ;;
780 color.branch|color.diff|color.status)
781 __gitcomp "always never auto"
782 return
783 ;;
784 color.*.*)
785 __gitcomp "
786 black red green yellow blue magenta cyan white
787 bold dim ul blink reverse
788 "
5de40f59
SP
789 return
790 ;;
791 *.*)
792 COMPREPLY=()
793 return
794 ;;
795 esac
796 case "$cur" in
797 --*)
78d4d6a2 798 __gitcomp "
12977705
SP
799 --global --system
800 --list --replace-all
5de40f59 801 --get --get-all --get-regexp
1b71eb35 802 --add --unset --unset-all
12977705 803 --remove-section --rename-section
78d4d6a2 804 "
5de40f59
SP
805 return
806 ;;
807 branch.*.*)
808 local pfx="${cur%.*}."
809 cur="${cur##*.}"
78d4d6a2 810 __gitcomp "remote merge" "$pfx" "$cur"
5de40f59
SP
811 return
812 ;;
813 branch.*)
814 local pfx="${cur%.*}."
815 cur="${cur#*.}"
78d4d6a2 816 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
5de40f59
SP
817 return
818 ;;
819 remote.*.*)
820 local pfx="${cur%.*}."
821 cur="${cur##*.}"
12977705
SP
822 __gitcomp "
823 url fetch push skipDefaultUpdate
824 receivepack uploadpack tagopt
825 " "$pfx" "$cur"
5de40f59
SP
826 return
827 ;;
828 remote.*)
829 local pfx="${cur%.*}."
830 cur="${cur#*.}"
78d4d6a2 831 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
5de40f59
SP
832 return
833 ;;
834 esac
78d4d6a2 835 __gitcomp "
5de40f59
SP
836 apply.whitespace
837 core.fileMode
838 core.gitProxy
839 core.ignoreStat
840 core.preferSymlinkRefs
841 core.logAllRefUpdates
842 core.repositoryFormatVersion
843 core.sharedRepository
844 core.warnAmbiguousRefs
845 core.compression
846 core.legacyHeaders
78d4d6a2
SP
847 core.packedGitWindowSize
848 core.packedGitLimit
2122591b 849 clean.requireForce
78d4d6a2
SP
850 color.branch
851 color.branch.current
852 color.branch.local
853 color.branch.remote
854 color.branch.plain
a159ca0c 855 color.diff
78d4d6a2
SP
856 color.diff.plain
857 color.diff.meta
858 color.diff.frag
859 color.diff.old
860 color.diff.new
861 color.diff.commit
862 color.diff.whitespace
a159ca0c 863 color.pager
a159ca0c 864 color.status
78d4d6a2
SP
865 color.status.header
866 color.status.added
867 color.status.changed
868 color.status.untracked
869 diff.renameLimit
870 diff.renames
871 fetch.unpackLimit
872 format.headers
873 gitcvs.enabled
874 gitcvs.logfile
12977705
SP
875 gitcvs.allbinary
876 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
877 gc.packrefs
78d4d6a2
SP
878 gc.reflogexpire
879 gc.reflogexpireunreachable
880 gc.rerereresolved
881 gc.rerereunresolved
5de40f59
SP
882 http.sslVerify
883 http.sslCert
884 http.sslKey
885 http.sslCAInfo
886 http.sslCAPath
887 http.maxRequests
78d4d6a2
SP
888 http.lowSpeedLimit
889 http.lowSpeedTime
5de40f59 890 http.noEPSV
78d4d6a2
SP
891 i18n.commitEncoding
892 i18n.logOutputEncoding
893 log.showroot
12977705 894 merge.tool
78d4d6a2
SP
895 merge.summary
896 merge.verbosity
5de40f59 897 pack.window
12977705 898 pack.depth
78d4d6a2
SP
899 pull.octopus
900 pull.twohead
5de40f59 901 repack.useDeltaBaseOffset
78d4d6a2
SP
902 show.difftree
903 showbranch.default
904 tar.umask
905 transfer.unpackLimit
5de40f59
SP
906 receive.unpackLimit
907 receive.denyNonFastForwards
78d4d6a2
SP
908 user.name
909 user.email
910 user.signingkey
911 whatchanged.difftree
5de40f59 912 branch. remote.
78d4d6a2 913 "
5de40f59
SP
914}
915
88293c67
SP
916_git_remote ()
917{
918 local i c=1 command
919 while [ $c -lt $COMP_CWORD ]; do
920 i="${COMP_WORDS[c]}"
921 case "$i" in
fb72759b 922 add|show|prune|update) command="$i"; break ;;
88293c67
SP
923 esac
924 c=$((++c))
925 done
926
927 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
fb72759b 928 __gitcomp "add show prune update"
88293c67
SP
929 return
930 fi
931
932 case "$command" in
933 show|prune)
934 __gitcomp "$(__git_remotes)"
935 ;;
fb72759b
SP
936 update)
937 local i c='' IFS=$'\n'
938 for i in $(git --git-dir="$(__gitdir)" config --list); do
939 case "$i" in
940 remotes.*)
941 i="${i#remotes.}"
942 c="$c ${i/=*/}"
943 ;;
944 esac
945 done
946 __gitcomp "$c"
947 ;;
88293c67
SP
948 *)
949 COMPREPLY=()
950 ;;
951 esac
952}
953
67e78c3b
SP
954_git_reset ()
955{
956 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775
SP
957 case "$cur" in
958 --*)
959 __gitcomp "--mixed --hard --soft"
960 return
961 ;;
962 esac
963 __gitcomp "$(__git_refs)"
67e78c3b
SP
964}
965
1fd6bec9
SP
966_git_shortlog ()
967{
968 local cur="${COMP_WORDS[COMP_CWORD]}"
969 case "$cur" in
970 --*)
971 __gitcomp "
972 --max-count= --max-age= --since= --after=
973 --min-age= --before= --until=
974 --no-merges
975 --author= --committer= --grep=
976 --all-match
977 --not --all
978 --numbered --summary
979 "
980 return
981 ;;
982 esac
983 __git_complete_revlist
984}
985
90131924
SP
986_git_show ()
987{
988 local cur="${COMP_WORDS[COMP_CWORD]}"
989 case "$cur" in
990 --pretty=*)
b3391775 991 __gitcomp "
90131924 992 oneline short medium full fuller email raw
b3391775 993 " "" "${cur##--pretty=}"
90131924
SP
994 return
995 ;;
996 --*)
b3391775 997 __gitcomp "--pretty="
90131924
SP
998 return
999 ;;
1000 esac
1001 __git_complete_file
1002}
1003
7fd53fce
JH
1004_git_stash ()
1005{
1006 __gitcomp 'list show apply clear'
1007}
1008
690d8824
JH
1009_git ()
1010{
873537fa
SP
1011 local i c=1 command __git_dir
1012
1013 while [ $c -lt $COMP_CWORD ]; do
1014 i="${COMP_WORDS[c]}"
1015 case "$i" in
1016 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1017 --bare) __git_dir="." ;;
1018 --version|--help|-p|--paginate) ;;
1019 *) command="$i"; break ;;
1020 esac
1021 c=$((++c))
1022 done
1023
1024 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
72e5e989
SP
1025 case "${COMP_WORDS[COMP_CWORD]}" in
1026 --*=*) COMPREPLY=() ;;
1027 --*) __gitcomp "--git-dir= --bare --version --exec-path" ;;
1028 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1029 esac
1030 return
873537fa 1031 fi
367dce2a 1032
873537fa
SP
1033 local expansion=$(__git_aliased_command "$command")
1034 [ "$expansion" ] && command="$expansion"
367dce2a 1035
873537fa 1036 case "$command" in
88329195 1037 am) _git_am ;;
8435b548 1038 add) _git_add ;;
88329195 1039 apply) _git_apply ;;
b2e69f62 1040 bisect) _git_bisect ;;
374a58c9 1041 bundle) _git_bundle ;;
873537fa 1042 branch) _git_branch ;;
873537fa 1043 checkout) _git_checkout ;;
d8a9fea5 1044 cherry) _git_cherry ;;
1273231e 1045 cherry-pick) _git_cherry_pick ;;
4548e855 1046 commit) _git_commit ;;
e0d10e1c 1047 config) _git_config ;;
873537fa 1048 diff) _git_diff ;;
873537fa 1049 fetch) _git_fetch ;;
f53352fb 1050 format-patch) _git_format_patch ;;
b26c8748 1051 gc) _git_gc ;;
873537fa
SP
1052 log) _git_log ;;
1053 ls-remote) _git_ls_remote ;;
1054 ls-tree) _git_ls_tree ;;
4ad91321 1055 merge) _git_merge;;
873537fa 1056 merge-base) _git_merge_base ;;
d33909bf 1057 name-rev) _git_name_rev ;;
873537fa
SP
1058 pull) _git_pull ;;
1059 push) _git_push ;;
61d926a3 1060 rebase) _git_rebase ;;
88293c67 1061 remote) _git_remote ;;
873537fa 1062 reset) _git_reset ;;
1fd6bec9 1063 shortlog) _git_shortlog ;;
90131924 1064 show) _git_show ;;
873537fa 1065 show-branch) _git_log ;;
7fd53fce 1066 stash) _git_stash ;;
873537fa
SP
1067 whatchanged) _git_log ;;
1068 *) COMPREPLY=() ;;
1069 esac
690d8824
JH
1070}
1071
1072_gitk ()
1073{
1074 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775
SP
1075 case "$cur" in
1076 --*)
1077 __gitcomp "--not --all"
1078 return
1079 ;;
1080 esac
ec804891 1081 __git_complete_revlist
690d8824
JH
1082}
1083
1084complete -o default -o nospace -F _git git
b3391775
SP
1085complete -o default -o nospace -F _gitk gitk
1086complete -o default -o nospace -F _git_am git-am
1087complete -o default -o nospace -F _git_apply git-apply
b2e69f62 1088complete -o default -o nospace -F _git_bisect git-bisect
b3391775 1089complete -o default -o nospace -F _git_branch git-branch
374a58c9 1090complete -o default -o nospace -F _git_bundle git-bundle
b3391775 1091complete -o default -o nospace -F _git_checkout git-checkout
d8a9fea5 1092complete -o default -o nospace -F _git_cherry git-cherry
b3391775
SP
1093complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1094complete -o default -o nospace -F _git_commit git-commit
690d8824 1095complete -o default -o nospace -F _git_diff git-diff
690d8824 1096complete -o default -o nospace -F _git_fetch git-fetch
f53352fb 1097complete -o default -o nospace -F _git_format_patch git-format-patch
b26c8748 1098complete -o default -o nospace -F _git_gc git-gc
690d8824 1099complete -o default -o nospace -F _git_log git-log
b3391775 1100complete -o default -o nospace -F _git_ls_remote git-ls-remote
690d8824 1101complete -o default -o nospace -F _git_ls_tree git-ls-tree
b3391775
SP
1102complete -o default -o nospace -F _git_merge git-merge
1103complete -o default -o nospace -F _git_merge_base git-merge-base
1104complete -o default -o nospace -F _git_name_rev git-name-rev
690d8824
JH
1105complete -o default -o nospace -F _git_pull git-pull
1106complete -o default -o nospace -F _git_push git-push
b3391775
SP
1107complete -o default -o nospace -F _git_rebase git-rebase
1108complete -o default -o nospace -F _git_config git-config
88293c67 1109complete -o default -o nospace -F _git_remote git-remote
b3391775 1110complete -o default -o nospace -F _git_reset git-reset
1fd6bec9 1111complete -o default -o nospace -F _git_shortlog git-shortlog
90131924 1112complete -o default -o nospace -F _git_show git-show
7fd53fce 1113complete -o default -o nospace -F _git_stash git-stash
144d33de 1114complete -o default -o nospace -F _git_log git-show-branch
690d8824
JH
1115complete -o default -o nospace -F _git_log git-whatchanged
1116
1117# The following are necessary only for Cygwin, and only are needed
1118# when the user has tab-completed the executable name and consequently
1119# included the '.exe' suffix.
1120#
76c3eb51 1121if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
b3391775
SP
1122complete -o default -o nospace -F _git_add git-add.exe
1123complete -o default -o nospace -F _git_apply git-apply.exe
144d33de 1124complete -o default -o nospace -F _git git.exe
b3391775 1125complete -o default -o nospace -F _git_branch git-branch.exe
374a58c9 1126complete -o default -o nospace -F _git_bundle git-bundle.exe
d8a9fea5 1127complete -o default -o nospace -F _git_cherry git-cherry.exe
690d8824 1128complete -o default -o nospace -F _git_diff git-diff.exe
f53352fb 1129complete -o default -o nospace -F _git_format_patch git-format-patch.exe
690d8824
JH
1130complete -o default -o nospace -F _git_log git-log.exe
1131complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
b3391775
SP
1132complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1133complete -o default -o nospace -F _git_name_rev git-name-rev.exe
690d8824 1134complete -o default -o nospace -F _git_push git-push.exe
b3391775 1135complete -o default -o nospace -F _git_config git-config
1fd6bec9 1136complete -o default -o nospace -F _git_shortlog git-shortlog.exe
90131924 1137complete -o default -o nospace -F _git_show git-show.exe
144d33de 1138complete -o default -o nospace -F _git_log git-show-branch.exe
690d8824 1139complete -o default -o nospace -F _git_log git-whatchanged.exe
76c3eb51 1140fi