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