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