Git-aware CGI to provide dumb HTTP transport
[git/dscho.git] / contrib / completion / git-completion.bash
blobd3fec329976c698d55f4873efb2826ed4471919a
1 #!bash
3 # bash completion support for core Git.
5 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
6 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
7 # Distributed under the GNU General Public License, version 2.0.
9 # The contained completion routines provide support for completing:
11 # *) local and remote branch names
12 # *) local and remote tag names
13 # *) .git/remotes file names
14 # *) git 'subcommands'
15 # *) tree paths within 'ref:path/to/file' expressions
16 # *) common --long-options
18 # To use these routines:
20 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
21 # 2) Added the following line to your .bashrc:
22 # source ~/.git-completion.sh
24 # 3) You may want to make sure the git executable is available
25 # in your PATH before this script is sourced, as some caching
26 # is performed while the script loads. If git isn't found
27 # at source time then all lookups will be done on demand,
28 # which may be slightly slower.
30 # 4) Consider changing your PS1 to also show the current branch:
31 # PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
33 # The argument to __git_ps1 will be displayed only if you
34 # are currently in a git repository. The %s token will be
35 # the name of the current branch.
37 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
38 # value, unstaged (*) and staged (+) changes will be shown next
39 # to the branch name. You can configure this per-repository
40 # with the bash.showDirtyState variable, which defaults to true
41 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
43 # You can also see if currently something is stashed, by setting
44 # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
45 # then a '$' will be shown next to the branch name.
47 # If you would like to see if there're untracked files, then you can
48 # set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
49 # untracked files, then a '%' will be shown next to the branch name.
51 # To submit patches:
53 # *) Read Documentation/SubmittingPatches
54 # *) Send all patches to the current maintainer:
56 # "Shawn O. Pearce" <spearce@spearce.org>
58 # *) Always CC the Git mailing list:
60 # git@vger.kernel.org
63 case "$COMP_WORDBREAKS" in
64 *:*) : great ;;
65 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
66 esac
68 # __gitdir accepts 0 or 1 arguments (i.e., location)
69 # returns location of .git repo
70 __gitdir ()
72 if [ -z "${1-}" ]; then
73 if [ -n "${__git_dir-}" ]; then
74 echo "$__git_dir"
75 elif [ -d .git ]; then
76 echo .git
77 else
78 git rev-parse --git-dir 2>/dev/null
80 elif [ -d "$1/.git" ]; then
81 echo "$1/.git"
82 else
83 echo "$1"
87 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
88 # returns text to add to bash PS1 prompt (includes branch name)
89 __git_ps1 ()
91 local g="$(__gitdir)"
92 if [ -n "$g" ]; then
93 local r
94 local b
95 if [ -f "$g/rebase-merge/interactive" ]; then
96 r="|REBASE-i"
97 b="$(cat "$g/rebase-merge/head-name")"
98 elif [ -d "$g/rebase-merge" ]; then
99 r="|REBASE-m"
100 b="$(cat "$g/rebase-merge/head-name")"
101 else
102 if [ -d "$g/rebase-apply" ]; then
103 if [ -f "$g/rebase-apply/rebasing" ]; then
104 r="|REBASE"
105 elif [ -f "$g/rebase-apply/applying" ]; then
106 r="|AM"
107 else
108 r="|AM/REBASE"
110 elif [ -f "$g/MERGE_HEAD" ]; then
111 r="|MERGING"
112 elif [ -f "$g/BISECT_LOG" ]; then
113 r="|BISECTING"
116 b="$(git symbolic-ref HEAD 2>/dev/null)" || {
118 b="$(
119 case "${GIT_PS1_DESCRIBE_STYLE-}" in
120 (contains)
121 git describe --contains HEAD ;;
122 (branch)
123 git describe --contains --all HEAD ;;
124 (describe)
125 git describe HEAD ;;
126 (* | default)
127 git describe --exact-match HEAD ;;
128 esac 2>/dev/null)" ||
130 b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
131 b="unknown"
132 b="($b)"
136 local w
137 local i
138 local s
139 local u
140 local c
142 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
143 if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
144 c="BARE:"
145 else
146 b="GIT_DIR!"
148 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
149 if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
150 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
151 git diff --no-ext-diff --ignore-submodules \
152 --quiet --exit-code || w="*"
153 if git rev-parse --quiet --verify HEAD >/dev/null; then
154 git diff-index --cached --quiet \
155 --ignore-submodules HEAD -- || i="+"
156 else
157 i="#"
161 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
162 git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
165 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
166 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
167 u="%"
172 if [ -n "${1-}" ]; then
173 printf "$1" "$c${b##refs/heads/}$w$i$s$u$r"
174 else
175 printf " (%s)" "$c${b##refs/heads/}$w$i$s$u$r"
180 # __gitcomp_1 requires 2 arguments
181 __gitcomp_1 ()
183 local c IFS=' '$'\t'$'\n'
184 for c in $1; do
185 case "$c$2" in
186 --*=*) printf %s$'\n' "$c$2" ;;
187 *.) printf %s$'\n' "$c$2" ;;
188 *) printf %s$'\n' "$c$2 " ;;
189 esac
190 done
193 # __gitcomp accepts 1, 2, 3, or 4 arguments
194 # generates completion reply with compgen
195 __gitcomp ()
197 local cur="${COMP_WORDS[COMP_CWORD]}"
198 if [ $# -gt 2 ]; then
199 cur="$3"
201 case "$cur" in
202 --*=)
203 COMPREPLY=()
206 local IFS=$'\n'
207 COMPREPLY=($(compgen -P "${2-}" \
208 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
209 -- "$cur"))
211 esac
214 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
215 __git_heads ()
217 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
218 if [ -d "$dir" ]; then
219 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
220 refs/heads
221 return
223 for i in $(git ls-remote "${1-}" 2>/dev/null); do
224 case "$is_hash,$i" in
225 y,*) is_hash=n ;;
226 n,*^{}) is_hash=y ;;
227 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
228 n,*) is_hash=y; echo "$i" ;;
229 esac
230 done
233 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
234 __git_tags ()
236 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
237 if [ -d "$dir" ]; then
238 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
239 refs/tags
240 return
242 for i in $(git ls-remote "${1-}" 2>/dev/null); do
243 case "$is_hash,$i" in
244 y,*) is_hash=n ;;
245 n,*^{}) is_hash=y ;;
246 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
247 n,*) is_hash=y; echo "$i" ;;
248 esac
249 done
252 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
253 __git_refs ()
255 local i is_hash=y dir="$(__gitdir "${1-}")"
256 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
257 if [ -d "$dir" ]; then
258 case "$cur" in
259 refs|refs/*)
260 format="refname"
261 refs="${cur%/*}"
264 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
265 format="refname:short"
266 refs="refs/tags refs/heads refs/remotes"
268 esac
269 git --git-dir="$dir" for-each-ref --format="%($format)" \
270 $refs
271 return
273 for i in $(git ls-remote "$dir" 2>/dev/null); do
274 case "$is_hash,$i" in
275 y,*) is_hash=n ;;
276 n,*^{}) is_hash=y ;;
277 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
278 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
279 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
280 n,*) is_hash=y; echo "$i" ;;
281 esac
282 done
285 # __git_refs2 requires 1 argument (to pass to __git_refs)
286 __git_refs2 ()
288 local i
289 for i in $(__git_refs "$1"); do
290 echo "$i:$i"
291 done
294 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
295 __git_refs_remotes ()
297 local cmd i is_hash=y
298 for i in $(git ls-remote "$1" 2>/dev/null); do
299 case "$is_hash,$i" in
300 n,refs/heads/*)
301 is_hash=y
302 echo "$i:refs/remotes/$1/${i#refs/heads/}"
304 y,*) is_hash=n ;;
305 n,*^{}) is_hash=y ;;
306 n,refs/tags/*) is_hash=y;;
307 n,*) is_hash=y; ;;
308 esac
309 done
312 __git_remotes ()
314 local i ngoff IFS=$'\n' d="$(__gitdir)"
315 shopt -q nullglob || ngoff=1
316 shopt -s nullglob
317 for i in "$d/remotes"/*; do
318 echo ${i#$d/remotes/}
319 done
320 [ "$ngoff" ] && shopt -u nullglob
321 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
322 i="${i#remote.}"
323 echo "${i/.url*/}"
324 done
327 __git_merge_strategies ()
329 if [ -n "${__git_merge_strategylist-}" ]; then
330 echo "$__git_merge_strategylist"
331 return
333 git merge -s help 2>&1 |
334 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
335 s/\.$//
336 s/.*://
337 s/^[ ]*//
338 s/[ ]*$//
342 __git_merge_strategylist=
343 __git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
345 __git_complete_file ()
347 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
348 case "$cur" in
349 ?*:*)
350 ref="${cur%%:*}"
351 cur="${cur#*:}"
352 case "$cur" in
353 ?*/*)
354 pfx="${cur%/*}"
355 cur="${cur##*/}"
356 ls="$ref:$pfx"
357 pfx="$pfx/"
360 ls="$ref"
362 esac
364 case "$COMP_WORDBREAKS" in
365 *:*) : great ;;
366 *) pfx="$ref:$pfx" ;;
367 esac
369 local IFS=$'\n'
370 COMPREPLY=($(compgen -P "$pfx" \
371 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
372 | sed '/^100... blob /{
373 s,^.* ,,
374 s,$, ,
376 /^120000 blob /{
377 s,^.* ,,
378 s,$, ,
380 /^040000 tree /{
381 s,^.* ,,
382 s,$,/,
384 s/^.* //')" \
385 -- "$cur"))
388 __gitcomp "$(__git_refs)"
390 esac
393 __git_complete_revlist ()
395 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
396 case "$cur" in
397 *...*)
398 pfx="${cur%...*}..."
399 cur="${cur#*...}"
400 __gitcomp "$(__git_refs)" "$pfx" "$cur"
402 *..*)
403 pfx="${cur%..*}.."
404 cur="${cur#*..}"
405 __gitcomp "$(__git_refs)" "$pfx" "$cur"
408 __gitcomp "$(__git_refs)"
410 esac
413 __git_complete_remote_or_refspec ()
415 local cmd="${COMP_WORDS[1]}"
416 local cur="${COMP_WORDS[COMP_CWORD]}"
417 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
418 while [ $c -lt $COMP_CWORD ]; do
419 i="${COMP_WORDS[c]}"
420 case "$i" in
421 --all|--mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
422 -*) ;;
423 *) remote="$i"; break ;;
424 esac
425 c=$((++c))
426 done
427 if [ -z "$remote" ]; then
428 __gitcomp "$(__git_remotes)"
429 return
431 if [ $no_complete_refspec = 1 ]; then
432 COMPREPLY=()
433 return
435 [ "$remote" = "." ] && remote=
436 case "$cur" in
437 *:*)
438 case "$COMP_WORDBREAKS" in
439 *:*) : great ;;
440 *) pfx="${cur%%:*}:" ;;
441 esac
442 cur="${cur#*:}"
443 lhs=0
446 pfx="+"
447 cur="${cur#+}"
449 esac
450 case "$cmd" in
451 fetch)
452 if [ $lhs = 1 ]; then
453 __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur"
454 else
455 __gitcomp "$(__git_refs)" "$pfx" "$cur"
458 pull)
459 if [ $lhs = 1 ]; then
460 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
461 else
462 __gitcomp "$(__git_refs)" "$pfx" "$cur"
465 push)
466 if [ $lhs = 1 ]; then
467 __gitcomp "$(__git_refs)" "$pfx" "$cur"
468 else
469 __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
472 esac
475 __git_complete_strategy ()
477 case "${COMP_WORDS[COMP_CWORD-1]}" in
478 -s|--strategy)
479 __gitcomp "$(__git_merge_strategies)"
480 return 0
481 esac
482 local cur="${COMP_WORDS[COMP_CWORD]}"
483 case "$cur" in
484 --strategy=*)
485 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
486 return 0
488 esac
489 return 1
492 __git_all_commands ()
494 if [ -n "${__git_all_commandlist-}" ]; then
495 echo "$__git_all_commandlist"
496 return
498 local i IFS=" "$'\n'
499 for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
501 case $i in
502 *--*) : helper pattern;;
503 *) echo $i;;
504 esac
505 done
507 __git_all_commandlist=
508 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
510 __git_porcelain_commands ()
512 if [ -n "${__git_porcelain_commandlist-}" ]; then
513 echo "$__git_porcelain_commandlist"
514 return
516 local i IFS=" "$'\n'
517 for i in "help" $(__git_all_commands)
519 case $i in
520 *--*) : helper pattern;;
521 applymbox) : ask gittus;;
522 applypatch) : ask gittus;;
523 archimport) : import;;
524 cat-file) : plumbing;;
525 check-attr) : plumbing;;
526 check-ref-format) : plumbing;;
527 checkout-index) : plumbing;;
528 commit-tree) : plumbing;;
529 count-objects) : infrequent;;
530 cvsexportcommit) : export;;
531 cvsimport) : import;;
532 cvsserver) : daemon;;
533 daemon) : daemon;;
534 diff-files) : plumbing;;
535 diff-index) : plumbing;;
536 diff-tree) : plumbing;;
537 fast-import) : import;;
538 fast-export) : export;;
539 fsck-objects) : plumbing;;
540 fetch-pack) : plumbing;;
541 fmt-merge-msg) : plumbing;;
542 for-each-ref) : plumbing;;
543 hash-object) : plumbing;;
544 http-*) : transport;;
545 index-pack) : plumbing;;
546 init-db) : deprecated;;
547 local-fetch) : plumbing;;
548 lost-found) : infrequent;;
549 ls-files) : plumbing;;
550 ls-remote) : plumbing;;
551 ls-tree) : plumbing;;
552 mailinfo) : plumbing;;
553 mailsplit) : plumbing;;
554 merge-*) : plumbing;;
555 mktree) : plumbing;;
556 mktag) : plumbing;;
557 pack-objects) : plumbing;;
558 pack-redundant) : plumbing;;
559 pack-refs) : plumbing;;
560 parse-remote) : plumbing;;
561 patch-id) : plumbing;;
562 peek-remote) : plumbing;;
563 prune) : plumbing;;
564 prune-packed) : plumbing;;
565 quiltimport) : import;;
566 read-tree) : plumbing;;
567 receive-pack) : plumbing;;
568 reflog) : plumbing;;
569 repo-config) : deprecated;;
570 rerere) : plumbing;;
571 rev-list) : plumbing;;
572 rev-parse) : plumbing;;
573 runstatus) : plumbing;;
574 sh-setup) : internal;;
575 shell) : daemon;;
576 show-ref) : plumbing;;
577 send-pack) : plumbing;;
578 show-index) : plumbing;;
579 ssh-*) : transport;;
580 stripspace) : plumbing;;
581 symbolic-ref) : plumbing;;
582 tar-tree) : deprecated;;
583 unpack-file) : plumbing;;
584 unpack-objects) : plumbing;;
585 update-index) : plumbing;;
586 update-ref) : plumbing;;
587 update-server-info) : daemon;;
588 upload-archive) : plumbing;;
589 upload-pack) : plumbing;;
590 write-tree) : plumbing;;
591 var) : infrequent;;
592 verify-pack) : infrequent;;
593 verify-tag) : plumbing;;
594 *) echo $i;;
595 esac
596 done
598 __git_porcelain_commandlist=
599 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
601 __git_aliases ()
603 local i IFS=$'\n'
604 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
605 case "$i" in
606 alias.*)
607 i="${i#alias.}"
608 echo "${i/ */}"
610 esac
611 done
614 # __git_aliased_command requires 1 argument
615 __git_aliased_command ()
617 local word cmdline=$(git --git-dir="$(__gitdir)" \
618 config --get "alias.$1")
619 for word in $cmdline; do
620 if [ "${word##-*}" ]; then
621 echo $word
622 return
624 done
627 # __git_find_on_cmdline requires 1 argument
628 __git_find_on_cmdline ()
630 local word subcommand c=1
632 while [ $c -lt $COMP_CWORD ]; do
633 word="${COMP_WORDS[c]}"
634 for subcommand in $1; do
635 if [ "$subcommand" = "$word" ]; then
636 echo "$subcommand"
637 return
639 done
640 c=$((++c))
641 done
644 __git_has_doubledash ()
646 local c=1
647 while [ $c -lt $COMP_CWORD ]; do
648 if [ "--" = "${COMP_WORDS[c]}" ]; then
649 return 0
651 c=$((++c))
652 done
653 return 1
656 __git_whitespacelist="nowarn warn error error-all fix"
658 _git_am ()
660 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
661 if [ -d "$dir"/rebase-apply ]; then
662 __gitcomp "--skip --resolved --abort"
663 return
665 case "$cur" in
666 --whitespace=*)
667 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
668 return
670 --*)
671 __gitcomp "
672 --3way --committer-date-is-author-date --ignore-date
673 --ignore-whitespace --ignore-space-change
674 --interactive --keep --no-utf8 --signoff --utf8
675 --whitespace= --scissors
677 return
678 esac
679 COMPREPLY=()
682 _git_apply ()
684 local cur="${COMP_WORDS[COMP_CWORD]}"
685 case "$cur" in
686 --whitespace=*)
687 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
688 return
690 --*)
691 __gitcomp "
692 --stat --numstat --summary --check --index
693 --cached --index-info --reverse --reject --unidiff-zero
694 --apply --no-add --exclude=
695 --ignore-whitespace --ignore-space-change
696 --whitespace= --inaccurate-eof --verbose
698 return
699 esac
700 COMPREPLY=()
703 _git_add ()
705 __git_has_doubledash && return
707 local cur="${COMP_WORDS[COMP_CWORD]}"
708 case "$cur" in
709 --*)
710 __gitcomp "
711 --interactive --refresh --patch --update --dry-run
712 --ignore-errors --intent-to-add
714 return
715 esac
716 COMPREPLY=()
719 _git_archive ()
721 local cur="${COMP_WORDS[COMP_CWORD]}"
722 case "$cur" in
723 --format=*)
724 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
725 return
727 --remote=*)
728 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
729 return
731 --*)
732 __gitcomp "
733 --format= --list --verbose
734 --prefix= --remote= --exec=
736 return
738 esac
739 __git_complete_file
742 _git_bisect ()
744 __git_has_doubledash && return
746 local subcommands="start bad good skip reset visualize replay log run"
747 local subcommand="$(__git_find_on_cmdline "$subcommands")"
748 if [ -z "$subcommand" ]; then
749 __gitcomp "$subcommands"
750 return
753 case "$subcommand" in
754 bad|good|reset|skip)
755 __gitcomp "$(__git_refs)"
758 COMPREPLY=()
760 esac
763 _git_branch ()
765 local i c=1 only_local_ref="n" has_r="n"
767 while [ $c -lt $COMP_CWORD ]; do
768 i="${COMP_WORDS[c]}"
769 case "$i" in
770 -d|-m) only_local_ref="y" ;;
771 -r) has_r="y" ;;
772 esac
773 c=$((++c))
774 done
776 case "${COMP_WORDS[COMP_CWORD]}" in
777 --*)
778 __gitcomp "
779 --color --no-color --verbose --abbrev= --no-abbrev
780 --track --no-track --contains --merged --no-merged
784 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
785 __gitcomp "$(__git_heads)"
786 else
787 __gitcomp "$(__git_refs)"
790 esac
793 _git_bundle ()
795 local cmd="${COMP_WORDS[2]}"
796 case "$COMP_CWORD" in
798 __gitcomp "create list-heads verify unbundle"
801 # looking for a file
804 case "$cmd" in
805 create)
806 __git_complete_revlist
808 esac
810 esac
813 _git_checkout ()
815 __git_has_doubledash && return
817 local cur="${COMP_WORDS[COMP_CWORD]}"
818 case "$cur" in
819 --conflict=*)
820 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
822 --*)
823 __gitcomp "
824 --quiet --ours --theirs --track --no-track --merge
825 --conflict= --patch
829 __gitcomp "$(__git_refs)"
831 esac
834 _git_cherry ()
836 __gitcomp "$(__git_refs)"
839 _git_cherry_pick ()
841 local cur="${COMP_WORDS[COMP_CWORD]}"
842 case "$cur" in
843 --*)
844 __gitcomp "--edit --no-commit"
847 __gitcomp "$(__git_refs)"
849 esac
852 _git_clean ()
854 __git_has_doubledash && return
856 local cur="${COMP_WORDS[COMP_CWORD]}"
857 case "$cur" in
858 --*)
859 __gitcomp "--dry-run --quiet"
860 return
862 esac
863 COMPREPLY=()
866 _git_clone ()
868 local cur="${COMP_WORDS[COMP_CWORD]}"
869 case "$cur" in
870 --*)
871 __gitcomp "
872 --local
873 --no-hardlinks
874 --shared
875 --reference
876 --quiet
877 --no-checkout
878 --bare
879 --mirror
880 --origin
881 --upload-pack
882 --template=
883 --depth
885 return
887 esac
888 COMPREPLY=()
891 _git_commit ()
893 __git_has_doubledash && return
895 local cur="${COMP_WORDS[COMP_CWORD]}"
896 case "$cur" in
897 --*)
898 __gitcomp "
899 --all --author= --signoff --verify --no-verify
900 --edit --amend --include --only --interactive
901 --dry-run
903 return
904 esac
905 COMPREPLY=()
908 _git_describe ()
910 local cur="${COMP_WORDS[COMP_CWORD]}"
911 case "$cur" in
912 --*)
913 __gitcomp "
914 --all --tags --contains --abbrev= --candidates=
915 --exact-match --debug --long --match --always
917 return
918 esac
919 __gitcomp "$(__git_refs)"
922 __git_diff_common_options="--stat --numstat --shortstat --summary
923 --patch-with-stat --name-only --name-status --color
924 --no-color --color-words --no-renames --check
925 --full-index --binary --abbrev --diff-filter=
926 --find-copies-harder
927 --text --ignore-space-at-eol --ignore-space-change
928 --ignore-all-space --exit-code --quiet --ext-diff
929 --no-ext-diff
930 --no-prefix --src-prefix= --dst-prefix=
931 --inter-hunk-context=
932 --patience
933 --raw
934 --dirstat --dirstat= --dirstat-by-file
935 --dirstat-by-file= --cumulative
938 _git_diff ()
940 __git_has_doubledash && return
942 local cur="${COMP_WORDS[COMP_CWORD]}"
943 case "$cur" in
944 --*)
945 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
946 --base --ours --theirs
947 $__git_diff_common_options
949 return
951 esac
952 __git_complete_file
955 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
956 tkdiff vimdiff gvimdiff xxdiff araxis
959 _git_difftool ()
961 local cur="${COMP_WORDS[COMP_CWORD]}"
962 case "$cur" in
963 --tool=*)
964 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
965 return
967 --*)
968 __gitcomp "--tool="
969 return
971 esac
972 COMPREPLY=()
975 __git_fetch_options="
976 --quiet --verbose --append --upload-pack --force --keep --depth=
977 --tags --no-tags
980 _git_fetch ()
982 local cur="${COMP_WORDS[COMP_CWORD]}"
983 case "$cur" in
984 --*)
985 __gitcomp "$__git_fetch_options"
986 return
988 esac
989 __git_complete_remote_or_refspec
992 _git_format_patch ()
994 local cur="${COMP_WORDS[COMP_CWORD]}"
995 case "$cur" in
996 --thread=*)
997 __gitcomp "
998 deep shallow
999 " "" "${cur##--thread=}"
1000 return
1002 --*)
1003 __gitcomp "
1004 --stdout --attach --no-attach --thread --thread=
1005 --output-directory
1006 --numbered --start-number
1007 --numbered-files
1008 --keep-subject
1009 --signoff
1010 --in-reply-to= --cc=
1011 --full-index --binary
1012 --not --all
1013 --cover-letter
1014 --no-prefix --src-prefix= --dst-prefix=
1015 --inline --suffix= --ignore-if-in-upstream
1016 --subject-prefix=
1018 return
1020 esac
1021 __git_complete_revlist
1024 _git_fsck ()
1026 local cur="${COMP_WORDS[COMP_CWORD]}"
1027 case "$cur" in
1028 --*)
1029 __gitcomp "
1030 --tags --root --unreachable --cache --no-reflogs --full
1031 --strict --verbose --lost-found
1033 return
1035 esac
1036 COMPREPLY=()
1039 _git_gc ()
1041 local cur="${COMP_WORDS[COMP_CWORD]}"
1042 case "$cur" in
1043 --*)
1044 __gitcomp "--prune --aggressive"
1045 return
1047 esac
1048 COMPREPLY=()
1051 _git_grep ()
1053 __git_has_doubledash && return
1055 local cur="${COMP_WORDS[COMP_CWORD]}"
1056 case "$cur" in
1057 --*)
1058 __gitcomp "
1059 --cached
1060 --text --ignore-case --word-regexp --invert-match
1061 --full-name
1062 --extended-regexp --basic-regexp --fixed-strings
1063 --files-with-matches --name-only
1064 --files-without-match
1065 --max-depth
1066 --count
1067 --and --or --not --all-match
1069 return
1071 esac
1073 __gitcomp "$(__git_refs)"
1076 _git_help ()
1078 local cur="${COMP_WORDS[COMP_CWORD]}"
1079 case "$cur" in
1080 --*)
1081 __gitcomp "--all --info --man --web"
1082 return
1084 esac
1085 __gitcomp "$(__git_all_commands)
1086 attributes cli core-tutorial cvs-migration
1087 diffcore gitk glossary hooks ignore modules
1088 repository-layout tutorial tutorial-2
1089 workflows
1093 _git_init ()
1095 local cur="${COMP_WORDS[COMP_CWORD]}"
1096 case "$cur" in
1097 --shared=*)
1098 __gitcomp "
1099 false true umask group all world everybody
1100 " "" "${cur##--shared=}"
1101 return
1103 --*)
1104 __gitcomp "--quiet --bare --template= --shared --shared="
1105 return
1107 esac
1108 COMPREPLY=()
1111 _git_ls_files ()
1113 __git_has_doubledash && return
1115 local cur="${COMP_WORDS[COMP_CWORD]}"
1116 case "$cur" in
1117 --*)
1118 __gitcomp "--cached --deleted --modified --others --ignored
1119 --stage --directory --no-empty-directory --unmerged
1120 --killed --exclude= --exclude-from=
1121 --exclude-per-directory= --exclude-standard
1122 --error-unmatch --with-tree= --full-name
1123 --abbrev --ignored --exclude-per-directory
1125 return
1127 esac
1128 COMPREPLY=()
1131 _git_ls_remote ()
1133 __gitcomp "$(__git_remotes)"
1136 _git_ls_tree ()
1138 __git_complete_file
1141 # Options that go well for log, shortlog and gitk
1142 __git_log_common_options="
1143 --not --all
1144 --branches --tags --remotes
1145 --first-parent --merges --no-merges
1146 --max-count=
1147 --max-age= --since= --after=
1148 --min-age= --until= --before=
1150 # Options that go well for log and gitk (not shortlog)
1151 __git_log_gitk_options="
1152 --dense --sparse --full-history
1153 --simplify-merges --simplify-by-decoration
1154 --left-right
1156 # Options that go well for log and shortlog (not gitk)
1157 __git_log_shortlog_options="
1158 --author= --committer= --grep=
1159 --all-match
1162 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1163 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1165 _git_log ()
1167 __git_has_doubledash && return
1169 local cur="${COMP_WORDS[COMP_CWORD]}"
1170 local g="$(git rev-parse --git-dir 2>/dev/null)"
1171 local merge=""
1172 if [ -f "$g/MERGE_HEAD" ]; then
1173 merge="--merge"
1175 case "$cur" in
1176 --pretty=*)
1177 __gitcomp "$__git_log_pretty_formats
1178 " "" "${cur##--pretty=}"
1179 return
1181 --format=*)
1182 __gitcomp "$__git_log_pretty_formats
1183 " "" "${cur##--format=}"
1184 return
1186 --date=*)
1187 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1188 return
1190 --decorate=*)
1191 __gitcomp "long short" "" "${cur##--decorate=}"
1192 return
1194 --*)
1195 __gitcomp "
1196 $__git_log_common_options
1197 $__git_log_shortlog_options
1198 $__git_log_gitk_options
1199 --root --topo-order --date-order --reverse
1200 --follow --full-diff
1201 --abbrev-commit --abbrev=
1202 --relative-date --date=
1203 --pretty= --format= --oneline
1204 --cherry-pick
1205 --graph
1206 --decorate --decorate=
1207 --walk-reflogs
1208 --parents --children
1209 $merge
1210 $__git_diff_common_options
1211 --pickaxe-all --pickaxe-regex
1213 return
1215 esac
1216 __git_complete_revlist
1219 __git_merge_options="
1220 --no-commit --no-stat --log --no-log --squash --strategy
1221 --commit --stat --no-squash --ff --no-ff
1224 _git_merge ()
1226 __git_complete_strategy && return
1228 local cur="${COMP_WORDS[COMP_CWORD]}"
1229 case "$cur" in
1230 --*)
1231 __gitcomp "$__git_merge_options"
1232 return
1233 esac
1234 __gitcomp "$(__git_refs)"
1237 _git_mergetool ()
1239 local cur="${COMP_WORDS[COMP_CWORD]}"
1240 case "$cur" in
1241 --tool=*)
1242 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1243 return
1245 --*)
1246 __gitcomp "--tool="
1247 return
1249 esac
1250 COMPREPLY=()
1253 _git_merge_base ()
1255 __gitcomp "$(__git_refs)"
1258 _git_mv ()
1260 local cur="${COMP_WORDS[COMP_CWORD]}"
1261 case "$cur" in
1262 --*)
1263 __gitcomp "--dry-run"
1264 return
1266 esac
1267 COMPREPLY=()
1270 _git_name_rev ()
1272 __gitcomp "--tags --all --stdin"
1275 _git_pull ()
1277 __git_complete_strategy && return
1279 local cur="${COMP_WORDS[COMP_CWORD]}"
1280 case "$cur" in
1281 --*)
1282 __gitcomp "
1283 --rebase --no-rebase
1284 $__git_merge_options
1285 $__git_fetch_options
1287 return
1289 esac
1290 __git_complete_remote_or_refspec
1293 _git_push ()
1295 local cur="${COMP_WORDS[COMP_CWORD]}"
1296 case "${COMP_WORDS[COMP_CWORD-1]}" in
1297 --repo)
1298 __gitcomp "$(__git_remotes)"
1299 return
1300 esac
1301 case "$cur" in
1302 --repo=*)
1303 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1304 return
1306 --*)
1307 __gitcomp "
1308 --all --mirror --tags --dry-run --force --verbose
1309 --receive-pack= --repo=
1311 return
1313 esac
1314 __git_complete_remote_or_refspec
1317 _git_rebase ()
1319 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1320 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1321 __gitcomp "--continue --skip --abort"
1322 return
1324 __git_complete_strategy && return
1325 case "$cur" in
1326 --*)
1327 __gitcomp "--onto --merge --strategy --interactive"
1328 return
1329 esac
1330 __gitcomp "$(__git_refs)"
1333 __git_send_email_confirm_options="always never auto cc compose"
1334 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1336 _git_send_email ()
1338 local cur="${COMP_WORDS[COMP_CWORD]}"
1339 case "$cur" in
1340 --confirm=*)
1341 __gitcomp "
1342 $__git_send_email_confirm_options
1343 " "" "${cur##--confirm=}"
1344 return
1346 --suppress-cc=*)
1347 __gitcomp "
1348 $__git_send_email_suppresscc_options
1349 " "" "${cur##--suppress-cc=}"
1351 return
1353 --smtp-encryption=*)
1354 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1355 return
1357 --*)
1358 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1359 --compose --confirm= --dry-run --envelope-sender
1360 --from --identity
1361 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1362 --no-suppress-from --no-thread --quiet
1363 --signed-off-by-cc --smtp-pass --smtp-server
1364 --smtp-server-port --smtp-encryption= --smtp-user
1365 --subject --suppress-cc= --suppress-from --thread --to
1366 --validate --no-validate"
1367 return
1369 esac
1370 COMPREPLY=()
1373 __git_config_get_set_variables ()
1375 local prevword word config_file= c=$COMP_CWORD
1376 while [ $c -gt 1 ]; do
1377 word="${COMP_WORDS[c]}"
1378 case "$word" in
1379 --global|--system|--file=*)
1380 config_file="$word"
1381 break
1383 -f|--file)
1384 config_file="$word $prevword"
1385 break
1387 esac
1388 prevword=$word
1389 c=$((--c))
1390 done
1392 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1393 while read line
1395 case "$line" in
1396 *.*=*)
1397 echo "${line/=*/}"
1399 esac
1400 done
1403 _git_config ()
1405 local cur="${COMP_WORDS[COMP_CWORD]}"
1406 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1407 case "$prv" in
1408 branch.*.remote)
1409 __gitcomp "$(__git_remotes)"
1410 return
1412 branch.*.merge)
1413 __gitcomp "$(__git_refs)"
1414 return
1416 remote.*.fetch)
1417 local remote="${prv#remote.}"
1418 remote="${remote%.fetch}"
1419 __gitcomp "$(__git_refs_remotes "$remote")"
1420 return
1422 remote.*.push)
1423 local remote="${prv#remote.}"
1424 remote="${remote%.push}"
1425 __gitcomp "$(git --git-dir="$(__gitdir)" \
1426 for-each-ref --format='%(refname):%(refname)' \
1427 refs/heads)"
1428 return
1430 pull.twohead|pull.octopus)
1431 __gitcomp "$(__git_merge_strategies)"
1432 return
1434 color.branch|color.diff|color.interactive|\
1435 color.showbranch|color.status|color.ui)
1436 __gitcomp "always never auto"
1437 return
1439 color.pager)
1440 __gitcomp "false true"
1441 return
1443 color.*.*)
1444 __gitcomp "
1445 normal black red green yellow blue magenta cyan white
1446 bold dim ul blink reverse
1448 return
1450 help.format)
1451 __gitcomp "man info web html"
1452 return
1454 log.date)
1455 __gitcomp "$__git_log_date_formats"
1456 return
1458 sendemail.aliasesfiletype)
1459 __gitcomp "mutt mailrc pine elm gnus"
1460 return
1462 sendemail.confirm)
1463 __gitcomp "$__git_send_email_confirm_options"
1464 return
1466 sendemail.suppresscc)
1467 __gitcomp "$__git_send_email_suppresscc_options"
1468 return
1470 --get|--get-all|--unset|--unset-all)
1471 __gitcomp "$(__git_config_get_set_variables)"
1472 return
1474 *.*)
1475 COMPREPLY=()
1476 return
1478 esac
1479 case "$cur" in
1480 --*)
1481 __gitcomp "
1482 --global --system --file=
1483 --list --replace-all
1484 --get --get-all --get-regexp
1485 --add --unset --unset-all
1486 --remove-section --rename-section
1488 return
1490 branch.*.*)
1491 local pfx="${cur%.*}."
1492 cur="${cur##*.}"
1493 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
1494 return
1496 branch.*)
1497 local pfx="${cur%.*}."
1498 cur="${cur#*.}"
1499 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1500 return
1502 guitool.*.*)
1503 local pfx="${cur%.*}."
1504 cur="${cur##*.}"
1505 __gitcomp "
1506 argprompt cmd confirm needsfile noconsole norescan
1507 prompt revprompt revunmerged title
1508 " "$pfx" "$cur"
1509 return
1511 difftool.*.*)
1512 local pfx="${cur%.*}."
1513 cur="${cur##*.}"
1514 __gitcomp "cmd path" "$pfx" "$cur"
1515 return
1517 man.*.*)
1518 local pfx="${cur%.*}."
1519 cur="${cur##*.}"
1520 __gitcomp "cmd path" "$pfx" "$cur"
1521 return
1523 mergetool.*.*)
1524 local pfx="${cur%.*}."
1525 cur="${cur##*.}"
1526 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1527 return
1529 pager.*)
1530 local pfx="${cur%.*}."
1531 cur="${cur#*.}"
1532 __gitcomp "$(__git_all_commands)" "$pfx" "$cur"
1533 return
1535 remote.*.*)
1536 local pfx="${cur%.*}."
1537 cur="${cur##*.}"
1538 __gitcomp "
1539 url proxy fetch push mirror skipDefaultUpdate
1540 receivepack uploadpack tagopt pushurl
1541 " "$pfx" "$cur"
1542 return
1544 remote.*)
1545 local pfx="${cur%.*}."
1546 cur="${cur#*.}"
1547 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1548 return
1550 url.*.*)
1551 local pfx="${cur%.*}."
1552 cur="${cur##*.}"
1553 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur"
1554 return
1556 esac
1557 __gitcomp "
1558 add.ignore-errors
1559 alias.
1560 apply.ignorewhitespace
1561 apply.whitespace
1562 branch.autosetupmerge
1563 branch.autosetuprebase
1564 clean.requireForce
1565 color.branch
1566 color.branch.current
1567 color.branch.local
1568 color.branch.plain
1569 color.branch.remote
1570 color.diff
1571 color.diff.commit
1572 color.diff.frag
1573 color.diff.meta
1574 color.diff.new
1575 color.diff.old
1576 color.diff.plain
1577 color.diff.whitespace
1578 color.grep
1579 color.grep.external
1580 color.grep.match
1581 color.interactive
1582 color.interactive.header
1583 color.interactive.help
1584 color.interactive.prompt
1585 color.pager
1586 color.showbranch
1587 color.status
1588 color.status.added
1589 color.status.changed
1590 color.status.header
1591 color.status.nobranch
1592 color.status.untracked
1593 color.status.updated
1594 color.ui
1595 commit.template
1596 core.autocrlf
1597 core.bare
1598 core.compression
1599 core.createObject
1600 core.deltaBaseCacheLimit
1601 core.editor
1602 core.excludesfile
1603 core.fileMode
1604 core.fsyncobjectfiles
1605 core.gitProxy
1606 core.ignoreCygwinFSTricks
1607 core.ignoreStat
1608 core.logAllRefUpdates
1609 core.loosecompression
1610 core.packedGitLimit
1611 core.packedGitWindowSize
1612 core.pager
1613 core.preferSymlinkRefs
1614 core.preloadindex
1615 core.quotepath
1616 core.repositoryFormatVersion
1617 core.safecrlf
1618 core.sharedRepository
1619 core.symlinks
1620 core.trustctime
1621 core.warnAmbiguousRefs
1622 core.whitespace
1623 core.worktree
1624 diff.autorefreshindex
1625 diff.external
1626 diff.mnemonicprefix
1627 diff.renameLimit
1628 diff.renameLimit.
1629 diff.renames
1630 diff.suppressBlankEmpty
1631 diff.tool
1632 diff.wordRegex
1633 difftool.
1634 difftool.prompt
1635 fetch.unpackLimit
1636 format.attach
1637 format.cc
1638 format.headers
1639 format.numbered
1640 format.pretty
1641 format.signoff
1642 format.subjectprefix
1643 format.suffix
1644 format.thread
1645 gc.aggressiveWindow
1646 gc.auto
1647 gc.autopacklimit
1648 gc.packrefs
1649 gc.pruneexpire
1650 gc.reflogexpire
1651 gc.reflogexpireunreachable
1652 gc.rerereresolved
1653 gc.rerereunresolved
1654 gitcvs.allbinary
1655 gitcvs.commitmsgannotation
1656 gitcvs.dbTableNamePrefix
1657 gitcvs.dbdriver
1658 gitcvs.dbname
1659 gitcvs.dbpass
1660 gitcvs.dbuser
1661 gitcvs.enabled
1662 gitcvs.logfile
1663 gitcvs.usecrlfattr
1664 guitool.
1665 gui.blamehistoryctx
1666 gui.commitmsgwidth
1667 gui.copyblamethreshold
1668 gui.diffcontext
1669 gui.encoding
1670 gui.fastcopyblame
1671 gui.matchtrackingbranch
1672 gui.newbranchtemplate
1673 gui.pruneduringfetch
1674 gui.spellingdictionary
1675 gui.trustmtime
1676 help.autocorrect
1677 help.browser
1678 help.format
1679 http.lowSpeedLimit
1680 http.lowSpeedTime
1681 http.maxRequests
1682 http.noEPSV
1683 http.proxy
1684 http.sslCAInfo
1685 http.sslCAPath
1686 http.sslCert
1687 http.sslKey
1688 http.sslVerify
1689 i18n.commitEncoding
1690 i18n.logOutputEncoding
1691 imap.folder
1692 imap.host
1693 imap.pass
1694 imap.port
1695 imap.preformattedHTML
1696 imap.sslverify
1697 imap.tunnel
1698 imap.user
1699 instaweb.browser
1700 instaweb.httpd
1701 instaweb.local
1702 instaweb.modulepath
1703 instaweb.port
1704 interactive.singlekey
1705 log.date
1706 log.showroot
1707 mailmap.file
1708 man.
1709 man.viewer
1710 merge.conflictstyle
1711 merge.log
1712 merge.renameLimit
1713 merge.stat
1714 merge.tool
1715 merge.verbosity
1716 mergetool.
1717 mergetool.keepBackup
1718 mergetool.prompt
1719 pack.compression
1720 pack.deltaCacheLimit
1721 pack.deltaCacheSize
1722 pack.depth
1723 pack.indexVersion
1724 pack.packSizeLimit
1725 pack.threads
1726 pack.window
1727 pack.windowMemory
1728 pager.
1729 pull.octopus
1730 pull.twohead
1731 push.default
1732 rebase.stat
1733 receive.denyCurrentBranch
1734 receive.denyDeletes
1735 receive.denyNonFastForwards
1736 receive.fsckObjects
1737 receive.unpackLimit
1738 repack.usedeltabaseoffset
1739 rerere.autoupdate
1740 rerere.enabled
1741 sendemail.aliasesfile
1742 sendemail.aliasesfiletype
1743 sendemail.bcc
1744 sendemail.cc
1745 sendemail.cccmd
1746 sendemail.chainreplyto
1747 sendemail.confirm
1748 sendemail.envelopesender
1749 sendemail.multiedit
1750 sendemail.signedoffbycc
1751 sendemail.smtpencryption
1752 sendemail.smtppass
1753 sendemail.smtpserver
1754 sendemail.smtpserverport
1755 sendemail.smtpuser
1756 sendemail.suppresscc
1757 sendemail.suppressfrom
1758 sendemail.thread
1759 sendemail.to
1760 sendemail.validate
1761 showbranch.default
1762 status.relativePaths
1763 status.showUntrackedFiles
1764 tar.umask
1765 transfer.unpackLimit
1766 url.
1767 user.email
1768 user.name
1769 user.signingkey
1770 web.browser
1771 branch. remote.
1775 _git_remote ()
1777 local subcommands="add rename rm show prune update set-head"
1778 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1779 if [ -z "$subcommand" ]; then
1780 __gitcomp "$subcommands"
1781 return
1784 case "$subcommand" in
1785 rename|rm|show|prune)
1786 __gitcomp "$(__git_remotes)"
1788 update)
1789 local i c='' IFS=$'\n'
1790 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
1791 i="${i#remotes.}"
1792 c="$c ${i/ */}"
1793 done
1794 __gitcomp "$c"
1797 COMPREPLY=()
1799 esac
1802 _git_replace ()
1804 __gitcomp "$(__git_refs)"
1807 _git_reset ()
1809 __git_has_doubledash && return
1811 local cur="${COMP_WORDS[COMP_CWORD]}"
1812 case "$cur" in
1813 --*)
1814 __gitcomp "--merge --mixed --hard --soft --patch"
1815 return
1817 esac
1818 __gitcomp "$(__git_refs)"
1821 _git_revert ()
1823 local cur="${COMP_WORDS[COMP_CWORD]}"
1824 case "$cur" in
1825 --*)
1826 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1827 return
1829 esac
1830 __gitcomp "$(__git_refs)"
1833 _git_rm ()
1835 __git_has_doubledash && return
1837 local cur="${COMP_WORDS[COMP_CWORD]}"
1838 case "$cur" in
1839 --*)
1840 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1841 return
1843 esac
1844 COMPREPLY=()
1847 _git_shortlog ()
1849 __git_has_doubledash && return
1851 local cur="${COMP_WORDS[COMP_CWORD]}"
1852 case "$cur" in
1853 --*)
1854 __gitcomp "
1855 $__git_log_common_options
1856 $__git_log_shortlog_options
1857 --numbered --summary
1859 return
1861 esac
1862 __git_complete_revlist
1865 _git_show ()
1867 __git_has_doubledash && return
1869 local cur="${COMP_WORDS[COMP_CWORD]}"
1870 case "$cur" in
1871 --pretty=*)
1872 __gitcomp "$__git_log_pretty_formats
1873 " "" "${cur##--pretty=}"
1874 return
1876 --format=*)
1877 __gitcomp "$__git_log_pretty_formats
1878 " "" "${cur##--format=}"
1879 return
1881 --*)
1882 __gitcomp "--pretty= --format= --abbrev-commit --oneline
1883 $__git_diff_common_options
1885 return
1887 esac
1888 __git_complete_file
1891 _git_show_branch ()
1893 local cur="${COMP_WORDS[COMP_CWORD]}"
1894 case "$cur" in
1895 --*)
1896 __gitcomp "
1897 --all --remotes --topo-order --current --more=
1898 --list --independent --merge-base --no-name
1899 --color --no-color
1900 --sha1-name --sparse --topics --reflog
1902 return
1904 esac
1905 __git_complete_revlist
1908 _git_stash ()
1910 local cur="${COMP_WORDS[COMP_CWORD]}"
1911 local save_opts='--keep-index --no-keep-index --quiet --patch'
1912 local subcommands='save list show apply clear drop pop create branch'
1913 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1914 if [ -z "$subcommand" ]; then
1915 case "$cur" in
1916 --*)
1917 __gitcomp "$save_opts"
1920 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
1921 __gitcomp "$subcommands"
1922 else
1923 COMPREPLY=()
1926 esac
1927 else
1928 case "$subcommand,$cur" in
1929 save,--*)
1930 __gitcomp "$save_opts"
1932 apply,--*|pop,--*)
1933 __gitcomp "--index --quiet"
1935 show,--*|drop,--*|branch,--*)
1936 COMPREPLY=()
1938 show,*|apply,*|drop,*|pop,*|branch,*)
1939 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1940 | sed -n -e 's/:.*//p')"
1943 COMPREPLY=()
1945 esac
1949 _git_submodule ()
1951 __git_has_doubledash && return
1953 local subcommands="add status init update summary foreach sync"
1954 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1955 local cur="${COMP_WORDS[COMP_CWORD]}"
1956 case "$cur" in
1957 --*)
1958 __gitcomp "--quiet --cached"
1961 __gitcomp "$subcommands"
1963 esac
1964 return
1968 _git_svn ()
1970 local subcommands="
1971 init fetch clone rebase dcommit log find-rev
1972 set-tree commit-diff info create-ignore propget
1973 proplist show-ignore show-externals branch tag blame
1974 migrate
1976 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1977 if [ -z "$subcommand" ]; then
1978 __gitcomp "$subcommands"
1979 else
1980 local remote_opts="--username= --config-dir= --no-auth-cache"
1981 local fc_opts="
1982 --follow-parent --authors-file= --repack=
1983 --no-metadata --use-svm-props --use-svnsync-props
1984 --log-window-size= --no-checkout --quiet
1985 --repack-flags --use-log-author --localtime
1986 --ignore-paths= $remote_opts
1988 local init_opts="
1989 --template= --shared= --trunk= --tags=
1990 --branches= --stdlayout --minimize-url
1991 --no-metadata --use-svm-props --use-svnsync-props
1992 --rewrite-root= --prefix= --use-log-author
1993 --add-author-from $remote_opts
1995 local cmt_opts="
1996 --edit --rmdir --find-copies-harder --copy-similarity=
1999 local cur="${COMP_WORDS[COMP_CWORD]}"
2000 case "$subcommand,$cur" in
2001 fetch,--*)
2002 __gitcomp "--revision= --fetch-all $fc_opts"
2004 clone,--*)
2005 __gitcomp "--revision= $fc_opts $init_opts"
2007 init,--*)
2008 __gitcomp "$init_opts"
2010 dcommit,--*)
2011 __gitcomp "
2012 --merge --strategy= --verbose --dry-run
2013 --fetch-all --no-rebase --commit-url
2014 --revision $cmt_opts $fc_opts
2017 set-tree,--*)
2018 __gitcomp "--stdin $cmt_opts $fc_opts"
2020 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2021 show-externals,--*)
2022 __gitcomp "--revision="
2024 log,--*)
2025 __gitcomp "
2026 --limit= --revision= --verbose --incremental
2027 --oneline --show-commit --non-recursive
2028 --authors-file= --color
2031 rebase,--*)
2032 __gitcomp "
2033 --merge --verbose --strategy= --local
2034 --fetch-all --dry-run $fc_opts
2037 commit-diff,--*)
2038 __gitcomp "--message= --file= --revision= $cmt_opts"
2040 info,--*)
2041 __gitcomp "--url"
2043 branch,--*)
2044 __gitcomp "--dry-run --message --tag"
2046 tag,--*)
2047 __gitcomp "--dry-run --message"
2049 blame,--*)
2050 __gitcomp "--git-format"
2052 migrate,--*)
2053 __gitcomp "
2054 --config-dir= --ignore-paths= --minimize
2055 --no-auth-cache --username=
2059 COMPREPLY=()
2061 esac
2065 _git_tag ()
2067 local i c=1 f=0
2068 while [ $c -lt $COMP_CWORD ]; do
2069 i="${COMP_WORDS[c]}"
2070 case "$i" in
2071 -d|-v)
2072 __gitcomp "$(__git_tags)"
2073 return
2078 esac
2079 c=$((++c))
2080 done
2082 case "${COMP_WORDS[COMP_CWORD-1]}" in
2083 -m|-F)
2084 COMPREPLY=()
2086 -*|tag)
2087 if [ $f = 1 ]; then
2088 __gitcomp "$(__git_tags)"
2089 else
2090 COMPREPLY=()
2094 __gitcomp "$(__git_refs)"
2096 esac
2099 _git ()
2101 local i c=1 command __git_dir
2103 while [ $c -lt $COMP_CWORD ]; do
2104 i="${COMP_WORDS[c]}"
2105 case "$i" in
2106 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2107 --bare) __git_dir="." ;;
2108 --version|-p|--paginate) ;;
2109 --help) command="help"; break ;;
2110 *) command="$i"; break ;;
2111 esac
2112 c=$((++c))
2113 done
2115 if [ -z "$command" ]; then
2116 case "${COMP_WORDS[COMP_CWORD]}" in
2117 --*) __gitcomp "
2118 --paginate
2119 --no-pager
2120 --git-dir=
2121 --bare
2122 --version
2123 --exec-path
2124 --html-path
2125 --work-tree=
2126 --help
2129 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
2130 esac
2131 return
2134 local expansion=$(__git_aliased_command "$command")
2135 [ "$expansion" ] && command="$expansion"
2137 case "$command" in
2138 am) _git_am ;;
2139 add) _git_add ;;
2140 apply) _git_apply ;;
2141 archive) _git_archive ;;
2142 bisect) _git_bisect ;;
2143 bundle) _git_bundle ;;
2144 branch) _git_branch ;;
2145 checkout) _git_checkout ;;
2146 cherry) _git_cherry ;;
2147 cherry-pick) _git_cherry_pick ;;
2148 clean) _git_clean ;;
2149 clone) _git_clone ;;
2150 commit) _git_commit ;;
2151 config) _git_config ;;
2152 describe) _git_describe ;;
2153 diff) _git_diff ;;
2154 difftool) _git_difftool ;;
2155 fetch) _git_fetch ;;
2156 format-patch) _git_format_patch ;;
2157 fsck) _git_fsck ;;
2158 gc) _git_gc ;;
2159 grep) _git_grep ;;
2160 help) _git_help ;;
2161 init) _git_init ;;
2162 log) _git_log ;;
2163 ls-files) _git_ls_files ;;
2164 ls-remote) _git_ls_remote ;;
2165 ls-tree) _git_ls_tree ;;
2166 merge) _git_merge;;
2167 mergetool) _git_mergetool;;
2168 merge-base) _git_merge_base ;;
2169 mv) _git_mv ;;
2170 name-rev) _git_name_rev ;;
2171 pull) _git_pull ;;
2172 push) _git_push ;;
2173 rebase) _git_rebase ;;
2174 remote) _git_remote ;;
2175 replace) _git_replace ;;
2176 reset) _git_reset ;;
2177 revert) _git_revert ;;
2178 rm) _git_rm ;;
2179 send-email) _git_send_email ;;
2180 shortlog) _git_shortlog ;;
2181 show) _git_show ;;
2182 show-branch) _git_show_branch ;;
2183 stash) _git_stash ;;
2184 stage) _git_add ;;
2185 submodule) _git_submodule ;;
2186 svn) _git_svn ;;
2187 tag) _git_tag ;;
2188 whatchanged) _git_log ;;
2189 *) COMPREPLY=() ;;
2190 esac
2193 _gitk ()
2195 __git_has_doubledash && return
2197 local cur="${COMP_WORDS[COMP_CWORD]}"
2198 local g="$(__gitdir)"
2199 local merge=""
2200 if [ -f "$g/MERGE_HEAD" ]; then
2201 merge="--merge"
2203 case "$cur" in
2204 --*)
2205 __gitcomp "
2206 $__git_log_common_options
2207 $__git_log_gitk_options
2208 $merge
2210 return
2212 esac
2213 __git_complete_revlist
2216 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2217 || complete -o default -o nospace -F _git git
2218 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2219 || complete -o default -o nospace -F _gitk gitk
2221 # The following are necessary only for Cygwin, and only are needed
2222 # when the user has tab-completed the executable name and consequently
2223 # included the '.exe' suffix.
2225 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2226 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2227 || complete -o default -o nospace -F _git git.exe