1#
2# bash completion support for core Git.
3#
4# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
5# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
6# Distributed under the GNU General Public License, version 2.0.
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
15# *) common --long-options
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#
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:
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#
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#
47
48__gitdir ()
49{
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
63}
64
65__git_ps1 ()
66{
67 local g="$(git rev-parse --git-dir 2>/dev/null)"
68 if [ -n "$g" ]; then
69 local r
70 local b
71 if [ -d "$g/../.dotest" ]
72 then
73 if test -f "$g/../.dotest/rebasing"
74 then
75 r="|REBASE"
76 elif test -f "$g/../.dotest/applying"
77 then
78 r="|AM"
79 else
80 r="|AM/REBASE"
81 fi
82 b="$(git symbolic-ref HEAD 2>/dev/null)"
83 elif [ -f "$g/.dotest-merge/interactive" ]
84 then
85 r="|REBASE-i"
86 b="$(cat "$g/.dotest-merge/head-name")"
87 elif [ -d "$g/.dotest-merge" ]
88 then
89 r="|REBASE-m"
90 b="$(cat "$g/.dotest-merge/head-name")"
91 elif [ -f "$g/MERGE_HEAD" ]
92 then
93 r="|MERGING"
94 b="$(git symbolic-ref HEAD 2>/dev/null)"
95 else
96 if [ -f "$g/BISECT_LOG" ]
97 then
98 r="|BISECTING"
99 fi
100 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
101 then
102 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
103 then
104 b="$(cut -c1-7 "$g/HEAD")..."
105 fi
106 fi
107 fi
108
109 if [ -n "$1" ]; then
110 printf "$1" "${b##refs/heads/}$r"
111 else
112 printf " (%s)" "${b##refs/heads/}$r"
113 fi
114 fi
115}
116
117__gitcomp ()
118{
119 local all c s=$'\n' IFS=' '$'\t'$'\n'
120 local cur="${COMP_WORDS[COMP_CWORD]}"
121 if [ $# -gt 2 ]; then
122 cur="$3"
123 fi
124 case "$cur" in
125 --*=)
126 COMPREPLY=()
127 return
128 ;;
129 *)
130 for c in $1; do
131 case "$c$4" in
132 --*=*) all="$all$c$4$s" ;;
133 *.) all="$all$c$4$s" ;;
134 *) all="$all$c$4 $s" ;;
135 esac
136 done
137 ;;
138 esac
139 IFS=$s
140 COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
141 return
142}
143
144__git_heads ()
145{
146 local cmd i is_hash=y dir="$(__gitdir "$1")"
147 if [ -d "$dir" ]; then
148 for i in $(git --git-dir="$dir" \
149 for-each-ref --format='%(refname)' \
150 refs/heads ); do
151 echo "${i#refs/heads/}"
152 done
153 return
154 fi
155 for i in $(git ls-remote "$1" 2>/dev/null); do
156 case "$is_hash,$i" in
157 y,*) is_hash=n ;;
158 n,*^{}) is_hash=y ;;
159 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
160 n,*) is_hash=y; echo "$i" ;;
161 esac
162 done
163}
164
165__git_tags ()
166{
167 local cmd i is_hash=y dir="$(__gitdir "$1")"
168 if [ -d "$dir" ]; then
169 for i in $(git --git-dir="$dir" \
170 for-each-ref --format='%(refname)' \
171 refs/tags ); do
172 echo "${i#refs/tags/}"
173 done
174 return
175 fi
176 for i in $(git ls-remote "$1" 2>/dev/null); do
177 case "$is_hash,$i" in
178 y,*) is_hash=n ;;
179 n,*^{}) is_hash=y ;;
180 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
181 n,*) is_hash=y; echo "$i" ;;
182 esac
183 done
184}
185
186__git_refs ()
187{
188 local cmd i is_hash=y dir="$(__gitdir "$1")"
189 if [ -d "$dir" ]; then
190 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
191 for i in $(git --git-dir="$dir" \
192 for-each-ref --format='%(refname)' \
193 refs/tags refs/heads refs/remotes); do
194 case "$i" in
195 refs/tags/*) echo "${i#refs/tags/}" ;;
196 refs/heads/*) echo "${i#refs/heads/}" ;;
197 refs/remotes/*) echo "${i#refs/remotes/}" ;;
198 *) echo "$i" ;;
199 esac
200 done
201 return
202 fi
203 for i in $(git ls-remote "$dir" 2>/dev/null); do
204 case "$is_hash,$i" in
205 y,*) is_hash=n ;;
206 n,*^{}) is_hash=y ;;
207 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
208 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
209 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
210 n,*) is_hash=y; echo "$i" ;;
211 esac
212 done
213}
214
215__git_refs2 ()
216{
217 local i
218 for i in $(__git_refs "$1"); do
219 echo "$i:$i"
220 done
221}
222
223__git_refs_remotes ()
224{
225 local cmd i is_hash=y
226 for i in $(git ls-remote "$1" 2>/dev/null); do
227 case "$is_hash,$i" in
228 n,refs/heads/*)
229 is_hash=y
230 echo "$i:refs/remotes/$1/${i#refs/heads/}"
231 ;;
232 y,*) is_hash=n ;;
233 n,*^{}) is_hash=y ;;
234 n,refs/tags/*) is_hash=y;;
235 n,*) is_hash=y; ;;
236 esac
237 done
238}
239
240__git_remotes ()
241{
242 local i ngoff IFS=$'\n' d="$(__gitdir)"
243 shopt -q nullglob || ngoff=1
244 shopt -s nullglob
245 for i in "$d/remotes"/*; do
246 echo ${i#$d/remotes/}
247 done
248 [ "$ngoff" ] && shopt -u nullglob
249 for i in $(git --git-dir="$d" config --list); do
250 case "$i" in
251 remote.*.url=*)
252 i="${i#remote.}"
253 echo "${i/.url=*/}"
254 ;;
255 esac
256 done
257}
258
259__git_merge_strategies ()
260{
261 if [ -n "$__git_merge_strategylist" ]; then
262 echo "$__git_merge_strategylist"
263 return
264 fi
265 sed -n "/^all_strategies='/{
266 s/^all_strategies='//
267 s/'//
268 p
269 q
270 }" "$(git --exec-path)/git-merge"
271}
272__git_merge_strategylist=
273__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
274
275__git_complete_file ()
276{
277 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
278 case "$cur" in
279 ?*:*)
280 ref="${cur%%:*}"
281 cur="${cur#*:}"
282 case "$cur" in
283 ?*/*)
284 pfx="${cur%/*}"
285 cur="${cur##*/}"
286 ls="$ref:$pfx"
287 pfx="$pfx/"
288 ;;
289 *)
290 ls="$ref"
291 ;;
292 esac
293 COMPREPLY=($(compgen -P "$pfx" \
294 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
295 | sed '/^100... blob /s,^.* ,,
296 /^040000 tree /{
297 s,^.* ,,
298 s,$,/,
299 }
300 s/^.* //')" \
301 -- "$cur"))
302 ;;
303 *)
304 __gitcomp "$(__git_refs)"
305 ;;
306 esac
307}
308
309__git_complete_revlist ()
310{
311 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
312 case "$cur" in
313 *...*)
314 pfx="${cur%...*}..."
315 cur="${cur#*...}"
316 __gitcomp "$(__git_refs)" "$pfx" "$cur"
317 ;;
318 *..*)
319 pfx="${cur%..*}.."
320 cur="${cur#*..}"
321 __gitcomp "$(__git_refs)" "$pfx" "$cur"
322 ;;
323 *.)
324 __gitcomp "$cur."
325 ;;
326 *)
327 __gitcomp "$(__git_refs)"
328 ;;
329 esac
330}
331
332__git_commands ()
333{
334 if [ -n "$__git_commandlist" ]; then
335 echo "$__git_commandlist"
336 return
337 fi
338 local i IFS=" "$'\n'
339 for i in $(git help -a|egrep '^ ')
340 do
341 case $i in
342 *--*) : helper pattern;;
343 applymbox) : ask gittus;;
344 applypatch) : ask gittus;;
345 archimport) : import;;
346 cat-file) : plumbing;;
347 check-attr) : plumbing;;
348 check-ref-format) : plumbing;;
349 commit-tree) : plumbing;;
350 cvsexportcommit) : export;;
351 cvsimport) : import;;
352 cvsserver) : daemon;;
353 daemon) : daemon;;
354 diff-files) : plumbing;;
355 diff-index) : plumbing;;
356 diff-tree) : plumbing;;
357 fast-import) : import;;
358 fsck-objects) : plumbing;;
359 fetch-pack) : plumbing;;
360 fmt-merge-msg) : plumbing;;
361 for-each-ref) : plumbing;;
362 hash-object) : plumbing;;
363 http-*) : transport;;
364 index-pack) : plumbing;;
365 init-db) : deprecated;;
366 local-fetch) : plumbing;;
367 mailinfo) : plumbing;;
368 mailsplit) : plumbing;;
369 merge-*) : plumbing;;
370 mktree) : plumbing;;
371 mktag) : plumbing;;
372 pack-objects) : plumbing;;
373 pack-redundant) : plumbing;;
374 pack-refs) : plumbing;;
375 parse-remote) : plumbing;;
376 patch-id) : plumbing;;
377 peek-remote) : plumbing;;
378 prune) : plumbing;;
379 prune-packed) : plumbing;;
380 quiltimport) : import;;
381 read-tree) : plumbing;;
382 receive-pack) : plumbing;;
383 reflog) : plumbing;;
384 repo-config) : deprecated;;
385 rerere) : plumbing;;
386 rev-list) : plumbing;;
387 rev-parse) : plumbing;;
388 runstatus) : plumbing;;
389 sh-setup) : internal;;
390 shell) : daemon;;
391 send-pack) : plumbing;;
392 show-index) : plumbing;;
393 ssh-*) : transport;;
394 stripspace) : plumbing;;
395 symbolic-ref) : plumbing;;
396 tar-tree) : deprecated;;
397 unpack-file) : plumbing;;
398 unpack-objects) : plumbing;;
399 update-index) : plumbing;;
400 update-ref) : plumbing;;
401 update-server-info) : daemon;;
402 upload-archive) : plumbing;;
403 upload-pack) : plumbing;;
404 write-tree) : plumbing;;
405 verify-tag) : plumbing;;
406 *) echo $i;;
407 esac
408 done
409}
410__git_commandlist=
411__git_commandlist="$(__git_commands 2>/dev/null)"
412
413__git_aliases ()
414{
415 local i IFS=$'\n'
416 for i in $(git --git-dir="$(__gitdir)" config --list); do
417 case "$i" in
418 alias.*)
419 i="${i#alias.}"
420 echo "${i/=*/}"
421 ;;
422 esac
423 done
424}
425
426__git_aliased_command ()
427{
428 local word cmdline=$(git --git-dir="$(__gitdir)" \
429 config --get "alias.$1")
430 for word in $cmdline; do
431 if [ "${word##-*}" ]; then
432 echo $word
433 return
434 fi
435 done
436}
437
438__git_find_subcommand ()
439{
440 local word subcommand c=1
441
442 while [ $c -lt $COMP_CWORD ]; do
443 word="${COMP_WORDS[c]}"
444 for subcommand in $1; do
445 if [ "$subcommand" = "$word" ]; then
446 echo "$subcommand"
447 return
448 fi
449 done
450 c=$((++c))
451 done
452}
453
454__git_whitespacelist="nowarn warn error error-all strip"
455
456_git_am ()
457{
458 local cur="${COMP_WORDS[COMP_CWORD]}"
459 if [ -d .dotest ]; then
460 __gitcomp "--skip --resolved"
461 return
462 fi
463 case "$cur" in
464 --whitespace=*)
465 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
466 return
467 ;;
468 --*)
469 __gitcomp "
470 --signoff --utf8 --binary --3way --interactive
471 --whitespace=
472 "
473 return
474 esac
475 COMPREPLY=()
476}
477
478_git_apply ()
479{
480 local cur="${COMP_WORDS[COMP_CWORD]}"
481 case "$cur" in
482 --whitespace=*)
483 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
484 return
485 ;;
486 --*)
487 __gitcomp "
488 --stat --numstat --summary --check --index
489 --cached --index-info --reverse --reject --unidiff-zero
490 --apply --no-add --exclude=
491 --whitespace= --inaccurate-eof --verbose
492 "
493 return
494 esac
495 COMPREPLY=()
496}
497
498_git_add ()
499{
500 local cur="${COMP_WORDS[COMP_CWORD]}"
501 case "$cur" in
502 --*)
503 __gitcomp "
504 --interactive --refresh --patch --update --dry-run
505 --ignore-errors
506 "
507 return
508 esac
509 COMPREPLY=()
510}
511
512_git_bisect ()
513{
514 local subcommands="start bad good reset visualize replay log"
515 local subcommand="$(__git_find_subcommand "$subcommands")"
516 if [ -z "$subcommand" ]; then
517 __gitcomp "$subcommands"
518 return
519 fi
520
521 case "$subcommand" in
522 bad|good|reset)
523 __gitcomp "$(__git_refs)"
524 ;;
525 *)
526 COMPREPLY=()
527 ;;
528 esac
529}
530
531_git_branch ()
532{
533 local i c=1 only_local_ref="n" has_r="n"
534
535 while [ $c -lt $COMP_CWORD ]; do
536 i="${COMP_WORDS[c]}"
537 case "$i" in
538 -d|-m) only_local_ref="y" ;;
539 -r) has_r="y" ;;
540 esac
541 c=$((++c))
542 done
543
544 case "${COMP_WORDS[COMP_CWORD]}" in
545 --*=*) COMPREPLY=() ;;
546 --*)
547 __gitcomp "
548 --color --no-color --verbose --abbrev= --no-abbrev
549 --track --no-track
550 "
551 ;;
552 *)
553 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
554 __gitcomp "$(__git_heads)"
555 else
556 __gitcomp "$(__git_refs)"
557 fi
558 ;;
559 esac
560}
561
562_git_bundle ()
563{
564 local mycword="$COMP_CWORD"
565 case "${COMP_WORDS[0]}" in
566 git)
567 local cmd="${COMP_WORDS[2]}"
568 mycword="$((mycword-1))"
569 ;;
570 git-bundle*)
571 local cmd="${COMP_WORDS[1]}"
572 ;;
573 esac
574 case "$mycword" in
575 1)
576 __gitcomp "create list-heads verify unbundle"
577 ;;
578 2)
579 # looking for a file
580 ;;
581 *)
582 case "$cmd" in
583 create)
584 __git_complete_revlist
585 ;;
586 esac
587 ;;
588 esac
589}
590
591_git_checkout ()
592{
593 __gitcomp "$(__git_refs)"
594}
595
596_git_cherry ()
597{
598 __gitcomp "$(__git_refs)"
599}
600
601_git_cherry_pick ()
602{
603 local cur="${COMP_WORDS[COMP_CWORD]}"
604 case "$cur" in
605 --*)
606 __gitcomp "--edit --no-commit"
607 ;;
608 *)
609 __gitcomp "$(__git_refs)"
610 ;;
611 esac
612}
613
614_git_commit ()
615{
616 local cur="${COMP_WORDS[COMP_CWORD]}"
617 case "$cur" in
618 --*)
619 __gitcomp "
620 --all --author= --signoff --verify --no-verify
621 --edit --amend --include --only
622 "
623 return
624 esac
625 COMPREPLY=()
626}
627
628_git_describe ()
629{
630 __gitcomp "$(__git_refs)"
631}
632
633_git_diff ()
634{
635 local cur="${COMP_WORDS[COMP_CWORD]}"
636 case "$cur" in
637 --*)
638 __gitcomp "--cached --stat --numstat --shortstat --summary
639 --patch-with-stat --name-only --name-status --color
640 --no-color --color-words --no-renames --check
641 --full-index --binary --abbrev --diff-filter
642 --find-copies-harder --pickaxe-all --pickaxe-regex
643 --text --ignore-space-at-eol --ignore-space-change
644 --ignore-all-space --exit-code --quiet --ext-diff
645 --no-ext-diff
646 --no-prefix --src-prefix= --dst-prefix=
647 --base --ours --theirs
648 "
649 return
650 ;;
651 esac
652 __git_complete_file
653}
654
655_git_diff_tree ()
656{
657 __gitcomp "$(__git_refs)"
658}
659
660_git_fetch ()
661{
662 local cur="${COMP_WORDS[COMP_CWORD]}"
663
664 case "${COMP_WORDS[0]},$COMP_CWORD" in
665 git-fetch*,1)
666 __gitcomp "$(__git_remotes)"
667 ;;
668 git,2)
669 __gitcomp "$(__git_remotes)"
670 ;;
671 *)
672 case "$cur" in
673 *:*)
674 __gitcomp "$(__git_refs)" "" "${cur#*:}"
675 ;;
676 *)
677 local remote
678 case "${COMP_WORDS[0]}" in
679 git-fetch) remote="${COMP_WORDS[1]}" ;;
680 git) remote="${COMP_WORDS[2]}" ;;
681 esac
682 __gitcomp "$(__git_refs2 "$remote")"
683 ;;
684 esac
685 ;;
686 esac
687}
688
689_git_format_patch ()
690{
691 local cur="${COMP_WORDS[COMP_CWORD]}"
692 case "$cur" in
693 --*)
694 __gitcomp "
695 --stdout --attach --thread
696 --output-directory
697 --numbered --start-number
698 --numbered-files
699 --keep-subject
700 --signoff
701 --in-reply-to=
702 --full-index --binary
703 --not --all
704 --cover-letter
705 --no-prefix --src-prefix= --dst-prefix=
706 "
707 return
708 ;;
709 esac
710 __git_complete_revlist
711}
712
713_git_gc ()
714{
715 local cur="${COMP_WORDS[COMP_CWORD]}"
716 case "$cur" in
717 --*)
718 __gitcomp "--prune --aggressive"
719 return
720 ;;
721 esac
722 COMPREPLY=()
723}
724
725_git_ls_remote ()
726{
727 __gitcomp "$(__git_remotes)"
728}
729
730_git_ls_tree ()
731{
732 __git_complete_file
733}
734
735_git_log ()
736{
737 local cur="${COMP_WORDS[COMP_CWORD]}"
738 case "$cur" in
739 --pretty=*)
740 __gitcomp "
741 oneline short medium full fuller email raw
742 " "" "${cur##--pretty=}"
743 return
744 ;;
745 --date=*)
746 __gitcomp "
747 relative iso8601 rfc2822 short local default
748 " "" "${cur##--date=}"
749 return
750 ;;
751 --*)
752 __gitcomp "
753 --max-count= --max-age= --since= --after=
754 --min-age= --before= --until=
755 --root --topo-order --date-order --reverse
756 --no-merges --follow
757 --abbrev-commit --abbrev=
758 --relative-date --date=
759 --author= --committer= --grep=
760 --all-match
761 --pretty= --name-status --name-only --raw
762 --not --all
763 --left-right --cherry-pick
764 "
765 return
766 ;;
767 esac
768 __git_complete_revlist
769}
770
771_git_merge ()
772{
773 local cur="${COMP_WORDS[COMP_CWORD]}"
774 case "${COMP_WORDS[COMP_CWORD-1]}" in
775 -s|--strategy)
776 __gitcomp "$(__git_merge_strategies)"
777 return
778 esac
779 case "$cur" in
780 --strategy=*)
781 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
782 return
783 ;;
784 --*)
785 __gitcomp "
786 --no-commit --no-stat --log --no-log --squash --strategy
787 "
788 return
789 esac
790 __gitcomp "$(__git_refs)"
791}
792
793_git_merge_base ()
794{
795 __gitcomp "$(__git_refs)"
796}
797
798_git_name_rev ()
799{
800 __gitcomp "--tags --all --stdin"
801}
802
803_git_pull ()
804{
805 local cur="${COMP_WORDS[COMP_CWORD]}"
806
807 case "${COMP_WORDS[0]},$COMP_CWORD" in
808 git-pull*,1)
809 __gitcomp "$(__git_remotes)"
810 ;;
811 git,2)
812 __gitcomp "$(__git_remotes)"
813 ;;
814 *)
815 local remote
816 case "${COMP_WORDS[0]}" in
817 git-pull) remote="${COMP_WORDS[1]}" ;;
818 git) remote="${COMP_WORDS[2]}" ;;
819 esac
820 __gitcomp "$(__git_refs "$remote")"
821 ;;
822 esac
823}
824
825_git_push ()
826{
827 local cur="${COMP_WORDS[COMP_CWORD]}"
828
829 case "${COMP_WORDS[0]},$COMP_CWORD" in
830 git-push*,1)
831 __gitcomp "$(__git_remotes)"
832 ;;
833 git,2)
834 __gitcomp "$(__git_remotes)"
835 ;;
836 *)
837 case "$cur" in
838 *:*)
839 local remote
840 case "${COMP_WORDS[0]}" in
841 git-push) remote="${COMP_WORDS[1]}" ;;
842 git) remote="${COMP_WORDS[2]}" ;;
843 esac
844 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
845 ;;
846 +*)
847 __gitcomp "$(__git_refs)" + "${cur#+}"
848 ;;
849 *)
850 __gitcomp "$(__git_refs)"
851 ;;
852 esac
853 ;;
854 esac
855}
856
857_git_rebase ()
858{
859 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
860 if [ -d .dotest ] || [ -d "$dir"/.dotest-merge ]; then
861 __gitcomp "--continue --skip --abort"
862 return
863 fi
864 case "${COMP_WORDS[COMP_CWORD-1]}" in
865 -s|--strategy)
866 __gitcomp "$(__git_merge_strategies)"
867 return
868 esac
869 case "$cur" in
870 --strategy=*)
871 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
872 return
873 ;;
874 --*)
875 __gitcomp "--onto --merge --strategy --interactive"
876 return
877 esac
878 __gitcomp "$(__git_refs)"
879}
880
881_git_config ()
882{
883 local cur="${COMP_WORDS[COMP_CWORD]}"
884 local prv="${COMP_WORDS[COMP_CWORD-1]}"
885 case "$prv" in
886 branch.*.remote)
887 __gitcomp "$(__git_remotes)"
888 return
889 ;;
890 branch.*.merge)
891 __gitcomp "$(__git_refs)"
892 return
893 ;;
894 remote.*.fetch)
895 local remote="${prv#remote.}"
896 remote="${remote%.fetch}"
897 __gitcomp "$(__git_refs_remotes "$remote")"
898 return
899 ;;
900 remote.*.push)
901 local remote="${prv#remote.}"
902 remote="${remote%.push}"
903 __gitcomp "$(git --git-dir="$(__gitdir)" \
904 for-each-ref --format='%(refname):%(refname)' \
905 refs/heads)"
906 return
907 ;;
908 pull.twohead|pull.octopus)
909 __gitcomp "$(__git_merge_strategies)"
910 return
911 ;;
912 color.branch|color.diff|color.status)
913 __gitcomp "always never auto"
914 return
915 ;;
916 color.*.*)
917 __gitcomp "
918 black red green yellow blue magenta cyan white
919 bold dim ul blink reverse
920 "
921 return
922 ;;
923 *.*)
924 COMPREPLY=()
925 return
926 ;;
927 esac
928 case "$cur" in
929 --*)
930 __gitcomp "
931 --global --system --file=
932 --list --replace-all
933 --get --get-all --get-regexp
934 --add --unset --unset-all
935 --remove-section --rename-section
936 "
937 return
938 ;;
939 branch.*.*)
940 local pfx="${cur%.*}."
941 cur="${cur##*.}"
942 __gitcomp "remote merge" "$pfx" "$cur"
943 return
944 ;;
945 branch.*)
946 local pfx="${cur%.*}."
947 cur="${cur#*.}"
948 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
949 return
950 ;;
951 remote.*.*)
952 local pfx="${cur%.*}."
953 cur="${cur##*.}"
954 __gitcomp "
955 url fetch push skipDefaultUpdate
956 receivepack uploadpack tagopt
957 " "$pfx" "$cur"
958 return
959 ;;
960 remote.*)
961 local pfx="${cur%.*}."
962 cur="${cur#*.}"
963 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
964 return
965 ;;
966 esac
967 __gitcomp "
968 apply.whitespace
969 core.fileMode
970 core.gitProxy
971 core.ignoreStat
972 core.preferSymlinkRefs
973 core.logAllRefUpdates
974 core.loosecompression
975 core.repositoryFormatVersion
976 core.sharedRepository
977 core.warnAmbiguousRefs
978 core.compression
979 core.packedGitWindowSize
980 core.packedGitLimit
981 clean.requireForce
982 color.branch
983 color.branch.current
984 color.branch.local
985 color.branch.remote
986 color.branch.plain
987 color.diff
988 color.diff.plain
989 color.diff.meta
990 color.diff.frag
991 color.diff.old
992 color.diff.new
993 color.diff.commit
994 color.diff.whitespace
995 color.pager
996 color.status
997 color.status.header
998 color.status.added
999 color.status.changed
1000 color.status.untracked
1001 diff.renameLimit
1002 diff.renames
1003 fetch.unpackLimit
1004 format.headers
1005 format.subjectprefix
1006 gitcvs.enabled
1007 gitcvs.logfile
1008 gitcvs.allbinary
1009 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1010 gitcvs.dbtablenameprefix
1011 gc.packrefs
1012 gc.reflogexpire
1013 gc.reflogexpireunreachable
1014 gc.rerereresolved
1015 gc.rerereunresolved
1016 http.sslVerify
1017 http.sslCert
1018 http.sslKey
1019 http.sslCAInfo
1020 http.sslCAPath
1021 http.maxRequests
1022 http.lowSpeedLimit
1023 http.lowSpeedTime
1024 http.noEPSV
1025 i18n.commitEncoding
1026 i18n.logOutputEncoding
1027 log.showroot
1028 merge.tool
1029 merge.summary
1030 merge.verbosity
1031 pack.window
1032 pack.depth
1033 pack.windowMemory
1034 pack.compression
1035 pack.deltaCacheSize
1036 pack.deltaCacheLimit
1037 pull.octopus
1038 pull.twohead
1039 repack.useDeltaBaseOffset
1040 show.difftree
1041 showbranch.default
1042 tar.umask
1043 transfer.unpackLimit
1044 receive.unpackLimit
1045 receive.denyNonFastForwards
1046 user.name
1047 user.email
1048 user.signingkey
1049 whatchanged.difftree
1050 branch. remote.
1051 "
1052}
1053
1054_git_remote ()
1055{
1056 local subcommands="add rm show prune update"
1057 local subcommand="$(__git_find_subcommand "$subcommands")"
1058 if [ -z "$subcommand" ]; then
1059 __gitcomp "$subcommands"
1060 return
1061 fi
1062
1063 case "$subcommand" in
1064 rm|show|prune)
1065 __gitcomp "$(__git_remotes)"
1066 ;;
1067 update)
1068 local i c='' IFS=$'\n'
1069 for i in $(git --git-dir="$(__gitdir)" config --list); do
1070 case "$i" in
1071 remotes.*)
1072 i="${i#remotes.}"
1073 c="$c ${i/=*/}"
1074 ;;
1075 esac
1076 done
1077 __gitcomp "$c"
1078 ;;
1079 *)
1080 COMPREPLY=()
1081 ;;
1082 esac
1083}
1084
1085_git_reset ()
1086{
1087 local cur="${COMP_WORDS[COMP_CWORD]}"
1088 case "$cur" in
1089 --*)
1090 __gitcomp "--mixed --hard --soft"
1091 return
1092 ;;
1093 esac
1094 __gitcomp "$(__git_refs)"
1095}
1096
1097_git_shortlog ()
1098{
1099 local cur="${COMP_WORDS[COMP_CWORD]}"
1100 case "$cur" in
1101 --*)
1102 __gitcomp "
1103 --max-count= --max-age= --since= --after=
1104 --min-age= --before= --until=
1105 --no-merges
1106 --author= --committer= --grep=
1107 --all-match
1108 --not --all
1109 --numbered --summary
1110 "
1111 return
1112 ;;
1113 esac
1114 __git_complete_revlist
1115}
1116
1117_git_show ()
1118{
1119 local cur="${COMP_WORDS[COMP_CWORD]}"
1120 case "$cur" in
1121 --pretty=*)
1122 __gitcomp "
1123 oneline short medium full fuller email raw
1124 " "" "${cur##--pretty=}"
1125 return
1126 ;;
1127 --*)
1128 __gitcomp "--pretty="
1129 return
1130 ;;
1131 esac
1132 __git_complete_file
1133}
1134
1135_git_stash ()
1136{
1137 local subcommands='save list show apply clear drop pop create'
1138 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1139 __gitcomp "$subcommands"
1140 fi
1141}
1142
1143_git_submodule ()
1144{
1145 local subcommands="add status init update"
1146 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1147 local cur="${COMP_WORDS[COMP_CWORD]}"
1148 case "$cur" in
1149 --*)
1150 __gitcomp "--quiet --cached"
1151 ;;
1152 *)
1153 __gitcomp "$subcommands"
1154 ;;
1155 esac
1156 return
1157 fi
1158}
1159
1160_git_svn ()
1161{
1162 local subcommands="
1163 init fetch clone rebase dcommit log find-rev
1164 set-tree commit-diff info create-ignore propget
1165 proplist show-ignore show-externals
1166 "
1167 local subcommand="$(__git_find_subcommand "$subcommands")"
1168 if [ -z "$subcommand" ]; then
1169 __gitcomp "$subcommands"
1170 else
1171 local remote_opts="--username= --config-dir= --no-auth-cache"
1172 local fc_opts="
1173 --follow-parent --authors-file= --repack=
1174 --no-metadata --use-svm-props --use-svnsync-props
1175 --log-window-size= --no-checkout --quiet
1176 --repack-flags --user-log-author $remote_opts
1177 "
1178 local init_opts="
1179 --template= --shared= --trunk= --tags=
1180 --branches= --stdlayout --minimize-url
1181 --no-metadata --use-svm-props --use-svnsync-props
1182 --rewrite-root= $remote_opts
1183 "
1184 local cmt_opts="
1185 --edit --rmdir --find-copies-harder --copy-similarity=
1186 "
1187
1188 local cur="${COMP_WORDS[COMP_CWORD]}"
1189 case "$subcommand,$cur" in
1190 fetch,--*)
1191 __gitcomp "--revision= --fetch-all $fc_opts"
1192 ;;
1193 clone,--*)
1194 __gitcomp "--revision= $fc_opts $init_opts"
1195 ;;
1196 init,--*)
1197 __gitcomp "$init_opts"
1198 ;;
1199 dcommit,--*)
1200 __gitcomp "
1201 --merge --strategy= --verbose --dry-run
1202 --fetch-all --no-rebase $cmt_opts $fc_opts
1203 "
1204 ;;
1205 set-tree,--*)
1206 __gitcomp "--stdin $cmt_opts $fc_opts"
1207 ;;
1208 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1209 show-externals,--*)
1210 __gitcomp "--revision="
1211 ;;
1212 log,--*)
1213 __gitcomp "
1214 --limit= --revision= --verbose --incremental
1215 --oneline --show-commit --non-recursive
1216 --authors-file=
1217 "
1218 ;;
1219 rebase,--*)
1220 __gitcomp "
1221 --merge --verbose --strategy= --local
1222 --fetch-all $fc_opts
1223 "
1224 ;;
1225 commit-diff,--*)
1226 __gitcomp "--message= --file= --revision= $cmt_opts"
1227 ;;
1228 info,--*)
1229 __gitcomp "--url"
1230 ;;
1231 *)
1232 COMPREPLY=()
1233 ;;
1234 esac
1235 fi
1236}
1237
1238_git_tag ()
1239{
1240 local i c=1 f=0
1241 while [ $c -lt $COMP_CWORD ]; do
1242 i="${COMP_WORDS[c]}"
1243 case "$i" in
1244 -d|-v)
1245 __gitcomp "$(__git_tags)"
1246 return
1247 ;;
1248 -f)
1249 f=1
1250 ;;
1251 esac
1252 c=$((++c))
1253 done
1254
1255 case "${COMP_WORDS[COMP_CWORD-1]}" in
1256 -m|-F)
1257 COMPREPLY=()
1258 ;;
1259 -*|tag|git-tag)
1260 if [ $f = 1 ]; then
1261 __gitcomp "$(__git_tags)"
1262 else
1263 COMPREPLY=()
1264 fi
1265 ;;
1266 *)
1267 __gitcomp "$(__git_refs)"
1268 ;;
1269 esac
1270}
1271
1272_git ()
1273{
1274 local i c=1 command __git_dir
1275
1276 while [ $c -lt $COMP_CWORD ]; do
1277 i="${COMP_WORDS[c]}"
1278 case "$i" in
1279 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1280 --bare) __git_dir="." ;;
1281 --version|--help|-p|--paginate) ;;
1282 *) command="$i"; break ;;
1283 esac
1284 c=$((++c))
1285 done
1286
1287 if [ -z "$command" ]; then
1288 case "${COMP_WORDS[COMP_CWORD]}" in
1289 --*=*) COMPREPLY=() ;;
1290 --*) __gitcomp "
1291 --paginate
1292 --no-pager
1293 --git-dir=
1294 --bare
1295 --version
1296 --exec-path
1297 --work-tree=
1298 --help
1299 "
1300 ;;
1301 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1302 esac
1303 return
1304 fi
1305
1306 local expansion=$(__git_aliased_command "$command")
1307 [ "$expansion" ] && command="$expansion"
1308
1309 case "$command" in
1310 am) _git_am ;;
1311 add) _git_add ;;
1312 apply) _git_apply ;;
1313 bisect) _git_bisect ;;
1314 bundle) _git_bundle ;;
1315 branch) _git_branch ;;
1316 checkout) _git_checkout ;;
1317 cherry) _git_cherry ;;
1318 cherry-pick) _git_cherry_pick ;;
1319 commit) _git_commit ;;
1320 config) _git_config ;;
1321 describe) _git_describe ;;
1322 diff) _git_diff ;;
1323 fetch) _git_fetch ;;
1324 format-patch) _git_format_patch ;;
1325 gc) _git_gc ;;
1326 log) _git_log ;;
1327 ls-remote) _git_ls_remote ;;
1328 ls-tree) _git_ls_tree ;;
1329 merge) _git_merge;;
1330 merge-base) _git_merge_base ;;
1331 name-rev) _git_name_rev ;;
1332 pull) _git_pull ;;
1333 push) _git_push ;;
1334 rebase) _git_rebase ;;
1335 remote) _git_remote ;;
1336 reset) _git_reset ;;
1337 shortlog) _git_shortlog ;;
1338 show) _git_show ;;
1339 show-branch) _git_log ;;
1340 stash) _git_stash ;;
1341 submodule) _git_submodule ;;
1342 svn) _git_svn ;;
1343 tag) _git_tag ;;
1344 whatchanged) _git_log ;;
1345 *) COMPREPLY=() ;;
1346 esac
1347}
1348
1349_gitk ()
1350{
1351 local cur="${COMP_WORDS[COMP_CWORD]}"
1352 local g="$(git rev-parse --git-dir 2>/dev/null)"
1353 local merge=""
1354 if [ -f $g/MERGE_HEAD ]; then
1355 merge="--merge"
1356 fi
1357 case "$cur" in
1358 --*)
1359 __gitcomp "--not --all $merge"
1360 return
1361 ;;
1362 esac
1363 __git_complete_revlist
1364}
1365
1366complete -o default -o nospace -F _git git
1367complete -o default -o nospace -F _gitk gitk
1368complete -o default -o nospace -F _git_am git-am
1369complete -o default -o nospace -F _git_apply git-apply
1370complete -o default -o nospace -F _git_bisect git-bisect
1371complete -o default -o nospace -F _git_branch git-branch
1372complete -o default -o nospace -F _git_bundle git-bundle
1373complete -o default -o nospace -F _git_checkout git-checkout
1374complete -o default -o nospace -F _git_cherry git-cherry
1375complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1376complete -o default -o nospace -F _git_commit git-commit
1377complete -o default -o nospace -F _git_describe git-describe
1378complete -o default -o nospace -F _git_diff git-diff
1379complete -o default -o nospace -F _git_fetch git-fetch
1380complete -o default -o nospace -F _git_format_patch git-format-patch
1381complete -o default -o nospace -F _git_gc git-gc
1382complete -o default -o nospace -F _git_log git-log
1383complete -o default -o nospace -F _git_ls_remote git-ls-remote
1384complete -o default -o nospace -F _git_ls_tree git-ls-tree
1385complete -o default -o nospace -F _git_merge git-merge
1386complete -o default -o nospace -F _git_merge_base git-merge-base
1387complete -o default -o nospace -F _git_name_rev git-name-rev
1388complete -o default -o nospace -F _git_pull git-pull
1389complete -o default -o nospace -F _git_push git-push
1390complete -o default -o nospace -F _git_rebase git-rebase
1391complete -o default -o nospace -F _git_config git-config
1392complete -o default -o nospace -F _git_remote git-remote
1393complete -o default -o nospace -F _git_reset git-reset
1394complete -o default -o nospace -F _git_shortlog git-shortlog
1395complete -o default -o nospace -F _git_show git-show
1396complete -o default -o nospace -F _git_stash git-stash
1397complete -o default -o nospace -F _git_submodule git-submodule
1398complete -o default -o nospace -F _git_svn git-svn
1399complete -o default -o nospace -F _git_log git-show-branch
1400complete -o default -o nospace -F _git_tag git-tag
1401complete -o default -o nospace -F _git_log git-whatchanged
1402
1403# The following are necessary only for Cygwin, and only are needed
1404# when the user has tab-completed the executable name and consequently
1405# included the '.exe' suffix.
1406#
1407if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1408complete -o default -o nospace -F _git_add git-add.exe
1409complete -o default -o nospace -F _git_apply git-apply.exe
1410complete -o default -o nospace -F _git git.exe
1411complete -o default -o nospace -F _git_branch git-branch.exe
1412complete -o default -o nospace -F _git_bundle git-bundle.exe
1413complete -o default -o nospace -F _git_cherry git-cherry.exe
1414complete -o default -o nospace -F _git_describe git-describe.exe
1415complete -o default -o nospace -F _git_diff git-diff.exe
1416complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1417complete -o default -o nospace -F _git_log git-log.exe
1418complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1419complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1420complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1421complete -o default -o nospace -F _git_push git-push.exe
1422complete -o default -o nospace -F _git_config git-config
1423complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1424complete -o default -o nospace -F _git_show git-show.exe
1425complete -o default -o nospace -F _git_log git-show-branch.exe
1426complete -o default -o nospace -F _git_tag git-tag.exe
1427complete -o default -o nospace -F _git_log git-whatchanged.exe
1428fi