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