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