bash completion: Add completion for 'git archive'
[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 case "$COMP_WORDBREAKS" in
49 *:*) : great ;;
50 *)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
51 esac
52
53 __gitdir ()
54 {
55         if [ -z "$1" ]; then
56                 if [ -n "$__git_dir" ]; then
57                         echo "$__git_dir"
58                 elif [ -d .git ]; then
59                         echo .git
60                 else
61                         git rev-parse --git-dir 2>/dev/null
62                 fi
63         elif [ -d "$1/.git" ]; then
64                 echo "$1/.git"
65         else
66                 echo "$1"
67         fi
68 }
69
70 __git_ps1 ()
71 {
72         local g="$(git rev-parse --git-dir 2>/dev/null)"
73         if [ -n "$g" ]; then
74                 local r
75                 local b
76                 if [ -d "$g/rebase-apply" ]
77                 then
78                         if test -f "$g/rebase-apply/rebasing"
79                         then
80                                 r="|REBASE"
81                         elif test -f "$g/rebase-apply/applying"
82                         then
83                                 r="|AM"
84                         else
85                                 r="|AM/REBASE"
86                         fi
87                         b="$(git symbolic-ref HEAD 2>/dev/null)"
88                 elif [ -f "$g/rebase-merge/interactive" ]
89                 then
90                         r="|REBASE-i"
91                         b="$(cat "$g/rebase-merge/head-name")"
92                 elif [ -d "$g/rebase-merge" ]
93                 then
94                         r="|REBASE-m"
95                         b="$(cat "$g/rebase-merge/head-name")"
96                 elif [ -f "$g/MERGE_HEAD" ]
97                 then
98                         r="|MERGING"
99                         b="$(git symbolic-ref HEAD 2>/dev/null)"
100                 else
101                         if [ -f "$g/BISECT_LOG" ]
102                         then
103                                 r="|BISECTING"
104                         fi
105                         if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
106                         then
107                                 if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
108                                 then
109                                         b="$(cut -c1-7 "$g/HEAD")..."
110                                 fi
111                         fi
112                 fi
113
114                 if [ -n "$1" ]; then
115                         printf "$1" "${b##refs/heads/}$r"
116                 else
117                         printf " (%s)" "${b##refs/heads/}$r"
118                 fi
119         fi
120 }
121
122 __gitcomp_1 ()
123 {
124         local c IFS=' '$'\t'$'\n'
125         for c in $1; do
126                 case "$c$2" in
127                 --*=*) printf %s$'\n' "$c$2" ;;
128                 *.)    printf %s$'\n' "$c$2" ;;
129                 *)     printf %s$'\n' "$c$2 " ;;
130                 esac
131         done
132 }
133
134 __gitcomp ()
135 {
136         local cur="${COMP_WORDS[COMP_CWORD]}"
137         if [ $# -gt 2 ]; then
138                 cur="$3"
139         fi
140         case "$cur" in
141         --*=)
142                 COMPREPLY=()
143                 ;;
144         *)
145                 local IFS=$'\n'
146                 COMPREPLY=($(compgen -P "$2" \
147                         -W "$(__gitcomp_1 "$1" "$4")" \
148                         -- "$cur"))
149                 ;;
150         esac
151 }
152
153 __git_heads ()
154 {
155         local cmd i is_hash=y dir="$(__gitdir "$1")"
156         if [ -d "$dir" ]; then
157                 for i in $(git --git-dir="$dir" \
158                         for-each-ref --format='%(refname)' \
159                         refs/heads ); do
160                         echo "${i#refs/heads/}"
161                 done
162                 return
163         fi
164         for i in $(git ls-remote "$1" 2>/dev/null); do
165                 case "$is_hash,$i" in
166                 y,*) is_hash=n ;;
167                 n,*^{}) is_hash=y ;;
168                 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
169                 n,*) is_hash=y; echo "$i" ;;
170                 esac
171         done
172 }
173
174 __git_tags ()
175 {
176         local cmd i is_hash=y dir="$(__gitdir "$1")"
177         if [ -d "$dir" ]; then
178                 for i in $(git --git-dir="$dir" \
179                         for-each-ref --format='%(refname)' \
180                         refs/tags ); do
181                         echo "${i#refs/tags/}"
182                 done
183                 return
184         fi
185         for i in $(git ls-remote "$1" 2>/dev/null); do
186                 case "$is_hash,$i" in
187                 y,*) is_hash=n ;;
188                 n,*^{}) is_hash=y ;;
189                 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
190                 n,*) is_hash=y; echo "$i" ;;
191                 esac
192         done
193 }
194
195 __git_refs ()
196 {
197         local cmd i is_hash=y dir="$(__gitdir "$1")"
198         if [ -d "$dir" ]; then
199                 if [ -e "$dir/HEAD" ]; then echo HEAD; fi
200                 for i in $(git --git-dir="$dir" \
201                         for-each-ref --format='%(refname)' \
202                         refs/tags refs/heads refs/remotes); do
203                         case "$i" in
204                                 refs/tags/*)    echo "${i#refs/tags/}" ;;
205                                 refs/heads/*)   echo "${i#refs/heads/}" ;;
206                                 refs/remotes/*) echo "${i#refs/remotes/}" ;;
207                                 *)              echo "$i" ;;
208                         esac
209                 done
210                 return
211         fi
212         for i in $(git ls-remote "$dir" 2>/dev/null); do
213                 case "$is_hash,$i" in
214                 y,*) is_hash=n ;;
215                 n,*^{}) is_hash=y ;;
216                 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
217                 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
218                 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
219                 n,*) is_hash=y; echo "$i" ;;
220                 esac
221         done
222 }
223
224 __git_refs2 ()
225 {
226         local i
227         for i in $(__git_refs "$1"); do
228                 echo "$i:$i"
229         done
230 }
231
232 __git_refs_remotes ()
233 {
234         local cmd i is_hash=y
235         for i in $(git ls-remote "$1" 2>/dev/null); do
236                 case "$is_hash,$i" in
237                 n,refs/heads/*)
238                         is_hash=y
239                         echo "$i:refs/remotes/$1/${i#refs/heads/}"
240                         ;;
241                 y,*) is_hash=n ;;
242                 n,*^{}) is_hash=y ;;
243                 n,refs/tags/*) is_hash=y;;
244                 n,*) is_hash=y; ;;
245                 esac
246         done
247 }
248
249 __git_remotes ()
250 {
251         local i ngoff IFS=$'\n' d="$(__gitdir)"
252         shopt -q nullglob || ngoff=1
253         shopt -s nullglob
254         for i in "$d/remotes"/*; do
255                 echo ${i#$d/remotes/}
256         done
257         [ "$ngoff" ] && shopt -u nullglob
258         for i in $(git --git-dir="$d" config --list); do
259                 case "$i" in
260                 remote.*.url=*)
261                         i="${i#remote.}"
262                         echo "${i/.url=*/}"
263                         ;;
264                 esac
265         done
266 }
267
268 __git_merge_strategies ()
269 {
270         if [ -n "$__git_merge_strategylist" ]; then
271                 echo "$__git_merge_strategylist"
272                 return
273         fi
274         sed -n "/^all_strategies='/{
275                 s/^all_strategies='//
276                 s/'//
277                 p
278                 q
279                 }" "$(git --exec-path)/git-merge"
280 }
281 __git_merge_strategylist=
282 __git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
283
284 __git_complete_file ()
285 {
286         local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
287         case "$cur" in
288         ?*:*)
289                 ref="${cur%%:*}"
290                 cur="${cur#*:}"
291                 case "$cur" in
292                 ?*/*)
293                         pfx="${cur%/*}"
294                         cur="${cur##*/}"
295                         ls="$ref:$pfx"
296                         pfx="$pfx/"
297                         ;;
298                 *)
299                         ls="$ref"
300                         ;;
301             esac
302
303                 case "$COMP_WORDBREAKS" in
304                 *:*) : great ;;
305                 *)   pfx="$ref:$pfx" ;;
306                 esac
307
308                 local IFS=$'\n'
309                 COMPREPLY=($(compgen -P "$pfx" \
310                         -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
311                                 | sed '/^100... blob /{
312                                            s,^.*        ,,
313                                            s,$, ,
314                                        }
315                                        /^120000 blob /{
316                                            s,^.*        ,,
317                                            s,$, ,
318                                        }
319                                        /^040000 tree /{
320                                            s,^.*        ,,
321                                            s,$,/,
322                                        }
323                                        s/^.*    //')" \
324                         -- "$cur"))
325                 ;;
326         *)
327                 __gitcomp "$(__git_refs)"
328                 ;;
329         esac
330 }
331
332 __git_complete_revlist ()
333 {
334         local pfx cur="${COMP_WORDS[COMP_CWORD]}"
335         case "$cur" in
336         *...*)
337                 pfx="${cur%...*}..."
338                 cur="${cur#*...}"
339                 __gitcomp "$(__git_refs)" "$pfx" "$cur"
340                 ;;
341         *..*)
342                 pfx="${cur%..*}.."
343                 cur="${cur#*..}"
344                 __gitcomp "$(__git_refs)" "$pfx" "$cur"
345                 ;;
346         *)
347                 __gitcomp "$(__git_refs)"
348                 ;;
349         esac
350 }
351
352 __git_all_commands ()
353 {
354         if [ -n "$__git_all_commandlist" ]; then
355                 echo "$__git_all_commandlist"
356                 return
357         fi
358         local i IFS=" "$'\n'
359         for i in $(git help -a|egrep '^ ')
360         do
361                 case $i in
362                 *--*)             : helper pattern;;
363                 *) echo $i;;
364                 esac
365         done
366 }
367 __git_all_commandlist=
368 __git_all_commandlist="$(__git_all_commands 2>/dev/null)"
369
370 __git_porcelain_commands ()
371 {
372         if [ -n "$__git_porcelain_commandlist" ]; then
373                 echo "$__git_porcelain_commandlist"
374                 return
375         fi
376         local i IFS=" "$'\n'
377         for i in "help" $(__git_all_commands)
378         do
379                 case $i in
380                 *--*)             : helper pattern;;
381                 applymbox)        : ask gittus;;
382                 applypatch)       : ask gittus;;
383                 archimport)       : import;;
384                 cat-file)         : plumbing;;
385                 check-attr)       : plumbing;;
386                 check-ref-format) : plumbing;;
387                 commit-tree)      : plumbing;;
388                 cvsexportcommit)  : export;;
389                 cvsimport)        : import;;
390                 cvsserver)        : daemon;;
391                 daemon)           : daemon;;
392                 diff-files)       : plumbing;;
393                 diff-index)       : plumbing;;
394                 diff-tree)        : plumbing;;
395                 fast-import)      : import;;
396                 fsck-objects)     : plumbing;;
397                 fetch-pack)       : plumbing;;
398                 fmt-merge-msg)    : plumbing;;
399                 for-each-ref)     : plumbing;;
400                 hash-object)      : plumbing;;
401                 http-*)           : transport;;
402                 index-pack)       : plumbing;;
403                 init-db)          : deprecated;;
404                 local-fetch)      : plumbing;;
405                 mailinfo)         : plumbing;;
406                 mailsplit)        : plumbing;;
407                 merge-*)          : plumbing;;
408                 mktree)           : plumbing;;
409                 mktag)            : plumbing;;
410                 pack-objects)     : plumbing;;
411                 pack-redundant)   : plumbing;;
412                 pack-refs)        : plumbing;;
413                 parse-remote)     : plumbing;;
414                 patch-id)         : plumbing;;
415                 peek-remote)      : plumbing;;
416                 prune)            : plumbing;;
417                 prune-packed)     : plumbing;;
418                 quiltimport)      : import;;
419                 read-tree)        : plumbing;;
420                 receive-pack)     : plumbing;;
421                 reflog)           : plumbing;;
422                 repo-config)      : deprecated;;
423                 rerere)           : plumbing;;
424                 rev-list)         : plumbing;;
425                 rev-parse)        : plumbing;;
426                 runstatus)        : plumbing;;
427                 sh-setup)         : internal;;
428                 shell)            : daemon;;
429                 send-pack)        : plumbing;;
430                 show-index)       : plumbing;;
431                 ssh-*)            : transport;;
432                 stripspace)       : plumbing;;
433                 symbolic-ref)     : plumbing;;
434                 tar-tree)         : deprecated;;
435                 unpack-file)      : plumbing;;
436                 unpack-objects)   : plumbing;;
437                 update-index)     : plumbing;;
438                 update-ref)       : plumbing;;
439                 update-server-info) : daemon;;
440                 upload-archive)   : plumbing;;
441                 upload-pack)      : plumbing;;
442                 write-tree)       : plumbing;;
443                 verify-tag)       : plumbing;;
444                 *) echo $i;;
445                 esac
446         done
447 }
448 __git_porcelain_commandlist=
449 __git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
450
451 __git_aliases ()
452 {
453         local i IFS=$'\n'
454         for i in $(git --git-dir="$(__gitdir)" config --list); do
455                 case "$i" in
456                 alias.*)
457                         i="${i#alias.}"
458                         echo "${i/=*/}"
459                         ;;
460                 esac
461         done
462 }
463
464 __git_aliased_command ()
465 {
466         local word cmdline=$(git --git-dir="$(__gitdir)" \
467                 config --get "alias.$1")
468         for word in $cmdline; do
469                 if [ "${word##-*}" ]; then
470                         echo $word
471                         return
472                 fi
473         done
474 }
475
476 __git_find_subcommand ()
477 {
478         local word subcommand c=1
479
480         while [ $c -lt $COMP_CWORD ]; do
481                 word="${COMP_WORDS[c]}"
482                 for subcommand in $1; do
483                         if [ "$subcommand" = "$word" ]; then
484                                 echo "$subcommand"
485                                 return
486                         fi
487                 done
488                 c=$((++c))
489         done
490 }
491
492 __git_has_doubledash ()
493 {
494         local c=1
495         while [ $c -lt $COMP_CWORD ]; do
496                 if [ "--" = "${COMP_WORDS[c]}" ]; then
497                         return 0
498                 fi
499                 c=$((++c))
500         done
501         return 1
502 }
503
504 __git_whitespacelist="nowarn warn error error-all strip"
505
506 _git_am ()
507 {
508         local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
509         if [ -d "$dir"/rebase-apply ]; then
510                 __gitcomp "--skip --resolved --abort"
511                 return
512         fi
513         case "$cur" in
514         --whitespace=*)
515                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
516                 return
517                 ;;
518         --*)
519                 __gitcomp "
520                         --signoff --utf8 --binary --3way --interactive
521                         --whitespace=
522                         "
523                 return
524         esac
525         COMPREPLY=()
526 }
527
528 _git_apply ()
529 {
530         local cur="${COMP_WORDS[COMP_CWORD]}"
531         case "$cur" in
532         --whitespace=*)
533                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
534                 return
535                 ;;
536         --*)
537                 __gitcomp "
538                         --stat --numstat --summary --check --index
539                         --cached --index-info --reverse --reject --unidiff-zero
540                         --apply --no-add --exclude=
541                         --whitespace= --inaccurate-eof --verbose
542                         "
543                 return
544         esac
545         COMPREPLY=()
546 }
547
548 _git_add ()
549 {
550         __git_has_doubledash && return
551
552         local cur="${COMP_WORDS[COMP_CWORD]}"
553         case "$cur" in
554         --*)
555                 __gitcomp "
556                         --interactive --refresh --patch --update --dry-run
557                         --ignore-errors
558                         "
559                 return
560         esac
561         COMPREPLY=()
562 }
563
564 _git_archive ()
565 {
566         local cur="${COMP_WORDS[COMP_CWORD]}"
567         case "$cur" in
568         --format=*)
569                 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
570                 return
571                 ;;
572         --remote=*)
573                 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
574                 return
575                 ;;
576         --*)
577                 __gitcomp "
578                         --format= --list --verbose
579                         --prefix= --remote= --exec=
580                         "
581                 return
582                 ;;
583         esac
584         __git_complete_file
585 }
586
587 _git_bisect ()
588 {
589         __git_has_doubledash && return
590
591         local subcommands="start bad good skip reset visualize replay log run"
592         local subcommand="$(__git_find_subcommand "$subcommands")"
593         if [ -z "$subcommand" ]; then
594                 __gitcomp "$subcommands"
595                 return
596         fi
597
598         case "$subcommand" in
599         bad|good|reset|skip)
600                 __gitcomp "$(__git_refs)"
601                 ;;
602         *)
603                 COMPREPLY=()
604                 ;;
605         esac
606 }
607
608 _git_branch ()
609 {
610         local i c=1 only_local_ref="n" has_r="n"
611
612         while [ $c -lt $COMP_CWORD ]; do
613                 i="${COMP_WORDS[c]}"
614                 case "$i" in
615                 -d|-m)  only_local_ref="y" ;;
616                 -r)     has_r="y" ;;
617                 esac
618                 c=$((++c))
619         done
620
621         case "${COMP_WORDS[COMP_CWORD]}" in
622         --*=*)  COMPREPLY=() ;;
623         --*)
624                 __gitcomp "
625                         --color --no-color --verbose --abbrev= --no-abbrev
626                         --track --no-track --contains --merged --no-merged
627                         "
628                 ;;
629         *)
630                 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
631                         __gitcomp "$(__git_heads)"
632                 else
633                         __gitcomp "$(__git_refs)"
634                 fi
635                 ;;
636         esac
637 }
638
639 _git_bundle ()
640 {
641         local mycword="$COMP_CWORD"
642         case "${COMP_WORDS[0]}" in
643         git)
644                 local cmd="${COMP_WORDS[2]}"
645                 mycword="$((mycword-1))"
646                 ;;
647         git-bundle*)
648                 local cmd="${COMP_WORDS[1]}"
649                 ;;
650         esac
651         case "$mycword" in
652         1)
653                 __gitcomp "create list-heads verify unbundle"
654                 ;;
655         2)
656                 # looking for a file
657                 ;;
658         *)
659                 case "$cmd" in
660                         create)
661                                 __git_complete_revlist
662                         ;;
663                 esac
664                 ;;
665         esac
666 }
667
668 _git_checkout ()
669 {
670         __git_has_doubledash && return
671
672         __gitcomp "$(__git_refs)"
673 }
674
675 _git_cherry ()
676 {
677         __gitcomp "$(__git_refs)"
678 }
679
680 _git_cherry_pick ()
681 {
682         local cur="${COMP_WORDS[COMP_CWORD]}"
683         case "$cur" in
684         --*)
685                 __gitcomp "--edit --no-commit"
686                 ;;
687         *)
688                 __gitcomp "$(__git_refs)"
689                 ;;
690         esac
691 }
692
693 _git_clean ()
694 {
695         __git_has_doubledash && return
696
697         local cur="${COMP_WORDS[COMP_CWORD]}"
698         case "$cur" in
699         --*)
700                 __gitcomp "--dry-run --quiet"
701                 return
702                 ;;
703         esac
704         COMPREPLY=()
705 }
706
707 _git_clone ()
708 {
709         local cur="${COMP_WORDS[COMP_CWORD]}"
710         case "$cur" in
711         --*)
712                 __gitcomp "
713                         --local
714                         --no-hardlinks
715                         --shared
716                         --reference
717                         --quiet
718                         --no-checkout
719                         --bare
720                         --mirror
721                         --origin
722                         --upload-pack
723                         --template=
724                         --depth
725                         "
726                 return
727                 ;;
728         esac
729         COMPREPLY=()
730 }
731
732 _git_commit ()
733 {
734         __git_has_doubledash && return
735
736         local cur="${COMP_WORDS[COMP_CWORD]}"
737         case "$cur" in
738         --*)
739                 __gitcomp "
740                         --all --author= --signoff --verify --no-verify
741                         --edit --amend --include --only
742                         "
743                 return
744         esac
745         COMPREPLY=()
746 }
747
748 _git_describe ()
749 {
750         local cur="${COMP_WORDS[COMP_CWORD]}"
751         case "$cur" in
752         --*)
753                 __gitcomp "
754                         --all --tags --contains --abbrev= --candidates=
755                         --exact-match --debug --long --match --always
756                         "
757                 return
758         esac
759         __gitcomp "$(__git_refs)"
760 }
761
762 _git_diff ()
763 {
764         __git_has_doubledash && return
765
766         local cur="${COMP_WORDS[COMP_CWORD]}"
767         case "$cur" in
768         --*)
769                 __gitcomp "--cached --stat --numstat --shortstat --summary
770                         --patch-with-stat --name-only --name-status --color
771                         --no-color --color-words --no-renames --check
772                         --full-index --binary --abbrev --diff-filter
773                         --find-copies-harder --pickaxe-all --pickaxe-regex
774                         --text --ignore-space-at-eol --ignore-space-change
775                         --ignore-all-space --exit-code --quiet --ext-diff
776                         --no-ext-diff
777                         --no-prefix --src-prefix= --dst-prefix=
778                         --base --ours --theirs
779                         "
780                 return
781                 ;;
782         esac
783         __git_complete_file
784 }
785
786 _git_fetch ()
787 {
788         local cur="${COMP_WORDS[COMP_CWORD]}"
789
790         case "${COMP_WORDS[0]},$COMP_CWORD" in
791         git-fetch*,1)
792                 __gitcomp "$(__git_remotes)"
793                 ;;
794         git,2)
795                 __gitcomp "$(__git_remotes)"
796                 ;;
797         *)
798                 case "$cur" in
799                 *:*)
800                         local pfx=""
801                         case "$COMP_WORDBREAKS" in
802                         *:*) : great ;;
803                         *)   pfx="${cur%%:*}:" ;;
804                         esac
805                         __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
806                         ;;
807                 *)
808                         local remote
809                         case "${COMP_WORDS[0]}" in
810                         git-fetch) remote="${COMP_WORDS[1]}" ;;
811                         git)       remote="${COMP_WORDS[2]}" ;;
812                         esac
813                         __gitcomp "$(__git_refs2 "$remote")"
814                         ;;
815                 esac
816                 ;;
817         esac
818 }
819
820 _git_format_patch ()
821 {
822         local cur="${COMP_WORDS[COMP_CWORD]}"
823         case "$cur" in
824         --*)
825                 __gitcomp "
826                         --stdout --attach --thread
827                         --output-directory
828                         --numbered --start-number
829                         --numbered-files
830                         --keep-subject
831                         --signoff
832                         --in-reply-to=
833                         --full-index --binary
834                         --not --all
835                         --cover-letter
836                         --no-prefix --src-prefix= --dst-prefix=
837                         "
838                 return
839                 ;;
840         esac
841         __git_complete_revlist
842 }
843
844 _git_gc ()
845 {
846         local cur="${COMP_WORDS[COMP_CWORD]}"
847         case "$cur" in
848         --*)
849                 __gitcomp "--prune --aggressive"
850                 return
851                 ;;
852         esac
853         COMPREPLY=()
854 }
855
856 _git_grep ()
857 {
858         __git_has_doubledash && return
859
860         local cur="${COMP_WORDS[COMP_CWORD]}"
861         case "$cur" in
862         --*)
863                 __gitcomp "
864                         --cached
865                         --text --ignore-case --word-regexp --invert-match
866                         --full-name
867                         --extended-regexp --basic-regexp --fixed-strings
868                         --files-with-matches --name-only
869                         --files-without-match
870                         --count
871                         --and --or --not --all-match
872                         "
873                 return
874                 ;;
875         esac
876         COMPREPLY=()
877 }
878
879 _git_help ()
880 {
881         local cur="${COMP_WORDS[COMP_CWORD]}"
882         case "$cur" in
883         --*)
884                 __gitcomp "--all --info --man --web"
885                 return
886                 ;;
887         esac
888         __gitcomp "$(__git_all_commands)"
889 }
890
891 _git_init ()
892 {
893         local cur="${COMP_WORDS[COMP_CWORD]}"
894         case "$cur" in
895         --shared=*)
896                 __gitcomp "
897                         false true umask group all world everybody
898                         " "" "${cur##--shared=}"
899                 return
900                 ;;
901         --*)
902                 __gitcomp "--quiet --bare --template= --shared --shared="
903                 return
904                 ;;
905         esac
906         COMPREPLY=()
907 }
908
909 _git_ls_remote ()
910 {
911         __gitcomp "$(__git_remotes)"
912 }
913
914 _git_ls_tree ()
915 {
916         __git_complete_file
917 }
918
919 _git_log ()
920 {
921         __git_has_doubledash && return
922
923         local cur="${COMP_WORDS[COMP_CWORD]}"
924         case "$cur" in
925         --pretty=*)
926                 __gitcomp "
927                         oneline short medium full fuller email raw
928                         " "" "${cur##--pretty=}"
929                 return
930                 ;;
931         --date=*)
932                 __gitcomp "
933                         relative iso8601 rfc2822 short local default
934                 " "" "${cur##--date=}"
935                 return
936                 ;;
937         --*)
938                 __gitcomp "
939                         --max-count= --max-age= --since= --after=
940                         --min-age= --before= --until=
941                         --root --topo-order --date-order --reverse
942                         --no-merges --follow
943                         --abbrev-commit --abbrev=
944                         --relative-date --date=
945                         --author= --committer= --grep=
946                         --all-match
947                         --pretty= --name-status --name-only --raw
948                         --not --all
949                         --left-right --cherry-pick
950                         --graph
951                         --stat --numstat --shortstat
952                         --decorate --diff-filter=
953                         --color-words --walk-reflogs
954                         --parents --children --full-history
955                         "
956                 return
957                 ;;
958         esac
959         __git_complete_revlist
960 }
961
962 _git_merge ()
963 {
964         local cur="${COMP_WORDS[COMP_CWORD]}"
965         case "${COMP_WORDS[COMP_CWORD-1]}" in
966         -s|--strategy)
967                 __gitcomp "$(__git_merge_strategies)"
968                 return
969         esac
970         case "$cur" in
971         --strategy=*)
972                 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
973                 return
974                 ;;
975         --*)
976                 __gitcomp "
977                         --no-commit --no-stat --log --no-log --squash --strategy
978                         "
979                 return
980         esac
981         __gitcomp "$(__git_refs)"
982 }
983
984 _git_merge_base ()
985 {
986         __gitcomp "$(__git_refs)"
987 }
988
989 _git_name_rev ()
990 {
991         __gitcomp "--tags --all --stdin"
992 }
993
994 _git_pull ()
995 {
996         local cur="${COMP_WORDS[COMP_CWORD]}"
997
998         case "${COMP_WORDS[0]},$COMP_CWORD" in
999         git-pull*,1)
1000                 __gitcomp "$(__git_remotes)"
1001                 ;;
1002         git,2)
1003                 __gitcomp "$(__git_remotes)"
1004                 ;;
1005         *)
1006                 local remote
1007                 case "${COMP_WORDS[0]}" in
1008                 git-pull)  remote="${COMP_WORDS[1]}" ;;
1009                 git)       remote="${COMP_WORDS[2]}" ;;
1010                 esac
1011                 __gitcomp "$(__git_refs "$remote")"
1012                 ;;
1013         esac
1014 }
1015
1016 _git_push ()
1017 {
1018         local cur="${COMP_WORDS[COMP_CWORD]}"
1019
1020         case "${COMP_WORDS[0]},$COMP_CWORD" in
1021         git-push*,1)
1022                 __gitcomp "$(__git_remotes)"
1023                 ;;
1024         git,2)
1025                 __gitcomp "$(__git_remotes)"
1026                 ;;
1027         *)
1028                 case "$cur" in
1029                 *:*)
1030                         local remote
1031                         case "${COMP_WORDS[0]}" in
1032                         git-push)  remote="${COMP_WORDS[1]}" ;;
1033                         git)       remote="${COMP_WORDS[2]}" ;;
1034                         esac
1035
1036                         local pfx=""
1037                         case "$COMP_WORDBREAKS" in
1038                         *:*) : great ;;
1039                         *)   pfx="${cur%%:*}:" ;;
1040                         esac
1041
1042                         __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
1043                         ;;
1044                 +*)
1045                         __gitcomp "$(__git_refs)" + "${cur#+}"
1046                         ;;
1047                 *)
1048                         __gitcomp "$(__git_refs)"
1049                         ;;
1050                 esac
1051                 ;;
1052         esac
1053 }
1054
1055 _git_rebase ()
1056 {
1057         local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1058         if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1059                 __gitcomp "--continue --skip --abort"
1060                 return
1061         fi
1062         case "${COMP_WORDS[COMP_CWORD-1]}" in
1063         -s|--strategy)
1064                 __gitcomp "$(__git_merge_strategies)"
1065                 return
1066         esac
1067         case "$cur" in
1068         --strategy=*)
1069                 __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1070                 return
1071                 ;;
1072         --*)
1073                 __gitcomp "--onto --merge --strategy --interactive"
1074                 return
1075         esac
1076         __gitcomp "$(__git_refs)"
1077 }
1078
1079 _git_send_email ()
1080 {
1081         local cur="${COMP_WORDS[COMP_CWORD]}"
1082         case "$cur" in
1083         --*)
1084                 __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1085                         --dry-run --envelope-sender --from --identity
1086                         --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1087                         --no-suppress-from --no-thread --quiet
1088                         --signed-off-by-cc --smtp-pass --smtp-server
1089                         --smtp-server-port --smtp-ssl --smtp-user --subject
1090                         --suppress-cc --suppress-from --thread --to"
1091                 return
1092                 ;;
1093         esac
1094         COMPREPLY=()
1095 }
1096
1097 _git_config ()
1098 {
1099         local cur="${COMP_WORDS[COMP_CWORD]}"
1100         local prv="${COMP_WORDS[COMP_CWORD-1]}"
1101         case "$prv" in
1102         branch.*.remote)
1103                 __gitcomp "$(__git_remotes)"
1104                 return
1105                 ;;
1106         branch.*.merge)
1107                 __gitcomp "$(__git_refs)"
1108                 return
1109                 ;;
1110         remote.*.fetch)
1111                 local remote="${prv#remote.}"
1112                 remote="${remote%.fetch}"
1113                 __gitcomp "$(__git_refs_remotes "$remote")"
1114                 return
1115                 ;;
1116         remote.*.push)
1117                 local remote="${prv#remote.}"
1118                 remote="${remote%.push}"
1119                 __gitcomp "$(git --git-dir="$(__gitdir)" \
1120                         for-each-ref --format='%(refname):%(refname)' \
1121                         refs/heads)"
1122                 return
1123                 ;;
1124         pull.twohead|pull.octopus)
1125                 __gitcomp "$(__git_merge_strategies)"
1126                 return
1127                 ;;
1128         color.branch|color.diff|color.status)
1129                 __gitcomp "always never auto"
1130                 return
1131                 ;;
1132         color.*.*)
1133                 __gitcomp "
1134                         black red green yellow blue magenta cyan white
1135                         bold dim ul blink reverse
1136                         "
1137                 return
1138                 ;;
1139         *.*)
1140                 COMPREPLY=()
1141                 return
1142                 ;;
1143         esac
1144         case "$cur" in
1145         --*)
1146                 __gitcomp "
1147                         --global --system --file=
1148                         --list --replace-all
1149                         --get --get-all --get-regexp
1150                         --add --unset --unset-all
1151                         --remove-section --rename-section
1152                         "
1153                 return
1154                 ;;
1155         branch.*.*)
1156                 local pfx="${cur%.*}."
1157                 cur="${cur##*.}"
1158                 __gitcomp "remote merge" "$pfx" "$cur"
1159                 return
1160                 ;;
1161         branch.*)
1162                 local pfx="${cur%.*}."
1163                 cur="${cur#*.}"
1164                 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1165                 return
1166                 ;;
1167         remote.*.*)
1168                 local pfx="${cur%.*}."
1169                 cur="${cur##*.}"
1170                 __gitcomp "
1171                         url fetch push skipDefaultUpdate
1172                         receivepack uploadpack tagopt
1173                         " "$pfx" "$cur"
1174                 return
1175                 ;;
1176         remote.*)
1177                 local pfx="${cur%.*}."
1178                 cur="${cur#*.}"
1179                 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1180                 return
1181                 ;;
1182         esac
1183         __gitcomp "
1184                 apply.whitespace
1185                 core.fileMode
1186                 core.gitProxy
1187                 core.ignoreStat
1188                 core.preferSymlinkRefs
1189                 core.logAllRefUpdates
1190                 core.loosecompression
1191                 core.repositoryFormatVersion
1192                 core.sharedRepository
1193                 core.warnAmbiguousRefs
1194                 core.compression
1195                 core.packedGitWindowSize
1196                 core.packedGitLimit
1197                 clean.requireForce
1198                 color.branch
1199                 color.branch.current
1200                 color.branch.local
1201                 color.branch.remote
1202                 color.branch.plain
1203                 color.diff
1204                 color.diff.plain
1205                 color.diff.meta
1206                 color.diff.frag
1207                 color.diff.old
1208                 color.diff.new
1209                 color.diff.commit
1210                 color.diff.whitespace
1211                 color.pager
1212                 color.status
1213                 color.status.header
1214                 color.status.added
1215                 color.status.changed
1216                 color.status.untracked
1217                 diff.renameLimit
1218                 diff.renames
1219                 fetch.unpackLimit
1220                 format.headers
1221                 format.subjectprefix
1222                 gitcvs.enabled
1223                 gitcvs.logfile
1224                 gitcvs.allbinary
1225                 gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1226                 gitcvs.dbtablenameprefix
1227                 gc.packrefs
1228                 gc.reflogexpire
1229                 gc.reflogexpireunreachable
1230                 gc.rerereresolved
1231                 gc.rerereunresolved
1232                 http.sslVerify
1233                 http.sslCert
1234                 http.sslKey
1235                 http.sslCAInfo
1236                 http.sslCAPath
1237                 http.maxRequests
1238                 http.lowSpeedLimit
1239                 http.lowSpeedTime
1240                 http.noEPSV
1241                 i18n.commitEncoding
1242                 i18n.logOutputEncoding
1243                 log.showroot
1244                 merge.tool
1245                 merge.summary
1246                 merge.verbosity
1247                 pack.window
1248                 pack.depth
1249                 pack.windowMemory
1250                 pack.compression
1251                 pack.deltaCacheSize
1252                 pack.deltaCacheLimit
1253                 pull.octopus
1254                 pull.twohead
1255                 repack.useDeltaBaseOffset
1256                 showbranch.default
1257                 tar.umask
1258                 transfer.unpackLimit
1259                 receive.unpackLimit
1260                 receive.denyNonFastForwards
1261                 user.name
1262                 user.email
1263                 user.signingkey
1264                 branch. remote.
1265         "
1266 }
1267
1268 _git_remote ()
1269 {
1270         local subcommands="add rm show prune update"
1271         local subcommand="$(__git_find_subcommand "$subcommands")"
1272         if [ -z "$subcommand" ]; then
1273                 __gitcomp "$subcommands"
1274                 return
1275         fi
1276
1277         case "$subcommand" in
1278         rm|show|prune)
1279                 __gitcomp "$(__git_remotes)"
1280                 ;;
1281         update)
1282                 local i c='' IFS=$'\n'
1283                 for i in $(git --git-dir="$(__gitdir)" config --list); do
1284                         case "$i" in
1285                         remotes.*)
1286                                 i="${i#remotes.}"
1287                                 c="$c ${i/=*/}"
1288                                 ;;
1289                         esac
1290                 done
1291                 __gitcomp "$c"
1292                 ;;
1293         *)
1294                 COMPREPLY=()
1295                 ;;
1296         esac
1297 }
1298
1299 _git_reset ()
1300 {
1301         __git_has_doubledash && return
1302
1303         local cur="${COMP_WORDS[COMP_CWORD]}"
1304         case "$cur" in
1305         --*)
1306                 __gitcomp "--mixed --hard --soft"
1307                 return
1308                 ;;
1309         esac
1310         __gitcomp "$(__git_refs)"
1311 }
1312
1313 _git_revert ()
1314 {
1315         local cur="${COMP_WORDS[COMP_CWORD]}"
1316         case "$cur" in
1317         --*)
1318                 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1319                 return
1320                 ;;
1321         esac
1322         COMPREPLY=()
1323 }
1324
1325 _git_rm ()
1326 {
1327         __git_has_doubledash && return
1328
1329         local cur="${COMP_WORDS[COMP_CWORD]}"
1330         case "$cur" in
1331         --*)
1332                 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1333                 return
1334                 ;;
1335         esac
1336         COMPREPLY=()
1337 }
1338
1339 _git_shortlog ()
1340 {
1341         __git_has_doubledash && return
1342
1343         local cur="${COMP_WORDS[COMP_CWORD]}"
1344         case "$cur" in
1345         --*)
1346                 __gitcomp "
1347                         --max-count= --max-age= --since= --after=
1348                         --min-age= --before= --until=
1349                         --no-merges
1350                         --author= --committer= --grep=
1351                         --all-match
1352                         --not --all
1353                         --numbered --summary
1354                         "
1355                 return
1356                 ;;
1357         esac
1358         __git_complete_revlist
1359 }
1360
1361 _git_show ()
1362 {
1363         local cur="${COMP_WORDS[COMP_CWORD]}"
1364         case "$cur" in
1365         --pretty=*)
1366                 __gitcomp "
1367                         oneline short medium full fuller email raw
1368                         " "" "${cur##--pretty=}"
1369                 return
1370                 ;;
1371         --*)
1372                 __gitcomp "--pretty="
1373                 return
1374                 ;;
1375         esac
1376         __git_complete_file
1377 }
1378
1379 _git_show_branch ()
1380 {
1381         local cur="${COMP_WORDS[COMP_CWORD]}"
1382         case "$cur" in
1383         --*)
1384                 __gitcomp "
1385                         --all --remotes --topo-order --current --more=
1386                         --list --independent --merge-base --no-name
1387                         --sha1-name --topics --reflog
1388                         "
1389                 return
1390                 ;;
1391         esac
1392         __git_complete_revlist
1393 }
1394
1395 _git_stash ()
1396 {
1397         local subcommands='save list show apply clear drop pop create branch'
1398         local subcommand="$(__git_find_subcommand "$subcommands")"
1399         if [ -z "$subcommand" ]; then
1400                 __gitcomp "$subcommands"
1401         else
1402                 local cur="${COMP_WORDS[COMP_CWORD]}"
1403                 case "$subcommand,$cur" in
1404                 save,--*)
1405                         __gitcomp "--keep-index"
1406                         ;;
1407                 apply,--*)
1408                         __gitcomp "--index"
1409                         ;;
1410                 show,--*|apply,--*|drop,--*|pop,--*|branch,--*)
1411                         COMPREPLY=()
1412                         ;;
1413                 show,*|apply,*|drop,*|pop,*|branch,*)
1414                         __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1415                                         | sed -n -e 's/:.*//p')"
1416                         ;;
1417                 *)
1418                         COMPREPLY=()
1419                         ;;
1420                 esac
1421         fi
1422 }
1423
1424 _git_submodule ()
1425 {
1426         __git_has_doubledash && return
1427
1428         local subcommands="add status init update"
1429         if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1430                 local cur="${COMP_WORDS[COMP_CWORD]}"
1431                 case "$cur" in
1432                 --*)
1433                         __gitcomp "--quiet --cached"
1434                         ;;
1435                 *)
1436                         __gitcomp "$subcommands"
1437                         ;;
1438                 esac
1439                 return
1440         fi
1441 }
1442
1443 _git_svn ()
1444 {
1445         local subcommands="
1446                 init fetch clone rebase dcommit log find-rev
1447                 set-tree commit-diff info create-ignore propget
1448                 proplist show-ignore show-externals
1449                 "
1450         local subcommand="$(__git_find_subcommand "$subcommands")"
1451         if [ -z "$subcommand" ]; then
1452                 __gitcomp "$subcommands"
1453         else
1454                 local remote_opts="--username= --config-dir= --no-auth-cache"
1455                 local fc_opts="
1456                         --follow-parent --authors-file= --repack=
1457                         --no-metadata --use-svm-props --use-svnsync-props
1458                         --log-window-size= --no-checkout --quiet
1459                         --repack-flags --user-log-author $remote_opts
1460                         "
1461                 local init_opts="
1462                         --template= --shared= --trunk= --tags=
1463                         --branches= --stdlayout --minimize-url
1464                         --no-metadata --use-svm-props --use-svnsync-props
1465                         --rewrite-root= $remote_opts
1466                         "
1467                 local cmt_opts="
1468                         --edit --rmdir --find-copies-harder --copy-similarity=
1469                         "
1470
1471                 local cur="${COMP_WORDS[COMP_CWORD]}"
1472                 case "$subcommand,$cur" in
1473                 fetch,--*)
1474                         __gitcomp "--revision= --fetch-all $fc_opts"
1475                         ;;
1476                 clone,--*)
1477                         __gitcomp "--revision= $fc_opts $init_opts"
1478                         ;;
1479                 init,--*)
1480                         __gitcomp "$init_opts"
1481                         ;;
1482                 dcommit,--*)
1483                         __gitcomp "
1484                                 --merge --strategy= --verbose --dry-run
1485                                 --fetch-all --no-rebase $cmt_opts $fc_opts
1486                                 "
1487                         ;;
1488                 set-tree,--*)
1489                         __gitcomp "--stdin $cmt_opts $fc_opts"
1490                         ;;
1491                 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1492                 show-externals,--*)
1493                         __gitcomp "--revision="
1494                         ;;
1495                 log,--*)
1496                         __gitcomp "
1497                                 --limit= --revision= --verbose --incremental
1498                                 --oneline --show-commit --non-recursive
1499                                 --authors-file=
1500                                 "
1501                         ;;
1502                 rebase,--*)
1503                         __gitcomp "
1504                                 --merge --verbose --strategy= --local
1505                                 --fetch-all $fc_opts
1506                                 "
1507                         ;;
1508                 commit-diff,--*)
1509                         __gitcomp "--message= --file= --revision= $cmt_opts"
1510                         ;;
1511                 info,--*)
1512                         __gitcomp "--url"
1513                         ;;
1514                 *)
1515                         COMPREPLY=()
1516                         ;;
1517                 esac
1518         fi
1519 }
1520
1521 _git_tag ()
1522 {
1523         local i c=1 f=0
1524         while [ $c -lt $COMP_CWORD ]; do
1525                 i="${COMP_WORDS[c]}"
1526                 case "$i" in
1527                 -d|-v)
1528                         __gitcomp "$(__git_tags)"
1529                         return
1530                         ;;
1531                 -f)
1532                         f=1
1533                         ;;
1534                 esac
1535                 c=$((++c))
1536         done
1537
1538         case "${COMP_WORDS[COMP_CWORD-1]}" in
1539         -m|-F)
1540                 COMPREPLY=()
1541                 ;;
1542         -*|tag|git-tag)
1543                 if [ $f = 1 ]; then
1544                         __gitcomp "$(__git_tags)"
1545                 else
1546                         COMPREPLY=()
1547                 fi
1548                 ;;
1549         *)
1550                 __gitcomp "$(__git_refs)"
1551                 ;;
1552         esac
1553 }
1554
1555 _git ()
1556 {
1557         local i c=1 command __git_dir
1558
1559         while [ $c -lt $COMP_CWORD ]; do
1560                 i="${COMP_WORDS[c]}"
1561                 case "$i" in
1562                 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1563                 --bare)      __git_dir="." ;;
1564                 --version|-p|--paginate) ;;
1565                 --help) command="help"; break ;;
1566                 *) command="$i"; break ;;
1567                 esac
1568                 c=$((++c))
1569         done
1570
1571         if [ -z "$command" ]; then
1572                 case "${COMP_WORDS[COMP_CWORD]}" in
1573                 --*=*) COMPREPLY=() ;;
1574                 --*)   __gitcomp "
1575                         --paginate
1576                         --no-pager
1577                         --git-dir=
1578                         --bare
1579                         --version
1580                         --exec-path
1581                         --work-tree=
1582                         --help
1583                         "
1584                         ;;
1585                 *)     __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1586                 esac
1587                 return
1588         fi
1589
1590         local expansion=$(__git_aliased_command "$command")
1591         [ "$expansion" ] && command="$expansion"
1592
1593         case "$command" in
1594         am)          _git_am ;;
1595         add)         _git_add ;;
1596         apply)       _git_apply ;;
1597         archive)     _git_archive ;;
1598         bisect)      _git_bisect ;;
1599         bundle)      _git_bundle ;;
1600         branch)      _git_branch ;;
1601         checkout)    _git_checkout ;;
1602         cherry)      _git_cherry ;;
1603         cherry-pick) _git_cherry_pick ;;
1604         clean)       _git_clean ;;
1605         clone)       _git_clone ;;
1606         commit)      _git_commit ;;
1607         config)      _git_config ;;
1608         describe)    _git_describe ;;
1609         diff)        _git_diff ;;
1610         fetch)       _git_fetch ;;
1611         format-patch) _git_format_patch ;;
1612         gc)          _git_gc ;;
1613         grep)        _git_grep ;;
1614         help)        _git_help ;;
1615         init)        _git_init ;;
1616         log)         _git_log ;;
1617         ls-remote)   _git_ls_remote ;;
1618         ls-tree)     _git_ls_tree ;;
1619         merge)       _git_merge;;
1620         merge-base)  _git_merge_base ;;
1621         name-rev)    _git_name_rev ;;
1622         pull)        _git_pull ;;
1623         push)        _git_push ;;
1624         rebase)      _git_rebase ;;
1625         remote)      _git_remote ;;
1626         reset)       _git_reset ;;
1627         revert)      _git_revert ;;
1628         rm)          _git_rm ;;
1629         send-email)  _git_send_email ;;
1630         shortlog)    _git_shortlog ;;
1631         show)        _git_show ;;
1632         show-branch) _git_show_branch ;;
1633         stash)       _git_stash ;;
1634         submodule)   _git_submodule ;;
1635         svn)         _git_svn ;;
1636         tag)         _git_tag ;;
1637         whatchanged) _git_log ;;
1638         *)           COMPREPLY=() ;;
1639         esac
1640 }
1641
1642 _gitk ()
1643 {
1644         __git_has_doubledash && return
1645
1646         local cur="${COMP_WORDS[COMP_CWORD]}"
1647         local g="$(git rev-parse --git-dir 2>/dev/null)"
1648         local merge=""
1649         if [ -f $g/MERGE_HEAD ]; then
1650                 merge="--merge"
1651         fi
1652         case "$cur" in
1653         --*)
1654                 __gitcomp "--not --all $merge"
1655                 return
1656                 ;;
1657         esac
1658         __git_complete_revlist
1659 }
1660
1661 complete -o default -o nospace -F _git git
1662 complete -o default -o nospace -F _gitk gitk
1663
1664 # The following are necessary only for Cygwin, and only are needed
1665 # when the user has tab-completed the executable name and consequently
1666 # included the '.exe' suffix.
1667 #
1668 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1669 complete -o default -o nospace -F _git git.exe
1670 fi