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