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 __git_has_doubledash && return
962
963 local cur="${COMP_WORDS[COMP_CWORD]}"
964 case "$cur" in
965 --tool=*)
966 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
967 return
968 ;;
969 --*)
970 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
971 --base --ours --theirs
972 --no-renames --diff-filter= --find-copies-harder
973 --relative --ignore-submodules
974 --tool="
975 return
976 ;;
977 esac
978 __git_complete_file
979}
980
981__git_fetch_options="
982 --quiet --verbose --append --upload-pack --force --keep --depth=
983 --tags --no-tags
984"
985
986_git_fetch ()
987{
988 local cur="${COMP_WORDS[COMP_CWORD]}"
989 case "$cur" in
990 --*)
991 __gitcomp "$__git_fetch_options"
992 return
993 ;;
994 esac
995 __git_complete_remote_or_refspec
996}
997
998_git_format_patch ()
999{
1000 local cur="${COMP_WORDS[COMP_CWORD]}"
1001 case "$cur" in
1002 --thread=*)
1003 __gitcomp "
1004 deep shallow
1005 " "" "${cur##--thread=}"
1006 return
1007 ;;
1008 --*)
1009 __gitcomp "
1010 --stdout --attach --no-attach --thread --thread=
1011 --output-directory
1012 --numbered --start-number
1013 --numbered-files
1014 --keep-subject
1015 --signoff
1016 --in-reply-to= --cc=
1017 --full-index --binary
1018 --not --all
1019 --cover-letter
1020 --no-prefix --src-prefix= --dst-prefix=
1021 --inline --suffix= --ignore-if-in-upstream
1022 --subject-prefix=
1023 "
1024 return
1025 ;;
1026 esac
1027 __git_complete_revlist
1028}
1029
1030_git_fsck ()
1031{
1032 local cur="${COMP_WORDS[COMP_CWORD]}"
1033 case "$cur" in
1034 --*)
1035 __gitcomp "
1036 --tags --root --unreachable --cache --no-reflogs --full
1037 --strict --verbose --lost-found
1038 "
1039 return
1040 ;;
1041 esac
1042 COMPREPLY=()
1043}
1044
1045_git_gc ()
1046{
1047 local cur="${COMP_WORDS[COMP_CWORD]}"
1048 case "$cur" in
1049 --*)
1050 __gitcomp "--prune --aggressive"
1051 return
1052 ;;
1053 esac
1054 COMPREPLY=()
1055}
1056
1057_git_grep ()
1058{
1059 __git_has_doubledash && return
1060
1061 local cur="${COMP_WORDS[COMP_CWORD]}"
1062 case "$cur" in
1063 --*)
1064 __gitcomp "
1065 --cached
1066 --text --ignore-case --word-regexp --invert-match
1067 --full-name
1068 --extended-regexp --basic-regexp --fixed-strings
1069 --files-with-matches --name-only
1070 --files-without-match
1071 --max-depth
1072 --count
1073 --and --or --not --all-match
1074 "
1075 return
1076 ;;
1077 esac
1078
1079 __gitcomp "$(__git_refs)"
1080}
1081
1082_git_help ()
1083{
1084 local cur="${COMP_WORDS[COMP_CWORD]}"
1085 case "$cur" in
1086 --*)
1087 __gitcomp "--all --info --man --web"
1088 return
1089 ;;
1090 esac
1091 __gitcomp "$(__git_all_commands)
1092 attributes cli core-tutorial cvs-migration
1093 diffcore gitk glossary hooks ignore modules
1094 repository-layout tutorial tutorial-2
1095 workflows
1096 "
1097}
1098
1099_git_init ()
1100{
1101 local cur="${COMP_WORDS[COMP_CWORD]}"
1102 case "$cur" in
1103 --shared=*)
1104 __gitcomp "
1105 false true umask group all world everybody
1106 " "" "${cur##--shared=}"
1107 return
1108 ;;
1109 --*)
1110 __gitcomp "--quiet --bare --template= --shared --shared="
1111 return
1112 ;;
1113 esac
1114 COMPREPLY=()
1115}
1116
1117_git_ls_files ()
1118{
1119 __git_has_doubledash && return
1120
1121 local cur="${COMP_WORDS[COMP_CWORD]}"
1122 case "$cur" in
1123 --*)
1124 __gitcomp "--cached --deleted --modified --others --ignored
1125 --stage --directory --no-empty-directory --unmerged
1126 --killed --exclude= --exclude-from=
1127 --exclude-per-directory= --exclude-standard
1128 --error-unmatch --with-tree= --full-name
1129 --abbrev --ignored --exclude-per-directory
1130 "
1131 return
1132 ;;
1133 esac
1134 COMPREPLY=()
1135}
1136
1137_git_ls_remote ()
1138{
1139 __gitcomp "$(__git_remotes)"
1140}
1141
1142_git_ls_tree ()
1143{
1144 __git_complete_file
1145}
1146
1147# Options that go well for log, shortlog and gitk
1148__git_log_common_options="
1149 --not --all
1150 --branches --tags --remotes
1151 --first-parent --merges --no-merges
1152 --max-count=
1153 --max-age= --since= --after=
1154 --min-age= --until= --before=
1155"
1156# Options that go well for log and gitk (not shortlog)
1157__git_log_gitk_options="
1158 --dense --sparse --full-history
1159 --simplify-merges --simplify-by-decoration
1160 --left-right
1161"
1162# Options that go well for log and shortlog (not gitk)
1163__git_log_shortlog_options="
1164 --author= --committer= --grep=
1165 --all-match
1166"
1167
1168__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1169__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1170
1171_git_log ()
1172{
1173 __git_has_doubledash && return
1174
1175 local cur="${COMP_WORDS[COMP_CWORD]}"
1176 local g="$(git rev-parse --git-dir 2>/dev/null)"
1177 local merge=""
1178 if [ -f "$g/MERGE_HEAD" ]; then
1179 merge="--merge"
1180 fi
1181 case "$cur" in
1182 --pretty=*)
1183 __gitcomp "$__git_log_pretty_formats
1184 " "" "${cur##--pretty=}"
1185 return
1186 ;;
1187 --format=*)
1188 __gitcomp "$__git_log_pretty_formats
1189 " "" "${cur##--format=}"
1190 return
1191 ;;
1192 --date=*)
1193 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1194 return
1195 ;;
1196 --decorate=*)
1197 __gitcomp "long short" "" "${cur##--decorate=}"
1198 return
1199 ;;
1200 --*)
1201 __gitcomp "
1202 $__git_log_common_options
1203 $__git_log_shortlog_options
1204 $__git_log_gitk_options
1205 --root --topo-order --date-order --reverse
1206 --follow --full-diff
1207 --abbrev-commit --abbrev=
1208 --relative-date --date=
1209 --pretty= --format= --oneline
1210 --cherry-pick
1211 --graph
1212 --decorate --decorate=
1213 --walk-reflogs
1214 --parents --children
1215 $merge
1216 $__git_diff_common_options
1217 --pickaxe-all --pickaxe-regex
1218 "
1219 return
1220 ;;
1221 esac
1222 __git_complete_revlist
1223}
1224
1225__git_merge_options="
1226 --no-commit --no-stat --log --no-log --squash --strategy
1227 --commit --stat --no-squash --ff --no-ff
1228"
1229
1230_git_merge ()
1231{
1232 __git_complete_strategy && return
1233
1234 local cur="${COMP_WORDS[COMP_CWORD]}"
1235 case "$cur" in
1236 --*)
1237 __gitcomp "$__git_merge_options"
1238 return
1239 esac
1240 __gitcomp "$(__git_refs)"
1241}
1242
1243_git_mergetool ()
1244{
1245 local cur="${COMP_WORDS[COMP_CWORD]}"
1246 case "$cur" in
1247 --tool=*)
1248 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1249 return
1250 ;;
1251 --*)
1252 __gitcomp "--tool="
1253 return
1254 ;;
1255 esac
1256 COMPREPLY=()
1257}
1258
1259_git_merge_base ()
1260{
1261 __gitcomp "$(__git_refs)"
1262}
1263
1264_git_mv ()
1265{
1266 local cur="${COMP_WORDS[COMP_CWORD]}"
1267 case "$cur" in
1268 --*)
1269 __gitcomp "--dry-run"
1270 return
1271 ;;
1272 esac
1273 COMPREPLY=()
1274}
1275
1276_git_name_rev ()
1277{
1278 __gitcomp "--tags --all --stdin"
1279}
1280
1281_git_pull ()
1282{
1283 __git_complete_strategy && return
1284
1285 local cur="${COMP_WORDS[COMP_CWORD]}"
1286 case "$cur" in
1287 --*)
1288 __gitcomp "
1289 --rebase --no-rebase
1290 $__git_merge_options
1291 $__git_fetch_options
1292 "
1293 return
1294 ;;
1295 esac
1296 __git_complete_remote_or_refspec
1297}
1298
1299_git_push ()
1300{
1301 local cur="${COMP_WORDS[COMP_CWORD]}"
1302 case "${COMP_WORDS[COMP_CWORD-1]}" in
1303 --repo)
1304 __gitcomp "$(__git_remotes)"
1305 return
1306 esac
1307 case "$cur" in
1308 --repo=*)
1309 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1310 return
1311 ;;
1312 --*)
1313 __gitcomp "
1314 --all --mirror --tags --dry-run --force --verbose
1315 --receive-pack= --repo=
1316 "
1317 return
1318 ;;
1319 esac
1320 __git_complete_remote_or_refspec
1321}
1322
1323_git_rebase ()
1324{
1325 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1326 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1327 __gitcomp "--continue --skip --abort"
1328 return
1329 fi
1330 __git_complete_strategy && return
1331 case "$cur" in
1332 --whitespace=*)
1333 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1334 return
1335 ;;
1336 --*)
1337 __gitcomp "
1338 --onto --merge --strategy --interactive
1339 --preserve-merges --stat --no-stat
1340 --committer-date-is-author-date --ignore-date
1341 --ignore-whitespace --whitespace=
1342 "
1343
1344 return
1345 esac
1346 __gitcomp "$(__git_refs)"
1347}
1348
1349__git_send_email_confirm_options="always never auto cc compose"
1350__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1351
1352_git_send_email ()
1353{
1354 local cur="${COMP_WORDS[COMP_CWORD]}"
1355 case "$cur" in
1356 --confirm=*)
1357 __gitcomp "
1358 $__git_send_email_confirm_options
1359 " "" "${cur##--confirm=}"
1360 return
1361 ;;
1362 --suppress-cc=*)
1363 __gitcomp "
1364 $__git_send_email_suppresscc_options
1365 " "" "${cur##--suppress-cc=}"
1366
1367 return
1368 ;;
1369 --smtp-encryption=*)
1370 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1371 return
1372 ;;
1373 --*)
1374 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1375 --compose --confirm= --dry-run --envelope-sender
1376 --from --identity
1377 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1378 --no-suppress-from --no-thread --quiet
1379 --signed-off-by-cc --smtp-pass --smtp-server
1380 --smtp-server-port --smtp-encryption= --smtp-user
1381 --subject --suppress-cc= --suppress-from --thread --to
1382 --validate --no-validate"
1383 return
1384 ;;
1385 esac
1386 COMPREPLY=()
1387}
1388
1389__git_config_get_set_variables ()
1390{
1391 local prevword word config_file= c=$COMP_CWORD
1392 while [ $c -gt 1 ]; do
1393 word="${COMP_WORDS[c]}"
1394 case "$word" in
1395 --global|--system|--file=*)
1396 config_file="$word"
1397 break
1398 ;;
1399 -f|--file)
1400 config_file="$word $prevword"
1401 break
1402 ;;
1403 esac
1404 prevword=$word
1405 c=$((--c))
1406 done
1407
1408 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1409 while read line
1410 do
1411 case "$line" in
1412 *.*=*)
1413 echo "${line/=*/}"
1414 ;;
1415 esac
1416 done
1417}
1418
1419_git_config ()
1420{
1421 local cur="${COMP_WORDS[COMP_CWORD]}"
1422 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1423 case "$prv" in
1424 branch.*.remote)
1425 __gitcomp "$(__git_remotes)"
1426 return
1427 ;;
1428 branch.*.merge)
1429 __gitcomp "$(__git_refs)"
1430 return
1431 ;;
1432 remote.*.fetch)
1433 local remote="${prv#remote.}"
1434 remote="${remote%.fetch}"
1435 __gitcomp "$(__git_refs_remotes "$remote")"
1436 return
1437 ;;
1438 remote.*.push)
1439 local remote="${prv#remote.}"
1440 remote="${remote%.push}"
1441 __gitcomp "$(git --git-dir="$(__gitdir)" \
1442 for-each-ref --format='%(refname):%(refname)' \
1443 refs/heads)"
1444 return
1445 ;;
1446 pull.twohead|pull.octopus)
1447 __gitcomp "$(__git_merge_strategies)"
1448 return
1449 ;;
1450 color.branch|color.diff|color.interactive|\
1451 color.showbranch|color.status|color.ui)
1452 __gitcomp "always never auto"
1453 return
1454 ;;
1455 color.pager)
1456 __gitcomp "false true"
1457 return
1458 ;;
1459 color.*.*)
1460 __gitcomp "
1461 normal black red green yellow blue magenta cyan white
1462 bold dim ul blink reverse
1463 "
1464 return
1465 ;;
1466 help.format)
1467 __gitcomp "man info web html"
1468 return
1469 ;;
1470 log.date)
1471 __gitcomp "$__git_log_date_formats"
1472 return
1473 ;;
1474 sendemail.aliasesfiletype)
1475 __gitcomp "mutt mailrc pine elm gnus"
1476 return
1477 ;;
1478 sendemail.confirm)
1479 __gitcomp "$__git_send_email_confirm_options"
1480 return
1481 ;;
1482 sendemail.suppresscc)
1483 __gitcomp "$__git_send_email_suppresscc_options"
1484 return
1485 ;;
1486 --get|--get-all|--unset|--unset-all)
1487 __gitcomp "$(__git_config_get_set_variables)"
1488 return
1489 ;;
1490 *.*)
1491 COMPREPLY=()
1492 return
1493 ;;
1494 esac
1495 case "$cur" in
1496 --*)
1497 __gitcomp "
1498 --global --system --file=
1499 --list --replace-all
1500 --get --get-all --get-regexp
1501 --add --unset --unset-all
1502 --remove-section --rename-section
1503 "
1504 return
1505 ;;
1506 branch.*.*)
1507 local pfx="${cur%.*}."
1508 cur="${cur##*.}"
1509 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
1510 return
1511 ;;
1512 branch.*)
1513 local pfx="${cur%.*}."
1514 cur="${cur#*.}"
1515 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1516 return
1517 ;;
1518 guitool.*.*)
1519 local pfx="${cur%.*}."
1520 cur="${cur##*.}"
1521 __gitcomp "
1522 argprompt cmd confirm needsfile noconsole norescan
1523 prompt revprompt revunmerged title
1524 " "$pfx" "$cur"
1525 return
1526 ;;
1527 difftool.*.*)
1528 local pfx="${cur%.*}."
1529 cur="${cur##*.}"
1530 __gitcomp "cmd path" "$pfx" "$cur"
1531 return
1532 ;;
1533 man.*.*)
1534 local pfx="${cur%.*}."
1535 cur="${cur##*.}"
1536 __gitcomp "cmd path" "$pfx" "$cur"
1537 return
1538 ;;
1539 mergetool.*.*)
1540 local pfx="${cur%.*}."
1541 cur="${cur##*.}"
1542 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1543 return
1544 ;;
1545 pager.*)
1546 local pfx="${cur%.*}."
1547 cur="${cur#*.}"
1548 __gitcomp "$(__git_all_commands)" "$pfx" "$cur"
1549 return
1550 ;;
1551 remote.*.*)
1552 local pfx="${cur%.*}."
1553 cur="${cur##*.}"
1554 __gitcomp "
1555 url proxy fetch push mirror skipDefaultUpdate
1556 receivepack uploadpack tagopt pushurl
1557 " "$pfx" "$cur"
1558 return
1559 ;;
1560 remote.*)
1561 local pfx="${cur%.*}."
1562 cur="${cur#*.}"
1563 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1564 return
1565 ;;
1566 url.*.*)
1567 local pfx="${cur%.*}."
1568 cur="${cur##*.}"
1569 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur"
1570 return
1571 ;;
1572 esac
1573 __gitcomp "
1574 add.ignore-errors
1575 alias.
1576 apply.ignorewhitespace
1577 apply.whitespace
1578 branch.autosetupmerge
1579 branch.autosetuprebase
1580 clean.requireForce
1581 color.branch
1582 color.branch.current
1583 color.branch.local
1584 color.branch.plain
1585 color.branch.remote
1586 color.diff
1587 color.diff.commit
1588 color.diff.frag
1589 color.diff.meta
1590 color.diff.new
1591 color.diff.old
1592 color.diff.plain
1593 color.diff.whitespace
1594 color.grep
1595 color.grep.external
1596 color.grep.match
1597 color.interactive
1598 color.interactive.header
1599 color.interactive.help
1600 color.interactive.prompt
1601 color.pager
1602 color.showbranch
1603 color.status
1604 color.status.added
1605 color.status.changed
1606 color.status.header
1607 color.status.nobranch
1608 color.status.untracked
1609 color.status.updated
1610 color.ui
1611 commit.template
1612 core.autocrlf
1613 core.bare
1614 core.compression
1615 core.createObject
1616 core.deltaBaseCacheLimit
1617 core.editor
1618 core.excludesfile
1619 core.fileMode
1620 core.fsyncobjectfiles
1621 core.gitProxy
1622 core.ignoreCygwinFSTricks
1623 core.ignoreStat
1624 core.logAllRefUpdates
1625 core.loosecompression
1626 core.packedGitLimit
1627 core.packedGitWindowSize
1628 core.pager
1629 core.preferSymlinkRefs
1630 core.preloadindex
1631 core.quotepath
1632 core.repositoryFormatVersion
1633 core.safecrlf
1634 core.sharedRepository
1635 core.symlinks
1636 core.trustctime
1637 core.warnAmbiguousRefs
1638 core.whitespace
1639 core.worktree
1640 diff.autorefreshindex
1641 diff.external
1642 diff.mnemonicprefix
1643 diff.renameLimit
1644 diff.renameLimit.
1645 diff.renames
1646 diff.suppressBlankEmpty
1647 diff.tool
1648 diff.wordRegex
1649 difftool.
1650 difftool.prompt
1651 fetch.unpackLimit
1652 format.attach
1653 format.cc
1654 format.headers
1655 format.numbered
1656 format.pretty
1657 format.signoff
1658 format.subjectprefix
1659 format.suffix
1660 format.thread
1661 gc.aggressiveWindow
1662 gc.auto
1663 gc.autopacklimit
1664 gc.packrefs
1665 gc.pruneexpire
1666 gc.reflogexpire
1667 gc.reflogexpireunreachable
1668 gc.rerereresolved
1669 gc.rerereunresolved
1670 gitcvs.allbinary
1671 gitcvs.commitmsgannotation
1672 gitcvs.dbTableNamePrefix
1673 gitcvs.dbdriver
1674 gitcvs.dbname
1675 gitcvs.dbpass
1676 gitcvs.dbuser
1677 gitcvs.enabled
1678 gitcvs.logfile
1679 gitcvs.usecrlfattr
1680 guitool.
1681 gui.blamehistoryctx
1682 gui.commitmsgwidth
1683 gui.copyblamethreshold
1684 gui.diffcontext
1685 gui.encoding
1686 gui.fastcopyblame
1687 gui.matchtrackingbranch
1688 gui.newbranchtemplate
1689 gui.pruneduringfetch
1690 gui.spellingdictionary
1691 gui.trustmtime
1692 help.autocorrect
1693 help.browser
1694 help.format
1695 http.lowSpeedLimit
1696 http.lowSpeedTime
1697 http.maxRequests
1698 http.noEPSV
1699 http.proxy
1700 http.sslCAInfo
1701 http.sslCAPath
1702 http.sslCert
1703 http.sslKey
1704 http.sslVerify
1705 i18n.commitEncoding
1706 i18n.logOutputEncoding
1707 imap.folder
1708 imap.host
1709 imap.pass
1710 imap.port
1711 imap.preformattedHTML
1712 imap.sslverify
1713 imap.tunnel
1714 imap.user
1715 instaweb.browser
1716 instaweb.httpd
1717 instaweb.local
1718 instaweb.modulepath
1719 instaweb.port
1720 interactive.singlekey
1721 log.date
1722 log.showroot
1723 mailmap.file
1724 man.
1725 man.viewer
1726 merge.conflictstyle
1727 merge.log
1728 merge.renameLimit
1729 merge.stat
1730 merge.tool
1731 merge.verbosity
1732 mergetool.
1733 mergetool.keepBackup
1734 mergetool.prompt
1735 pack.compression
1736 pack.deltaCacheLimit
1737 pack.deltaCacheSize
1738 pack.depth
1739 pack.indexVersion
1740 pack.packSizeLimit
1741 pack.threads
1742 pack.window
1743 pack.windowMemory
1744 pager.
1745 pull.octopus
1746 pull.twohead
1747 push.default
1748 rebase.stat
1749 receive.denyCurrentBranch
1750 receive.denyDeletes
1751 receive.denyNonFastForwards
1752 receive.fsckObjects
1753 receive.unpackLimit
1754 repack.usedeltabaseoffset
1755 rerere.autoupdate
1756 rerere.enabled
1757 sendemail.aliasesfile
1758 sendemail.aliasesfiletype
1759 sendemail.bcc
1760 sendemail.cc
1761 sendemail.cccmd
1762 sendemail.chainreplyto
1763 sendemail.confirm
1764 sendemail.envelopesender
1765 sendemail.multiedit
1766 sendemail.signedoffbycc
1767 sendemail.smtpencryption
1768 sendemail.smtppass
1769 sendemail.smtpserver
1770 sendemail.smtpserverport
1771 sendemail.smtpuser
1772 sendemail.suppresscc
1773 sendemail.suppressfrom
1774 sendemail.thread
1775 sendemail.to
1776 sendemail.validate
1777 showbranch.default
1778 status.relativePaths
1779 status.showUntrackedFiles
1780 tar.umask
1781 transfer.unpackLimit
1782 url.
1783 user.email
1784 user.name
1785 user.signingkey
1786 web.browser
1787 branch. remote.
1788 "
1789}
1790
1791_git_remote ()
1792{
1793 local subcommands="add rename rm show prune update set-head"
1794 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1795 if [ -z "$subcommand" ]; then
1796 __gitcomp "$subcommands"
1797 return
1798 fi
1799
1800 case "$subcommand" in
1801 rename|rm|show|prune)
1802 __gitcomp "$(__git_remotes)"
1803 ;;
1804 update)
1805 local i c='' IFS=$'\n'
1806 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
1807 i="${i#remotes.}"
1808 c="$c ${i/ */}"
1809 done
1810 __gitcomp "$c"
1811 ;;
1812 *)
1813 COMPREPLY=()
1814 ;;
1815 esac
1816}
1817
1818_git_replace ()
1819{
1820 __gitcomp "$(__git_refs)"
1821}
1822
1823_git_reset ()
1824{
1825 __git_has_doubledash && return
1826
1827 local cur="${COMP_WORDS[COMP_CWORD]}"
1828 case "$cur" in
1829 --*)
1830 __gitcomp "--merge --mixed --hard --soft --patch"
1831 return
1832 ;;
1833 esac
1834 __gitcomp "$(__git_refs)"
1835}
1836
1837_git_revert ()
1838{
1839 local cur="${COMP_WORDS[COMP_CWORD]}"
1840 case "$cur" in
1841 --*)
1842 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1843 return
1844 ;;
1845 esac
1846 __gitcomp "$(__git_refs)"
1847}
1848
1849_git_rm ()
1850{
1851 __git_has_doubledash && return
1852
1853 local cur="${COMP_WORDS[COMP_CWORD]}"
1854 case "$cur" in
1855 --*)
1856 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1857 return
1858 ;;
1859 esac
1860 COMPREPLY=()
1861}
1862
1863_git_shortlog ()
1864{
1865 __git_has_doubledash && return
1866
1867 local cur="${COMP_WORDS[COMP_CWORD]}"
1868 case "$cur" in
1869 --*)
1870 __gitcomp "
1871 $__git_log_common_options
1872 $__git_log_shortlog_options
1873 --numbered --summary
1874 "
1875 return
1876 ;;
1877 esac
1878 __git_complete_revlist
1879}
1880
1881_git_show ()
1882{
1883 __git_has_doubledash && return
1884
1885 local cur="${COMP_WORDS[COMP_CWORD]}"
1886 case "$cur" in
1887 --pretty=*)
1888 __gitcomp "$__git_log_pretty_formats
1889 " "" "${cur##--pretty=}"
1890 return
1891 ;;
1892 --format=*)
1893 __gitcomp "$__git_log_pretty_formats
1894 " "" "${cur##--format=}"
1895 return
1896 ;;
1897 --*)
1898 __gitcomp "--pretty= --format= --abbrev-commit --oneline
1899 $__git_diff_common_options
1900 "
1901 return
1902 ;;
1903 esac
1904 __git_complete_file
1905}
1906
1907_git_show_branch ()
1908{
1909 local cur="${COMP_WORDS[COMP_CWORD]}"
1910 case "$cur" in
1911 --*)
1912 __gitcomp "
1913 --all --remotes --topo-order --current --more=
1914 --list --independent --merge-base --no-name
1915 --color --no-color
1916 --sha1-name --sparse --topics --reflog
1917 "
1918 return
1919 ;;
1920 esac
1921 __git_complete_revlist
1922}
1923
1924_git_stash ()
1925{
1926 local cur="${COMP_WORDS[COMP_CWORD]}"
1927 local save_opts='--keep-index --no-keep-index --quiet --patch'
1928 local subcommands='save list show apply clear drop pop create branch'
1929 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1930 if [ -z "$subcommand" ]; then
1931 case "$cur" in
1932 --*)
1933 __gitcomp "$save_opts"
1934 ;;
1935 *)
1936 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
1937 __gitcomp "$subcommands"
1938 else
1939 COMPREPLY=()
1940 fi
1941 ;;
1942 esac
1943 else
1944 case "$subcommand,$cur" in
1945 save,--*)
1946 __gitcomp "$save_opts"
1947 ;;
1948 apply,--*|pop,--*)
1949 __gitcomp "--index --quiet"
1950 ;;
1951 show,--*|drop,--*|branch,--*)
1952 COMPREPLY=()
1953 ;;
1954 show,*|apply,*|drop,*|pop,*|branch,*)
1955 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1956 | sed -n -e 's/:.*//p')"
1957 ;;
1958 *)
1959 COMPREPLY=()
1960 ;;
1961 esac
1962 fi
1963}
1964
1965_git_submodule ()
1966{
1967 __git_has_doubledash && return
1968
1969 local subcommands="add status init update summary foreach sync"
1970 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1971 local cur="${COMP_WORDS[COMP_CWORD]}"
1972 case "$cur" in
1973 --*)
1974 __gitcomp "--quiet --cached"
1975 ;;
1976 *)
1977 __gitcomp "$subcommands"
1978 ;;
1979 esac
1980 return
1981 fi
1982}
1983
1984_git_svn ()
1985{
1986 local subcommands="
1987 init fetch clone rebase dcommit log find-rev
1988 set-tree commit-diff info create-ignore propget
1989 proplist show-ignore show-externals branch tag blame
1990 migrate
1991 "
1992 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1993 if [ -z "$subcommand" ]; then
1994 __gitcomp "$subcommands"
1995 else
1996 local remote_opts="--username= --config-dir= --no-auth-cache"
1997 local fc_opts="
1998 --follow-parent --authors-file= --repack=
1999 --no-metadata --use-svm-props --use-svnsync-props
2000 --log-window-size= --no-checkout --quiet
2001 --repack-flags --use-log-author --localtime
2002 --ignore-paths= $remote_opts
2003 "
2004 local init_opts="
2005 --template= --shared= --trunk= --tags=
2006 --branches= --stdlayout --minimize-url
2007 --no-metadata --use-svm-props --use-svnsync-props
2008 --rewrite-root= --prefix= --use-log-author
2009 --add-author-from $remote_opts
2010 "
2011 local cmt_opts="
2012 --edit --rmdir --find-copies-harder --copy-similarity=
2013 "
2014
2015 local cur="${COMP_WORDS[COMP_CWORD]}"
2016 case "$subcommand,$cur" in
2017 fetch,--*)
2018 __gitcomp "--revision= --fetch-all $fc_opts"
2019 ;;
2020 clone,--*)
2021 __gitcomp "--revision= $fc_opts $init_opts"
2022 ;;
2023 init,--*)
2024 __gitcomp "$init_opts"
2025 ;;
2026 dcommit,--*)
2027 __gitcomp "
2028 --merge --strategy= --verbose --dry-run
2029 --fetch-all --no-rebase --commit-url
2030 --revision $cmt_opts $fc_opts
2031 "
2032 ;;
2033 set-tree,--*)
2034 __gitcomp "--stdin $cmt_opts $fc_opts"
2035 ;;
2036 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2037 show-externals,--*)
2038 __gitcomp "--revision="
2039 ;;
2040 log,--*)
2041 __gitcomp "
2042 --limit= --revision= --verbose --incremental
2043 --oneline --show-commit --non-recursive
2044 --authors-file= --color
2045 "
2046 ;;
2047 rebase,--*)
2048 __gitcomp "
2049 --merge --verbose --strategy= --local
2050 --fetch-all --dry-run $fc_opts
2051 "
2052 ;;
2053 commit-diff,--*)
2054 __gitcomp "--message= --file= --revision= $cmt_opts"
2055 ;;
2056 info,--*)
2057 __gitcomp "--url"
2058 ;;
2059 branch,--*)
2060 __gitcomp "--dry-run --message --tag"
2061 ;;
2062 tag,--*)
2063 __gitcomp "--dry-run --message"
2064 ;;
2065 blame,--*)
2066 __gitcomp "--git-format"
2067 ;;
2068 migrate,--*)
2069 __gitcomp "
2070 --config-dir= --ignore-paths= --minimize
2071 --no-auth-cache --username=
2072 "
2073 ;;
2074 *)
2075 COMPREPLY=()
2076 ;;
2077 esac
2078 fi
2079}
2080
2081_git_tag ()
2082{
2083 local i c=1 f=0
2084 while [ $c -lt $COMP_CWORD ]; do
2085 i="${COMP_WORDS[c]}"
2086 case "$i" in
2087 -d|-v)
2088 __gitcomp "$(__git_tags)"
2089 return
2090 ;;
2091 -f)
2092 f=1
2093 ;;
2094 esac
2095 c=$((++c))
2096 done
2097
2098 case "${COMP_WORDS[COMP_CWORD-1]}" in
2099 -m|-F)
2100 COMPREPLY=()
2101 ;;
2102 -*|tag)
2103 if [ $f = 1 ]; then
2104 __gitcomp "$(__git_tags)"
2105 else
2106 COMPREPLY=()
2107 fi
2108 ;;
2109 *)
2110 __gitcomp "$(__git_refs)"
2111 ;;
2112 esac
2113}
2114
2115_git ()
2116{
2117 local i c=1 command __git_dir
2118
2119 while [ $c -lt $COMP_CWORD ]; do
2120 i="${COMP_WORDS[c]}"
2121 case "$i" in
2122 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2123 --bare) __git_dir="." ;;
2124 --version|-p|--paginate) ;;
2125 --help) command="help"; break ;;
2126 *) command="$i"; break ;;
2127 esac
2128 c=$((++c))
2129 done
2130
2131 if [ -z "$command" ]; then
2132 case "${COMP_WORDS[COMP_CWORD]}" in
2133 --*) __gitcomp "
2134 --paginate
2135 --no-pager
2136 --git-dir=
2137 --bare
2138 --version
2139 --exec-path
2140 --html-path
2141 --work-tree=
2142 --help
2143 "
2144 ;;
2145 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
2146 esac
2147 return
2148 fi
2149
2150 local expansion=$(__git_aliased_command "$command")
2151 [ "$expansion" ] && command="$expansion"
2152
2153 case "$command" in
2154 am) _git_am ;;
2155 add) _git_add ;;
2156 apply) _git_apply ;;
2157 archive) _git_archive ;;
2158 bisect) _git_bisect ;;
2159 bundle) _git_bundle ;;
2160 branch) _git_branch ;;
2161 checkout) _git_checkout ;;
2162 cherry) _git_cherry ;;
2163 cherry-pick) _git_cherry_pick ;;
2164 clean) _git_clean ;;
2165 clone) _git_clone ;;
2166 commit) _git_commit ;;
2167 config) _git_config ;;
2168 describe) _git_describe ;;
2169 diff) _git_diff ;;
2170 difftool) _git_difftool ;;
2171 fetch) _git_fetch ;;
2172 format-patch) _git_format_patch ;;
2173 fsck) _git_fsck ;;
2174 gc) _git_gc ;;
2175 grep) _git_grep ;;
2176 help) _git_help ;;
2177 init) _git_init ;;
2178 log) _git_log ;;
2179 ls-files) _git_ls_files ;;
2180 ls-remote) _git_ls_remote ;;
2181 ls-tree) _git_ls_tree ;;
2182 merge) _git_merge;;
2183 mergetool) _git_mergetool;;
2184 merge-base) _git_merge_base ;;
2185 mv) _git_mv ;;
2186 name-rev) _git_name_rev ;;
2187 pull) _git_pull ;;
2188 push) _git_push ;;
2189 rebase) _git_rebase ;;
2190 remote) _git_remote ;;
2191 replace) _git_replace ;;
2192 reset) _git_reset ;;
2193 revert) _git_revert ;;
2194 rm) _git_rm ;;
2195 send-email) _git_send_email ;;
2196 shortlog) _git_shortlog ;;
2197 show) _git_show ;;
2198 show-branch) _git_show_branch ;;
2199 stash) _git_stash ;;
2200 stage) _git_add ;;
2201 submodule) _git_submodule ;;
2202 svn) _git_svn ;;
2203 tag) _git_tag ;;
2204 whatchanged) _git_log ;;
2205 *) COMPREPLY=() ;;
2206 esac
2207}
2208
2209_gitk ()
2210{
2211 __git_has_doubledash && return
2212
2213 local cur="${COMP_WORDS[COMP_CWORD]}"
2214 local g="$(__gitdir)"
2215 local merge=""
2216 if [ -f "$g/MERGE_HEAD" ]; then
2217 merge="--merge"
2218 fi
2219 case "$cur" in
2220 --*)
2221 __gitcomp "
2222 $__git_log_common_options
2223 $__git_log_gitk_options
2224 $merge
2225 "
2226 return
2227 ;;
2228 esac
2229 __git_complete_revlist
2230}
2231
2232complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2233 || complete -o default -o nospace -F _git git
2234complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2235 || complete -o default -o nospace -F _gitk gitk
2236
2237# The following are necessary only for Cygwin, and only are needed
2238# when the user has tab-completed the executable name and consequently
2239# included the '.exe' suffix.
2240#
2241if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2242complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2243 || complete -o default -o nospace -F _git git.exe
2244fi