]> git.ipfire.org Git - thirdparty/git.git/blame - contrib/completion/git-completion.bash
bash completion: refactor common log, shortlog and gitk options
[thirdparty/git.git] / contrib / completion / git-completion.bash
CommitLineData
a42577d4 1#!bash
690d8824
JH
2#
3# bash completion support for core Git.
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
c70680ce 16# *) common --long-options
690d8824
JH
17#
18# To use these routines:
19#
20# 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
21# 2) Added the following line to your .bashrc:
22# source ~/.git-completion.sh
23#
b51ec6bd
SP
24# 3) You may want to make sure the git executable is available
25# in your PATH before this script is sourced, as some caching
26# is performed while the script loads. If git isn't found
27# at source time then all lookups will be done on demand,
28# which may be slightly slower.
29#
30# 4) Consider changing your PS1 to also show the current branch:
d3d717a4
SP
31# PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
32#
33# The argument to __git_ps1 will be displayed only if you
34# are currently in a git repository. The %s token will be
35# the name of the current branch.
36#
a9ee90d7
TP
37# In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
38# value, unstaged (*) and staged (+) changes will be shown next
39# to the branch name. You can configure this per-repository
40# with the bash.showDirtyState variable, which defaults to true
41# once GIT_PS1_SHOWDIRTYSTATE is enabled.
738a94a9 42#
c70680ce
SP
43# To submit patches:
44#
45# *) Read Documentation/SubmittingPatches
46# *) Send all patches to the current maintainer:
47#
48# "Shawn O. Pearce" <spearce@spearce.org>
49#
50# *) Always CC the Git mailing list:
51#
52# git@vger.kernel.org
53#
690d8824 54
db8a9ff0
SP
55case "$COMP_WORDBREAKS" in
56*:*) : great ;;
57*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
58esac
59
a42577d4
TP
60# __gitdir accepts 0 or 1 arguments (i.e., location)
61# returns location of .git repo
873537fa
SP
62__gitdir ()
63{
25a31f81 64 if [ -z "${1-}" ]; then
67ffa114
SP
65 if [ -n "$__git_dir" ]; then
66 echo "$__git_dir"
67 elif [ -d .git ]; then
68 echo .git
69 else
70 git rev-parse --git-dir 2>/dev/null
71 fi
72 elif [ -d "$1/.git" ]; then
73 echo "$1/.git"
74 else
75 echo "$1"
76 fi
873537fa
SP
77}
78
a42577d4
TP
79# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
80# returns text to add to bash PS1 prompt (includes branch name)
d3d717a4
SP
81__git_ps1 ()
82{
e7520196
RR
83 local g="$(git rev-parse --git-dir 2>/dev/null)"
84 if [ -n "$g" ]; then
85 local r
86 local b
51ef1daa 87 if [ -d "$g/rebase-apply" ]
e7520196 88 then
51ef1daa 89 if test -f "$g/rebase-apply/rebasing"
3041c324
JH
90 then
91 r="|REBASE"
51ef1daa 92 elif test -f "$g/rebase-apply/applying"
3041c324
JH
93 then
94 r="|AM"
95 else
96 r="|AM/REBASE"
97 fi
e7520196 98 b="$(git symbolic-ref HEAD 2>/dev/null)"
28ed6e7b 99 elif [ -f "$g/rebase-merge/interactive" ]
e7520196
RR
100 then
101 r="|REBASE-i"
28ed6e7b
JS
102 b="$(cat "$g/rebase-merge/head-name")"
103 elif [ -d "$g/rebase-merge" ]
e7520196
RR
104 then
105 r="|REBASE-m"
28ed6e7b 106 b="$(cat "$g/rebase-merge/head-name")"
e7520196
RR
107 elif [ -f "$g/MERGE_HEAD" ]
108 then
109 r="|MERGING"
110 b="$(git symbolic-ref HEAD 2>/dev/null)"
111 else
a5c4f85b 112 if [ -f "$g/BISECT_LOG" ]
e7520196
RR
113 then
114 r="|BISECTING"
115 fi
116 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
117 then
27c57888
SP
118 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
119 then
a5c4f85b 120 b="$(cut -c1-7 "$g/HEAD")..."
27c57888 121 fi
e7520196
RR
122 fi
123 fi
124
738a94a9
TR
125 local w
126 local i
127
cf995787 128 if test -n "${GIT_PS1_SHOWDIRTYSTATE-}"; then
738a94a9
TR
129 if test "$(git config --bool bash.showDirtyState)" != "false"; then
130 git diff --no-ext-diff --ignore-submodules \
131 --quiet --exit-code || w="*"
132 if git rev-parse --quiet --verify HEAD >/dev/null; then
133 git diff-index --cached --quiet \
134 --ignore-submodules HEAD -- || i="+"
135 else
136 i="#"
137 fi
138 fi
139 fi
140
25a31f81 141 if [ -n "${1-}" ]; then
738a94a9 142 printf "$1" "${b##refs/heads/}$w$i$r"
d3d717a4 143 else
738a94a9 144 printf " (%s)" "${b##refs/heads/}$w$i$r"
d3d717a4
SP
145 fi
146 fi
147}
148
a42577d4 149# __gitcomp_1 requires 2 arguments
ab02dfe5
SP
150__gitcomp_1 ()
151{
152 local c IFS=' '$'\t'$'\n'
153 for c in $1; do
154 case "$c$2" in
155 --*=*) printf %s$'\n' "$c$2" ;;
156 *.) printf %s$'\n' "$c$2" ;;
157 *) printf %s$'\n' "$c$2 " ;;
158 esac
159 done
160}
161
a42577d4
TP
162# __gitcomp accepts 1, 2, 3, or 4 arguments
163# generates completion reply with compgen
72e5e989
SP
164__gitcomp ()
165{
78d4d6a2 166 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775 167 if [ $# -gt 2 ]; then
78d4d6a2
SP
168 cur="$3"
169 fi
5447aac7
SG
170 case "$cur" in
171 --*=)
172 COMPREPLY=()
5447aac7
SG
173 ;;
174 *)
ab02dfe5 175 local IFS=$'\n'
25a31f81
TP
176 COMPREPLY=($(compgen -P "${2-}" \
177 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
ab02dfe5 178 -- "$cur"))
5447aac7
SG
179 ;;
180 esac
72e5e989
SP
181}
182
a42577d4 183# __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
5de40f59
SP
184__git_heads ()
185{
25a31f81 186 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
5de40f59 187 if [ -d "$dir" ]; then
05e8b3d6
SG
188 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
189 refs/heads
5de40f59
SP
190 return
191 fi
25a31f81 192 for i in $(git ls-remote "${1-}" 2>/dev/null); do
5de40f59
SP
193 case "$is_hash,$i" in
194 y,*) is_hash=n ;;
195 n,*^{}) is_hash=y ;;
196 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
197 n,*) is_hash=y; echo "$i" ;;
198 esac
199 done
200}
201
a42577d4 202# __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
88e21dc7
SP
203__git_tags ()
204{
25a31f81 205 local cmd i is_hash=y dir="$(__gitdir "${1-}")"
88e21dc7 206 if [ -d "$dir" ]; then
05e8b3d6
SG
207 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
208 refs/tags
88e21dc7
SP
209 return
210 fi
25a31f81 211 for i in $(git ls-remote "${1-}" 2>/dev/null); do
88e21dc7
SP
212 case "$is_hash,$i" in
213 y,*) is_hash=n ;;
214 n,*^{}) is_hash=y ;;
215 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
216 n,*) is_hash=y; echo "$i" ;;
217 esac
218 done
219}
220
a42577d4 221# __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
690d8824
JH
222__git_refs ()
223{
25a31f81 224 local i is_hash=y dir="$(__gitdir "${1-}")"
608efb87 225 local cur="${COMP_WORDS[COMP_CWORD]}" format refs
873537fa 226 if [ -d "$dir" ]; then
608efb87
SG
227 case "$cur" in
228 refs|refs/*)
229 format="refname"
230 refs="${cur%/*}"
231 ;;
232 *)
233 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
234 format="refname:short"
235 refs="refs/tags refs/heads refs/remotes"
236 ;;
237 esac
238 git --git-dir="$dir" for-each-ref --format="%($format)" \
239 $refs
35e65ecc 240 return
690d8824 241 fi
799596a5 242 for i in $(git ls-remote "$dir" 2>/dev/null); do
690d8824
JH
243 case "$is_hash,$i" in
244 y,*) is_hash=n ;;
245 n,*^{}) is_hash=y ;;
246 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
247 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
35e65ecc 248 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
690d8824
JH
249 n,*) is_hash=y; echo "$i" ;;
250 esac
251 done
252}
253
a42577d4 254# __git_refs2 requires 1 argument (to pass to __git_refs)
690d8824
JH
255__git_refs2 ()
256{
67ffa114
SP
257 local i
258 for i in $(__git_refs "$1"); do
259 echo "$i:$i"
690d8824
JH
260 done
261}
262
a42577d4 263# __git_refs_remotes requires 1 argument (to pass to ls-remote)
5de40f59
SP
264__git_refs_remotes ()
265{
266 local cmd i is_hash=y
799596a5 267 for i in $(git ls-remote "$1" 2>/dev/null); do
5de40f59
SP
268 case "$is_hash,$i" in
269 n,refs/heads/*)
270 is_hash=y
271 echo "$i:refs/remotes/$1/${i#refs/heads/}"
272 ;;
273 y,*) is_hash=n ;;
274 n,*^{}) is_hash=y ;;
275 n,refs/tags/*) is_hash=y;;
276 n,*) is_hash=y; ;;
277 esac
278 done
279}
280
690d8824
JH
281__git_remotes ()
282{
873537fa 283 local i ngoff IFS=$'\n' d="$(__gitdir)"
56fc25f2 284 shopt -q nullglob || ngoff=1
690d8824 285 shopt -s nullglob
873537fa
SP
286 for i in "$d/remotes"/*; do
287 echo ${i#$d/remotes/}
690d8824 288 done
56fc25f2 289 [ "$ngoff" ] && shopt -u nullglob
e0d10e1c 290 for i in $(git --git-dir="$d" config --list); do
56fc25f2
SP
291 case "$i" in
292 remote.*.url=*)
293 i="${i#remote.}"
294 echo "${i/.url=*/}"
295 ;;
296 esac
297 done
690d8824
JH
298}
299
4ad91321
SP
300__git_merge_strategies ()
301{
b51ec6bd
SP
302 if [ -n "$__git_merge_strategylist" ]; then
303 echo "$__git_merge_strategylist"
304 return
305 fi
25b3d4d6
JH
306 git merge -s help 2>&1 |
307 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
308 s/\.$//
309 s/.*://
310 s/^[ ]*//
311 s/[ ]*$//
4ad91321 312 p
25b3d4d6 313 }'
4ad91321 314}
b51ec6bd 315__git_merge_strategylist=
25b3d4d6 316__git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
4ad91321 317
690d8824
JH
318__git_complete_file ()
319{
a79c6551 320 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
690d8824
JH
321 case "$cur" in
322 ?*:*)
a79c6551
SP
323 ref="${cur%%:*}"
324 cur="${cur#*:}"
690d8824
JH
325 case "$cur" in
326 ?*/*)
a79c6551
SP
327 pfx="${cur%/*}"
328 cur="${cur##*/}"
690d8824
JH
329 ls="$ref:$pfx"
330 pfx="$pfx/"
331 ;;
332 *)
333 ls="$ref"
334 ;;
335 esac
db8a9ff0
SP
336
337 case "$COMP_WORDBREAKS" in
338 *:*) : great ;;
339 *) pfx="$ref:$pfx" ;;
340 esac
341
778306e4 342 local IFS=$'\n'
690d8824 343 COMPREPLY=($(compgen -P "$pfx" \
873537fa 344 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
778306e4
SP
345 | sed '/^100... blob /{
346 s,^.* ,,
347 s,$, ,
348 }
349 /^120000 blob /{
350 s,^.* ,,
351 s,$, ,
352 }
690d8824
JH
353 /^040000 tree /{
354 s,^.* ,,
355 s,$,/,
356 }
357 s/^.* //')" \
358 -- "$cur"))
359 ;;
360 *)
b3391775 361 __gitcomp "$(__git_refs)"
690d8824
JH
362 ;;
363 esac
364}
365
f53352fb
SP
366__git_complete_revlist ()
367{
368 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
369 case "$cur" in
370 *...*)
371 pfx="${cur%...*}..."
372 cur="${cur#*...}"
b3391775 373 __gitcomp "$(__git_refs)" "$pfx" "$cur"
f53352fb
SP
374 ;;
375 *..*)
376 pfx="${cur%..*}.."
377 cur="${cur#*..}"
b3391775
SP
378 __gitcomp "$(__git_refs)" "$pfx" "$cur"
379 ;;
f53352fb 380 *)
b3391775 381 __gitcomp "$(__git_refs)"
f53352fb
SP
382 ;;
383 esac
384}
385
1eb7e2f8 386__git_all_commands ()
f2bb9f88 387{
1eb7e2f8
LM
388 if [ -n "$__git_all_commandlist" ]; then
389 echo "$__git_all_commandlist"
b51ec6bd
SP
390 return
391 fi
f2bb9f88
SP
392 local i IFS=" "$'\n'
393 for i in $(git help -a|egrep '^ ')
1eb7e2f8
LM
394 do
395 case $i in
396 *--*) : helper pattern;;
397 *) echo $i;;
398 esac
399 done
400}
401__git_all_commandlist=
402__git_all_commandlist="$(__git_all_commands 2>/dev/null)"
403
404__git_porcelain_commands ()
405{
406 if [ -n "$__git_porcelain_commandlist" ]; then
407 echo "$__git_porcelain_commandlist"
408 return
409 fi
410 local i IFS=" "$'\n'
411 for i in "help" $(__git_all_commands)
f2bb9f88
SP
412 do
413 case $i in
718a087a 414 *--*) : helper pattern;;
a925c6f1
SP
415 applymbox) : ask gittus;;
416 applypatch) : ask gittus;;
417 archimport) : import;;
2e3a430a 418 cat-file) : plumbing;;
56d99c67 419 check-attr) : plumbing;;
f2bb9f88 420 check-ref-format) : plumbing;;
ff2549dc 421 checkout-index) : plumbing;;
f2bb9f88 422 commit-tree) : plumbing;;
ff2549dc 423 count-objects) : infrequent;;
a925c6f1
SP
424 cvsexportcommit) : export;;
425 cvsimport) : import;;
f2bb9f88
SP
426 cvsserver) : daemon;;
427 daemon) : daemon;;
5cfb4fe5
SP
428 diff-files) : plumbing;;
429 diff-index) : plumbing;;
430 diff-tree) : plumbing;;
c6ec3b13 431 fast-import) : import;;
ff2549dc 432 fast-export) : export;;
a925c6f1 433 fsck-objects) : plumbing;;
f2bb9f88 434 fetch-pack) : plumbing;;
a925c6f1 435 fmt-merge-msg) : plumbing;;
56d99c67 436 for-each-ref) : plumbing;;
f2bb9f88
SP
437 hash-object) : plumbing;;
438 http-*) : transport;;
439 index-pack) : plumbing;;
a925c6f1 440 init-db) : deprecated;;
f2bb9f88 441 local-fetch) : plumbing;;
ff2549dc
PB
442 lost-found) : infrequent;;
443 ls-files) : plumbing;;
444 ls-remote) : plumbing;;
445 ls-tree) : plumbing;;
f2bb9f88
SP
446 mailinfo) : plumbing;;
447 mailsplit) : plumbing;;
448 merge-*) : plumbing;;
449 mktree) : plumbing;;
450 mktag) : plumbing;;
451 pack-objects) : plumbing;;
452 pack-redundant) : plumbing;;
453 pack-refs) : plumbing;;
454 parse-remote) : plumbing;;
455 patch-id) : plumbing;;
456 peek-remote) : plumbing;;
a925c6f1
SP
457 prune) : plumbing;;
458 prune-packed) : plumbing;;
459 quiltimport) : import;;
f2bb9f88
SP
460 read-tree) : plumbing;;
461 receive-pack) : plumbing;;
2e3a430a 462 reflog) : plumbing;;
5c66d0d4 463 repo-config) : deprecated;;
f2bb9f88
SP
464 rerere) : plumbing;;
465 rev-list) : plumbing;;
466 rev-parse) : plumbing;;
467 runstatus) : plumbing;;
468 sh-setup) : internal;;
469 shell) : daemon;;
ff2549dc 470 show-ref) : plumbing;;
f2bb9f88
SP
471 send-pack) : plumbing;;
472 show-index) : plumbing;;
473 ssh-*) : transport;;
474 stripspace) : plumbing;;
475 symbolic-ref) : plumbing;;
a925c6f1 476 tar-tree) : deprecated;;
f2bb9f88
SP
477 unpack-file) : plumbing;;
478 unpack-objects) : plumbing;;
a925c6f1 479 update-index) : plumbing;;
f2bb9f88
SP
480 update-ref) : plumbing;;
481 update-server-info) : daemon;;
482 upload-archive) : plumbing;;
483 upload-pack) : plumbing;;
484 write-tree) : plumbing;;
ff2549dc
PB
485 var) : infrequent;;
486 verify-pack) : infrequent;;
a925c6f1 487 verify-tag) : plumbing;;
f2bb9f88
SP
488 *) echo $i;;
489 esac
490 done
491}
1eb7e2f8
LM
492__git_porcelain_commandlist=
493__git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
f2bb9f88 494
367dce2a
DS
495__git_aliases ()
496{
56fc25f2 497 local i IFS=$'\n'
e0d10e1c 498 for i in $(git --git-dir="$(__gitdir)" config --list); do
56fc25f2
SP
499 case "$i" in
500 alias.*)
501 i="${i#alias.}"
502 echo "${i/=*/}"
503 ;;
504 esac
505 done
367dce2a
DS
506}
507
a42577d4 508# __git_aliased_command requires 1 argument
367dce2a
DS
509__git_aliased_command ()
510{
873537fa 511 local word cmdline=$(git --git-dir="$(__gitdir)" \
e0d10e1c 512 config --get "alias.$1")
367dce2a
DS
513 for word in $cmdline; do
514 if [ "${word##-*}" ]; then
515 echo $word
516 return
517 fi
518 done
519}
520
a42577d4 521# __git_find_subcommand requires 1 argument
3ff1320d
SG
522__git_find_subcommand ()
523{
524 local word subcommand c=1
525
526 while [ $c -lt $COMP_CWORD ]; do
527 word="${COMP_WORDS[c]}"
528 for subcommand in $1; do
529 if [ "$subcommand" = "$word" ]; then
530 echo "$subcommand"
531 return
532 fi
533 done
534 c=$((++c))
535 done
536}
537
d773c631
SG
538__git_has_doubledash ()
539{
540 local c=1
541 while [ $c -lt $COMP_CWORD ]; do
542 if [ "--" = "${COMP_WORDS[c]}" ]; then
543 return 0
544 fi
545 c=$((++c))
546 done
547 return 1
548}
549
7950659d 550__git_whitespacelist="nowarn warn error error-all fix"
88329195
SP
551
552_git_am ()
553{
28ed6e7b 554 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
51ef1daa 555 if [ -d "$dir"/rebase-apply ]; then
a31c00b0 556 __gitcomp "--skip --resolved --abort"
88329195
SP
557 return
558 fi
559 case "$cur" in
560 --whitespace=*)
b3391775 561 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
562 return
563 ;;
564 --*)
b3391775 565 __gitcomp "
88329195
SP
566 --signoff --utf8 --binary --3way --interactive
567 --whitespace=
b3391775 568 "
88329195
SP
569 return
570 esac
571 COMPREPLY=()
572}
573
574_git_apply ()
575{
576 local cur="${COMP_WORDS[COMP_CWORD]}"
577 case "$cur" in
578 --whitespace=*)
b3391775 579 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
580 return
581 ;;
582 --*)
b3391775 583 __gitcomp "
88329195
SP
584 --stat --numstat --summary --check --index
585 --cached --index-info --reverse --reject --unidiff-zero
586 --apply --no-add --exclude=
587 --whitespace= --inaccurate-eof --verbose
b3391775 588 "
88329195
SP
589 return
590 esac
591 COMPREPLY=()
592}
593
8435b548
SP
594_git_add ()
595{
d773c631
SG
596 __git_has_doubledash && return
597
8435b548
SP
598 local cur="${COMP_WORDS[COMP_CWORD]}"
599 case "$cur" in
600 --*)
1d284cba
SG
601 __gitcomp "
602 --interactive --refresh --patch --update --dry-run
c9a114b5 603 --ignore-errors --intent-to-add
1d284cba 604 "
8435b548
SP
605 return
606 esac
607 COMPREPLY=()
608}
609
b3191ce2
LM
610_git_archive ()
611{
612 local cur="${COMP_WORDS[COMP_CWORD]}"
613 case "$cur" in
614 --format=*)
615 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
616 return
617 ;;
618 --remote=*)
619 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
620 return
621 ;;
622 --*)
623 __gitcomp "
624 --format= --list --verbose
625 --prefix= --remote= --exec=
626 "
627 return
628 ;;
629 esac
630 __git_complete_file
631}
632
b2e69f62
SP
633_git_bisect ()
634{
d773c631
SG
635 __git_has_doubledash && return
636
bf11d461 637 local subcommands="start bad good skip reset visualize replay log run"
3ff1320d
SG
638 local subcommand="$(__git_find_subcommand "$subcommands")"
639 if [ -z "$subcommand" ]; then
640 __gitcomp "$subcommands"
b2e69f62
SP
641 return
642 fi
643
3ff1320d 644 case "$subcommand" in
bf11d461 645 bad|good|reset|skip)
b2e69f62
SP
646 __gitcomp "$(__git_refs)"
647 ;;
648 *)
649 COMPREPLY=()
650 ;;
651 esac
652}
653
690d8824
JH
654_git_branch ()
655{
b9217642
SG
656 local i c=1 only_local_ref="n" has_r="n"
657
658 while [ $c -lt $COMP_CWORD ]; do
659 i="${COMP_WORDS[c]}"
660 case "$i" in
661 -d|-m) only_local_ref="y" ;;
662 -r) has_r="y" ;;
663 esac
664 c=$((++c))
665 done
666
3b376b0c 667 case "${COMP_WORDS[COMP_CWORD]}" in
3b376b0c
SG
668 --*)
669 __gitcomp "
670 --color --no-color --verbose --abbrev= --no-abbrev
50e61025 671 --track --no-track --contains --merged --no-merged
3b376b0c
SG
672 "
673 ;;
b9217642
SG
674 *)
675 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
676 __gitcomp "$(__git_heads)"
677 else
678 __gitcomp "$(__git_refs)"
679 fi
680 ;;
3b376b0c 681 esac
690d8824
JH
682}
683
374a58c9
ML
684_git_bundle ()
685{
8d8163f3
SG
686 local cmd="${COMP_WORDS[2]}"
687 case "$COMP_CWORD" in
688 2)
374a58c9
ML
689 __gitcomp "create list-heads verify unbundle"
690 ;;
8d8163f3 691 3)
374a58c9
ML
692 # looking for a file
693 ;;
694 *)
695 case "$cmd" in
696 create)
697 __git_complete_revlist
698 ;;
699 esac
700 ;;
701 esac
702}
703
690d8824
JH
704_git_checkout ()
705{
c84bb14c
SG
706 __git_has_doubledash && return
707
b3391775 708 __gitcomp "$(__git_refs)"
690d8824
JH
709}
710
d8a9fea5
SP
711_git_cherry ()
712{
713 __gitcomp "$(__git_refs)"
714}
715
1273231e
SP
716_git_cherry_pick ()
717{
718 local cur="${COMP_WORDS[COMP_CWORD]}"
719 case "$cur" in
720 --*)
b3391775 721 __gitcomp "--edit --no-commit"
1273231e
SP
722 ;;
723 *)
b3391775 724 __gitcomp "$(__git_refs)"
1273231e
SP
725 ;;
726 esac
727}
728
4181c7e8
LM
729_git_clean ()
730{
731 __git_has_doubledash && return
732
733 local cur="${COMP_WORDS[COMP_CWORD]}"
734 case "$cur" in
735 --*)
736 __gitcomp "--dry-run --quiet"
737 return
738 ;;
739 esac
740 COMPREPLY=()
741}
742
3eb11012
LM
743_git_clone ()
744{
745 local cur="${COMP_WORDS[COMP_CWORD]}"
746 case "$cur" in
747 --*)
748 __gitcomp "
749 --local
750 --no-hardlinks
751 --shared
752 --reference
753 --quiet
754 --no-checkout
755 --bare
756 --mirror
757 --origin
758 --upload-pack
759 --template=
760 --depth
761 "
762 return
763 ;;
764 esac
765 COMPREPLY=()
766}
767
4548e855
SP
768_git_commit ()
769{
d773c631
SG
770 __git_has_doubledash && return
771
4548e855
SP
772 local cur="${COMP_WORDS[COMP_CWORD]}"
773 case "$cur" in
774 --*)
b3391775 775 __gitcomp "
4548e855 776 --all --author= --signoff --verify --no-verify
aa5735be 777 --edit --amend --include --only --interactive
b3391775 778 "
4548e855
SP
779 return
780 esac
781 COMPREPLY=()
782}
783
217926c0
SP
784_git_describe ()
785{
cbb504c9
TR
786 local cur="${COMP_WORDS[COMP_CWORD]}"
787 case "$cur" in
788 --*)
789 __gitcomp "
790 --all --tags --contains --abbrev= --candidates=
791 --exact-match --debug --long --match --always
792 "
793 return
794 esac
217926c0
SP
795 __gitcomp "$(__git_refs)"
796}
797
20bf7292 798__git_diff_common_options="--stat --numstat --shortstat --summary
b3a4f858
JS
799 --patch-with-stat --name-only --name-status --color
800 --no-color --color-words --no-renames --check
f135aacb 801 --full-index --binary --abbrev --diff-filter=
47d5a8fa 802 --find-copies-harder
b3a4f858
JS
803 --text --ignore-space-at-eol --ignore-space-change
804 --ignore-all-space --exit-code --quiet --ext-diff
aba201c6
PO
805 --no-ext-diff
806 --no-prefix --src-prefix= --dst-prefix=
6d0e674a 807 --inter-hunk-context=
cc545709 808 --patience
20bf7292
TR
809 --raw
810"
811
812_git_diff ()
813{
814 __git_has_doubledash && return
815
816 local cur="${COMP_WORDS[COMP_CWORD]}"
817 case "$cur" in
818 --*)
819 __gitcomp "--cached --pickaxe-all --pickaxe-regex
820 --base --ours --theirs
821 $__git_diff_common_options
aba201c6 822 "
b3a4f858
JS
823 return
824 ;;
825 esac
690d8824
JH
826 __git_complete_file
827}
828
690d8824
JH
829_git_fetch ()
830{
831 local cur="${COMP_WORDS[COMP_CWORD]}"
832
5a625b07 833 if [ "$COMP_CWORD" = 2 ]; then
b3391775 834 __gitcomp "$(__git_remotes)"
5a625b07 835 else
690d8824
JH
836 case "$cur" in
837 *:*)
db8a9ff0
SP
838 local pfx=""
839 case "$COMP_WORDBREAKS" in
840 *:*) : great ;;
841 *) pfx="${cur%%:*}:" ;;
842 esac
843 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
690d8824
JH
844 ;;
845 *)
8d8163f3 846 __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
690d8824
JH
847 ;;
848 esac
5a625b07 849 fi
690d8824
JH
850}
851
f53352fb
SP
852_git_format_patch ()
853{
854 local cur="${COMP_WORDS[COMP_CWORD]}"
855 case "$cur" in
856 --*)
b3391775 857 __gitcomp "
f53352fb
SP
858 --stdout --attach --thread
859 --output-directory
860 --numbered --start-number
47e98eec 861 --numbered-files
f53352fb
SP
862 --keep-subject
863 --signoff
864 --in-reply-to=
865 --full-index --binary
ec804891 866 --not --all
be5f5bf0 867 --cover-letter
aba201c6 868 --no-prefix --src-prefix= --dst-prefix=
81085134
SG
869 --inline --suffix= --ignore-if-in-upstream
870 --subject-prefix=
b3391775 871 "
f53352fb
SP
872 return
873 ;;
874 esac
875 __git_complete_revlist
876}
877
b26c8748
SP
878_git_gc ()
879{
880 local cur="${COMP_WORDS[COMP_CWORD]}"
881 case "$cur" in
882 --*)
47e98eec 883 __gitcomp "--prune --aggressive"
b26c8748
SP
884 return
885 ;;
886 esac
887 COMPREPLY=()
888}
889
c72e0db1
LM
890_git_grep ()
891{
892 __git_has_doubledash && return
893
894 local cur="${COMP_WORDS[COMP_CWORD]}"
895 case "$cur" in
896 --*)
897 __gitcomp "
898 --cached
899 --text --ignore-case --word-regexp --invert-match
900 --full-name
901 --extended-regexp --basic-regexp --fixed-strings
902 --files-with-matches --name-only
903 --files-without-match
904 --count
905 --and --or --not --all-match
906 "
907 return
908 ;;
909 esac
910 COMPREPLY=()
911}
912
1eb7e2f8
LM
913_git_help ()
914{
915 local cur="${COMP_WORDS[COMP_CWORD]}"
916 case "$cur" in
917 --*)
918 __gitcomp "--all --info --man --web"
919 return
920 ;;
921 esac
2946cccf
MG
922 __gitcomp "$(__git_all_commands)
923 attributes cli core-tutorial cvs-migration
924 diffcore gitk glossary hooks ignore modules
925 repository-layout tutorial tutorial-2
99f0b599 926 workflows
2946cccf 927 "
1eb7e2f8
LM
928}
929
5dad868b
LM
930_git_init ()
931{
932 local cur="${COMP_WORDS[COMP_CWORD]}"
933 case "$cur" in
934 --shared=*)
935 __gitcomp "
936 false true umask group all world everybody
937 " "" "${cur##--shared=}"
938 return
939 ;;
940 --*)
941 __gitcomp "--quiet --bare --template= --shared --shared="
942 return
943 ;;
944 esac
945 COMPREPLY=()
946}
947
b1bc1494
LM
948_git_ls_files ()
949{
950 __git_has_doubledash && return
951
952 local cur="${COMP_WORDS[COMP_CWORD]}"
953 case "$cur" in
954 --*)
955 __gitcomp "--cached --deleted --modified --others --ignored
956 --stage --directory --no-empty-directory --unmerged
957 --killed --exclude= --exclude-from=
958 --exclude-per-directory= --exclude-standard
959 --error-unmatch --with-tree= --full-name
960 --abbrev --ignored --exclude-per-directory
961 "
962 return
963 ;;
964 esac
965 COMPREPLY=()
966}
967
690d8824
JH
968_git_ls_remote ()
969{
b3391775 970 __gitcomp "$(__git_remotes)"
690d8824
JH
971}
972
973_git_ls_tree ()
974{
975 __git_complete_file
976}
977
a393777e
TR
978# Options that go well for log, shortlog and gitk
979__git_log_common_options="
980 --not --all
981 --branches --tags --remotes
982 --first-parent --no-merges
983 --max-count=
984 --max-age= --since= --after=
985 --min-age= --until= --before=
986"
987# Options that go well for log and gitk (not shortlog)
988__git_log_gitk_options="
989 --dense --sparse --full-history
990 --simplify-merges --simplify-by-decoration
991 --left-right
992"
993# Options that go well for log and shortlog (not gitk)
994__git_log_shortlog_options="
995 --author= --committer= --grep=
996 --all-match
997"
998
3d279863
SG
999__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1000
690d8824
JH
1001_git_log ()
1002{
d773c631
SG
1003 __git_has_doubledash && return
1004
6e31b866
SP
1005 local cur="${COMP_WORDS[COMP_CWORD]}"
1006 case "$cur" in
1007 --pretty=*)
3d279863 1008 __gitcomp "$__git_log_pretty_formats
b3391775 1009 " "" "${cur##--pretty=}"
6e31b866
SP
1010 return
1011 ;;
47e98eec
SP
1012 --date=*)
1013 __gitcomp "
1014 relative iso8601 rfc2822 short local default
1015 " "" "${cur##--date=}"
1016 return
1017 ;;
6e31b866 1018 --*)
b3391775 1019 __gitcomp "
a393777e
TR
1020 $__git_log_common_options
1021 $__git_log_shortlog_options
1022 $__git_log_gitk_options
8f87fae6 1023 --root --topo-order --date-order --reverse
a393777e 1024 --follow
6e31b866 1025 --abbrev-commit --abbrev=
47e98eec 1026 --relative-date --date=
20bf7292 1027 --pretty=
a393777e 1028 --cherry-pick
20827d99 1029 --graph
20bf7292
TR
1030 --decorate
1031 --walk-reflogs
a393777e 1032 --parents --children
5a13c8f6 1033 --merge
20bf7292 1034 $__git_diff_common_options
47d5a8fa 1035 --pickaxe-all --pickaxe-regex
b3391775 1036 "
6e31b866
SP
1037 return
1038 ;;
1039 esac
f53352fb 1040 __git_complete_revlist
690d8824
JH
1041}
1042
4ad91321
SP
1043_git_merge ()
1044{
1045 local cur="${COMP_WORDS[COMP_CWORD]}"
ce1e39d2
SP
1046 case "${COMP_WORDS[COMP_CWORD-1]}" in
1047 -s|--strategy)
b3391775 1048 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
1049 return
1050 esac
4ad91321 1051 case "$cur" in
ce1e39d2 1052 --strategy=*)
b3391775 1053 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
1054 return
1055 ;;
4ad91321 1056 --*)
b3391775 1057 __gitcomp "
efb779f8 1058 --no-commit --no-stat --log --no-log --squash --strategy
d532ebd5 1059 --commit --stat --no-squash --ff --no-ff
b3391775 1060 "
4ad91321
SP
1061 return
1062 esac
b3391775 1063 __gitcomp "$(__git_refs)"
4ad91321
SP
1064}
1065
b4c72162
LM
1066_git_mergetool ()
1067{
1068 local cur="${COMP_WORDS[COMP_CWORD]}"
1069 case "$cur" in
1070 --tool=*)
1071 __gitcomp "
1072 kdiff3 tkdiff meld xxdiff emerge
1073 vimdiff gvimdiff ecmerge opendiff
1074 " "" "${cur##--tool=}"
1075 return
1076 ;;
1077 --*)
1078 __gitcomp "--tool="
1079 return
1080 ;;
1081 esac
1082 COMPREPLY=()
1083}
1084
690d8824
JH
1085_git_merge_base ()
1086{
b3391775 1087 __gitcomp "$(__git_refs)"
690d8824
JH
1088}
1089
1127c51c
LM
1090_git_mv ()
1091{
1092 local cur="${COMP_WORDS[COMP_CWORD]}"
1093 case "$cur" in
1094 --*)
1095 __gitcomp "--dry-run"
1096 return
1097 ;;
1098 esac
1099 COMPREPLY=()
1100}
1101
d33909bf
SP
1102_git_name_rev ()
1103{
b3391775 1104 __gitcomp "--tags --all --stdin"
d33909bf
SP
1105}
1106
690d8824
JH
1107_git_pull ()
1108{
1109 local cur="${COMP_WORDS[COMP_CWORD]}"
1110
5a625b07 1111 if [ "$COMP_CWORD" = 2 ]; then
b3391775 1112 __gitcomp "$(__git_remotes)"
5a625b07 1113 else
8d8163f3 1114 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
5a625b07 1115 fi
690d8824
JH
1116}
1117
1118_git_push ()
1119{
1120 local cur="${COMP_WORDS[COMP_CWORD]}"
1121
5a625b07 1122 if [ "$COMP_CWORD" = 2 ]; then
b3391775 1123 __gitcomp "$(__git_remotes)"
5a625b07 1124 else
690d8824
JH
1125 case "$cur" in
1126 *:*)
db8a9ff0
SP
1127 local pfx=""
1128 case "$COMP_WORDBREAKS" in
1129 *:*) : great ;;
1130 *) pfx="${cur%%:*}:" ;;
1131 esac
1132
8d8163f3 1133 __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
690d8824 1134 ;;
161fea83
SP
1135 +*)
1136 __gitcomp "$(__git_refs)" + "${cur#+}"
1137 ;;
690d8824 1138 *)
92d7c8e3 1139 __gitcomp "$(__git_refs)"
690d8824
JH
1140 ;;
1141 esac
5a625b07 1142 fi
690d8824
JH
1143}
1144
61d926a3
SP
1145_git_rebase ()
1146{
51fe1209 1147 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
51ef1daa 1148 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
b3391775 1149 __gitcomp "--continue --skip --abort"
61d926a3
SP
1150 return
1151 fi
ce1e39d2
SP
1152 case "${COMP_WORDS[COMP_CWORD-1]}" in
1153 -s|--strategy)
b3391775 1154 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
1155 return
1156 esac
61d926a3 1157 case "$cur" in
ce1e39d2 1158 --strategy=*)
b3391775 1159 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
1160 return
1161 ;;
61d926a3 1162 --*)
d9e3b702 1163 __gitcomp "--onto --merge --strategy --interactive"
61d926a3
SP
1164 return
1165 esac
b3391775 1166 __gitcomp "$(__git_refs)"
61d926a3
SP
1167}
1168
25a1f374
TL
1169_git_send_email ()
1170{
1171 local cur="${COMP_WORDS[COMP_CWORD]}"
1172 case "$cur" in
1173 --*)
1174 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1175 --dry-run --envelope-sender --from --identity
1176 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1177 --no-suppress-from --no-thread --quiet
1178 --signed-off-by-cc --smtp-pass --smtp-server
1179 --smtp-server-port --smtp-ssl --smtp-user --subject
fd3a8dcb
TL
1180 --suppress-cc --suppress-from --thread --to
1181 --validate --no-validate"
25a1f374
TL
1182 return
1183 ;;
1184 esac
1185 COMPREPLY=()
1186}
1187
e0d10e1c 1188_git_config ()
5de40f59
SP
1189{
1190 local cur="${COMP_WORDS[COMP_CWORD]}"
1191 local prv="${COMP_WORDS[COMP_CWORD-1]}"
1192 case "$prv" in
1193 branch.*.remote)
78d4d6a2 1194 __gitcomp "$(__git_remotes)"
5de40f59
SP
1195 return
1196 ;;
1197 branch.*.merge)
78d4d6a2 1198 __gitcomp "$(__git_refs)"
5de40f59
SP
1199 return
1200 ;;
1201 remote.*.fetch)
1202 local remote="${prv#remote.}"
1203 remote="${remote%.fetch}"
78d4d6a2 1204 __gitcomp "$(__git_refs_remotes "$remote")"
5de40f59
SP
1205 return
1206 ;;
1207 remote.*.push)
1208 local remote="${prv#remote.}"
1209 remote="${remote%.push}"
78d4d6a2 1210 __gitcomp "$(git --git-dir="$(__gitdir)" \
5de40f59 1211 for-each-ref --format='%(refname):%(refname)' \
78d4d6a2
SP
1212 refs/heads)"
1213 return
1214 ;;
1215 pull.twohead|pull.octopus)
1216 __gitcomp "$(__git_merge_strategies)"
1217 return
1218 ;;
901d615c 1219 color.branch|color.diff|color.interactive|color.status|color.ui)
78d4d6a2
SP
1220 __gitcomp "always never auto"
1221 return
1222 ;;
901d615c
MK
1223 color.pager)
1224 __gitcomp "false true"
1225 return
1226 ;;
78d4d6a2
SP
1227 color.*.*)
1228 __gitcomp "
98171a07 1229 normal black red green yellow blue magenta cyan white
78d4d6a2
SP
1230 bold dim ul blink reverse
1231 "
5de40f59
SP
1232 return
1233 ;;
1234 *.*)
1235 COMPREPLY=()
1236 return
1237 ;;
1238 esac
1239 case "$cur" in
1240 --*)
78d4d6a2 1241 __gitcomp "
47e98eec 1242 --global --system --file=
12977705 1243 --list --replace-all
5de40f59 1244 --get --get-all --get-regexp
1b71eb35 1245 --add --unset --unset-all
12977705 1246 --remove-section --rename-section
78d4d6a2 1247 "
5de40f59
SP
1248 return
1249 ;;
1250 branch.*.*)
1251 local pfx="${cur%.*}."
1252 cur="${cur##*.}"
98171a07 1253 __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
5de40f59
SP
1254 return
1255 ;;
1256 branch.*)
1257 local pfx="${cur%.*}."
1258 cur="${cur#*.}"
78d4d6a2 1259 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
5de40f59
SP
1260 return
1261 ;;
1262 remote.*.*)
1263 local pfx="${cur%.*}."
1264 cur="${cur##*.}"
12977705 1265 __gitcomp "
98171a07 1266 url proxy fetch push mirror skipDefaultUpdate
12977705
SP
1267 receivepack uploadpack tagopt
1268 " "$pfx" "$cur"
5de40f59
SP
1269 return
1270 ;;
1271 remote.*)
1272 local pfx="${cur%.*}."
1273 cur="${cur#*.}"
78d4d6a2 1274 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
5de40f59
SP
1275 return
1276 ;;
1277 esac
78d4d6a2 1278 __gitcomp "
5de40f59 1279 apply.whitespace
98171a07
LM
1280 branch.autosetupmerge
1281 branch.autosetuprebase
2122591b 1282 clean.requireForce
78d4d6a2
SP
1283 color.branch
1284 color.branch.current
1285 color.branch.local
78d4d6a2 1286 color.branch.plain
025a1929 1287 color.branch.remote
a159ca0c 1288 color.diff
025a1929 1289 color.diff.commit
78d4d6a2 1290 color.diff.frag
025a1929 1291 color.diff.meta
78d4d6a2 1292 color.diff.new
025a1929
LM
1293 color.diff.old
1294 color.diff.plain
78d4d6a2 1295 color.diff.whitespace
98171a07
LM
1296 color.interactive
1297 color.interactive.header
1298 color.interactive.help
1299 color.interactive.prompt
a159ca0c 1300 color.pager
a159ca0c 1301 color.status
78d4d6a2
SP
1302 color.status.added
1303 color.status.changed
025a1929 1304 color.status.header
98171a07 1305 color.status.nobranch
78d4d6a2 1306 color.status.untracked
98171a07
LM
1307 color.status.updated
1308 color.ui
1309 commit.template
1310 core.autocrlf
1311 core.bare
025a1929 1312 core.compression
98171a07
LM
1313 core.deltaBaseCacheLimit
1314 core.editor
1315 core.excludesfile
025a1929 1316 core.fileMode
98171a07 1317 core.fsyncobjectfiles
025a1929 1318 core.gitProxy
98171a07 1319 core.ignoreCygwinFSTricks
025a1929
LM
1320 core.ignoreStat
1321 core.logAllRefUpdates
1322 core.loosecompression
1323 core.packedGitLimit
1324 core.packedGitWindowSize
98171a07 1325 core.pager
025a1929 1326 core.preferSymlinkRefs
98171a07
LM
1327 core.preloadindex
1328 core.quotepath
025a1929 1329 core.repositoryFormatVersion
98171a07 1330 core.safecrlf
025a1929 1331 core.sharedRepository
98171a07
LM
1332 core.symlinks
1333 core.trustctime
025a1929 1334 core.warnAmbiguousRefs
98171a07
LM
1335 core.whitespace
1336 core.worktree
1337 diff.autorefreshindex
1338 diff.external
1339 diff.mnemonicprefix
78d4d6a2 1340 diff.renameLimit
98171a07 1341 diff.renameLimit.
78d4d6a2
SP
1342 diff.renames
1343 fetch.unpackLimit
1344 format.headers
98171a07
LM
1345 format.numbered
1346 format.pretty
1347 format.suffix
1348 gc.aggressiveWindow
1349 gc.auto
1350 gc.autopacklimit
12977705 1351 gc.packrefs
98171a07 1352 gc.pruneexpire
78d4d6a2
SP
1353 gc.reflogexpire
1354 gc.reflogexpireunreachable
1355 gc.rerereresolved
1356 gc.rerereunresolved
025a1929 1357 gitcvs.allbinary
98171a07 1358 gitcvs.dbTableNamePrefix
025a1929
LM
1359 gitcvs.dbdriver
1360 gitcvs.dbname
1361 gitcvs.dbpass
025a1929
LM
1362 gitcvs.dbuser
1363 gitcvs.enabled
1364 gitcvs.logfile
98171a07
LM
1365 gitcvs.usecrlfattr
1366 gui.blamehistoryctx
1367 gui.commitmsgwidth
1368 gui.copyblamethreshold
1369 gui.diffcontext
1370 gui.encoding
1371 gui.fastcopyblame
1372 gui.matchtrackingbranch
1373 gui.newbranchtemplate
1374 gui.pruneduringfetch
1375 gui.spellingdictionary
1376 gui.trustmtime
1377 help.autocorrect
1378 help.browser
1379 help.format
78d4d6a2
SP
1380 http.lowSpeedLimit
1381 http.lowSpeedTime
025a1929 1382 http.maxRequests
5de40f59 1383 http.noEPSV
98171a07 1384 http.proxy
025a1929
LM
1385 http.sslCAInfo
1386 http.sslCAPath
1387 http.sslCert
1388 http.sslKey
1389 http.sslVerify
78d4d6a2
SP
1390 i18n.commitEncoding
1391 i18n.logOutputEncoding
98171a07
LM
1392 instaweb.browser
1393 instaweb.httpd
1394 instaweb.local
1395 instaweb.modulepath
1396 instaweb.port
1397 log.date
78d4d6a2 1398 log.showroot
98171a07
LM
1399 man.viewer
1400 merge.conflictstyle
1401 merge.log
1402 merge.renameLimit
1403 merge.stat
025a1929 1404 merge.tool
78d4d6a2 1405 merge.verbosity
98171a07 1406 mergetool.keepBackup
47e98eec 1407 pack.compression
47e98eec 1408 pack.deltaCacheLimit
025a1929
LM
1409 pack.deltaCacheSize
1410 pack.depth
98171a07
LM
1411 pack.indexVersion
1412 pack.packSizeLimit
1413 pack.threads
025a1929
LM
1414 pack.window
1415 pack.windowMemory
78d4d6a2
SP
1416 pull.octopus
1417 pull.twohead
98171a07
LM
1418 receive.denyCurrentBranch
1419 receive.denyDeletes
025a1929 1420 receive.denyNonFastForwards
98171a07 1421 receive.fsckObjects
025a1929 1422 receive.unpackLimit
98171a07
LM
1423 repack.usedeltabaseoffset
1424 rerere.autoupdate
1425 rerere.enabled
78d4d6a2 1426 showbranch.default
98171a07
LM
1427 status.relativePaths
1428 status.showUntrackedFiles
78d4d6a2
SP
1429 tar.umask
1430 transfer.unpackLimit
78d4d6a2 1431 user.email
025a1929 1432 user.name
78d4d6a2 1433 user.signingkey
98171a07 1434 web.browser
5de40f59 1435 branch. remote.
78d4d6a2 1436 "
5de40f59
SP
1437}
1438
88293c67
SP
1439_git_remote ()
1440{
f135e72d 1441 local subcommands="add rename rm show prune update"
3ff1320d
SG
1442 local subcommand="$(__git_find_subcommand "$subcommands")"
1443 if [ -z "$subcommand" ]; then
3903c618 1444 __gitcomp "$subcommands"
88293c67
SP
1445 return
1446 fi
1447
3ff1320d 1448 case "$subcommand" in
f135e72d 1449 rename|rm|show|prune)
88293c67
SP
1450 __gitcomp "$(__git_remotes)"
1451 ;;
fb72759b
SP
1452 update)
1453 local i c='' IFS=$'\n'
1454 for i in $(git --git-dir="$(__gitdir)" config --list); do
1455 case "$i" in
1456 remotes.*)
1457 i="${i#remotes.}"
1458 c="$c ${i/=*/}"
1459 ;;
1460 esac
1461 done
1462 __gitcomp "$c"
1463 ;;
88293c67
SP
1464 *)
1465 COMPREPLY=()
1466 ;;
1467 esac
1468}
1469
67e78c3b
SP
1470_git_reset ()
1471{
d773c631
SG
1472 __git_has_doubledash && return
1473
67e78c3b 1474 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775
SP
1475 case "$cur" in
1476 --*)
e89e2ed7 1477 __gitcomp "--merge --mixed --hard --soft"
b3391775
SP
1478 return
1479 ;;
1480 esac
1481 __gitcomp "$(__git_refs)"
67e78c3b
SP
1482}
1483
a6c2be24
LM
1484_git_revert ()
1485{
1486 local cur="${COMP_WORDS[COMP_CWORD]}"
1487 case "$cur" in
1488 --*)
1489 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1490 return
1491 ;;
1492 esac
c0783837 1493 __gitcomp "$(__git_refs)"
a6c2be24
LM
1494}
1495
08c701d4
LM
1496_git_rm ()
1497{
1498 __git_has_doubledash && return
1499
1500 local cur="${COMP_WORDS[COMP_CWORD]}"
1501 case "$cur" in
1502 --*)
1503 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1504 return
1505 ;;
1506 esac
1507 COMPREPLY=()
1508}
1509
1fd6bec9
SP
1510_git_shortlog ()
1511{
d773c631
SG
1512 __git_has_doubledash && return
1513
1fd6bec9
SP
1514 local cur="${COMP_WORDS[COMP_CWORD]}"
1515 case "$cur" in
1516 --*)
1517 __gitcomp "
a393777e
TR
1518 $__git_log_common_options
1519 $__git_log_shortlog_options
1fd6bec9
SP
1520 --numbered --summary
1521 "
1522 return
1523 ;;
1524 esac
1525 __git_complete_revlist
1526}
1527
90131924
SP
1528_git_show ()
1529{
41d8cf7d
MH
1530 __git_has_doubledash && return
1531
90131924
SP
1532 local cur="${COMP_WORDS[COMP_CWORD]}"
1533 case "$cur" in
1534 --pretty=*)
3d279863 1535 __gitcomp "$__git_log_pretty_formats
b3391775 1536 " "" "${cur##--pretty=}"
90131924
SP
1537 return
1538 ;;
1539 --*)
20bf7292
TR
1540 __gitcomp "--pretty=
1541 $__git_diff_common_options
1542 "
90131924
SP
1543 return
1544 ;;
1545 esac
1546 __git_complete_file
1547}
1548
2ca880fe
TR
1549_git_show_branch ()
1550{
1551 local cur="${COMP_WORDS[COMP_CWORD]}"
1552 case "$cur" in
1553 --*)
1554 __gitcomp "
1555 --all --remotes --topo-order --current --more=
1556 --list --independent --merge-base --no-name
1557 --sha1-name --topics --reflog
1558 "
1559 return
1560 ;;
1561 esac
1562 __git_complete_revlist
1563}
1564
7fd53fce
JH
1565_git_stash ()
1566{
95d43780 1567 local subcommands='save list show apply clear drop pop create branch'
7bedebca
SG
1568 local subcommand="$(__git_find_subcommand "$subcommands")"
1569 if [ -z "$subcommand" ]; then
3ff1320d 1570 __gitcomp "$subcommands"
7bedebca
SG
1571 else
1572 local cur="${COMP_WORDS[COMP_CWORD]}"
1573 case "$subcommand,$cur" in
1574 save,--*)
1575 __gitcomp "--keep-index"
1576 ;;
95d43780
LM
1577 apply,--*)
1578 __gitcomp "--index"
1579 ;;
5a7ebd4f 1580 show,--*|drop,--*|pop,--*|branch,--*)
95d43780
LM
1581 COMPREPLY=()
1582 ;;
1583 show,*|apply,*|drop,*|pop,*|branch,*)
1584 __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1585 | sed -n -e 's/:.*//p')"
1586 ;;
7bedebca
SG
1587 *)
1588 COMPREPLY=()
1589 ;;
1590 esac
3ff1320d 1591 fi
7fd53fce
JH
1592}
1593
be86f7a0
SP
1594_git_submodule ()
1595{
d773c631
SG
1596 __git_has_doubledash && return
1597
1b0f7978 1598 local subcommands="add status init update summary foreach sync"
3ff1320d 1599 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
be86f7a0
SP
1600 local cur="${COMP_WORDS[COMP_CWORD]}"
1601 case "$cur" in
1602 --*)
1603 __gitcomp "--quiet --cached"
1604 ;;
1605 *)
3ff1320d 1606 __gitcomp "$subcommands"
be86f7a0
SP
1607 ;;
1608 esac
1609 return
1610 fi
1611}
1612
47f6ee28
SG
1613_git_svn ()
1614{
1615 local subcommands="
1616 init fetch clone rebase dcommit log find-rev
1617 set-tree commit-diff info create-ignore propget
4a5856cb
SG
1618 proplist show-ignore show-externals branch tag blame
1619 migrate
47f6ee28
SG
1620 "
1621 local subcommand="$(__git_find_subcommand "$subcommands")"
1622 if [ -z "$subcommand" ]; then
1623 __gitcomp "$subcommands"
1624 else
1625 local remote_opts="--username= --config-dir= --no-auth-cache"
1626 local fc_opts="
1627 --follow-parent --authors-file= --repack=
1628 --no-metadata --use-svm-props --use-svnsync-props
1629 --log-window-size= --no-checkout --quiet
4a5856cb
SG
1630 --repack-flags --use-log-author --localtime
1631 --ignore-paths= $remote_opts
47f6ee28
SG
1632 "
1633 local init_opts="
1634 --template= --shared= --trunk= --tags=
1635 --branches= --stdlayout --minimize-url
1636 --no-metadata --use-svm-props --use-svnsync-props
4a5856cb
SG
1637 --rewrite-root= --prefix= --use-log-author
1638 --add-author-from $remote_opts
47f6ee28
SG
1639 "
1640 local cmt_opts="
1641 --edit --rmdir --find-copies-harder --copy-similarity=
1642 "
1643
1644 local cur="${COMP_WORDS[COMP_CWORD]}"
1645 case "$subcommand,$cur" in
1646 fetch,--*)
1647 __gitcomp "--revision= --fetch-all $fc_opts"
1648 ;;
1649 clone,--*)
1650 __gitcomp "--revision= $fc_opts $init_opts"
1651 ;;
1652 init,--*)
1653 __gitcomp "$init_opts"
1654 ;;
1655 dcommit,--*)
1656 __gitcomp "
1657 --merge --strategy= --verbose --dry-run
4a5856cb
SG
1658 --fetch-all --no-rebase --commit-url
1659 --revision $cmt_opts $fc_opts
47f6ee28
SG
1660 "
1661 ;;
1662 set-tree,--*)
1663 __gitcomp "--stdin $cmt_opts $fc_opts"
1664 ;;
1665 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1666 show-externals,--*)
1667 __gitcomp "--revision="
1668 ;;
1669 log,--*)
1670 __gitcomp "
1671 --limit= --revision= --verbose --incremental
1672 --oneline --show-commit --non-recursive
4a5856cb 1673 --authors-file= --color
47f6ee28
SG
1674 "
1675 ;;
1676 rebase,--*)
1677 __gitcomp "
1678 --merge --verbose --strategy= --local
4a5856cb 1679 --fetch-all --dry-run $fc_opts
47f6ee28
SG
1680 "
1681 ;;
1682 commit-diff,--*)
1683 __gitcomp "--message= --file= --revision= $cmt_opts"
1684 ;;
1685 info,--*)
1686 __gitcomp "--url"
1687 ;;
4a5856cb
SG
1688 branch,--*)
1689 __gitcomp "--dry-run --message --tag"
1690 ;;
1691 tag,--*)
1692 __gitcomp "--dry-run --message"
1693 ;;
1694 blame,--*)
1695 __gitcomp "--git-format"
1696 ;;
1697 migrate,--*)
1698 __gitcomp "
1699 --config-dir= --ignore-paths= --minimize
1700 --no-auth-cache --username=
1701 "
1702 ;;
47f6ee28
SG
1703 *)
1704 COMPREPLY=()
1705 ;;
1706 esac
1707 fi
1708}
1709
88e21dc7
SP
1710_git_tag ()
1711{
1712 local i c=1 f=0
1713 while [ $c -lt $COMP_CWORD ]; do
1714 i="${COMP_WORDS[c]}"
1715 case "$i" in
1716 -d|-v)
1717 __gitcomp "$(__git_tags)"
1718 return
1719 ;;
1720 -f)
1721 f=1
1722 ;;
1723 esac
1724 c=$((++c))
1725 done
1726
1727 case "${COMP_WORDS[COMP_CWORD-1]}" in
1728 -m|-F)
1729 COMPREPLY=()
1730 ;;
8d8163f3 1731 -*|tag)
88e21dc7
SP
1732 if [ $f = 1 ]; then
1733 __gitcomp "$(__git_tags)"
1734 else
1735 COMPREPLY=()
1736 fi
1737 ;;
1738 *)
1739 __gitcomp "$(__git_refs)"
1740 ;;
1741 esac
1742}
1743
690d8824
JH
1744_git ()
1745{
873537fa
SP
1746 local i c=1 command __git_dir
1747
1748 while [ $c -lt $COMP_CWORD ]; do
1749 i="${COMP_WORDS[c]}"
1750 case "$i" in
1751 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1752 --bare) __git_dir="." ;;
1eb7e2f8
LM
1753 --version|-p|--paginate) ;;
1754 --help) command="help"; break ;;
873537fa
SP
1755 *) command="$i"; break ;;
1756 esac
1757 c=$((++c))
1758 done
1759
1d17b22e 1760 if [ -z "$command" ]; then
72e5e989 1761 case "${COMP_WORDS[COMP_CWORD]}" in
47e98eec 1762 --*) __gitcomp "
ce5a2c95 1763 --paginate
47e98eec
SP
1764 --no-pager
1765 --git-dir=
1766 --bare
1767 --version
1768 --exec-path
ce5a2c95
TL
1769 --work-tree=
1770 --help
47e98eec
SP
1771 "
1772 ;;
1eb7e2f8 1773 *) __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
72e5e989
SP
1774 esac
1775 return
873537fa 1776 fi
367dce2a 1777
873537fa
SP
1778 local expansion=$(__git_aliased_command "$command")
1779 [ "$expansion" ] && command="$expansion"
367dce2a 1780
873537fa 1781 case "$command" in
88329195 1782 am) _git_am ;;
8435b548 1783 add) _git_add ;;
88329195 1784 apply) _git_apply ;;
b3191ce2 1785 archive) _git_archive ;;
b2e69f62 1786 bisect) _git_bisect ;;
374a58c9 1787 bundle) _git_bundle ;;
873537fa 1788 branch) _git_branch ;;
873537fa 1789 checkout) _git_checkout ;;
d8a9fea5 1790 cherry) _git_cherry ;;
1273231e 1791 cherry-pick) _git_cherry_pick ;;
4181c7e8 1792 clean) _git_clean ;;
3eb11012 1793 clone) _git_clone ;;
4548e855 1794 commit) _git_commit ;;
e0d10e1c 1795 config) _git_config ;;
217926c0 1796 describe) _git_describe ;;
873537fa 1797 diff) _git_diff ;;
873537fa 1798 fetch) _git_fetch ;;
f53352fb 1799 format-patch) _git_format_patch ;;
b26c8748 1800 gc) _git_gc ;;
c72e0db1 1801 grep) _git_grep ;;
1eb7e2f8 1802 help) _git_help ;;
5dad868b 1803 init) _git_init ;;
873537fa 1804 log) _git_log ;;
b1bc1494 1805 ls-files) _git_ls_files ;;
873537fa
SP
1806 ls-remote) _git_ls_remote ;;
1807 ls-tree) _git_ls_tree ;;
4ad91321 1808 merge) _git_merge;;
b4c72162 1809 mergetool) _git_mergetool;;
873537fa 1810 merge-base) _git_merge_base ;;
1127c51c 1811 mv) _git_mv ;;
d33909bf 1812 name-rev) _git_name_rev ;;
873537fa
SP
1813 pull) _git_pull ;;
1814 push) _git_push ;;
61d926a3 1815 rebase) _git_rebase ;;
88293c67 1816 remote) _git_remote ;;
873537fa 1817 reset) _git_reset ;;
a6c2be24 1818 revert) _git_revert ;;
08c701d4 1819 rm) _git_rm ;;
25a1f374 1820 send-email) _git_send_email ;;
1fd6bec9 1821 shortlog) _git_shortlog ;;
90131924 1822 show) _git_show ;;
2ca880fe 1823 show-branch) _git_show_branch ;;
7fd53fce 1824 stash) _git_stash ;;
df398771 1825 stage) _git_add ;;
be86f7a0 1826 submodule) _git_submodule ;;
47f6ee28 1827 svn) _git_svn ;;
88e21dc7 1828 tag) _git_tag ;;
873537fa
SP
1829 whatchanged) _git_log ;;
1830 *) COMPREPLY=() ;;
1831 esac
690d8824
JH
1832}
1833
1834_gitk ()
1835{
d773c631
SG
1836 __git_has_doubledash && return
1837
690d8824 1838 local cur="${COMP_WORDS[COMP_CWORD]}"
07ba53f7
RQ
1839 local g="$(git rev-parse --git-dir 2>/dev/null)"
1840 local merge=""
1841 if [ -f $g/MERGE_HEAD ]; then
1842 merge="--merge"
1843 fi
b3391775
SP
1844 case "$cur" in
1845 --*)
a393777e
TR
1846 __gitcomp "
1847 $__git_log_common_options
1848 $__git_log_gitk_options
1849 $merge
1850 "
b3391775
SP
1851 return
1852 ;;
1853 esac
ec804891 1854 __git_complete_revlist
690d8824
JH
1855}
1856
50e126e1
TP
1857complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1858 || complete -o default -o nospace -F _git git
1859complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1860 || complete -o default -o nospace -F _gitk gitk
690d8824
JH
1861
1862# The following are necessary only for Cygwin, and only are needed
1863# when the user has tab-completed the executable name and consequently
1864# included the '.exe' suffix.
1865#
76c3eb51 1866if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
50e126e1
TP
1867complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1868 || complete -o default -o nospace -F _git git.exe
76c3eb51 1869fi