]> asedeno.scripts.mit.edu Git - git.git/blob - contrib/completion/git-completion.bash
bash: Hide diff-stages from completion.
[git.git] / contrib / completion / git-completion.bash
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-ref-format) : plumbing;;
266                 commit-tree)      : plumbing;;
267                 convert-objects)  : plumbing;;
268                 cvsexportcommit)  : export;;
269                 cvsimport)        : import;;
270                 cvsserver)        : daemon;;
271                 daemon)           : daemon;;
272                 diff-stages)      : nobody uses it;;
273                 fsck-objects)     : plumbing;;
274                 fetch-pack)       : plumbing;;
275                 fmt-merge-msg)    : plumbing;;
276                 hash-object)      : plumbing;;
277                 http-*)           : transport;;
278                 index-pack)       : plumbing;;
279                 init-db)          : deprecated;;
280                 local-fetch)      : plumbing;;
281                 mailinfo)         : plumbing;;
282                 mailsplit)        : plumbing;;
283                 merge-*)          : plumbing;;
284                 mktree)           : plumbing;;
285                 mktag)            : plumbing;;
286                 pack-objects)     : plumbing;;
287                 pack-redundant)   : plumbing;;
288                 pack-refs)        : plumbing;;
289                 parse-remote)     : plumbing;;
290                 patch-id)         : plumbing;;
291                 peek-remote)      : plumbing;;
292                 prune)            : plumbing;;
293                 prune-packed)     : plumbing;;
294                 quiltimport)      : import;;
295                 read-tree)        : plumbing;;
296                 receive-pack)     : plumbing;;
297                 reflog)           : plumbing;;
298                 repo-config)      : plumbing;;
299                 rerere)           : plumbing;;
300                 rev-list)         : plumbing;;
301                 rev-parse)        : plumbing;;
302                 runstatus)        : plumbing;;
303                 sh-setup)         : internal;;
304                 shell)            : daemon;;
305                 send-pack)        : plumbing;;
306                 show-index)       : plumbing;;
307                 ssh-*)            : transport;;
308                 stripspace)       : plumbing;;
309                 svn)              : import export;;
310                 svnimport)        : import;;
311                 symbolic-ref)     : plumbing;;
312                 tar-tree)         : deprecated;;
313                 unpack-file)      : plumbing;;
314                 unpack-objects)   : plumbing;;
315                 update-index)     : plumbing;;
316                 update-ref)       : plumbing;;
317                 update-server-info) : daemon;;
318                 upload-archive)   : plumbing;;
319                 upload-pack)      : plumbing;;
320                 write-tree)       : plumbing;;
321                 verify-tag)       : plumbing;;
322                 *) echo $i;;
323                 esac
324         done
325 }
326 __git_commandlist=
327 __git_commandlist="$(__git_commands 2>/dev/null)"
328
329 __git_aliases ()
330 {
331         local i IFS=$'\n'
332         for i in $(git --git-dir="$(__gitdir)" config --list); do
333                 case "$i" in
334                 alias.*)
335                         i="${i#alias.}"
336                         echo "${i/=*/}"
337                         ;;
338                 esac
339         done
340 }
341
342 __git_aliased_command ()
343 {
344         local word cmdline=$(git --git-dir="$(__gitdir)" \
345                 config --get "alias.$1")
346         for word in $cmdline; do
347                 if [ "${word##-*}" ]; then
348                         echo $word
349                         return
350                 fi
351         done
352 }
353
354 __git_whitespacelist="nowarn warn error error-all strip"
355
356 _git_am ()
357 {
358         local cur="${COMP_WORDS[COMP_CWORD]}"
359         if [ -d .dotest ]; then
360                 __gitcomp "--skip --resolved"
361                 return
362         fi
363         case "$cur" in
364         --whitespace=*)
365                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
366                 return
367                 ;;
368         --*)
369                 __gitcomp "
370                         --signoff --utf8 --binary --3way --interactive
371                         --whitespace=
372                         "
373                 return
374         esac
375         COMPREPLY=()
376 }
377
378 _git_apply ()
379 {
380         local cur="${COMP_WORDS[COMP_CWORD]}"
381         case "$cur" in
382         --whitespace=*)
383                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
384                 return
385                 ;;
386         --*)
387                 __gitcomp "
388                         --stat --numstat --summary --check --index
389                         --cached --index-info --reverse --reject --unidiff-zero
390                         --apply --no-add --exclude=
391                         --whitespace= --inaccurate-eof --verbose
392                         "
393                 return
394         esac
395         COMPREPLY=()
396 }
397
398 _git_add ()
399 {
400         local cur="${COMP_WORDS[COMP_CWORD]}"
401         case "$cur" in
402         --*)
403                 __gitcomp "--interactive"
404                 return
405         esac
406         COMPREPLY=()
407 }
408
409 _git_branch ()
410 {
411         __gitcomp "$(__git_refs)"
412 }
413
414 _git_checkout ()
415 {
416         __gitcomp "$(__git_refs)"
417 }
418
419 _git_cherry ()
420 {
421         __gitcomp "$(__git_refs)"
422 }
423
424 _git_cherry_pick ()
425 {
426         local cur="${COMP_WORDS[COMP_CWORD]}"
427         case "$cur" in
428         --*)
429                 __gitcomp "--edit --no-commit"
430                 ;;
431         *)
432                 __gitcomp "$(__git_refs)"
433                 ;;
434         esac
435 }
436
437 _git_commit ()
438 {
439         local cur="${COMP_WORDS[COMP_CWORD]}"
440         case "$cur" in
441         --*)
442                 __gitcomp "
443                         --all --author= --signoff --verify --no-verify
444                         --edit --amend --include --only
445                         "
446                 return
447         esac
448         COMPREPLY=()
449 }
450
451 _git_diff ()
452 {
453         __git_complete_file
454 }
455
456 _git_diff_tree ()
457 {
458         __gitcomp "$(__git_refs)"
459 }
460
461 _git_fetch ()
462 {
463         local cur="${COMP_WORDS[COMP_CWORD]}"
464
465         case "${COMP_WORDS[0]},$COMP_CWORD" in
466         git-fetch*,1)
467                 __gitcomp "$(__git_remotes)"
468                 ;;
469         git,2)
470                 __gitcomp "$(__git_remotes)"
471                 ;;
472         *)
473                 case "$cur" in
474                 *:*)
475                         __gitcomp "$(__git_refs)" "" "${cur#*:}"
476                         ;;
477                 *)
478                         local remote
479                         case "${COMP_WORDS[0]}" in
480                         git-fetch) remote="${COMP_WORDS[1]}" ;;
481                         git)       remote="${COMP_WORDS[2]}" ;;
482                         esac
483                         __gitcomp "$(__git_refs2 "$remote")"
484                         ;;
485                 esac
486                 ;;
487         esac
488 }
489
490 _git_format_patch ()
491 {
492         local cur="${COMP_WORDS[COMP_CWORD]}"
493         case "$cur" in
494         --*)
495                 __gitcomp "
496                         --stdout --attach --thread
497                         --output-directory
498                         --numbered --start-number
499                         --keep-subject
500                         --signoff
501                         --in-reply-to=
502                         --full-index --binary
503                         --not --all
504                         "
505                 return
506                 ;;
507         esac
508         __git_complete_revlist
509 }
510
511 _git_ls_remote ()
512 {
513         __gitcomp "$(__git_remotes)"
514 }
515
516 _git_ls_tree ()
517 {
518         __git_complete_file
519 }
520
521 _git_log ()
522 {
523         local cur="${COMP_WORDS[COMP_CWORD]}"
524         case "$cur" in
525         --pretty=*)
526                 __gitcomp "
527                         oneline short medium full fuller email raw
528                         " "" "${cur##--pretty=}"
529                 return
530                 ;;
531         --*)
532                 __gitcomp "
533                         --max-count= --max-age= --since= --after=
534                         --min-age= --before= --until=
535                         --root --not --topo-order --date-order
536                         --no-merges
537                         --abbrev-commit --abbrev=
538                         --relative-date
539                         --author= --committer= --grep=
540                         --all-match
541                         --pretty= --name-status --name-only
542                         --not --all
543                         "
544                 return
545                 ;;
546         esac
547         __git_complete_revlist
548 }
549
550 _git_merge ()
551 {
552         local cur="${COMP_WORDS[COMP_CWORD]}"
553         case "${COMP_WORDS[COMP_CWORD-1]}" in
554         -s|--strategy)
555                 __gitcomp "$(__git_merge_strategies)"
556                 return
557         esac
558         case "$cur" in
559         --strategy=*)
560                 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
561                 return
562                 ;;
563         --*)
564                 __gitcomp "
565                         --no-commit --no-summary --squash --strategy
566                         "
567                 return
568         esac
569         __gitcomp "$(__git_refs)"
570 }
571
572 _git_merge_base ()
573 {
574         __gitcomp "$(__git_refs)"
575 }
576
577 _git_name_rev ()
578 {
579         __gitcomp "--tags --all --stdin"
580 }
581
582 _git_pull ()
583 {
584         local cur="${COMP_WORDS[COMP_CWORD]}"
585
586         case "${COMP_WORDS[0]},$COMP_CWORD" in
587         git-pull*,1)
588                 __gitcomp "$(__git_remotes)"
589                 ;;
590         git,2)
591                 __gitcomp "$(__git_remotes)"
592                 ;;
593         *)
594                 local remote
595                 case "${COMP_WORDS[0]}" in
596                 git-pull)  remote="${COMP_WORDS[1]}" ;;
597                 git)       remote="${COMP_WORDS[2]}" ;;
598                 esac
599                 __gitcomp "$(__git_refs "$remote")"
600                 ;;
601         esac
602 }
603
604 _git_push ()
605 {
606         local cur="${COMP_WORDS[COMP_CWORD]}"
607
608         case "${COMP_WORDS[0]},$COMP_CWORD" in
609         git-push*,1)
610                 __gitcomp "$(__git_remotes)"
611                 ;;
612         git,2)
613                 __gitcomp "$(__git_remotes)"
614                 ;;
615         *)
616                 case "$cur" in
617                 *:*)
618                         local remote
619                         case "${COMP_WORDS[0]}" in
620                         git-push)  remote="${COMP_WORDS[1]}" ;;
621                         git)       remote="${COMP_WORDS[2]}" ;;
622                         esac
623                         __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
624                         ;;
625                 *)
626                         __gitcomp "$(__git_refs2)"
627                         ;;
628                 esac
629                 ;;
630         esac
631 }
632
633 _git_rebase ()
634 {
635         local cur="${COMP_WORDS[COMP_CWORD]}"
636         if [ -d .dotest ]; then
637                 __gitcomp "--continue --skip --abort"
638                 return
639         fi
640         case "${COMP_WORDS[COMP_CWORD-1]}" in
641         -s|--strategy)
642                 __gitcomp "$(__git_merge_strategies)"
643                 return
644         esac
645         case "$cur" in
646         --strategy=*)
647                 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
648                 return
649                 ;;
650         --*)
651                 __gitcomp "--onto --merge --strategy"
652                 return
653         esac
654         __gitcomp "$(__git_refs)"
655 }
656
657 _git_config ()
658 {
659         local cur="${COMP_WORDS[COMP_CWORD]}"
660         local prv="${COMP_WORDS[COMP_CWORD-1]}"
661         case "$prv" in
662         branch.*.remote)
663                 __gitcomp "$(__git_remotes)"
664                 return
665                 ;;
666         branch.*.merge)
667                 __gitcomp "$(__git_refs)"
668                 return
669                 ;;
670         remote.*.fetch)
671                 local remote="${prv#remote.}"
672                 remote="${remote%.fetch}"
673                 __gitcomp "$(__git_refs_remotes "$remote")"
674                 return
675                 ;;
676         remote.*.push)
677                 local remote="${prv#remote.}"
678                 remote="${remote%.push}"
679                 __gitcomp "$(git --git-dir="$(__gitdir)" \
680                         for-each-ref --format='%(refname):%(refname)' \
681                         refs/heads)"
682                 return
683                 ;;
684         pull.twohead|pull.octopus)
685                 __gitcomp "$(__git_merge_strategies)"
686                 return
687                 ;;
688         color.branch|color.diff|color.status)
689                 __gitcomp "always never auto"
690                 return
691                 ;;
692         color.*.*)
693                 __gitcomp "
694                         black red green yellow blue magenta cyan white
695                         bold dim ul blink reverse
696                         "
697                 return
698                 ;;
699         *.*)
700                 COMPREPLY=()
701                 return
702                 ;;
703         esac
704         case "$cur" in
705         --*)
706                 __gitcomp "
707                         --global --list --replace-all
708                         --get --get-all --get-regexp
709                         --unset --unset-all
710                         "
711                 return
712                 ;;
713         branch.*.*)
714                 local pfx="${cur%.*}."
715                 cur="${cur##*.}"
716                 __gitcomp "remote merge" "$pfx" "$cur"
717                 return
718                 ;;
719         branch.*)
720                 local pfx="${cur%.*}."
721                 cur="${cur#*.}"
722                 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
723                 return
724                 ;;
725         remote.*.*)
726                 local pfx="${cur%.*}."
727                 cur="${cur##*.}"
728                 __gitcomp "url fetch push" "$pfx" "$cur"
729                 return
730                 ;;
731         remote.*)
732                 local pfx="${cur%.*}."
733                 cur="${cur#*.}"
734                 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
735                 return
736                 ;;
737         esac
738         __gitcomp "
739                 apply.whitespace
740                 core.fileMode
741                 core.gitProxy
742                 core.ignoreStat
743                 core.preferSymlinkRefs
744                 core.logAllRefUpdates
745                 core.repositoryFormatVersion
746                 core.sharedRepository
747                 core.warnAmbiguousRefs
748                 core.compression
749                 core.legacyHeaders
750                 core.packedGitWindowSize
751                 core.packedGitLimit
752                 color.branch
753                 color.branch.current
754                 color.branch.local
755                 color.branch.remote
756                 color.branch.plain
757                 color.diff
758                 color.diff.plain
759                 color.diff.meta
760                 color.diff.frag
761                 color.diff.old
762                 color.diff.new
763                 color.diff.commit
764                 color.diff.whitespace
765                 color.pager
766                 color.status
767                 color.status.header
768                 color.status.added
769                 color.status.changed
770                 color.status.untracked
771                 diff.renameLimit
772                 diff.renames
773                 fetch.unpackLimit
774                 format.headers
775                 gitcvs.enabled
776                 gitcvs.logfile
777                 gc.reflogexpire
778                 gc.reflogexpireunreachable
779                 gc.rerereresolved
780                 gc.rerereunresolved
781                 http.sslVerify
782                 http.sslCert
783                 http.sslKey
784                 http.sslCAInfo
785                 http.sslCAPath
786                 http.maxRequests
787                 http.lowSpeedLimit
788                 http.lowSpeedTime
789                 http.noEPSV
790                 i18n.commitEncoding
791                 i18n.logOutputEncoding
792                 log.showroot
793                 merge.summary
794                 merge.verbosity
795                 pack.window
796                 pull.octopus
797                 pull.twohead
798                 repack.useDeltaBaseOffset
799                 show.difftree
800                 showbranch.default
801                 tar.umask
802                 transfer.unpackLimit
803                 receive.unpackLimit
804                 receive.denyNonFastForwards
805                 user.name
806                 user.email
807                 user.signingkey
808                 whatchanged.difftree
809                 branch. remote.
810         "
811 }
812
813 _git_reset ()
814 {
815         local cur="${COMP_WORDS[COMP_CWORD]}"
816         case "$cur" in
817         --*)
818                 __gitcomp "--mixed --hard --soft"
819                 return
820                 ;;
821         esac
822         __gitcomp "$(__git_refs)"
823 }
824
825 _git_show ()
826 {
827         local cur="${COMP_WORDS[COMP_CWORD]}"
828         case "$cur" in
829         --pretty=*)
830                 __gitcomp "
831                         oneline short medium full fuller email raw
832                         " "" "${cur##--pretty=}"
833                 return
834                 ;;
835         --*)
836                 __gitcomp "--pretty="
837                 return
838                 ;;
839         esac
840         __git_complete_file
841 }
842
843 _git ()
844 {
845         local i c=1 command __git_dir
846
847         while [ $c -lt $COMP_CWORD ]; do
848                 i="${COMP_WORDS[c]}"
849                 case "$i" in
850                 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
851                 --bare)      __git_dir="." ;;
852                 --version|--help|-p|--paginate) ;;
853                 *) command="$i"; break ;;
854                 esac
855                 c=$((++c))
856         done
857
858         if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
859                 case "${COMP_WORDS[COMP_CWORD]}" in
860                 --*=*) COMPREPLY=() ;;
861                 --*)   __gitcomp "--git-dir= --bare --version --exec-path" ;;
862                 *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
863                 esac
864                 return
865         fi
866
867         local expansion=$(__git_aliased_command "$command")
868         [ "$expansion" ] && command="$expansion"
869
870         case "$command" in
871         am)          _git_am ;;
872         add)         _git_add ;;
873         apply)       _git_apply ;;
874         branch)      _git_branch ;;
875         checkout)    _git_checkout ;;
876         cherry)      _git_cherry ;;
877         cherry-pick) _git_cherry_pick ;;
878         commit)      _git_commit ;;
879         config)      _git_config ;;
880         diff)        _git_diff ;;
881         diff-tree)   _git_diff_tree ;;
882         fetch)       _git_fetch ;;
883         format-patch) _git_format_patch ;;
884         log)         _git_log ;;
885         ls-remote)   _git_ls_remote ;;
886         ls-tree)     _git_ls_tree ;;
887         merge)       _git_merge;;
888         merge-base)  _git_merge_base ;;
889         name-rev)    _git_name_rev ;;
890         pull)        _git_pull ;;
891         push)        _git_push ;;
892         rebase)      _git_rebase ;;
893         reset)       _git_reset ;;
894         show)        _git_show ;;
895         show-branch) _git_log ;;
896         whatchanged) _git_log ;;
897         *)           COMPREPLY=() ;;
898         esac
899 }
900
901 _gitk ()
902 {
903         local cur="${COMP_WORDS[COMP_CWORD]}"
904         case "$cur" in
905         --*)
906                 __gitcomp "--not --all"
907                 return
908                 ;;
909         esac
910         __git_complete_revlist
911 }
912
913 complete -o default -o nospace -F _git git
914 complete -o default -o nospace -F _gitk gitk
915 complete -o default -o nospace -F _git_am git-am
916 complete -o default -o nospace -F _git_apply git-apply
917 complete -o default -o nospace -F _git_branch git-branch
918 complete -o default -o nospace -F _git_checkout git-checkout
919 complete -o default -o nospace -F _git_cherry git-cherry
920 complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
921 complete -o default -o nospace -F _git_commit git-commit
922 complete -o default -o nospace -F _git_diff git-diff
923 complete -o default -o nospace -F _git_diff_tree git-diff-tree
924 complete -o default -o nospace -F _git_fetch git-fetch
925 complete -o default -o nospace -F _git_format_patch git-format-patch
926 complete -o default -o nospace -F _git_log git-log
927 complete -o default -o nospace -F _git_ls_remote git-ls-remote
928 complete -o default -o nospace -F _git_ls_tree git-ls-tree
929 complete -o default -o nospace -F _git_merge git-merge
930 complete -o default -o nospace -F _git_merge_base git-merge-base
931 complete -o default -o nospace -F _git_name_rev git-name-rev
932 complete -o default -o nospace -F _git_pull git-pull
933 complete -o default -o nospace -F _git_push git-push
934 complete -o default -o nospace -F _git_rebase git-rebase
935 complete -o default -o nospace -F _git_config git-config
936 complete -o default -o nospace -F _git_reset git-reset
937 complete -o default -o nospace -F _git_show git-show
938 complete -o default -o nospace -F _git_log git-show-branch
939 complete -o default -o nospace -F _git_log git-whatchanged
940
941 # The following are necessary only for Cygwin, and only are needed
942 # when the user has tab-completed the executable name and consequently
943 # included the '.exe' suffix.
944 #
945 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
946 complete -o default -o nospace -F _git_add git-add.exe
947 complete -o default -o nospace -F _git_apply git-apply.exe
948 complete -o default -o nospace -F _git git.exe
949 complete -o default -o nospace -F _git_branch git-branch.exe
950 complete -o default -o nospace -F _git_cherry git-cherry.exe
951 complete -o default -o nospace -F _git_diff git-diff.exe
952 complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
953 complete -o default -o nospace -F _git_format_patch git-format-patch.exe
954 complete -o default -o nospace -F _git_log git-log.exe
955 complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
956 complete -o default -o nospace -F _git_merge_base git-merge-base.exe
957 complete -o default -o nospace -F _git_name_rev git-name-rev.exe
958 complete -o default -o nospace -F _git_push git-push.exe
959 complete -o default -o nospace -F _git_config git-config
960 complete -o default -o nospace -F _git_show git-show.exe
961 complete -o default -o nospace -F _git_log git-show-branch.exe
962 complete -o default -o nospace -F _git_log git-whatchanged.exe
963 fi