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