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