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