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