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