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