]> git.ipfire.org Git - thirdparty/git.git/blame - contrib/completion/git-completion.bash
t6030: grab commit object name as we go
[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;;
c6ec3b13 272 fast-import) : import;;
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
SP
299 rerere) : plumbing;;
300 rev-list) : plumbing;;
301 rev-parse) : plumbing;;
302 runstatus) : plumbing;;
303 sh-setup) : internal;;
304 shell) : daemon;;
305 send-pack) : plumbing;;
306 show-index) : plumbing;;
307 ssh-*) : transport;;
308 stripspace) : plumbing;;
a925c6f1
SP
309 svn) : import export;;
310 svnimport) : import;;
f2bb9f88 311 symbolic-ref) : plumbing;;
a925c6f1 312 tar-tree) : deprecated;;
f2bb9f88
SP
313 unpack-file) : plumbing;;
314 unpack-objects) : plumbing;;
a925c6f1 315 update-index) : plumbing;;
f2bb9f88
SP
316 update-ref) : plumbing;;
317 update-server-info) : daemon;;
318 upload-archive) : plumbing;;
319 upload-pack) : plumbing;;
320 write-tree) : plumbing;;
a925c6f1 321 verify-tag) : plumbing;;
f2bb9f88
SP
322 *) echo $i;;
323 esac
324 done
325}
b51ec6bd
SP
326__git_commandlist=
327__git_commandlist="$(__git_commands 2>/dev/null)"
f2bb9f88 328
367dce2a
DS
329__git_aliases ()
330{
56fc25f2 331 local i IFS=$'\n'
e0d10e1c 332 for i in $(git --git-dir="$(__gitdir)" config --list); do
56fc25f2
SP
333 case "$i" in
334 alias.*)
335 i="${i#alias.}"
336 echo "${i/=*/}"
337 ;;
338 esac
339 done
367dce2a
DS
340}
341
342__git_aliased_command ()
343{
873537fa 344 local word cmdline=$(git --git-dir="$(__gitdir)" \
e0d10e1c 345 config --get "alias.$1")
367dce2a
DS
346 for word in $cmdline; do
347 if [ "${word##-*}" ]; then
348 echo $word
349 return
350 fi
351 done
352}
353
88329195
SP
354__git_whitespacelist="nowarn warn error error-all strip"
355
356_git_am ()
357{
358 local cur="${COMP_WORDS[COMP_CWORD]}"
359 if [ -d .dotest ]; then
b3391775 360 __gitcomp "--skip --resolved"
88329195
SP
361 return
362 fi
363 case "$cur" in
364 --whitespace=*)
b3391775 365 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
366 return
367 ;;
368 --*)
b3391775 369 __gitcomp "
88329195
SP
370 --signoff --utf8 --binary --3way --interactive
371 --whitespace=
b3391775 372 "
88329195
SP
373 return
374 esac
375 COMPREPLY=()
376}
377
378_git_apply ()
379{
380 local cur="${COMP_WORDS[COMP_CWORD]}"
381 case "$cur" in
382 --whitespace=*)
b3391775 383 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
384 return
385 ;;
386 --*)
b3391775 387 __gitcomp "
88329195
SP
388 --stat --numstat --summary --check --index
389 --cached --index-info --reverse --reject --unidiff-zero
390 --apply --no-add --exclude=
391 --whitespace= --inaccurate-eof --verbose
b3391775 392 "
88329195
SP
393 return
394 esac
395 COMPREPLY=()
396}
397
8435b548
SP
398_git_add ()
399{
400 local cur="${COMP_WORDS[COMP_CWORD]}"
401 case "$cur" in
402 --*)
b3391775 403 __gitcomp "--interactive"
8435b548
SP
404 return
405 esac
406 COMPREPLY=()
407}
408
b2e69f62
SP
409_git_bisect ()
410{
411 local i c=1 command
412 while [ $c -lt $COMP_CWORD ]; do
413 i="${COMP_WORDS[c]}"
414 case "$i" in
415 start|bad|good|reset|visualize|replay|log)
416 command="$i"
417 break
418 ;;
419 esac
420 c=$((++c))
421 done
422
423 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
424 __gitcomp "start bad good reset visualize replay log"
425 return
426 fi
427
428 case "$command" in
429 bad|good|reset)
430 __gitcomp "$(__git_refs)"
431 ;;
432 *)
433 COMPREPLY=()
434 ;;
435 esac
436}
437
690d8824
JH
438_git_branch ()
439{
b3391775 440 __gitcomp "$(__git_refs)"
690d8824
JH
441}
442
690d8824
JH
443_git_checkout ()
444{
b3391775 445 __gitcomp "$(__git_refs)"
690d8824
JH
446}
447
d8a9fea5
SP
448_git_cherry ()
449{
450 __gitcomp "$(__git_refs)"
451}
452
1273231e
SP
453_git_cherry_pick ()
454{
455 local cur="${COMP_WORDS[COMP_CWORD]}"
456 case "$cur" in
457 --*)
b3391775 458 __gitcomp "--edit --no-commit"
1273231e
SP
459 ;;
460 *)
b3391775 461 __gitcomp "$(__git_refs)"
1273231e
SP
462 ;;
463 esac
464}
465
4548e855
SP
466_git_commit ()
467{
468 local cur="${COMP_WORDS[COMP_CWORD]}"
469 case "$cur" in
470 --*)
b3391775 471 __gitcomp "
4548e855
SP
472 --all --author= --signoff --verify --no-verify
473 --edit --amend --include --only
b3391775 474 "
4548e855
SP
475 return
476 esac
477 COMPREPLY=()
478}
479
690d8824
JH
480_git_diff ()
481{
482 __git_complete_file
483}
484
485_git_diff_tree ()
486{
b3391775 487 __gitcomp "$(__git_refs)"
690d8824
JH
488}
489
490_git_fetch ()
491{
492 local cur="${COMP_WORDS[COMP_CWORD]}"
493
494 case "${COMP_WORDS[0]},$COMP_CWORD" in
495 git-fetch*,1)
b3391775 496 __gitcomp "$(__git_remotes)"
690d8824
JH
497 ;;
498 git,2)
b3391775 499 __gitcomp "$(__git_remotes)"
690d8824
JH
500 ;;
501 *)
502 case "$cur" in
503 *:*)
b3391775 504 __gitcomp "$(__git_refs)" "" "${cur#*:}"
690d8824
JH
505 ;;
506 *)
507 local remote
508 case "${COMP_WORDS[0]}" in
509 git-fetch) remote="${COMP_WORDS[1]}" ;;
510 git) remote="${COMP_WORDS[2]}" ;;
511 esac
b3391775 512 __gitcomp "$(__git_refs2 "$remote")"
690d8824
JH
513 ;;
514 esac
515 ;;
516 esac
517}
518
f53352fb
SP
519_git_format_patch ()
520{
521 local cur="${COMP_WORDS[COMP_CWORD]}"
522 case "$cur" in
523 --*)
b3391775 524 __gitcomp "
f53352fb
SP
525 --stdout --attach --thread
526 --output-directory
527 --numbered --start-number
528 --keep-subject
529 --signoff
530 --in-reply-to=
531 --full-index --binary
ec804891 532 --not --all
b3391775 533 "
f53352fb
SP
534 return
535 ;;
536 esac
537 __git_complete_revlist
538}
539
b26c8748
SP
540_git_gc ()
541{
542 local cur="${COMP_WORDS[COMP_CWORD]}"
543 case "$cur" in
544 --*)
545 __gitcomp "--prune"
546 return
547 ;;
548 esac
549 COMPREPLY=()
550}
551
690d8824
JH
552_git_ls_remote ()
553{
b3391775 554 __gitcomp "$(__git_remotes)"
690d8824
JH
555}
556
557_git_ls_tree ()
558{
559 __git_complete_file
560}
561
562_git_log ()
563{
6e31b866
SP
564 local cur="${COMP_WORDS[COMP_CWORD]}"
565 case "$cur" in
566 --pretty=*)
b3391775 567 __gitcomp "
6e31b866 568 oneline short medium full fuller email raw
b3391775 569 " "" "${cur##--pretty=}"
6e31b866
SP
570 return
571 ;;
572 --*)
b3391775 573 __gitcomp "
6e31b866
SP
574 --max-count= --max-age= --since= --after=
575 --min-age= --before= --until=
576 --root --not --topo-order --date-order
577 --no-merges
578 --abbrev-commit --abbrev=
579 --relative-date
580 --author= --committer= --grep=
581 --all-match
582 --pretty= --name-status --name-only
ec804891 583 --not --all
b3391775 584 "
6e31b866
SP
585 return
586 ;;
587 esac
f53352fb 588 __git_complete_revlist
690d8824
JH
589}
590
4ad91321
SP
591_git_merge ()
592{
593 local cur="${COMP_WORDS[COMP_CWORD]}"
ce1e39d2
SP
594 case "${COMP_WORDS[COMP_CWORD-1]}" in
595 -s|--strategy)
b3391775 596 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
597 return
598 esac
4ad91321 599 case "$cur" in
ce1e39d2 600 --strategy=*)
b3391775 601 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
602 return
603 ;;
4ad91321 604 --*)
b3391775 605 __gitcomp "
61d926a3 606 --no-commit --no-summary --squash --strategy
b3391775 607 "
4ad91321
SP
608 return
609 esac
b3391775 610 __gitcomp "$(__git_refs)"
4ad91321
SP
611}
612
690d8824
JH
613_git_merge_base ()
614{
b3391775 615 __gitcomp "$(__git_refs)"
690d8824
JH
616}
617
d33909bf
SP
618_git_name_rev ()
619{
b3391775 620 __gitcomp "--tags --all --stdin"
d33909bf
SP
621}
622
690d8824
JH
623_git_pull ()
624{
625 local cur="${COMP_WORDS[COMP_CWORD]}"
626
627 case "${COMP_WORDS[0]},$COMP_CWORD" in
628 git-pull*,1)
b3391775 629 __gitcomp "$(__git_remotes)"
690d8824
JH
630 ;;
631 git,2)
b3391775 632 __gitcomp "$(__git_remotes)"
690d8824
JH
633 ;;
634 *)
635 local remote
636 case "${COMP_WORDS[0]}" in
637 git-pull) remote="${COMP_WORDS[1]}" ;;
638 git) remote="${COMP_WORDS[2]}" ;;
639 esac
b3391775 640 __gitcomp "$(__git_refs "$remote")"
690d8824
JH
641 ;;
642 esac
643}
644
645_git_push ()
646{
647 local cur="${COMP_WORDS[COMP_CWORD]}"
648
649 case "${COMP_WORDS[0]},$COMP_CWORD" in
650 git-push*,1)
b3391775 651 __gitcomp "$(__git_remotes)"
690d8824
JH
652 ;;
653 git,2)
b3391775 654 __gitcomp "$(__git_remotes)"
690d8824
JH
655 ;;
656 *)
657 case "$cur" in
658 *:*)
659 local remote
660 case "${COMP_WORDS[0]}" in
661 git-push) remote="${COMP_WORDS[1]}" ;;
662 git) remote="${COMP_WORDS[2]}" ;;
663 esac
b3391775 664 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
690d8824
JH
665 ;;
666 *)
b3391775 667 __gitcomp "$(__git_refs2)"
690d8824
JH
668 ;;
669 esac
670 ;;
671 esac
672}
673
61d926a3
SP
674_git_rebase ()
675{
676 local cur="${COMP_WORDS[COMP_CWORD]}"
c5650b08 677 if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
b3391775 678 __gitcomp "--continue --skip --abort"
61d926a3
SP
679 return
680 fi
ce1e39d2
SP
681 case "${COMP_WORDS[COMP_CWORD-1]}" in
682 -s|--strategy)
b3391775 683 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
684 return
685 esac
61d926a3 686 case "$cur" in
ce1e39d2 687 --strategy=*)
b3391775 688 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
689 return
690 ;;
61d926a3 691 --*)
b3391775 692 __gitcomp "--onto --merge --strategy"
61d926a3
SP
693 return
694 esac
b3391775 695 __gitcomp "$(__git_refs)"
61d926a3
SP
696}
697
e0d10e1c 698_git_config ()
5de40f59
SP
699{
700 local cur="${COMP_WORDS[COMP_CWORD]}"
701 local prv="${COMP_WORDS[COMP_CWORD-1]}"
702 case "$prv" in
703 branch.*.remote)
78d4d6a2 704 __gitcomp "$(__git_remotes)"
5de40f59
SP
705 return
706 ;;
707 branch.*.merge)
78d4d6a2 708 __gitcomp "$(__git_refs)"
5de40f59
SP
709 return
710 ;;
711 remote.*.fetch)
712 local remote="${prv#remote.}"
713 remote="${remote%.fetch}"
78d4d6a2 714 __gitcomp "$(__git_refs_remotes "$remote")"
5de40f59
SP
715 return
716 ;;
717 remote.*.push)
718 local remote="${prv#remote.}"
719 remote="${remote%.push}"
78d4d6a2 720 __gitcomp "$(git --git-dir="$(__gitdir)" \
5de40f59 721 for-each-ref --format='%(refname):%(refname)' \
78d4d6a2
SP
722 refs/heads)"
723 return
724 ;;
725 pull.twohead|pull.octopus)
726 __gitcomp "$(__git_merge_strategies)"
727 return
728 ;;
729 color.branch|color.diff|color.status)
730 __gitcomp "always never auto"
731 return
732 ;;
733 color.*.*)
734 __gitcomp "
735 black red green yellow blue magenta cyan white
736 bold dim ul blink reverse
737 "
5de40f59
SP
738 return
739 ;;
740 *.*)
741 COMPREPLY=()
742 return
743 ;;
744 esac
745 case "$cur" in
746 --*)
78d4d6a2 747 __gitcomp "
5de40f59
SP
748 --global --list --replace-all
749 --get --get-all --get-regexp
1b71eb35 750 --add --unset --unset-all
78d4d6a2 751 "
5de40f59
SP
752 return
753 ;;
754 branch.*.*)
755 local pfx="${cur%.*}."
756 cur="${cur##*.}"
78d4d6a2 757 __gitcomp "remote merge" "$pfx" "$cur"
5de40f59
SP
758 return
759 ;;
760 branch.*)
761 local pfx="${cur%.*}."
762 cur="${cur#*.}"
78d4d6a2 763 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
5de40f59
SP
764 return
765 ;;
766 remote.*.*)
767 local pfx="${cur%.*}."
768 cur="${cur##*.}"
78d4d6a2 769 __gitcomp "url fetch push" "$pfx" "$cur"
5de40f59
SP
770 return
771 ;;
772 remote.*)
773 local pfx="${cur%.*}."
774 cur="${cur#*.}"
78d4d6a2 775 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
5de40f59
SP
776 return
777 ;;
778 esac
78d4d6a2 779 __gitcomp "
5de40f59
SP
780 apply.whitespace
781 core.fileMode
782 core.gitProxy
783 core.ignoreStat
784 core.preferSymlinkRefs
785 core.logAllRefUpdates
786 core.repositoryFormatVersion
787 core.sharedRepository
788 core.warnAmbiguousRefs
789 core.compression
790 core.legacyHeaders
78d4d6a2
SP
791 core.packedGitWindowSize
792 core.packedGitLimit
793 color.branch
794 color.branch.current
795 color.branch.local
796 color.branch.remote
797 color.branch.plain
a159ca0c 798 color.diff
78d4d6a2
SP
799 color.diff.plain
800 color.diff.meta
801 color.diff.frag
802 color.diff.old
803 color.diff.new
804 color.diff.commit
805 color.diff.whitespace
a159ca0c 806 color.pager
a159ca0c 807 color.status
78d4d6a2
SP
808 color.status.header
809 color.status.added
810 color.status.changed
811 color.status.untracked
812 diff.renameLimit
813 diff.renames
814 fetch.unpackLimit
815 format.headers
816 gitcvs.enabled
817 gitcvs.logfile
818 gc.reflogexpire
819 gc.reflogexpireunreachable
820 gc.rerereresolved
821 gc.rerereunresolved
5de40f59
SP
822 http.sslVerify
823 http.sslCert
824 http.sslKey
825 http.sslCAInfo
826 http.sslCAPath
827 http.maxRequests
78d4d6a2
SP
828 http.lowSpeedLimit
829 http.lowSpeedTime
5de40f59 830 http.noEPSV
78d4d6a2
SP
831 i18n.commitEncoding
832 i18n.logOutputEncoding
833 log.showroot
834 merge.summary
835 merge.verbosity
5de40f59 836 pack.window
78d4d6a2
SP
837 pull.octopus
838 pull.twohead
5de40f59 839 repack.useDeltaBaseOffset
78d4d6a2
SP
840 show.difftree
841 showbranch.default
842 tar.umask
843 transfer.unpackLimit
5de40f59
SP
844 receive.unpackLimit
845 receive.denyNonFastForwards
78d4d6a2
SP
846 user.name
847 user.email
848 user.signingkey
849 whatchanged.difftree
5de40f59 850 branch. remote.
78d4d6a2 851 "
5de40f59
SP
852}
853
88293c67
SP
854_git_remote ()
855{
856 local i c=1 command
857 while [ $c -lt $COMP_CWORD ]; do
858 i="${COMP_WORDS[c]}"
859 case "$i" in
860 add|show|prune) command="$i"; break ;;
861 esac
862 c=$((++c))
863 done
864
865 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
866 __gitcomp "add show prune"
867 return
868 fi
869
870 case "$command" in
871 show|prune)
872 __gitcomp "$(__git_remotes)"
873 ;;
874 *)
875 COMPREPLY=()
876 ;;
877 esac
878}
879
67e78c3b
SP
880_git_reset ()
881{
882 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775
SP
883 case "$cur" in
884 --*)
885 __gitcomp "--mixed --hard --soft"
886 return
887 ;;
888 esac
889 __gitcomp "$(__git_refs)"
67e78c3b
SP
890}
891
90131924
SP
892_git_show ()
893{
894 local cur="${COMP_WORDS[COMP_CWORD]}"
895 case "$cur" in
896 --pretty=*)
b3391775 897 __gitcomp "
90131924 898 oneline short medium full fuller email raw
b3391775 899 " "" "${cur##--pretty=}"
90131924
SP
900 return
901 ;;
902 --*)
b3391775 903 __gitcomp "--pretty="
90131924
SP
904 return
905 ;;
906 esac
907 __git_complete_file
908}
909
690d8824
JH
910_git ()
911{
873537fa
SP
912 local i c=1 command __git_dir
913
914 while [ $c -lt $COMP_CWORD ]; do
915 i="${COMP_WORDS[c]}"
916 case "$i" in
917 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
918 --bare) __git_dir="." ;;
919 --version|--help|-p|--paginate) ;;
920 *) command="$i"; break ;;
921 esac
922 c=$((++c))
923 done
924
925 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
72e5e989
SP
926 case "${COMP_WORDS[COMP_CWORD]}" in
927 --*=*) COMPREPLY=() ;;
928 --*) __gitcomp "--git-dir= --bare --version --exec-path" ;;
929 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
930 esac
931 return
873537fa 932 fi
367dce2a 933
873537fa
SP
934 local expansion=$(__git_aliased_command "$command")
935 [ "$expansion" ] && command="$expansion"
367dce2a 936
873537fa 937 case "$command" in
88329195 938 am) _git_am ;;
8435b548 939 add) _git_add ;;
88329195 940 apply) _git_apply ;;
b2e69f62 941 bisect) _git_bisect ;;
873537fa 942 branch) _git_branch ;;
873537fa 943 checkout) _git_checkout ;;
d8a9fea5 944 cherry) _git_cherry ;;
1273231e 945 cherry-pick) _git_cherry_pick ;;
4548e855 946 commit) _git_commit ;;
e0d10e1c 947 config) _git_config ;;
873537fa
SP
948 diff) _git_diff ;;
949 diff-tree) _git_diff_tree ;;
950 fetch) _git_fetch ;;
f53352fb 951 format-patch) _git_format_patch ;;
b26c8748 952 gc) _git_gc ;;
873537fa
SP
953 log) _git_log ;;
954 ls-remote) _git_ls_remote ;;
955 ls-tree) _git_ls_tree ;;
4ad91321 956 merge) _git_merge;;
873537fa 957 merge-base) _git_merge_base ;;
d33909bf 958 name-rev) _git_name_rev ;;
873537fa
SP
959 pull) _git_pull ;;
960 push) _git_push ;;
61d926a3 961 rebase) _git_rebase ;;
88293c67 962 remote) _git_remote ;;
873537fa 963 reset) _git_reset ;;
90131924 964 show) _git_show ;;
873537fa
SP
965 show-branch) _git_log ;;
966 whatchanged) _git_log ;;
967 *) COMPREPLY=() ;;
968 esac
690d8824
JH
969}
970
971_gitk ()
972{
973 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775
SP
974 case "$cur" in
975 --*)
976 __gitcomp "--not --all"
977 return
978 ;;
979 esac
ec804891 980 __git_complete_revlist
690d8824
JH
981}
982
983complete -o default -o nospace -F _git git
b3391775
SP
984complete -o default -o nospace -F _gitk gitk
985complete -o default -o nospace -F _git_am git-am
986complete -o default -o nospace -F _git_apply git-apply
b2e69f62 987complete -o default -o nospace -F _git_bisect git-bisect
b3391775
SP
988complete -o default -o nospace -F _git_branch git-branch
989complete -o default -o nospace -F _git_checkout git-checkout
d8a9fea5 990complete -o default -o nospace -F _git_cherry git-cherry
b3391775
SP
991complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
992complete -o default -o nospace -F _git_commit git-commit
690d8824 993complete -o default -o nospace -F _git_diff git-diff
b3391775 994complete -o default -o nospace -F _git_diff_tree git-diff-tree
690d8824 995complete -o default -o nospace -F _git_fetch git-fetch
f53352fb 996complete -o default -o nospace -F _git_format_patch git-format-patch
b26c8748 997complete -o default -o nospace -F _git_gc git-gc
690d8824 998complete -o default -o nospace -F _git_log git-log
b3391775 999complete -o default -o nospace -F _git_ls_remote git-ls-remote
690d8824 1000complete -o default -o nospace -F _git_ls_tree git-ls-tree
b3391775
SP
1001complete -o default -o nospace -F _git_merge git-merge
1002complete -o default -o nospace -F _git_merge_base git-merge-base
1003complete -o default -o nospace -F _git_name_rev git-name-rev
690d8824
JH
1004complete -o default -o nospace -F _git_pull git-pull
1005complete -o default -o nospace -F _git_push git-push
b3391775
SP
1006complete -o default -o nospace -F _git_rebase git-rebase
1007complete -o default -o nospace -F _git_config git-config
88293c67 1008complete -o default -o nospace -F _git_remote git-remote
b3391775 1009complete -o default -o nospace -F _git_reset git-reset
90131924 1010complete -o default -o nospace -F _git_show git-show
144d33de 1011complete -o default -o nospace -F _git_log git-show-branch
690d8824
JH
1012complete -o default -o nospace -F _git_log git-whatchanged
1013
1014# The following are necessary only for Cygwin, and only are needed
1015# when the user has tab-completed the executable name and consequently
1016# included the '.exe' suffix.
1017#
76c3eb51 1018if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
b3391775
SP
1019complete -o default -o nospace -F _git_add git-add.exe
1020complete -o default -o nospace -F _git_apply git-apply.exe
144d33de 1021complete -o default -o nospace -F _git git.exe
b3391775 1022complete -o default -o nospace -F _git_branch git-branch.exe
d8a9fea5 1023complete -o default -o nospace -F _git_cherry git-cherry.exe
690d8824
JH
1024complete -o default -o nospace -F _git_diff git-diff.exe
1025complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
f53352fb 1026complete -o default -o nospace -F _git_format_patch git-format-patch.exe
690d8824
JH
1027complete -o default -o nospace -F _git_log git-log.exe
1028complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
b3391775
SP
1029complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1030complete -o default -o nospace -F _git_name_rev git-name-rev.exe
690d8824 1031complete -o default -o nospace -F _git_push git-push.exe
b3391775 1032complete -o default -o nospace -F _git_config git-config
90131924 1033complete -o default -o nospace -F _git_show git-show.exe
144d33de 1034complete -o default -o nospace -F _git_log git-show-branch.exe
690d8824 1035complete -o default -o nospace -F _git_log git-whatchanged.exe
76c3eb51 1036fi