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