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