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_files ()
910{
911 __git_has_doubledash && return
912
913 local cur="${COMP_WORDS[COMP_CWORD]}"
914 case "$cur" in
915 --*)
916 __gitcomp "--cached --deleted --modified --others --ignored
917 --stage --directory --no-empty-directory --unmerged
918 --killed --exclude= --exclude-from=
919 --exclude-per-directory= --exclude-standard
920 --error-unmatch --with-tree= --full-name
921 --abbrev --ignored --exclude-per-directory
922 "
923 return
924 ;;
925 esac
926 COMPREPLY=()
927}
928
929_git_ls_remote ()
930{
931 __gitcomp "$(__git_remotes)"
932}
933
934_git_ls_tree ()
935{
936 __git_complete_file
937}
938
939_git_log ()
940{
941 __git_has_doubledash && return
942
943 local cur="${COMP_WORDS[COMP_CWORD]}"
944 case "$cur" in
945 --pretty=*)
946 __gitcomp "
947 oneline short medium full fuller email raw
948 " "" "${cur##--pretty=}"
949 return
950 ;;
951 --date=*)
952 __gitcomp "
953 relative iso8601 rfc2822 short local default
954 " "" "${cur##--date=}"
955 return
956 ;;
957 --*)
958 __gitcomp "
959 --max-count= --max-age= --since= --after=
960 --min-age= --before= --until=
961 --root --topo-order --date-order --reverse
962 --no-merges --follow
963 --abbrev-commit --abbrev=
964 --relative-date --date=
965 --author= --committer= --grep=
966 --all-match
967 --pretty= --name-status --name-only --raw
968 --not --all
969 --left-right --cherry-pick
970 --graph
971 --stat --numstat --shortstat
972 --decorate --diff-filter=
973 --color-words --walk-reflogs
974 --parents --children --full-history
975 "
976 return
977 ;;
978 esac
979 __git_complete_revlist
980}
981
982_git_merge ()
983{
984 local cur="${COMP_WORDS[COMP_CWORD]}"
985 case "${COMP_WORDS[COMP_CWORD-1]}" in
986 -s|--strategy)
987 __gitcomp "$(__git_merge_strategies)"
988 return
989 esac
990 case "$cur" in
991 --strategy=*)
992 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
993 return
994 ;;
995 --*)
996 __gitcomp "
997 --no-commit --no-stat --log --no-log --squash --strategy
998 "
999 return
1000 esac
1001 __gitcomp "$(__git_refs)"
1002}
1003
1004_git_merge_base ()
1005{
1006 __gitcomp "$(__git_refs)"
1007}
1008
1009_git_mv ()
1010{
1011 local cur="${COMP_WORDS[COMP_CWORD]}"
1012 case "$cur" in
1013 --*)
1014 __gitcomp "--dry-run"
1015 return
1016 ;;
1017 esac
1018 COMPREPLY=()
1019}
1020
1021_git_name_rev ()
1022{
1023 __gitcomp "--tags --all --stdin"
1024}
1025
1026_git_pull ()
1027{
1028 local cur="${COMP_WORDS[COMP_CWORD]}"
1029
1030 case "${COMP_WORDS[0]},$COMP_CWORD" in
1031 git-pull*,1)
1032 __gitcomp "$(__git_remotes)"
1033 ;;
1034 git,2)
1035 __gitcomp "$(__git_remotes)"
1036 ;;
1037 *)
1038 local remote
1039 case "${COMP_WORDS[0]}" in
1040 git-pull) remote="${COMP_WORDS[1]}" ;;
1041 git) remote="${COMP_WORDS[2]}" ;;
1042 esac
1043 __gitcomp "$(__git_refs "$remote")"
1044 ;;
1045 esac
1046}
1047
1048_git_push ()
1049{
1050 local cur="${COMP_WORDS[COMP_CWORD]}"
1051
1052 case "${COMP_WORDS[0]},$COMP_CWORD" in
1053 git-push*,1)
1054 __gitcomp "$(__git_remotes)"
1055 ;;
1056 git,2)
1057 __gitcomp "$(__git_remotes)"
1058 ;;
1059 *)
1060 case "$cur" in
1061 *:*)
1062 local remote
1063 case "${COMP_WORDS[0]}" in
1064 git-push) remote="${COMP_WORDS[1]}" ;;
1065 git) remote="${COMP_WORDS[2]}" ;;
1066 esac
1067
1068 local pfx=""
1069 case "$COMP_WORDBREAKS" in
1070 *:*) : great ;;
1071 *) pfx="${cur%%:*}:" ;;
1072 esac
1073
1074 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
1075 ;;
1076 +*)
1077 __gitcomp "$(__git_refs)" + "${cur#+}"
1078 ;;
1079 *)
1080 __gitcomp "$(__git_refs)"
1081 ;;
1082 esac
1083 ;;
1084 esac
1085}
1086
1087_git_rebase ()
1088{
1089 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1090 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1091 __gitcomp "--continue --skip --abort"
1092 return
1093 fi
1094 case "${COMP_WORDS[COMP_CWORD-1]}" in
1095 -s|--strategy)
1096 __gitcomp "$(__git_merge_strategies)"
1097 return
1098 esac
1099 case "$cur" in
1100 --strategy=*)
1101 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1102 return
1103 ;;
1104 --*)
1105 __gitcomp "--onto --merge --strategy --interactive"
1106 return
1107 esac
1108 __gitcomp "$(__git_refs)"
1109}
1110
1111_git_send_email ()
1112{
1113 local cur="${COMP_WORDS[COMP_CWORD]}"
1114 case "$cur" in
1115 --*)
1116 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1117 --dry-run --envelope-sender --from --identity
1118 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1119 --no-suppress-from --no-thread --quiet
1120 --signed-off-by-cc --smtp-pass --smtp-server
1121 --smtp-server-port --smtp-ssl --smtp-user --subject
1122 --suppress-cc --suppress-from --thread --to"
1123 return
1124 ;;
1125 esac
1126 COMPREPLY=()
1127}
1128
1129_git_config ()
1130{
1131 local cur="${COMP_WORDS[COMP_CWORD]}"
1132 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1133 case "$prv" in
1134 branch.*.remote)
1135 __gitcomp "$(__git_remotes)"
1136 return
1137 ;;
1138 branch.*.merge)
1139 __gitcomp "$(__git_refs)"
1140 return
1141 ;;
1142 remote.*.fetch)
1143 local remote="${prv#remote.}"
1144 remote="${remote%.fetch}"
1145 __gitcomp "$(__git_refs_remotes "$remote")"
1146 return
1147 ;;
1148 remote.*.push)
1149 local remote="${prv#remote.}"
1150 remote="${remote%.push}"
1151 __gitcomp "$(git --git-dir="$(__gitdir)" \
1152 for-each-ref --format='%(refname):%(refname)' \
1153 refs/heads)"
1154 return
1155 ;;
1156 pull.twohead|pull.octopus)
1157 __gitcomp "$(__git_merge_strategies)"
1158 return
1159 ;;
1160 color.branch|color.diff|color.status)
1161 __gitcomp "always never auto"
1162 return
1163 ;;
1164 color.*.*)
1165 __gitcomp "
1166 black red green yellow blue magenta cyan white
1167 bold dim ul blink reverse
1168 "
1169 return
1170 ;;
1171 *.*)
1172 COMPREPLY=()
1173 return
1174 ;;
1175 esac
1176 case "$cur" in
1177 --*)
1178 __gitcomp "
1179 --global --system --file=
1180 --list --replace-all
1181 --get --get-all --get-regexp
1182 --add --unset --unset-all
1183 --remove-section --rename-section
1184 "
1185 return
1186 ;;
1187 branch.*.*)
1188 local pfx="${cur%.*}."
1189 cur="${cur##*.}"
1190 __gitcomp "remote merge" "$pfx" "$cur"
1191 return
1192 ;;
1193 branch.*)
1194 local pfx="${cur%.*}."
1195 cur="${cur#*.}"
1196 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1197 return
1198 ;;
1199 remote.*.*)
1200 local pfx="${cur%.*}."
1201 cur="${cur##*.}"
1202 __gitcomp "
1203 url fetch push skipDefaultUpdate
1204 receivepack uploadpack tagopt
1205 " "$pfx" "$cur"
1206 return
1207 ;;
1208 remote.*)
1209 local pfx="${cur%.*}."
1210 cur="${cur#*.}"
1211 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1212 return
1213 ;;
1214 esac
1215 __gitcomp "
1216 apply.whitespace
1217 core.fileMode
1218 core.gitProxy
1219 core.ignoreStat
1220 core.preferSymlinkRefs
1221 core.logAllRefUpdates
1222 core.loosecompression
1223 core.repositoryFormatVersion
1224 core.sharedRepository
1225 core.warnAmbiguousRefs
1226 core.compression
1227 core.packedGitWindowSize
1228 core.packedGitLimit
1229 clean.requireForce
1230 color.branch
1231 color.branch.current
1232 color.branch.local
1233 color.branch.remote
1234 color.branch.plain
1235 color.diff
1236 color.diff.plain
1237 color.diff.meta
1238 color.diff.frag
1239 color.diff.old
1240 color.diff.new
1241 color.diff.commit
1242 color.diff.whitespace
1243 color.pager
1244 color.status
1245 color.status.header
1246 color.status.added
1247 color.status.changed
1248 color.status.untracked
1249 diff.renameLimit
1250 diff.renames
1251 fetch.unpackLimit
1252 format.headers
1253 format.subjectprefix
1254 gitcvs.enabled
1255 gitcvs.logfile
1256 gitcvs.allbinary
1257 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1258 gitcvs.dbtablenameprefix
1259 gc.packrefs
1260 gc.reflogexpire
1261 gc.reflogexpireunreachable
1262 gc.rerereresolved
1263 gc.rerereunresolved
1264 http.sslVerify
1265 http.sslCert
1266 http.sslKey
1267 http.sslCAInfo
1268 http.sslCAPath
1269 http.maxRequests
1270 http.lowSpeedLimit
1271 http.lowSpeedTime
1272 http.noEPSV
1273 i18n.commitEncoding
1274 i18n.logOutputEncoding
1275 log.showroot
1276 merge.tool
1277 merge.summary
1278 merge.verbosity
1279 pack.window
1280 pack.depth
1281 pack.windowMemory
1282 pack.compression
1283 pack.deltaCacheSize
1284 pack.deltaCacheLimit
1285 pull.octopus
1286 pull.twohead
1287 repack.useDeltaBaseOffset
1288 showbranch.default
1289 tar.umask
1290 transfer.unpackLimit
1291 receive.unpackLimit
1292 receive.denyNonFastForwards
1293 user.name
1294 user.email
1295 user.signingkey
1296 branch. remote.
1297 "
1298}
1299
1300_git_remote ()
1301{
1302 local subcommands="add rm show prune update"
1303 local subcommand="$(__git_find_subcommand "$subcommands")"
1304 if [ -z "$subcommand" ]; then
1305 __gitcomp "$subcommands"
1306 return
1307 fi
1308
1309 case "$subcommand" in
1310 rm|show|prune)
1311 __gitcomp "$(__git_remotes)"
1312 ;;
1313 update)
1314 local i c='' IFS=$'\n'
1315 for i in $(git --git-dir="$(__gitdir)" config --list); do
1316 case "$i" in
1317 remotes.*)
1318 i="${i#remotes.}"
1319 c="$c ${i/=*/}"
1320 ;;
1321 esac
1322 done
1323 __gitcomp "$c"
1324 ;;
1325 *)
1326 COMPREPLY=()
1327 ;;
1328 esac
1329}
1330
1331_git_reset ()
1332{
1333 __git_has_doubledash && return
1334
1335 local cur="${COMP_WORDS[COMP_CWORD]}"
1336 case "$cur" in
1337 --*)
1338 __gitcomp "--mixed --hard --soft"
1339 return
1340 ;;
1341 esac
1342 __gitcomp "$(__git_refs)"
1343}
1344
1345_git_revert ()
1346{
1347 local cur="${COMP_WORDS[COMP_CWORD]}"
1348 case "$cur" in
1349 --*)
1350 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1351 return
1352 ;;
1353 esac
1354 COMPREPLY=()
1355}
1356
1357_git_rm ()
1358{
1359 __git_has_doubledash && return
1360
1361 local cur="${COMP_WORDS[COMP_CWORD]}"
1362 case "$cur" in
1363 --*)
1364 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1365 return
1366 ;;
1367 esac
1368 COMPREPLY=()
1369}
1370
1371_git_shortlog ()
1372{
1373 __git_has_doubledash && return
1374
1375 local cur="${COMP_WORDS[COMP_CWORD]}"
1376 case "$cur" in
1377 --*)
1378 __gitcomp "
1379 --max-count= --max-age= --since= --after=
1380 --min-age= --before= --until=
1381 --no-merges
1382 --author= --committer= --grep=
1383 --all-match
1384 --not --all
1385 --numbered --summary
1386 "
1387 return
1388 ;;
1389 esac
1390 __git_complete_revlist
1391}
1392
1393_git_show ()
1394{
1395 local cur="${COMP_WORDS[COMP_CWORD]}"
1396 case "$cur" in
1397 --pretty=*)
1398 __gitcomp "
1399 oneline short medium full fuller email raw
1400 " "" "${cur##--pretty=}"
1401 return
1402 ;;
1403 --*)
1404 __gitcomp "--pretty="
1405 return
1406 ;;
1407 esac
1408 __git_complete_file
1409}
1410
1411_git_show_branch ()
1412{
1413 local cur="${COMP_WORDS[COMP_CWORD]}"
1414 case "$cur" in
1415 --*)
1416 __gitcomp "
1417 --all --remotes --topo-order --current --more=
1418 --list --independent --merge-base --no-name
1419 --sha1-name --topics --reflog
1420 "
1421 return
1422 ;;
1423 esac
1424 __git_complete_revlist
1425}
1426
1427_git_stash ()
1428{
1429 local subcommands='save list show apply clear drop pop create branch'
1430 local subcommand="$(__git_find_subcommand "$subcommands")"
1431 if [ -z "$subcommand" ]; then
1432 __gitcomp "$subcommands"
1433 else
1434 local cur="${COMP_WORDS[COMP_CWORD]}"
1435 case "$subcommand,$cur" in
1436 save,--*)
1437 __gitcomp "--keep-index"
1438 ;;
1439 apply,--*)
1440 __gitcomp "--index"
1441 ;;
1442 show,--*|drop,--*|pop,--*|branch,--*)
1443 COMPREPLY=()
1444 ;;
1445 show,*|apply,*|drop,*|pop,*|branch,*)
1446 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1447 | sed -n -e 's/:.*//p')"
1448 ;;
1449 *)
1450 COMPREPLY=()
1451 ;;
1452 esac
1453 fi
1454}
1455
1456_git_submodule ()
1457{
1458 __git_has_doubledash && return
1459
1460 local subcommands="add status init update"
1461 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1462 local cur="${COMP_WORDS[COMP_CWORD]}"
1463 case "$cur" in
1464 --*)
1465 __gitcomp "--quiet --cached"
1466 ;;
1467 *)
1468 __gitcomp "$subcommands"
1469 ;;
1470 esac
1471 return
1472 fi
1473}
1474
1475_git_svn ()
1476{
1477 local subcommands="
1478 init fetch clone rebase dcommit log find-rev
1479 set-tree commit-diff info create-ignore propget
1480 proplist show-ignore show-externals
1481 "
1482 local subcommand="$(__git_find_subcommand "$subcommands")"
1483 if [ -z "$subcommand" ]; then
1484 __gitcomp "$subcommands"
1485 else
1486 local remote_opts="--username= --config-dir= --no-auth-cache"
1487 local fc_opts="
1488 --follow-parent --authors-file= --repack=
1489 --no-metadata --use-svm-props --use-svnsync-props
1490 --log-window-size= --no-checkout --quiet
1491 --repack-flags --user-log-author $remote_opts
1492 "
1493 local init_opts="
1494 --template= --shared= --trunk= --tags=
1495 --branches= --stdlayout --minimize-url
1496 --no-metadata --use-svm-props --use-svnsync-props
1497 --rewrite-root= $remote_opts
1498 "
1499 local cmt_opts="
1500 --edit --rmdir --find-copies-harder --copy-similarity=
1501 "
1502
1503 local cur="${COMP_WORDS[COMP_CWORD]}"
1504 case "$subcommand,$cur" in
1505 fetch,--*)
1506 __gitcomp "--revision= --fetch-all $fc_opts"
1507 ;;
1508 clone,--*)
1509 __gitcomp "--revision= $fc_opts $init_opts"
1510 ;;
1511 init,--*)
1512 __gitcomp "$init_opts"
1513 ;;
1514 dcommit,--*)
1515 __gitcomp "
1516 --merge --strategy= --verbose --dry-run
1517 --fetch-all --no-rebase $cmt_opts $fc_opts
1518 "
1519 ;;
1520 set-tree,--*)
1521 __gitcomp "--stdin $cmt_opts $fc_opts"
1522 ;;
1523 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1524 show-externals,--*)
1525 __gitcomp "--revision="
1526 ;;
1527 log,--*)
1528 __gitcomp "
1529 --limit= --revision= --verbose --incremental
1530 --oneline --show-commit --non-recursive
1531 --authors-file=
1532 "
1533 ;;
1534 rebase,--*)
1535 __gitcomp "
1536 --merge --verbose --strategy= --local
1537 --fetch-all $fc_opts
1538 "
1539 ;;
1540 commit-diff,--*)
1541 __gitcomp "--message= --file= --revision= $cmt_opts"
1542 ;;
1543 info,--*)
1544 __gitcomp "--url"
1545 ;;
1546 *)
1547 COMPREPLY=()
1548 ;;
1549 esac
1550 fi
1551}
1552
1553_git_tag ()
1554{
1555 local i c=1 f=0
1556 while [ $c -lt $COMP_CWORD ]; do
1557 i="${COMP_WORDS[c]}"
1558 case "$i" in
1559 -d|-v)
1560 __gitcomp "$(__git_tags)"
1561 return
1562 ;;
1563 -f)
1564 f=1
1565 ;;
1566 esac
1567 c=$((++c))
1568 done
1569
1570 case "${COMP_WORDS[COMP_CWORD-1]}" in
1571 -m|-F)
1572 COMPREPLY=()
1573 ;;
1574 -*|tag|git-tag)
1575 if [ $f = 1 ]; then
1576 __gitcomp "$(__git_tags)"
1577 else
1578 COMPREPLY=()
1579 fi
1580 ;;
1581 *)
1582 __gitcomp "$(__git_refs)"
1583 ;;
1584 esac
1585}
1586
1587_git ()
1588{
1589 local i c=1 command __git_dir
1590
1591 while [ $c -lt $COMP_CWORD ]; do
1592 i="${COMP_WORDS[c]}"
1593 case "$i" in
1594 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1595 --bare) __git_dir="." ;;
1596 --version|-p|--paginate) ;;
1597 --help) command="help"; break ;;
1598 *) command="$i"; break ;;
1599 esac
1600 c=$((++c))
1601 done
1602
1603 if [ -z "$command" ]; then
1604 case "${COMP_WORDS[COMP_CWORD]}" in
1605 --*=*) COMPREPLY=() ;;
1606 --*) __gitcomp "
1607 --paginate
1608 --no-pager
1609 --git-dir=
1610 --bare
1611 --version
1612 --exec-path
1613 --work-tree=
1614 --help
1615 "
1616 ;;
1617 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1618 esac
1619 return
1620 fi
1621
1622 local expansion=$(__git_aliased_command "$command")
1623 [ "$expansion" ] && command="$expansion"
1624
1625 case "$command" in
1626 am) _git_am ;;
1627 add) _git_add ;;
1628 apply) _git_apply ;;
1629 archive) _git_archive ;;
1630 bisect) _git_bisect ;;
1631 bundle) _git_bundle ;;
1632 branch) _git_branch ;;
1633 checkout) _git_checkout ;;
1634 cherry) _git_cherry ;;
1635 cherry-pick) _git_cherry_pick ;;
1636 clean) _git_clean ;;
1637 clone) _git_clone ;;
1638 commit) _git_commit ;;
1639 config) _git_config ;;
1640 describe) _git_describe ;;
1641 diff) _git_diff ;;
1642 fetch) _git_fetch ;;
1643 format-patch) _git_format_patch ;;
1644 gc) _git_gc ;;
1645 grep) _git_grep ;;
1646 help) _git_help ;;
1647 init) _git_init ;;
1648 log) _git_log ;;
1649 ls-files) _git_ls_files ;;
1650 ls-remote) _git_ls_remote ;;
1651 ls-tree) _git_ls_tree ;;
1652 merge) _git_merge;;
1653 merge-base) _git_merge_base ;;
1654 mv) _git_mv ;;
1655 name-rev) _git_name_rev ;;
1656 pull) _git_pull ;;
1657 push) _git_push ;;
1658 rebase) _git_rebase ;;
1659 remote) _git_remote ;;
1660 reset) _git_reset ;;
1661 revert) _git_revert ;;
1662 rm) _git_rm ;;
1663 send-email) _git_send_email ;;
1664 shortlog) _git_shortlog ;;
1665 show) _git_show ;;
1666 show-branch) _git_show_branch ;;
1667 stash) _git_stash ;;
1668 submodule) _git_submodule ;;
1669 svn) _git_svn ;;
1670 tag) _git_tag ;;
1671 whatchanged) _git_log ;;
1672 *) COMPREPLY=() ;;
1673 esac
1674}
1675
1676_gitk ()
1677{
1678 __git_has_doubledash && return
1679
1680 local cur="${COMP_WORDS[COMP_CWORD]}"
1681 local g="$(git rev-parse --git-dir 2>/dev/null)"
1682 local merge=""
1683 if [ -f $g/MERGE_HEAD ]; then
1684 merge="--merge"
1685 fi
1686 case "$cur" in
1687 --*)
1688 __gitcomp "--not --all $merge"
1689 return
1690 ;;
1691 esac
1692 __git_complete_revlist
1693}
1694
1695complete -o default -o nospace -F _git git
1696complete -o default -o nospace -F _gitk gitk
1697
1698# The following are necessary only for Cygwin, and only are needed
1699# when the user has tab-completed the executable name and consequently
1700# included the '.exe' suffix.
1701#
1702if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1703complete -o default -o nospace -F _git git.exe
1704fi