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