1#
2# bash completion support for core Git.
3#
4# Copyright (C) 2006,2007 Shawn Pearce
5# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
6#
7# The contained completion routines provide support for completing:
8#
9# *) local and remote branch names
10# *) local and remote tag names
11# *) .git/remotes file names
12# *) git 'subcommands'
13# *) tree paths within 'ref:path/to/file' expressions
14#
15# To use these routines:
16#
17# 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
18# 2) Added the following line to your .bashrc:
19# source ~/.git-completion.sh
20#
21# 3) You may want to make sure the git executable is available
22# in your PATH before this script is sourced, as some caching
23# is performed while the script loads. If git isn't found
24# at source time then all lookups will be done on demand,
25# which may be slightly slower.
26#
27# 4) Consider changing your PS1 to also show the current branch:
28# PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
29#
30# The argument to __git_ps1 will be displayed only if you
31# are currently in a git repository. The %s token will be
32# the name of the current branch.
33#
34
35__gitdir ()
36{
37 if [ -z "$1" ]; then
38 if [ -n "$__git_dir" ]; then
39 echo "$__git_dir"
40 elif [ -d .git ]; then
41 echo .git
42 else
43 git rev-parse --git-dir 2>/dev/null
44 fi
45 elif [ -d "$1/.git" ]; then
46 echo "$1/.git"
47 else
48 echo "$1"
49 fi
50}
51
52__git_ps1 ()
53{
54 local b="$(git symbolic-ref HEAD 2>/dev/null)"
55 if [ -n "$b" ]; then
56 if [ -n "$1" ]; then
57 printf "$1" "${b##refs/heads/}"
58 else
59 printf " (%s)" "${b##refs/heads/}"
60 fi
61 fi
62}
63
64__gitcomp ()
65{
66 local all c s=$'\n' IFS=' '$'\t'$'\n'
67 local cur="${COMP_WORDS[COMP_CWORD]}"
68 if [ $# -gt 2 ]; then
69 cur="$3"
70 fi
71 for c in $1; do
72 case "$c$4" in
73 --*=*) all="$all$c$4$s" ;;
74 *.) all="$all$c$4$s" ;;
75 *) all="$all$c$4 $s" ;;
76 esac
77 done
78 IFS=$s
79 COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
80 return
81}
82
83__git_heads ()
84{
85 local cmd i is_hash=y dir="$(__gitdir "$1")"
86 if [ -d "$dir" ]; then
87 for i in $(git --git-dir="$dir" \
88 for-each-ref --format='%(refname)' \
89 refs/heads ); do
90 echo "${i#refs/heads/}"
91 done
92 return
93 fi
94 for i in $(git-ls-remote "$1" 2>/dev/null); do
95 case "$is_hash,$i" in
96 y,*) is_hash=n ;;
97 n,*^{}) is_hash=y ;;
98 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
99 n,*) is_hash=y; echo "$i" ;;
100 esac
101 done
102}
103
104__git_refs ()
105{
106 local cmd i is_hash=y dir="$(__gitdir "$1")"
107 if [ -d "$dir" ]; then
108 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
109 for i in $(git --git-dir="$dir" \
110 for-each-ref --format='%(refname)' \
111 refs/tags refs/heads refs/remotes); do
112 case "$i" in
113 refs/tags/*) echo "${i#refs/tags/}" ;;
114 refs/heads/*) echo "${i#refs/heads/}" ;;
115 refs/remotes/*) echo "${i#refs/remotes/}" ;;
116 *) echo "$i" ;;
117 esac
118 done
119 return
120 fi
121 for i in $(git-ls-remote "$dir" 2>/dev/null); do
122 case "$is_hash,$i" in
123 y,*) is_hash=n ;;
124 n,*^{}) is_hash=y ;;
125 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
126 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
127 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
128 n,*) is_hash=y; echo "$i" ;;
129 esac
130 done
131}
132
133__git_refs2 ()
134{
135 local i
136 for i in $(__git_refs "$1"); do
137 echo "$i:$i"
138 done
139}
140
141__git_refs_remotes ()
142{
143 local cmd i is_hash=y
144 for i in $(git-ls-remote "$1" 2>/dev/null); do
145 case "$is_hash,$i" in
146 n,refs/heads/*)
147 is_hash=y
148 echo "$i:refs/remotes/$1/${i#refs/heads/}"
149 ;;
150 y,*) is_hash=n ;;
151 n,*^{}) is_hash=y ;;
152 n,refs/tags/*) is_hash=y;;
153 n,*) is_hash=y; ;;
154 esac
155 done
156}
157
158__git_remotes ()
159{
160 local i ngoff IFS=$'\n' d="$(__gitdir)"
161 shopt -q nullglob || ngoff=1
162 shopt -s nullglob
163 for i in "$d/remotes"/*; do
164 echo ${i#$d/remotes/}
165 done
166 [ "$ngoff" ] && shopt -u nullglob
167 for i in $(git --git-dir="$d" config --list); do
168 case "$i" in
169 remote.*.url=*)
170 i="${i#remote.}"
171 echo "${i/.url=*/}"
172 ;;
173 esac
174 done
175}
176
177__git_merge_strategies ()
178{
179 if [ -n "$__git_merge_strategylist" ]; then
180 echo "$__git_merge_strategylist"
181 return
182 fi
183 sed -n "/^all_strategies='/{
184 s/^all_strategies='//
185 s/'//
186 p
187 q
188 }" "$(git --exec-path)/git-merge"
189}
190__git_merge_strategylist=
191__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
192
193__git_complete_file ()
194{
195 local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
196 case "$cur" in
197 ?*:*)
198 ref="${cur%%:*}"
199 cur="${cur#*:}"
200 case "$cur" in
201 ?*/*)
202 pfx="${cur%/*}"
203 cur="${cur##*/}"
204 ls="$ref:$pfx"
205 pfx="$pfx/"
206 ;;
207 *)
208 ls="$ref"
209 ;;
210 esac
211 COMPREPLY=($(compgen -P "$pfx" \
212 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
213 | sed '/^100... blob /s,^.* ,,
214 /^040000 tree /{
215 s,^.* ,,
216 s,$,/,
217 }
218 s/^.* //')" \
219 -- "$cur"))
220 ;;
221 *)
222 __gitcomp "$(__git_refs)"
223 ;;
224 esac
225}
226
227__git_complete_revlist ()
228{
229 local pfx cur="${COMP_WORDS[COMP_CWORD]}"
230 case "$cur" in
231 *...*)
232 pfx="${cur%...*}..."
233 cur="${cur#*...}"
234 __gitcomp "$(__git_refs)" "$pfx" "$cur"
235 ;;
236 *..*)
237 pfx="${cur%..*}.."
238 cur="${cur#*..}"
239 __gitcomp "$(__git_refs)" "$pfx" "$cur"
240 ;;
241 *.)
242 __gitcomp "$cur."
243 ;;
244 *)
245 __gitcomp "$(__git_refs)"
246 ;;
247 esac
248}
249
250__git_commands ()
251{
252 if [ -n "$__git_commandlist" ]; then
253 echo "$__git_commandlist"
254 return
255 fi
256 local i IFS=" "$'\n'
257 for i in $(git help -a|egrep '^ ')
258 do
259 case $i in
260 add--interactive) : plumbing;;
261 applymbox) : ask gittus;;
262 applypatch) : ask gittus;;
263 archimport) : import;;
264 cat-file) : plumbing;;
265 check-attr) : plumbing;;
266 check-ref-format) : plumbing;;
267 commit-tree) : plumbing;;
268 convert-objects) : plumbing;;
269 cvsexportcommit) : export;;
270 cvsimport) : import;;
271 cvsserver) : daemon;;
272 daemon) : daemon;;
273 fast-import) : import;;
274 fsck-objects) : plumbing;;
275 fetch--tool) : plumbing;;
276 fetch-pack) : plumbing;;
277 fmt-merge-msg) : plumbing;;
278 for-each-ref) : plumbing;;
279 hash-object) : plumbing;;
280 http-*) : transport;;
281 index-pack) : plumbing;;
282 init-db) : deprecated;;
283 local-fetch) : plumbing;;
284 mailinfo) : plumbing;;
285 mailsplit) : plumbing;;
286 merge-*) : plumbing;;
287 mktree) : plumbing;;
288 mktag) : plumbing;;
289 pack-objects) : plumbing;;
290 pack-redundant) : plumbing;;
291 pack-refs) : plumbing;;
292 parse-remote) : plumbing;;
293 patch-id) : plumbing;;
294 peek-remote) : plumbing;;
295 prune) : plumbing;;
296 prune-packed) : plumbing;;
297 quiltimport) : import;;
298 read-tree) : plumbing;;
299 receive-pack) : plumbing;;
300 reflog) : plumbing;;
301 repo-config) : plumbing;;
302 rerere) : plumbing;;
303 rev-list) : plumbing;;
304 rev-parse) : plumbing;;
305 runstatus) : plumbing;;
306 sh-setup) : internal;;
307 shell) : daemon;;
308 send-pack) : plumbing;;
309 show-index) : plumbing;;
310 ssh-*) : transport;;
311 stripspace) : plumbing;;
312 svn) : import export;;
313 svnimport) : import;;
314 symbolic-ref) : plumbing;;
315 tar-tree) : deprecated;;
316 unpack-file) : plumbing;;
317 unpack-objects) : plumbing;;
318 update-index) : plumbing;;
319 update-ref) : plumbing;;
320 update-server-info) : daemon;;
321 upload-archive) : plumbing;;
322 upload-pack) : plumbing;;
323 write-tree) : plumbing;;
324 verify-tag) : plumbing;;
325 *) echo $i;;
326 esac
327 done
328}
329__git_commandlist=
330__git_commandlist="$(__git_commands 2>/dev/null)"
331
332__git_aliases ()
333{
334 local i IFS=$'\n'
335 for i in $(git --git-dir="$(__gitdir)" config --list); do
336 case "$i" in
337 alias.*)
338 i="${i#alias.}"
339 echo "${i/=*/}"
340 ;;
341 esac
342 done
343}
344
345__git_aliased_command ()
346{
347 local word cmdline=$(git --git-dir="$(__gitdir)" \
348 config --get "alias.$1")
349 for word in $cmdline; do
350 if [ "${word##-*}" ]; then
351 echo $word
352 return
353 fi
354 done
355}
356
357__git_whitespacelist="nowarn warn error error-all strip"
358
359_git_am ()
360{
361 local cur="${COMP_WORDS[COMP_CWORD]}"
362 if [ -d .dotest ]; then
363 __gitcomp "--skip --resolved"
364 return
365 fi
366 case "$cur" in
367 --whitespace=*)
368 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
369 return
370 ;;
371 --*)
372 __gitcomp "
373 --signoff --utf8 --binary --3way --interactive
374 --whitespace=
375 "
376 return
377 esac
378 COMPREPLY=()
379}
380
381_git_apply ()
382{
383 local cur="${COMP_WORDS[COMP_CWORD]}"
384 case "$cur" in
385 --whitespace=*)
386 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
387 return
388 ;;
389 --*)
390 __gitcomp "
391 --stat --numstat --summary --check --index
392 --cached --index-info --reverse --reject --unidiff-zero
393 --apply --no-add --exclude=
394 --whitespace= --inaccurate-eof --verbose
395 "
396 return
397 esac
398 COMPREPLY=()
399}
400
401_git_add ()
402{
403 local cur="${COMP_WORDS[COMP_CWORD]}"
404 case "$cur" in
405 --*)
406 __gitcomp "--interactive"
407 return
408 esac
409 COMPREPLY=()
410}
411
412_git_bisect ()
413{
414 local i c=1 command
415 while [ $c -lt $COMP_CWORD ]; do
416 i="${COMP_WORDS[c]}"
417 case "$i" in
418 start|bad|good|reset|visualize|replay|log)
419 command="$i"
420 break
421 ;;
422 esac
423 c=$((++c))
424 done
425
426 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
427 __gitcomp "start bad good reset visualize replay log"
428 return
429 fi
430
431 case "$command" in
432 bad|good|reset)
433 __gitcomp "$(__git_refs)"
434 ;;
435 *)
436 COMPREPLY=()
437 ;;
438 esac
439}
440
441_git_branch ()
442{
443 __gitcomp "$(__git_refs)"
444}
445
446_git_checkout ()
447{
448 __gitcomp "$(__git_refs)"
449}
450
451_git_cherry ()
452{
453 __gitcomp "$(__git_refs)"
454}
455
456_git_cherry_pick ()
457{
458 local cur="${COMP_WORDS[COMP_CWORD]}"
459 case "$cur" in
460 --*)
461 __gitcomp "--edit --no-commit"
462 ;;
463 *)
464 __gitcomp "$(__git_refs)"
465 ;;
466 esac
467}
468
469_git_commit ()
470{
471 local cur="${COMP_WORDS[COMP_CWORD]}"
472 case "$cur" in
473 --*)
474 __gitcomp "
475 --all --author= --signoff --verify --no-verify
476 --edit --amend --include --only
477 "
478 return
479 esac
480 COMPREPLY=()
481}
482
483_git_diff ()
484{
485 __git_complete_file
486}
487
488_git_diff_tree ()
489{
490 __gitcomp "$(__git_refs)"
491}
492
493_git_fetch ()
494{
495 local cur="${COMP_WORDS[COMP_CWORD]}"
496
497 case "${COMP_WORDS[0]},$COMP_CWORD" in
498 git-fetch*,1)
499 __gitcomp "$(__git_remotes)"
500 ;;
501 git,2)
502 __gitcomp "$(__git_remotes)"
503 ;;
504 *)
505 case "$cur" in
506 *:*)
507 __gitcomp "$(__git_refs)" "" "${cur#*:}"
508 ;;
509 *)
510 local remote
511 case "${COMP_WORDS[0]}" in
512 git-fetch) remote="${COMP_WORDS[1]}" ;;
513 git) remote="${COMP_WORDS[2]}" ;;
514 esac
515 __gitcomp "$(__git_refs2 "$remote")"
516 ;;
517 esac
518 ;;
519 esac
520}
521
522_git_format_patch ()
523{
524 local cur="${COMP_WORDS[COMP_CWORD]}"
525 case "$cur" in
526 --*)
527 __gitcomp "
528 --stdout --attach --thread
529 --output-directory
530 --numbered --start-number
531 --keep-subject
532 --signoff
533 --in-reply-to=
534 --full-index --binary
535 --not --all
536 "
537 return
538 ;;
539 esac
540 __git_complete_revlist
541}
542
543_git_gc ()
544{
545 local cur="${COMP_WORDS[COMP_CWORD]}"
546 case "$cur" in
547 --*)
548 __gitcomp "--prune"
549 return
550 ;;
551 esac
552 COMPREPLY=()
553}
554
555_git_ls_remote ()
556{
557 __gitcomp "$(__git_remotes)"
558}
559
560_git_ls_tree ()
561{
562 __git_complete_file
563}
564
565_git_log ()
566{
567 local cur="${COMP_WORDS[COMP_CWORD]}"
568 case "$cur" in
569 --pretty=*)
570 __gitcomp "
571 oneline short medium full fuller email raw
572 " "" "${cur##--pretty=}"
573 return
574 ;;
575 --*)
576 __gitcomp "
577 --max-count= --max-age= --since= --after=
578 --min-age= --before= --until=
579 --root --not --topo-order --date-order
580 --no-merges
581 --abbrev-commit --abbrev=
582 --relative-date
583 --author= --committer= --grep=
584 --all-match
585 --pretty= --name-status --name-only
586 --not --all
587 "
588 return
589 ;;
590 esac
591 __git_complete_revlist
592}
593
594_git_merge ()
595{
596 local cur="${COMP_WORDS[COMP_CWORD]}"
597 case "${COMP_WORDS[COMP_CWORD-1]}" in
598 -s|--strategy)
599 __gitcomp "$(__git_merge_strategies)"
600 return
601 esac
602 case "$cur" in
603 --strategy=*)
604 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
605 return
606 ;;
607 --*)
608 __gitcomp "
609 --no-commit --no-summary --squash --strategy
610 "
611 return
612 esac
613 __gitcomp "$(__git_refs)"
614}
615
616_git_merge_base ()
617{
618 __gitcomp "$(__git_refs)"
619}
620
621_git_name_rev ()
622{
623 __gitcomp "--tags --all --stdin"
624}
625
626_git_pull ()
627{
628 local cur="${COMP_WORDS[COMP_CWORD]}"
629
630 case "${COMP_WORDS[0]},$COMP_CWORD" in
631 git-pull*,1)
632 __gitcomp "$(__git_remotes)"
633 ;;
634 git,2)
635 __gitcomp "$(__git_remotes)"
636 ;;
637 *)
638 local remote
639 case "${COMP_WORDS[0]}" in
640 git-pull) remote="${COMP_WORDS[1]}" ;;
641 git) remote="${COMP_WORDS[2]}" ;;
642 esac
643 __gitcomp "$(__git_refs "$remote")"
644 ;;
645 esac
646}
647
648_git_push ()
649{
650 local cur="${COMP_WORDS[COMP_CWORD]}"
651
652 case "${COMP_WORDS[0]},$COMP_CWORD" in
653 git-push*,1)
654 __gitcomp "$(__git_remotes)"
655 ;;
656 git,2)
657 __gitcomp "$(__git_remotes)"
658 ;;
659 *)
660 case "$cur" in
661 *:*)
662 local remote
663 case "${COMP_WORDS[0]}" in
664 git-push) remote="${COMP_WORDS[1]}" ;;
665 git) remote="${COMP_WORDS[2]}" ;;
666 esac
667 __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
668 ;;
669 *)
670 __gitcomp "$(__git_refs2)"
671 ;;
672 esac
673 ;;
674 esac
675}
676
677_git_rebase ()
678{
679 local cur="${COMP_WORDS[COMP_CWORD]}"
680 if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
681 __gitcomp "--continue --skip --abort"
682 return
683 fi
684 case "${COMP_WORDS[COMP_CWORD-1]}" in
685 -s|--strategy)
686 __gitcomp "$(__git_merge_strategies)"
687 return
688 esac
689 case "$cur" in
690 --strategy=*)
691 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
692 return
693 ;;
694 --*)
695 __gitcomp "--onto --merge --strategy"
696 return
697 esac
698 __gitcomp "$(__git_refs)"
699}
700
701_git_config ()
702{
703 local cur="${COMP_WORDS[COMP_CWORD]}"
704 local prv="${COMP_WORDS[COMP_CWORD-1]}"
705 case "$prv" in
706 branch.*.remote)
707 __gitcomp "$(__git_remotes)"
708 return
709 ;;
710 branch.*.merge)
711 __gitcomp "$(__git_refs)"
712 return
713 ;;
714 remote.*.fetch)
715 local remote="${prv#remote.}"
716 remote="${remote%.fetch}"
717 __gitcomp "$(__git_refs_remotes "$remote")"
718 return
719 ;;
720 remote.*.push)
721 local remote="${prv#remote.}"
722 remote="${remote%.push}"
723 __gitcomp "$(git --git-dir="$(__gitdir)" \
724 for-each-ref --format='%(refname):%(refname)' \
725 refs/heads)"
726 return
727 ;;
728 pull.twohead|pull.octopus)
729 __gitcomp "$(__git_merge_strategies)"
730 return
731 ;;
732 color.branch|color.diff|color.status)
733 __gitcomp "always never auto"
734 return
735 ;;
736 color.*.*)
737 __gitcomp "
738 black red green yellow blue magenta cyan white
739 bold dim ul blink reverse
740 "
741 return
742 ;;
743 *.*)
744 COMPREPLY=()
745 return
746 ;;
747 esac
748 case "$cur" in
749 --*)
750 __gitcomp "
751 --global --list --replace-all
752 --get --get-all --get-regexp
753 --add --unset --unset-all
754 "
755 return
756 ;;
757 branch.*.*)
758 local pfx="${cur%.*}."
759 cur="${cur##*.}"
760 __gitcomp "remote merge" "$pfx" "$cur"
761 return
762 ;;
763 branch.*)
764 local pfx="${cur%.*}."
765 cur="${cur#*.}"
766 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
767 return
768 ;;
769 remote.*.*)
770 local pfx="${cur%.*}."
771 cur="${cur##*.}"
772 __gitcomp "url fetch push" "$pfx" "$cur"
773 return
774 ;;
775 remote.*)
776 local pfx="${cur%.*}."
777 cur="${cur#*.}"
778 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
779 return
780 ;;
781 esac
782 __gitcomp "
783 apply.whitespace
784 core.fileMode
785 core.gitProxy
786 core.ignoreStat
787 core.preferSymlinkRefs
788 core.logAllRefUpdates
789 core.repositoryFormatVersion
790 core.sharedRepository
791 core.warnAmbiguousRefs
792 core.compression
793 core.legacyHeaders
794 core.packedGitWindowSize
795 core.packedGitLimit
796 clean.requireForce
797 color.branch
798 color.branch.current
799 color.branch.local
800 color.branch.remote
801 color.branch.plain
802 color.diff
803 color.diff.plain
804 color.diff.meta
805 color.diff.frag
806 color.diff.old
807 color.diff.new
808 color.diff.commit
809 color.diff.whitespace
810 color.pager
811 color.status
812 color.status.header
813 color.status.added
814 color.status.changed
815 color.status.untracked
816 diff.renameLimit
817 diff.renames
818 fetch.unpackLimit
819 format.headers
820 gitcvs.enabled
821 gitcvs.logfile
822 gc.reflogexpire
823 gc.reflogexpireunreachable
824 gc.rerereresolved
825 gc.rerereunresolved
826 http.sslVerify
827 http.sslCert
828 http.sslKey
829 http.sslCAInfo
830 http.sslCAPath
831 http.maxRequests
832 http.lowSpeedLimit
833 http.lowSpeedTime
834 http.noEPSV
835 i18n.commitEncoding
836 i18n.logOutputEncoding
837 log.showroot
838 merge.summary
839 merge.verbosity
840 pack.window
841 pull.octopus
842 pull.twohead
843 repack.useDeltaBaseOffset
844 show.difftree
845 showbranch.default
846 tar.umask
847 transfer.unpackLimit
848 receive.unpackLimit
849 receive.denyNonFastForwards
850 user.name
851 user.email
852 user.signingkey
853 whatchanged.difftree
854 branch. remote.
855 "
856}
857
858_git_remote ()
859{
860 local i c=1 command
861 while [ $c -lt $COMP_CWORD ]; do
862 i="${COMP_WORDS[c]}"
863 case "$i" in
864 add|show|prune) command="$i"; break ;;
865 esac
866 c=$((++c))
867 done
868
869 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
870 __gitcomp "add show prune"
871 return
872 fi
873
874 case "$command" in
875 show|prune)
876 __gitcomp "$(__git_remotes)"
877 ;;
878 *)
879 COMPREPLY=()
880 ;;
881 esac
882}
883
884_git_reset ()
885{
886 local cur="${COMP_WORDS[COMP_CWORD]}"
887 case "$cur" in
888 --*)
889 __gitcomp "--mixed --hard --soft"
890 return
891 ;;
892 esac
893 __gitcomp "$(__git_refs)"
894}
895
896_git_show ()
897{
898 local cur="${COMP_WORDS[COMP_CWORD]}"
899 case "$cur" in
900 --pretty=*)
901 __gitcomp "
902 oneline short medium full fuller email raw
903 " "" "${cur##--pretty=}"
904 return
905 ;;
906 --*)
907 __gitcomp "--pretty="
908 return
909 ;;
910 esac
911 __git_complete_file
912}
913
914_git ()
915{
916 local i c=1 command __git_dir
917
918 while [ $c -lt $COMP_CWORD ]; do
919 i="${COMP_WORDS[c]}"
920 case "$i" in
921 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
922 --bare) __git_dir="." ;;
923 --version|--help|-p|--paginate) ;;
924 *) command="$i"; break ;;
925 esac
926 c=$((++c))
927 done
928
929 if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
930 case "${COMP_WORDS[COMP_CWORD]}" in
931 --*=*) COMPREPLY=() ;;
932 --*) __gitcomp "--git-dir= --bare --version --exec-path" ;;
933 *) __gitcomp "$(__git_commands) $(__git_aliases)" ;;
934 esac
935 return
936 fi
937
938 local expansion=$(__git_aliased_command "$command")
939 [ "$expansion" ] && command="$expansion"
940
941 case "$command" in
942 am) _git_am ;;
943 add) _git_add ;;
944 apply) _git_apply ;;
945 bisect) _git_bisect ;;
946 branch) _git_branch ;;
947 checkout) _git_checkout ;;
948 cherry) _git_cherry ;;
949 cherry-pick) _git_cherry_pick ;;
950 commit) _git_commit ;;
951 config) _git_config ;;
952 diff) _git_diff ;;
953 diff-tree) _git_diff_tree ;;
954 fetch) _git_fetch ;;
955 format-patch) _git_format_patch ;;
956 gc) _git_gc ;;
957 log) _git_log ;;
958 ls-remote) _git_ls_remote ;;
959 ls-tree) _git_ls_tree ;;
960 merge) _git_merge;;
961 merge-base) _git_merge_base ;;
962 name-rev) _git_name_rev ;;
963 pull) _git_pull ;;
964 push) _git_push ;;
965 rebase) _git_rebase ;;
966 remote) _git_remote ;;
967 reset) _git_reset ;;
968 show) _git_show ;;
969 show-branch) _git_log ;;
970 whatchanged) _git_log ;;
971 *) COMPREPLY=() ;;
972 esac
973}
974
975_gitk ()
976{
977 local cur="${COMP_WORDS[COMP_CWORD]}"
978 case "$cur" in
979 --*)
980 __gitcomp "--not --all"
981 return
982 ;;
983 esac
984 __git_complete_revlist
985}
986
987complete -o default -o nospace -F _git git
988complete -o default -o nospace -F _gitk gitk
989complete -o default -o nospace -F _git_am git-am
990complete -o default -o nospace -F _git_apply git-apply
991complete -o default -o nospace -F _git_bisect git-bisect
992complete -o default -o nospace -F _git_branch git-branch
993complete -o default -o nospace -F _git_checkout git-checkout
994complete -o default -o nospace -F _git_cherry git-cherry
995complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
996complete -o default -o nospace -F _git_commit git-commit
997complete -o default -o nospace -F _git_diff git-diff
998complete -o default -o nospace -F _git_diff_tree git-diff-tree
999complete -o default -o nospace -F _git_fetch git-fetch
1000complete -o default -o nospace -F _git_format_patch git-format-patch
1001complete -o default -o nospace -F _git_gc git-gc
1002complete -o default -o nospace -F _git_log git-log
1003complete -o default -o nospace -F _git_ls_remote git-ls-remote
1004complete -o default -o nospace -F _git_ls_tree git-ls-tree
1005complete -o default -o nospace -F _git_merge git-merge
1006complete -o default -o nospace -F _git_merge_base git-merge-base
1007complete -o default -o nospace -F _git_name_rev git-name-rev
1008complete -o default -o nospace -F _git_pull git-pull
1009complete -o default -o nospace -F _git_push git-push
1010complete -o default -o nospace -F _git_rebase git-rebase
1011complete -o default -o nospace -F _git_config git-config
1012complete -o default -o nospace -F _git_remote git-remote
1013complete -o default -o nospace -F _git_reset git-reset
1014complete -o default -o nospace -F _git_show git-show
1015complete -o default -o nospace -F _git_log git-show-branch
1016complete -o default -o nospace -F _git_log git-whatchanged
1017
1018# The following are necessary only for Cygwin, and only are needed
1019# when the user has tab-completed the executable name and consequently
1020# included the '.exe' suffix.
1021#
1022if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1023complete -o default -o nospace -F _git_add git-add.exe
1024complete -o default -o nospace -F _git_apply git-apply.exe
1025complete -o default -o nospace -F _git git.exe
1026complete -o default -o nospace -F _git_branch git-branch.exe
1027complete -o default -o nospace -F _git_cherry git-cherry.exe
1028complete -o default -o nospace -F _git_diff git-diff.exe
1029complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
1030complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1031complete -o default -o nospace -F _git_log git-log.exe
1032complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1033complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1034complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1035complete -o default -o nospace -F _git_push git-push.exe
1036complete -o default -o nospace -F _git_config git-config
1037complete -o default -o nospace -F _git_show git-show.exe
1038complete -o default -o nospace -F _git_log git-show-branch.exe
1039complete -o default -o nospace -F _git_log git-whatchanged.exe
1040fi