]> git.ipfire.org Git - thirdparty/git.git/blame - contrib/completion/git-completion.bash
svnimport: newer libsvn wants us to ask for the root with "", not "/"
[thirdparty/git.git] / contrib / completion / git-completion.bash
CommitLineData
690d8824
JH
1#
2# bash completion support for core Git.
3#
c70680ce 4# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
690d8824 5# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
c70680ce 6# Distributed under the GNU General Public License, version 2.0.
690d8824
JH
7#
8# The contained completion routines provide support for completing:
9#
10# *) local and remote branch names
11# *) local and remote tag names
12# *) .git/remotes file names
13# *) git 'subcommands'
14# *) tree paths within 'ref:path/to/file' expressions
c70680ce 15# *) common --long-options
690d8824
JH
16#
17# To use these routines:
18#
19# 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
20# 2) Added the following line to your .bashrc:
21# source ~/.git-completion.sh
22#
b51ec6bd
SP
23# 3) You may want to make sure the git executable is available
24# in your PATH before this script is sourced, as some caching
25# is performed while the script loads. If git isn't found
26# at source time then all lookups will be done on demand,
27# which may be slightly slower.
28#
29# 4) Consider changing your PS1 to also show the current branch:
d3d717a4
SP
30# PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
31#
32# The argument to __git_ps1 will be displayed only if you
33# are currently in a git repository. The %s token will be
34# the name of the current branch.
35#
c70680ce
SP
36# To submit patches:
37#
38# *) Read Documentation/SubmittingPatches
39# *) Send all patches to the current maintainer:
40#
41# "Shawn O. Pearce" <spearce@spearce.org>
42#
43# *) Always CC the Git mailing list:
44#
45# git@vger.kernel.org
46#
690d8824 47
db8a9ff0
SP
48case "$COMP_WORDBREAKS" in
49*:*) : great ;;
50*) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
51esac
52
873537fa
SP
53__gitdir ()
54{
67ffa114
SP
55 if [ -z "$1" ]; then
56 if [ -n "$__git_dir" ]; then
57 echo "$__git_dir"
58 elif [ -d .git ]; then
59 echo .git
60 else
61 git rev-parse --git-dir 2>/dev/null
62 fi
63 elif [ -d "$1/.git" ]; then
64 echo "$1/.git"
65 else
66 echo "$1"
67 fi
873537fa
SP
68}
69
d3d717a4
SP
70__git_ps1 ()
71{
e7520196
RR
72 local g="$(git rev-parse --git-dir 2>/dev/null)"
73 if [ -n "$g" ]; then
74 local r
75 local b
51ef1daa 76 if [ -d "$g/rebase-apply" ]
e7520196 77 then
51ef1daa 78 if test -f "$g/rebase-apply/rebasing"
3041c324
JH
79 then
80 r="|REBASE"
51ef1daa 81 elif test -f "$g/rebase-apply/applying"
3041c324
JH
82 then
83 r="|AM"
84 else
85 r="|AM/REBASE"
86 fi
e7520196 87 b="$(git symbolic-ref HEAD 2>/dev/null)"
28ed6e7b 88 elif [ -f "$g/rebase-merge/interactive" ]
e7520196
RR
89 then
90 r="|REBASE-i"
28ed6e7b
JS
91 b="$(cat "$g/rebase-merge/head-name")"
92 elif [ -d "$g/rebase-merge" ]
e7520196
RR
93 then
94 r="|REBASE-m"
28ed6e7b 95 b="$(cat "$g/rebase-merge/head-name")"
e7520196
RR
96 elif [ -f "$g/MERGE_HEAD" ]
97 then
98 r="|MERGING"
99 b="$(git symbolic-ref HEAD 2>/dev/null)"
100 else
a5c4f85b 101 if [ -f "$g/BISECT_LOG" ]
e7520196
RR
102 then
103 r="|BISECTING"
104 fi
105 if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
106 then
27c57888
SP
107 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
108 then
a5c4f85b 109 b="$(cut -c1-7 "$g/HEAD")..."
27c57888 110 fi
e7520196
RR
111 fi
112 fi
113
d3d717a4 114 if [ -n "$1" ]; then
e7520196 115 printf "$1" "${b##refs/heads/}$r"
d3d717a4 116 else
e7520196 117 printf " (%s)" "${b##refs/heads/}$r"
d3d717a4
SP
118 fi
119 fi
120}
121
ab02dfe5
SP
122__gitcomp_1 ()
123{
124 local c IFS=' '$'\t'$'\n'
125 for c in $1; do
126 case "$c$2" in
127 --*=*) printf %s$'\n' "$c$2" ;;
128 *.) printf %s$'\n' "$c$2" ;;
129 *) printf %s$'\n' "$c$2 " ;;
130 esac
131 done
132}
133
72e5e989
SP
134__gitcomp ()
135{
78d4d6a2 136 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775 137 if [ $# -gt 2 ]; then
78d4d6a2
SP
138 cur="$3"
139 fi
5447aac7
SG
140 case "$cur" in
141 --*=)
142 COMPREPLY=()
5447aac7
SG
143 ;;
144 *)
ab02dfe5
SP
145 local IFS=$'\n'
146 COMPREPLY=($(compgen -P "$2" \
147 -W "$(__gitcomp_1 "$1" "$4")" \
148 -- "$cur"))
5447aac7
SG
149 ;;
150 esac
72e5e989
SP
151}
152
5de40f59
SP
153__git_heads ()
154{
67ffa114 155 local cmd i is_hash=y dir="$(__gitdir "$1")"
5de40f59
SP
156 if [ -d "$dir" ]; then
157 for i in $(git --git-dir="$dir" \
158 for-each-ref --format='%(refname)' \
159 refs/heads ); do
160 echo "${i#refs/heads/}"
161 done
162 return
163 fi
799596a5 164 for i in $(git ls-remote "$1" 2>/dev/null); do
5de40f59
SP
165 case "$is_hash,$i" in
166 y,*) is_hash=n ;;
167 n,*^{}) is_hash=y ;;
168 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
169 n,*) is_hash=y; echo "$i" ;;
170 esac
171 done
172}
173
88e21dc7
SP
174__git_tags ()
175{
176 local cmd i is_hash=y dir="$(__gitdir "$1")"
177 if [ -d "$dir" ]; then
178 for i in $(git --git-dir="$dir" \
179 for-each-ref --format='%(refname)' \
180 refs/tags ); do
181 echo "${i#refs/tags/}"
182 done
183 return
184 fi
799596a5 185 for i in $(git ls-remote "$1" 2>/dev/null); do
88e21dc7
SP
186 case "$is_hash,$i" in
187 y,*) is_hash=n ;;
188 n,*^{}) is_hash=y ;;
189 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
190 n,*) is_hash=y; echo "$i" ;;
191 esac
192 done
193}
194
690d8824
JH
195__git_refs ()
196{
67ffa114 197 local cmd i is_hash=y dir="$(__gitdir "$1")"
873537fa 198 if [ -d "$dir" ]; then
35e65ecc
SP
199 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
200 for i in $(git --git-dir="$dir" \
201 for-each-ref --format='%(refname)' \
202 refs/tags refs/heads refs/remotes); do
203 case "$i" in
204 refs/tags/*) echo "${i#refs/tags/}" ;;
205 refs/heads/*) echo "${i#refs/heads/}" ;;
206 refs/remotes/*) echo "${i#refs/remotes/}" ;;
207 *) echo "$i" ;;
208 esac
209 done
210 return
690d8824 211 fi
799596a5 212 for i in $(git ls-remote "$dir" 2>/dev/null); do
690d8824
JH
213 case "$is_hash,$i" in
214 y,*) is_hash=n ;;
215 n,*^{}) is_hash=y ;;
216 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
217 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
35e65ecc 218 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
690d8824
JH
219 n,*) is_hash=y; echo "$i" ;;
220 esac
221 done
222}
223
224__git_refs2 ()
225{
67ffa114
SP
226 local i
227 for i in $(__git_refs "$1"); do
228 echo "$i:$i"
690d8824
JH
229 done
230}
231
5de40f59
SP
232__git_refs_remotes ()
233{
234 local cmd i is_hash=y
799596a5 235 for i in $(git ls-remote "$1" 2>/dev/null); do
5de40f59
SP
236 case "$is_hash,$i" in
237 n,refs/heads/*)
238 is_hash=y
239 echo "$i:refs/remotes/$1/${i#refs/heads/}"
240 ;;
241 y,*) is_hash=n ;;
242 n,*^{}) is_hash=y ;;
243 n,refs/tags/*) is_hash=y;;
244 n,*) is_hash=y; ;;
245 esac
246 done
247}
248
690d8824
JH
249__git_remotes ()
250{
873537fa 251 local i ngoff IFS=$'\n' d="$(__gitdir)"
56fc25f2 252 shopt -q nullglob || ngoff=1
690d8824 253 shopt -s nullglob
873537fa
SP
254 for i in "$d/remotes"/*; do
255 echo ${i#$d/remotes/}
690d8824 256 done
56fc25f2 257 [ "$ngoff" ] && shopt -u nullglob
e0d10e1c 258 for i in $(git --git-dir="$d" config --list); do
56fc25f2
SP
259 case "$i" in
260 remote.*.url=*)
261 i="${i#remote.}"
262 echo "${i/.url=*/}"
263 ;;
264 esac
265 done
690d8824
JH
266}
267
4ad91321
SP
268__git_merge_strategies ()
269{
b51ec6bd
SP
270 if [ -n "$__git_merge_strategylist" ]; then
271 echo "$__git_merge_strategylist"
272 return
273 fi
4ad91321
SP
274 sed -n "/^all_strategies='/{
275 s/^all_strategies='//
276 s/'//
277 p
278 q
279 }" "$(git --exec-path)/git-merge"
280}
b51ec6bd
SP
281__git_merge_strategylist=
282__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
4ad91321 283
690d8824
JH
284__git_complete_file ()
285{
a79c6551 286 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
690d8824
JH
287 case "$cur" in
288 ?*:*)
a79c6551
SP
289 ref="${cur%%:*}"
290 cur="${cur#*:}"
690d8824
JH
291 case "$cur" in
292 ?*/*)
a79c6551
SP
293 pfx="${cur%/*}"
294 cur="${cur##*/}"
690d8824
JH
295 ls="$ref:$pfx"
296 pfx="$pfx/"
297 ;;
298 *)
299 ls="$ref"
300 ;;
301 esac
db8a9ff0
SP
302
303 case "$COMP_WORDBREAKS" in
304 *:*) : great ;;
305 *) pfx="$ref:$pfx" ;;
306 esac
307
778306e4 308 local IFS=$'\n'
690d8824 309 COMPREPLY=($(compgen -P "$pfx" \
873537fa 310 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
778306e4
SP
311 | sed '/^100... blob /{
312 s,^.* ,,
313 s,$, ,
314 }
315 /^120000 blob /{
316 s,^.* ,,
317 s,$, ,
318 }
690d8824
JH
319 /^040000 tree /{
320 s,^.* ,,
321 s,$,/,
322 }
323 s/^.* //')" \
324 -- "$cur"))
325 ;;
326 *)
b3391775 327 __gitcomp "$(__git_refs)"
690d8824
JH
328 ;;
329 esac
330}
331
f53352fb
SP
332__git_complete_revlist ()
333{
334 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
335 case "$cur" in
336 *...*)
337 pfx="${cur%...*}..."
338 cur="${cur#*...}"
b3391775 339 __gitcomp "$(__git_refs)" "$pfx" "$cur"
f53352fb
SP
340 ;;
341 *..*)
342 pfx="${cur%..*}.."
343 cur="${cur#*..}"
b3391775
SP
344 __gitcomp "$(__git_refs)" "$pfx" "$cur"
345 ;;
f53352fb 346 *)
b3391775 347 __gitcomp "$(__git_refs)"
f53352fb
SP
348 ;;
349 esac
350}
351
f2bb9f88
SP
352__git_commands ()
353{
b51ec6bd
SP
354 if [ -n "$__git_commandlist" ]; then
355 echo "$__git_commandlist"
356 return
357 fi
f2bb9f88
SP
358 local i IFS=" "$'\n'
359 for i in $(git help -a|egrep '^ ')
360 do
361 case $i in
718a087a 362 *--*) : helper pattern;;
a925c6f1
SP
363 applymbox) : ask gittus;;
364 applypatch) : ask gittus;;
365 archimport) : import;;
2e3a430a 366 cat-file) : plumbing;;
56d99c67 367 check-attr) : plumbing;;
f2bb9f88
SP
368 check-ref-format) : plumbing;;
369 commit-tree) : plumbing;;
a925c6f1
SP
370 cvsexportcommit) : export;;
371 cvsimport) : import;;
f2bb9f88
SP
372 cvsserver) : daemon;;
373 daemon) : daemon;;
5cfb4fe5
SP
374 diff-files) : plumbing;;
375 diff-index) : plumbing;;
376 diff-tree) : plumbing;;
c6ec3b13 377 fast-import) : import;;
a925c6f1 378 fsck-objects) : plumbing;;
f2bb9f88 379 fetch-pack) : plumbing;;
a925c6f1 380 fmt-merge-msg) : plumbing;;
56d99c67 381 for-each-ref) : plumbing;;
f2bb9f88
SP
382 hash-object) : plumbing;;
383 http-*) : transport;;
384 index-pack) : plumbing;;
a925c6f1 385 init-db) : deprecated;;
f2bb9f88
SP
386 local-fetch) : plumbing;;
387 mailinfo) : plumbing;;
388 mailsplit) : plumbing;;
389 merge-*) : plumbing;;
390 mktree) : plumbing;;
391 mktag) : plumbing;;
392 pack-objects) : plumbing;;
393 pack-redundant) : plumbing;;
394 pack-refs) : plumbing;;
395 parse-remote) : plumbing;;
396 patch-id) : plumbing;;
397 peek-remote) : plumbing;;
a925c6f1
SP
398 prune) : plumbing;;
399 prune-packed) : plumbing;;
400 quiltimport) : import;;
f2bb9f88
SP
401 read-tree) : plumbing;;
402 receive-pack) : plumbing;;
2e3a430a 403 reflog) : plumbing;;
5c66d0d4 404 repo-config) : deprecated;;
f2bb9f88
SP
405 rerere) : plumbing;;
406 rev-list) : plumbing;;
407 rev-parse) : plumbing;;
408 runstatus) : plumbing;;
409 sh-setup) : internal;;
410 shell) : daemon;;
411 send-pack) : plumbing;;
412 show-index) : plumbing;;
413 ssh-*) : transport;;
414 stripspace) : plumbing;;
415 symbolic-ref) : plumbing;;
a925c6f1 416 tar-tree) : deprecated;;
f2bb9f88
SP
417 unpack-file) : plumbing;;
418 unpack-objects) : plumbing;;
a925c6f1 419 update-index) : plumbing;;
f2bb9f88
SP
420 update-ref) : plumbing;;
421 update-server-info) : daemon;;
422 upload-archive) : plumbing;;
423 upload-pack) : plumbing;;
424 write-tree) : plumbing;;
a925c6f1 425 verify-tag) : plumbing;;
f2bb9f88
SP
426 *) echo $i;;
427 esac
428 done
429}
b51ec6bd
SP
430__git_commandlist=
431__git_commandlist="$(__git_commands 2>/dev/null)"
f2bb9f88 432
367dce2a
DS
433__git_aliases ()
434{
56fc25f2 435 local i IFS=$'\n'
e0d10e1c 436 for i in $(git --git-dir="$(__gitdir)" config --list); do
56fc25f2
SP
437 case "$i" in
438 alias.*)
439 i="${i#alias.}"
440 echo "${i/=*/}"
441 ;;
442 esac
443 done
367dce2a
DS
444}
445
446__git_aliased_command ()
447{
873537fa 448 local word cmdline=$(git --git-dir="$(__gitdir)" \
e0d10e1c 449 config --get "alias.$1")
367dce2a
DS
450 for word in $cmdline; do
451 if [ "${word##-*}" ]; then
452 echo $word
453 return
454 fi
455 done
456}
457
3ff1320d
SG
458__git_find_subcommand ()
459{
460 local word subcommand c=1
461
462 while [ $c -lt $COMP_CWORD ]; do
463 word="${COMP_WORDS[c]}"
464 for subcommand in $1; do
465 if [ "$subcommand" = "$word" ]; then
466 echo "$subcommand"
467 return
468 fi
469 done
470 c=$((++c))
471 done
472}
473
d773c631
SG
474__git_has_doubledash ()
475{
476 local c=1
477 while [ $c -lt $COMP_CWORD ]; do
478 if [ "--" = "${COMP_WORDS[c]}" ]; then
479 return 0
480 fi
481 c=$((++c))
482 done
483 return 1
484}
485
88329195
SP
486__git_whitespacelist="nowarn warn error error-all strip"
487
488_git_am ()
489{
28ed6e7b 490 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
51ef1daa 491 if [ -d "$dir"/rebase-apply ]; then
a31c00b0 492 __gitcomp "--skip --resolved --abort"
88329195
SP
493 return
494 fi
495 case "$cur" in
496 --whitespace=*)
b3391775 497 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
498 return
499 ;;
500 --*)
b3391775 501 __gitcomp "
88329195
SP
502 --signoff --utf8 --binary --3way --interactive
503 --whitespace=
b3391775 504 "
88329195
SP
505 return
506 esac
507 COMPREPLY=()
508}
509
510_git_apply ()
511{
512 local cur="${COMP_WORDS[COMP_CWORD]}"
513 case "$cur" in
514 --whitespace=*)
b3391775 515 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
88329195
SP
516 return
517 ;;
518 --*)
b3391775 519 __gitcomp "
88329195
SP
520 --stat --numstat --summary --check --index
521 --cached --index-info --reverse --reject --unidiff-zero
522 --apply --no-add --exclude=
523 --whitespace= --inaccurate-eof --verbose
b3391775 524 "
88329195
SP
525 return
526 esac
527 COMPREPLY=()
528}
529
8435b548
SP
530_git_add ()
531{
d773c631
SG
532 __git_has_doubledash && return
533
8435b548
SP
534 local cur="${COMP_WORDS[COMP_CWORD]}"
535 case "$cur" in
536 --*)
1d284cba
SG
537 __gitcomp "
538 --interactive --refresh --patch --update --dry-run
539 --ignore-errors
540 "
8435b548
SP
541 return
542 esac
543 COMPREPLY=()
544}
545
b2e69f62
SP
546_git_bisect ()
547{
d773c631
SG
548 __git_has_doubledash && return
549
bf11d461 550 local subcommands="start bad good skip reset visualize replay log run"
3ff1320d
SG
551 local subcommand="$(__git_find_subcommand "$subcommands")"
552 if [ -z "$subcommand" ]; then
553 __gitcomp "$subcommands"
b2e69f62
SP
554 return
555 fi
556
3ff1320d 557 case "$subcommand" in
bf11d461 558 bad|good|reset|skip)
b2e69f62
SP
559 __gitcomp "$(__git_refs)"
560 ;;
561 *)
562 COMPREPLY=()
563 ;;
564 esac
565}
566
690d8824
JH
567_git_branch ()
568{
b9217642
SG
569 local i c=1 only_local_ref="n" has_r="n"
570
571 while [ $c -lt $COMP_CWORD ]; do
572 i="${COMP_WORDS[c]}"
573 case "$i" in
574 -d|-m) only_local_ref="y" ;;
575 -r) has_r="y" ;;
576 esac
577 c=$((++c))
578 done
579
3b376b0c
SG
580 case "${COMP_WORDS[COMP_CWORD]}" in
581 --*=*) COMPREPLY=() ;;
582 --*)
583 __gitcomp "
584 --color --no-color --verbose --abbrev= --no-abbrev
50e61025 585 --track --no-track --contains --merged --no-merged
3b376b0c
SG
586 "
587 ;;
b9217642
SG
588 *)
589 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
590 __gitcomp "$(__git_heads)"
591 else
592 __gitcomp "$(__git_refs)"
593 fi
594 ;;
3b376b0c 595 esac
690d8824
JH
596}
597
374a58c9
ML
598_git_bundle ()
599{
600 local mycword="$COMP_CWORD"
601 case "${COMP_WORDS[0]}" in
602 git)
603 local cmd="${COMP_WORDS[2]}"
604 mycword="$((mycword-1))"
605 ;;
606 git-bundle*)
607 local cmd="${COMP_WORDS[1]}"
608 ;;
609 esac
610 case "$mycword" in
611 1)
612 __gitcomp "create list-heads verify unbundle"
613 ;;
614 2)
615 # looking for a file
616 ;;
617 *)
618 case "$cmd" in
619 create)
620 __git_complete_revlist
621 ;;
622 esac
623 ;;
624 esac
625}
626
690d8824
JH
627_git_checkout ()
628{
b3391775 629 __gitcomp "$(__git_refs)"
690d8824
JH
630}
631
d8a9fea5
SP
632_git_cherry ()
633{
634 __gitcomp "$(__git_refs)"
635}
636
1273231e
SP
637_git_cherry_pick ()
638{
639 local cur="${COMP_WORDS[COMP_CWORD]}"
640 case "$cur" in
641 --*)
b3391775 642 __gitcomp "--edit --no-commit"
1273231e
SP
643 ;;
644 *)
b3391775 645 __gitcomp "$(__git_refs)"
1273231e
SP
646 ;;
647 esac
648}
649
4548e855
SP
650_git_commit ()
651{
d773c631
SG
652 __git_has_doubledash && return
653
4548e855
SP
654 local cur="${COMP_WORDS[COMP_CWORD]}"
655 case "$cur" in
656 --*)
b3391775 657 __gitcomp "
4548e855
SP
658 --all --author= --signoff --verify --no-verify
659 --edit --amend --include --only
b3391775 660 "
4548e855
SP
661 return
662 esac
663 COMPREPLY=()
664}
665
217926c0
SP
666_git_describe ()
667{
668 __gitcomp "$(__git_refs)"
669}
670
690d8824
JH
671_git_diff ()
672{
d773c631
SG
673 __git_has_doubledash && return
674
b3a4f858
JS
675 local cur="${COMP_WORDS[COMP_CWORD]}"
676 case "$cur" in
677 --*)
678 __gitcomp "--cached --stat --numstat --shortstat --summary
679 --patch-with-stat --name-only --name-status --color
680 --no-color --color-words --no-renames --check
681 --full-index --binary --abbrev --diff-filter
682 --find-copies-harder --pickaxe-all --pickaxe-regex
683 --text --ignore-space-at-eol --ignore-space-change
684 --ignore-all-space --exit-code --quiet --ext-diff
aba201c6
PO
685 --no-ext-diff
686 --no-prefix --src-prefix= --dst-prefix=
f4574139 687 --base --ours --theirs
aba201c6 688 "
b3a4f858
JS
689 return
690 ;;
691 esac
690d8824
JH
692 __git_complete_file
693}
694
695_git_diff_tree ()
696{
b3391775 697 __gitcomp "$(__git_refs)"
690d8824
JH
698}
699
700_git_fetch ()
701{
702 local cur="${COMP_WORDS[COMP_CWORD]}"
703
704 case "${COMP_WORDS[0]},$COMP_CWORD" in
705 git-fetch*,1)
b3391775 706 __gitcomp "$(__git_remotes)"
690d8824
JH
707 ;;
708 git,2)
b3391775 709 __gitcomp "$(__git_remotes)"
690d8824
JH
710 ;;
711 *)
712 case "$cur" in
713 *:*)
db8a9ff0
SP
714 local pfx=""
715 case "$COMP_WORDBREAKS" in
716 *:*) : great ;;
717 *) pfx="${cur%%:*}:" ;;
718 esac
719 __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
690d8824
JH
720 ;;
721 *)
722 local remote
723 case "${COMP_WORDS[0]}" in
724 git-fetch) remote="${COMP_WORDS[1]}" ;;
725 git) remote="${COMP_WORDS[2]}" ;;
726 esac
b3391775 727 __gitcomp "$(__git_refs2 "$remote")"
690d8824
JH
728 ;;
729 esac
730 ;;
731 esac
732}
733
f53352fb
SP
734_git_format_patch ()
735{
736 local cur="${COMP_WORDS[COMP_CWORD]}"
737 case "$cur" in
738 --*)
b3391775 739 __gitcomp "
f53352fb
SP
740 --stdout --attach --thread
741 --output-directory
742 --numbered --start-number
47e98eec 743 --numbered-files
f53352fb
SP
744 --keep-subject
745 --signoff
746 --in-reply-to=
747 --full-index --binary
ec804891 748 --not --all
be5f5bf0 749 --cover-letter
aba201c6 750 --no-prefix --src-prefix= --dst-prefix=
b3391775 751 "
f53352fb
SP
752 return
753 ;;
754 esac
755 __git_complete_revlist
756}
757
b26c8748
SP
758_git_gc ()
759{
760 local cur="${COMP_WORDS[COMP_CWORD]}"
761 case "$cur" in
762 --*)
47e98eec 763 __gitcomp "--prune --aggressive"
b26c8748
SP
764 return
765 ;;
766 esac
767 COMPREPLY=()
768}
769
690d8824
JH
770_git_ls_remote ()
771{
b3391775 772 __gitcomp "$(__git_remotes)"
690d8824
JH
773}
774
775_git_ls_tree ()
776{
777 __git_complete_file
778}
779
780_git_log ()
781{
d773c631
SG
782 __git_has_doubledash && return
783
6e31b866
SP
784 local cur="${COMP_WORDS[COMP_CWORD]}"
785 case "$cur" in
786 --pretty=*)
b3391775 787 __gitcomp "
6e31b866 788 oneline short medium full fuller email raw
b3391775 789 " "" "${cur##--pretty=}"
6e31b866
SP
790 return
791 ;;
47e98eec
SP
792 --date=*)
793 __gitcomp "
794 relative iso8601 rfc2822 short local default
795 " "" "${cur##--date=}"
796 return
797 ;;
6e31b866 798 --*)
b3391775 799 __gitcomp "
6e31b866
SP
800 --max-count= --max-age= --since= --after=
801 --min-age= --before= --until=
8f87fae6 802 --root --topo-order --date-order --reverse
47e98eec 803 --no-merges --follow
6e31b866 804 --abbrev-commit --abbrev=
47e98eec 805 --relative-date --date=
6e31b866
SP
806 --author= --committer= --grep=
807 --all-match
8f87fae6 808 --pretty= --name-status --name-only --raw
ec804891 809 --not --all
7d37b5bf 810 --left-right --cherry-pick
20827d99 811 --graph
66aafad5
TL
812 --stat --numstat --shortstat
813 --decorate --diff-filter=
814 --color-words --walk-reflogs
b3391775 815 "
6e31b866
SP
816 return
817 ;;
818 esac
f53352fb 819 __git_complete_revlist
690d8824
JH
820}
821
4ad91321
SP
822_git_merge ()
823{
824 local cur="${COMP_WORDS[COMP_CWORD]}"
ce1e39d2
SP
825 case "${COMP_WORDS[COMP_CWORD-1]}" in
826 -s|--strategy)
b3391775 827 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
828 return
829 esac
4ad91321 830 case "$cur" in
ce1e39d2 831 --strategy=*)
b3391775 832 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
833 return
834 ;;
4ad91321 835 --*)
b3391775 836 __gitcomp "
efb779f8 837 --no-commit --no-stat --log --no-log --squash --strategy
b3391775 838 "
4ad91321
SP
839 return
840 esac
b3391775 841 __gitcomp "$(__git_refs)"
4ad91321
SP
842}
843
690d8824
JH
844_git_merge_base ()
845{
b3391775 846 __gitcomp "$(__git_refs)"
690d8824
JH
847}
848
d33909bf
SP
849_git_name_rev ()
850{
b3391775 851 __gitcomp "--tags --all --stdin"
d33909bf
SP
852}
853
690d8824
JH
854_git_pull ()
855{
856 local cur="${COMP_WORDS[COMP_CWORD]}"
857
858 case "${COMP_WORDS[0]},$COMP_CWORD" in
859 git-pull*,1)
b3391775 860 __gitcomp "$(__git_remotes)"
690d8824
JH
861 ;;
862 git,2)
b3391775 863 __gitcomp "$(__git_remotes)"
690d8824
JH
864 ;;
865 *)
866 local remote
867 case "${COMP_WORDS[0]}" in
868 git-pull) remote="${COMP_WORDS[1]}" ;;
869 git) remote="${COMP_WORDS[2]}" ;;
870 esac
b3391775 871 __gitcomp "$(__git_refs "$remote")"
690d8824
JH
872 ;;
873 esac
874}
875
876_git_push ()
877{
878 local cur="${COMP_WORDS[COMP_CWORD]}"
879
880 case "${COMP_WORDS[0]},$COMP_CWORD" in
881 git-push*,1)
b3391775 882 __gitcomp "$(__git_remotes)"
690d8824
JH
883 ;;
884 git,2)
b3391775 885 __gitcomp "$(__git_remotes)"
690d8824
JH
886 ;;
887 *)
888 case "$cur" in
889 *:*)
890 local remote
891 case "${COMP_WORDS[0]}" in
892 git-push) remote="${COMP_WORDS[1]}" ;;
893 git) remote="${COMP_WORDS[2]}" ;;
894 esac
db8a9ff0
SP
895
896 local pfx=""
897 case "$COMP_WORDBREAKS" in
898 *:*) : great ;;
899 *) pfx="${cur%%:*}:" ;;
900 esac
901
902 __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
690d8824 903 ;;
161fea83
SP
904 +*)
905 __gitcomp "$(__git_refs)" + "${cur#+}"
906 ;;
690d8824 907 *)
92d7c8e3 908 __gitcomp "$(__git_refs)"
690d8824
JH
909 ;;
910 esac
911 ;;
912 esac
913}
914
61d926a3
SP
915_git_rebase ()
916{
51fe1209 917 local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
51ef1daa 918 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
b3391775 919 __gitcomp "--continue --skip --abort"
61d926a3
SP
920 return
921 fi
ce1e39d2
SP
922 case "${COMP_WORDS[COMP_CWORD-1]}" in
923 -s|--strategy)
b3391775 924 __gitcomp "$(__git_merge_strategies)"
ce1e39d2
SP
925 return
926 esac
61d926a3 927 case "$cur" in
ce1e39d2 928 --strategy=*)
b3391775 929 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
ce1e39d2
SP
930 return
931 ;;
61d926a3 932 --*)
d9e3b702 933 __gitcomp "--onto --merge --strategy --interactive"
61d926a3
SP
934 return
935 esac
b3391775 936 __gitcomp "$(__git_refs)"
61d926a3
SP
937}
938
25a1f374
TL
939_git_send_email ()
940{
941 local cur="${COMP_WORDS[COMP_CWORD]}"
942 case "$cur" in
943 --*)
944 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
945 --dry-run --envelope-sender --from --identity
946 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
947 --no-suppress-from --no-thread --quiet
948 --signed-off-by-cc --smtp-pass --smtp-server
949 --smtp-server-port --smtp-ssl --smtp-user --subject
950 --suppress-cc --suppress-from --thread --to"
951 return
952 ;;
953 esac
954 COMPREPLY=()
955}
956
e0d10e1c 957_git_config ()
5de40f59
SP
958{
959 local cur="${COMP_WORDS[COMP_CWORD]}"
960 local prv="${COMP_WORDS[COMP_CWORD-1]}"
961 case "$prv" in
962 branch.*.remote)
78d4d6a2 963 __gitcomp "$(__git_remotes)"
5de40f59
SP
964 return
965 ;;
966 branch.*.merge)
78d4d6a2 967 __gitcomp "$(__git_refs)"
5de40f59
SP
968 return
969 ;;
970 remote.*.fetch)
971 local remote="${prv#remote.}"
972 remote="${remote%.fetch}"
78d4d6a2 973 __gitcomp "$(__git_refs_remotes "$remote")"
5de40f59
SP
974 return
975 ;;
976 remote.*.push)
977 local remote="${prv#remote.}"
978 remote="${remote%.push}"
78d4d6a2 979 __gitcomp "$(git --git-dir="$(__gitdir)" \
5de40f59 980 for-each-ref --format='%(refname):%(refname)' \
78d4d6a2
SP
981 refs/heads)"
982 return
983 ;;
984 pull.twohead|pull.octopus)
985 __gitcomp "$(__git_merge_strategies)"
986 return
987 ;;
988 color.branch|color.diff|color.status)
989 __gitcomp "always never auto"
990 return
991 ;;
992 color.*.*)
993 __gitcomp "
994 black red green yellow blue magenta cyan white
995 bold dim ul blink reverse
996 "
5de40f59
SP
997 return
998 ;;
999 *.*)
1000 COMPREPLY=()
1001 return
1002 ;;
1003 esac
1004 case "$cur" in
1005 --*)
78d4d6a2 1006 __gitcomp "
47e98eec 1007 --global --system --file=
12977705 1008 --list --replace-all
5de40f59 1009 --get --get-all --get-regexp
1b71eb35 1010 --add --unset --unset-all
12977705 1011 --remove-section --rename-section
78d4d6a2 1012 "
5de40f59
SP
1013 return
1014 ;;
1015 branch.*.*)
1016 local pfx="${cur%.*}."
1017 cur="${cur##*.}"
78d4d6a2 1018 __gitcomp "remote merge" "$pfx" "$cur"
5de40f59
SP
1019 return
1020 ;;
1021 branch.*)
1022 local pfx="${cur%.*}."
1023 cur="${cur#*.}"
78d4d6a2 1024 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
5de40f59
SP
1025 return
1026 ;;
1027 remote.*.*)
1028 local pfx="${cur%.*}."
1029 cur="${cur##*.}"
12977705
SP
1030 __gitcomp "
1031 url fetch push skipDefaultUpdate
1032 receivepack uploadpack tagopt
1033 " "$pfx" "$cur"
5de40f59
SP
1034 return
1035 ;;
1036 remote.*)
1037 local pfx="${cur%.*}."
1038 cur="${cur#*.}"
78d4d6a2 1039 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
5de40f59
SP
1040 return
1041 ;;
1042 esac
78d4d6a2 1043 __gitcomp "
5de40f59
SP
1044 apply.whitespace
1045 core.fileMode
1046 core.gitProxy
1047 core.ignoreStat
1048 core.preferSymlinkRefs
1049 core.logAllRefUpdates
47e98eec 1050 core.loosecompression
5de40f59
SP
1051 core.repositoryFormatVersion
1052 core.sharedRepository
1053 core.warnAmbiguousRefs
1054 core.compression
78d4d6a2
SP
1055 core.packedGitWindowSize
1056 core.packedGitLimit
2122591b 1057 clean.requireForce
78d4d6a2
SP
1058 color.branch
1059 color.branch.current
1060 color.branch.local
1061 color.branch.remote
1062 color.branch.plain
a159ca0c 1063 color.diff
78d4d6a2
SP
1064 color.diff.plain
1065 color.diff.meta
1066 color.diff.frag
1067 color.diff.old
1068 color.diff.new
1069 color.diff.commit
1070 color.diff.whitespace
a159ca0c 1071 color.pager
a159ca0c 1072 color.status
78d4d6a2
SP
1073 color.status.header
1074 color.status.added
1075 color.status.changed
1076 color.status.untracked
1077 diff.renameLimit
1078 diff.renames
1079 fetch.unpackLimit
1080 format.headers
47e98eec 1081 format.subjectprefix
78d4d6a2
SP
1082 gitcvs.enabled
1083 gitcvs.logfile
12977705 1084 gitcvs.allbinary
6aeeffd1
JE
1085 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1086 gitcvs.dbtablenameprefix
12977705 1087 gc.packrefs
78d4d6a2
SP
1088 gc.reflogexpire
1089 gc.reflogexpireunreachable
1090 gc.rerereresolved
1091 gc.rerereunresolved
5de40f59
SP
1092 http.sslVerify
1093 http.sslCert
1094 http.sslKey
1095 http.sslCAInfo
1096 http.sslCAPath
1097 http.maxRequests
78d4d6a2
SP
1098 http.lowSpeedLimit
1099 http.lowSpeedTime
5de40f59 1100 http.noEPSV
78d4d6a2
SP
1101 i18n.commitEncoding
1102 i18n.logOutputEncoding
1103 log.showroot
12977705 1104 merge.tool
78d4d6a2
SP
1105 merge.summary
1106 merge.verbosity
5de40f59 1107 pack.window
12977705 1108 pack.depth
47e98eec
SP
1109 pack.windowMemory
1110 pack.compression
1111 pack.deltaCacheSize
1112 pack.deltaCacheLimit
78d4d6a2
SP
1113 pull.octopus
1114 pull.twohead
5de40f59 1115 repack.useDeltaBaseOffset
78d4d6a2
SP
1116 showbranch.default
1117 tar.umask
1118 transfer.unpackLimit
5de40f59
SP
1119 receive.unpackLimit
1120 receive.denyNonFastForwards
78d4d6a2
SP
1121 user.name
1122 user.email
1123 user.signingkey
5de40f59 1124 branch. remote.
78d4d6a2 1125 "
5de40f59
SP
1126}
1127
88293c67
SP
1128_git_remote ()
1129{
3ff1320d
SG
1130 local subcommands="add rm show prune update"
1131 local subcommand="$(__git_find_subcommand "$subcommands")"
1132 if [ -z "$subcommand" ]; then
3903c618 1133 __gitcomp "$subcommands"
88293c67
SP
1134 return
1135 fi
1136
3ff1320d 1137 case "$subcommand" in
a3b811a4 1138 rm|show|prune)
88293c67
SP
1139 __gitcomp "$(__git_remotes)"
1140 ;;
fb72759b
SP
1141 update)
1142 local i c='' IFS=$'\n'
1143 for i in $(git --git-dir="$(__gitdir)" config --list); do
1144 case "$i" in
1145 remotes.*)
1146 i="${i#remotes.}"
1147 c="$c ${i/=*/}"
1148 ;;
1149 esac
1150 done
1151 __gitcomp "$c"
1152 ;;
88293c67
SP
1153 *)
1154 COMPREPLY=()
1155 ;;
1156 esac
1157}
1158
67e78c3b
SP
1159_git_reset ()
1160{
d773c631
SG
1161 __git_has_doubledash && return
1162
67e78c3b 1163 local cur="${COMP_WORDS[COMP_CWORD]}"
b3391775
SP
1164 case "$cur" in
1165 --*)
1166 __gitcomp "--mixed --hard --soft"
1167 return
1168 ;;
1169 esac
1170 __gitcomp "$(__git_refs)"
67e78c3b
SP
1171}
1172
1fd6bec9
SP
1173_git_shortlog ()
1174{
d773c631
SG
1175 __git_has_doubledash && return
1176
1fd6bec9
SP
1177 local cur="${COMP_WORDS[COMP_CWORD]}"
1178 case "$cur" in
1179 --*)
1180 __gitcomp "
1181 --max-count= --max-age= --since= --after=
1182 --min-age= --before= --until=
1183 --no-merges
1184 --author= --committer= --grep=
1185 --all-match
1186 --not --all
1187 --numbered --summary
1188 "
1189 return
1190 ;;
1191 esac
1192 __git_complete_revlist
1193}
1194
90131924
SP
1195_git_show ()
1196{
1197 local cur="${COMP_WORDS[COMP_CWORD]}"
1198 case "$cur" in
1199 --pretty=*)
b3391775 1200 __gitcomp "
90131924 1201 oneline short medium full fuller email raw
b3391775 1202 " "" "${cur##--pretty=}"
90131924
SP
1203 return
1204 ;;
1205 --*)
b3391775 1206 __gitcomp "--pretty="
90131924
SP
1207 return
1208 ;;
1209 esac
1210 __git_complete_file
1211}
1212
7fd53fce
JH
1213_git_stash ()
1214{
88b302f5 1215 local subcommands='save list show apply clear drop pop create'
7bedebca
SG
1216 local subcommand="$(__git_find_subcommand "$subcommands")"
1217 if [ -z "$subcommand" ]; then
3ff1320d 1218 __gitcomp "$subcommands"
7bedebca
SG
1219 else
1220 local cur="${COMP_WORDS[COMP_CWORD]}"
1221 case "$subcommand,$cur" in
1222 save,--*)
1223 __gitcomp "--keep-index"
1224 ;;
1225 *)
1226 COMPREPLY=()
1227 ;;
1228 esac
3ff1320d 1229 fi
7fd53fce
JH
1230}
1231
be86f7a0
SP
1232_git_submodule ()
1233{
d773c631
SG
1234 __git_has_doubledash && return
1235
3ff1320d
SG
1236 local subcommands="add status init update"
1237 if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
be86f7a0
SP
1238 local cur="${COMP_WORDS[COMP_CWORD]}"
1239 case "$cur" in
1240 --*)
1241 __gitcomp "--quiet --cached"
1242 ;;
1243 *)
3ff1320d 1244 __gitcomp "$subcommands"
be86f7a0
SP
1245 ;;
1246 esac
1247 return
1248 fi
1249}
1250
47f6ee28
SG
1251_git_svn ()
1252{
1253 local subcommands="
1254 init fetch clone rebase dcommit log find-rev
1255 set-tree commit-diff info create-ignore propget
1256 proplist show-ignore show-externals
1257 "
1258 local subcommand="$(__git_find_subcommand "$subcommands")"
1259 if [ -z "$subcommand" ]; then
1260 __gitcomp "$subcommands"
1261 else
1262 local remote_opts="--username= --config-dir= --no-auth-cache"
1263 local fc_opts="
1264 --follow-parent --authors-file= --repack=
1265 --no-metadata --use-svm-props --use-svnsync-props
1266 --log-window-size= --no-checkout --quiet
1267 --repack-flags --user-log-author $remote_opts
1268 "
1269 local init_opts="
1270 --template= --shared= --trunk= --tags=
1271 --branches= --stdlayout --minimize-url
1272 --no-metadata --use-svm-props --use-svnsync-props
1273 --rewrite-root= $remote_opts
1274 "
1275 local cmt_opts="
1276 --edit --rmdir --find-copies-harder --copy-similarity=
1277 "
1278
1279 local cur="${COMP_WORDS[COMP_CWORD]}"
1280 case "$subcommand,$cur" in
1281 fetch,--*)
1282 __gitcomp "--revision= --fetch-all $fc_opts"
1283 ;;
1284 clone,--*)
1285 __gitcomp "--revision= $fc_opts $init_opts"
1286 ;;
1287 init,--*)
1288 __gitcomp "$init_opts"
1289 ;;
1290 dcommit,--*)
1291 __gitcomp "
1292 --merge --strategy= --verbose --dry-run
1293 --fetch-all --no-rebase $cmt_opts $fc_opts
1294 "
1295 ;;
1296 set-tree,--*)
1297 __gitcomp "--stdin $cmt_opts $fc_opts"
1298 ;;
1299 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1300 show-externals,--*)
1301 __gitcomp "--revision="
1302 ;;
1303 log,--*)
1304 __gitcomp "
1305 --limit= --revision= --verbose --incremental
1306 --oneline --show-commit --non-recursive
1307 --authors-file=
1308 "
1309 ;;
1310 rebase,--*)
1311 __gitcomp "
1312 --merge --verbose --strategy= --local
1313 --fetch-all $fc_opts
1314 "
1315 ;;
1316 commit-diff,--*)
1317 __gitcomp "--message= --file= --revision= $cmt_opts"
1318 ;;
1319 info,--*)
1320 __gitcomp "--url"
1321 ;;
1322 *)
1323 COMPREPLY=()
1324 ;;
1325 esac
1326 fi
1327}
1328
88e21dc7
SP
1329_git_tag ()
1330{
1331 local i c=1 f=0
1332 while [ $c -lt $COMP_CWORD ]; do
1333 i="${COMP_WORDS[c]}"
1334 case "$i" in
1335 -d|-v)
1336 __gitcomp "$(__git_tags)"
1337 return
1338 ;;
1339 -f)
1340 f=1
1341 ;;
1342 esac
1343 c=$((++c))
1344 done
1345
1346 case "${COMP_WORDS[COMP_CWORD-1]}" in
1347 -m|-F)
1348 COMPREPLY=()
1349 ;;
1350 -*|tag|git-tag)
1351 if [ $f = 1 ]; then
1352 __gitcomp "$(__git_tags)"
1353 else
1354 COMPREPLY=()
1355 fi
1356 ;;
1357 *)
1358 __gitcomp "$(__git_refs)"
1359 ;;
1360 esac
1361}
1362
690d8824
JH
1363_git ()
1364{
873537fa
SP
1365 local i c=1 command __git_dir
1366
1367 while [ $c -lt $COMP_CWORD ]; do
1368 i="${COMP_WORDS[c]}"
1369 case "$i" in
1370 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1371 --bare) __git_dir="." ;;
1372 --version|--help|-p|--paginate) ;;
1373 *) command="$i"; break ;;
1374 esac
1375 c=$((++c))
1376 done
1377
1d17b22e 1378 if [ -z "$command" ]; then
72e5e989
SP
1379 case "${COMP_WORDS[COMP_CWORD]}" in
1380 --*=*) COMPREPLY=() ;;
47e98eec 1381 --*) __gitcomp "
ce5a2c95 1382 --paginate
47e98eec
SP
1383 --no-pager
1384 --git-dir=
1385 --bare
1386 --version
1387 --exec-path
ce5a2c95
TL
1388 --work-tree=
1389 --help
47e98eec
SP
1390 "
1391 ;;
72e5e989
SP
1392 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1393 esac
1394 return
873537fa 1395 fi
367dce2a 1396
873537fa
SP
1397 local expansion=$(__git_aliased_command "$command")
1398 [ "$expansion" ] && command="$expansion"
367dce2a 1399
873537fa 1400 case "$command" in
88329195 1401 am) _git_am ;;
8435b548 1402 add) _git_add ;;
88329195 1403 apply) _git_apply ;;
b2e69f62 1404 bisect) _git_bisect ;;
374a58c9 1405 bundle) _git_bundle ;;
873537fa 1406 branch) _git_branch ;;
873537fa 1407 checkout) _git_checkout ;;
d8a9fea5 1408 cherry) _git_cherry ;;
1273231e 1409 cherry-pick) _git_cherry_pick ;;
4548e855 1410 commit) _git_commit ;;
e0d10e1c 1411 config) _git_config ;;
217926c0 1412 describe) _git_describe ;;
873537fa 1413 diff) _git_diff ;;
873537fa 1414 fetch) _git_fetch ;;
f53352fb 1415 format-patch) _git_format_patch ;;
b26c8748 1416 gc) _git_gc ;;
873537fa
SP
1417 log) _git_log ;;
1418 ls-remote) _git_ls_remote ;;
1419 ls-tree) _git_ls_tree ;;
4ad91321 1420 merge) _git_merge;;
873537fa 1421 merge-base) _git_merge_base ;;
d33909bf 1422 name-rev) _git_name_rev ;;
873537fa
SP
1423 pull) _git_pull ;;
1424 push) _git_push ;;
61d926a3 1425 rebase) _git_rebase ;;
88293c67 1426 remote) _git_remote ;;
873537fa 1427 reset) _git_reset ;;
25a1f374 1428 send-email) _git_send_email ;;
1fd6bec9 1429 shortlog) _git_shortlog ;;
90131924 1430 show) _git_show ;;
873537fa 1431 show-branch) _git_log ;;
7fd53fce 1432 stash) _git_stash ;;
be86f7a0 1433 submodule) _git_submodule ;;
47f6ee28 1434 svn) _git_svn ;;
88e21dc7 1435 tag) _git_tag ;;
873537fa
SP
1436 whatchanged) _git_log ;;
1437 *) COMPREPLY=() ;;
1438 esac
690d8824
JH
1439}
1440
1441_gitk ()
1442{
d773c631
SG
1443 __git_has_doubledash && return
1444
690d8824 1445 local cur="${COMP_WORDS[COMP_CWORD]}"
07ba53f7
RQ
1446 local g="$(git rev-parse --git-dir 2>/dev/null)"
1447 local merge=""
1448 if [ -f $g/MERGE_HEAD ]; then
1449 merge="--merge"
1450 fi
b3391775
SP
1451 case "$cur" in
1452 --*)
07ba53f7 1453 __gitcomp "--not --all $merge"
b3391775
SP
1454 return
1455 ;;
1456 esac
ec804891 1457 __git_complete_revlist
690d8824
JH
1458}
1459
1460complete -o default -o nospace -F _git git
b3391775 1461complete -o default -o nospace -F _gitk gitk
690d8824
JH
1462
1463# The following are necessary only for Cygwin, and only are needed
1464# when the user has tab-completed the executable name and consequently
1465# included the '.exe' suffix.
1466#
76c3eb51 1467if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
144d33de 1468complete -o default -o nospace -F _git git.exe
76c3eb51 1469fi