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