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