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/../.dotest" ]
77 then
78 if test -f "$g/../.dotest/rebasing"
79 then
80 r="|REBASE"
81 elif test -f "$g/../.dotest/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/.dotest-merge/interactive" ]
89 then
90 r="|REBASE-i"
91 b="$(cat "$g/.dotest-merge/head-name")"
92 elif [ -d "$g/.dotest-merge" ]
93 then
94 r="|REBASE-m"
95 b="$(cat "$g/.dotest-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_commands ()
353{
354 if [ -n "$__git_commandlist" ]; then
355 echo "$__git_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 applymbox) : ask gittus;;
364 applypatch) : ask gittus;;
365 archimport) : import;;
366 cat-file) : plumbing;;
367 check-attr) : plumbing;;
368 check-ref-format) : plumbing;;
369 commit-tree) : plumbing;;
370 cvsexportcommit) : export;;
371 cvsimport) : import;;
372 cvsserver) : daemon;;
373 daemon) : daemon;;
374 diff-files) : plumbing;;
375 diff-index) : plumbing;;
376 diff-tree) : plumbing;;
377 fast-import) : import;;
378 fsck-objects) : plumbing;;
379 fetch-pack) : plumbing;;
380 fmt-merge-msg) : plumbing;;
381 for-each-ref) : plumbing;;
382 hash-object) : plumbing;;
383 http-*) : transport;;
384 index-pack) : plumbing;;
385 init-db) : deprecated;;
386 local-fetch) : plumbing;;
387 mailinfo) : plumbing;;
388 mailsplit) : plumbing;;
389 merge-*) : plumbing;;
390 mktree) : plumbing;;
391 mktag) : plumbing;;
392 pack-objects) : plumbing;;
393 pack-redundant) : plumbing;;
394 pack-refs) : plumbing;;
395 parse-remote) : plumbing;;
396 patch-id) : plumbing;;
397 peek-remote) : plumbing;;
398 prune) : plumbing;;
399 prune-packed) : plumbing;;
400 quiltimport) : import;;
401 read-tree) : plumbing;;
402 receive-pack) : plumbing;;
403 reflog) : plumbing;;
404 repo-config) : deprecated;;
405 rerere) : plumbing;;
406 rev-list) : plumbing;;
407 rev-parse) : plumbing;;
408 runstatus) : plumbing;;
409 sh-setup) : internal;;
410 shell) : daemon;;
411 send-pack) : plumbing;;
412 show-index) : plumbing;;
413 ssh-*) : transport;;
414 stripspace) : plumbing;;
415 symbolic-ref) : plumbing;;
416 tar-tree) : deprecated;;
417 unpack-file) : plumbing;;
418 unpack-objects) : plumbing;;
419 update-index) : plumbing;;
420 update-ref) : plumbing;;
421 update-server-info) : daemon;;
422 upload-archive) : plumbing;;
423 upload-pack) : plumbing;;
424 write-tree) : plumbing;;
425 verify-tag) : plumbing;;
426 *) echo $i;;
427 esac
428 done
429}
430__git_commandlist=
431__git_commandlist="$(__git_commands 2>/dev/null)"
432
433__git_aliases ()
434{
435 local i IFS=$'\n'
436 for i in $(git --git-dir="$(__gitdir)" config --list); do
437 case "$i" in
438 alias.*)
439 i="${i#alias.}"
440 echo "${i/=*/}"
441 ;;
442 esac
443 done
444}
445
446__git_aliased_command ()
447{
448 local word cmdline=$(git --git-dir="$(__gitdir)" \
449 config --get "alias.$1")
450 for word in $cmdline; do
451 if [ "${word##-*}" ]; then
452 echo $word
453 return
454 fi
455 done
456}
457
458__git_find_subcommand ()
459{
460 local word subcommand c=1
461
462 while [ $c -lt $COMP_CWORD ]; do
463 word="${COMP_WORDS[c]}"
464 for subcommand in $1; do
465 if [ "$subcommand" = "$word" ]; then
466 echo "$subcommand"
467 return
468 fi
469 done
470 c=$((++c))
471 done
472}
473
474__git_has_doubledash ()
475{
476 local c=1
477 while [ $c -lt $COMP_CWORD ]; do
478 if [ "--" = "${COMP_WORDS[c]}" ]; then
479 return 0
480 fi
481 c=$((++c))
482 done
483 return 1
484}
485
486__git_whitespacelist="nowarn warn error error-all strip"
487
488_git_am ()
489{
490 local cur="${COMP_WORDS[COMP_CWORD]}"
491 if [ -d .dotest ]; then
492 __gitcomp "--skip --resolved"
493 return
494 fi
495 case "$cur" in
496 --whitespace=*)
497 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
498 return
499 ;;
500 --*)
501 __gitcomp "
502 --signoff --utf8 --binary --3way --interactive
503 --whitespace=
504 "
505 return
506 esac
507 COMPREPLY=()
508}
509
510_git_apply ()
511{
512 local cur="${COMP_WORDS[COMP_CWORD]}"
513 case "$cur" in
514 --whitespace=*)
515 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
516 return
517 ;;
518 --*)
519 __gitcomp "
520 --stat --numstat --summary --check --index
521 --cached --index-info --reverse --reject --unidiff-zero
522 --apply --no-add --exclude=
523 --whitespace= --inaccurate-eof --verbose
524 "
525 return
526 esac
527 COMPREPLY=()
528}
529
530_git_add ()
531{
532 __git_has_doubledash && return
533
534 local cur="${COMP_WORDS[COMP_CWORD]}"
535 case "$cur" in
536 --*)
537 __gitcomp "
538 --interactive --refresh --patch --update --dry-run
539 --ignore-errors
540 "
541 return
542 esac
543 COMPREPLY=()
544}
545
546_git_bisect ()
547{
548 __git_has_doubledash && return
549
550 local subcommands="start bad good reset visualize replay log"
551 local subcommand="$(__git_find_subcommand "$subcommands")"
552 if [ -z "$subcommand" ]; then
553 __gitcomp "$subcommands"
554 return
555 fi
556
557 case "$subcommand" in
558 bad|good|reset)
559 __gitcomp "$(__git_refs)"
560 ;;
561 *)
562 COMPREPLY=()
563 ;;
564 esac
565}
566
567_git_branch ()
568{
569 local i c=1 only_local_ref="n" has_r="n"
570
571 while [ $c -lt $COMP_CWORD ]; do
572 i="${COMP_WORDS[c]}"
573 case "$i" in
574 -d|-m) only_local_ref="y" ;;
575 -r) has_r="y" ;;
576 esac
577 c=$((++c))
578 done
579
580 case "${COMP_WORDS[COMP_CWORD]}" in
581 --*=*) COMPREPLY=() ;;
582 --*)
583 __gitcomp "
584 --color --no-color --verbose --abbrev= --no-abbrev
585 --track --no-track
586 "
587 ;;
588 *)
589 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
590 __gitcomp "$(__git_heads)"
591 else
592 __gitcomp "$(__git_refs)"
593 fi
594 ;;
595 esac
596}
597
598_git_bundle ()
599{
600 local mycword="$COMP_CWORD"
601 case "${COMP_WORDS[0]}" in
602 git)
603 local cmd="${COMP_WORDS[2]}"
604 mycword="$((mycword-1))"
605 ;;
606 git-bundle*)
607 local cmd="${COMP_WORDS[1]}"
608 ;;
609 esac
610 case "$mycword" in
611 1)
612 __gitcomp "create list-heads verify unbundle"
613 ;;
614 2)
615 # looking for a file
616 ;;
617 *)
618 case "$cmd" in
619 create)
620 __git_complete_revlist
621 ;;
622 esac
623 ;;
624 esac
625}
626
627_git_checkout ()
628{
629 __gitcomp "$(__git_refs)"
630}
631
632_git_cherry ()
633{
634 __gitcomp "$(__git_refs)"
635}
636
637_git_cherry_pick ()
638{
639 local cur="${COMP_WORDS[COMP_CWORD]}"
640 case "$cur" in
641 --*)
642 __gitcomp "--edit --no-commit"
643 ;;
644 *)
645 __gitcomp "$(__git_refs)"
646 ;;
647 esac
648}
649
650_git_commit ()
651{
652 __git_has_doubledash && return
653
654 local cur="${COMP_WORDS[COMP_CWORD]}"
655 case "$cur" in
656 --*)
657 __gitcomp "
658 --all --author= --signoff --verify --no-verify
659 --edit --amend --include --only
660 "
661 return
662 esac
663 COMPREPLY=()
664}
665
666_git_describe ()
667{
668 __gitcomp "$(__git_refs)"
669}
670
671_git_diff ()
672{
673 __git_has_doubledash && return
674
675 local cur="${COMP_WORDS[COMP_CWORD]}"
676 case "$cur" in
677 --*)
678 __gitcomp "--cached --stat --numstat --shortstat --summary
679 --patch-with-stat --name-only --name-status --color
680 --no-color --color-words --no-renames --check
681 --full-index --binary --abbrev --diff-filter
682 --find-copies-harder --pickaxe-all --pickaxe-regex
683 --text --ignore-space-at-eol --ignore-space-change
684 --ignore-all-space --exit-code --quiet --ext-diff
685 --no-ext-diff
686 --no-prefix --src-prefix= --dst-prefix=
687 --base --ours --theirs
688 "
689 return
690 ;;
691 esac
692 __git_complete_file
693}
694
695_git_diff_tree ()
696{
697 __gitcomp "$(__git_refs)"
698}
699
700_git_fetch ()
701{
702 local cur="${COMP_WORDS[COMP_CWORD]}"
703
704 case "${COMP_WORDS[0]},$COMP_CWORD" in
705 git-fetch*,1)
706 __gitcomp "$(__git_remotes)"
707 ;;
708 git,2)
709 __gitcomp "$(__git_remotes)"
710 ;;
711 *)
712 case "$cur" in
713 *:*)
714 local pfx=""
715 case "$COMP_WORDBREAKS" in
716 *:*) : great ;;
717 *) pfx="${cur%%:*}:" ;;
718 esac
719 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
720 ;;
721 *)
722 local remote
723 case "${COMP_WORDS[0]}" in
724 git-fetch) remote="${COMP_WORDS[1]}" ;;
725 git) remote="${COMP_WORDS[2]}" ;;
726 esac
727 __gitcomp "$(__git_refs2 "$remote")"
728 ;;
729 esac
730 ;;
731 esac
732}
733
734_git_format_patch ()
735{
736 local cur="${COMP_WORDS[COMP_CWORD]}"
737 case "$cur" in
738 --*)
739 __gitcomp "
740 --stdout --attach --thread
741 --output-directory
742 --numbered --start-number
743 --numbered-files
744 --keep-subject
745 --signoff
746 --in-reply-to=
747 --full-index --binary
748 --not --all
749 --cover-letter
750 --no-prefix --src-prefix= --dst-prefix=
751 "
752 return
753 ;;
754 esac
755 __git_complete_revlist
756}
757
758_git_gc ()
759{
760 local cur="${COMP_WORDS[COMP_CWORD]}"
761 case "$cur" in
762 --*)
763 __gitcomp "--prune --aggressive"
764 return
765 ;;
766 esac
767 COMPREPLY=()
768}
769
770_git_ls_remote ()
771{
772 __gitcomp "$(__git_remotes)"
773}
774
775_git_ls_tree ()
776{
777 __git_complete_file
778}
779
780_git_log ()
781{
782 __git_has_doubledash && return
783
784 local cur="${COMP_WORDS[COMP_CWORD]}"
785 case "$cur" in
786 --pretty=*)
787 __gitcomp "
788 oneline short medium full fuller email raw
789 " "" "${cur##--pretty=}"
790 return
791 ;;
792 --date=*)
793 __gitcomp "
794 relative iso8601 rfc2822 short local default
795 " "" "${cur##--date=}"
796 return
797 ;;
798 --*)
799 __gitcomp "
800 --max-count= --max-age= --since= --after=
801 --min-age= --before= --until=
802 --root --topo-order --date-order --reverse
803 --no-merges --follow
804 --abbrev-commit --abbrev=
805 --relative-date --date=
806 --author= --committer= --grep=
807 --all-match
808 --pretty= --name-status --name-only --raw
809 --not --all
810 --left-right --cherry-pick
811 --graph
812 "
813 return
814 ;;
815 esac
816 __git_complete_revlist
817}
818
819_git_merge ()
820{
821 local cur="${COMP_WORDS[COMP_CWORD]}"
822 case "${COMP_WORDS[COMP_CWORD-1]}" in
823 -s|--strategy)
824 __gitcomp "$(__git_merge_strategies)"
825 return
826 esac
827 case "$cur" in
828 --strategy=*)
829 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
830 return
831 ;;
832 --*)
833 __gitcomp "
834 --no-commit --no-stat --log --no-log --squash --strategy
835 "
836 return
837 esac
838 __gitcomp "$(__git_refs)"
839}
840
841_git_merge_base ()
842{
843 __gitcomp "$(__git_refs)"
844}
845
846_git_name_rev ()
847{
848 __gitcomp "--tags --all --stdin"
849}
850
851_git_pull ()
852{
853 local cur="${COMP_WORDS[COMP_CWORD]}"
854
855 case "${COMP_WORDS[0]},$COMP_CWORD" in
856 git-pull*,1)
857 __gitcomp "$(__git_remotes)"
858 ;;
859 git,2)
860 __gitcomp "$(__git_remotes)"
861 ;;
862 *)
863 local remote
864 case "${COMP_WORDS[0]}" in
865 git-pull) remote="${COMP_WORDS[1]}" ;;
866 git) remote="${COMP_WORDS[2]}" ;;
867 esac
868 __gitcomp "$(__git_refs "$remote")"
869 ;;
870 esac
871}
872
873_git_push ()
874{
875 local cur="${COMP_WORDS[COMP_CWORD]}"
876
877 case "${COMP_WORDS[0]},$COMP_CWORD" in
878 git-push*,1)
879 __gitcomp "$(__git_remotes)"
880 ;;
881 git,2)
882 __gitcomp "$(__git_remotes)"
883 ;;
884 *)
885 case "$cur" in
886 *:*)
887 local remote
888 case "${COMP_WORDS[0]}" in
889 git-push) remote="${COMP_WORDS[1]}" ;;
890 git) remote="${COMP_WORDS[2]}" ;;
891 esac
892
893 local pfx=""
894 case "$COMP_WORDBREAKS" in
895 *:*) : great ;;
896 *) pfx="${cur%%:*}:" ;;
897 esac
898
899 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
900 ;;
901 +*)
902 __gitcomp "$(__git_refs)" + "${cur#+}"
903 ;;
904 *)
905 __gitcomp "$(__git_refs)"
906 ;;
907 esac
908 ;;
909 esac
910}
911
912_git_rebase ()
913{
914 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
915 if [ -d .dotest ] || [ -d "$dir"/.dotest-merge ]; then
916 __gitcomp "--continue --skip --abort"
917 return
918 fi
919 case "${COMP_WORDS[COMP_CWORD-1]}" in
920 -s|--strategy)
921 __gitcomp "$(__git_merge_strategies)"
922 return
923 esac
924 case "$cur" in
925 --strategy=*)
926 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
927 return
928 ;;
929 --*)
930 __gitcomp "--onto --merge --strategy --interactive"
931 return
932 esac
933 __gitcomp "$(__git_refs)"
934}
935
936_git_config ()
937{
938 local cur="${COMP_WORDS[COMP_CWORD]}"
939 local prv="${COMP_WORDS[COMP_CWORD-1]}"
940 case "$prv" in
941 branch.*.remote)
942 __gitcomp "$(__git_remotes)"
943 return
944 ;;
945 branch.*.merge)
946 __gitcomp "$(__git_refs)"
947 return
948 ;;
949 remote.*.fetch)
950 local remote="${prv#remote.}"
951 remote="${remote%.fetch}"
952 __gitcomp "$(__git_refs_remotes "$remote")"
953 return
954 ;;
955 remote.*.push)
956 local remote="${prv#remote.}"
957 remote="${remote%.push}"
958 __gitcomp "$(git --git-dir="$(__gitdir)" \
959 for-each-ref --format='%(refname):%(refname)' \
960 refs/heads)"
961 return
962 ;;
963 pull.twohead|pull.octopus)
964 __gitcomp "$(__git_merge_strategies)"
965 return
966 ;;
967 color.branch|color.diff|color.status)
968 __gitcomp "always never auto"
969 return
970 ;;
971 color.*.*)
972 __gitcomp "
973 black red green yellow blue magenta cyan white
974 bold dim ul blink reverse
975 "
976 return
977 ;;
978 *.*)
979 COMPREPLY=()
980 return
981 ;;
982 esac
983 case "$cur" in
984 --*)
985 __gitcomp "
986 --global --system --file=
987 --list --replace-all
988 --get --get-all --get-regexp
989 --add --unset --unset-all
990 --remove-section --rename-section
991 "
992 return
993 ;;
994 branch.*.*)
995 local pfx="${cur%.*}."
996 cur="${cur##*.}"
997 __gitcomp "remote merge" "$pfx" "$cur"
998 return
999 ;;
1000 branch.*)
1001 local pfx="${cur%.*}."
1002 cur="${cur#*.}"
1003 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1004 return
1005 ;;
1006 remote.*.*)
1007 local pfx="${cur%.*}."
1008 cur="${cur##*.}"
1009 __gitcomp "
1010 url fetch push skipDefaultUpdate
1011 receivepack uploadpack tagopt
1012 " "$pfx" "$cur"
1013 return
1014 ;;
1015 remote.*)
1016 local pfx="${cur%.*}."
1017 cur="${cur#*.}"
1018 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1019 return
1020 ;;
1021 esac
1022 __gitcomp "
1023 apply.whitespace
1024 core.fileMode
1025 core.gitProxy
1026 core.ignoreStat
1027 core.preferSymlinkRefs
1028 core.logAllRefUpdates
1029 core.loosecompression
1030 core.repositoryFormatVersion
1031 core.sharedRepository
1032 core.warnAmbiguousRefs
1033 core.compression
1034 core.packedGitWindowSize
1035 core.packedGitLimit
1036 clean.requireForce
1037 color.branch
1038 color.branch.current
1039 color.branch.local
1040 color.branch.remote
1041 color.branch.plain
1042 color.diff
1043 color.diff.plain
1044 color.diff.meta
1045 color.diff.frag
1046 color.diff.old
1047 color.diff.new
1048 color.diff.commit
1049 color.diff.whitespace
1050 color.pager
1051 color.status
1052 color.status.header
1053 color.status.added
1054 color.status.changed
1055 color.status.untracked
1056 diff.renameLimit
1057 diff.renames
1058 fetch.unpackLimit
1059 format.headers
1060 format.subjectprefix
1061 gitcvs.enabled
1062 gitcvs.logfile
1063 gitcvs.allbinary
1064 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1065 gitcvs.dbtablenameprefix
1066 gc.packrefs
1067 gc.reflogexpire
1068 gc.reflogexpireunreachable
1069 gc.rerereresolved
1070 gc.rerereunresolved
1071 http.sslVerify
1072 http.sslCert
1073 http.sslKey
1074 http.sslCAInfo
1075 http.sslCAPath
1076 http.maxRequests
1077 http.lowSpeedLimit
1078 http.lowSpeedTime
1079 http.noEPSV
1080 i18n.commitEncoding
1081 i18n.logOutputEncoding
1082 log.showroot
1083 merge.tool
1084 merge.summary
1085 merge.verbosity
1086 pack.window
1087 pack.depth
1088 pack.windowMemory
1089 pack.compression
1090 pack.deltaCacheSize
1091 pack.deltaCacheLimit
1092 pull.octopus
1093 pull.twohead
1094 repack.useDeltaBaseOffset
1095 show.difftree
1096 showbranch.default
1097 tar.umask
1098 transfer.unpackLimit
1099 receive.unpackLimit
1100 receive.denyNonFastForwards
1101 user.name
1102 user.email
1103 user.signingkey
1104 whatchanged.difftree
1105 branch. remote.
1106 "
1107}
1108
1109_git_remote ()
1110{
1111 local subcommands="add rm show prune update"
1112 local subcommand="$(__git_find_subcommand "$subcommands")"
1113 if [ -z "$subcommand" ]; then
1114 __gitcomp "$subcommands"
1115 return
1116 fi
1117
1118 case "$subcommand" in
1119 rm|show|prune)
1120 __gitcomp "$(__git_remotes)"
1121 ;;
1122 update)
1123 local i c='' IFS=$'\n'
1124 for i in $(git --git-dir="$(__gitdir)" config --list); do
1125 case "$i" in
1126 remotes.*)
1127 i="${i#remotes.}"
1128 c="$c ${i/=*/}"
1129 ;;
1130 esac
1131 done
1132 __gitcomp "$c"
1133 ;;
1134 *)
1135 COMPREPLY=()
1136 ;;
1137 esac
1138}
1139
1140_git_reset ()
1141{
1142 __git_has_doubledash && return
1143
1144 local cur="${COMP_WORDS[COMP_CWORD]}"
1145 case "$cur" in
1146 --*)
1147 __gitcomp "--mixed --hard --soft"
1148 return
1149 ;;
1150 esac
1151 __gitcomp "$(__git_refs)"
1152}
1153
1154_git_shortlog ()
1155{
1156 __git_has_doubledash && return
1157
1158 local cur="${COMP_WORDS[COMP_CWORD]}"
1159 case "$cur" in
1160 --*)
1161 __gitcomp "
1162 --max-count= --max-age= --since= --after=
1163 --min-age= --before= --until=
1164 --no-merges
1165 --author= --committer= --grep=
1166 --all-match
1167 --not --all
1168 --numbered --summary
1169 "
1170 return
1171 ;;
1172 esac
1173 __git_complete_revlist
1174}
1175
1176_git_show ()
1177{
1178 local cur="${COMP_WORDS[COMP_CWORD]}"
1179 case "$cur" in
1180 --pretty=*)
1181 __gitcomp "
1182 oneline short medium full fuller email raw
1183 " "" "${cur##--pretty=}"
1184 return
1185 ;;
1186 --*)
1187 __gitcomp "--pretty="
1188 return
1189 ;;
1190 esac
1191 __git_complete_file
1192}
1193
1194_git_stash ()
1195{
1196 local subcommands='save list show apply clear drop pop create'
1197 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1198 __gitcomp "$subcommands"
1199 fi
1200}
1201
1202_git_submodule ()
1203{
1204 __git_has_doubledash && return
1205
1206 local subcommands="add status init update"
1207 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1208 local cur="${COMP_WORDS[COMP_CWORD]}"
1209 case "$cur" in
1210 --*)
1211 __gitcomp "--quiet --cached"
1212 ;;
1213 *)
1214 __gitcomp "$subcommands"
1215 ;;
1216 esac
1217 return
1218 fi
1219}
1220
1221_git_svn ()
1222{
1223 local subcommands="
1224 init fetch clone rebase dcommit log find-rev
1225 set-tree commit-diff info create-ignore propget
1226 proplist show-ignore show-externals
1227 "
1228 local subcommand="$(__git_find_subcommand "$subcommands")"
1229 if [ -z "$subcommand" ]; then
1230 __gitcomp "$subcommands"
1231 else
1232 local remote_opts="--username= --config-dir= --no-auth-cache"
1233 local fc_opts="
1234 --follow-parent --authors-file= --repack=
1235 --no-metadata --use-svm-props --use-svnsync-props
1236 --log-window-size= --no-checkout --quiet
1237 --repack-flags --user-log-author $remote_opts
1238 "
1239 local init_opts="
1240 --template= --shared= --trunk= --tags=
1241 --branches= --stdlayout --minimize-url
1242 --no-metadata --use-svm-props --use-svnsync-props
1243 --rewrite-root= $remote_opts
1244 "
1245 local cmt_opts="
1246 --edit --rmdir --find-copies-harder --copy-similarity=
1247 "
1248
1249 local cur="${COMP_WORDS[COMP_CWORD]}"
1250 case "$subcommand,$cur" in
1251 fetch,--*)
1252 __gitcomp "--revision= --fetch-all $fc_opts"
1253 ;;
1254 clone,--*)
1255 __gitcomp "--revision= $fc_opts $init_opts"
1256 ;;
1257 init,--*)
1258 __gitcomp "$init_opts"
1259 ;;
1260 dcommit,--*)
1261 __gitcomp "
1262 --merge --strategy= --verbose --dry-run
1263 --fetch-all --no-rebase $cmt_opts $fc_opts
1264 "
1265 ;;
1266 set-tree,--*)
1267 __gitcomp "--stdin $cmt_opts $fc_opts"
1268 ;;
1269 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1270 show-externals,--*)
1271 __gitcomp "--revision="
1272 ;;
1273 log,--*)
1274 __gitcomp "
1275 --limit= --revision= --verbose --incremental
1276 --oneline --show-commit --non-recursive
1277 --authors-file=
1278 "
1279 ;;
1280 rebase,--*)
1281 __gitcomp "
1282 --merge --verbose --strategy= --local
1283 --fetch-all $fc_opts
1284 "
1285 ;;
1286 commit-diff,--*)
1287 __gitcomp "--message= --file= --revision= $cmt_opts"
1288 ;;
1289 info,--*)
1290 __gitcomp "--url"
1291 ;;
1292 *)
1293 COMPREPLY=()
1294 ;;
1295 esac
1296 fi
1297}
1298
1299_git_tag ()
1300{
1301 local i c=1 f=0
1302 while [ $c -lt $COMP_CWORD ]; do
1303 i="${COMP_WORDS[c]}"
1304 case "$i" in
1305 -d|-v)
1306 __gitcomp "$(__git_tags)"
1307 return
1308 ;;
1309 -f)
1310 f=1
1311 ;;
1312 esac
1313 c=$((++c))
1314 done
1315
1316 case "${COMP_WORDS[COMP_CWORD-1]}" in
1317 -m|-F)
1318 COMPREPLY=()
1319 ;;
1320 -*|tag|git-tag)
1321 if [ $f = 1 ]; then
1322 __gitcomp "$(__git_tags)"
1323 else
1324 COMPREPLY=()
1325 fi
1326 ;;
1327 *)
1328 __gitcomp "$(__git_refs)"
1329 ;;
1330 esac
1331}
1332
1333_git ()
1334{
1335 local i c=1 command __git_dir
1336
1337 while [ $c -lt $COMP_CWORD ]; do
1338 i="${COMP_WORDS[c]}"
1339 case "$i" in
1340 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1341 --bare) __git_dir="." ;;
1342 --version|--help|-p|--paginate) ;;
1343 *) command="$i"; break ;;
1344 esac
1345 c=$((++c))
1346 done
1347
1348 if [ -z "$command" ]; then
1349 case "${COMP_WORDS[COMP_CWORD]}" in
1350 --*=*) COMPREPLY=() ;;
1351 --*) __gitcomp "
1352 --paginate
1353 --no-pager
1354 --git-dir=
1355 --bare
1356 --version
1357 --exec-path
1358 --work-tree=
1359 --help
1360 "
1361 ;;
1362 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1363 esac
1364 return
1365 fi
1366
1367 local expansion=$(__git_aliased_command "$command")
1368 [ "$expansion" ] && command="$expansion"
1369
1370 case "$command" in
1371 am) _git_am ;;
1372 add) _git_add ;;
1373 apply) _git_apply ;;
1374 bisect) _git_bisect ;;
1375 bundle) _git_bundle ;;
1376 branch) _git_branch ;;
1377 checkout) _git_checkout ;;
1378 cherry) _git_cherry ;;
1379 cherry-pick) _git_cherry_pick ;;
1380 commit) _git_commit ;;
1381 config) _git_config ;;
1382 describe) _git_describe ;;
1383 diff) _git_diff ;;
1384 fetch) _git_fetch ;;
1385 format-patch) _git_format_patch ;;
1386 gc) _git_gc ;;
1387 log) _git_log ;;
1388 ls-remote) _git_ls_remote ;;
1389 ls-tree) _git_ls_tree ;;
1390 merge) _git_merge;;
1391 merge-base) _git_merge_base ;;
1392 name-rev) _git_name_rev ;;
1393 pull) _git_pull ;;
1394 push) _git_push ;;
1395 rebase) _git_rebase ;;
1396 remote) _git_remote ;;
1397 reset) _git_reset ;;
1398 shortlog) _git_shortlog ;;
1399 show) _git_show ;;
1400 show-branch) _git_log ;;
1401 stash) _git_stash ;;
1402 submodule) _git_submodule ;;
1403 svn) _git_svn ;;
1404 tag) _git_tag ;;
1405 whatchanged) _git_log ;;
1406 *) COMPREPLY=() ;;
1407 esac
1408}
1409
1410_gitk ()
1411{
1412 __git_has_doubledash && return
1413
1414 local cur="${COMP_WORDS[COMP_CWORD]}"
1415 local g="$(git rev-parse --git-dir 2>/dev/null)"
1416 local merge=""
1417 if [ -f $g/MERGE_HEAD ]; then
1418 merge="--merge"
1419 fi
1420 case "$cur" in
1421 --*)
1422 __gitcomp "--not --all $merge"
1423 return
1424 ;;
1425 esac
1426 __git_complete_revlist
1427}
1428
1429complete -o default -o nospace -F _git git
1430complete -o default -o nospace -F _gitk gitk
1431complete -o default -o nospace -F _git_am git-am
1432complete -o default -o nospace -F _git_apply git-apply
1433complete -o default -o nospace -F _git_bisect git-bisect
1434complete -o default -o nospace -F _git_branch git-branch
1435complete -o default -o nospace -F _git_bundle git-bundle
1436complete -o default -o nospace -F _git_checkout git-checkout
1437complete -o default -o nospace -F _git_cherry git-cherry
1438complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1439complete -o default -o nospace -F _git_commit git-commit
1440complete -o default -o nospace -F _git_describe git-describe
1441complete -o default -o nospace -F _git_diff git-diff
1442complete -o default -o nospace -F _git_fetch git-fetch
1443complete -o default -o nospace -F _git_format_patch git-format-patch
1444complete -o default -o nospace -F _git_gc git-gc
1445complete -o default -o nospace -F _git_log git-log
1446complete -o default -o nospace -F _git_ls_remote git-ls-remote
1447complete -o default -o nospace -F _git_ls_tree git-ls-tree
1448complete -o default -o nospace -F _git_merge git-merge
1449complete -o default -o nospace -F _git_merge_base git-merge-base
1450complete -o default -o nospace -F _git_name_rev git-name-rev
1451complete -o default -o nospace -F _git_pull git-pull
1452complete -o default -o nospace -F _git_push git-push
1453complete -o default -o nospace -F _git_rebase git-rebase
1454complete -o default -o nospace -F _git_config git-config
1455complete -o default -o nospace -F _git_remote git-remote
1456complete -o default -o nospace -F _git_reset git-reset
1457complete -o default -o nospace -F _git_shortlog git-shortlog
1458complete -o default -o nospace -F _git_show git-show
1459complete -o default -o nospace -F _git_stash git-stash
1460complete -o default -o nospace -F _git_submodule git-submodule
1461complete -o default -o nospace -F _git_svn git-svn
1462complete -o default -o nospace -F _git_log git-show-branch
1463complete -o default -o nospace -F _git_tag git-tag
1464complete -o default -o nospace -F _git_log git-whatchanged
1465
1466# The following are necessary only for Cygwin, and only are needed
1467# when the user has tab-completed the executable name and consequently
1468# included the '.exe' suffix.
1469#
1470if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1471complete -o default -o nospace -F _git_add git-add.exe
1472complete -o default -o nospace -F _git_apply git-apply.exe
1473complete -o default -o nospace -F _git git.exe
1474complete -o default -o nospace -F _git_branch git-branch.exe
1475complete -o default -o nospace -F _git_bundle git-bundle.exe
1476complete -o default -o nospace -F _git_cherry git-cherry.exe
1477complete -o default -o nospace -F _git_describe git-describe.exe
1478complete -o default -o nospace -F _git_diff git-diff.exe
1479complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1480complete -o default -o nospace -F _git_log git-log.exe
1481complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1482complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1483complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1484complete -o default -o nospace -F _git_push git-push.exe
1485complete -o default -o nospace -F _git_config git-config
1486complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1487complete -o default -o nospace -F _git_show git-show.exe
1488complete -o default -o nospace -F _git_log git-show-branch.exe
1489complete -o default -o nospace -F _git_tag git-tag.exe
1490complete -o default -o nospace -F _git_log git-whatchanged.exe
1491fi