e32c1f1a9ccd26132f4bf7e42905ac5ce16a67a2
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 #
48 case "$COMP_WORDBREAKS" in
49 *:*) : great ;;
50 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
51 esac
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 }
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
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 }
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 }
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 }
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 }
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 }
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 }
224 __git_refs2 ()
225 {
226 local i
227 for i in $(__git_refs "$1"); do
228 echo "$i:$i"
229 done
230 }
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 }
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 }
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)"
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
303 case "$COMP_WORDBREAKS" in
304 *:*) : great ;;
305 *) pfx="$ref:$pfx" ;;
306 esac
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 }
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 }
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)"
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)"
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 }
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 }
476 __git_find_subcommand ()
477 {
478 local word subcommand c=1
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 }
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 }
504 __git_whitespacelist="nowarn warn error error-all strip"
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 }
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 }
548 _git_add ()
549 {
550 __git_has_doubledash && return
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 }
564 _git_bisect ()
565 {
566 __git_has_doubledash && return
568 local subcommands="start bad good skip reset visualize replay log run"
569 local subcommand="$(__git_find_subcommand "$subcommands")"
570 if [ -z "$subcommand" ]; then
571 __gitcomp "$subcommands"
572 return
573 fi
575 case "$subcommand" in
576 bad|good|reset|skip)
577 __gitcomp "$(__git_refs)"
578 ;;
579 *)
580 COMPREPLY=()
581 ;;
582 esac
583 }
585 _git_branch ()
586 {
587 local i c=1 only_local_ref="n" has_r="n"
589 while [ $c -lt $COMP_CWORD ]; do
590 i="${COMP_WORDS[c]}"
591 case "$i" in
592 -d|-m) only_local_ref="y" ;;
593 -r) has_r="y" ;;
594 esac
595 c=$((++c))
596 done
598 case "${COMP_WORDS[COMP_CWORD]}" in
599 --*=*) COMPREPLY=() ;;
600 --*)
601 __gitcomp "
602 --color --no-color --verbose --abbrev= --no-abbrev
603 --track --no-track --contains --merged --no-merged
604 "
605 ;;
606 *)
607 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
608 __gitcomp "$(__git_heads)"
609 else
610 __gitcomp "$(__git_refs)"
611 fi
612 ;;
613 esac
614 }
616 _git_bundle ()
617 {
618 local mycword="$COMP_CWORD"
619 case "${COMP_WORDS[0]}" in
620 git)
621 local cmd="${COMP_WORDS[2]}"
622 mycword="$((mycword-1))"
623 ;;
624 git-bundle*)
625 local cmd="${COMP_WORDS[1]}"
626 ;;
627 esac
628 case "$mycword" in
629 1)
630 __gitcomp "create list-heads verify unbundle"
631 ;;
632 2)
633 # looking for a file
634 ;;
635 *)
636 case "$cmd" in
637 create)
638 __git_complete_revlist
639 ;;
640 esac
641 ;;
642 esac
643 }
645 _git_checkout ()
646 {
647 __git_has_doubledash && return
649 __gitcomp "$(__git_refs)"
650 }
652 _git_cherry ()
653 {
654 __gitcomp "$(__git_refs)"
655 }
657 _git_cherry_pick ()
658 {
659 local cur="${COMP_WORDS[COMP_CWORD]}"
660 case "$cur" in
661 --*)
662 __gitcomp "--edit --no-commit"
663 ;;
664 *)
665 __gitcomp "$(__git_refs)"
666 ;;
667 esac
668 }
670 _git_commit ()
671 {
672 __git_has_doubledash && return
674 local cur="${COMP_WORDS[COMP_CWORD]}"
675 case "$cur" in
676 --*)
677 __gitcomp "
678 --all --author= --signoff --verify --no-verify
679 --edit --amend --include --only
680 "
681 return
682 esac
683 COMPREPLY=()
684 }
686 _git_describe ()
687 {
688 local cur="${COMP_WORDS[COMP_CWORD]}"
689 case "$cur" in
690 --*)
691 __gitcomp "
692 --all --tags --contains --abbrev= --candidates=
693 --exact-match --debug --long --match --always
694 "
695 return
696 esac
697 __gitcomp "$(__git_refs)"
698 }
700 _git_diff ()
701 {
702 __git_has_doubledash && return
704 local cur="${COMP_WORDS[COMP_CWORD]}"
705 case "$cur" in
706 --*)
707 __gitcomp "--cached --stat --numstat --shortstat --summary
708 --patch-with-stat --name-only --name-status --color
709 --no-color --color-words --no-renames --check
710 --full-index --binary --abbrev --diff-filter
711 --find-copies-harder --pickaxe-all --pickaxe-regex
712 --text --ignore-space-at-eol --ignore-space-change
713 --ignore-all-space --exit-code --quiet --ext-diff
714 --no-ext-diff
715 --no-prefix --src-prefix= --dst-prefix=
716 --base --ours --theirs
717 "
718 return
719 ;;
720 esac
721 __git_complete_file
722 }
724 _git_fetch ()
725 {
726 local cur="${COMP_WORDS[COMP_CWORD]}"
728 case "${COMP_WORDS[0]},$COMP_CWORD" in
729 git-fetch*,1)
730 __gitcomp "$(__git_remotes)"
731 ;;
732 git,2)
733 __gitcomp "$(__git_remotes)"
734 ;;
735 *)
736 case "$cur" in
737 *:*)
738 local pfx=""
739 case "$COMP_WORDBREAKS" in
740 *:*) : great ;;
741 *) pfx="${cur%%:*}:" ;;
742 esac
743 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
744 ;;
745 *)
746 local remote
747 case "${COMP_WORDS[0]}" in
748 git-fetch) remote="${COMP_WORDS[1]}" ;;
749 git) remote="${COMP_WORDS[2]}" ;;
750 esac
751 __gitcomp "$(__git_refs2 "$remote")"
752 ;;
753 esac
754 ;;
755 esac
756 }
758 _git_format_patch ()
759 {
760 local cur="${COMP_WORDS[COMP_CWORD]}"
761 case "$cur" in
762 --*)
763 __gitcomp "
764 --stdout --attach --thread
765 --output-directory
766 --numbered --start-number
767 --numbered-files
768 --keep-subject
769 --signoff
770 --in-reply-to=
771 --full-index --binary
772 --not --all
773 --cover-letter
774 --no-prefix --src-prefix= --dst-prefix=
775 "
776 return
777 ;;
778 esac
779 __git_complete_revlist
780 }
782 _git_gc ()
783 {
784 local cur="${COMP_WORDS[COMP_CWORD]}"
785 case "$cur" in
786 --*)
787 __gitcomp "--prune --aggressive"
788 return
789 ;;
790 esac
791 COMPREPLY=()
792 }
794 _git_help ()
795 {
796 local cur="${COMP_WORDS[COMP_CWORD]}"
797 case "$cur" in
798 --*)
799 __gitcomp "--all --info --man --web"
800 return
801 ;;
802 esac
803 __gitcomp "$(__git_all_commands)"
804 }
806 _git_ls_remote ()
807 {
808 __gitcomp "$(__git_remotes)"
809 }
811 _git_ls_tree ()
812 {
813 __git_complete_file
814 }
816 _git_log ()
817 {
818 __git_has_doubledash && return
820 local cur="${COMP_WORDS[COMP_CWORD]}"
821 case "$cur" in
822 --pretty=*)
823 __gitcomp "
824 oneline short medium full fuller email raw
825 " "" "${cur##--pretty=}"
826 return
827 ;;
828 --date=*)
829 __gitcomp "
830 relative iso8601 rfc2822 short local default
831 " "" "${cur##--date=}"
832 return
833 ;;
834 --*)
835 __gitcomp "
836 --max-count= --max-age= --since= --after=
837 --min-age= --before= --until=
838 --root --topo-order --date-order --reverse
839 --no-merges --follow
840 --abbrev-commit --abbrev=
841 --relative-date --date=
842 --author= --committer= --grep=
843 --all-match
844 --pretty= --name-status --name-only --raw
845 --not --all
846 --left-right --cherry-pick
847 --graph
848 --stat --numstat --shortstat
849 --decorate --diff-filter=
850 --color-words --walk-reflogs
851 "
852 return
853 ;;
854 esac
855 __git_complete_revlist
856 }
858 _git_merge ()
859 {
860 local cur="${COMP_WORDS[COMP_CWORD]}"
861 case "${COMP_WORDS[COMP_CWORD-1]}" in
862 -s|--strategy)
863 __gitcomp "$(__git_merge_strategies)"
864 return
865 esac
866 case "$cur" in
867 --strategy=*)
868 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
869 return
870 ;;
871 --*)
872 __gitcomp "
873 --no-commit --no-stat --log --no-log --squash --strategy
874 "
875 return
876 esac
877 __gitcomp "$(__git_refs)"
878 }
880 _git_merge_base ()
881 {
882 __gitcomp "$(__git_refs)"
883 }
885 _git_name_rev ()
886 {
887 __gitcomp "--tags --all --stdin"
888 }
890 _git_pull ()
891 {
892 local cur="${COMP_WORDS[COMP_CWORD]}"
894 case "${COMP_WORDS[0]},$COMP_CWORD" in
895 git-pull*,1)
896 __gitcomp "$(__git_remotes)"
897 ;;
898 git,2)
899 __gitcomp "$(__git_remotes)"
900 ;;
901 *)
902 local remote
903 case "${COMP_WORDS[0]}" in
904 git-pull) remote="${COMP_WORDS[1]}" ;;
905 git) remote="${COMP_WORDS[2]}" ;;
906 esac
907 __gitcomp "$(__git_refs "$remote")"
908 ;;
909 esac
910 }
912 _git_push ()
913 {
914 local cur="${COMP_WORDS[COMP_CWORD]}"
916 case "${COMP_WORDS[0]},$COMP_CWORD" in
917 git-push*,1)
918 __gitcomp "$(__git_remotes)"
919 ;;
920 git,2)
921 __gitcomp "$(__git_remotes)"
922 ;;
923 *)
924 case "$cur" in
925 *:*)
926 local remote
927 case "${COMP_WORDS[0]}" in
928 git-push) remote="${COMP_WORDS[1]}" ;;
929 git) remote="${COMP_WORDS[2]}" ;;
930 esac
932 local pfx=""
933 case "$COMP_WORDBREAKS" in
934 *:*) : great ;;
935 *) pfx="${cur%%:*}:" ;;
936 esac
938 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
939 ;;
940 +*)
941 __gitcomp "$(__git_refs)" + "${cur#+}"
942 ;;
943 *)
944 __gitcomp "$(__git_refs)"
945 ;;
946 esac
947 ;;
948 esac
949 }
951 _git_rebase ()
952 {
953 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
954 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
955 __gitcomp "--continue --skip --abort"
956 return
957 fi
958 case "${COMP_WORDS[COMP_CWORD-1]}" in
959 -s|--strategy)
960 __gitcomp "$(__git_merge_strategies)"
961 return
962 esac
963 case "$cur" in
964 --strategy=*)
965 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
966 return
967 ;;
968 --*)
969 __gitcomp "--onto --merge --strategy --interactive"
970 return
971 esac
972 __gitcomp "$(__git_refs)"
973 }
975 _git_send_email ()
976 {
977 local cur="${COMP_WORDS[COMP_CWORD]}"
978 case "$cur" in
979 --*)
980 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
981 --dry-run --envelope-sender --from --identity
982 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
983 --no-suppress-from --no-thread --quiet
984 --signed-off-by-cc --smtp-pass --smtp-server
985 --smtp-server-port --smtp-ssl --smtp-user --subject
986 --suppress-cc --suppress-from --thread --to"
987 return
988 ;;
989 esac
990 COMPREPLY=()
991 }
993 _git_config ()
994 {
995 local cur="${COMP_WORDS[COMP_CWORD]}"
996 local prv="${COMP_WORDS[COMP_CWORD-1]}"
997 case "$prv" in
998 branch.*.remote)
999 __gitcomp "$(__git_remotes)"
1000 return
1001 ;;
1002 branch.*.merge)
1003 __gitcomp "$(__git_refs)"
1004 return
1005 ;;
1006 remote.*.fetch)
1007 local remote="${prv#remote.}"
1008 remote="${remote%.fetch}"
1009 __gitcomp "$(__git_refs_remotes "$remote")"
1010 return
1011 ;;
1012 remote.*.push)
1013 local remote="${prv#remote.}"
1014 remote="${remote%.push}"
1015 __gitcomp "$(git --git-dir="$(__gitdir)" \
1016 for-each-ref --format='%(refname):%(refname)' \
1017 refs/heads)"
1018 return
1019 ;;
1020 pull.twohead|pull.octopus)
1021 __gitcomp "$(__git_merge_strategies)"
1022 return
1023 ;;
1024 color.branch|color.diff|color.status)
1025 __gitcomp "always never auto"
1026 return
1027 ;;
1028 color.*.*)
1029 __gitcomp "
1030 black red green yellow blue magenta cyan white
1031 bold dim ul blink reverse
1032 "
1033 return
1034 ;;
1035 *.*)
1036 COMPREPLY=()
1037 return
1038 ;;
1039 esac
1040 case "$cur" in
1041 --*)
1042 __gitcomp "
1043 --global --system --file=
1044 --list --replace-all
1045 --get --get-all --get-regexp
1046 --add --unset --unset-all
1047 --remove-section --rename-section
1048 "
1049 return
1050 ;;
1051 branch.*.*)
1052 local pfx="${cur%.*}."
1053 cur="${cur##*.}"
1054 __gitcomp "remote merge" "$pfx" "$cur"
1055 return
1056 ;;
1057 branch.*)
1058 local pfx="${cur%.*}."
1059 cur="${cur#*.}"
1060 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1061 return
1062 ;;
1063 remote.*.*)
1064 local pfx="${cur%.*}."
1065 cur="${cur##*.}"
1066 __gitcomp "
1067 url fetch push skipDefaultUpdate
1068 receivepack uploadpack tagopt
1069 " "$pfx" "$cur"
1070 return
1071 ;;
1072 remote.*)
1073 local pfx="${cur%.*}."
1074 cur="${cur#*.}"
1075 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1076 return
1077 ;;
1078 esac
1079 __gitcomp "
1080 apply.whitespace
1081 core.fileMode
1082 core.gitProxy
1083 core.ignoreStat
1084 core.preferSymlinkRefs
1085 core.logAllRefUpdates
1086 core.loosecompression
1087 core.repositoryFormatVersion
1088 core.sharedRepository
1089 core.warnAmbiguousRefs
1090 core.compression
1091 core.packedGitWindowSize
1092 core.packedGitLimit
1093 clean.requireForce
1094 color.branch
1095 color.branch.current
1096 color.branch.local
1097 color.branch.remote
1098 color.branch.plain
1099 color.diff
1100 color.diff.plain
1101 color.diff.meta
1102 color.diff.frag
1103 color.diff.old
1104 color.diff.new
1105 color.diff.commit
1106 color.diff.whitespace
1107 color.pager
1108 color.status
1109 color.status.header
1110 color.status.added
1111 color.status.changed
1112 color.status.untracked
1113 diff.renameLimit
1114 diff.renames
1115 fetch.unpackLimit
1116 format.headers
1117 format.subjectprefix
1118 gitcvs.enabled
1119 gitcvs.logfile
1120 gitcvs.allbinary
1121 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1122 gitcvs.dbtablenameprefix
1123 gc.packrefs
1124 gc.reflogexpire
1125 gc.reflogexpireunreachable
1126 gc.rerereresolved
1127 gc.rerereunresolved
1128 http.sslVerify
1129 http.sslCert
1130 http.sslKey
1131 http.sslCAInfo
1132 http.sslCAPath
1133 http.maxRequests
1134 http.lowSpeedLimit
1135 http.lowSpeedTime
1136 http.noEPSV
1137 i18n.commitEncoding
1138 i18n.logOutputEncoding
1139 log.showroot
1140 merge.tool
1141 merge.summary
1142 merge.verbosity
1143 pack.window
1144 pack.depth
1145 pack.windowMemory
1146 pack.compression
1147 pack.deltaCacheSize
1148 pack.deltaCacheLimit
1149 pull.octopus
1150 pull.twohead
1151 repack.useDeltaBaseOffset
1152 showbranch.default
1153 tar.umask
1154 transfer.unpackLimit
1155 receive.unpackLimit
1156 receive.denyNonFastForwards
1157 user.name
1158 user.email
1159 user.signingkey
1160 branch. remote.
1161 "
1162 }
1164 _git_remote ()
1165 {
1166 local subcommands="add rm show prune update"
1167 local subcommand="$(__git_find_subcommand "$subcommands")"
1168 if [ -z "$subcommand" ]; then
1169 __gitcomp "$subcommands"
1170 return
1171 fi
1173 case "$subcommand" in
1174 rm|show|prune)
1175 __gitcomp "$(__git_remotes)"
1176 ;;
1177 update)
1178 local i c='' IFS=$'\n'
1179 for i in $(git --git-dir="$(__gitdir)" config --list); do
1180 case "$i" in
1181 remotes.*)
1182 i="${i#remotes.}"
1183 c="$c ${i/=*/}"
1184 ;;
1185 esac
1186 done
1187 __gitcomp "$c"
1188 ;;
1189 *)
1190 COMPREPLY=()
1191 ;;
1192 esac
1193 }
1195 _git_reset ()
1196 {
1197 __git_has_doubledash && return
1199 local cur="${COMP_WORDS[COMP_CWORD]}"
1200 case "$cur" in
1201 --*)
1202 __gitcomp "--mixed --hard --soft"
1203 return
1204 ;;
1205 esac
1206 __gitcomp "$(__git_refs)"
1207 }
1209 _git_rm ()
1210 {
1211 __git_has_doubledash && return
1213 local cur="${COMP_WORDS[COMP_CWORD]}"
1214 case "$cur" in
1215 --*)
1216 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1217 return
1218 ;;
1219 esac
1220 COMPREPLY=()
1221 }
1223 _git_shortlog ()
1224 {
1225 __git_has_doubledash && return
1227 local cur="${COMP_WORDS[COMP_CWORD]}"
1228 case "$cur" in
1229 --*)
1230 __gitcomp "
1231 --max-count= --max-age= --since= --after=
1232 --min-age= --before= --until=
1233 --no-merges
1234 --author= --committer= --grep=
1235 --all-match
1236 --not --all
1237 --numbered --summary
1238 "
1239 return
1240 ;;
1241 esac
1242 __git_complete_revlist
1243 }
1245 _git_show ()
1246 {
1247 local cur="${COMP_WORDS[COMP_CWORD]}"
1248 case "$cur" in
1249 --pretty=*)
1250 __gitcomp "
1251 oneline short medium full fuller email raw
1252 " "" "${cur##--pretty=}"
1253 return
1254 ;;
1255 --*)
1256 __gitcomp "--pretty="
1257 return
1258 ;;
1259 esac
1260 __git_complete_file
1261 }
1263 _git_show_branch ()
1264 {
1265 local cur="${COMP_WORDS[COMP_CWORD]}"
1266 case "$cur" in
1267 --*)
1268 __gitcomp "
1269 --all --remotes --topo-order --current --more=
1270 --list --independent --merge-base --no-name
1271 --sha1-name --topics --reflog
1272 "
1273 return
1274 ;;
1275 esac
1276 __git_complete_revlist
1277 }
1279 _git_stash ()
1280 {
1281 local subcommands='save list show apply clear drop pop create'
1282 local subcommand="$(__git_find_subcommand "$subcommands")"
1283 if [ -z "$subcommand" ]; then
1284 __gitcomp "$subcommands"
1285 else
1286 local cur="${COMP_WORDS[COMP_CWORD]}"
1287 case "$subcommand,$cur" in
1288 save,--*)
1289 __gitcomp "--keep-index"
1290 ;;
1291 *)
1292 COMPREPLY=()
1293 ;;
1294 esac
1295 fi
1296 }
1298 _git_submodule ()
1299 {
1300 __git_has_doubledash && return
1302 local subcommands="add status init update"
1303 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1304 local cur="${COMP_WORDS[COMP_CWORD]}"
1305 case "$cur" in
1306 --*)
1307 __gitcomp "--quiet --cached"
1308 ;;
1309 *)
1310 __gitcomp "$subcommands"
1311 ;;
1312 esac
1313 return
1314 fi
1315 }
1317 _git_svn ()
1318 {
1319 local subcommands="
1320 init fetch clone rebase dcommit log find-rev
1321 set-tree commit-diff info create-ignore propget
1322 proplist show-ignore show-externals
1323 "
1324 local subcommand="$(__git_find_subcommand "$subcommands")"
1325 if [ -z "$subcommand" ]; then
1326 __gitcomp "$subcommands"
1327 else
1328 local remote_opts="--username= --config-dir= --no-auth-cache"
1329 local fc_opts="
1330 --follow-parent --authors-file= --repack=
1331 --no-metadata --use-svm-props --use-svnsync-props
1332 --log-window-size= --no-checkout --quiet
1333 --repack-flags --user-log-author $remote_opts
1334 "
1335 local init_opts="
1336 --template= --shared= --trunk= --tags=
1337 --branches= --stdlayout --minimize-url
1338 --no-metadata --use-svm-props --use-svnsync-props
1339 --rewrite-root= $remote_opts
1340 "
1341 local cmt_opts="
1342 --edit --rmdir --find-copies-harder --copy-similarity=
1343 "
1345 local cur="${COMP_WORDS[COMP_CWORD]}"
1346 case "$subcommand,$cur" in
1347 fetch,--*)
1348 __gitcomp "--revision= --fetch-all $fc_opts"
1349 ;;
1350 clone,--*)
1351 __gitcomp "--revision= $fc_opts $init_opts"
1352 ;;
1353 init,--*)
1354 __gitcomp "$init_opts"
1355 ;;
1356 dcommit,--*)
1357 __gitcomp "
1358 --merge --strategy= --verbose --dry-run
1359 --fetch-all --no-rebase $cmt_opts $fc_opts
1360 "
1361 ;;
1362 set-tree,--*)
1363 __gitcomp "--stdin $cmt_opts $fc_opts"
1364 ;;
1365 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1366 show-externals,--*)
1367 __gitcomp "--revision="
1368 ;;
1369 log,--*)
1370 __gitcomp "
1371 --limit= --revision= --verbose --incremental
1372 --oneline --show-commit --non-recursive
1373 --authors-file=
1374 "
1375 ;;
1376 rebase,--*)
1377 __gitcomp "
1378 --merge --verbose --strategy= --local
1379 --fetch-all $fc_opts
1380 "
1381 ;;
1382 commit-diff,--*)
1383 __gitcomp "--message= --file= --revision= $cmt_opts"
1384 ;;
1385 info,--*)
1386 __gitcomp "--url"
1387 ;;
1388 *)
1389 COMPREPLY=()
1390 ;;
1391 esac
1392 fi
1393 }
1395 _git_tag ()
1396 {
1397 local i c=1 f=0
1398 while [ $c -lt $COMP_CWORD ]; do
1399 i="${COMP_WORDS[c]}"
1400 case "$i" in
1401 -d|-v)
1402 __gitcomp "$(__git_tags)"
1403 return
1404 ;;
1405 -f)
1406 f=1
1407 ;;
1408 esac
1409 c=$((++c))
1410 done
1412 case "${COMP_WORDS[COMP_CWORD-1]}" in
1413 -m|-F)
1414 COMPREPLY=()
1415 ;;
1416 -*|tag|git-tag)
1417 if [ $f = 1 ]; then
1418 __gitcomp "$(__git_tags)"
1419 else
1420 COMPREPLY=()
1421 fi
1422 ;;
1423 *)
1424 __gitcomp "$(__git_refs)"
1425 ;;
1426 esac
1427 }
1429 _git ()
1430 {
1431 local i c=1 command __git_dir
1433 while [ $c -lt $COMP_CWORD ]; do
1434 i="${COMP_WORDS[c]}"
1435 case "$i" in
1436 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1437 --bare) __git_dir="." ;;
1438 --version|-p|--paginate) ;;
1439 --help) command="help"; break ;;
1440 *) command="$i"; break ;;
1441 esac
1442 c=$((++c))
1443 done
1445 if [ -z "$command" ]; then
1446 case "${COMP_WORDS[COMP_CWORD]}" in
1447 --*=*) COMPREPLY=() ;;
1448 --*) __gitcomp "
1449 --paginate
1450 --no-pager
1451 --git-dir=
1452 --bare
1453 --version
1454 --exec-path
1455 --work-tree=
1456 --help
1457 "
1458 ;;
1459 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1460 esac
1461 return
1462 fi
1464 local expansion=$(__git_aliased_command "$command")
1465 [ "$expansion" ] && command="$expansion"
1467 case "$command" in
1468 am) _git_am ;;
1469 add) _git_add ;;
1470 apply) _git_apply ;;
1471 bisect) _git_bisect ;;
1472 bundle) _git_bundle ;;
1473 branch) _git_branch ;;
1474 checkout) _git_checkout ;;
1475 cherry) _git_cherry ;;
1476 cherry-pick) _git_cherry_pick ;;
1477 commit) _git_commit ;;
1478 config) _git_config ;;
1479 describe) _git_describe ;;
1480 diff) _git_diff ;;
1481 fetch) _git_fetch ;;
1482 format-patch) _git_format_patch ;;
1483 gc) _git_gc ;;
1484 help) _git_help ;;
1485 log) _git_log ;;
1486 ls-remote) _git_ls_remote ;;
1487 ls-tree) _git_ls_tree ;;
1488 merge) _git_merge;;
1489 merge-base) _git_merge_base ;;
1490 name-rev) _git_name_rev ;;
1491 pull) _git_pull ;;
1492 push) _git_push ;;
1493 rebase) _git_rebase ;;
1494 remote) _git_remote ;;
1495 reset) _git_reset ;;
1496 rm) _git_rm ;;
1497 send-email) _git_send_email ;;
1498 shortlog) _git_shortlog ;;
1499 show) _git_show ;;
1500 show-branch) _git_show_branch ;;
1501 stash) _git_stash ;;
1502 submodule) _git_submodule ;;
1503 svn) _git_svn ;;
1504 tag) _git_tag ;;
1505 whatchanged) _git_log ;;
1506 *) COMPREPLY=() ;;
1507 esac
1508 }
1510 _gitk ()
1511 {
1512 __git_has_doubledash && return
1514 local cur="${COMP_WORDS[COMP_CWORD]}"
1515 local g="$(git rev-parse --git-dir 2>/dev/null)"
1516 local merge=""
1517 if [ -f $g/MERGE_HEAD ]; then
1518 merge="--merge"
1519 fi
1520 case "$cur" in
1521 --*)
1522 __gitcomp "--not --all $merge"
1523 return
1524 ;;
1525 esac
1526 __git_complete_revlist
1527 }
1529 complete -o default -o nospace -F _git git
1530 complete -o default -o nospace -F _gitk gitk
1532 # The following are necessary only for Cygwin, and only are needed
1533 # when the user has tab-completed the executable name and consequently
1534 # included the '.exe' suffix.
1535 #
1536 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1537 complete -o default -o nospace -F _git git.exe
1538 fi