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