]> git.ipfire.org Git - thirdparty/git.git/blame - contrib/completion/git-completion.bash
git-completion.bash: lexical sorting for diff.statGraphWidth
[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 ;;
9b82d63b
SB
1862 help.format)
1863 __gitcomp "man info web html"
1864 return
1865 ;;
672c68cb
SB
1866 log.date)
1867 __gitcomp "$__git_log_date_formats"
1868 return
1869 ;;
ae616de6
SB
1870 sendemail.aliasesfiletype)
1871 __gitcomp "mutt mailrc pine elm gnus"
1872 return
1873 ;;
1874 sendemail.confirm)
1875 __gitcomp "$__git_send_email_confirm_options"
1876 return
1877 ;;
1878 sendemail.suppresscc)
1879 __gitcomp "$__git_send_email_suppresscc_options"
1880 return
1881 ;;
00652369 1882 --get|--get-all|--unset|--unset-all)
a31e6262 1883 __gitcomp_nl "$(__git_config_get_set_variables)"
00652369
SB
1884 return
1885 ;;
5de40f59
SP
1886 *.*)
1887 COMPREPLY=()
1888 return
1889 ;;
1890 esac
1891 case "$cur" in
1892 --*)
78d4d6a2 1893 __gitcomp "
66c0786c 1894 --system --global --local --file=
12977705 1895 --list --replace-all
5de40f59 1896 --get --get-all --get-regexp
1b71eb35 1897 --add --unset --unset-all
12977705 1898 --remove-section --rename-section
78d4d6a2 1899 "
5de40f59
SP
1900 return
1901 ;;
1902 branch.*.*)
9244d69b
SG
1903 local pfx="${cur%.*}." cur_="${cur##*.}"
1904 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
5de40f59
SP
1905 return
1906 ;;
1907 branch.*)
9244d69b 1908 local pfx="${cur%.*}." cur_="${cur#*.}"
a31e6262 1909 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
5de40f59
SP
1910 return
1911 ;;
0aa62fd0 1912 guitool.*.*)
9244d69b 1913 local pfx="${cur%.*}." cur_="${cur##*.}"
0aa62fd0
SB
1914 __gitcomp "
1915 argprompt cmd confirm needsfile noconsole norescan
1916 prompt revprompt revunmerged title
9244d69b 1917 " "$pfx" "$cur_"
0aa62fd0
SB
1918 return
1919 ;;
1920 difftool.*.*)
9244d69b
SG
1921 local pfx="${cur%.*}." cur_="${cur##*.}"
1922 __gitcomp "cmd path" "$pfx" "$cur_"
0aa62fd0
SB
1923 return
1924 ;;
1925 man.*.*)
9244d69b
SG
1926 local pfx="${cur%.*}." cur_="${cur##*.}"
1927 __gitcomp "cmd path" "$pfx" "$cur_"
0aa62fd0
SB
1928 return
1929 ;;
1930 mergetool.*.*)
9244d69b
SG
1931 local pfx="${cur%.*}." cur_="${cur##*.}"
1932 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
0aa62fd0
SB
1933 return
1934 ;;
1935 pager.*)
9244d69b 1936 local pfx="${cur%.*}." cur_="${cur#*.}"
eaa4e6ee 1937 __git_compute_all_commands
a31e6262 1938 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
0aa62fd0
SB
1939 return
1940 ;;
5de40f59 1941 remote.*.*)
9244d69b 1942 local pfx="${cur%.*}." cur_="${cur##*.}"
12977705 1943 __gitcomp "
98171a07 1944 url proxy fetch push mirror skipDefaultUpdate
6fac1b83 1945 receivepack uploadpack tagopt pushurl
9244d69b 1946 " "$pfx" "$cur_"
5de40f59
SP
1947 return
1948 ;;
1949 remote.*)
9244d69b 1950 local pfx="${cur%.*}." cur_="${cur#*.}"
a31e6262 1951 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
5de40f59
SP
1952 return
1953 ;;
0aa62fd0 1954 url.*.*)
9244d69b
SG
1955 local pfx="${cur%.*}." cur_="${cur##*.}"
1956 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
0aa62fd0
SB
1957 return
1958 ;;
5de40f59 1959 esac
78d4d6a2 1960 __gitcomp "
6068ac88
MZ
1961 add.ignoreErrors
1962 advice.commitBeforeMerge
1963 advice.detachedHead
1964 advice.implicitIdentity
1965 advice.pushNonFastForward
1966 advice.resolveConflict
1967 advice.statusHints
226b343c 1968 alias.
6068ac88 1969 am.keepcr
86c91f91 1970 apply.ignorewhitespace
5de40f59 1971 apply.whitespace
98171a07
LM
1972 branch.autosetupmerge
1973 branch.autosetuprebase
6068ac88 1974 browser.
2122591b 1975 clean.requireForce
78d4d6a2
SP
1976 color.branch
1977 color.branch.current
1978 color.branch.local
78d4d6a2 1979 color.branch.plain
025a1929 1980 color.branch.remote
6068ac88
MZ
1981 color.decorate.HEAD
1982 color.decorate.branch
1983 color.decorate.remoteBranch
1984 color.decorate.stash
1985 color.decorate.tag
a159ca0c 1986 color.diff
025a1929 1987 color.diff.commit
78d4d6a2 1988 color.diff.frag
6068ac88 1989 color.diff.func
025a1929 1990 color.diff.meta
78d4d6a2 1991 color.diff.new
025a1929
LM
1992 color.diff.old
1993 color.diff.plain
78d4d6a2 1994 color.diff.whitespace
226b343c 1995 color.grep
6068ac88
MZ
1996 color.grep.context
1997 color.grep.filename
1998 color.grep.function
1999 color.grep.linenumber
226b343c 2000 color.grep.match
6068ac88
MZ
2001 color.grep.selected
2002 color.grep.separator
98171a07 2003 color.interactive
6068ac88 2004 color.interactive.error
98171a07
LM
2005 color.interactive.header
2006 color.interactive.help
2007 color.interactive.prompt
a159ca0c 2008 color.pager
6123d719 2009 color.showbranch
a159ca0c 2010 color.status
78d4d6a2
SP
2011 color.status.added
2012 color.status.changed
025a1929 2013 color.status.header
98171a07 2014 color.status.nobranch
78d4d6a2 2015 color.status.untracked
98171a07
LM
2016 color.status.updated
2017 color.ui
6068ac88 2018 commit.status
98171a07 2019 commit.template
cdb791f6 2020 core.abbrev
6068ac88
MZ
2021 core.askpass
2022 core.attributesfile
98171a07
LM
2023 core.autocrlf
2024 core.bare
6068ac88 2025 core.bigFileThreshold
025a1929 2026 core.compression
226b343c 2027 core.createObject
98171a07
LM
2028 core.deltaBaseCacheLimit
2029 core.editor
6068ac88 2030 core.eol
98171a07 2031 core.excludesfile
025a1929 2032 core.fileMode
98171a07 2033 core.fsyncobjectfiles
025a1929 2034 core.gitProxy
98171a07 2035 core.ignoreCygwinFSTricks
025a1929 2036 core.ignoreStat
6068ac88 2037 core.ignorecase
025a1929
LM
2038 core.logAllRefUpdates
2039 core.loosecompression
6068ac88 2040 core.notesRef
025a1929
LM
2041 core.packedGitLimit
2042 core.packedGitWindowSize
98171a07 2043 core.pager
025a1929 2044 core.preferSymlinkRefs
98171a07
LM
2045 core.preloadindex
2046 core.quotepath
025a1929 2047 core.repositoryFormatVersion
98171a07 2048 core.safecrlf
025a1929 2049 core.sharedRepository
6068ac88 2050 core.sparseCheckout
98171a07
LM
2051 core.symlinks
2052 core.trustctime
025a1929 2053 core.warnAmbiguousRefs
98171a07
LM
2054 core.whitespace
2055 core.worktree
2056 diff.autorefreshindex
2057 diff.external
6068ac88 2058 diff.ignoreSubmodules
98171a07 2059 diff.mnemonicprefix
6068ac88 2060 diff.noprefix
78d4d6a2
SP
2061 diff.renameLimit
2062 diff.renames
de7c201a 2063 diff.statGraphWidth
226b343c
SB
2064 diff.suppressBlankEmpty
2065 diff.tool
2066 diff.wordRegex
07ab4dec 2067 diff.algorithm
0aa62fd0 2068 difftool.
226b343c 2069 difftool.prompt
6068ac88 2070 fetch.recurseSubmodules
78d4d6a2 2071 fetch.unpackLimit
226b343c
SB
2072 format.attach
2073 format.cc
78d4d6a2 2074 format.headers
98171a07
LM
2075 format.numbered
2076 format.pretty
d8e1e5df 2077 format.signature
226b343c
SB
2078 format.signoff
2079 format.subjectprefix
98171a07 2080 format.suffix
226b343c 2081 format.thread
6068ac88
MZ
2082 format.to
2083 gc.
98171a07
LM
2084 gc.aggressiveWindow
2085 gc.auto
2086 gc.autopacklimit
12977705 2087 gc.packrefs
98171a07 2088 gc.pruneexpire
78d4d6a2
SP
2089 gc.reflogexpire
2090 gc.reflogexpireunreachable
2091 gc.rerereresolved
2092 gc.rerereunresolved
025a1929 2093 gitcvs.allbinary
226b343c 2094 gitcvs.commitmsgannotation
98171a07 2095 gitcvs.dbTableNamePrefix
025a1929
LM
2096 gitcvs.dbdriver
2097 gitcvs.dbname
2098 gitcvs.dbpass
025a1929
LM
2099 gitcvs.dbuser
2100 gitcvs.enabled
2101 gitcvs.logfile
98171a07 2102 gitcvs.usecrlfattr
0aa62fd0 2103 guitool.
98171a07
LM
2104 gui.blamehistoryctx
2105 gui.commitmsgwidth
2106 gui.copyblamethreshold
2107 gui.diffcontext
2108 gui.encoding
2109 gui.fastcopyblame
2110 gui.matchtrackingbranch
2111 gui.newbranchtemplate
2112 gui.pruneduringfetch
2113 gui.spellingdictionary
2114 gui.trustmtime
2115 help.autocorrect
2116 help.browser
2117 help.format
78d4d6a2
SP
2118 http.lowSpeedLimit
2119 http.lowSpeedTime
025a1929 2120 http.maxRequests
6068ac88 2121 http.minSessions
5de40f59 2122 http.noEPSV
6068ac88 2123 http.postBuffer
98171a07 2124 http.proxy
025a1929
LM
2125 http.sslCAInfo
2126 http.sslCAPath
2127 http.sslCert
6068ac88 2128 http.sslCertPasswordProtected
025a1929
LM
2129 http.sslKey
2130 http.sslVerify
6068ac88 2131 http.useragent
78d4d6a2
SP
2132 i18n.commitEncoding
2133 i18n.logOutputEncoding
6068ac88 2134 imap.authMethod
226b343c
SB
2135 imap.folder
2136 imap.host
2137 imap.pass
2138 imap.port
2139 imap.preformattedHTML
2140 imap.sslverify
2141 imap.tunnel
2142 imap.user
6068ac88 2143 init.templatedir
98171a07
LM
2144 instaweb.browser
2145 instaweb.httpd
2146 instaweb.local
2147 instaweb.modulepath
2148 instaweb.port
226b343c 2149 interactive.singlekey
98171a07 2150 log.date
6068ac88 2151 log.decorate
78d4d6a2 2152 log.showroot
226b343c 2153 mailmap.file
0aa62fd0 2154 man.
98171a07 2155 man.viewer
6068ac88 2156 merge.
98171a07
LM
2157 merge.conflictstyle
2158 merge.log
2159 merge.renameLimit
6068ac88 2160 merge.renormalize
98171a07 2161 merge.stat
025a1929 2162 merge.tool
78d4d6a2 2163 merge.verbosity
0aa62fd0 2164 mergetool.
98171a07 2165 mergetool.keepBackup
6068ac88 2166 mergetool.keepTemporaries
226b343c 2167 mergetool.prompt
6068ac88
MZ
2168 notes.displayRef
2169 notes.rewrite.
2170 notes.rewrite.amend
2171 notes.rewrite.rebase
2172 notes.rewriteMode
2173 notes.rewriteRef
47e98eec 2174 pack.compression
47e98eec 2175 pack.deltaCacheLimit
025a1929
LM
2176 pack.deltaCacheSize
2177 pack.depth
98171a07
LM
2178 pack.indexVersion
2179 pack.packSizeLimit
2180 pack.threads
025a1929
LM
2181 pack.window
2182 pack.windowMemory
0aa62fd0 2183 pager.
6068ac88 2184 pretty.
78d4d6a2
SP
2185 pull.octopus
2186 pull.twohead
226b343c 2187 push.default
6068ac88 2188 rebase.autosquash
226b343c 2189 rebase.stat
6068ac88 2190 receive.autogc
98171a07 2191 receive.denyCurrentBranch
6068ac88 2192 receive.denyDeleteCurrent
98171a07 2193 receive.denyDeletes
025a1929 2194 receive.denyNonFastForwards
98171a07 2195 receive.fsckObjects
025a1929 2196 receive.unpackLimit
6068ac88
MZ
2197 receive.updateserverinfo
2198 remotes.
98171a07
LM
2199 repack.usedeltabaseoffset
2200 rerere.autoupdate
2201 rerere.enabled
6068ac88 2202 sendemail.
226b343c 2203 sendemail.aliasesfile
6068ac88 2204 sendemail.aliasfiletype
226b343c
SB
2205 sendemail.bcc
2206 sendemail.cc
2207 sendemail.cccmd
2208 sendemail.chainreplyto
2209 sendemail.confirm
2210 sendemail.envelopesender
6068ac88
MZ
2211 sendemail.from
2212 sendemail.identity
226b343c
SB
2213 sendemail.multiedit
2214 sendemail.signedoffbycc
6068ac88 2215 sendemail.smtpdomain
226b343c
SB
2216 sendemail.smtpencryption
2217 sendemail.smtppass
2218 sendemail.smtpserver
6068ac88 2219 sendemail.smtpserveroption
226b343c
SB
2220 sendemail.smtpserverport
2221 sendemail.smtpuser
2222 sendemail.suppresscc
2223 sendemail.suppressfrom
2224 sendemail.thread
2225 sendemail.to
2226 sendemail.validate
78d4d6a2 2227 showbranch.default
98171a07
LM
2228 status.relativePaths
2229 status.showUntrackedFiles
6068ac88
MZ
2230 status.submodulesummary
2231 submodule.
78d4d6a2
SP
2232 tar.umask
2233 transfer.unpackLimit
0aa62fd0 2234 url.
78d4d6a2 2235 user.email
025a1929 2236 user.name
78d4d6a2 2237 user.signingkey
98171a07 2238 web.browser
5de40f59 2239 branch. remote.
78d4d6a2 2240 "
5de40f59
SP
2241}
2242
88293c67
SP
2243_git_remote ()
2244{
e17dba8f 2245 local subcommands="add rename remove set-head set-branches set-url show prune update"
918c03c2 2246 local subcommand="$(__git_find_on_cmdline "$subcommands")"
3ff1320d 2247 if [ -z "$subcommand" ]; then
3903c618 2248 __gitcomp "$subcommands"
88293c67
SP
2249 return
2250 fi
2251
3ff1320d 2252 case "$subcommand" in
e17dba8f 2253 rename|remove|set-url|show|prune)
a31e6262 2254 __gitcomp_nl "$(__git_remotes)"
88293c67 2255 ;;
f1c6ffe6
PJ
2256 set-head|set-branches)
2257 __git_complete_remote_or_refspec
2258 ;;
fb72759b
SP
2259 update)
2260 local i c='' IFS=$'\n'
518ef8f0
TZ
2261 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2262 i="${i#remotes.}"
2263 c="$c ${i/ */}"
fb72759b
SP
2264 done
2265 __gitcomp "$c"
2266 ;;
88293c67
SP
2267 *)
2268 COMPREPLY=()
2269 ;;
2270 esac
2271}
2272
e1c1a067
BG
2273_git_replace ()
2274{
a31e6262 2275 __gitcomp_nl "$(__git_refs)"
e1c1a067
BG
2276}
2277
67e78c3b
SP
2278_git_reset ()
2279{
d773c631
SG
2280 __git_has_doubledash && return
2281
b3391775
SP
2282 case "$cur" in
2283 --*)
9f040e95 2284 __gitcomp "--merge --mixed --hard --soft --patch"
b3391775
SP
2285 return
2286 ;;
2287 esac
a31e6262 2288 __gitcomp_nl "$(__git_refs)"
67e78c3b
SP
2289}
2290
a6c2be24
LM
2291_git_revert ()
2292{
a6c2be24
LM
2293 case "$cur" in
2294 --*)
2295 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2296 return
2297 ;;
2298 esac
a31e6262 2299 __gitcomp_nl "$(__git_refs)"
a6c2be24
LM
2300}
2301
08c701d4
LM
2302_git_rm ()
2303{
08c701d4
LM
2304 case "$cur" in
2305 --*)
2306 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2307 return
2308 ;;
2309 esac
fea16b47
MP
2310
2311 __git_complete_index_file "--cached"
08c701d4
LM
2312}
2313
1fd6bec9
SP
2314_git_shortlog ()
2315{
d773c631
SG
2316 __git_has_doubledash && return
2317
1fd6bec9
SP
2318 case "$cur" in
2319 --*)
2320 __gitcomp "
a393777e
TR
2321 $__git_log_common_options
2322 $__git_log_shortlog_options
1fd6bec9
SP
2323 --numbered --summary
2324 "
2325 return
2326 ;;
2327 esac
2328 __git_complete_revlist
2329}
2330
90131924
SP
2331_git_show ()
2332{
41d8cf7d
MH
2333 __git_has_doubledash && return
2334
90131924 2335 case "$cur" in
e67d71e5 2336 --pretty=*|--format=*)
c3898111 2337 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
e67d71e5 2338 " "" "${cur#*=}"
72de29c2
TL
2339 return
2340 ;;
07924d4d
MP
2341 --diff-algorithm=*)
2342 __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2343 return
2344 ;;
90131924 2345 --*)
076c3237 2346 __gitcomp "--pretty= --format= --abbrev-commit --oneline
20bf7292
TR
2347 $__git_diff_common_options
2348 "
90131924
SP
2349 return
2350 ;;
2351 esac
2352 __git_complete_file
2353}
2354
2ca880fe
TR
2355_git_show_branch ()
2356{
2ca880fe
TR
2357 case "$cur" in
2358 --*)
2359 __gitcomp "
2360 --all --remotes --topo-order --current --more=
2361 --list --independent --merge-base --no-name
6123d719 2362 --color --no-color
076c3237 2363 --sha1-name --sparse --topics --reflog
2ca880fe
TR
2364 "
2365 return
2366 ;;
2367 esac
2368 __git_complete_revlist
2369}
2370
7fd53fce
JH
2371_git_stash ()
2372{
59d5eeee 2373 local save_opts='--keep-index --no-keep-index --quiet --patch'
95d43780 2374 local subcommands='save list show apply clear drop pop create branch'
918c03c2 2375 local subcommand="$(__git_find_on_cmdline "$subcommands")"
7bedebca 2376 if [ -z "$subcommand" ]; then
59d5eeee
SG
2377 case "$cur" in
2378 --*)
2379 __gitcomp "$save_opts"
2380 ;;
2381 *)
2382 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2383 __gitcomp "$subcommands"
2384 else
2385 COMPREPLY=()
2386 fi
2387 ;;
2388 esac
7bedebca 2389 else
7bedebca
SG
2390 case "$subcommand,$cur" in
2391 save,--*)
59d5eeee 2392 __gitcomp "$save_opts"
7bedebca 2393 ;;
8513c54b 2394 apply,--*|pop,--*)
59d5eeee 2395 __gitcomp "--index --quiet"
95d43780 2396 ;;
8513c54b 2397 show,--*|drop,--*|branch,--*)
95d43780
LM
2398 COMPREPLY=()
2399 ;;
2400 show,*|apply,*|drop,*|pop,*|branch,*)
a31e6262 2401 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
95d43780
LM
2402 | sed -n -e 's/:.*//p')"
2403 ;;
7bedebca
SG
2404 *)
2405 COMPREPLY=()
2406 ;;
2407 esac
3ff1320d 2408 fi
7fd53fce
JH
2409}
2410
be86f7a0
SP
2411_git_submodule ()
2412{
d773c631
SG
2413 __git_has_doubledash && return
2414
1b0f7978 2415 local subcommands="add status init update summary foreach sync"
918c03c2 2416 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
be86f7a0
SP
2417 case "$cur" in
2418 --*)
2419 __gitcomp "--quiet --cached"
2420 ;;
2421 *)
3ff1320d 2422 __gitcomp "$subcommands"
be86f7a0
SP
2423 ;;
2424 esac
2425 return
2426 fi
2427}
2428
47f6ee28
SG
2429_git_svn ()
2430{
2431 local subcommands="
2432 init fetch clone rebase dcommit log find-rev
2433 set-tree commit-diff info create-ignore propget
4a5856cb 2434 proplist show-ignore show-externals branch tag blame
c18d5d82 2435 migrate mkdirs reset gc
47f6ee28 2436 "
918c03c2 2437 local subcommand="$(__git_find_on_cmdline "$subcommands")"
47f6ee28
SG
2438 if [ -z "$subcommand" ]; then
2439 __gitcomp "$subcommands"
2440 else
2441 local remote_opts="--username= --config-dir= --no-auth-cache"
2442 local fc_opts="
2443 --follow-parent --authors-file= --repack=
2444 --no-metadata --use-svm-props --use-svnsync-props
2445 --log-window-size= --no-checkout --quiet
4a5856cb
SG
2446 --repack-flags --use-log-author --localtime
2447 --ignore-paths= $remote_opts
47f6ee28
SG
2448 "
2449 local init_opts="
2450 --template= --shared= --trunk= --tags=
2451 --branches= --stdlayout --minimize-url
2452 --no-metadata --use-svm-props --use-svnsync-props
4a5856cb
SG
2453 --rewrite-root= --prefix= --use-log-author
2454 --add-author-from $remote_opts
47f6ee28
SG
2455 "
2456 local cmt_opts="
2457 --edit --rmdir --find-copies-harder --copy-similarity=
2458 "
2459
47f6ee28
SG
2460 case "$subcommand,$cur" in
2461 fetch,--*)
2462 __gitcomp "--revision= --fetch-all $fc_opts"
2463 ;;
2464 clone,--*)
2465 __gitcomp "--revision= $fc_opts $init_opts"
2466 ;;
2467 init,--*)
2468 __gitcomp "$init_opts"
2469 ;;
2470 dcommit,--*)
2471 __gitcomp "
2472 --merge --strategy= --verbose --dry-run
4a5856cb 2473 --fetch-all --no-rebase --commit-url
7b151f49 2474 --revision --interactive $cmt_opts $fc_opts
47f6ee28
SG
2475 "
2476 ;;
2477 set-tree,--*)
2478 __gitcomp "--stdin $cmt_opts $fc_opts"
2479 ;;
2480 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
c18d5d82 2481 show-externals,--*|mkdirs,--*)
47f6ee28
SG
2482 __gitcomp "--revision="
2483 ;;
2484 log,--*)
2485 __gitcomp "
2486 --limit= --revision= --verbose --incremental
2487 --oneline --show-commit --non-recursive
4a5856cb 2488 --authors-file= --color
47f6ee28
SG
2489 "
2490 ;;
2491 rebase,--*)
2492 __gitcomp "
2493 --merge --verbose --strategy= --local
4a5856cb 2494 --fetch-all --dry-run $fc_opts
47f6ee28
SG
2495 "
2496 ;;
2497 commit-diff,--*)
2498 __gitcomp "--message= --file= --revision= $cmt_opts"
2499 ;;
2500 info,--*)
2501 __gitcomp "--url"
2502 ;;
4a5856cb
SG
2503 branch,--*)
2504 __gitcomp "--dry-run --message --tag"
2505 ;;
2506 tag,--*)
2507 __gitcomp "--dry-run --message"
2508 ;;
2509 blame,--*)
2510 __gitcomp "--git-format"
2511 ;;
2512 migrate,--*)
2513 __gitcomp "
2514 --config-dir= --ignore-paths= --minimize
2515 --no-auth-cache --username=
2516 "
2517 ;;
c18d5d82
RZ
2518 reset,--*)
2519 __gitcomp "--revision= --parent"
2520 ;;
47f6ee28
SG
2521 *)
2522 COMPREPLY=()
2523 ;;
2524 esac
2525 fi
2526}
2527
88e21dc7
SP
2528_git_tag ()
2529{
2530 local i c=1 f=0
da48616f
PD
2531 while [ $c -lt $cword ]; do
2532 i="${words[c]}"
88e21dc7
SP
2533 case "$i" in
2534 -d|-v)
a31e6262 2535 __gitcomp_nl "$(__git_tags)"
88e21dc7
SP
2536 return
2537 ;;
2538 -f)
2539 f=1
2540 ;;
2541 esac
6e8c755f 2542 ((c++))
88e21dc7
SP
2543 done
2544
da48616f 2545 case "$prev" in
88e21dc7
SP
2546 -m|-F)
2547 COMPREPLY=()
2548 ;;
8d8163f3 2549 -*|tag)
88e21dc7 2550 if [ $f = 1 ]; then
a31e6262 2551 __gitcomp_nl "$(__git_tags)"
88e21dc7
SP
2552 else
2553 COMPREPLY=()
2554 fi
2555 ;;
2556 *)
a31e6262 2557 __gitcomp_nl "$(__git_refs)"
88e21dc7
SP
2558 ;;
2559 esac
2560}
2561
424cce83
SG
2562_git_whatchanged ()
2563{
2564 _git_log
2565}
2566
93b291e0 2567__git_main ()
690d8824 2568{
873537fa
SP
2569 local i c=1 command __git_dir
2570
da48616f
PD
2571 while [ $c -lt $cword ]; do
2572 i="${words[c]}"
873537fa
SP
2573 case "$i" in
2574 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2575 --bare) __git_dir="." ;;
1eb7e2f8 2576 --help) command="help"; break ;;
911d5da6
SG
2577 -c) c=$((++c)) ;;
2578 -*) ;;
873537fa
SP
2579 *) command="$i"; break ;;
2580 esac
6e8c755f 2581 ((c++))
873537fa
SP
2582 done
2583
1d17b22e 2584 if [ -z "$command" ]; then
da48616f 2585 case "$cur" in
47e98eec 2586 --*) __gitcomp "
ce5a2c95 2587 --paginate
47e98eec
SP
2588 --no-pager
2589 --git-dir=
2590 --bare
2591 --version
2592 --exec-path
3ffcd086 2593 --exec-path=
89a56bfb 2594 --html-path
69ef3c02 2595 --info-path
ce5a2c95 2596 --work-tree=
a1bea2c1 2597 --namespace=
69ef3c02 2598 --no-replace-objects
ce5a2c95 2599 --help
47e98eec
SP
2600 "
2601 ;;
eaa4e6ee
JN
2602 *) __git_compute_porcelain_commands
2603 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
72e5e989
SP
2604 esac
2605 return
873537fa 2606 fi
367dce2a 2607
424cce83 2608 local completion_func="_git_${command//-/_}"
06f44c3c 2609 declare -f $completion_func >/dev/null && $completion_func && return
8024ea60 2610
873537fa 2611 local expansion=$(__git_aliased_command "$command")
8024ea60
SG
2612 if [ -n "$expansion" ]; then
2613 completion_func="_git_${expansion//-/_}"
06f44c3c 2614 declare -f $completion_func >/dev/null && $completion_func
8024ea60 2615 fi
690d8824
JH
2616}
2617
93b291e0 2618__gitk_main ()
690d8824 2619{
d773c631
SG
2620 __git_has_doubledash && return
2621
fa26a401 2622 local g="$(__gitdir)"
07ba53f7 2623 local merge=""
ba7906f2 2624 if [ -f "$g/MERGE_HEAD" ]; then
07ba53f7
RQ
2625 merge="--merge"
2626 fi
b3391775
SP
2627 case "$cur" in
2628 --*)
a393777e
TR
2629 __gitcomp "
2630 $__git_log_common_options
2631 $__git_log_gitk_options
2632 $merge
2633 "
b3391775
SP
2634 return
2635 ;;
2636 esac
ec804891 2637 __git_complete_revlist
690d8824
JH
2638}
2639
d8b45314
FC
2640if [[ -n ${ZSH_VERSION-} ]]; then
2641 echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
6b179adf 2642
9cd67bd2
FC
2643 autoload -U +X compinit && compinit
2644
d8b45314
FC
2645 __gitcomp ()
2646 {
2647 emulate -L zsh
6b179adf 2648
d8b45314
FC
2649 local cur_="${3-$cur}"
2650
2651 case "$cur_" in
2652 --*=)
2653 ;;
2654 *)
2655 local c IFS=$' \t\n'
2656 local -a array
2657 for c in ${=1}; do
2658 c="$c${4-}"
2659 case $c in
2660 --*=*|*.) ;;
2661 *) c="$c " ;;
2662 esac
50c5885e 2663 array[$#array+1]="$c"
d8b45314
FC
2664 done
2665 compset -P '*[=:]'
2666 compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2667 ;;
2668 esac
2669 }
2670
2671 __gitcomp_nl ()
2672 {
2673 emulate -L zsh
2674
2675 local IFS=$'\n'
2676 compset -P '*[=:]'
2677 compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2678 }
2679
fea16b47
MP
2680 __gitcomp_file ()
2681 {
2682 emulate -L zsh
2683
2684 local IFS=$'\n'
2685 compset -P '*[=:]'
2686 compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2687 }
2688
d8b45314
FC
2689 __git_zsh_helper ()
2690 {
2691 emulate -L ksh
2692 local cur cword prev
2693 cur=${words[CURRENT-1]}
2694 prev=${words[CURRENT-2]}
2695 let cword=CURRENT-1
2696 __${service}_main
2697 }
2698
2699 _git ()
2700 {
2701 emulate -L zsh
2702 local _ret=1
2703 __git_zsh_helper
2704 let _ret && _default -S '' && _ret=0
2705 return _ret
2706 }
2707
2708 compdef _git git gitk
2709 return
fea16b47
MP
2710elif [[ -n ${BASH_VERSION-} ]]; then
2711 if ((${BASH_VERSINFO[0]} < 4)); then
2712 # compopt is not supported
2713 __git_index_file_list_filter ()
2714 {
2715 __git_index_file_list_filter_compat
2716 }
2717 fi
d8b45314
FC
2718fi
2719
2720__git_func_wrap ()
2721{
6b179adf
FC
2722 local cur words cword prev
2723 _get_comp_words_by_ref -n =: cur words cword prev
2724 $1
2725}
2726
2727# Setup completion for certain functions defined above by setting common
2728# variables and workarounds.
2729# This is NOT a public function; use at your own risk.
2730__git_complete ()
2731{
2732 local wrapper="__git_wrap${2}"
2733 eval "$wrapper () { __git_func_wrap $2 ; }"
2734 complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2735 || complete -o default -o nospace -F $wrapper $1
2736}
2737
b0a4b2d2
FC
2738# wrapper for backwards compatibility
2739_git ()
2740{
93b291e0 2741 __git_wrap__git_main
b0a4b2d2
FC
2742}
2743
2744# wrapper for backwards compatibility
2745_gitk ()
2746{
93b291e0 2747 __git_wrap__gitk_main
b0a4b2d2
FC
2748}
2749
93b291e0
SG
2750__git_complete git __git_main
2751__git_complete gitk __gitk_main
690d8824
JH
2752
2753# The following are necessary only for Cygwin, and only are needed
2754# when the user has tab-completed the executable name and consequently
2755# included the '.exe' suffix.
2756#
76c3eb51 2757if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
93b291e0 2758__git_complete git.exe __git_main
76c3eb51 2759fi