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