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