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