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