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