]> asedeno.scripts.mit.edu Git - git.git/blob - contrib/completion/git-completion.bash
Merge branch 'maint-1.7.2' into maint
[git.git] / contrib / completion / git-completion.bash
1 #!bash
2 #
3 # bash completion support for core Git.
4 #
5 # Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
6 # Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
7 # Distributed under the GNU General Public License, version 2.0.
8 #
9 # The contained completion routines provide support for completing:
10 #
11 #    *) local and remote branch names
12 #    *) local and remote tag names
13 #    *) .git/remotes file names
14 #    *) git 'subcommands'
15 #    *) tree paths within 'ref:path/to/file' expressions
16 #    *) common --long-options
17 #
18 # To use these routines:
19 #
20 #    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
21 #    2) Added the following line to your .bashrc:
22 #        source ~/.git-completion.sh
23 #
24 #    3) Consider changing your PS1 to also show the current branch:
25 #        PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
26 #
27 #       The argument to __git_ps1 will be displayed only if you
28 #       are currently in a git repository.  The %s token will be
29 #       the name of the current branch.
30 #
31 #       In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
32 #       value, unstaged (*) and staged (+) changes will be shown next
33 #       to the branch name.  You can configure this per-repository
34 #       with the bash.showDirtyState variable, which defaults to true
35 #       once GIT_PS1_SHOWDIRTYSTATE is enabled.
36 #
37 #       You can also see if currently something is stashed, by setting
38 #       GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
39 #       then a '$' will be shown next to the branch name.
40 #
41 #       If you would like to see if there're untracked files, then you can
42 #       set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
43 #       untracked files, then a '%' will be shown next to the branch name.
44 #
45 #       If you would like to see the difference between HEAD and its
46 #       upstream, set GIT_PS1_SHOWUPSTREAM="auto".  A "<" indicates
47 #       you are behind, ">" indicates you are ahead, and "<>"
48 #       indicates you have diverged.  You can further control
49 #       behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated
50 #       list of values:
51 #           verbose       show number of commits ahead/behind (+/-) upstream
52 #           legacy        don't use the '--count' option available in recent
53 #                         versions of git-rev-list
54 #           git           always compare HEAD to @{upstream}
55 #           svn           always compare HEAD to your SVN upstream
56 #       By default, __git_ps1 will compare HEAD to your SVN upstream
57 #       if it can find one, or @{upstream} otherwise.  Once you have
58 #       set GIT_PS1_SHOWUPSTREAM, you can override it on a
59 #       per-repository basis by setting the bash.showUpstream config
60 #       variable.
61 #
62 #
63 # To submit patches:
64 #
65 #    *) Read Documentation/SubmittingPatches
66 #    *) Send all patches to the current maintainer:
67 #
68 #       "Shawn O. Pearce" <spearce@spearce.org>
69 #
70 #    *) Always CC the Git mailing list:
71 #
72 #       git@vger.kernel.org
73 #
74
75 case "$COMP_WORDBREAKS" in
76 *:*) : great ;;
77 *)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
78 esac
79
80 # __gitdir accepts 0 or 1 arguments (i.e., location)
81 # returns location of .git repo
82 __gitdir ()
83 {
84         if [ -z "${1-}" ]; then
85                 if [ -n "${__git_dir-}" ]; then
86                         echo "$__git_dir"
87                 elif [ -d .git ]; then
88                         echo .git
89                 else
90                         git rev-parse --git-dir 2>/dev/null
91                 fi
92         elif [ -d "$1/.git" ]; then
93                 echo "$1/.git"
94         else
95                 echo "$1"
96         fi
97 }
98
99 # stores the divergence from upstream in $p
100 # used by GIT_PS1_SHOWUPSTREAM
101 __git_ps1_show_upstream ()
102 {
103         local key value
104         local svn_remote=() svn_url_pattern count n
105         local upstream=git legacy="" verbose=""
106
107         # get some config options from git-config
108         while read key value; do
109                 case "$key" in
110                 bash.showupstream)
111                         GIT_PS1_SHOWUPSTREAM="$value"
112                         if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
113                                 p=""
114                                 return
115                         fi
116                         ;;
117                 svn-remote.*.url)
118                         svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
119                         svn_url_pattern+="\\|$value"
120                         upstream=svn+git # default upstream is SVN if available, else git
121                         ;;
122                 esac
123         done < <(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')
124
125         # parse configuration values
126         for option in ${GIT_PS1_SHOWUPSTREAM}; do
127                 case "$option" in
128                 git|svn) upstream="$option" ;;
129                 verbose) verbose=1 ;;
130                 legacy)  legacy=1  ;;
131                 esac
132         done
133
134         # Find our upstream
135         case "$upstream" in
136         git)    upstream="@{upstream}" ;;
137         svn*)
138                 # get the upstream from the "git-svn-id: ..." in a commit message
139                 # (git-svn uses essentially the same procedure internally)
140                 local svn_upstream=($(git log --first-parent -1 \
141                                         --grep="^git-svn-id: \(${svn_url_pattern:2}\)" 2>/dev/null))
142                 if [[ 0 -ne ${#svn_upstream[@]} ]]; then
143                         svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
144                         svn_upstream=${svn_upstream%@*}
145                         for ((n=1; "$n" <= "${#svn_remote[@]}"; ++n)); do
146                                 svn_upstream=${svn_upstream#${svn_remote[$n]}}
147                         done
148
149                         if [[ -z "$svn_upstream" ]]; then
150                                 # default branch name for checkouts with no layout:
151                                 upstream=${GIT_SVN_ID:-git-svn}
152                         else
153                                 upstream=${svn_upstream#/}
154                         fi
155                 elif [[ "svn+git" = "$upstream" ]]; then
156                         upstream="@{upstream}"
157                 fi
158                 ;;
159         esac
160
161         # Find how many commits we are ahead/behind our upstream
162         if [[ -z "$legacy" ]]; then
163                 count="$(git rev-list --count --left-right \
164                                 "$upstream"...HEAD 2>/dev/null)"
165         else
166                 # produce equivalent output to --count for older versions of git
167                 local commits
168                 if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
169                 then
170                         local commit behind=0 ahead=0
171                         for commit in $commits
172                         do
173                                 case "$commit" in
174                                 "<"*) let ++behind
175                                         ;;
176                                 *)    let ++ahead
177                                         ;;
178                                 esac
179                         done
180                         count="$behind  $ahead"
181                 else
182                         count=""
183                 fi
184         fi
185
186         # calculate the result
187         if [[ -z "$verbose" ]]; then
188                 case "$count" in
189                 "") # no upstream
190                         p="" ;;
191                 "0      0") # equal to upstream
192                         p="=" ;;
193                 "0      "*) # ahead of upstream
194                         p=">" ;;
195                 *"      0") # behind upstream
196                         p="<" ;;
197                 *)          # diverged from upstream
198                         p="<>" ;;
199                 esac
200         else
201                 case "$count" in
202                 "") # no upstream
203                         p="" ;;
204                 "0      0") # equal to upstream
205                         p=" u=" ;;
206                 "0      "*) # ahead of upstream
207                         p=" u+${count#0 }" ;;
208                 *"      0") # behind upstream
209                         p=" u-${count%  0}" ;;
210                 *)          # diverged from upstream
211                         p=" u+${count#* }-${count%      *}" ;;
212                 esac
213         fi
214
215 }
216
217
218 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
219 # returns text to add to bash PS1 prompt (includes branch name)
220 __git_ps1 ()
221 {
222         local g="$(__gitdir)"
223         if [ -n "$g" ]; then
224                 local r=""
225                 local b=""
226                 if [ -f "$g/rebase-merge/interactive" ]; then
227                         r="|REBASE-i"
228                         b="$(cat "$g/rebase-merge/head-name")"
229                 elif [ -d "$g/rebase-merge" ]; then
230                         r="|REBASE-m"
231                         b="$(cat "$g/rebase-merge/head-name")"
232                 else
233                         if [ -d "$g/rebase-apply" ]; then
234                                 if [ -f "$g/rebase-apply/rebasing" ]; then
235                                         r="|REBASE"
236                                 elif [ -f "$g/rebase-apply/applying" ]; then
237                                         r="|AM"
238                                 else
239                                         r="|AM/REBASE"
240                                 fi
241                         elif [ -f "$g/MERGE_HEAD" ]; then
242                                 r="|MERGING"
243                         elif [ -f "$g/BISECT_LOG" ]; then
244                                 r="|BISECTING"
245                         fi
246
247                         b="$(git symbolic-ref HEAD 2>/dev/null)" || {
248
249                                 b="$(
250                                 case "${GIT_PS1_DESCRIBE_STYLE-}" in
251                                 (contains)
252                                         git describe --contains HEAD ;;
253                                 (branch)
254                                         git describe --contains --all HEAD ;;
255                                 (describe)
256                                         git describe HEAD ;;
257                                 (* | default)
258                                         git describe --tags --exact-match HEAD ;;
259                                 esac 2>/dev/null)" ||
260
261                                 b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
262                                 b="unknown"
263                                 b="($b)"
264                         }
265                 fi
266
267                 local w=""
268                 local i=""
269                 local s=""
270                 local u=""
271                 local c=""
272                 local p=""
273
274                 if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
275                         if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
276                                 c="BARE:"
277                         else
278                                 b="GIT_DIR!"
279                         fi
280                 elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
281                         if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
282                                 if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
283                                         git diff --no-ext-diff --quiet --exit-code || w="*"
284                                         if git rev-parse --quiet --verify HEAD >/dev/null; then
285                                                 git diff-index --cached --quiet HEAD -- || i="+"
286                                         else
287                                                 i="#"
288                                         fi
289                                 fi
290                         fi
291                         if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
292                                 git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
293                         fi
294
295                         if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
296                            if [ -n "$(git ls-files --others --exclude-standard)" ]; then
297                               u="%"
298                            fi
299                         fi
300
301                         if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
302                                 __git_ps1_show_upstream
303                         fi
304                 fi
305
306                 local f="$w$i$s$u"
307                 printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p"
308         fi
309 }
310
311 # __gitcomp_1 requires 2 arguments
312 __gitcomp_1 ()
313 {
314         local c IFS=' '$'\t'$'\n'
315         for c in $1; do
316                 case "$c$2" in
317                 --*=*) printf %s$'\n' "$c$2" ;;
318                 *.)    printf %s$'\n' "$c$2" ;;
319                 *)     printf %s$'\n' "$c$2 " ;;
320                 esac
321         done
322 }
323
324 # __gitcomp accepts 1, 2, 3, or 4 arguments
325 # generates completion reply with compgen
326 __gitcomp ()
327 {
328         local cur="${COMP_WORDS[COMP_CWORD]}"
329         if [ $# -gt 2 ]; then
330                 cur="$3"
331         fi
332         case "$cur" in
333         --*=)
334                 COMPREPLY=()
335                 ;;
336         *)
337                 local IFS=$'\n'
338                 COMPREPLY=($(compgen -P "${2-}" \
339                         -W "$(__gitcomp_1 "${1-}" "${4-}")" \
340                         -- "$cur"))
341                 ;;
342         esac
343 }
344
345 # __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
346 __git_heads ()
347 {
348         local cmd i is_hash=y dir="$(__gitdir "${1-}")"
349         if [ -d "$dir" ]; then
350                 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
351                         refs/heads
352                 return
353         fi
354         for i in $(git ls-remote "${1-}" 2>/dev/null); do
355                 case "$is_hash,$i" in
356                 y,*) is_hash=n ;;
357                 n,*^{}) is_hash=y ;;
358                 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
359                 n,*) is_hash=y; echo "$i" ;;
360                 esac
361         done
362 }
363
364 # __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
365 __git_tags ()
366 {
367         local cmd i is_hash=y dir="$(__gitdir "${1-}")"
368         if [ -d "$dir" ]; then
369                 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
370                         refs/tags
371                 return
372         fi
373         for i in $(git ls-remote "${1-}" 2>/dev/null); do
374                 case "$is_hash,$i" in
375                 y,*) is_hash=n ;;
376                 n,*^{}) is_hash=y ;;
377                 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
378                 n,*) is_hash=y; echo "$i" ;;
379                 esac
380         done
381 }
382
383 # __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
384 __git_refs ()
385 {
386         local i is_hash=y dir="$(__gitdir "${1-}")"
387         local cur="${COMP_WORDS[COMP_CWORD]}" format refs
388         if [ -d "$dir" ]; then
389                 case "$cur" in
390                 refs|refs/*)
391                         format="refname"
392                         refs="${cur%/*}"
393                         ;;
394                 *)
395                         for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
396                                 if [ -e "$dir/$i" ]; then echo $i; fi
397                         done
398                         format="refname:short"
399                         refs="refs/tags refs/heads refs/remotes"
400                         ;;
401                 esac
402                 git --git-dir="$dir" for-each-ref --format="%($format)" \
403                         $refs
404                 return
405         fi
406         for i in $(git ls-remote "$dir" 2>/dev/null); do
407                 case "$is_hash,$i" in
408                 y,*) is_hash=n ;;
409                 n,*^{}) is_hash=y ;;
410                 n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
411                 n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
412                 n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
413                 n,*) is_hash=y; echo "$i" ;;
414                 esac
415         done
416 }
417
418 # __git_refs2 requires 1 argument (to pass to __git_refs)
419 __git_refs2 ()
420 {
421         local i
422         for i in $(__git_refs "$1"); do
423                 echo "$i:$i"
424         done
425 }
426
427 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
428 __git_refs_remotes ()
429 {
430         local cmd i is_hash=y
431         for i in $(git ls-remote "$1" 2>/dev/null); do
432                 case "$is_hash,$i" in
433                 n,refs/heads/*)
434                         is_hash=y
435                         echo "$i:refs/remotes/$1/${i#refs/heads/}"
436                         ;;
437                 y,*) is_hash=n ;;
438                 n,*^{}) is_hash=y ;;
439                 n,refs/tags/*) is_hash=y;;
440                 n,*) is_hash=y; ;;
441                 esac
442         done
443 }
444
445 __git_remotes ()
446 {
447         local i ngoff IFS=$'\n' d="$(__gitdir)"
448         shopt -q nullglob || ngoff=1
449         shopt -s nullglob
450         for i in "$d/remotes"/*; do
451                 echo ${i#$d/remotes/}
452         done
453         [ "$ngoff" ] && shopt -u nullglob
454         for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
455                 i="${i#remote.}"
456                 echo "${i/.url*/}"
457         done
458 }
459
460 __git_list_merge_strategies ()
461 {
462         git merge -s help 2>&1 |
463         sed -n -e '/[Aa]vailable strategies are: /,/^$/{
464                 s/\.$//
465                 s/.*://
466                 s/^[    ]*//
467                 s/[     ]*$//
468                 p
469         }'
470 }
471
472 __git_merge_strategies=
473 # 'git merge -s help' (and thus detection of the merge strategy
474 # list) fails, unfortunately, if run outside of any git working
475 # tree.  __git_merge_strategies is set to the empty string in
476 # that case, and the detection will be repeated the next time it
477 # is needed.
478 __git_compute_merge_strategies ()
479 {
480         : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
481 }
482
483 __git_complete_file ()
484 {
485         local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
486         case "$cur" in
487         ?*:*)
488                 ref="${cur%%:*}"
489                 cur="${cur#*:}"
490                 case "$cur" in
491                 ?*/*)
492                         pfx="${cur%/*}"
493                         cur="${cur##*/}"
494                         ls="$ref:$pfx"
495                         pfx="$pfx/"
496                         ;;
497                 *)
498                         ls="$ref"
499                         ;;
500             esac
501
502                 case "$COMP_WORDBREAKS" in
503                 *:*) : great ;;
504                 *)   pfx="$ref:$pfx" ;;
505                 esac
506
507                 local IFS=$'\n'
508                 COMPREPLY=($(compgen -P "$pfx" \
509                         -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
510                                 | sed '/^100... blob /{
511                                            s,^.*        ,,
512                                            s,$, ,
513                                        }
514                                        /^120000 blob /{
515                                            s,^.*        ,,
516                                            s,$, ,
517                                        }
518                                        /^040000 tree /{
519                                            s,^.*        ,,
520                                            s,$,/,
521                                        }
522                                        s/^.*    //')" \
523                         -- "$cur"))
524                 ;;
525         *)
526                 __gitcomp "$(__git_refs)"
527                 ;;
528         esac
529 }
530
531 __git_complete_revlist ()
532 {
533         local pfx cur="${COMP_WORDS[COMP_CWORD]}"
534         case "$cur" in
535         *...*)
536                 pfx="${cur%...*}..."
537                 cur="${cur#*...}"
538                 __gitcomp "$(__git_refs)" "$pfx" "$cur"
539                 ;;
540         *..*)
541                 pfx="${cur%..*}.."
542                 cur="${cur#*..}"
543                 __gitcomp "$(__git_refs)" "$pfx" "$cur"
544                 ;;
545         *)
546                 __gitcomp "$(__git_refs)"
547                 ;;
548         esac
549 }
550
551 __git_complete_remote_or_refspec ()
552 {
553         local cmd="${COMP_WORDS[1]}"
554         local cur="${COMP_WORDS[COMP_CWORD]}"
555         local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
556         while [ $c -lt $COMP_CWORD ]; do
557                 i="${COMP_WORDS[c]}"
558                 case "$i" in
559                 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
560                 --all)
561                         case "$cmd" in
562                         push) no_complete_refspec=1 ;;
563                         fetch)
564                                 COMPREPLY=()
565                                 return
566                                 ;;
567                         *) ;;
568                         esac
569                         ;;
570                 -*) ;;
571                 *) remote="$i"; break ;;
572                 esac
573                 c=$((++c))
574         done
575         if [ -z "$remote" ]; then
576                 __gitcomp "$(__git_remotes)"
577                 return
578         fi
579         if [ $no_complete_refspec = 1 ]; then
580                 COMPREPLY=()
581                 return
582         fi
583         [ "$remote" = "." ] && remote=
584         case "$cur" in
585         *:*)
586                 case "$COMP_WORDBREAKS" in
587                 *:*) : great ;;
588                 *)   pfx="${cur%%:*}:" ;;
589                 esac
590                 cur="${cur#*:}"
591                 lhs=0
592                 ;;
593         +*)
594                 pfx="+"
595                 cur="${cur#+}"
596                 ;;
597         esac
598         case "$cmd" in
599         fetch)
600                 if [ $lhs = 1 ]; then
601                         __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur"
602                 else
603                         __gitcomp "$(__git_refs)" "$pfx" "$cur"
604                 fi
605                 ;;
606         pull)
607                 if [ $lhs = 1 ]; then
608                         __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
609                 else
610                         __gitcomp "$(__git_refs)" "$pfx" "$cur"
611                 fi
612                 ;;
613         push)
614                 if [ $lhs = 1 ]; then
615                         __gitcomp "$(__git_refs)" "$pfx" "$cur"
616                 else
617                         __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
618                 fi
619                 ;;
620         esac
621 }
622
623 __git_complete_strategy ()
624 {
625         __git_compute_merge_strategies
626         case "${COMP_WORDS[COMP_CWORD-1]}" in
627         -s|--strategy)
628                 __gitcomp "$__git_merge_strategies"
629                 return 0
630         esac
631         local cur="${COMP_WORDS[COMP_CWORD]}"
632         case "$cur" in
633         --strategy=*)
634                 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
635                 return 0
636                 ;;
637         esac
638         return 1
639 }
640
641 __git_list_all_commands ()
642 {
643         local i IFS=" "$'\n'
644         for i in $(git help -a|egrep '^  [a-zA-Z0-9]')
645         do
646                 case $i in
647                 *--*)             : helper pattern;;
648                 *) echo $i;;
649                 esac
650         done
651 }
652
653 __git_all_commands=
654 __git_compute_all_commands ()
655 {
656         : ${__git_all_commands:=$(__git_list_all_commands)}
657 }
658
659 __git_list_porcelain_commands ()
660 {
661         local i IFS=" "$'\n'
662         __git_compute_all_commands
663         for i in "help" $__git_all_commands
664         do
665                 case $i in
666                 *--*)             : helper pattern;;
667                 applymbox)        : ask gittus;;
668                 applypatch)       : ask gittus;;
669                 archimport)       : import;;
670                 cat-file)         : plumbing;;
671                 check-attr)       : plumbing;;
672                 check-ref-format) : plumbing;;
673                 checkout-index)   : plumbing;;
674                 commit-tree)      : plumbing;;
675                 count-objects)    : infrequent;;
676                 cvsexportcommit)  : export;;
677                 cvsimport)        : import;;
678                 cvsserver)        : daemon;;
679                 daemon)           : daemon;;
680                 diff-files)       : plumbing;;
681                 diff-index)       : plumbing;;
682                 diff-tree)        : plumbing;;
683                 fast-import)      : import;;
684                 fast-export)      : export;;
685                 fsck-objects)     : plumbing;;
686                 fetch-pack)       : plumbing;;
687                 fmt-merge-msg)    : plumbing;;
688                 for-each-ref)     : plumbing;;
689                 hash-object)      : plumbing;;
690                 http-*)           : transport;;
691                 index-pack)       : plumbing;;
692                 init-db)          : deprecated;;
693                 local-fetch)      : plumbing;;
694                 lost-found)       : infrequent;;
695                 ls-files)         : plumbing;;
696                 ls-remote)        : plumbing;;
697                 ls-tree)          : plumbing;;
698                 mailinfo)         : plumbing;;
699                 mailsplit)        : plumbing;;
700                 merge-*)          : plumbing;;
701                 mktree)           : plumbing;;
702                 mktag)            : plumbing;;
703                 pack-objects)     : plumbing;;
704                 pack-redundant)   : plumbing;;
705                 pack-refs)        : plumbing;;
706                 parse-remote)     : plumbing;;
707                 patch-id)         : plumbing;;
708                 peek-remote)      : plumbing;;
709                 prune)            : plumbing;;
710                 prune-packed)     : plumbing;;
711                 quiltimport)      : import;;
712                 read-tree)        : plumbing;;
713                 receive-pack)     : plumbing;;
714                 reflog)           : plumbing;;
715                 remote-*)         : transport;;
716                 repo-config)      : deprecated;;
717                 rerere)           : plumbing;;
718                 rev-list)         : plumbing;;
719                 rev-parse)        : plumbing;;
720                 runstatus)        : plumbing;;
721                 sh-setup)         : internal;;
722                 shell)            : daemon;;
723                 show-ref)         : plumbing;;
724                 send-pack)        : plumbing;;
725                 show-index)       : plumbing;;
726                 ssh-*)            : transport;;
727                 stripspace)       : plumbing;;
728                 symbolic-ref)     : plumbing;;
729                 tar-tree)         : deprecated;;
730                 unpack-file)      : plumbing;;
731                 unpack-objects)   : plumbing;;
732                 update-index)     : plumbing;;
733                 update-ref)       : plumbing;;
734                 update-server-info) : daemon;;
735                 upload-archive)   : plumbing;;
736                 upload-pack)      : plumbing;;
737                 write-tree)       : plumbing;;
738                 var)              : infrequent;;
739                 verify-pack)      : infrequent;;
740                 verify-tag)       : plumbing;;
741                 *) echo $i;;
742                 esac
743         done
744 }
745
746 __git_porcelain_commands=
747 __git_compute_porcelain_commands ()
748 {
749         __git_compute_all_commands
750         : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
751 }
752
753 __git_aliases ()
754 {
755         local i IFS=$'\n'
756         for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
757                 case "$i" in
758                 alias.*)
759                         i="${i#alias.}"
760                         echo "${i/ */}"
761                         ;;
762                 esac
763         done
764 }
765
766 # __git_aliased_command requires 1 argument
767 __git_aliased_command ()
768 {
769         local word cmdline=$(git --git-dir="$(__gitdir)" \
770                 config --get "alias.$1")
771         for word in $cmdline; do
772                 case "$word" in
773                 \!gitk|gitk)
774                         echo "gitk"
775                         return
776                         ;;
777                 \!*)    : shell command alias ;;
778                 -*)     : option ;;
779                 *=*)    : setting env ;;
780                 git)    : git itself ;;
781                 *)
782                         echo "$word"
783                         return
784                 esac
785         done
786 }
787
788 # __git_find_on_cmdline requires 1 argument
789 __git_find_on_cmdline ()
790 {
791         local word subcommand c=1
792
793         while [ $c -lt $COMP_CWORD ]; do
794                 word="${COMP_WORDS[c]}"
795                 for subcommand in $1; do
796                         if [ "$subcommand" = "$word" ]; then
797                                 echo "$subcommand"
798                                 return
799                         fi
800                 done
801                 c=$((++c))
802         done
803 }
804
805 __git_has_doubledash ()
806 {
807         local c=1
808         while [ $c -lt $COMP_CWORD ]; do
809                 if [ "--" = "${COMP_WORDS[c]}" ]; then
810                         return 0
811                 fi
812                 c=$((++c))
813         done
814         return 1
815 }
816
817 __git_whitespacelist="nowarn warn error error-all fix"
818
819 _git_am ()
820 {
821         local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
822         if [ -d "$dir"/rebase-apply ]; then
823                 __gitcomp "--skip --continue --resolved --abort"
824                 return
825         fi
826         case "$cur" in
827         --whitespace=*)
828                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
829                 return
830                 ;;
831         --*)
832                 __gitcomp "
833                         --3way --committer-date-is-author-date --ignore-date
834                         --ignore-whitespace --ignore-space-change
835                         --interactive --keep --no-utf8 --signoff --utf8
836                         --whitespace= --scissors
837                         "
838                 return
839         esac
840         COMPREPLY=()
841 }
842
843 _git_apply ()
844 {
845         local cur="${COMP_WORDS[COMP_CWORD]}"
846         case "$cur" in
847         --whitespace=*)
848                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
849                 return
850                 ;;
851         --*)
852                 __gitcomp "
853                         --stat --numstat --summary --check --index
854                         --cached --index-info --reverse --reject --unidiff-zero
855                         --apply --no-add --exclude=
856                         --ignore-whitespace --ignore-space-change
857                         --whitespace= --inaccurate-eof --verbose
858                         "
859                 return
860         esac
861         COMPREPLY=()
862 }
863
864 _git_add ()
865 {
866         __git_has_doubledash && return
867
868         local cur="${COMP_WORDS[COMP_CWORD]}"
869         case "$cur" in
870         --*)
871                 __gitcomp "
872                         --interactive --refresh --patch --update --dry-run
873                         --ignore-errors --intent-to-add
874                         "
875                 return
876         esac
877         COMPREPLY=()
878 }
879
880 _git_archive ()
881 {
882         local cur="${COMP_WORDS[COMP_CWORD]}"
883         case "$cur" in
884         --format=*)
885                 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
886                 return
887                 ;;
888         --remote=*)
889                 __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
890                 return
891                 ;;
892         --*)
893                 __gitcomp "
894                         --format= --list --verbose
895                         --prefix= --remote= --exec=
896                         "
897                 return
898                 ;;
899         esac
900         __git_complete_file
901 }
902
903 _git_bisect ()
904 {
905         __git_has_doubledash && return
906
907         local subcommands="start bad good skip reset visualize replay log run"
908         local subcommand="$(__git_find_on_cmdline "$subcommands")"
909         if [ -z "$subcommand" ]; then
910                 __gitcomp "$subcommands"
911                 return
912         fi
913
914         case "$subcommand" in
915         bad|good|reset|skip)
916                 __gitcomp "$(__git_refs)"
917                 ;;
918         *)
919                 COMPREPLY=()
920                 ;;
921         esac
922 }
923
924 _git_branch ()
925 {
926         local i c=1 only_local_ref="n" has_r="n"
927
928         while [ $c -lt $COMP_CWORD ]; do
929                 i="${COMP_WORDS[c]}"
930                 case "$i" in
931                 -d|-m)  only_local_ref="y" ;;
932                 -r)     has_r="y" ;;
933                 esac
934                 c=$((++c))
935         done
936
937         case "${COMP_WORDS[COMP_CWORD]}" in
938         --*)
939                 __gitcomp "
940                         --color --no-color --verbose --abbrev= --no-abbrev
941                         --track --no-track --contains --merged --no-merged
942                         --set-upstream
943                         "
944                 ;;
945         *)
946                 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
947                         __gitcomp "$(__git_heads)"
948                 else
949                         __gitcomp "$(__git_refs)"
950                 fi
951                 ;;
952         esac
953 }
954
955 _git_bundle ()
956 {
957         local cmd="${COMP_WORDS[2]}"
958         case "$COMP_CWORD" in
959         2)
960                 __gitcomp "create list-heads verify unbundle"
961                 ;;
962         3)
963                 # looking for a file
964                 ;;
965         *)
966                 case "$cmd" in
967                         create)
968                                 __git_complete_revlist
969                         ;;
970                 esac
971                 ;;
972         esac
973 }
974
975 _git_checkout ()
976 {
977         __git_has_doubledash && return
978
979         local cur="${COMP_WORDS[COMP_CWORD]}"
980         case "$cur" in
981         --conflict=*)
982                 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
983                 ;;
984         --*)
985                 __gitcomp "
986                         --quiet --ours --theirs --track --no-track --merge
987                         --conflict= --orphan --patch
988                         "
989                 ;;
990         *)
991                 __gitcomp "$(__git_refs)"
992                 ;;
993         esac
994 }
995
996 _git_cherry ()
997 {
998         __gitcomp "$(__git_refs)"
999 }
1000
1001 _git_cherry_pick ()
1002 {
1003         local cur="${COMP_WORDS[COMP_CWORD]}"
1004         case "$cur" in
1005         --*)
1006                 __gitcomp "--edit --no-commit"
1007                 ;;
1008         *)
1009                 __gitcomp "$(__git_refs)"
1010                 ;;
1011         esac
1012 }
1013
1014 _git_clean ()
1015 {
1016         __git_has_doubledash && return
1017
1018         local cur="${COMP_WORDS[COMP_CWORD]}"
1019         case "$cur" in
1020         --*)
1021                 __gitcomp "--dry-run --quiet"
1022                 return
1023                 ;;
1024         esac
1025         COMPREPLY=()
1026 }
1027
1028 _git_clone ()
1029 {
1030         local cur="${COMP_WORDS[COMP_CWORD]}"
1031         case "$cur" in
1032         --*)
1033                 __gitcomp "
1034                         --local
1035                         --no-hardlinks
1036                         --shared
1037                         --reference
1038                         --quiet
1039                         --no-checkout
1040                         --bare
1041                         --mirror
1042                         --origin
1043                         --upload-pack
1044                         --template=
1045                         --depth
1046                         "
1047                 return
1048                 ;;
1049         esac
1050         COMPREPLY=()
1051 }
1052
1053 _git_commit ()
1054 {
1055         __git_has_doubledash && return
1056
1057         local cur="${COMP_WORDS[COMP_CWORD]}"
1058         case "$cur" in
1059         --cleanup=*)
1060                 __gitcomp "default strip verbatim whitespace
1061                         " "" "${cur##--cleanup=}"
1062                 return
1063                 ;;
1064         --reuse-message=*)
1065                 __gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}"
1066                 return
1067                 ;;
1068         --reedit-message=*)
1069                 __gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}"
1070                 return
1071                 ;;
1072         --untracked-files=*)
1073                 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1074                 return
1075                 ;;
1076         --*)
1077                 __gitcomp "
1078                         --all --author= --signoff --verify --no-verify
1079                         --edit --amend --include --only --interactive
1080                         --dry-run --reuse-message= --reedit-message=
1081                         --reset-author --file= --message= --template=
1082                         --cleanup= --untracked-files --untracked-files=
1083                         --verbose --quiet
1084                         "
1085                 return
1086         esac
1087         COMPREPLY=()
1088 }
1089
1090 _git_describe ()
1091 {
1092         local cur="${COMP_WORDS[COMP_CWORD]}"
1093         case "$cur" in
1094         --*)
1095                 __gitcomp "
1096                         --all --tags --contains --abbrev= --candidates=
1097                         --exact-match --debug --long --match --always
1098                         "
1099                 return
1100         esac
1101         __gitcomp "$(__git_refs)"
1102 }
1103
1104 __git_diff_common_options="--stat --numstat --shortstat --summary
1105                         --patch-with-stat --name-only --name-status --color
1106                         --no-color --color-words --no-renames --check
1107                         --full-index --binary --abbrev --diff-filter=
1108                         --find-copies-harder
1109                         --text --ignore-space-at-eol --ignore-space-change
1110                         --ignore-all-space --exit-code --quiet --ext-diff
1111                         --no-ext-diff
1112                         --no-prefix --src-prefix= --dst-prefix=
1113                         --inter-hunk-context=
1114                         --patience
1115                         --raw
1116                         --dirstat --dirstat= --dirstat-by-file
1117                         --dirstat-by-file= --cumulative
1118 "
1119
1120 _git_diff ()
1121 {
1122         __git_has_doubledash && return
1123
1124         local cur="${COMP_WORDS[COMP_CWORD]}"
1125         case "$cur" in
1126         --*)
1127                 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1128                         --base --ours --theirs --no-index
1129                         $__git_diff_common_options
1130                         "
1131                 return
1132                 ;;
1133         esac
1134         __git_complete_file
1135 }
1136
1137 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1138                         tkdiff vimdiff gvimdiff xxdiff araxis p4merge
1139 "
1140
1141 _git_difftool ()
1142 {
1143         __git_has_doubledash && return
1144
1145         local cur="${COMP_WORDS[COMP_CWORD]}"
1146         case "$cur" in
1147         --tool=*)
1148                 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1149                 return
1150                 ;;
1151         --*)
1152                 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1153                         --base --ours --theirs
1154                         --no-renames --diff-filter= --find-copies-harder
1155                         --relative --ignore-submodules
1156                         --tool="
1157                 return
1158                 ;;
1159         esac
1160         __git_complete_file
1161 }
1162
1163 __git_fetch_options="
1164         --quiet --verbose --append --upload-pack --force --keep --depth=
1165         --tags --no-tags --all --prune --dry-run
1166 "
1167
1168 _git_fetch ()
1169 {
1170         local cur="${COMP_WORDS[COMP_CWORD]}"
1171         case "$cur" in
1172         --*)
1173                 __gitcomp "$__git_fetch_options"
1174                 return
1175                 ;;
1176         esac
1177         __git_complete_remote_or_refspec
1178 }
1179
1180 _git_format_patch ()
1181 {
1182         local cur="${COMP_WORDS[COMP_CWORD]}"
1183         case "$cur" in
1184         --thread=*)
1185                 __gitcomp "
1186                         deep shallow
1187                         " "" "${cur##--thread=}"
1188                 return
1189                 ;;
1190         --*)
1191                 __gitcomp "
1192                         --stdout --attach --no-attach --thread --thread=
1193                         --output-directory
1194                         --numbered --start-number
1195                         --numbered-files
1196                         --keep-subject
1197                         --signoff --signature --no-signature
1198                         --in-reply-to= --cc=
1199                         --full-index --binary
1200                         --not --all
1201                         --cover-letter
1202                         --no-prefix --src-prefix= --dst-prefix=
1203                         --inline --suffix= --ignore-if-in-upstream
1204                         --subject-prefix=
1205                         "
1206                 return
1207                 ;;
1208         esac
1209         __git_complete_revlist
1210 }
1211
1212 _git_fsck ()
1213 {
1214         local cur="${COMP_WORDS[COMP_CWORD]}"
1215         case "$cur" in
1216         --*)
1217                 __gitcomp "
1218                         --tags --root --unreachable --cache --no-reflogs --full
1219                         --strict --verbose --lost-found
1220                         "
1221                 return
1222                 ;;
1223         esac
1224         COMPREPLY=()
1225 }
1226
1227 _git_gc ()
1228 {
1229         local cur="${COMP_WORDS[COMP_CWORD]}"
1230         case "$cur" in
1231         --*)
1232                 __gitcomp "--prune --aggressive"
1233                 return
1234                 ;;
1235         esac
1236         COMPREPLY=()
1237 }
1238
1239 _git_gitk ()
1240 {
1241         _gitk
1242 }
1243
1244 _git_grep ()
1245 {
1246         __git_has_doubledash && return
1247
1248         local cur="${COMP_WORDS[COMP_CWORD]}"
1249         case "$cur" in
1250         --*)
1251                 __gitcomp "
1252                         --cached
1253                         --text --ignore-case --word-regexp --invert-match
1254                         --full-name
1255                         --extended-regexp --basic-regexp --fixed-strings
1256                         --files-with-matches --name-only
1257                         --files-without-match
1258                         --max-depth
1259                         --count
1260                         --and --or --not --all-match
1261                         "
1262                 return
1263                 ;;
1264         esac
1265
1266         __gitcomp "$(__git_refs)"
1267 }
1268
1269 _git_help ()
1270 {
1271         local cur="${COMP_WORDS[COMP_CWORD]}"
1272         case "$cur" in
1273         --*)
1274                 __gitcomp "--all --info --man --web"
1275                 return
1276                 ;;
1277         esac
1278         __git_compute_all_commands
1279         __gitcomp "$__git_all_commands
1280                 attributes cli core-tutorial cvs-migration
1281                 diffcore gitk glossary hooks ignore modules
1282                 repository-layout tutorial tutorial-2
1283                 workflows
1284                 "
1285 }
1286
1287 _git_init ()
1288 {
1289         local cur="${COMP_WORDS[COMP_CWORD]}"
1290         case "$cur" in
1291         --shared=*)
1292                 __gitcomp "
1293                         false true umask group all world everybody
1294                         " "" "${cur##--shared=}"
1295                 return
1296                 ;;
1297         --*)
1298                 __gitcomp "--quiet --bare --template= --shared --shared="
1299                 return
1300                 ;;
1301         esac
1302         COMPREPLY=()
1303 }
1304
1305 _git_ls_files ()
1306 {
1307         __git_has_doubledash && return
1308
1309         local cur="${COMP_WORDS[COMP_CWORD]}"
1310         case "$cur" in
1311         --*)
1312                 __gitcomp "--cached --deleted --modified --others --ignored
1313                         --stage --directory --no-empty-directory --unmerged
1314                         --killed --exclude= --exclude-from=
1315                         --exclude-per-directory= --exclude-standard
1316                         --error-unmatch --with-tree= --full-name
1317                         --abbrev --ignored --exclude-per-directory
1318                         "
1319                 return
1320                 ;;
1321         esac
1322         COMPREPLY=()
1323 }
1324
1325 _git_ls_remote ()
1326 {
1327         __gitcomp "$(__git_remotes)"
1328 }
1329
1330 _git_ls_tree ()
1331 {
1332         __git_complete_file
1333 }
1334
1335 # Options that go well for log, shortlog and gitk
1336 __git_log_common_options="
1337         --not --all
1338         --branches --tags --remotes
1339         --first-parent --merges --no-merges
1340         --max-count=
1341         --max-age= --since= --after=
1342         --min-age= --until= --before=
1343 "
1344 # Options that go well for log and gitk (not shortlog)
1345 __git_log_gitk_options="
1346         --dense --sparse --full-history
1347         --simplify-merges --simplify-by-decoration
1348         --left-right
1349 "
1350 # Options that go well for log and shortlog (not gitk)
1351 __git_log_shortlog_options="
1352         --author= --committer= --grep=
1353         --all-match
1354 "
1355
1356 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1357 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1358
1359 _git_log ()
1360 {
1361         __git_has_doubledash && return
1362
1363         local cur="${COMP_WORDS[COMP_CWORD]}"
1364         local g="$(git rev-parse --git-dir 2>/dev/null)"
1365         local merge=""
1366         if [ -f "$g/MERGE_HEAD" ]; then
1367                 merge="--merge"
1368         fi
1369         case "$cur" in
1370         --pretty=*)
1371                 __gitcomp "$__git_log_pretty_formats
1372                         " "" "${cur##--pretty=}"
1373                 return
1374                 ;;
1375         --format=*)
1376                 __gitcomp "$__git_log_pretty_formats
1377                         " "" "${cur##--format=}"
1378                 return
1379                 ;;
1380         --date=*)
1381                 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1382                 return
1383                 ;;
1384         --decorate=*)
1385                 __gitcomp "long short" "" "${cur##--decorate=}"
1386                 return
1387                 ;;
1388         --*)
1389                 __gitcomp "
1390                         $__git_log_common_options
1391                         $__git_log_shortlog_options
1392                         $__git_log_gitk_options
1393                         --root --topo-order --date-order --reverse
1394                         --follow --full-diff
1395                         --abbrev-commit --abbrev=
1396                         --relative-date --date=
1397                         --pretty= --format= --oneline
1398                         --cherry-pick
1399                         --graph
1400                         --decorate --decorate=
1401                         --walk-reflogs
1402                         --parents --children
1403                         $merge
1404                         $__git_diff_common_options
1405                         --pickaxe-all --pickaxe-regex
1406                         "
1407                 return
1408                 ;;
1409         esac
1410         __git_complete_revlist
1411 }
1412
1413 __git_merge_options="
1414         --no-commit --no-stat --log --no-log --squash --strategy
1415         --commit --stat --no-squash --ff --no-ff --ff-only
1416 "
1417
1418 _git_merge ()
1419 {
1420         __git_complete_strategy && return
1421
1422         local cur="${COMP_WORDS[COMP_CWORD]}"
1423         case "$cur" in
1424         --*)
1425                 __gitcomp "$__git_merge_options"
1426                 return
1427         esac
1428         __gitcomp "$(__git_refs)"
1429 }
1430
1431 _git_mergetool ()
1432 {
1433         local cur="${COMP_WORDS[COMP_CWORD]}"
1434         case "$cur" in
1435         --tool=*)
1436                 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1437                 return
1438                 ;;
1439         --*)
1440                 __gitcomp "--tool="
1441                 return
1442                 ;;
1443         esac
1444         COMPREPLY=()
1445 }
1446
1447 _git_merge_base ()
1448 {
1449         __gitcomp "$(__git_refs)"
1450 }
1451
1452 _git_mv ()
1453 {
1454         local cur="${COMP_WORDS[COMP_CWORD]}"
1455         case "$cur" in
1456         --*)
1457                 __gitcomp "--dry-run"
1458                 return
1459                 ;;
1460         esac
1461         COMPREPLY=()
1462 }
1463
1464 _git_name_rev ()
1465 {
1466         __gitcomp "--tags --all --stdin"
1467 }
1468
1469 _git_notes ()
1470 {
1471         local subcommands="edit show"
1472         if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1473                 __gitcomp "$subcommands"
1474                 return
1475         fi
1476
1477         case "${COMP_WORDS[COMP_CWORD-1]}" in
1478         -m|-F)
1479                 COMPREPLY=()
1480                 ;;
1481         *)
1482                 __gitcomp "$(__git_refs)"
1483                 ;;
1484         esac
1485 }
1486
1487 _git_pull ()
1488 {
1489         __git_complete_strategy && return
1490
1491         local cur="${COMP_WORDS[COMP_CWORD]}"
1492         case "$cur" in
1493         --*)
1494                 __gitcomp "
1495                         --rebase --no-rebase
1496                         $__git_merge_options
1497                         $__git_fetch_options
1498                 "
1499                 return
1500                 ;;
1501         esac
1502         __git_complete_remote_or_refspec
1503 }
1504
1505 _git_push ()
1506 {
1507         local cur="${COMP_WORDS[COMP_CWORD]}"
1508         case "${COMP_WORDS[COMP_CWORD-1]}" in
1509         --repo)
1510                 __gitcomp "$(__git_remotes)"
1511                 return
1512         esac
1513         case "$cur" in
1514         --repo=*)
1515                 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1516                 return
1517                 ;;
1518         --*)
1519                 __gitcomp "
1520                         --all --mirror --tags --dry-run --force --verbose
1521                         --receive-pack= --repo=
1522                 "
1523                 return
1524                 ;;
1525         esac
1526         __git_complete_remote_or_refspec
1527 }
1528
1529 _git_rebase ()
1530 {
1531         local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1532         if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1533                 __gitcomp "--continue --skip --abort"
1534                 return
1535         fi
1536         __git_complete_strategy && return
1537         case "$cur" in
1538         --whitespace=*)
1539                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1540                 return
1541                 ;;
1542         --*)
1543                 __gitcomp "
1544                         --onto --merge --strategy --interactive
1545                         --preserve-merges --stat --no-stat
1546                         --committer-date-is-author-date --ignore-date
1547                         --ignore-whitespace --whitespace=
1548                         --autosquash
1549                         "
1550
1551                 return
1552         esac
1553         __gitcomp "$(__git_refs)"
1554 }
1555
1556 __git_send_email_confirm_options="always never auto cc compose"
1557 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1558
1559 _git_send_email ()
1560 {
1561         local cur="${COMP_WORDS[COMP_CWORD]}"
1562         case "$cur" in
1563         --confirm=*)
1564                 __gitcomp "
1565                         $__git_send_email_confirm_options
1566                         " "" "${cur##--confirm=}"
1567                 return
1568                 ;;
1569         --suppress-cc=*)
1570                 __gitcomp "
1571                         $__git_send_email_suppresscc_options
1572                         " "" "${cur##--suppress-cc=}"
1573
1574                 return
1575                 ;;
1576         --smtp-encryption=*)
1577                 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1578                 return
1579                 ;;
1580         --*)
1581                 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1582                         --compose --confirm= --dry-run --envelope-sender
1583                         --from --identity
1584                         --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1585                         --no-suppress-from --no-thread --quiet
1586                         --signed-off-by-cc --smtp-pass --smtp-server
1587                         --smtp-server-port --smtp-encryption= --smtp-user
1588                         --subject --suppress-cc= --suppress-from --thread --to
1589                         --validate --no-validate"
1590                 return
1591                 ;;
1592         esac
1593         COMPREPLY=()
1594 }
1595
1596 _git_stage ()
1597 {
1598         _git_add
1599 }
1600
1601 __git_config_get_set_variables ()
1602 {
1603         local prevword word config_file= c=$COMP_CWORD
1604         while [ $c -gt 1 ]; do
1605                 word="${COMP_WORDS[c]}"
1606                 case "$word" in
1607                 --global|--system|--file=*)
1608                         config_file="$word"
1609                         break
1610                         ;;
1611                 -f|--file)
1612                         config_file="$word $prevword"
1613                         break
1614                         ;;
1615                 esac
1616                 prevword=$word
1617                 c=$((--c))
1618         done
1619
1620         git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1621         while read line
1622         do
1623                 case "$line" in
1624                 *.*=*)
1625                         echo "${line/=*/}"
1626                         ;;
1627                 esac
1628         done
1629 }
1630
1631 _git_config ()
1632 {
1633         local cur="${COMP_WORDS[COMP_CWORD]}"
1634         local prv="${COMP_WORDS[COMP_CWORD-1]}"
1635         case "$prv" in
1636         branch.*.remote)
1637                 __gitcomp "$(__git_remotes)"
1638                 return
1639                 ;;
1640         branch.*.merge)
1641                 __gitcomp "$(__git_refs)"
1642                 return
1643                 ;;
1644         remote.*.fetch)
1645                 local remote="${prv#remote.}"
1646                 remote="${remote%.fetch}"
1647                 __gitcomp "$(__git_refs_remotes "$remote")"
1648                 return
1649                 ;;
1650         remote.*.push)
1651                 local remote="${prv#remote.}"
1652                 remote="${remote%.push}"
1653                 __gitcomp "$(git --git-dir="$(__gitdir)" \
1654                         for-each-ref --format='%(refname):%(refname)' \
1655                         refs/heads)"
1656                 return
1657                 ;;
1658         pull.twohead|pull.octopus)
1659                 __git_compute_merge_strategies
1660                 __gitcomp "$__git_merge_strategies"
1661                 return
1662                 ;;
1663         color.branch|color.diff|color.interactive|\
1664         color.showbranch|color.status|color.ui)
1665                 __gitcomp "always never auto"
1666                 return
1667                 ;;
1668         color.pager)
1669                 __gitcomp "false true"
1670                 return
1671                 ;;
1672         color.*.*)
1673                 __gitcomp "
1674                         normal black red green yellow blue magenta cyan white
1675                         bold dim ul blink reverse
1676                         "
1677                 return
1678                 ;;
1679         help.format)
1680                 __gitcomp "man info web html"
1681                 return
1682                 ;;
1683         log.date)
1684                 __gitcomp "$__git_log_date_formats"
1685                 return
1686                 ;;
1687         sendemail.aliasesfiletype)
1688                 __gitcomp "mutt mailrc pine elm gnus"
1689                 return
1690                 ;;
1691         sendemail.confirm)
1692                 __gitcomp "$__git_send_email_confirm_options"
1693                 return
1694                 ;;
1695         sendemail.suppresscc)
1696                 __gitcomp "$__git_send_email_suppresscc_options"
1697                 return
1698                 ;;
1699         --get|--get-all|--unset|--unset-all)
1700                 __gitcomp "$(__git_config_get_set_variables)"
1701                 return
1702                 ;;
1703         *.*)
1704                 COMPREPLY=()
1705                 return
1706                 ;;
1707         esac
1708         case "$cur" in
1709         --*)
1710                 __gitcomp "
1711                         --global --system --file=
1712                         --list --replace-all
1713                         --get --get-all --get-regexp
1714                         --add --unset --unset-all
1715                         --remove-section --rename-section
1716                         "
1717                 return
1718                 ;;
1719         branch.*.*)
1720                 local pfx="${cur%.*}."
1721                 cur="${cur##*.}"
1722                 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
1723                 return
1724                 ;;
1725         branch.*)
1726                 local pfx="${cur%.*}."
1727                 cur="${cur#*.}"
1728                 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1729                 return
1730                 ;;
1731         guitool.*.*)
1732                 local pfx="${cur%.*}."
1733                 cur="${cur##*.}"
1734                 __gitcomp "
1735                         argprompt cmd confirm needsfile noconsole norescan
1736                         prompt revprompt revunmerged title
1737                         " "$pfx" "$cur"
1738                 return
1739                 ;;
1740         difftool.*.*)
1741                 local pfx="${cur%.*}."
1742                 cur="${cur##*.}"
1743                 __gitcomp "cmd path" "$pfx" "$cur"
1744                 return
1745                 ;;
1746         man.*.*)
1747                 local pfx="${cur%.*}."
1748                 cur="${cur##*.}"
1749                 __gitcomp "cmd path" "$pfx" "$cur"
1750                 return
1751                 ;;
1752         mergetool.*.*)
1753                 local pfx="${cur%.*}."
1754                 cur="${cur##*.}"
1755                 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1756                 return
1757                 ;;
1758         pager.*)
1759                 local pfx="${cur%.*}."
1760                 cur="${cur#*.}"
1761                 __git_compute_all_commands
1762                 __gitcomp "$__git_all_commands" "$pfx" "$cur"
1763                 return
1764                 ;;
1765         remote.*.*)
1766                 local pfx="${cur%.*}."
1767                 cur="${cur##*.}"
1768                 __gitcomp "
1769                         url proxy fetch push mirror skipDefaultUpdate
1770                         receivepack uploadpack tagopt pushurl
1771                         " "$pfx" "$cur"
1772                 return
1773                 ;;
1774         remote.*)
1775                 local pfx="${cur%.*}."
1776                 cur="${cur#*.}"
1777                 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1778                 return
1779                 ;;
1780         url.*.*)
1781                 local pfx="${cur%.*}."
1782                 cur="${cur##*.}"
1783                 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur"
1784                 return
1785                 ;;
1786         esac
1787         __gitcomp "
1788                 add.ignore-errors
1789                 alias.
1790                 apply.ignorewhitespace
1791                 apply.whitespace
1792                 branch.autosetupmerge
1793                 branch.autosetuprebase
1794                 clean.requireForce
1795                 color.branch
1796                 color.branch.current
1797                 color.branch.local
1798                 color.branch.plain
1799                 color.branch.remote
1800                 color.diff
1801                 color.diff.commit
1802                 color.diff.frag
1803                 color.diff.meta
1804                 color.diff.new
1805                 color.diff.old
1806                 color.diff.plain
1807                 color.diff.whitespace
1808                 color.grep
1809                 color.grep.external
1810                 color.grep.match
1811                 color.interactive
1812                 color.interactive.header
1813                 color.interactive.help
1814                 color.interactive.prompt
1815                 color.pager
1816                 color.showbranch
1817                 color.status
1818                 color.status.added
1819                 color.status.changed
1820                 color.status.header
1821                 color.status.nobranch
1822                 color.status.untracked
1823                 color.status.updated
1824                 color.ui
1825                 commit.template
1826                 core.autocrlf
1827                 core.bare
1828                 core.compression
1829                 core.createObject
1830                 core.deltaBaseCacheLimit
1831                 core.editor
1832                 core.excludesfile
1833                 core.fileMode
1834                 core.fsyncobjectfiles
1835                 core.gitProxy
1836                 core.ignoreCygwinFSTricks
1837                 core.ignoreStat
1838                 core.logAllRefUpdates
1839                 core.loosecompression
1840                 core.packedGitLimit
1841                 core.packedGitWindowSize
1842                 core.pager
1843                 core.preferSymlinkRefs
1844                 core.preloadindex
1845                 core.quotepath
1846                 core.repositoryFormatVersion
1847                 core.safecrlf
1848                 core.sharedRepository
1849                 core.symlinks
1850                 core.trustctime
1851                 core.warnAmbiguousRefs
1852                 core.whitespace
1853                 core.worktree
1854                 diff.autorefreshindex
1855                 diff.external
1856                 diff.mnemonicprefix
1857                 diff.renameLimit
1858                 diff.renameLimit.
1859                 diff.renames
1860                 diff.suppressBlankEmpty
1861                 diff.tool
1862                 diff.wordRegex
1863                 difftool.
1864                 difftool.prompt
1865                 fetch.unpackLimit
1866                 format.attach
1867                 format.cc
1868                 format.headers
1869                 format.numbered
1870                 format.pretty
1871                 format.signature
1872                 format.signoff
1873                 format.subjectprefix
1874                 format.suffix
1875                 format.thread
1876                 gc.aggressiveWindow
1877                 gc.auto
1878                 gc.autopacklimit
1879                 gc.packrefs
1880                 gc.pruneexpire
1881                 gc.reflogexpire
1882                 gc.reflogexpireunreachable
1883                 gc.rerereresolved
1884                 gc.rerereunresolved
1885                 gitcvs.allbinary
1886                 gitcvs.commitmsgannotation
1887                 gitcvs.dbTableNamePrefix
1888                 gitcvs.dbdriver
1889                 gitcvs.dbname
1890                 gitcvs.dbpass
1891                 gitcvs.dbuser
1892                 gitcvs.enabled
1893                 gitcvs.logfile
1894                 gitcvs.usecrlfattr
1895                 guitool.
1896                 gui.blamehistoryctx
1897                 gui.commitmsgwidth
1898                 gui.copyblamethreshold
1899                 gui.diffcontext
1900                 gui.encoding
1901                 gui.fastcopyblame
1902                 gui.matchtrackingbranch
1903                 gui.newbranchtemplate
1904                 gui.pruneduringfetch
1905                 gui.spellingdictionary
1906                 gui.trustmtime
1907                 help.autocorrect
1908                 help.browser
1909                 help.format
1910                 http.lowSpeedLimit
1911                 http.lowSpeedTime
1912                 http.maxRequests
1913                 http.noEPSV
1914                 http.proxy
1915                 http.sslCAInfo
1916                 http.sslCAPath
1917                 http.sslCert
1918                 http.sslKey
1919                 http.sslVerify
1920                 i18n.commitEncoding
1921                 i18n.logOutputEncoding
1922                 imap.folder
1923                 imap.host
1924                 imap.pass
1925                 imap.port
1926                 imap.preformattedHTML
1927                 imap.sslverify
1928                 imap.tunnel
1929                 imap.user
1930                 instaweb.browser
1931                 instaweb.httpd
1932                 instaweb.local
1933                 instaweb.modulepath
1934                 instaweb.port
1935                 interactive.singlekey
1936                 log.date
1937                 log.showroot
1938                 mailmap.file
1939                 man.
1940                 man.viewer
1941                 merge.conflictstyle
1942                 merge.log
1943                 merge.renameLimit
1944                 merge.stat
1945                 merge.tool
1946                 merge.verbosity
1947                 mergetool.
1948                 mergetool.keepBackup
1949                 mergetool.prompt
1950                 pack.compression
1951                 pack.deltaCacheLimit
1952                 pack.deltaCacheSize
1953                 pack.depth
1954                 pack.indexVersion
1955                 pack.packSizeLimit
1956                 pack.threads
1957                 pack.window
1958                 pack.windowMemory
1959                 pager.
1960                 pull.octopus
1961                 pull.twohead
1962                 push.default
1963                 rebase.stat
1964                 receive.denyCurrentBranch
1965                 receive.denyDeletes
1966                 receive.denyNonFastForwards
1967                 receive.fsckObjects
1968                 receive.unpackLimit
1969                 repack.usedeltabaseoffset
1970                 rerere.autoupdate
1971                 rerere.enabled
1972                 sendemail.aliasesfile
1973                 sendemail.aliasesfiletype
1974                 sendemail.bcc
1975                 sendemail.cc
1976                 sendemail.cccmd
1977                 sendemail.chainreplyto
1978                 sendemail.confirm
1979                 sendemail.envelopesender
1980                 sendemail.multiedit
1981                 sendemail.signedoffbycc
1982                 sendemail.smtpencryption
1983                 sendemail.smtppass
1984                 sendemail.smtpserver
1985                 sendemail.smtpserverport
1986                 sendemail.smtpuser
1987                 sendemail.suppresscc
1988                 sendemail.suppressfrom
1989                 sendemail.thread
1990                 sendemail.to
1991                 sendemail.validate
1992                 showbranch.default
1993                 status.relativePaths
1994                 status.showUntrackedFiles
1995                 tar.umask
1996                 transfer.unpackLimit
1997                 url.
1998                 user.email
1999                 user.name
2000                 user.signingkey
2001                 web.browser
2002                 branch. remote.
2003         "
2004 }
2005
2006 _git_remote ()
2007 {
2008         local subcommands="add rename rm show prune update set-head"
2009         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2010         if [ -z "$subcommand" ]; then
2011                 __gitcomp "$subcommands"
2012                 return
2013         fi
2014
2015         case "$subcommand" in
2016         rename|rm|show|prune)
2017                 __gitcomp "$(__git_remotes)"
2018                 ;;
2019         update)
2020                 local i c='' IFS=$'\n'
2021                 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2022                         i="${i#remotes.}"
2023                         c="$c ${i/ */}"
2024                 done
2025                 __gitcomp "$c"
2026                 ;;
2027         *)
2028                 COMPREPLY=()
2029                 ;;
2030         esac
2031 }
2032
2033 _git_replace ()
2034 {
2035         __gitcomp "$(__git_refs)"
2036 }
2037
2038 _git_reset ()
2039 {
2040         __git_has_doubledash && return
2041
2042         local cur="${COMP_WORDS[COMP_CWORD]}"
2043         case "$cur" in
2044         --*)
2045                 __gitcomp "--merge --mixed --hard --soft --patch"
2046                 return
2047                 ;;
2048         esac
2049         __gitcomp "$(__git_refs)"
2050 }
2051
2052 _git_revert ()
2053 {
2054         local cur="${COMP_WORDS[COMP_CWORD]}"
2055         case "$cur" in
2056         --*)
2057                 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2058                 return
2059                 ;;
2060         esac
2061         __gitcomp "$(__git_refs)"
2062 }
2063
2064 _git_rm ()
2065 {
2066         __git_has_doubledash && return
2067
2068         local cur="${COMP_WORDS[COMP_CWORD]}"
2069         case "$cur" in
2070         --*)
2071                 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2072                 return
2073                 ;;
2074         esac
2075         COMPREPLY=()
2076 }
2077
2078 _git_shortlog ()
2079 {
2080         __git_has_doubledash && return
2081
2082         local cur="${COMP_WORDS[COMP_CWORD]}"
2083         case "$cur" in
2084         --*)
2085                 __gitcomp "
2086                         $__git_log_common_options
2087                         $__git_log_shortlog_options
2088                         --numbered --summary
2089                         "
2090                 return
2091                 ;;
2092         esac
2093         __git_complete_revlist
2094 }
2095
2096 _git_show ()
2097 {
2098         __git_has_doubledash && return
2099
2100         local cur="${COMP_WORDS[COMP_CWORD]}"
2101         case "$cur" in
2102         --pretty=*)
2103                 __gitcomp "$__git_log_pretty_formats
2104                         " "" "${cur##--pretty=}"
2105                 return
2106                 ;;
2107         --format=*)
2108                 __gitcomp "$__git_log_pretty_formats
2109                         " "" "${cur##--format=}"
2110                 return
2111                 ;;
2112         --*)
2113                 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2114                         $__git_diff_common_options
2115                         "
2116                 return
2117                 ;;
2118         esac
2119         __git_complete_file
2120 }
2121
2122 _git_show_branch ()
2123 {
2124         local cur="${COMP_WORDS[COMP_CWORD]}"
2125         case "$cur" in
2126         --*)
2127                 __gitcomp "
2128                         --all --remotes --topo-order --current --more=
2129                         --list --independent --merge-base --no-name
2130                         --color --no-color
2131                         --sha1-name --sparse --topics --reflog
2132                         "
2133                 return
2134                 ;;
2135         esac
2136         __git_complete_revlist
2137 }
2138
2139 _git_stash ()
2140 {
2141         local cur="${COMP_WORDS[COMP_CWORD]}"
2142         local save_opts='--keep-index --no-keep-index --quiet --patch'
2143         local subcommands='save list show apply clear drop pop create branch'
2144         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2145         if [ -z "$subcommand" ]; then
2146                 case "$cur" in
2147                 --*)
2148                         __gitcomp "$save_opts"
2149                         ;;
2150                 *)
2151                         if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2152                                 __gitcomp "$subcommands"
2153                         else
2154                                 COMPREPLY=()
2155                         fi
2156                         ;;
2157                 esac
2158         else
2159                 case "$subcommand,$cur" in
2160                 save,--*)
2161                         __gitcomp "$save_opts"
2162                         ;;
2163                 apply,--*|pop,--*)
2164                         __gitcomp "--index --quiet"
2165                         ;;
2166                 show,--*|drop,--*|branch,--*)
2167                         COMPREPLY=()
2168                         ;;
2169                 show,*|apply,*|drop,*|pop,*|branch,*)
2170                         __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
2171                                         | sed -n -e 's/:.*//p')"
2172                         ;;
2173                 *)
2174                         COMPREPLY=()
2175                         ;;
2176                 esac
2177         fi
2178 }
2179
2180 _git_submodule ()
2181 {
2182         __git_has_doubledash && return
2183
2184         local subcommands="add status init update summary foreach sync"
2185         if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2186                 local cur="${COMP_WORDS[COMP_CWORD]}"
2187                 case "$cur" in
2188                 --*)
2189                         __gitcomp "--quiet --cached"
2190                         ;;
2191                 *)
2192                         __gitcomp "$subcommands"
2193                         ;;
2194                 esac
2195                 return
2196         fi
2197 }
2198
2199 _git_svn ()
2200 {
2201         local subcommands="
2202                 init fetch clone rebase dcommit log find-rev
2203                 set-tree commit-diff info create-ignore propget
2204                 proplist show-ignore show-externals branch tag blame
2205                 migrate mkdirs reset gc
2206                 "
2207         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2208         if [ -z "$subcommand" ]; then
2209                 __gitcomp "$subcommands"
2210         else
2211                 local remote_opts="--username= --config-dir= --no-auth-cache"
2212                 local fc_opts="
2213                         --follow-parent --authors-file= --repack=
2214                         --no-metadata --use-svm-props --use-svnsync-props
2215                         --log-window-size= --no-checkout --quiet
2216                         --repack-flags --use-log-author --localtime
2217                         --ignore-paths= $remote_opts
2218                         "
2219                 local init_opts="
2220                         --template= --shared= --trunk= --tags=
2221                         --branches= --stdlayout --minimize-url
2222                         --no-metadata --use-svm-props --use-svnsync-props
2223                         --rewrite-root= --prefix= --use-log-author
2224                         --add-author-from $remote_opts
2225                         "
2226                 local cmt_opts="
2227                         --edit --rmdir --find-copies-harder --copy-similarity=
2228                         "
2229
2230                 local cur="${COMP_WORDS[COMP_CWORD]}"
2231                 case "$subcommand,$cur" in
2232                 fetch,--*)
2233                         __gitcomp "--revision= --fetch-all $fc_opts"
2234                         ;;
2235                 clone,--*)
2236                         __gitcomp "--revision= $fc_opts $init_opts"
2237                         ;;
2238                 init,--*)
2239                         __gitcomp "$init_opts"
2240                         ;;
2241                 dcommit,--*)
2242                         __gitcomp "
2243                                 --merge --strategy= --verbose --dry-run
2244                                 --fetch-all --no-rebase --commit-url
2245                                 --revision $cmt_opts $fc_opts
2246                                 "
2247                         ;;
2248                 set-tree,--*)
2249                         __gitcomp "--stdin $cmt_opts $fc_opts"
2250                         ;;
2251                 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2252                 show-externals,--*|mkdirs,--*)
2253                         __gitcomp "--revision="
2254                         ;;
2255                 log,--*)
2256                         __gitcomp "
2257                                 --limit= --revision= --verbose --incremental
2258                                 --oneline --show-commit --non-recursive
2259                                 --authors-file= --color
2260                                 "
2261                         ;;
2262                 rebase,--*)
2263                         __gitcomp "
2264                                 --merge --verbose --strategy= --local
2265                                 --fetch-all --dry-run $fc_opts
2266                                 "
2267                         ;;
2268                 commit-diff,--*)
2269                         __gitcomp "--message= --file= --revision= $cmt_opts"
2270                         ;;
2271                 info,--*)
2272                         __gitcomp "--url"
2273                         ;;
2274                 branch,--*)
2275                         __gitcomp "--dry-run --message --tag"
2276                         ;;
2277                 tag,--*)
2278                         __gitcomp "--dry-run --message"
2279                         ;;
2280                 blame,--*)
2281                         __gitcomp "--git-format"
2282                         ;;
2283                 migrate,--*)
2284                         __gitcomp "
2285                                 --config-dir= --ignore-paths= --minimize
2286                                 --no-auth-cache --username=
2287                                 "
2288                         ;;
2289                 reset,--*)
2290                         __gitcomp "--revision= --parent"
2291                         ;;
2292                 *)
2293                         COMPREPLY=()
2294                         ;;
2295                 esac
2296         fi
2297 }
2298
2299 _git_tag ()
2300 {
2301         local i c=1 f=0
2302         while [ $c -lt $COMP_CWORD ]; do
2303                 i="${COMP_WORDS[c]}"
2304                 case "$i" in
2305                 -d|-v)
2306                         __gitcomp "$(__git_tags)"
2307                         return
2308                         ;;
2309                 -f)
2310                         f=1
2311                         ;;
2312                 esac
2313                 c=$((++c))
2314         done
2315
2316         case "${COMP_WORDS[COMP_CWORD-1]}" in
2317         -m|-F)
2318                 COMPREPLY=()
2319                 ;;
2320         -*|tag)
2321                 if [ $f = 1 ]; then
2322                         __gitcomp "$(__git_tags)"
2323                 else
2324                         COMPREPLY=()
2325                 fi
2326                 ;;
2327         *)
2328                 __gitcomp "$(__git_refs)"
2329                 ;;
2330         esac
2331 }
2332
2333 _git_whatchanged ()
2334 {
2335         _git_log
2336 }
2337
2338 _git ()
2339 {
2340         local i c=1 command __git_dir
2341
2342         while [ $c -lt $COMP_CWORD ]; do
2343                 i="${COMP_WORDS[c]}"
2344                 case "$i" in
2345                 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2346                 --bare)      __git_dir="." ;;
2347                 --version|-p|--paginate) ;;
2348                 --help) command="help"; break ;;
2349                 *) command="$i"; break ;;
2350                 esac
2351                 c=$((++c))
2352         done
2353
2354         if [ -z "$command" ]; then
2355                 case "${COMP_WORDS[COMP_CWORD]}" in
2356                 --*)   __gitcomp "
2357                         --paginate
2358                         --no-pager
2359                         --git-dir=
2360                         --bare
2361                         --version
2362                         --exec-path
2363                         --html-path
2364                         --work-tree=
2365                         --help
2366                         "
2367                         ;;
2368                 *)     __git_compute_porcelain_commands
2369                        __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2370                 esac
2371                 return
2372         fi
2373
2374         local completion_func="_git_${command//-/_}"
2375         declare -F $completion_func >/dev/null && $completion_func && return
2376
2377         local expansion=$(__git_aliased_command "$command")
2378         if [ -n "$expansion" ]; then
2379                 completion_func="_git_${expansion//-/_}"
2380                 declare -F $completion_func >/dev/null && $completion_func
2381         fi
2382 }
2383
2384 _gitk ()
2385 {
2386         __git_has_doubledash && return
2387
2388         local cur="${COMP_WORDS[COMP_CWORD]}"
2389         local g="$(__gitdir)"
2390         local merge=""
2391         if [ -f "$g/MERGE_HEAD" ]; then
2392                 merge="--merge"
2393         fi
2394         case "$cur" in
2395         --*)
2396                 __gitcomp "
2397                         $__git_log_common_options
2398                         $__git_log_gitk_options
2399                         $merge
2400                         "
2401                 return
2402                 ;;
2403         esac
2404         __git_complete_revlist
2405 }
2406
2407 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2408         || complete -o default -o nospace -F _git git
2409 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2410         || complete -o default -o nospace -F _gitk gitk
2411
2412 # The following are necessary only for Cygwin, and only are needed
2413 # when the user has tab-completed the executable name and consequently
2414 # included the '.exe' suffix.
2415 #
2416 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2417 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2418         || complete -o default -o nospace -F _git git.exe
2419 fi