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