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