1e0bd835fed2d065943e39465a36e92c7e6cbe69
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_builtin add
1157 return
1158 esac
1159
1160 local complete_opt="--others --modified --directory --no-empty-directory"
1161 if test -n "$(__git_find_on_cmdline "-u --update")"
1162 then
1163 complete_opt="--modified"
1164 fi
1165 __git_complete_index_file "$complete_opt"
1166}
1167
1168_git_archive ()
1169{
1170 case "$cur" in
1171 --format=*)
1172 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
1173 return
1174 ;;
1175 --remote=*)
1176 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
1177 return
1178 ;;
1179 --*)
1180 __gitcomp "
1181 --format= --list --verbose
1182 --prefix= --remote= --exec= --output
1183 "
1184 return
1185 ;;
1186 esac
1187 __git_complete_file
1188}
1189
1190_git_bisect ()
1191{
1192 __git_has_doubledash && return
1193
1194 local subcommands="start bad good skip reset visualize replay log run"
1195 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1196 if [ -z "$subcommand" ]; then
1197 __git_find_repo_path
1198 if [ -f "$__git_repo_path"/BISECT_START ]; then
1199 __gitcomp "$subcommands"
1200 else
1201 __gitcomp "replay start"
1202 fi
1203 return
1204 fi
1205
1206 case "$subcommand" in
1207 bad|good|reset|skip|start)
1208 __git_complete_refs
1209 ;;
1210 *)
1211 ;;
1212 esac
1213}
1214
1215_git_branch ()
1216{
1217 local i c=1 only_local_ref="n" has_r="n"
1218
1219 while [ $c -lt $cword ]; do
1220 i="${words[c]}"
1221 case "$i" in
1222 -d|--delete|-m|--move) only_local_ref="y" ;;
1223 -r|--remotes) has_r="y" ;;
1224 esac
1225 ((c++))
1226 done
1227
1228 case "$cur" in
1229 --set-upstream-to=*)
1230 __git_complete_refs --cur="${cur##--set-upstream-to=}"
1231 ;;
1232 --*)
1233 __gitcomp "
1234 --color --no-color --verbose --abbrev= --no-abbrev
1235 --track --no-track --contains --no-contains --merged --no-merged
1236 --set-upstream-to= --edit-description --list
1237 --unset-upstream --delete --move --copy --remotes
1238 --column --no-column --sort= --points-at
1239 "
1240 ;;
1241 *)
1242 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1243 __gitcomp_direct "$(__git_heads "" "$cur" " ")"
1244 else
1245 __git_complete_refs
1246 fi
1247 ;;
1248 esac
1249}
1250
1251_git_bundle ()
1252{
1253 local cmd="${words[2]}"
1254 case "$cword" in
1255 2)
1256 __gitcomp "create list-heads verify unbundle"
1257 ;;
1258 3)
1259 # looking for a file
1260 ;;
1261 *)
1262 case "$cmd" in
1263 create)
1264 __git_complete_revlist
1265 ;;
1266 esac
1267 ;;
1268 esac
1269}
1270
1271_git_checkout ()
1272{
1273 __git_has_doubledash && return
1274
1275 case "$cur" in
1276 --conflict=*)
1277 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1278 ;;
1279 --*)
1280 __gitcomp "
1281 --quiet --ours --theirs --track --no-track --merge
1282 --conflict= --orphan --patch --detach --ignore-skip-worktree-bits
1283 --recurse-submodules --no-recurse-submodules
1284 "
1285 ;;
1286 *)
1287 # check if --track, --no-track, or --no-guess was specified
1288 # if so, disable DWIM mode
1289 local flags="--track --no-track --no-guess" track_opt="--track"
1290 if [ "$GIT_COMPLETION_CHECKOUT_NO_GUESS" = "1" ] ||
1291 [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1292 track_opt=''
1293 fi
1294 __git_complete_refs $track_opt
1295 ;;
1296 esac
1297}
1298
1299_git_cherry ()
1300{
1301 __git_complete_refs
1302}
1303
1304_git_cherry_pick ()
1305{
1306 __git_find_repo_path
1307 if [ -f "$__git_repo_path"/CHERRY_PICK_HEAD ]; then
1308 __gitcomp "--continue --quit --abort"
1309 return
1310 fi
1311 case "$cur" in
1312 --*)
1313 __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1314 ;;
1315 *)
1316 __git_complete_refs
1317 ;;
1318 esac
1319}
1320
1321_git_clean ()
1322{
1323 case "$cur" in
1324 --*)
1325 __gitcomp "--dry-run --quiet"
1326 return
1327 ;;
1328 esac
1329
1330 # XXX should we check for -x option ?
1331 __git_complete_index_file "--others --directory"
1332}
1333
1334_git_clone ()
1335{
1336 case "$cur" in
1337 --*)
1338 __gitcomp "
1339 --local
1340 --no-hardlinks
1341 --shared
1342 --reference
1343 --quiet
1344 --no-checkout
1345 --bare
1346 --mirror
1347 --origin
1348 --upload-pack
1349 --template=
1350 --depth
1351 --single-branch
1352 --no-tags
1353 --branch
1354 --recurse-submodules
1355 --no-single-branch
1356 --shallow-submodules
1357 "
1358 return
1359 ;;
1360 esac
1361}
1362
1363__git_untracked_file_modes="all no normal"
1364
1365_git_commit ()
1366{
1367 case "$prev" in
1368 -c|-C)
1369 __git_complete_refs
1370 return
1371 ;;
1372 esac
1373
1374 case "$cur" in
1375 --cleanup=*)
1376 __gitcomp "default scissors strip verbatim whitespace
1377 " "" "${cur##--cleanup=}"
1378 return
1379 ;;
1380 --reuse-message=*|--reedit-message=*|\
1381 --fixup=*|--squash=*)
1382 __git_complete_refs --cur="${cur#*=}"
1383 return
1384 ;;
1385 --untracked-files=*)
1386 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1387 return
1388 ;;
1389 --*)
1390 __gitcomp "
1391 --all --author= --signoff --verify --no-verify
1392 --edit --no-edit
1393 --amend --include --only --interactive
1394 --dry-run --reuse-message= --reedit-message=
1395 --reset-author --file= --message= --template=
1396 --cleanup= --untracked-files --untracked-files=
1397 --verbose --quiet --fixup= --squash=
1398 --patch --short --date --allow-empty
1399 "
1400 return
1401 esac
1402
1403 if __git rev-parse --verify --quiet HEAD >/dev/null; then
1404 __git_complete_index_file "--committable"
1405 else
1406 # This is the first commit
1407 __git_complete_index_file "--cached"
1408 fi
1409}
1410
1411_git_describe ()
1412{
1413 case "$cur" in
1414 --*)
1415 __gitcomp "
1416 --all --tags --contains --abbrev= --candidates=
1417 --exact-match --debug --long --match --always --first-parent
1418 --exclude --dirty --broken
1419 "
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=
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 "--cached --staged --pickaxe-all --pickaxe-regex
1486 --base --ours --theirs
1487 --no-renames --diff-filter= --find-copies-harder
1488 --relative --ignore-submodules
1489 --tool="
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_options="
1499 --quiet --verbose --append --upload-pack --force --keep --depth=
1500 --tags --no-tags --all --prune --dry-run --recurse-submodules=
1501 --unshallow --update-shallow
1502"
1503
1504_git_fetch ()
1505{
1506 case "$cur" in
1507 --recurse-submodules=*)
1508 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1509 return
1510 ;;
1511 --*)
1512 __gitcomp "$__git_fetch_options"
1513 return
1514 ;;
1515 esac
1516 __git_complete_remote_or_refspec
1517}
1518
1519__git_format_patch_options="
1520 --stdout --attach --no-attach --thread --thread= --no-thread
1521 --numbered --start-number --numbered-files --keep-subject --signoff
1522 --signature --no-signature --in-reply-to= --cc= --full-index --binary
1523 --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1524 --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1525 --output-directory --reroll-count --to= --quiet --notes
1526"
1527
1528_git_format_patch ()
1529{
1530 case "$cur" in
1531 --thread=*)
1532 __gitcomp "
1533 deep shallow
1534 " "" "${cur##--thread=}"
1535 return
1536 ;;
1537 --*)
1538 __gitcomp "$__git_format_patch_options"
1539 return
1540 ;;
1541 esac
1542 __git_complete_revlist
1543}
1544
1545_git_fsck ()
1546{
1547 case "$cur" in
1548 --*)
1549 __gitcomp "
1550 --tags --root --unreachable --cache --no-reflogs --full
1551 --strict --verbose --lost-found --name-objects
1552 "
1553 return
1554 ;;
1555 esac
1556}
1557
1558_git_gc ()
1559{
1560 case "$cur" in
1561 --*)
1562 __gitcomp "--prune --aggressive"
1563 return
1564 ;;
1565 esac
1566}
1567
1568_git_gitk ()
1569{
1570 _gitk
1571}
1572
1573# Lists matching symbol names from a tag (as in ctags) file.
1574# 1: List symbol names matching this word.
1575# 2: The tag file to list symbol names from.
1576# 3: A prefix to be added to each listed symbol name (optional).
1577# 4: A suffix to be appended to each listed symbol name (optional).
1578__git_match_ctag () {
1579 awk -v pfx="${3-}" -v sfx="${4-}" "
1580 /^${1//\//\\/}/ { print pfx \$1 sfx }
1581 " "$2"
1582}
1583
1584# Complete symbol names from a tag file.
1585# Usage: __git_complete_symbol [<option>]...
1586# --tags=<file>: The tag file to list symbol names from instead of the
1587# default "tags".
1588# --pfx=<prefix>: A prefix to be added to each symbol name.
1589# --cur=<word>: The current symbol name to be completed. Defaults to
1590# the current word to be completed.
1591# --sfx=<suffix>: A suffix to be appended to each symbol name instead
1592# of the default space.
1593__git_complete_symbol () {
1594 local tags=tags pfx="" cur_="${cur-}" sfx=" "
1595
1596 while test $# != 0; do
1597 case "$1" in
1598 --tags=*) tags="${1##--tags=}" ;;
1599 --pfx=*) pfx="${1##--pfx=}" ;;
1600 --cur=*) cur_="${1##--cur=}" ;;
1601 --sfx=*) sfx="${1##--sfx=}" ;;
1602 *) return 1 ;;
1603 esac
1604 shift
1605 done
1606
1607 if test -r "$tags"; then
1608 __gitcomp_direct "$(__git_match_ctag "$cur_" "$tags" "$pfx" "$sfx")"
1609 fi
1610}
1611
1612_git_grep ()
1613{
1614 __git_has_doubledash && return
1615
1616 case "$cur" in
1617 --*)
1618 __gitcomp "
1619 --cached
1620 --text --ignore-case --word-regexp --invert-match
1621 --full-name --line-number
1622 --extended-regexp --basic-regexp --fixed-strings
1623 --perl-regexp
1624 --threads
1625 --files-with-matches --name-only
1626 --files-without-match
1627 --max-depth
1628 --count
1629 --and --or --not --all-match
1630 --break --heading --show-function --function-context
1631 --untracked --no-index
1632 "
1633 return
1634 ;;
1635 esac
1636
1637 case "$cword,$prev" in
1638 2,*|*,-*)
1639 __git_complete_symbol && return
1640 ;;
1641 esac
1642
1643 __git_complete_refs
1644}
1645
1646_git_help ()
1647{
1648 case "$cur" in
1649 --*)
1650 __gitcomp "--all --guides --info --man --web"
1651 return
1652 ;;
1653 esac
1654 __git_compute_all_commands
1655 __gitcomp "$__git_all_commands $(__git_aliases)
1656 attributes cli core-tutorial cvs-migration
1657 diffcore everyday gitk glossary hooks ignore modules
1658 namespaces repository-layout revisions tutorial tutorial-2
1659 workflows
1660 "
1661}
1662
1663_git_init ()
1664{
1665 case "$cur" in
1666 --shared=*)
1667 __gitcomp "
1668 false true umask group all world everybody
1669 " "" "${cur##--shared=}"
1670 return
1671 ;;
1672 --*)
1673 __gitcomp "--quiet --bare --template= --shared --shared="
1674 return
1675 ;;
1676 esac
1677}
1678
1679_git_ls_files ()
1680{
1681 case "$cur" in
1682 --*)
1683 __gitcomp "--cached --deleted --modified --others --ignored
1684 --stage --directory --no-empty-directory --unmerged
1685 --killed --exclude= --exclude-from=
1686 --exclude-per-directory= --exclude-standard
1687 --error-unmatch --with-tree= --full-name
1688 --abbrev --ignored --exclude-per-directory
1689 "
1690 return
1691 ;;
1692 esac
1693
1694 # XXX ignore options like --modified and always suggest all cached
1695 # files.
1696 __git_complete_index_file "--cached"
1697}
1698
1699_git_ls_remote ()
1700{
1701 case "$cur" in
1702 --*)
1703 __gitcomp "--heads --tags --refs --get-url --symref"
1704 return
1705 ;;
1706 esac
1707 __gitcomp_nl "$(__git_remotes)"
1708}
1709
1710_git_ls_tree ()
1711{
1712 __git_complete_file
1713}
1714
1715# Options that go well for log, shortlog and gitk
1716__git_log_common_options="
1717 --not --all
1718 --branches --tags --remotes
1719 --first-parent --merges --no-merges
1720 --max-count=
1721 --max-age= --since= --after=
1722 --min-age= --until= --before=
1723 --min-parents= --max-parents=
1724 --no-min-parents --no-max-parents
1725"
1726# Options that go well for log and gitk (not shortlog)
1727__git_log_gitk_options="
1728 --dense --sparse --full-history
1729 --simplify-merges --simplify-by-decoration
1730 --left-right --notes --no-notes
1731"
1732# Options that go well for log and shortlog (not gitk)
1733__git_log_shortlog_options="
1734 --author= --committer= --grep=
1735 --all-match --invert-grep
1736"
1737
1738__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1739__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1740
1741_git_log ()
1742{
1743 __git_has_doubledash && return
1744 __git_find_repo_path
1745
1746 local merge=""
1747 if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
1748 merge="--merge"
1749 fi
1750 case "$prev,$cur" in
1751 -L,:*:*)
1752 return # fall back to Bash filename completion
1753 ;;
1754 -L,:*)
1755 __git_complete_symbol --cur="${cur#:}" --sfx=":"
1756 return
1757 ;;
1758 -G,*|-S,*)
1759 __git_complete_symbol
1760 return
1761 ;;
1762 esac
1763 case "$cur" in
1764 --pretty=*|--format=*)
1765 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1766 " "" "${cur#*=}"
1767 return
1768 ;;
1769 --date=*)
1770 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1771 return
1772 ;;
1773 --decorate=*)
1774 __gitcomp "full short no" "" "${cur##--decorate=}"
1775 return
1776 ;;
1777 --diff-algorithm=*)
1778 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1779 return
1780 ;;
1781 --submodule=*)
1782 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1783 return
1784 ;;
1785 --*)
1786 __gitcomp "
1787 $__git_log_common_options
1788 $__git_log_shortlog_options
1789 $__git_log_gitk_options
1790 --root --topo-order --date-order --reverse
1791 --follow --full-diff
1792 --abbrev-commit --abbrev=
1793 --relative-date --date=
1794 --pretty= --format= --oneline
1795 --show-signature
1796 --cherry-mark
1797 --cherry-pick
1798 --graph
1799 --decorate --decorate=
1800 --walk-reflogs
1801 --parents --children
1802 $merge
1803 $__git_diff_common_options
1804 --pickaxe-all --pickaxe-regex
1805 "
1806 return
1807 ;;
1808 -L:*:*)
1809 return # fall back to Bash filename completion
1810 ;;
1811 -L:*)
1812 __git_complete_symbol --cur="${cur#-L:}" --sfx=":"
1813 return
1814 ;;
1815 -G*)
1816 __git_complete_symbol --pfx="-G" --cur="${cur#-G}"
1817 return
1818 ;;
1819 -S*)
1820 __git_complete_symbol --pfx="-S" --cur="${cur#-S}"
1821 return
1822 ;;
1823 esac
1824 __git_complete_revlist
1825}
1826
1827# Common merge options shared by git-merge(1) and git-pull(1).
1828__git_merge_options="
1829 --no-commit --no-stat --log --no-log --squash --strategy
1830 --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1831 --verify-signatures --no-verify-signatures --gpg-sign
1832 --quiet --verbose --progress --no-progress
1833"
1834
1835_git_merge ()
1836{
1837 __git_complete_strategy && return
1838
1839 case "$cur" in
1840 --*)
1841 __gitcomp "$__git_merge_options
1842 --rerere-autoupdate --no-rerere-autoupdate --abort --continue"
1843 return
1844 esac
1845 __git_complete_refs
1846}
1847
1848_git_mergetool ()
1849{
1850 case "$cur" in
1851 --tool=*)
1852 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1853 return
1854 ;;
1855 --*)
1856 __gitcomp "--tool= --prompt --no-prompt"
1857 return
1858 ;;
1859 esac
1860}
1861
1862_git_merge_base ()
1863{
1864 case "$cur" in
1865 --*)
1866 __gitcomp "--octopus --independent --is-ancestor --fork-point"
1867 return
1868 ;;
1869 esac
1870 __git_complete_refs
1871}
1872
1873_git_mv ()
1874{
1875 case "$cur" in
1876 --*)
1877 __gitcomp "--dry-run"
1878 return
1879 ;;
1880 esac
1881
1882 if [ $(__git_count_arguments "mv") -gt 0 ]; then
1883 # We need to show both cached and untracked files (including
1884 # empty directories) since this may not be the last argument.
1885 __git_complete_index_file "--cached --others --directory"
1886 else
1887 __git_complete_index_file "--cached"
1888 fi
1889}
1890
1891_git_name_rev ()
1892{
1893 __gitcomp "--tags --all --stdin"
1894}
1895
1896_git_notes ()
1897{
1898 local subcommands='add append copy edit list prune remove show'
1899 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1900
1901 case "$subcommand,$cur" in
1902 ,--*)
1903 __gitcomp '--ref'
1904 ;;
1905 ,*)
1906 case "$prev" in
1907 --ref)
1908 __git_complete_refs
1909 ;;
1910 *)
1911 __gitcomp "$subcommands --ref"
1912 ;;
1913 esac
1914 ;;
1915 add,--reuse-message=*|append,--reuse-message=*|\
1916 add,--reedit-message=*|append,--reedit-message=*)
1917 __git_complete_refs --cur="${cur#*=}"
1918 ;;
1919 add,--*|append,--*)
1920 __gitcomp '--file= --message= --reedit-message=
1921 --reuse-message='
1922 ;;
1923 copy,--*)
1924 __gitcomp '--stdin'
1925 ;;
1926 prune,--*)
1927 __gitcomp '--dry-run --verbose'
1928 ;;
1929 prune,*)
1930 ;;
1931 *)
1932 case "$prev" in
1933 -m|-F)
1934 ;;
1935 *)
1936 __git_complete_refs
1937 ;;
1938 esac
1939 ;;
1940 esac
1941}
1942
1943_git_pull ()
1944{
1945 __git_complete_strategy && return
1946
1947 case "$cur" in
1948 --recurse-submodules=*)
1949 __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1950 return
1951 ;;
1952 --*)
1953 __gitcomp "
1954 --rebase --no-rebase
1955 --autostash --no-autostash
1956 $__git_merge_options
1957 $__git_fetch_options
1958 "
1959 return
1960 ;;
1961 esac
1962 __git_complete_remote_or_refspec
1963}
1964
1965__git_push_recurse_submodules="check on-demand only"
1966
1967__git_complete_force_with_lease ()
1968{
1969 local cur_=$1
1970
1971 case "$cur_" in
1972 --*=)
1973 ;;
1974 *:*)
1975 __git_complete_refs --cur="${cur_#*:}"
1976 ;;
1977 *)
1978 __git_complete_refs --cur="$cur_"
1979 ;;
1980 esac
1981}
1982
1983_git_push ()
1984{
1985 case "$prev" in
1986 --repo)
1987 __gitcomp_nl "$(__git_remotes)"
1988 return
1989 ;;
1990 --recurse-submodules)
1991 __gitcomp "$__git_push_recurse_submodules"
1992 return
1993 ;;
1994 esac
1995 case "$cur" in
1996 --repo=*)
1997 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1998 return
1999 ;;
2000 --recurse-submodules=*)
2001 __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
2002 return
2003 ;;
2004 --force-with-lease=*)
2005 __git_complete_force_with_lease "${cur##--force-with-lease=}"
2006 return
2007 ;;
2008 --*)
2009 __gitcomp "
2010 --all --mirror --tags --dry-run --force --verbose
2011 --quiet --prune --delete --follow-tags
2012 --receive-pack= --repo= --set-upstream
2013 --force-with-lease --force-with-lease= --recurse-submodules=
2014 "
2015 return
2016 ;;
2017 esac
2018 __git_complete_remote_or_refspec
2019}
2020
2021_git_rebase ()
2022{
2023 __git_find_repo_path
2024 if [ -f "$__git_repo_path"/rebase-merge/interactive ]; then
2025 __gitcomp "--continue --skip --abort --quit --edit-todo"
2026 return
2027 elif [ -d "$__git_repo_path"/rebase-apply ] || \
2028 [ -d "$__git_repo_path"/rebase-merge ]; then
2029 __gitcomp "--continue --skip --abort --quit"
2030 return
2031 fi
2032 __git_complete_strategy && return
2033 case "$cur" in
2034 --whitespace=*)
2035 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
2036 return
2037 ;;
2038 --*)
2039 __gitcomp "
2040 --onto --merge --strategy --interactive
2041 --preserve-merges --stat --no-stat
2042 --committer-date-is-author-date --ignore-date
2043 --ignore-whitespace --whitespace=
2044 --autosquash --no-autosquash
2045 --fork-point --no-fork-point
2046 --autostash --no-autostash
2047 --verify --no-verify
2048 --keep-empty --root --force-rebase --no-ff
2049 --exec
2050 "
2051
2052 return
2053 esac
2054 __git_complete_refs
2055}
2056
2057_git_reflog ()
2058{
2059 local subcommands="show delete expire"
2060 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2061
2062 if [ -z "$subcommand" ]; then
2063 __gitcomp "$subcommands"
2064 else
2065 __git_complete_refs
2066 fi
2067}
2068
2069__git_send_email_confirm_options="always never auto cc compose"
2070__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
2071
2072_git_send_email ()
2073{
2074 case "$prev" in
2075 --to|--cc|--bcc|--from)
2076 __gitcomp "$(__git send-email --dump-aliases)"
2077 return
2078 ;;
2079 esac
2080
2081 case "$cur" in
2082 --confirm=*)
2083 __gitcomp "
2084 $__git_send_email_confirm_options
2085 " "" "${cur##--confirm=}"
2086 return
2087 ;;
2088 --suppress-cc=*)
2089 __gitcomp "
2090 $__git_send_email_suppresscc_options
2091 " "" "${cur##--suppress-cc=}"
2092
2093 return
2094 ;;
2095 --smtp-encryption=*)
2096 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
2097 return
2098 ;;
2099 --thread=*)
2100 __gitcomp "
2101 deep shallow
2102 " "" "${cur##--thread=}"
2103 return
2104 ;;
2105 --to=*|--cc=*|--bcc=*|--from=*)
2106 __gitcomp "$(__git send-email --dump-aliases)" "" "${cur#--*=}"
2107 return
2108 ;;
2109 --*)
2110 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
2111 --compose --confirm= --dry-run --envelope-sender
2112 --from --identity
2113 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
2114 --no-suppress-from --no-thread --quiet
2115 --signed-off-by-cc --smtp-pass --smtp-server
2116 --smtp-server-port --smtp-encryption= --smtp-user
2117 --subject --suppress-cc= --suppress-from --thread --to
2118 --validate --no-validate
2119 $__git_format_patch_options"
2120 return
2121 ;;
2122 esac
2123 __git_complete_revlist
2124}
2125
2126_git_stage ()
2127{
2128 _git_add
2129}
2130
2131_git_status ()
2132{
2133 local complete_opt
2134 local untracked_state
2135
2136 case "$cur" in
2137 --ignore-submodules=*)
2138 __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
2139 return
2140 ;;
2141 --untracked-files=*)
2142 __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
2143 return
2144 ;;
2145 --column=*)
2146 __gitcomp "
2147 always never auto column row plain dense nodense
2148 " "" "${cur##--column=}"
2149 return
2150 ;;
2151 --*)
2152 __gitcomp "
2153 --short --branch --porcelain --long --verbose
2154 --untracked-files= --ignore-submodules= --ignored
2155 --column= --no-column
2156 "
2157 return
2158 ;;
2159 esac
2160
2161 untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
2162 "$__git_untracked_file_modes" "status.showUntrackedFiles")"
2163
2164 case "$untracked_state" in
2165 no)
2166 # --ignored option does not matter
2167 complete_opt=
2168 ;;
2169 all|normal|*)
2170 complete_opt="--cached --directory --no-empty-directory --others"
2171
2172 if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
2173 complete_opt="$complete_opt --ignored --exclude=*"
2174 fi
2175 ;;
2176 esac
2177
2178 __git_complete_index_file "$complete_opt"
2179}
2180
2181__git_config_get_set_variables ()
2182{
2183 local prevword word config_file= c=$cword
2184 while [ $c -gt 1 ]; do
2185 word="${words[c]}"
2186 case "$word" in
2187 --system|--global|--local|--file=*)
2188 config_file="$word"
2189 break
2190 ;;
2191 -f|--file)
2192 config_file="$word $prevword"
2193 break
2194 ;;
2195 esac
2196 prevword=$word
2197 c=$((--c))
2198 done
2199
2200 __git config $config_file --name-only --list
2201}
2202
2203_git_config ()
2204{
2205 case "$prev" in
2206 branch.*.remote|branch.*.pushremote)
2207 __gitcomp_nl "$(__git_remotes)"
2208 return
2209 ;;
2210 branch.*.merge)
2211 __git_complete_refs
2212 return
2213 ;;
2214 branch.*.rebase)
2215 __gitcomp "false true preserve interactive"
2216 return
2217 ;;
2218 remote.pushdefault)
2219 __gitcomp_nl "$(__git_remotes)"
2220 return
2221 ;;
2222 remote.*.fetch)
2223 local remote="${prev#remote.}"
2224 remote="${remote%.fetch}"
2225 if [ -z "$cur" ]; then
2226 __gitcomp_nl "refs/heads/" "" "" ""
2227 return
2228 fi
2229 __gitcomp_nl "$(__git_refs_remotes "$remote")"
2230 return
2231 ;;
2232 remote.*.push)
2233 local remote="${prev#remote.}"
2234 remote="${remote%.push}"
2235 __gitcomp_nl "$(__git for-each-ref \
2236 --format='%(refname):%(refname)' refs/heads)"
2237 return
2238 ;;
2239 pull.twohead|pull.octopus)
2240 __git_compute_merge_strategies
2241 __gitcomp "$__git_merge_strategies"
2242 return
2243 ;;
2244 color.branch|color.diff|color.interactive|\
2245 color.showbranch|color.status|color.ui)
2246 __gitcomp "always never auto"
2247 return
2248 ;;
2249 color.pager)
2250 __gitcomp "false true"
2251 return
2252 ;;
2253 color.*.*)
2254 __gitcomp "
2255 normal black red green yellow blue magenta cyan white
2256 bold dim ul blink reverse
2257 "
2258 return
2259 ;;
2260 diff.submodule)
2261 __gitcomp "log short"
2262 return
2263 ;;
2264 help.format)
2265 __gitcomp "man info web html"
2266 return
2267 ;;
2268 log.date)
2269 __gitcomp "$__git_log_date_formats"
2270 return
2271 ;;
2272 sendemail.aliasesfiletype)
2273 __gitcomp "mutt mailrc pine elm gnus"
2274 return
2275 ;;
2276 sendemail.confirm)
2277 __gitcomp "$__git_send_email_confirm_options"
2278 return
2279 ;;
2280 sendemail.suppresscc)
2281 __gitcomp "$__git_send_email_suppresscc_options"
2282 return
2283 ;;
2284 sendemail.transferencoding)
2285 __gitcomp "7bit 8bit quoted-printable base64"
2286 return
2287 ;;
2288 --get|--get-all|--unset|--unset-all)
2289 __gitcomp_nl "$(__git_config_get_set_variables)"
2290 return
2291 ;;
2292 *.*)
2293 return
2294 ;;
2295 esac
2296 case "$cur" in
2297 --*)
2298 __gitcomp "
2299 --system --global --local --file=
2300 --list --replace-all
2301 --get --get-all --get-regexp
2302 --add --unset --unset-all
2303 --remove-section --rename-section
2304 --name-only
2305 "
2306 return
2307 ;;
2308 branch.*.*)
2309 local pfx="${cur%.*}." cur_="${cur##*.}"
2310 __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
2311 return
2312 ;;
2313 branch.*)
2314 local pfx="${cur%.*}." cur_="${cur#*.}"
2315 __gitcomp_direct "$(__git_heads "$pfx" "$cur_" ".")"
2316 __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
2317 return
2318 ;;
2319 guitool.*.*)
2320 local pfx="${cur%.*}." cur_="${cur##*.}"
2321 __gitcomp "
2322 argprompt cmd confirm needsfile noconsole norescan
2323 prompt revprompt revunmerged title
2324 " "$pfx" "$cur_"
2325 return
2326 ;;
2327 difftool.*.*)
2328 local pfx="${cur%.*}." cur_="${cur##*.}"
2329 __gitcomp "cmd path" "$pfx" "$cur_"
2330 return
2331 ;;
2332 man.*.*)
2333 local pfx="${cur%.*}." cur_="${cur##*.}"
2334 __gitcomp "cmd path" "$pfx" "$cur_"
2335 return
2336 ;;
2337 mergetool.*.*)
2338 local pfx="${cur%.*}." cur_="${cur##*.}"
2339 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
2340 return
2341 ;;
2342 pager.*)
2343 local pfx="${cur%.*}." cur_="${cur#*.}"
2344 __git_compute_all_commands
2345 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
2346 return
2347 ;;
2348 remote.*.*)
2349 local pfx="${cur%.*}." cur_="${cur##*.}"
2350 __gitcomp "
2351 url proxy fetch push mirror skipDefaultUpdate
2352 receivepack uploadpack tagopt pushurl
2353 " "$pfx" "$cur_"
2354 return
2355 ;;
2356 remote.*)
2357 local pfx="${cur%.*}." cur_="${cur#*.}"
2358 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
2359 __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
2360 return
2361 ;;
2362 url.*.*)
2363 local pfx="${cur%.*}." cur_="${cur##*.}"
2364 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2365 return
2366 ;;
2367 esac
2368 __gitcomp "
2369 add.ignoreErrors
2370 advice.amWorkDir
2371 advice.commitBeforeMerge
2372 advice.detachedHead
2373 advice.implicitIdentity
2374 advice.pushAlreadyExists
2375 advice.pushFetchFirst
2376 advice.pushNeedsForce
2377 advice.pushNonFFCurrent
2378 advice.pushNonFFMatching
2379 advice.pushUpdateRejected
2380 advice.resolveConflict
2381 advice.rmHints
2382 advice.statusHints
2383 advice.statusUoption
2384 advice.ignoredHook
2385 alias.
2386 am.keepcr
2387 am.threeWay
2388 apply.ignorewhitespace
2389 apply.whitespace
2390 branch.autosetupmerge
2391 branch.autosetuprebase
2392 browser.
2393 clean.requireForce
2394 color.branch
2395 color.branch.current
2396 color.branch.local
2397 color.branch.plain
2398 color.branch.remote
2399 color.decorate.HEAD
2400 color.decorate.branch
2401 color.decorate.remoteBranch
2402 color.decorate.stash
2403 color.decorate.tag
2404 color.diff
2405 color.diff.commit
2406 color.diff.frag
2407 color.diff.func
2408 color.diff.meta
2409 color.diff.new
2410 color.diff.old
2411 color.diff.plain
2412 color.diff.whitespace
2413 color.grep
2414 color.grep.context
2415 color.grep.filename
2416 color.grep.function
2417 color.grep.linenumber
2418 color.grep.match
2419 color.grep.selected
2420 color.grep.separator
2421 color.interactive
2422 color.interactive.error
2423 color.interactive.header
2424 color.interactive.help
2425 color.interactive.prompt
2426 color.pager
2427 color.showbranch
2428 color.status
2429 color.status.added
2430 color.status.changed
2431 color.status.header
2432 color.status.localBranch
2433 color.status.nobranch
2434 color.status.remoteBranch
2435 color.status.unmerged
2436 color.status.untracked
2437 color.status.updated
2438 color.ui
2439 commit.cleanup
2440 commit.gpgSign
2441 commit.status
2442 commit.template
2443 commit.verbose
2444 core.abbrev
2445 core.askpass
2446 core.attributesfile
2447 core.autocrlf
2448 core.bare
2449 core.bigFileThreshold
2450 core.checkStat
2451 core.commentChar
2452 core.compression
2453 core.createObject
2454 core.deltaBaseCacheLimit
2455 core.editor
2456 core.eol
2457 core.excludesfile
2458 core.fileMode
2459 core.fsyncobjectfiles
2460 core.gitProxy
2461 core.hideDotFiles
2462 core.hooksPath
2463 core.ignoreStat
2464 core.ignorecase
2465 core.logAllRefUpdates
2466 core.loosecompression
2467 core.notesRef
2468 core.packedGitLimit
2469 core.packedGitWindowSize
2470 core.packedRefsTimeout
2471 core.pager
2472 core.precomposeUnicode
2473 core.preferSymlinkRefs
2474 core.preloadindex
2475 core.protectHFS
2476 core.protectNTFS
2477 core.quotepath
2478 core.repositoryFormatVersion
2479 core.safecrlf
2480 core.sharedRepository
2481 core.sparseCheckout
2482 core.splitIndex
2483 core.sshCommand
2484 core.symlinks
2485 core.trustctime
2486 core.untrackedCache
2487 core.warnAmbiguousRefs
2488 core.whitespace
2489 core.worktree
2490 credential.helper
2491 credential.useHttpPath
2492 credential.username
2493 credentialCache.ignoreSIGHUP
2494 diff.autorefreshindex
2495 diff.external
2496 diff.ignoreSubmodules
2497 diff.mnemonicprefix
2498 diff.noprefix
2499 diff.renameLimit
2500 diff.renames
2501 diff.statGraphWidth
2502 diff.submodule
2503 diff.suppressBlankEmpty
2504 diff.tool
2505 diff.wordRegex
2506 diff.algorithm
2507 difftool.
2508 difftool.prompt
2509 fetch.recurseSubmodules
2510 fetch.unpackLimit
2511 format.attach
2512 format.cc
2513 format.coverLetter
2514 format.from
2515 format.headers
2516 format.numbered
2517 format.pretty
2518 format.signature
2519 format.signoff
2520 format.subjectprefix
2521 format.suffix
2522 format.thread
2523 format.to
2524 gc.
2525 gc.aggressiveDepth
2526 gc.aggressiveWindow
2527 gc.auto
2528 gc.autoDetach
2529 gc.autopacklimit
2530 gc.logExpiry
2531 gc.packrefs
2532 gc.pruneexpire
2533 gc.reflogexpire
2534 gc.reflogexpireunreachable
2535 gc.rerereresolved
2536 gc.rerereunresolved
2537 gc.worktreePruneExpire
2538 gitcvs.allbinary
2539 gitcvs.commitmsgannotation
2540 gitcvs.dbTableNamePrefix
2541 gitcvs.dbdriver
2542 gitcvs.dbname
2543 gitcvs.dbpass
2544 gitcvs.dbuser
2545 gitcvs.enabled
2546 gitcvs.logfile
2547 gitcvs.usecrlfattr
2548 guitool.
2549 gui.blamehistoryctx
2550 gui.commitmsgwidth
2551 gui.copyblamethreshold
2552 gui.diffcontext
2553 gui.encoding
2554 gui.fastcopyblame
2555 gui.matchtrackingbranch
2556 gui.newbranchtemplate
2557 gui.pruneduringfetch
2558 gui.spellingdictionary
2559 gui.trustmtime
2560 help.autocorrect
2561 help.browser
2562 help.format
2563 http.lowSpeedLimit
2564 http.lowSpeedTime
2565 http.maxRequests
2566 http.minSessions
2567 http.noEPSV
2568 http.postBuffer
2569 http.proxy
2570 http.sslCipherList
2571 http.sslVersion
2572 http.sslCAInfo
2573 http.sslCAPath
2574 http.sslCert
2575 http.sslCertPasswordProtected
2576 http.sslKey
2577 http.sslVerify
2578 http.useragent
2579 i18n.commitEncoding
2580 i18n.logOutputEncoding
2581 imap.authMethod
2582 imap.folder
2583 imap.host
2584 imap.pass
2585 imap.port
2586 imap.preformattedHTML
2587 imap.sslverify
2588 imap.tunnel
2589 imap.user
2590 init.templatedir
2591 instaweb.browser
2592 instaweb.httpd
2593 instaweb.local
2594 instaweb.modulepath
2595 instaweb.port
2596 interactive.singlekey
2597 log.date
2598 log.decorate
2599 log.showroot
2600 mailmap.file
2601 man.
2602 man.viewer
2603 merge.
2604 merge.conflictstyle
2605 merge.log
2606 merge.renameLimit
2607 merge.renormalize
2608 merge.stat
2609 merge.tool
2610 merge.verbosity
2611 mergetool.
2612 mergetool.keepBackup
2613 mergetool.keepTemporaries
2614 mergetool.prompt
2615 notes.displayRef
2616 notes.rewrite.
2617 notes.rewrite.amend
2618 notes.rewrite.rebase
2619 notes.rewriteMode
2620 notes.rewriteRef
2621 pack.compression
2622 pack.deltaCacheLimit
2623 pack.deltaCacheSize
2624 pack.depth
2625 pack.indexVersion
2626 pack.packSizeLimit
2627 pack.threads
2628 pack.window
2629 pack.windowMemory
2630 pager.
2631 pretty.
2632 pull.octopus
2633 pull.twohead
2634 push.default
2635 push.followTags
2636 rebase.autosquash
2637 rebase.stat
2638 receive.autogc
2639 receive.denyCurrentBranch
2640 receive.denyDeleteCurrent
2641 receive.denyDeletes
2642 receive.denyNonFastForwards
2643 receive.fsckObjects
2644 receive.unpackLimit
2645 receive.updateserverinfo
2646 remote.pushdefault
2647 remotes.
2648 repack.usedeltabaseoffset
2649 rerere.autoupdate
2650 rerere.enabled
2651 sendemail.
2652 sendemail.aliasesfile
2653 sendemail.aliasfiletype
2654 sendemail.bcc
2655 sendemail.cc
2656 sendemail.cccmd
2657 sendemail.chainreplyto
2658 sendemail.confirm
2659 sendemail.envelopesender
2660 sendemail.from
2661 sendemail.identity
2662 sendemail.multiedit
2663 sendemail.signedoffbycc
2664 sendemail.smtpdomain
2665 sendemail.smtpencryption
2666 sendemail.smtppass
2667 sendemail.smtpserver
2668 sendemail.smtpserveroption
2669 sendemail.smtpserverport
2670 sendemail.smtpuser
2671 sendemail.suppresscc
2672 sendemail.suppressfrom
2673 sendemail.thread
2674 sendemail.to
2675 sendemail.tocmd
2676 sendemail.validate
2677 sendemail.smtpbatchsize
2678 sendemail.smtprelogindelay
2679 showbranch.default
2680 status.relativePaths
2681 status.showUntrackedFiles
2682 status.submodulesummary
2683 submodule.
2684 tar.umask
2685 transfer.unpackLimit
2686 url.
2687 user.email
2688 user.name
2689 user.signingkey
2690 web.browser
2691 branch. remote.
2692 "
2693}
2694
2695_git_remote ()
2696{
2697 local subcommands="
2698 add rename remove set-head set-branches
2699 get-url set-url show prune update
2700 "
2701 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2702 if [ -z "$subcommand" ]; then
2703 case "$cur" in
2704 --*)
2705 __gitcomp "--verbose"
2706 ;;
2707 *)
2708 __gitcomp "$subcommands"
2709 ;;
2710 esac
2711 return
2712 fi
2713
2714 case "$subcommand,$cur" in
2715 add,--*)
2716 __gitcomp "--track --master --fetch --tags --no-tags --mirror="
2717 ;;
2718 add,*)
2719 ;;
2720 set-head,--*)
2721 __gitcomp "--auto --delete"
2722 ;;
2723 set-branches,--*)
2724 __gitcomp "--add"
2725 ;;
2726 set-head,*|set-branches,*)
2727 __git_complete_remote_or_refspec
2728 ;;
2729 update,--*)
2730 __gitcomp "--prune"
2731 ;;
2732 update,*)
2733 __gitcomp "$(__git_get_config_variables "remotes")"
2734 ;;
2735 set-url,--*)
2736 __gitcomp "--push --add --delete"
2737 ;;
2738 get-url,--*)
2739 __gitcomp "--push --all"
2740 ;;
2741 prune,--*)
2742 __gitcomp "--dry-run"
2743 ;;
2744 *)
2745 __gitcomp_nl "$(__git_remotes)"
2746 ;;
2747 esac
2748}
2749
2750_git_replace ()
2751{
2752 case "$cur" in
2753 --*)
2754 __gitcomp "--edit --graft --format= --list --delete"
2755 return
2756 ;;
2757 esac
2758 __git_complete_refs
2759}
2760
2761_git_rerere ()
2762{
2763 local subcommands="clear forget diff remaining status gc"
2764 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2765 if test -z "$subcommand"
2766 then
2767 __gitcomp "$subcommands"
2768 return
2769 fi
2770}
2771
2772_git_reset ()
2773{
2774 __git_has_doubledash && return
2775
2776 case "$cur" in
2777 --*)
2778 __gitcomp "--merge --mixed --hard --soft --patch --keep"
2779 return
2780 ;;
2781 esac
2782 __git_complete_refs
2783}
2784
2785_git_revert ()
2786{
2787 __git_find_repo_path
2788 if [ -f "$__git_repo_path"/REVERT_HEAD ]; then
2789 __gitcomp "--continue --quit --abort"
2790 return
2791 fi
2792 case "$cur" in
2793 --*)
2794 __gitcomp "
2795 --edit --mainline --no-edit --no-commit --signoff
2796 --strategy= --strategy-option=
2797 "
2798 return
2799 ;;
2800 esac
2801 __git_complete_refs
2802}
2803
2804_git_rm ()
2805{
2806 case "$cur" in
2807 --*)
2808 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2809 return
2810 ;;
2811 esac
2812
2813 __git_complete_index_file "--cached"
2814}
2815
2816_git_shortlog ()
2817{
2818 __git_has_doubledash && return
2819
2820 case "$cur" in
2821 --*)
2822 __gitcomp "
2823 $__git_log_common_options
2824 $__git_log_shortlog_options
2825 --numbered --summary --email
2826 "
2827 return
2828 ;;
2829 esac
2830 __git_complete_revlist
2831}
2832
2833_git_show ()
2834{
2835 __git_has_doubledash && return
2836
2837 case "$cur" in
2838 --pretty=*|--format=*)
2839 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2840 " "" "${cur#*=}"
2841 return
2842 ;;
2843 --diff-algorithm=*)
2844 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2845 return
2846 ;;
2847 --submodule=*)
2848 __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
2849 return
2850 ;;
2851 --*)
2852 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2853 --show-signature
2854 $__git_diff_common_options
2855 "
2856 return
2857 ;;
2858 esac
2859 __git_complete_revlist_file
2860}
2861
2862_git_show_branch ()
2863{
2864 case "$cur" in
2865 --*)
2866 __gitcomp "
2867 --all --remotes --topo-order --date-order --current --more=
2868 --list --independent --merge-base --no-name
2869 --color --no-color
2870 --sha1-name --sparse --topics --reflog
2871 "
2872 return
2873 ;;
2874 esac
2875 __git_complete_revlist
2876}
2877
2878_git_stash ()
2879{
2880 local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
2881 local subcommands='push save list show apply clear drop pop create branch'
2882 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2883 if [ -z "$subcommand" ]; then
2884 case "$cur" in
2885 --*)
2886 __gitcomp "$save_opts"
2887 ;;
2888 *)
2889 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2890 __gitcomp "$subcommands"
2891 fi
2892 ;;
2893 esac
2894 else
2895 case "$subcommand,$cur" in
2896 push,--*)
2897 __gitcomp "$save_opts --message"
2898 ;;
2899 save,--*)
2900 __gitcomp "$save_opts"
2901 ;;
2902 apply,--*|pop,--*)
2903 __gitcomp "--index --quiet"
2904 ;;
2905 drop,--*)
2906 __gitcomp "--quiet"
2907 ;;
2908 show,--*|branch,--*)
2909 ;;
2910 branch,*)
2911 if [ $cword -eq 3 ]; then
2912 __git_complete_refs
2913 else
2914 __gitcomp_nl "$(__git stash list \
2915 | sed -n -e 's/:.*//p')"
2916 fi
2917 ;;
2918 show,*|apply,*|drop,*|pop,*)
2919 __gitcomp_nl "$(__git stash list \
2920 | sed -n -e 's/:.*//p')"
2921 ;;
2922 *)
2923 ;;
2924 esac
2925 fi
2926}
2927
2928_git_submodule ()
2929{
2930 __git_has_doubledash && return
2931
2932 local subcommands="add status init deinit update summary foreach sync"
2933 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2934 if [ -z "$subcommand" ]; then
2935 case "$cur" in
2936 --*)
2937 __gitcomp "--quiet"
2938 ;;
2939 *)
2940 __gitcomp "$subcommands"
2941 ;;
2942 esac
2943 return
2944 fi
2945
2946 case "$subcommand,$cur" in
2947 add,--*)
2948 __gitcomp "--branch --force --name --reference --depth"
2949 ;;
2950 status,--*)
2951 __gitcomp "--cached --recursive"
2952 ;;
2953 deinit,--*)
2954 __gitcomp "--force --all"
2955 ;;
2956 update,--*)
2957 __gitcomp "
2958 --init --remote --no-fetch
2959 --recommend-shallow --no-recommend-shallow
2960 --force --rebase --merge --reference --depth --recursive --jobs
2961 "
2962 ;;
2963 summary,--*)
2964 __gitcomp "--cached --files --summary-limit"
2965 ;;
2966 foreach,--*|sync,--*)
2967 __gitcomp "--recursive"
2968 ;;
2969 *)
2970 ;;
2971 esac
2972}
2973
2974_git_svn ()
2975{
2976 local subcommands="
2977 init fetch clone rebase dcommit log find-rev
2978 set-tree commit-diff info create-ignore propget
2979 proplist show-ignore show-externals branch tag blame
2980 migrate mkdirs reset gc
2981 "
2982 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2983 if [ -z "$subcommand" ]; then
2984 __gitcomp "$subcommands"
2985 else
2986 local remote_opts="--username= --config-dir= --no-auth-cache"
2987 local fc_opts="
2988 --follow-parent --authors-file= --repack=
2989 --no-metadata --use-svm-props --use-svnsync-props
2990 --log-window-size= --no-checkout --quiet
2991 --repack-flags --use-log-author --localtime
2992 --add-author-from
2993 --ignore-paths= --include-paths= $remote_opts
2994 "
2995 local init_opts="
2996 --template= --shared= --trunk= --tags=
2997 --branches= --stdlayout --minimize-url
2998 --no-metadata --use-svm-props --use-svnsync-props
2999 --rewrite-root= --prefix= $remote_opts
3000 "
3001 local cmt_opts="
3002 --edit --rmdir --find-copies-harder --copy-similarity=
3003 "
3004
3005 case "$subcommand,$cur" in
3006 fetch,--*)
3007 __gitcomp "--revision= --fetch-all $fc_opts"
3008 ;;
3009 clone,--*)
3010 __gitcomp "--revision= $fc_opts $init_opts"
3011 ;;
3012 init,--*)
3013 __gitcomp "$init_opts"
3014 ;;
3015 dcommit,--*)
3016 __gitcomp "
3017 --merge --strategy= --verbose --dry-run
3018 --fetch-all --no-rebase --commit-url
3019 --revision --interactive $cmt_opts $fc_opts
3020 "
3021 ;;
3022 set-tree,--*)
3023 __gitcomp "--stdin $cmt_opts $fc_opts"
3024 ;;
3025 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
3026 show-externals,--*|mkdirs,--*)
3027 __gitcomp "--revision="
3028 ;;
3029 log,--*)
3030 __gitcomp "
3031 --limit= --revision= --verbose --incremental
3032 --oneline --show-commit --non-recursive
3033 --authors-file= --color
3034 "
3035 ;;
3036 rebase,--*)
3037 __gitcomp "
3038 --merge --verbose --strategy= --local
3039 --fetch-all --dry-run $fc_opts
3040 "
3041 ;;
3042 commit-diff,--*)
3043 __gitcomp "--message= --file= --revision= $cmt_opts"
3044 ;;
3045 info,--*)
3046 __gitcomp "--url"
3047 ;;
3048 branch,--*)
3049 __gitcomp "--dry-run --message --tag"
3050 ;;
3051 tag,--*)
3052 __gitcomp "--dry-run --message"
3053 ;;
3054 blame,--*)
3055 __gitcomp "--git-format"
3056 ;;
3057 migrate,--*)
3058 __gitcomp "
3059 --config-dir= --ignore-paths= --minimize
3060 --no-auth-cache --username=
3061 "
3062 ;;
3063 reset,--*)
3064 __gitcomp "--revision= --parent"
3065 ;;
3066 *)
3067 ;;
3068 esac
3069 fi
3070}
3071
3072_git_tag ()
3073{
3074 local i c=1 f=0
3075 while [ $c -lt $cword ]; do
3076 i="${words[c]}"
3077 case "$i" in
3078 -d|-v)
3079 __gitcomp_direct "$(__git_tags "" "$cur" " ")"
3080 return
3081 ;;
3082 -f)
3083 f=1
3084 ;;
3085 esac
3086 ((c++))
3087 done
3088
3089 case "$prev" in
3090 -m|-F)
3091 ;;
3092 -*|tag)
3093 if [ $f = 1 ]; then
3094 __gitcomp_direct "$(__git_tags "" "$cur" " ")"
3095 fi
3096 ;;
3097 *)
3098 __git_complete_refs
3099 ;;
3100 esac
3101
3102 case "$cur" in
3103 --*)
3104 __gitcomp "
3105 --list --delete --verify --annotate --message --file
3106 --sign --cleanup --local-user --force --column --sort=
3107 --contains --no-contains --points-at --merged --no-merged --create-reflog
3108 "
3109 ;;
3110 esac
3111}
3112
3113_git_whatchanged ()
3114{
3115 _git_log
3116}
3117
3118_git_worktree ()
3119{
3120 local subcommands="add list lock prune unlock"
3121 local subcommand="$(__git_find_on_cmdline "$subcommands")"
3122 if [ -z "$subcommand" ]; then
3123 __gitcomp "$subcommands"
3124 else
3125 case "$subcommand,$cur" in
3126 add,--*)
3127 __gitcomp "--detach"
3128 ;;
3129 list,--*)
3130 __gitcomp "--porcelain"
3131 ;;
3132 lock,--*)
3133 __gitcomp "--reason"
3134 ;;
3135 prune,--*)
3136 __gitcomp "--dry-run --expire --verbose"
3137 ;;
3138 *)
3139 ;;
3140 esac
3141 fi
3142}
3143
3144__git_main ()
3145{
3146 local i c=1 command __git_dir __git_repo_path
3147 local __git_C_args C_args_count=0
3148
3149 while [ $c -lt $cword ]; do
3150 i="${words[c]}"
3151 case "$i" in
3152 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
3153 --git-dir) ((c++)) ; __git_dir="${words[c]}" ;;
3154 --bare) __git_dir="." ;;
3155 --help) command="help"; break ;;
3156 -c|--work-tree|--namespace) ((c++)) ;;
3157 -C) __git_C_args[C_args_count++]=-C
3158 ((c++))
3159 __git_C_args[C_args_count++]="${words[c]}"
3160 ;;
3161 -*) ;;
3162 *) command="$i"; break ;;
3163 esac
3164 ((c++))
3165 done
3166
3167 if [ -z "$command" ]; then
3168 case "$prev" in
3169 --git-dir|-C|--work-tree)
3170 # these need a path argument, let's fall back to
3171 # Bash filename completion
3172 return
3173 ;;
3174 -c|--namespace)
3175 # we don't support completing these options' arguments
3176 return
3177 ;;
3178 esac
3179 case "$cur" in
3180 --*) __gitcomp "
3181 --paginate
3182 --no-pager
3183 --git-dir=
3184 --bare
3185 --version
3186 --exec-path
3187 --exec-path=
3188 --html-path
3189 --man-path
3190 --info-path
3191 --work-tree=
3192 --namespace=
3193 --no-replace-objects
3194 --help
3195 "
3196 ;;
3197 *) __git_compute_porcelain_commands
3198 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
3199 esac
3200 return
3201 fi
3202
3203 local completion_func="_git_${command//-/_}"
3204 declare -f $completion_func >/dev/null 2>/dev/null && $completion_func && return
3205
3206 local expansion=$(__git_aliased_command "$command")
3207 if [ -n "$expansion" ]; then
3208 words[1]=$expansion
3209 completion_func="_git_${expansion//-/_}"
3210 declare -f $completion_func >/dev/null 2>/dev/null && $completion_func
3211 fi
3212}
3213
3214__gitk_main ()
3215{
3216 __git_has_doubledash && return
3217
3218 local __git_repo_path
3219 __git_find_repo_path
3220
3221 local merge=""
3222 if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
3223 merge="--merge"
3224 fi
3225 case "$cur" in
3226 --*)
3227 __gitcomp "
3228 $__git_log_common_options
3229 $__git_log_gitk_options
3230 $merge
3231 "
3232 return
3233 ;;
3234 esac
3235 __git_complete_revlist
3236}
3237
3238if [[ -n ${ZSH_VERSION-} ]]; then
3239 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
3240
3241 autoload -U +X compinit && compinit
3242
3243 __gitcomp ()
3244 {
3245 emulate -L zsh
3246
3247 local cur_="${3-$cur}"
3248
3249 case "$cur_" in
3250 --*=)
3251 ;;
3252 *)
3253 local c IFS=$' \t\n'
3254 local -a array
3255 for c in ${=1}; do
3256 c="$c${4-}"
3257 case $c in
3258 --*=*|*.) ;;
3259 *) c="$c " ;;
3260 esac
3261 array[${#array[@]}+1]="$c"
3262 done
3263 compset -P '*[=:]'
3264 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
3265 ;;
3266 esac
3267 }
3268
3269 __gitcomp_direct ()
3270 {
3271 emulate -L zsh
3272
3273 local IFS=$'\n'
3274 compset -P '*[=:]'
3275 compadd -Q -- ${=1} && _ret=0
3276 }
3277
3278 __gitcomp_nl ()
3279 {
3280 emulate -L zsh
3281
3282 local IFS=$'\n'
3283 compset -P '*[=:]'
3284 compadd -Q -S "${4- }" -p "${2-}" -- ${=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