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 --3way --committer-date-is-author-date --ignore-date
650 --interactive --keep --no-utf8 --signoff --utf8
651 --whitespace=
652 "
653 return
654 esac
655 COMPREPLY=()
656}
657
658_git_apply ()
659{
660 local cur="${COMP_WORDS[COMP_CWORD]}"
661 case "$cur" in
662 --whitespace=*)
663 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
664 return
665 ;;
666 --*)
667 __gitcomp "
668 --stat --numstat --summary --check --index
669 --cached --index-info --reverse --reject --unidiff-zero
670 --apply --no-add --exclude=
671 --whitespace= --inaccurate-eof --verbose
672 "
673 return
674 esac
675 COMPREPLY=()
676}
677
678_git_add ()
679{
680 __git_has_doubledash && return
681
682 local cur="${COMP_WORDS[COMP_CWORD]}"
683 case "$cur" in
684 --*)
685 __gitcomp "
686 --interactive --refresh --patch --update --dry-run
687 --ignore-errors --intent-to-add
688 "
689 return
690 esac
691 COMPREPLY=()
692}
693
694_git_archive ()
695{
696 local cur="${COMP_WORDS[COMP_CWORD]}"
697 case "$cur" in
698 --format=*)
699 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
700 return
701 ;;
702 --remote=*)
703 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
704 return
705 ;;
706 --*)
707 __gitcomp "
708 --format= --list --verbose
709 --prefix= --remote= --exec=
710 "
711 return
712 ;;
713 esac
714 __git_complete_file
715}
716
717_git_bisect ()
718{
719 __git_has_doubledash && return
720
721 local subcommands="start bad good skip reset visualize replay log run"
722 local subcommand="$(__git_find_subcommand "$subcommands")"
723 if [ -z "$subcommand" ]; then
724 __gitcomp "$subcommands"
725 return
726 fi
727
728 case "$subcommand" in
729 bad|good|reset|skip)
730 __gitcomp "$(__git_refs)"
731 ;;
732 *)
733 COMPREPLY=()
734 ;;
735 esac
736}
737
738_git_branch ()
739{
740 local i c=1 only_local_ref="n" has_r="n"
741
742 while [ $c -lt $COMP_CWORD ]; do
743 i="${COMP_WORDS[c]}"
744 case "$i" in
745 -d|-m) only_local_ref="y" ;;
746 -r) has_r="y" ;;
747 esac
748 c=$((++c))
749 done
750
751 case "${COMP_WORDS[COMP_CWORD]}" in
752 --*)
753 __gitcomp "
754 --color --no-color --verbose --abbrev= --no-abbrev
755 --track --no-track --contains --merged --no-merged
756 "
757 ;;
758 *)
759 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
760 __gitcomp "$(__git_heads)"
761 else
762 __gitcomp "$(__git_refs)"
763 fi
764 ;;
765 esac
766}
767
768_git_bundle ()
769{
770 local cmd="${COMP_WORDS[2]}"
771 case "$COMP_CWORD" in
772 2)
773 __gitcomp "create list-heads verify unbundle"
774 ;;
775 3)
776 # looking for a file
777 ;;
778 *)
779 case "$cmd" in
780 create)
781 __git_complete_revlist
782 ;;
783 esac
784 ;;
785 esac
786}
787
788_git_checkout ()
789{
790 __git_has_doubledash && return
791
792 __gitcomp "$(__git_refs)"
793}
794
795_git_cherry ()
796{
797 __gitcomp "$(__git_refs)"
798}
799
800_git_cherry_pick ()
801{
802 local cur="${COMP_WORDS[COMP_CWORD]}"
803 case "$cur" in
804 --*)
805 __gitcomp "--edit --no-commit"
806 ;;
807 *)
808 __gitcomp "$(__git_refs)"
809 ;;
810 esac
811}
812
813_git_clean ()
814{
815 __git_has_doubledash && return
816
817 local cur="${COMP_WORDS[COMP_CWORD]}"
818 case "$cur" in
819 --*)
820 __gitcomp "--dry-run --quiet"
821 return
822 ;;
823 esac
824 COMPREPLY=()
825}
826
827_git_clone ()
828{
829 local cur="${COMP_WORDS[COMP_CWORD]}"
830 case "$cur" in
831 --*)
832 __gitcomp "
833 --local
834 --no-hardlinks
835 --shared
836 --reference
837 --quiet
838 --no-checkout
839 --bare
840 --mirror
841 --origin
842 --upload-pack
843 --template=
844 --depth
845 "
846 return
847 ;;
848 esac
849 COMPREPLY=()
850}
851
852_git_commit ()
853{
854 __git_has_doubledash && return
855
856 local cur="${COMP_WORDS[COMP_CWORD]}"
857 case "$cur" in
858 --*)
859 __gitcomp "
860 --all --author= --signoff --verify --no-verify
861 --edit --amend --include --only --interactive
862 "
863 return
864 esac
865 COMPREPLY=()
866}
867
868_git_describe ()
869{
870 local cur="${COMP_WORDS[COMP_CWORD]}"
871 case "$cur" in
872 --*)
873 __gitcomp "
874 --all --tags --contains --abbrev= --candidates=
875 --exact-match --debug --long --match --always
876 "
877 return
878 esac
879 __gitcomp "$(__git_refs)"
880}
881
882__git_diff_common_options="--stat --numstat --shortstat --summary
883 --patch-with-stat --name-only --name-status --color
884 --no-color --color-words --no-renames --check
885 --full-index --binary --abbrev --diff-filter=
886 --find-copies-harder
887 --text --ignore-space-at-eol --ignore-space-change
888 --ignore-all-space --exit-code --quiet --ext-diff
889 --no-ext-diff
890 --no-prefix --src-prefix= --dst-prefix=
891 --inter-hunk-context=
892 --patience
893 --raw
894"
895
896_git_diff ()
897{
898 __git_has_doubledash && return
899
900 local cur="${COMP_WORDS[COMP_CWORD]}"
901 case "$cur" in
902 --*)
903 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
904 --base --ours --theirs
905 $__git_diff_common_options
906 "
907 return
908 ;;
909 esac
910 __git_complete_file
911}
912
913__git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
914 tkdiff vimdiff gvimdiff xxdiff
915"
916
917_git_difftool ()
918{
919 local cur="${COMP_WORDS[COMP_CWORD]}"
920 case "$cur" in
921 --tool=*)
922 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
923 return
924 ;;
925 --*)
926 __gitcomp "--tool="
927 return
928 ;;
929 esac
930 COMPREPLY=()
931}
932
933__git_fetch_options="
934 --quiet --verbose --append --upload-pack --force --keep --depth=
935 --tags --no-tags
936"
937
938_git_fetch ()
939{
940 local cur="${COMP_WORDS[COMP_CWORD]}"
941 case "$cur" in
942 --*)
943 __gitcomp "$__git_fetch_options"
944 return
945 ;;
946 esac
947 __git_complete_remote_or_refspec
948}
949
950_git_format_patch ()
951{
952 local cur="${COMP_WORDS[COMP_CWORD]}"
953 case "$cur" in
954 --thread=*)
955 __gitcomp "
956 deep shallow
957 " "" "${cur##--thread=}"
958 return
959 ;;
960 --*)
961 __gitcomp "
962 --stdout --attach --no-attach --thread --thread=
963 --output-directory
964 --numbered --start-number
965 --numbered-files
966 --keep-subject
967 --signoff
968 --in-reply-to= --cc=
969 --full-index --binary
970 --not --all
971 --cover-letter
972 --no-prefix --src-prefix= --dst-prefix=
973 --inline --suffix= --ignore-if-in-upstream
974 --subject-prefix=
975 "
976 return
977 ;;
978 esac
979 __git_complete_revlist
980}
981
982_git_fsck ()
983{
984 local cur="${COMP_WORDS[COMP_CWORD]}"
985 case "$cur" in
986 --*)
987 __gitcomp "
988 --tags --root --unreachable --cache --no-reflogs --full
989 --strict --verbose --lost-found
990 "
991 return
992 ;;
993 esac
994 COMPREPLY=()
995}
996
997_git_gc ()
998{
999 local cur="${COMP_WORDS[COMP_CWORD]}"
1000 case "$cur" in
1001 --*)
1002 __gitcomp "--prune --aggressive"
1003 return
1004 ;;
1005 esac
1006 COMPREPLY=()
1007}
1008
1009_git_grep ()
1010{
1011 __git_has_doubledash && return
1012
1013 local cur="${COMP_WORDS[COMP_CWORD]}"
1014 case "$cur" in
1015 --*)
1016 __gitcomp "
1017 --cached
1018 --text --ignore-case --word-regexp --invert-match
1019 --full-name
1020 --extended-regexp --basic-regexp --fixed-strings
1021 --files-with-matches --name-only
1022 --files-without-match
1023 --count
1024 --and --or --not --all-match
1025 "
1026 return
1027 ;;
1028 esac
1029 COMPREPLY=()
1030}
1031
1032_git_help ()
1033{
1034 local cur="${COMP_WORDS[COMP_CWORD]}"
1035 case "$cur" in
1036 --*)
1037 __gitcomp "--all --info --man --web"
1038 return
1039 ;;
1040 esac
1041 __gitcomp "$(__git_all_commands)
1042 attributes cli core-tutorial cvs-migration
1043 diffcore gitk glossary hooks ignore modules
1044 repository-layout tutorial tutorial-2
1045 workflows
1046 "
1047}
1048
1049_git_init ()
1050{
1051 local cur="${COMP_WORDS[COMP_CWORD]}"
1052 case "$cur" in
1053 --shared=*)
1054 __gitcomp "
1055 false true umask group all world everybody
1056 " "" "${cur##--shared=}"
1057 return
1058 ;;
1059 --*)
1060 __gitcomp "--quiet --bare --template= --shared --shared="
1061 return
1062 ;;
1063 esac
1064 COMPREPLY=()
1065}
1066
1067_git_ls_files ()
1068{
1069 __git_has_doubledash && return
1070
1071 local cur="${COMP_WORDS[COMP_CWORD]}"
1072 case "$cur" in
1073 --*)
1074 __gitcomp "--cached --deleted --modified --others --ignored
1075 --stage --directory --no-empty-directory --unmerged
1076 --killed --exclude= --exclude-from=
1077 --exclude-per-directory= --exclude-standard
1078 --error-unmatch --with-tree= --full-name
1079 --abbrev --ignored --exclude-per-directory
1080 "
1081 return
1082 ;;
1083 esac
1084 COMPREPLY=()
1085}
1086
1087_git_ls_remote ()
1088{
1089 __gitcomp "$(__git_remotes)"
1090}
1091
1092_git_ls_tree ()
1093{
1094 __git_complete_file
1095}
1096
1097# Options that go well for log, shortlog and gitk
1098__git_log_common_options="
1099 --not --all
1100 --branches --tags --remotes
1101 --first-parent --no-merges
1102 --max-count=
1103 --max-age= --since= --after=
1104 --min-age= --until= --before=
1105"
1106# Options that go well for log and gitk (not shortlog)
1107__git_log_gitk_options="
1108 --dense --sparse --full-history
1109 --simplify-merges --simplify-by-decoration
1110 --left-right
1111"
1112# Options that go well for log and shortlog (not gitk)
1113__git_log_shortlog_options="
1114 --author= --committer= --grep=
1115 --all-match
1116"
1117
1118__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1119
1120_git_log ()
1121{
1122 __git_has_doubledash && return
1123
1124 local cur="${COMP_WORDS[COMP_CWORD]}"
1125 local g="$(git rev-parse --git-dir 2>/dev/null)"
1126 local merge=""
1127 if [ -f "$g/MERGE_HEAD" ]; then
1128 merge="--merge"
1129 fi
1130 case "$cur" in
1131 --pretty=*)
1132 __gitcomp "$__git_log_pretty_formats
1133 " "" "${cur##--pretty=}"
1134 return
1135 ;;
1136 --format=*)
1137 __gitcomp "$__git_log_pretty_formats
1138 " "" "${cur##--format=}"
1139 return
1140 ;;
1141 --date=*)
1142 __gitcomp "
1143 relative iso8601 rfc2822 short local default
1144 " "" "${cur##--date=}"
1145 return
1146 ;;
1147 --*)
1148 __gitcomp "
1149 $__git_log_common_options
1150 $__git_log_shortlog_options
1151 $__git_log_gitk_options
1152 --root --topo-order --date-order --reverse
1153 --follow
1154 --abbrev-commit --abbrev=
1155 --relative-date --date=
1156 --pretty= --format= --oneline
1157 --cherry-pick
1158 --graph
1159 --decorate
1160 --walk-reflogs
1161 --parents --children
1162 $merge
1163 $__git_diff_common_options
1164 --pickaxe-all --pickaxe-regex
1165 "
1166 return
1167 ;;
1168 esac
1169 __git_complete_revlist
1170}
1171
1172__git_merge_options="
1173 --no-commit --no-stat --log --no-log --squash --strategy
1174 --commit --stat --no-squash --ff --no-ff
1175"
1176
1177_git_merge ()
1178{
1179 __git_complete_strategy && return
1180
1181 local cur="${COMP_WORDS[COMP_CWORD]}"
1182 case "$cur" in
1183 --*)
1184 __gitcomp "$__git_merge_options"
1185 return
1186 esac
1187 __gitcomp "$(__git_refs)"
1188}
1189
1190_git_mergetool ()
1191{
1192 local cur="${COMP_WORDS[COMP_CWORD]}"
1193 case "$cur" in
1194 --tool=*)
1195 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1196 return
1197 ;;
1198 --*)
1199 __gitcomp "--tool="
1200 return
1201 ;;
1202 esac
1203 COMPREPLY=()
1204}
1205
1206_git_merge_base ()
1207{
1208 __gitcomp "$(__git_refs)"
1209}
1210
1211_git_mv ()
1212{
1213 local cur="${COMP_WORDS[COMP_CWORD]}"
1214 case "$cur" in
1215 --*)
1216 __gitcomp "--dry-run"
1217 return
1218 ;;
1219 esac
1220 COMPREPLY=()
1221}
1222
1223_git_name_rev ()
1224{
1225 __gitcomp "--tags --all --stdin"
1226}
1227
1228_git_pull ()
1229{
1230 __git_complete_strategy && return
1231
1232 local cur="${COMP_WORDS[COMP_CWORD]}"
1233 case "$cur" in
1234 --*)
1235 __gitcomp "
1236 --rebase --no-rebase
1237 $__git_merge_options
1238 $__git_fetch_options
1239 "
1240 return
1241 ;;
1242 esac
1243 __git_complete_remote_or_refspec
1244}
1245
1246_git_push ()
1247{
1248 local cur="${COMP_WORDS[COMP_CWORD]}"
1249 case "${COMP_WORDS[COMP_CWORD-1]}" in
1250 --repo)
1251 __gitcomp "$(__git_remotes)"
1252 return
1253 esac
1254 case "$cur" in
1255 --repo=*)
1256 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1257 return
1258 ;;
1259 --*)
1260 __gitcomp "
1261 --all --mirror --tags --dry-run --force --verbose
1262 --receive-pack= --repo=
1263 "
1264 return
1265 ;;
1266 esac
1267 __git_complete_remote_or_refspec
1268}
1269
1270_git_rebase ()
1271{
1272 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1273 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1274 __gitcomp "--continue --skip --abort"
1275 return
1276 fi
1277 __git_complete_strategy && return
1278 case "$cur" in
1279 --*)
1280 __gitcomp "--onto --merge --strategy --interactive"
1281 return
1282 esac
1283 __gitcomp "$(__git_refs)"
1284}
1285
1286_git_send_email ()
1287{
1288 local cur="${COMP_WORDS[COMP_CWORD]}"
1289 case "$cur" in
1290 --*)
1291 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1292 --compose --dry-run --envelope-sender --from --identity
1293 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1294 --no-suppress-from --no-thread --quiet
1295 --signed-off-by-cc --smtp-pass --smtp-server
1296 --smtp-server-port --smtp-ssl --smtp-user --subject
1297 --suppress-cc --suppress-from --thread --to
1298 --validate --no-validate"
1299 return
1300 ;;
1301 esac
1302 COMPREPLY=()
1303}
1304
1305_git_config ()
1306{
1307 local cur="${COMP_WORDS[COMP_CWORD]}"
1308 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1309 case "$prv" in
1310 branch.*.remote)
1311 __gitcomp "$(__git_remotes)"
1312 return
1313 ;;
1314 branch.*.merge)
1315 __gitcomp "$(__git_refs)"
1316 return
1317 ;;
1318 remote.*.fetch)
1319 local remote="${prv#remote.}"
1320 remote="${remote%.fetch}"
1321 __gitcomp "$(__git_refs_remotes "$remote")"
1322 return
1323 ;;
1324 remote.*.push)
1325 local remote="${prv#remote.}"
1326 remote="${remote%.push}"
1327 __gitcomp "$(git --git-dir="$(__gitdir)" \
1328 for-each-ref --format='%(refname):%(refname)' \
1329 refs/heads)"
1330 return
1331 ;;
1332 pull.twohead|pull.octopus)
1333 __gitcomp "$(__git_merge_strategies)"
1334 return
1335 ;;
1336 color.branch|color.diff|color.interactive|color.status|color.ui)
1337 __gitcomp "always never auto"
1338 return
1339 ;;
1340 color.pager)
1341 __gitcomp "false true"
1342 return
1343 ;;
1344 color.*.*)
1345 __gitcomp "
1346 normal black red green yellow blue magenta cyan white
1347 bold dim ul blink reverse
1348 "
1349 return
1350 ;;
1351 *.*)
1352 COMPREPLY=()
1353 return
1354 ;;
1355 esac
1356 case "$cur" in
1357 --*)
1358 __gitcomp "
1359 --global --system --file=
1360 --list --replace-all
1361 --get --get-all --get-regexp
1362 --add --unset --unset-all
1363 --remove-section --rename-section
1364 "
1365 return
1366 ;;
1367 branch.*.*)
1368 local pfx="${cur%.*}."
1369 cur="${cur##*.}"
1370 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1371 return
1372 ;;
1373 branch.*)
1374 local pfx="${cur%.*}."
1375 cur="${cur#*.}"
1376 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1377 return
1378 ;;
1379 remote.*.*)
1380 local pfx="${cur%.*}."
1381 cur="${cur##*.}"
1382 __gitcomp "
1383 url proxy fetch push mirror skipDefaultUpdate
1384 receivepack uploadpack tagopt
1385 " "$pfx" "$cur"
1386 return
1387 ;;
1388 remote.*)
1389 local pfx="${cur%.*}."
1390 cur="${cur#*.}"
1391 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1392 return
1393 ;;
1394 esac
1395 __gitcomp "
1396 apply.whitespace
1397 branch.autosetupmerge
1398 branch.autosetuprebase
1399 clean.requireForce
1400 color.branch
1401 color.branch.current
1402 color.branch.local
1403 color.branch.plain
1404 color.branch.remote
1405 color.diff
1406 color.diff.commit
1407 color.diff.frag
1408 color.diff.meta
1409 color.diff.new
1410 color.diff.old
1411 color.diff.plain
1412 color.diff.whitespace
1413 color.interactive
1414 color.interactive.header
1415 color.interactive.help
1416 color.interactive.prompt
1417 color.pager
1418 color.status
1419 color.status.added
1420 color.status.changed
1421 color.status.header
1422 color.status.nobranch
1423 color.status.untracked
1424 color.status.updated
1425 color.ui
1426 commit.template
1427 core.autocrlf
1428 core.bare
1429 core.compression
1430 core.deltaBaseCacheLimit
1431 core.editor
1432 core.excludesfile
1433 core.fileMode
1434 core.fsyncobjectfiles
1435 core.gitProxy
1436 core.ignoreCygwinFSTricks
1437 core.ignoreStat
1438 core.logAllRefUpdates
1439 core.loosecompression
1440 core.packedGitLimit
1441 core.packedGitWindowSize
1442 core.pager
1443 core.preferSymlinkRefs
1444 core.preloadindex
1445 core.quotepath
1446 core.repositoryFormatVersion
1447 core.safecrlf
1448 core.sharedRepository
1449 core.symlinks
1450 core.trustctime
1451 core.warnAmbiguousRefs
1452 core.whitespace
1453 core.worktree
1454 diff.autorefreshindex
1455 diff.external
1456 diff.mnemonicprefix
1457 diff.renameLimit
1458 diff.renameLimit.
1459 diff.renames
1460 fetch.unpackLimit
1461 format.headers
1462 format.numbered
1463 format.pretty
1464 format.suffix
1465 gc.aggressiveWindow
1466 gc.auto
1467 gc.autopacklimit
1468 gc.packrefs
1469 gc.pruneexpire
1470 gc.reflogexpire
1471 gc.reflogexpireunreachable
1472 gc.rerereresolved
1473 gc.rerereunresolved
1474 gitcvs.allbinary
1475 gitcvs.dbTableNamePrefix
1476 gitcvs.dbdriver
1477 gitcvs.dbname
1478 gitcvs.dbpass
1479 gitcvs.dbuser
1480 gitcvs.enabled
1481 gitcvs.logfile
1482 gitcvs.usecrlfattr
1483 gui.blamehistoryctx
1484 gui.commitmsgwidth
1485 gui.copyblamethreshold
1486 gui.diffcontext
1487 gui.encoding
1488 gui.fastcopyblame
1489 gui.matchtrackingbranch
1490 gui.newbranchtemplate
1491 gui.pruneduringfetch
1492 gui.spellingdictionary
1493 gui.trustmtime
1494 help.autocorrect
1495 help.browser
1496 help.format
1497 http.lowSpeedLimit
1498 http.lowSpeedTime
1499 http.maxRequests
1500 http.noEPSV
1501 http.proxy
1502 http.sslCAInfo
1503 http.sslCAPath
1504 http.sslCert
1505 http.sslKey
1506 http.sslVerify
1507 i18n.commitEncoding
1508 i18n.logOutputEncoding
1509 instaweb.browser
1510 instaweb.httpd
1511 instaweb.local
1512 instaweb.modulepath
1513 instaweb.port
1514 log.date
1515 log.showroot
1516 man.viewer
1517 merge.conflictstyle
1518 merge.log
1519 merge.renameLimit
1520 merge.stat
1521 merge.tool
1522 merge.verbosity
1523 mergetool.keepBackup
1524 pack.compression
1525 pack.deltaCacheLimit
1526 pack.deltaCacheSize
1527 pack.depth
1528 pack.indexVersion
1529 pack.packSizeLimit
1530 pack.threads
1531 pack.window
1532 pack.windowMemory
1533 pull.octopus
1534 pull.twohead
1535 receive.denyCurrentBranch
1536 receive.denyDeletes
1537 receive.denyNonFastForwards
1538 receive.fsckObjects
1539 receive.unpackLimit
1540 repack.usedeltabaseoffset
1541 rerere.autoupdate
1542 rerere.enabled
1543 showbranch.default
1544 status.relativePaths
1545 status.showUntrackedFiles
1546 tar.umask
1547 transfer.unpackLimit
1548 user.email
1549 user.name
1550 user.signingkey
1551 web.browser
1552 branch. remote.
1553 "
1554}
1555
1556_git_remote ()
1557{
1558 local subcommands="add rename rm show prune update set-head"
1559 local subcommand="$(__git_find_subcommand "$subcommands")"
1560 if [ -z "$subcommand" ]; then
1561 __gitcomp "$subcommands"
1562 return
1563 fi
1564
1565 case "$subcommand" in
1566 rename|rm|show|prune)
1567 __gitcomp "$(__git_remotes)"
1568 ;;
1569 update)
1570 local i c='' IFS=$'\n'
1571 for i in $(git --git-dir="$(__gitdir)" config --list); do
1572 case "$i" in
1573 remotes.*)
1574 i="${i#remotes.}"
1575 c="$c ${i/=*/}"
1576 ;;
1577 esac
1578 done
1579 __gitcomp "$c"
1580 ;;
1581 *)
1582 COMPREPLY=()
1583 ;;
1584 esac
1585}
1586
1587_git_reset ()
1588{
1589 __git_has_doubledash && return
1590
1591 local cur="${COMP_WORDS[COMP_CWORD]}"
1592 case "$cur" in
1593 --*)
1594 __gitcomp "--merge --mixed --hard --soft"
1595 return
1596 ;;
1597 esac
1598 __gitcomp "$(__git_refs)"
1599}
1600
1601_git_revert ()
1602{
1603 local cur="${COMP_WORDS[COMP_CWORD]}"
1604 case "$cur" in
1605 --*)
1606 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1607 return
1608 ;;
1609 esac
1610 __gitcomp "$(__git_refs)"
1611}
1612
1613_git_rm ()
1614{
1615 __git_has_doubledash && return
1616
1617 local cur="${COMP_WORDS[COMP_CWORD]}"
1618 case "$cur" in
1619 --*)
1620 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1621 return
1622 ;;
1623 esac
1624 COMPREPLY=()
1625}
1626
1627_git_shortlog ()
1628{
1629 __git_has_doubledash && return
1630
1631 local cur="${COMP_WORDS[COMP_CWORD]}"
1632 case "$cur" in
1633 --*)
1634 __gitcomp "
1635 $__git_log_common_options
1636 $__git_log_shortlog_options
1637 --numbered --summary
1638 "
1639 return
1640 ;;
1641 esac
1642 __git_complete_revlist
1643}
1644
1645_git_show ()
1646{
1647 __git_has_doubledash && return
1648
1649 local cur="${COMP_WORDS[COMP_CWORD]}"
1650 case "$cur" in
1651 --pretty=*)
1652 __gitcomp "$__git_log_pretty_formats
1653 " "" "${cur##--pretty=}"
1654 return
1655 ;;
1656 --format=*)
1657 __gitcomp "$__git_log_pretty_formats
1658 " "" "${cur##--format=}"
1659 return
1660 ;;
1661 --*)
1662 __gitcomp "--pretty= --format=
1663 $__git_diff_common_options
1664 "
1665 return
1666 ;;
1667 esac
1668 __git_complete_file
1669}
1670
1671_git_show_branch ()
1672{
1673 local cur="${COMP_WORDS[COMP_CWORD]}"
1674 case "$cur" in
1675 --*)
1676 __gitcomp "
1677 --all --remotes --topo-order --current --more=
1678 --list --independent --merge-base --no-name
1679 --sha1-name --topics --reflog
1680 "
1681 return
1682 ;;
1683 esac
1684 __git_complete_revlist
1685}
1686
1687_git_stash ()
1688{
1689 local subcommands='save list show apply clear drop pop create branch'
1690 local subcommand="$(__git_find_subcommand "$subcommands")"
1691 if [ -z "$subcommand" ]; then
1692 __gitcomp "$subcommands"
1693 else
1694 local cur="${COMP_WORDS[COMP_CWORD]}"
1695 case "$subcommand,$cur" in
1696 save,--*)
1697 __gitcomp "--keep-index"
1698 ;;
1699 apply,--*)
1700 __gitcomp "--index"
1701 ;;
1702 show,--*|drop,--*|pop,--*|branch,--*)
1703 COMPREPLY=()
1704 ;;
1705 show,*|apply,*|drop,*|pop,*|branch,*)
1706 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1707 | sed -n -e 's/:.*//p')"
1708 ;;
1709 *)
1710 COMPREPLY=()
1711 ;;
1712 esac
1713 fi
1714}
1715
1716_git_submodule ()
1717{
1718 __git_has_doubledash && return
1719
1720 local subcommands="add status init update summary foreach sync"
1721 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1722 local cur="${COMP_WORDS[COMP_CWORD]}"
1723 case "$cur" in
1724 --*)
1725 __gitcomp "--quiet --cached"
1726 ;;
1727 *)
1728 __gitcomp "$subcommands"
1729 ;;
1730 esac
1731 return
1732 fi
1733}
1734
1735_git_svn ()
1736{
1737 local subcommands="
1738 init fetch clone rebase dcommit log find-rev
1739 set-tree commit-diff info create-ignore propget
1740 proplist show-ignore show-externals branch tag blame
1741 migrate
1742 "
1743 local subcommand="$(__git_find_subcommand "$subcommands")"
1744 if [ -z "$subcommand" ]; then
1745 __gitcomp "$subcommands"
1746 else
1747 local remote_opts="--username= --config-dir= --no-auth-cache"
1748 local fc_opts="
1749 --follow-parent --authors-file= --repack=
1750 --no-metadata --use-svm-props --use-svnsync-props
1751 --log-window-size= --no-checkout --quiet
1752 --repack-flags --use-log-author --localtime
1753 --ignore-paths= $remote_opts
1754 "
1755 local init_opts="
1756 --template= --shared= --trunk= --tags=
1757 --branches= --stdlayout --minimize-url
1758 --no-metadata --use-svm-props --use-svnsync-props
1759 --rewrite-root= --prefix= --use-log-author
1760 --add-author-from $remote_opts
1761 "
1762 local cmt_opts="
1763 --edit --rmdir --find-copies-harder --copy-similarity=
1764 "
1765
1766 local cur="${COMP_WORDS[COMP_CWORD]}"
1767 case "$subcommand,$cur" in
1768 fetch,--*)
1769 __gitcomp "--revision= --fetch-all $fc_opts"
1770 ;;
1771 clone,--*)
1772 __gitcomp "--revision= $fc_opts $init_opts"
1773 ;;
1774 init,--*)
1775 __gitcomp "$init_opts"
1776 ;;
1777 dcommit,--*)
1778 __gitcomp "
1779 --merge --strategy= --verbose --dry-run
1780 --fetch-all --no-rebase --commit-url
1781 --revision $cmt_opts $fc_opts
1782 "
1783 ;;
1784 set-tree,--*)
1785 __gitcomp "--stdin $cmt_opts $fc_opts"
1786 ;;
1787 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1788 show-externals,--*)
1789 __gitcomp "--revision="
1790 ;;
1791 log,--*)
1792 __gitcomp "
1793 --limit= --revision= --verbose --incremental
1794 --oneline --show-commit --non-recursive
1795 --authors-file= --color
1796 "
1797 ;;
1798 rebase,--*)
1799 __gitcomp "
1800 --merge --verbose --strategy= --local
1801 --fetch-all --dry-run $fc_opts
1802 "
1803 ;;
1804 commit-diff,--*)
1805 __gitcomp "--message= --file= --revision= $cmt_opts"
1806 ;;
1807 info,--*)
1808 __gitcomp "--url"
1809 ;;
1810 branch,--*)
1811 __gitcomp "--dry-run --message --tag"
1812 ;;
1813 tag,--*)
1814 __gitcomp "--dry-run --message"
1815 ;;
1816 blame,--*)
1817 __gitcomp "--git-format"
1818 ;;
1819 migrate,--*)
1820 __gitcomp "
1821 --config-dir= --ignore-paths= --minimize
1822 --no-auth-cache --username=
1823 "
1824 ;;
1825 *)
1826 COMPREPLY=()
1827 ;;
1828 esac
1829 fi
1830}
1831
1832_git_tag ()
1833{
1834 local i c=1 f=0
1835 while [ $c -lt $COMP_CWORD ]; do
1836 i="${COMP_WORDS[c]}"
1837 case "$i" in
1838 -d|-v)
1839 __gitcomp "$(__git_tags)"
1840 return
1841 ;;
1842 -f)
1843 f=1
1844 ;;
1845 esac
1846 c=$((++c))
1847 done
1848
1849 case "${COMP_WORDS[COMP_CWORD-1]}" in
1850 -m|-F)
1851 COMPREPLY=()
1852 ;;
1853 -*|tag)
1854 if [ $f = 1 ]; then
1855 __gitcomp "$(__git_tags)"
1856 else
1857 COMPREPLY=()
1858 fi
1859 ;;
1860 *)
1861 __gitcomp "$(__git_refs)"
1862 ;;
1863 esac
1864}
1865
1866_git ()
1867{
1868 local i c=1 command __git_dir
1869
1870 while [ $c -lt $COMP_CWORD ]; do
1871 i="${COMP_WORDS[c]}"
1872 case "$i" in
1873 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1874 --bare) __git_dir="." ;;
1875 --version|-p|--paginate) ;;
1876 --help) command="help"; break ;;
1877 *) command="$i"; break ;;
1878 esac
1879 c=$((++c))
1880 done
1881
1882 if [ -z "$command" ]; then
1883 case "${COMP_WORDS[COMP_CWORD]}" in
1884 --*) __gitcomp "
1885 --paginate
1886 --no-pager
1887 --git-dir=
1888 --bare
1889 --version
1890 --exec-path
1891 --html-path
1892 --work-tree=
1893 --help
1894 "
1895 ;;
1896 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1897 esac
1898 return
1899 fi
1900
1901 local expansion=$(__git_aliased_command "$command")
1902 [ "$expansion" ] && command="$expansion"
1903
1904 case "$command" in
1905 am) _git_am ;;
1906 add) _git_add ;;
1907 apply) _git_apply ;;
1908 archive) _git_archive ;;
1909 bisect) _git_bisect ;;
1910 bundle) _git_bundle ;;
1911 branch) _git_branch ;;
1912 checkout) _git_checkout ;;
1913 cherry) _git_cherry ;;
1914 cherry-pick) _git_cherry_pick ;;
1915 clean) _git_clean ;;
1916 clone) _git_clone ;;
1917 commit) _git_commit ;;
1918 config) _git_config ;;
1919 describe) _git_describe ;;
1920 diff) _git_diff ;;
1921 difftool) _git_difftool ;;
1922 fetch) _git_fetch ;;
1923 format-patch) _git_format_patch ;;
1924 fsck) _git_fsck ;;
1925 gc) _git_gc ;;
1926 grep) _git_grep ;;
1927 help) _git_help ;;
1928 init) _git_init ;;
1929 log) _git_log ;;
1930 ls-files) _git_ls_files ;;
1931 ls-remote) _git_ls_remote ;;
1932 ls-tree) _git_ls_tree ;;
1933 merge) _git_merge;;
1934 mergetool) _git_mergetool;;
1935 merge-base) _git_merge_base ;;
1936 mv) _git_mv ;;
1937 name-rev) _git_name_rev ;;
1938 pull) _git_pull ;;
1939 push) _git_push ;;
1940 rebase) _git_rebase ;;
1941 remote) _git_remote ;;
1942 reset) _git_reset ;;
1943 revert) _git_revert ;;
1944 rm) _git_rm ;;
1945 send-email) _git_send_email ;;
1946 shortlog) _git_shortlog ;;
1947 show) _git_show ;;
1948 show-branch) _git_show_branch ;;
1949 stash) _git_stash ;;
1950 stage) _git_add ;;
1951 submodule) _git_submodule ;;
1952 svn) _git_svn ;;
1953 tag) _git_tag ;;
1954 whatchanged) _git_log ;;
1955 *) COMPREPLY=() ;;
1956 esac
1957}
1958
1959_gitk ()
1960{
1961 __git_has_doubledash && return
1962
1963 local cur="${COMP_WORDS[COMP_CWORD]}"
1964 local g="$(__gitdir)"
1965 local merge=""
1966 if [ -f "$g/MERGE_HEAD" ]; then
1967 merge="--merge"
1968 fi
1969 case "$cur" in
1970 --*)
1971 __gitcomp "
1972 $__git_log_common_options
1973 $__git_log_gitk_options
1974 $merge
1975 "
1976 return
1977 ;;
1978 esac
1979 __git_complete_revlist
1980}
1981
1982complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1983 || complete -o default -o nospace -F _git git
1984complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1985 || complete -o default -o nospace -F _gitk gitk
1986
1987# The following are necessary only for Cygwin, and only are needed
1988# when the user has tab-completed the executable name and consequently
1989# included the '.exe' suffix.
1990#
1991if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1992complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1993 || complete -o default -o nospace -F _git git.exe
1994fi