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 --*)
879 __gitcomp "
880 --color --no-color --verbose --abbrev= --no-abbrev
881 --track --no-track --contains --merged --no-merged
882 --set-upstream --edit-description --list
883 "
884 ;;
885 *)
886 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
887 __gitcomp_nl "$(__git_heads)"
888 else
889 __gitcomp_nl "$(__git_refs)"
890 fi
891 ;;
892 esac
893}
894
895_git_bundle ()
896{
897 local cmd="${words[2]}"
898 case "$cword" in
899 2)
900 __gitcomp "create list-heads verify unbundle"
901 ;;
902 3)
903 # looking for a file
904 ;;
905 *)
906 case "$cmd" in
907 create)
908 __git_complete_revlist
909 ;;
910 esac
911 ;;
912 esac
913}
914
915_git_checkout ()
916{
917 __git_has_doubledash && return
918
919 case "$cur" in
920 --conflict=*)
921 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
922 ;;
923 --*)
924 __gitcomp "
925 --quiet --ours --theirs --track --no-track --merge
926 --conflict= --orphan --patch
927 "
928 ;;
929 *)
930 # check if --track, --no-track, or --no-guess was specified
931 # if so, disable DWIM mode
932 local flags="--track --no-track --no-guess" track=1
933 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
934 track=''
935 fi
936 __gitcomp_nl "$(__git_refs '' $track)"
937 ;;
938 esac
939}
940
941_git_cherry ()
942{
943 __gitcomp "$(__git_refs)"
944}
945
946_git_cherry_pick ()
947{
948 case "$cur" in
949 --*)
950 __gitcomp "--edit --no-commit"
951 ;;
952 *)
953 __gitcomp_nl "$(__git_refs)"
954 ;;
955 esac
956}
957
958_git_clean ()
959{
960 __git_has_doubledash && return
961
962 case "$cur" in
963 --*)
964 __gitcomp "--dry-run --quiet"
965 return
966 ;;
967 esac
968 COMPREPLY=()
969}
970
971_git_clone ()
972{
973 case "$cur" in
974 --*)
975 __gitcomp "
976 --local
977 --no-hardlinks
978 --shared
979 --reference
980 --quiet
981 --no-checkout
982 --bare
983 --mirror
984 --origin
985 --upload-pack
986 --template=
987 --depth
988 "
989 return
990 ;;
991 esac
992 COMPREPLY=()
993}
994
995_git_commit ()
996{
997 __git_has_doubledash && return
998
999 case "$cur" in
1000 --cleanup=*)
1001 __gitcomp "default strip verbatim whitespace
1002 " "" "${cur##--cleanup=}"
1003 return
1004 ;;
1005 --reuse-message=*|--reedit-message=*|\
1006 --fixup=*|--squash=*)
1007 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1008 return
1009 ;;
1010 --untracked-files=*)
1011 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1012 return
1013 ;;
1014 --*)
1015 __gitcomp "
1016 --all --author= --signoff --verify --no-verify
1017 --edit --no-edit
1018 --amend --include --only --interactive
1019 --dry-run --reuse-message= --reedit-message=
1020 --reset-author --file= --message= --template=
1021 --cleanup= --untracked-files --untracked-files=
1022 --verbose --quiet --fixup= --squash=
1023 "
1024 return
1025 esac
1026 COMPREPLY=()
1027}
1028
1029_git_describe ()
1030{
1031 case "$cur" in
1032 --*)
1033 __gitcomp "
1034 --all --tags --contains --abbrev= --candidates=
1035 --exact-match --debug --long --match --always
1036 "
1037 return
1038 esac
1039 __gitcomp_nl "$(__git_refs)"
1040}
1041
1042__git_diff_common_options="--stat --numstat --shortstat --summary
1043 --patch-with-stat --name-only --name-status --color
1044 --no-color --color-words --no-renames --check
1045 --full-index --binary --abbrev --diff-filter=
1046 --find-copies-harder
1047 --text --ignore-space-at-eol --ignore-space-change
1048 --ignore-all-space --exit-code --quiet --ext-diff
1049 --no-ext-diff
1050 --no-prefix --src-prefix= --dst-prefix=
1051 --inter-hunk-context=
1052 --patience
1053 --raw
1054 --dirstat --dirstat= --dirstat-by-file
1055 --dirstat-by-file= --cumulative
1056"
1057
1058_git_diff ()
1059{
1060 __git_has_doubledash && return
1061
1062 case "$cur" in
1063 --*)
1064 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1065 --base --ours --theirs --no-index
1066 $__git_diff_common_options
1067 "
1068 return
1069 ;;
1070 esac
1071 __git_complete_revlist_file
1072}
1073
1074__git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1075 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3
1076"
1077
1078_git_difftool ()
1079{
1080 __git_has_doubledash && return
1081
1082 case "$cur" in
1083 --tool=*)
1084 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1085 return
1086 ;;
1087 --*)
1088 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1089 --base --ours --theirs
1090 --no-renames --diff-filter= --find-copies-harder
1091 --relative --ignore-submodules
1092 --tool="
1093 return
1094 ;;
1095 esac
1096 __git_complete_file
1097}
1098
1099__git_fetch_options="
1100 --quiet --verbose --append --upload-pack --force --keep --depth=
1101 --tags --no-tags --all --prune --dry-run
1102"
1103
1104_git_fetch ()
1105{
1106 case "$cur" in
1107 --*)
1108 __gitcomp "$__git_fetch_options"
1109 return
1110 ;;
1111 esac
1112 __git_complete_remote_or_refspec
1113}
1114
1115_git_format_patch ()
1116{
1117 case "$cur" in
1118 --thread=*)
1119 __gitcomp "
1120 deep shallow
1121 " "" "${cur##--thread=}"
1122 return
1123 ;;
1124 --*)
1125 __gitcomp "
1126 --stdout --attach --no-attach --thread --thread=
1127 --output-directory
1128 --numbered --start-number
1129 --numbered-files
1130 --keep-subject
1131 --signoff --signature --no-signature
1132 --in-reply-to= --cc=
1133 --full-index --binary
1134 --not --all
1135 --cover-letter
1136 --no-prefix --src-prefix= --dst-prefix=
1137 --inline --suffix= --ignore-if-in-upstream
1138 --subject-prefix=
1139 "
1140 return
1141 ;;
1142 esac
1143 __git_complete_revlist
1144}
1145
1146_git_fsck ()
1147{
1148 case "$cur" in
1149 --*)
1150 __gitcomp "
1151 --tags --root --unreachable --cache --no-reflogs --full
1152 --strict --verbose --lost-found
1153 "
1154 return
1155 ;;
1156 esac
1157 COMPREPLY=()
1158}
1159
1160_git_gc ()
1161{
1162 case "$cur" in
1163 --*)
1164 __gitcomp "--prune --aggressive"
1165 return
1166 ;;
1167 esac
1168 COMPREPLY=()
1169}
1170
1171_git_gitk ()
1172{
1173 _gitk
1174}
1175
1176__git_match_ctag() {
1177 awk "/^${1////\\/}/ { print \$1 }" "$2"
1178}
1179
1180_git_grep ()
1181{
1182 __git_has_doubledash && return
1183
1184 case "$cur" in
1185 --*)
1186 __gitcomp "
1187 --cached
1188 --text --ignore-case --word-regexp --invert-match
1189 --full-name --line-number
1190 --extended-regexp --basic-regexp --fixed-strings
1191 --perl-regexp
1192 --files-with-matches --name-only
1193 --files-without-match
1194 --max-depth
1195 --count
1196 --and --or --not --all-match
1197 "
1198 return
1199 ;;
1200 esac
1201
1202 case "$cword,$prev" in
1203 2,*|*,-*)
1204 if test -r tags; then
1205 __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1206 return
1207 fi
1208 ;;
1209 esac
1210
1211 __gitcomp_nl "$(__git_refs)"
1212}
1213
1214_git_help ()
1215{
1216 case "$cur" in
1217 --*)
1218 __gitcomp "--all --info --man --web"
1219 return
1220 ;;
1221 esac
1222 __git_compute_all_commands
1223 __gitcomp "$__git_all_commands $(__git_aliases)
1224 attributes cli core-tutorial cvs-migration
1225 diffcore gitk glossary hooks ignore modules
1226 namespaces repository-layout tutorial tutorial-2
1227 workflows
1228 "
1229}
1230
1231_git_init ()
1232{
1233 case "$cur" in
1234 --shared=*)
1235 __gitcomp "
1236 false true umask group all world everybody
1237 " "" "${cur##--shared=}"
1238 return
1239 ;;
1240 --*)
1241 __gitcomp "--quiet --bare --template= --shared --shared="
1242 return
1243 ;;
1244 esac
1245 COMPREPLY=()
1246}
1247
1248_git_ls_files ()
1249{
1250 __git_has_doubledash && return
1251
1252 case "$cur" in
1253 --*)
1254 __gitcomp "--cached --deleted --modified --others --ignored
1255 --stage --directory --no-empty-directory --unmerged
1256 --killed --exclude= --exclude-from=
1257 --exclude-per-directory= --exclude-standard
1258 --error-unmatch --with-tree= --full-name
1259 --abbrev --ignored --exclude-per-directory
1260 "
1261 return
1262 ;;
1263 esac
1264 COMPREPLY=()
1265}
1266
1267_git_ls_remote ()
1268{
1269 __gitcomp_nl "$(__git_remotes)"
1270}
1271
1272_git_ls_tree ()
1273{
1274 __git_complete_file
1275}
1276
1277# Options that go well for log, shortlog and gitk
1278__git_log_common_options="
1279 --not --all
1280 --branches --tags --remotes
1281 --first-parent --merges --no-merges
1282 --max-count=
1283 --max-age= --since= --after=
1284 --min-age= --until= --before=
1285 --min-parents= --max-parents=
1286 --no-min-parents --no-max-parents
1287"
1288# Options that go well for log and gitk (not shortlog)
1289__git_log_gitk_options="
1290 --dense --sparse --full-history
1291 --simplify-merges --simplify-by-decoration
1292 --left-right --notes --no-notes
1293"
1294# Options that go well for log and shortlog (not gitk)
1295__git_log_shortlog_options="
1296 --author= --committer= --grep=
1297 --all-match
1298"
1299
1300__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1301__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1302
1303_git_log ()
1304{
1305 __git_has_doubledash && return
1306
1307 local g="$(git rev-parse --git-dir 2>/dev/null)"
1308 local merge=""
1309 if [ -f "$g/MERGE_HEAD" ]; then
1310 merge="--merge"
1311 fi
1312 case "$cur" in
1313 --pretty=*|--format=*)
1314 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1315 " "" "${cur#*=}"
1316 return
1317 ;;
1318 --date=*)
1319 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1320 return
1321 ;;
1322 --decorate=*)
1323 __gitcomp "long short" "" "${cur##--decorate=}"
1324 return
1325 ;;
1326 --*)
1327 __gitcomp "
1328 $__git_log_common_options
1329 $__git_log_shortlog_options
1330 $__git_log_gitk_options
1331 --root --topo-order --date-order --reverse
1332 --follow --full-diff
1333 --abbrev-commit --abbrev=
1334 --relative-date --date=
1335 --pretty= --format= --oneline
1336 --cherry-pick
1337 --graph
1338 --decorate --decorate=
1339 --walk-reflogs
1340 --parents --children
1341 $merge
1342 $__git_diff_common_options
1343 --pickaxe-all --pickaxe-regex
1344 "
1345 return
1346 ;;
1347 esac
1348 __git_complete_revlist
1349}
1350
1351__git_merge_options="
1352 --no-commit --no-stat --log --no-log --squash --strategy
1353 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1354"
1355
1356_git_merge ()
1357{
1358 __git_complete_strategy && return
1359
1360 case "$cur" in
1361 --*)
1362 __gitcomp "$__git_merge_options"
1363 return
1364 esac
1365 __gitcomp_nl "$(__git_refs)"
1366}
1367
1368_git_mergetool ()
1369{
1370 case "$cur" in
1371 --tool=*)
1372 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1373 return
1374 ;;
1375 --*)
1376 __gitcomp "--tool="
1377 return
1378 ;;
1379 esac
1380 COMPREPLY=()
1381}
1382
1383_git_merge_base ()
1384{
1385 __gitcomp_nl "$(__git_refs)"
1386}
1387
1388_git_mv ()
1389{
1390 case "$cur" in
1391 --*)
1392 __gitcomp "--dry-run"
1393 return
1394 ;;
1395 esac
1396 COMPREPLY=()
1397}
1398
1399_git_name_rev ()
1400{
1401 __gitcomp "--tags --all --stdin"
1402}
1403
1404_git_notes ()
1405{
1406 local subcommands='add append copy edit list prune remove show'
1407 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1408
1409 case "$subcommand,$cur" in
1410 ,--*)
1411 __gitcomp '--ref'
1412 ;;
1413 ,*)
1414 case "$prev" in
1415 --ref)
1416 __gitcomp_nl "$(__git_refs)"
1417 ;;
1418 *)
1419 __gitcomp "$subcommands --ref"
1420 ;;
1421 esac
1422 ;;
1423 add,--reuse-message=*|append,--reuse-message=*|\
1424 add,--reedit-message=*|append,--reedit-message=*)
1425 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1426 ;;
1427 add,--*|append,--*)
1428 __gitcomp '--file= --message= --reedit-message=
1429 --reuse-message='
1430 ;;
1431 copy,--*)
1432 __gitcomp '--stdin'
1433 ;;
1434 prune,--*)
1435 __gitcomp '--dry-run --verbose'
1436 ;;
1437 prune,*)
1438 ;;
1439 *)
1440 case "$prev" in
1441 -m|-F)
1442 ;;
1443 *)
1444 __gitcomp_nl "$(__git_refs)"
1445 ;;
1446 esac
1447 ;;
1448 esac
1449}
1450
1451_git_pull ()
1452{
1453 __git_complete_strategy && return
1454
1455 case "$cur" in
1456 --*)
1457 __gitcomp "
1458 --rebase --no-rebase
1459 $__git_merge_options
1460 $__git_fetch_options
1461 "
1462 return
1463 ;;
1464 esac
1465 __git_complete_remote_or_refspec
1466}
1467
1468_git_push ()
1469{
1470 case "$prev" in
1471 --repo)
1472 __gitcomp_nl "$(__git_remotes)"
1473 return
1474 esac
1475 case "$cur" in
1476 --repo=*)
1477 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1478 return
1479 ;;
1480 --*)
1481 __gitcomp "
1482 --all --mirror --tags --dry-run --force --verbose
1483 --receive-pack= --repo= --set-upstream
1484 "
1485 return
1486 ;;
1487 esac
1488 __git_complete_remote_or_refspec
1489}
1490
1491_git_rebase ()
1492{
1493 local dir="$(__gitdir)"
1494 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1495 __gitcomp "--continue --skip --abort"
1496 return
1497 fi
1498 __git_complete_strategy && return
1499 case "$cur" in
1500 --whitespace=*)
1501 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1502 return
1503 ;;
1504 --*)
1505 __gitcomp "
1506 --onto --merge --strategy --interactive
1507 --preserve-merges --stat --no-stat
1508 --committer-date-is-author-date --ignore-date
1509 --ignore-whitespace --whitespace=
1510 --autosquash
1511 "
1512
1513 return
1514 esac
1515 __gitcomp_nl "$(__git_refs)"
1516}
1517
1518_git_reflog ()
1519{
1520 local subcommands="show delete expire"
1521 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1522
1523 if [ -z "$subcommand" ]; then
1524 __gitcomp "$subcommands"
1525 else
1526 __gitcomp_nl "$(__git_refs)"
1527 fi
1528}
1529
1530__git_send_email_confirm_options="always never auto cc compose"
1531__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1532
1533_git_send_email ()
1534{
1535 case "$cur" in
1536 --confirm=*)
1537 __gitcomp "
1538 $__git_send_email_confirm_options
1539 " "" "${cur##--confirm=}"
1540 return
1541 ;;
1542 --suppress-cc=*)
1543 __gitcomp "
1544 $__git_send_email_suppresscc_options
1545 " "" "${cur##--suppress-cc=}"
1546
1547 return
1548 ;;
1549 --smtp-encryption=*)
1550 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1551 return
1552 ;;
1553 --*)
1554 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1555 --compose --confirm= --dry-run --envelope-sender
1556 --from --identity
1557 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1558 --no-suppress-from --no-thread --quiet
1559 --signed-off-by-cc --smtp-pass --smtp-server
1560 --smtp-server-port --smtp-encryption= --smtp-user
1561 --subject --suppress-cc= --suppress-from --thread --to
1562 --validate --no-validate"
1563 return
1564 ;;
1565 esac
1566 COMPREPLY=()
1567}
1568
1569_git_stage ()
1570{
1571 _git_add
1572}
1573
1574__git_config_get_set_variables ()
1575{
1576 local prevword word config_file= c=$cword
1577 while [ $c -gt 1 ]; do
1578 word="${words[c]}"
1579 case "$word" in
1580 --global|--system|--file=*)
1581 config_file="$word"
1582 break
1583 ;;
1584 -f|--file)
1585 config_file="$word $prevword"
1586 break
1587 ;;
1588 esac
1589 prevword=$word
1590 c=$((--c))
1591 done
1592
1593 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1594 while read -r line
1595 do
1596 case "$line" in
1597 *.*=*)
1598 echo "${line/=*/}"
1599 ;;
1600 esac
1601 done
1602}
1603
1604_git_config ()
1605{
1606 case "$prev" in
1607 branch.*.remote)
1608 __gitcomp_nl "$(__git_remotes)"
1609 return
1610 ;;
1611 branch.*.merge)
1612 __gitcomp_nl "$(__git_refs)"
1613 return
1614 ;;
1615 remote.*.fetch)
1616 local remote="${prev#remote.}"
1617 remote="${remote%.fetch}"
1618 if [ -z "$cur" ]; then
1619 COMPREPLY=("refs/heads/")
1620 return
1621 fi
1622 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1623 return
1624 ;;
1625 remote.*.push)
1626 local remote="${prev#remote.}"
1627 remote="${remote%.push}"
1628 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1629 for-each-ref --format='%(refname):%(refname)' \
1630 refs/heads)"
1631 return
1632 ;;
1633 pull.twohead|pull.octopus)
1634 __git_compute_merge_strategies
1635 __gitcomp "$__git_merge_strategies"
1636 return
1637 ;;
1638 color.branch|color.diff|color.interactive|\
1639 color.showbranch|color.status|color.ui)
1640 __gitcomp "always never auto"
1641 return
1642 ;;
1643 color.pager)
1644 __gitcomp "false true"
1645 return
1646 ;;
1647 color.*.*)
1648 __gitcomp "
1649 normal black red green yellow blue magenta cyan white
1650 bold dim ul blink reverse
1651 "
1652 return
1653 ;;
1654 help.format)
1655 __gitcomp "man info web html"
1656 return
1657 ;;
1658 log.date)
1659 __gitcomp "$__git_log_date_formats"
1660 return
1661 ;;
1662 sendemail.aliasesfiletype)
1663 __gitcomp "mutt mailrc pine elm gnus"
1664 return
1665 ;;
1666 sendemail.confirm)
1667 __gitcomp "$__git_send_email_confirm_options"
1668 return
1669 ;;
1670 sendemail.suppresscc)
1671 __gitcomp "$__git_send_email_suppresscc_options"
1672 return
1673 ;;
1674 --get|--get-all|--unset|--unset-all)
1675 __gitcomp_nl "$(__git_config_get_set_variables)"
1676 return
1677 ;;
1678 *.*)
1679 COMPREPLY=()
1680 return
1681 ;;
1682 esac
1683 case "$cur" in
1684 --*)
1685 __gitcomp "
1686 --global --system --file=
1687 --list --replace-all
1688 --get --get-all --get-regexp
1689 --add --unset --unset-all
1690 --remove-section --rename-section
1691 "
1692 return
1693 ;;
1694 branch.*.*)
1695 local pfx="${cur%.*}." cur_="${cur##*.}"
1696 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
1697 return
1698 ;;
1699 branch.*)
1700 local pfx="${cur%.*}." cur_="${cur#*.}"
1701 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1702 return
1703 ;;
1704 guitool.*.*)
1705 local pfx="${cur%.*}." cur_="${cur##*.}"
1706 __gitcomp "
1707 argprompt cmd confirm needsfile noconsole norescan
1708 prompt revprompt revunmerged title
1709 " "$pfx" "$cur_"
1710 return
1711 ;;
1712 difftool.*.*)
1713 local pfx="${cur%.*}." cur_="${cur##*.}"
1714 __gitcomp "cmd path" "$pfx" "$cur_"
1715 return
1716 ;;
1717 man.*.*)
1718 local pfx="${cur%.*}." cur_="${cur##*.}"
1719 __gitcomp "cmd path" "$pfx" "$cur_"
1720 return
1721 ;;
1722 mergetool.*.*)
1723 local pfx="${cur%.*}." cur_="${cur##*.}"
1724 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1725 return
1726 ;;
1727 pager.*)
1728 local pfx="${cur%.*}." cur_="${cur#*.}"
1729 __git_compute_all_commands
1730 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1731 return
1732 ;;
1733 remote.*.*)
1734 local pfx="${cur%.*}." cur_="${cur##*.}"
1735 __gitcomp "
1736 url proxy fetch push mirror skipDefaultUpdate
1737 receivepack uploadpack tagopt pushurl
1738 " "$pfx" "$cur_"
1739 return
1740 ;;
1741 remote.*)
1742 local pfx="${cur%.*}." cur_="${cur#*.}"
1743 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1744 return
1745 ;;
1746 url.*.*)
1747 local pfx="${cur%.*}." cur_="${cur##*.}"
1748 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1749 return
1750 ;;
1751 esac
1752 __gitcomp "
1753 add.ignoreErrors
1754 advice.commitBeforeMerge
1755 advice.detachedHead
1756 advice.implicitIdentity
1757 advice.pushNonFastForward
1758 advice.resolveConflict
1759 advice.statusHints
1760 alias.
1761 am.keepcr
1762 apply.ignorewhitespace
1763 apply.whitespace
1764 branch.autosetupmerge
1765 branch.autosetuprebase
1766 browser.
1767 clean.requireForce
1768 color.branch
1769 color.branch.current
1770 color.branch.local
1771 color.branch.plain
1772 color.branch.remote
1773 color.decorate.HEAD
1774 color.decorate.branch
1775 color.decorate.remoteBranch
1776 color.decorate.stash
1777 color.decorate.tag
1778 color.diff
1779 color.diff.commit
1780 color.diff.frag
1781 color.diff.func
1782 color.diff.meta
1783 color.diff.new
1784 color.diff.old
1785 color.diff.plain
1786 color.diff.whitespace
1787 color.grep
1788 color.grep.context
1789 color.grep.filename
1790 color.grep.function
1791 color.grep.linenumber
1792 color.grep.match
1793 color.grep.selected
1794 color.grep.separator
1795 color.interactive
1796 color.interactive.error
1797 color.interactive.header
1798 color.interactive.help
1799 color.interactive.prompt
1800 color.pager
1801 color.showbranch
1802 color.status
1803 color.status.added
1804 color.status.changed
1805 color.status.header
1806 color.status.nobranch
1807 color.status.untracked
1808 color.status.updated
1809 color.ui
1810 commit.status
1811 commit.template
1812 core.abbrev
1813 core.askpass
1814 core.attributesfile
1815 core.autocrlf
1816 core.bare
1817 core.bigFileThreshold
1818 core.compression
1819 core.createObject
1820 core.deltaBaseCacheLimit
1821 core.editor
1822 core.eol
1823 core.excludesfile
1824 core.fileMode
1825 core.fsyncobjectfiles
1826 core.gitProxy
1827 core.ignoreCygwinFSTricks
1828 core.ignoreStat
1829 core.ignorecase
1830 core.logAllRefUpdates
1831 core.loosecompression
1832 core.notesRef
1833 core.packedGitLimit
1834 core.packedGitWindowSize
1835 core.pager
1836 core.preferSymlinkRefs
1837 core.preloadindex
1838 core.quotepath
1839 core.repositoryFormatVersion
1840 core.safecrlf
1841 core.sharedRepository
1842 core.sparseCheckout
1843 core.symlinks
1844 core.trustctime
1845 core.warnAmbiguousRefs
1846 core.whitespace
1847 core.worktree
1848 diff.autorefreshindex
1849 diff.statGraphWidth
1850 diff.external
1851 diff.ignoreSubmodules
1852 diff.mnemonicprefix
1853 diff.noprefix
1854 diff.renameLimit
1855 diff.renames
1856 diff.suppressBlankEmpty
1857 diff.tool
1858 diff.wordRegex
1859 difftool.
1860 difftool.prompt
1861 fetch.recurseSubmodules
1862 fetch.unpackLimit
1863 format.attach
1864 format.cc
1865 format.headers
1866 format.numbered
1867 format.pretty
1868 format.signature
1869 format.signoff
1870 format.subjectprefix
1871 format.suffix
1872 format.thread
1873 format.to
1874 gc.
1875 gc.aggressiveWindow
1876 gc.auto
1877 gc.autopacklimit
1878 gc.packrefs
1879 gc.pruneexpire
1880 gc.reflogexpire
1881 gc.reflogexpireunreachable
1882 gc.rerereresolved
1883 gc.rerereunresolved
1884 gitcvs.allbinary
1885 gitcvs.commitmsgannotation
1886 gitcvs.dbTableNamePrefix
1887 gitcvs.dbdriver
1888 gitcvs.dbname
1889 gitcvs.dbpass
1890 gitcvs.dbuser
1891 gitcvs.enabled
1892 gitcvs.logfile
1893 gitcvs.usecrlfattr
1894 guitool.
1895 gui.blamehistoryctx
1896 gui.commitmsgwidth
1897 gui.copyblamethreshold
1898 gui.diffcontext
1899 gui.encoding
1900 gui.fastcopyblame
1901 gui.matchtrackingbranch
1902 gui.newbranchtemplate
1903 gui.pruneduringfetch
1904 gui.spellingdictionary
1905 gui.trustmtime
1906 help.autocorrect
1907 help.browser
1908 help.format
1909 http.lowSpeedLimit
1910 http.lowSpeedTime
1911 http.maxRequests
1912 http.minSessions
1913 http.noEPSV
1914 http.postBuffer
1915 http.proxy
1916 http.sslCAInfo
1917 http.sslCAPath
1918 http.sslCert
1919 http.sslCertPasswordProtected
1920 http.sslKey
1921 http.sslVerify
1922 http.useragent
1923 i18n.commitEncoding
1924 i18n.logOutputEncoding
1925 imap.authMethod
1926 imap.folder
1927 imap.host
1928 imap.pass
1929 imap.port
1930 imap.preformattedHTML
1931 imap.sslverify
1932 imap.tunnel
1933 imap.user
1934 init.templatedir
1935 instaweb.browser
1936 instaweb.httpd
1937 instaweb.local
1938 instaweb.modulepath
1939 instaweb.port
1940 interactive.singlekey
1941 log.date
1942 log.decorate
1943 log.showroot
1944 mailmap.file
1945 man.
1946 man.viewer
1947 merge.
1948 merge.conflictstyle
1949 merge.log
1950 merge.renameLimit
1951 merge.renormalize
1952 merge.stat
1953 merge.tool
1954 merge.verbosity
1955 mergetool.
1956 mergetool.keepBackup
1957 mergetool.keepTemporaries
1958 mergetool.prompt
1959 notes.displayRef
1960 notes.rewrite.
1961 notes.rewrite.amend
1962 notes.rewrite.rebase
1963 notes.rewriteMode
1964 notes.rewriteRef
1965 pack.compression
1966 pack.deltaCacheLimit
1967 pack.deltaCacheSize
1968 pack.depth
1969 pack.indexVersion
1970 pack.packSizeLimit
1971 pack.threads
1972 pack.window
1973 pack.windowMemory
1974 pager.
1975 pretty.
1976 pull.octopus
1977 pull.twohead
1978 push.default
1979 rebase.autosquash
1980 rebase.stat
1981 receive.autogc
1982 receive.denyCurrentBranch
1983 receive.denyDeleteCurrent
1984 receive.denyDeletes
1985 receive.denyNonFastForwards
1986 receive.fsckObjects
1987 receive.unpackLimit
1988 receive.updateserverinfo
1989 remotes.
1990 repack.usedeltabaseoffset
1991 rerere.autoupdate
1992 rerere.enabled
1993 sendemail.
1994 sendemail.aliasesfile
1995 sendemail.aliasfiletype
1996 sendemail.bcc
1997 sendemail.cc
1998 sendemail.cccmd
1999 sendemail.chainreplyto
2000 sendemail.confirm
2001 sendemail.envelopesender
2002 sendemail.from
2003 sendemail.identity
2004 sendemail.multiedit
2005 sendemail.signedoffbycc
2006 sendemail.smtpdomain
2007 sendemail.smtpencryption
2008 sendemail.smtppass
2009 sendemail.smtpserver
2010 sendemail.smtpserveroption
2011 sendemail.smtpserverport
2012 sendemail.smtpuser
2013 sendemail.suppresscc
2014 sendemail.suppressfrom
2015 sendemail.thread
2016 sendemail.to
2017 sendemail.validate
2018 showbranch.default
2019 status.relativePaths
2020 status.showUntrackedFiles
2021 status.submodulesummary
2022 submodule.
2023 tar.umask
2024 transfer.unpackLimit
2025 url.
2026 user.email
2027 user.name
2028 user.signingkey
2029 web.browser
2030 branch. remote.
2031 "
2032}
2033
2034_git_remote ()
2035{
2036 local subcommands="add rename remove set-head set-branches set-url show prune update"
2037 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2038 if [ -z "$subcommand" ]; then
2039 __gitcomp "$subcommands"
2040 return
2041 fi
2042
2043 case "$subcommand" in
2044 rename|remove|set-url|show|prune)
2045 __gitcomp_nl "$(__git_remotes)"
2046 ;;
2047 set-head|set-branches)
2048 __git_complete_remote_or_refspec
2049 ;;
2050 update)
2051 local i c='' IFS=$'\n'
2052 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2053 i="${i#remotes.}"
2054 c="$c ${i/ */}"
2055 done
2056 __gitcomp "$c"
2057 ;;
2058 *)
2059 COMPREPLY=()
2060 ;;
2061 esac
2062}
2063
2064_git_replace ()
2065{
2066 __gitcomp_nl "$(__git_refs)"
2067}
2068
2069_git_reset ()
2070{
2071 __git_has_doubledash && return
2072
2073 case "$cur" in
2074 --*)
2075 __gitcomp "--merge --mixed --hard --soft --patch"
2076 return
2077 ;;
2078 esac
2079 __gitcomp_nl "$(__git_refs)"
2080}
2081
2082_git_revert ()
2083{
2084 case "$cur" in
2085 --*)
2086 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2087 return
2088 ;;
2089 esac
2090 __gitcomp_nl "$(__git_refs)"
2091}
2092
2093_git_rm ()
2094{
2095 __git_has_doubledash && return
2096
2097 case "$cur" in
2098 --*)
2099 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2100 return
2101 ;;
2102 esac
2103 COMPREPLY=()
2104}
2105
2106_git_shortlog ()
2107{
2108 __git_has_doubledash && return
2109
2110 case "$cur" in
2111 --*)
2112 __gitcomp "
2113 $__git_log_common_options
2114 $__git_log_shortlog_options
2115 --numbered --summary
2116 "
2117 return
2118 ;;
2119 esac
2120 __git_complete_revlist
2121}
2122
2123_git_show ()
2124{
2125 __git_has_doubledash && return
2126
2127 case "$cur" in
2128 --pretty=*|--format=*)
2129 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2130 " "" "${cur#*=}"
2131 return
2132 ;;
2133 --*)
2134 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2135 $__git_diff_common_options
2136 "
2137 return
2138 ;;
2139 esac
2140 __git_complete_file
2141}
2142
2143_git_show_branch ()
2144{
2145 case "$cur" in
2146 --*)
2147 __gitcomp "
2148 --all --remotes --topo-order --current --more=
2149 --list --independent --merge-base --no-name
2150 --color --no-color
2151 --sha1-name --sparse --topics --reflog
2152 "
2153 return
2154 ;;
2155 esac
2156 __git_complete_revlist
2157}
2158
2159_git_stash ()
2160{
2161 local save_opts='--keep-index --no-keep-index --quiet --patch'
2162 local subcommands='save list show apply clear drop pop create branch'
2163 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2164 if [ -z "$subcommand" ]; then
2165 case "$cur" in
2166 --*)
2167 __gitcomp "$save_opts"
2168 ;;
2169 *)
2170 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2171 __gitcomp "$subcommands"
2172 else
2173 COMPREPLY=()
2174 fi
2175 ;;
2176 esac
2177 else
2178 case "$subcommand,$cur" in
2179 save,--*)
2180 __gitcomp "$save_opts"
2181 ;;
2182 apply,--*|pop,--*)
2183 __gitcomp "--index --quiet"
2184 ;;
2185 show,--*|drop,--*|branch,--*)
2186 COMPREPLY=()
2187 ;;
2188 show,*|apply,*|drop,*|pop,*|branch,*)
2189 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2190 | sed -n -e 's/:.*//p')"
2191 ;;
2192 *)
2193 COMPREPLY=()
2194 ;;
2195 esac
2196 fi
2197}
2198
2199_git_submodule ()
2200{
2201 __git_has_doubledash && return
2202
2203 local subcommands="add status init update summary foreach sync"
2204 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2205 case "$cur" in
2206 --*)
2207 __gitcomp "--quiet --cached"
2208 ;;
2209 *)
2210 __gitcomp "$subcommands"
2211 ;;
2212 esac
2213 return
2214 fi
2215}
2216
2217_git_svn ()
2218{
2219 local subcommands="
2220 init fetch clone rebase dcommit log find-rev
2221 set-tree commit-diff info create-ignore propget
2222 proplist show-ignore show-externals branch tag blame
2223 migrate mkdirs reset gc
2224 "
2225 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2226 if [ -z "$subcommand" ]; then
2227 __gitcomp "$subcommands"
2228 else
2229 local remote_opts="--username= --config-dir= --no-auth-cache"
2230 local fc_opts="
2231 --follow-parent --authors-file= --repack=
2232 --no-metadata --use-svm-props --use-svnsync-props
2233 --log-window-size= --no-checkout --quiet
2234 --repack-flags --use-log-author --localtime
2235 --ignore-paths= $remote_opts
2236 "
2237 local init_opts="
2238 --template= --shared= --trunk= --tags=
2239 --branches= --stdlayout --minimize-url
2240 --no-metadata --use-svm-props --use-svnsync-props
2241 --rewrite-root= --prefix= --use-log-author
2242 --add-author-from $remote_opts
2243 "
2244 local cmt_opts="
2245 --edit --rmdir --find-copies-harder --copy-similarity=
2246 "
2247
2248 case "$subcommand,$cur" in
2249 fetch,--*)
2250 __gitcomp "--revision= --fetch-all $fc_opts"
2251 ;;
2252 clone,--*)
2253 __gitcomp "--revision= $fc_opts $init_opts"
2254 ;;
2255 init,--*)
2256 __gitcomp "$init_opts"
2257 ;;
2258 dcommit,--*)
2259 __gitcomp "
2260 --merge --strategy= --verbose --dry-run
2261 --fetch-all --no-rebase --commit-url
2262 --revision --interactive $cmt_opts $fc_opts
2263 "
2264 ;;
2265 set-tree,--*)
2266 __gitcomp "--stdin $cmt_opts $fc_opts"
2267 ;;
2268 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2269 show-externals,--*|mkdirs,--*)
2270 __gitcomp "--revision="
2271 ;;
2272 log,--*)
2273 __gitcomp "
2274 --limit= --revision= --verbose --incremental
2275 --oneline --show-commit --non-recursive
2276 --authors-file= --color
2277 "
2278 ;;
2279 rebase,--*)
2280 __gitcomp "
2281 --merge --verbose --strategy= --local
2282 --fetch-all --dry-run $fc_opts
2283 "
2284 ;;
2285 commit-diff,--*)
2286 __gitcomp "--message= --file= --revision= $cmt_opts"
2287 ;;
2288 info,--*)
2289 __gitcomp "--url"
2290 ;;
2291 branch,--*)
2292 __gitcomp "--dry-run --message --tag"
2293 ;;
2294 tag,--*)
2295 __gitcomp "--dry-run --message"
2296 ;;
2297 blame,--*)
2298 __gitcomp "--git-format"
2299 ;;
2300 migrate,--*)
2301 __gitcomp "
2302 --config-dir= --ignore-paths= --minimize
2303 --no-auth-cache --username=
2304 "
2305 ;;
2306 reset,--*)
2307 __gitcomp "--revision= --parent"
2308 ;;
2309 *)
2310 COMPREPLY=()
2311 ;;
2312 esac
2313 fi
2314}
2315
2316_git_tag ()
2317{
2318 local i c=1 f=0
2319 while [ $c -lt $cword ]; do
2320 i="${words[c]}"
2321 case "$i" in
2322 -d|-v)
2323 __gitcomp_nl "$(__git_tags)"
2324 return
2325 ;;
2326 -f)
2327 f=1
2328 ;;
2329 esac
2330 ((c++))
2331 done
2332
2333 case "$prev" in
2334 -m|-F)
2335 COMPREPLY=()
2336 ;;
2337 -*|tag)
2338 if [ $f = 1 ]; then
2339 __gitcomp_nl "$(__git_tags)"
2340 else
2341 COMPREPLY=()
2342 fi
2343 ;;
2344 *)
2345 __gitcomp_nl "$(__git_refs)"
2346 ;;
2347 esac
2348}
2349
2350_git_whatchanged ()
2351{
2352 _git_log
2353}
2354
2355__git_main ()
2356{
2357 local i c=1 command __git_dir
2358
2359 while [ $c -lt $cword ]; do
2360 i="${words[c]}"
2361 case "$i" in
2362 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2363 --bare) __git_dir="." ;;
2364 --help) command="help"; break ;;
2365 -c) c=$((++c)) ;;
2366 -*) ;;
2367 *) command="$i"; break ;;
2368 esac
2369 ((c++))
2370 done
2371
2372 if [ -z "$command" ]; then
2373 case "$cur" in
2374 --*) __gitcomp "
2375 --paginate
2376 --no-pager
2377 --git-dir=
2378 --bare
2379 --version
2380 --exec-path
2381 --exec-path=
2382 --html-path
2383 --info-path
2384 --work-tree=
2385 --namespace=
2386 --no-replace-objects
2387 --help
2388 "
2389 ;;
2390 *) __git_compute_porcelain_commands
2391 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2392 esac
2393 return
2394 fi
2395
2396 local completion_func="_git_${command//-/_}"
2397 declare -f $completion_func >/dev/null && $completion_func && return
2398
2399 local expansion=$(__git_aliased_command "$command")
2400 if [ -n "$expansion" ]; then
2401 completion_func="_git_${expansion//-/_}"
2402 declare -f $completion_func >/dev/null && $completion_func
2403 fi
2404}
2405
2406__gitk_main ()
2407{
2408 __git_has_doubledash && return
2409
2410 local g="$(__gitdir)"
2411 local merge=""
2412 if [ -f "$g/MERGE_HEAD" ]; then
2413 merge="--merge"
2414 fi
2415 case "$cur" in
2416 --*)
2417 __gitcomp "
2418 $__git_log_common_options
2419 $__git_log_gitk_options
2420 $merge
2421 "
2422 return
2423 ;;
2424 esac
2425 __git_complete_revlist
2426}
2427
2428__git_func_wrap ()
2429{
2430 if [[ -n ${ZSH_VERSION-} ]]; then
2431 emulate -L bash
2432 setopt KSH_TYPESET
2433
2434 # workaround zsh's bug that leaves 'words' as a special
2435 # variable in versions < 4.3.12
2436 typeset -h words
2437
2438 # workaround zsh's bug that quotes spaces in the COMPREPLY
2439 # array if IFS doesn't contain spaces.
2440 typeset -h IFS
2441 fi
2442 local cur words cword prev
2443 _get_comp_words_by_ref -n =: cur words cword prev
2444 $1
2445}
2446
2447# Setup completion for certain functions defined above by setting common
2448# variables and workarounds.
2449# This is NOT a public function; use at your own risk.
2450__git_complete ()
2451{
2452 local wrapper="__git_wrap${2}"
2453 eval "$wrapper () { __git_func_wrap $2 ; }"
2454 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2455 || complete -o default -o nospace -F $wrapper $1
2456}
2457
2458# wrapper for backwards compatibility
2459_git ()
2460{
2461 __git_wrap__git_main
2462}
2463
2464# wrapper for backwards compatibility
2465_gitk ()
2466{
2467 __git_wrap__gitk_main
2468}
2469
2470__git_complete git __git_main
2471__git_complete gitk __gitk_main
2472
2473# The following are necessary only for Cygwin, and only are needed
2474# when the user has tab-completed the executable name and consequently
2475# included the '.exe' suffix.
2476#
2477if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2478__git_complete git.exe __git_main
2479fi