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