git-grep: Learn PCRE
[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=*)
1291                 __gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}"
1292                 return
1293                 ;;
1294         --reedit-message=*)
1295                 __gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}"
1296                 return
1297                 ;;
1298         --untracked-files=*)
1299                 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1300                 return
1301                 ;;
1302         --*)
1303                 __gitcomp "
1304                         --all --author= --signoff --verify --no-verify
1305                         --edit --amend --include --only --interactive
1306                         --dry-run --reuse-message= --reedit-message=
1307                         --reset-author --file= --message= --template=
1308                         --cleanup= --untracked-files --untracked-files=
1309                         --verbose --quiet
1310                         "
1311                 return
1312         esac
1313         COMPREPLY=()
1314 }
1315
1316 _git_describe ()
1317 {
1318         local cur
1319         _get_comp_words_by_ref -n =: cur
1320         case "$cur" in
1321         --*)
1322                 __gitcomp "
1323                         --all --tags --contains --abbrev= --candidates=
1324                         --exact-match --debug --long --match --always
1325                         "
1326                 return
1327         esac
1328         __gitcomp "$(__git_refs)"
1329 }
1330
1331 __git_diff_common_options="--stat --numstat --shortstat --summary
1332                         --patch-with-stat --name-only --name-status --color
1333                         --no-color --color-words --no-renames --check
1334                         --full-index --binary --abbrev --diff-filter=
1335                         --find-copies-harder
1336                         --text --ignore-space-at-eol --ignore-space-change
1337                         --ignore-all-space --exit-code --quiet --ext-diff
1338                         --no-ext-diff
1339                         --no-prefix --src-prefix= --dst-prefix=
1340                         --inter-hunk-context=
1341                         --patience
1342                         --raw
1343                         --dirstat --dirstat= --dirstat-by-file
1344                         --dirstat-by-file= --cumulative
1345 "
1346
1347 _git_diff ()
1348 {
1349         __git_has_doubledash && return
1350
1351         local cur
1352         _get_comp_words_by_ref -n =: cur
1353         case "$cur" in
1354         --*)
1355                 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1356                         --base --ours --theirs --no-index
1357                         $__git_diff_common_options
1358                         "
1359                 return
1360                 ;;
1361         esac
1362         __git_complete_revlist_file
1363 }
1364
1365 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1366                         tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3
1367 "
1368
1369 _git_difftool ()
1370 {
1371         __git_has_doubledash && return
1372
1373         local cur
1374         _get_comp_words_by_ref -n =: cur
1375         case "$cur" in
1376         --tool=*)
1377                 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1378                 return
1379                 ;;
1380         --*)
1381                 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1382                         --base --ours --theirs
1383                         --no-renames --diff-filter= --find-copies-harder
1384                         --relative --ignore-submodules
1385                         --tool="
1386                 return
1387                 ;;
1388         esac
1389         __git_complete_file
1390 }
1391
1392 __git_fetch_options="
1393         --quiet --verbose --append --upload-pack --force --keep --depth=
1394         --tags --no-tags --all --prune --dry-run
1395 "
1396
1397 _git_fetch ()
1398 {
1399         local cur
1400         _get_comp_words_by_ref -n =: cur
1401         case "$cur" in
1402         --*)
1403                 __gitcomp "$__git_fetch_options"
1404                 return
1405                 ;;
1406         esac
1407         __git_complete_remote_or_refspec
1408 }
1409
1410 _git_format_patch ()
1411 {
1412         local cur
1413         _get_comp_words_by_ref -n =: cur
1414         case "$cur" in
1415         --thread=*)
1416                 __gitcomp "
1417                         deep shallow
1418                         " "" "${cur##--thread=}"
1419                 return
1420                 ;;
1421         --*)
1422                 __gitcomp "
1423                         --stdout --attach --no-attach --thread --thread=
1424                         --output-directory
1425                         --numbered --start-number
1426                         --numbered-files
1427                         --keep-subject
1428                         --signoff --signature --no-signature
1429                         --in-reply-to= --cc=
1430                         --full-index --binary
1431                         --not --all
1432                         --cover-letter
1433                         --no-prefix --src-prefix= --dst-prefix=
1434                         --inline --suffix= --ignore-if-in-upstream
1435                         --subject-prefix=
1436                         "
1437                 return
1438                 ;;
1439         esac
1440         __git_complete_revlist
1441 }
1442
1443 _git_fsck ()
1444 {
1445         local cur
1446         _get_comp_words_by_ref -n =: cur
1447         case "$cur" in
1448         --*)
1449                 __gitcomp "
1450                         --tags --root --unreachable --cache --no-reflogs --full
1451                         --strict --verbose --lost-found
1452                         "
1453                 return
1454                 ;;
1455         esac
1456         COMPREPLY=()
1457 }
1458
1459 _git_gc ()
1460 {
1461         local cur
1462         _get_comp_words_by_ref -n =: cur
1463         case "$cur" in
1464         --*)
1465                 __gitcomp "--prune --aggressive"
1466                 return
1467                 ;;
1468         esac
1469         COMPREPLY=()
1470 }
1471
1472 _git_gitk ()
1473 {
1474         _gitk
1475 }
1476
1477 _git_grep ()
1478 {
1479         __git_has_doubledash && return
1480
1481         local cur
1482         _get_comp_words_by_ref -n =: cur
1483         case "$cur" in
1484         --*)
1485                 __gitcomp "
1486                         --cached
1487                         --text --ignore-case --word-regexp --invert-match
1488                         --full-name --line-number
1489                         --extended-regexp --basic-regexp --fixed-strings
1490                         --perl-regexp
1491                         --files-with-matches --name-only
1492                         --files-without-match
1493                         --max-depth
1494                         --count
1495                         --and --or --not --all-match
1496                         "
1497                 return
1498                 ;;
1499         esac
1500
1501         __gitcomp "$(__git_refs)"
1502 }
1503
1504 _git_help ()
1505 {
1506         local cur
1507         _get_comp_words_by_ref -n =: cur
1508         case "$cur" in
1509         --*)
1510                 __gitcomp "--all --info --man --web"
1511                 return
1512                 ;;
1513         esac
1514         __git_compute_all_commands
1515         __gitcomp "$__git_all_commands $(__git_aliases)
1516                 attributes cli core-tutorial cvs-migration
1517                 diffcore gitk glossary hooks ignore modules
1518                 repository-layout tutorial tutorial-2
1519                 workflows
1520                 "
1521 }
1522
1523 _git_init ()
1524 {
1525         local cur
1526         _get_comp_words_by_ref -n =: cur
1527         case "$cur" in
1528         --shared=*)
1529                 __gitcomp "
1530                         false true umask group all world everybody
1531                         " "" "${cur##--shared=}"
1532                 return
1533                 ;;
1534         --*)
1535                 __gitcomp "--quiet --bare --template= --shared --shared="
1536                 return
1537                 ;;
1538         esac
1539         COMPREPLY=()
1540 }
1541
1542 _git_ls_files ()
1543 {
1544         __git_has_doubledash && return
1545
1546         local cur
1547         _get_comp_words_by_ref -n =: cur
1548         case "$cur" in
1549         --*)
1550                 __gitcomp "--cached --deleted --modified --others --ignored
1551                         --stage --directory --no-empty-directory --unmerged
1552                         --killed --exclude= --exclude-from=
1553                         --exclude-per-directory= --exclude-standard
1554                         --error-unmatch --with-tree= --full-name
1555                         --abbrev --ignored --exclude-per-directory
1556                         "
1557                 return
1558                 ;;
1559         esac
1560         COMPREPLY=()
1561 }
1562
1563 _git_ls_remote ()
1564 {
1565         __gitcomp "$(__git_remotes)"
1566 }
1567
1568 _git_ls_tree ()
1569 {
1570         __git_complete_file
1571 }
1572
1573 # Options that go well for log, shortlog and gitk
1574 __git_log_common_options="
1575         --not --all
1576         --branches --tags --remotes
1577         --first-parent --merges --no-merges
1578         --max-count=
1579         --max-age= --since= --after=
1580         --min-age= --until= --before=
1581         --min-parents= --max-parents=
1582         --no-min-parents --no-max-parents
1583 "
1584 # Options that go well for log and gitk (not shortlog)
1585 __git_log_gitk_options="
1586         --dense --sparse --full-history
1587         --simplify-merges --simplify-by-decoration
1588         --left-right
1589 "
1590 # Options that go well for log and shortlog (not gitk)
1591 __git_log_shortlog_options="
1592         --author= --committer= --grep=
1593         --all-match
1594 "
1595
1596 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1597 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1598
1599 _git_log ()
1600 {
1601         __git_has_doubledash && return
1602
1603         local g="$(git rev-parse --git-dir 2>/dev/null)"
1604         local merge=""
1605         if [ -f "$g/MERGE_HEAD" ]; then
1606                 merge="--merge"
1607         fi
1608         local cur
1609         _get_comp_words_by_ref -n =: cur
1610         case "$cur" in
1611         --pretty=*)
1612                 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1613                         " "" "${cur##--pretty=}"
1614                 return
1615                 ;;
1616         --format=*)
1617                 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1618                         " "" "${cur##--format=}"
1619                 return
1620                 ;;
1621         --date=*)
1622                 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1623                 return
1624                 ;;
1625         --decorate=*)
1626                 __gitcomp "long short" "" "${cur##--decorate=}"
1627                 return
1628                 ;;
1629         --*)
1630                 __gitcomp "
1631                         $__git_log_common_options
1632                         $__git_log_shortlog_options
1633                         $__git_log_gitk_options
1634                         --root --topo-order --date-order --reverse
1635                         --follow --full-diff
1636                         --abbrev-commit --abbrev=
1637                         --relative-date --date=
1638                         --pretty= --format= --oneline
1639                         --cherry-pick
1640                         --graph
1641                         --decorate --decorate=
1642                         --walk-reflogs
1643                         --parents --children
1644                         $merge
1645                         $__git_diff_common_options
1646                         --pickaxe-all --pickaxe-regex
1647                         "
1648                 return
1649                 ;;
1650         esac
1651         __git_complete_revlist
1652 }
1653
1654 __git_merge_options="
1655         --no-commit --no-stat --log --no-log --squash --strategy
1656         --commit --stat --no-squash --ff --no-ff --ff-only
1657 "
1658
1659 _git_merge ()
1660 {
1661         __git_complete_strategy && return
1662
1663         local cur
1664         _get_comp_words_by_ref -n =: cur
1665         case "$cur" in
1666         --*)
1667                 __gitcomp "$__git_merge_options"
1668                 return
1669         esac
1670         __gitcomp "$(__git_refs)"
1671 }
1672
1673 _git_mergetool ()
1674 {
1675         local cur
1676         _get_comp_words_by_ref -n =: cur
1677         case "$cur" in
1678         --tool=*)
1679                 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1680                 return
1681                 ;;
1682         --*)
1683                 __gitcomp "--tool="
1684                 return
1685                 ;;
1686         esac
1687         COMPREPLY=()
1688 }
1689
1690 _git_merge_base ()
1691 {
1692         __gitcomp "$(__git_refs)"
1693 }
1694
1695 _git_mv ()
1696 {
1697         local cur
1698         _get_comp_words_by_ref -n =: cur
1699         case "$cur" in
1700         --*)
1701                 __gitcomp "--dry-run"
1702                 return
1703                 ;;
1704         esac
1705         COMPREPLY=()
1706 }
1707
1708 _git_name_rev ()
1709 {
1710         __gitcomp "--tags --all --stdin"
1711 }
1712
1713 _git_notes ()
1714 {
1715         local subcommands='add append copy edit list prune remove show'
1716         local subcommand="$(__git_find_on_cmdline "$subcommands")"
1717         local cur words cword
1718         _get_comp_words_by_ref -n =: cur words cword
1719
1720         case "$subcommand,$cur" in
1721         ,--*)
1722                 __gitcomp '--ref'
1723                 ;;
1724         ,*)
1725                 case "${words[cword-1]}" in
1726                 --ref)
1727                         __gitcomp "$(__git_refs)"
1728                         ;;
1729                 *)
1730                         __gitcomp "$subcommands --ref"
1731                         ;;
1732                 esac
1733                 ;;
1734         add,--reuse-message=*|append,--reuse-message=*)
1735                 __gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}"
1736                 ;;
1737         add,--reedit-message=*|append,--reedit-message=*)
1738                 __gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}"
1739                 ;;
1740         add,--*|append,--*)
1741                 __gitcomp '--file= --message= --reedit-message=
1742                                 --reuse-message='
1743                 ;;
1744         copy,--*)
1745                 __gitcomp '--stdin'
1746                 ;;
1747         prune,--*)
1748                 __gitcomp '--dry-run --verbose'
1749                 ;;
1750         prune,*)
1751                 ;;
1752         *)
1753                 case "${words[cword-1]}" in
1754                 -m|-F)
1755                         ;;
1756                 *)
1757                         __gitcomp "$(__git_refs)"
1758                         ;;
1759                 esac
1760                 ;;
1761         esac
1762 }
1763
1764 _git_pull ()
1765 {
1766         __git_complete_strategy && return
1767
1768         local cur
1769         _get_comp_words_by_ref -n =: cur
1770         case "$cur" in
1771         --*)
1772                 __gitcomp "
1773                         --rebase --no-rebase
1774                         $__git_merge_options
1775                         $__git_fetch_options
1776                 "
1777                 return
1778                 ;;
1779         esac
1780         __git_complete_remote_or_refspec
1781 }
1782
1783 _git_push ()
1784 {
1785         local cur prev
1786         _get_comp_words_by_ref -n =: cur prev
1787         case "$prev" in
1788         --repo)
1789                 __gitcomp "$(__git_remotes)"
1790                 return
1791         esac
1792         case "$cur" in
1793         --repo=*)
1794                 __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1795                 return
1796                 ;;
1797         --*)
1798                 __gitcomp "
1799                         --all --mirror --tags --dry-run --force --verbose
1800                         --receive-pack= --repo=
1801                 "
1802                 return
1803                 ;;
1804         esac
1805         __git_complete_remote_or_refspec
1806 }
1807
1808 _git_rebase ()
1809 {
1810         local dir="$(__gitdir)"
1811         local cur
1812         _get_comp_words_by_ref -n =: cur
1813         if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1814                 __gitcomp "--continue --skip --abort"
1815                 return
1816         fi
1817         __git_complete_strategy && return
1818         case "$cur" in
1819         --whitespace=*)
1820                 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1821                 return
1822                 ;;
1823         --*)
1824                 __gitcomp "
1825                         --onto --merge --strategy --interactive
1826                         --preserve-merges --stat --no-stat
1827                         --committer-date-is-author-date --ignore-date
1828                         --ignore-whitespace --whitespace=
1829                         --autosquash
1830                         "
1831
1832                 return
1833         esac
1834         __gitcomp "$(__git_refs)"
1835 }
1836
1837 _git_reflog ()
1838 {
1839         local subcommands="show delete expire"
1840         local subcommand="$(__git_find_on_cmdline "$subcommands")"
1841
1842         if [ -z "$subcommand" ]; then
1843                 __gitcomp "$subcommands"
1844         else
1845                 __gitcomp "$(__git_refs)"
1846         fi
1847 }
1848
1849 __git_send_email_confirm_options="always never auto cc compose"
1850 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1851
1852 _git_send_email ()
1853 {
1854         local cur
1855         _get_comp_words_by_ref -n =: cur
1856         case "$cur" in
1857         --confirm=*)
1858                 __gitcomp "
1859                         $__git_send_email_confirm_options
1860                         " "" "${cur##--confirm=}"
1861                 return
1862                 ;;
1863         --suppress-cc=*)
1864                 __gitcomp "
1865                         $__git_send_email_suppresscc_options
1866                         " "" "${cur##--suppress-cc=}"
1867
1868                 return
1869                 ;;
1870         --smtp-encryption=*)
1871                 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1872                 return
1873                 ;;
1874         --*)
1875                 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1876                         --compose --confirm= --dry-run --envelope-sender
1877                         --from --identity
1878                         --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1879                         --no-suppress-from --no-thread --quiet
1880                         --signed-off-by-cc --smtp-pass --smtp-server
1881                         --smtp-server-port --smtp-encryption= --smtp-user
1882                         --subject --suppress-cc= --suppress-from --thread --to
1883                         --validate --no-validate"
1884                 return
1885                 ;;
1886         esac
1887         COMPREPLY=()
1888 }
1889
1890 _git_stage ()
1891 {
1892         _git_add
1893 }
1894
1895 __git_config_get_set_variables ()
1896 {
1897         local words cword
1898         _get_comp_words_by_ref -n =: words cword
1899         local prevword word config_file= c=$cword
1900         while [ $c -gt 1 ]; do
1901                 word="${words[c]}"
1902                 case "$word" in
1903                 --global|--system|--file=*)
1904                         config_file="$word"
1905                         break
1906                         ;;
1907                 -f|--file)
1908                         config_file="$word $prevword"
1909                         break
1910                         ;;
1911                 esac
1912                 prevword=$word
1913                 c=$((--c))
1914         done
1915
1916         git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1917         while read line
1918         do
1919                 case "$line" in
1920                 *.*=*)
1921                         echo "${line/=*/}"
1922                         ;;
1923                 esac
1924         done
1925 }
1926
1927 _git_config ()
1928 {
1929         local cur prev
1930         _get_comp_words_by_ref -n =: cur prev
1931         case "$prev" in
1932         branch.*.remote)
1933                 __gitcomp "$(__git_remotes)"
1934                 return
1935                 ;;
1936         branch.*.merge)
1937                 __gitcomp "$(__git_refs)"
1938                 return
1939                 ;;
1940         remote.*.fetch)
1941                 local remote="${prev#remote.}"
1942                 remote="${remote%.fetch}"
1943                 __gitcomp "$(__git_refs_remotes "$remote")"
1944                 return
1945                 ;;
1946         remote.*.push)
1947                 local remote="${prev#remote.}"
1948                 remote="${remote%.push}"
1949                 __gitcomp "$(git --git-dir="$(__gitdir)" \
1950                         for-each-ref --format='%(refname):%(refname)' \
1951                         refs/heads)"
1952                 return
1953                 ;;
1954         pull.twohead|pull.octopus)
1955                 __git_compute_merge_strategies
1956                 __gitcomp "$__git_merge_strategies"
1957                 return
1958                 ;;
1959         color.branch|color.diff|color.interactive|\
1960         color.showbranch|color.status|color.ui)
1961                 __gitcomp "always never auto"
1962                 return
1963                 ;;
1964         color.pager)
1965                 __gitcomp "false true"
1966                 return
1967                 ;;
1968         color.*.*)
1969                 __gitcomp "
1970                         normal black red green yellow blue magenta cyan white
1971                         bold dim ul blink reverse
1972                         "
1973                 return
1974                 ;;
1975         help.format)
1976                 __gitcomp "man info web html"
1977                 return
1978                 ;;
1979         log.date)
1980                 __gitcomp "$__git_log_date_formats"
1981                 return
1982                 ;;
1983         sendemail.aliasesfiletype)
1984                 __gitcomp "mutt mailrc pine elm gnus"
1985                 return
1986                 ;;
1987         sendemail.confirm)
1988                 __gitcomp "$__git_send_email_confirm_options"
1989                 return
1990                 ;;
1991         sendemail.suppresscc)
1992                 __gitcomp "$__git_send_email_suppresscc_options"
1993                 return
1994                 ;;
1995         --get|--get-all|--unset|--unset-all)
1996                 __gitcomp "$(__git_config_get_set_variables)"
1997                 return
1998                 ;;
1999         *.*)
2000                 COMPREPLY=()
2001                 return
2002                 ;;
2003         esac
2004         case "$cur" in
2005         --*)
2006                 __gitcomp "
2007                         --global --system --file=
2008                         --list --replace-all
2009                         --get --get-all --get-regexp
2010                         --add --unset --unset-all
2011                         --remove-section --rename-section
2012                         "
2013                 return
2014                 ;;
2015         branch.*.*)
2016                 local pfx="${cur%.*}."
2017                 cur="${cur##*.}"
2018                 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
2019                 return
2020                 ;;
2021         branch.*)
2022                 local pfx="${cur%.*}."
2023                 cur="${cur#*.}"
2024                 __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
2025                 return
2026                 ;;
2027         guitool.*.*)
2028                 local pfx="${cur%.*}."
2029                 cur="${cur##*.}"
2030                 __gitcomp "
2031                         argprompt cmd confirm needsfile noconsole norescan
2032                         prompt revprompt revunmerged title
2033                         " "$pfx" "$cur"
2034                 return
2035                 ;;
2036         difftool.*.*)
2037                 local pfx="${cur%.*}."
2038                 cur="${cur##*.}"
2039                 __gitcomp "cmd path" "$pfx" "$cur"
2040                 return
2041                 ;;
2042         man.*.*)
2043                 local pfx="${cur%.*}."
2044                 cur="${cur##*.}"
2045                 __gitcomp "cmd path" "$pfx" "$cur"
2046                 return
2047                 ;;
2048         mergetool.*.*)
2049                 local pfx="${cur%.*}."
2050                 cur="${cur##*.}"
2051                 __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
2052                 return
2053                 ;;
2054         pager.*)
2055                 local pfx="${cur%.*}."
2056                 cur="${cur#*.}"
2057                 __git_compute_all_commands
2058                 __gitcomp "$__git_all_commands" "$pfx" "$cur"
2059                 return
2060                 ;;
2061         remote.*.*)
2062                 local pfx="${cur%.*}."
2063                 cur="${cur##*.}"
2064                 __gitcomp "
2065                         url proxy fetch push mirror skipDefaultUpdate
2066                         receivepack uploadpack tagopt pushurl
2067                         " "$pfx" "$cur"
2068                 return
2069                 ;;
2070         remote.*)
2071                 local pfx="${cur%.*}."
2072                 cur="${cur#*.}"
2073                 __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
2074                 return
2075                 ;;
2076         url.*.*)
2077                 local pfx="${cur%.*}."
2078                 cur="${cur##*.}"
2079                 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur"
2080                 return
2081                 ;;
2082         esac
2083         __gitcomp "
2084                 add.ignoreErrors
2085                 advice.commitBeforeMerge
2086                 advice.detachedHead
2087                 advice.implicitIdentity
2088                 advice.pushNonFastForward
2089                 advice.resolveConflict
2090                 advice.statusHints
2091                 alias.
2092                 am.keepcr
2093                 apply.ignorewhitespace
2094                 apply.whitespace
2095                 branch.autosetupmerge
2096                 branch.autosetuprebase
2097                 browser.
2098                 clean.requireForce
2099                 color.branch
2100                 color.branch.current
2101                 color.branch.local
2102                 color.branch.plain
2103                 color.branch.remote
2104                 color.decorate.HEAD
2105                 color.decorate.branch
2106                 color.decorate.remoteBranch
2107                 color.decorate.stash
2108                 color.decorate.tag
2109                 color.diff
2110                 color.diff.commit
2111                 color.diff.frag
2112                 color.diff.func
2113                 color.diff.meta
2114                 color.diff.new
2115                 color.diff.old
2116                 color.diff.plain
2117                 color.diff.whitespace
2118                 color.grep
2119                 color.grep.context
2120                 color.grep.filename
2121                 color.grep.function
2122                 color.grep.linenumber
2123                 color.grep.match
2124                 color.grep.selected
2125                 color.grep.separator
2126                 color.interactive
2127                 color.interactive.error
2128                 color.interactive.header
2129                 color.interactive.help
2130                 color.interactive.prompt
2131                 color.pager
2132                 color.showbranch
2133                 color.status
2134                 color.status.added
2135                 color.status.changed
2136                 color.status.header
2137                 color.status.nobranch
2138                 color.status.untracked
2139                 color.status.updated
2140                 color.ui
2141                 commit.status
2142                 commit.template
2143                 core.abbrevguard
2144                 core.askpass
2145                 core.attributesfile
2146                 core.autocrlf
2147                 core.bare
2148                 core.bigFileThreshold
2149                 core.compression
2150                 core.createObject
2151                 core.deltaBaseCacheLimit
2152                 core.editor
2153                 core.eol
2154                 core.excludesfile
2155                 core.fileMode
2156                 core.fsyncobjectfiles
2157                 core.gitProxy
2158                 core.ignoreCygwinFSTricks
2159                 core.ignoreStat
2160                 core.ignorecase
2161                 core.logAllRefUpdates
2162                 core.loosecompression
2163                 core.notesRef
2164                 core.packedGitLimit
2165                 core.packedGitWindowSize
2166                 core.pager
2167                 core.preferSymlinkRefs
2168                 core.preloadindex
2169                 core.quotepath
2170                 core.repositoryFormatVersion
2171                 core.safecrlf
2172                 core.sharedRepository
2173                 core.sparseCheckout
2174                 core.symlinks
2175                 core.trustctime
2176                 core.warnAmbiguousRefs
2177                 core.whitespace
2178                 core.worktree
2179                 diff.autorefreshindex
2180                 diff.external
2181                 diff.ignoreSubmodules
2182                 diff.mnemonicprefix
2183                 diff.noprefix
2184                 diff.renameLimit
2185                 diff.renames
2186                 diff.suppressBlankEmpty
2187                 diff.tool
2188                 diff.wordRegex
2189                 difftool.
2190                 difftool.prompt
2191                 fetch.recurseSubmodules
2192                 fetch.unpackLimit
2193                 format.attach
2194                 format.cc
2195                 format.headers
2196                 format.numbered
2197                 format.pretty
2198                 format.signature
2199                 format.signoff
2200                 format.subjectprefix
2201                 format.suffix
2202                 format.thread
2203                 format.to
2204                 gc.
2205                 gc.aggressiveWindow
2206                 gc.auto
2207                 gc.autopacklimit
2208                 gc.packrefs
2209                 gc.pruneexpire
2210                 gc.reflogexpire
2211                 gc.reflogexpireunreachable
2212                 gc.rerereresolved
2213                 gc.rerereunresolved
2214                 gitcvs.allbinary
2215                 gitcvs.commitmsgannotation
2216                 gitcvs.dbTableNamePrefix
2217                 gitcvs.dbdriver
2218                 gitcvs.dbname
2219                 gitcvs.dbpass
2220                 gitcvs.dbuser
2221                 gitcvs.enabled
2222                 gitcvs.logfile
2223                 gitcvs.usecrlfattr
2224                 guitool.
2225                 gui.blamehistoryctx
2226                 gui.commitmsgwidth
2227                 gui.copyblamethreshold
2228                 gui.diffcontext
2229                 gui.encoding
2230                 gui.fastcopyblame
2231                 gui.matchtrackingbranch
2232                 gui.newbranchtemplate
2233                 gui.pruneduringfetch
2234                 gui.spellingdictionary
2235                 gui.trustmtime
2236                 help.autocorrect
2237                 help.browser
2238                 help.format
2239                 http.lowSpeedLimit
2240                 http.lowSpeedTime
2241                 http.maxRequests
2242                 http.minSessions
2243                 http.noEPSV
2244                 http.postBuffer
2245                 http.proxy
2246                 http.sslCAInfo
2247                 http.sslCAPath
2248                 http.sslCert
2249                 http.sslCertPasswordProtected
2250                 http.sslKey
2251                 http.sslVerify
2252                 http.useragent
2253                 i18n.commitEncoding
2254                 i18n.logOutputEncoding
2255                 imap.authMethod
2256                 imap.folder
2257                 imap.host
2258                 imap.pass
2259                 imap.port
2260                 imap.preformattedHTML
2261                 imap.sslverify
2262                 imap.tunnel
2263                 imap.user
2264                 init.templatedir
2265                 instaweb.browser
2266                 instaweb.httpd
2267                 instaweb.local
2268                 instaweb.modulepath
2269                 instaweb.port
2270                 interactive.singlekey
2271                 log.date
2272                 log.decorate
2273                 log.showroot
2274                 mailmap.file
2275                 man.
2276                 man.viewer
2277                 merge.
2278                 merge.conflictstyle
2279                 merge.log
2280                 merge.renameLimit
2281                 merge.renormalize
2282                 merge.stat
2283                 merge.tool
2284                 merge.verbosity
2285                 mergetool.
2286                 mergetool.keepBackup
2287                 mergetool.keepTemporaries
2288                 mergetool.prompt
2289                 notes.displayRef
2290                 notes.rewrite.
2291                 notes.rewrite.amend
2292                 notes.rewrite.rebase
2293                 notes.rewriteMode
2294                 notes.rewriteRef
2295                 pack.compression
2296                 pack.deltaCacheLimit
2297                 pack.deltaCacheSize
2298                 pack.depth
2299                 pack.indexVersion
2300                 pack.packSizeLimit
2301                 pack.threads
2302                 pack.window
2303                 pack.windowMemory
2304                 pager.
2305                 pretty.
2306                 pull.octopus
2307                 pull.twohead
2308                 push.default
2309                 rebase.autosquash
2310                 rebase.stat
2311                 receive.autogc
2312                 receive.denyCurrentBranch
2313                 receive.denyDeleteCurrent
2314                 receive.denyDeletes
2315                 receive.denyNonFastForwards
2316                 receive.fsckObjects
2317                 receive.unpackLimit
2318                 receive.updateserverinfo
2319                 remotes.
2320                 repack.usedeltabaseoffset
2321                 rerere.autoupdate
2322                 rerere.enabled
2323                 sendemail.
2324                 sendemail.aliasesfile
2325                 sendemail.aliasfiletype
2326                 sendemail.bcc
2327                 sendemail.cc
2328                 sendemail.cccmd
2329                 sendemail.chainreplyto
2330                 sendemail.confirm
2331                 sendemail.envelopesender
2332                 sendemail.from
2333                 sendemail.identity
2334                 sendemail.multiedit
2335                 sendemail.signedoffbycc
2336                 sendemail.smtpdomain
2337                 sendemail.smtpencryption
2338                 sendemail.smtppass
2339                 sendemail.smtpserver
2340                 sendemail.smtpserveroption
2341                 sendemail.smtpserverport
2342                 sendemail.smtpuser
2343                 sendemail.suppresscc
2344                 sendemail.suppressfrom
2345                 sendemail.thread
2346                 sendemail.to
2347                 sendemail.validate
2348                 showbranch.default
2349                 status.relativePaths
2350                 status.showUntrackedFiles
2351                 status.submodulesummary
2352                 submodule.
2353                 tar.umask
2354                 transfer.unpackLimit
2355                 url.
2356                 user.email
2357                 user.name
2358                 user.signingkey
2359                 web.browser
2360                 branch. remote.
2361         "
2362 }
2363
2364 _git_remote ()
2365 {
2366         local subcommands="add rename rm show prune update set-head"
2367         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2368         if [ -z "$subcommand" ]; then
2369                 __gitcomp "$subcommands"
2370                 return
2371         fi
2372
2373         case "$subcommand" in
2374         rename|rm|show|prune)
2375                 __gitcomp "$(__git_remotes)"
2376                 ;;
2377         update)
2378                 local i c='' IFS=$'\n'
2379                 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2380                         i="${i#remotes.}"
2381                         c="$c ${i/ */}"
2382                 done
2383                 __gitcomp "$c"
2384                 ;;
2385         *)
2386                 COMPREPLY=()
2387                 ;;
2388         esac
2389 }
2390
2391 _git_replace ()
2392 {
2393         __gitcomp "$(__git_refs)"
2394 }
2395
2396 _git_reset ()
2397 {
2398         __git_has_doubledash && return
2399
2400         local cur
2401         _get_comp_words_by_ref -n =: cur
2402         case "$cur" in
2403         --*)
2404                 __gitcomp "--merge --mixed --hard --soft --patch"
2405                 return
2406                 ;;
2407         esac
2408         __gitcomp "$(__git_refs)"
2409 }
2410
2411 _git_revert ()
2412 {
2413         local cur
2414         _get_comp_words_by_ref -n =: cur
2415         case "$cur" in
2416         --*)
2417                 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2418                 return
2419                 ;;
2420         esac
2421         __gitcomp "$(__git_refs)"
2422 }
2423
2424 _git_rm ()
2425 {
2426         __git_has_doubledash && return
2427
2428         local cur
2429         _get_comp_words_by_ref -n =: cur
2430         case "$cur" in
2431         --*)
2432                 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2433                 return
2434                 ;;
2435         esac
2436         COMPREPLY=()
2437 }
2438
2439 _git_shortlog ()
2440 {
2441         __git_has_doubledash && return
2442
2443         local cur
2444         _get_comp_words_by_ref -n =: cur
2445         case "$cur" in
2446         --*)
2447                 __gitcomp "
2448                         $__git_log_common_options
2449                         $__git_log_shortlog_options
2450                         --numbered --summary
2451                         "
2452                 return
2453                 ;;
2454         esac
2455         __git_complete_revlist
2456 }
2457
2458 _git_show ()
2459 {
2460         __git_has_doubledash && return
2461
2462         local cur
2463         _get_comp_words_by_ref -n =: cur
2464         case "$cur" in
2465         --pretty=*)
2466                 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2467                         " "" "${cur##--pretty=}"
2468                 return
2469                 ;;
2470         --format=*)
2471                 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2472                         " "" "${cur##--format=}"
2473                 return
2474                 ;;
2475         --*)
2476                 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2477                         $__git_diff_common_options
2478                         "
2479                 return
2480                 ;;
2481         esac
2482         __git_complete_file
2483 }
2484
2485 _git_show_branch ()
2486 {
2487         local cur
2488         _get_comp_words_by_ref -n =: cur
2489         case "$cur" in
2490         --*)
2491                 __gitcomp "
2492                         --all --remotes --topo-order --current --more=
2493                         --list --independent --merge-base --no-name
2494                         --color --no-color
2495                         --sha1-name --sparse --topics --reflog
2496                         "
2497                 return
2498                 ;;
2499         esac
2500         __git_complete_revlist
2501 }
2502
2503 _git_stash ()
2504 {
2505         local cur
2506         _get_comp_words_by_ref -n =: cur
2507         local save_opts='--keep-index --no-keep-index --quiet --patch'
2508         local subcommands='save list show apply clear drop pop create branch'
2509         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2510         if [ -z "$subcommand" ]; then
2511                 case "$cur" in
2512                 --*)
2513                         __gitcomp "$save_opts"
2514                         ;;
2515                 *)
2516                         if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2517                                 __gitcomp "$subcommands"
2518                         else
2519                                 COMPREPLY=()
2520                         fi
2521                         ;;
2522                 esac
2523         else
2524                 case "$subcommand,$cur" in
2525                 save,--*)
2526                         __gitcomp "$save_opts"
2527                         ;;
2528                 apply,--*|pop,--*)
2529                         __gitcomp "--index --quiet"
2530                         ;;
2531                 show,--*|drop,--*|branch,--*)
2532                         COMPREPLY=()
2533                         ;;
2534                 show,*|apply,*|drop,*|pop,*|branch,*)
2535                         __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
2536                                         | sed -n -e 's/:.*//p')"
2537                         ;;
2538                 *)
2539                         COMPREPLY=()
2540                         ;;
2541                 esac
2542         fi
2543 }
2544
2545 _git_submodule ()
2546 {
2547         __git_has_doubledash && return
2548
2549         local subcommands="add status init update summary foreach sync"
2550         if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2551                 local cur
2552                 _get_comp_words_by_ref -n =: cur
2553                 case "$cur" in
2554                 --*)
2555                         __gitcomp "--quiet --cached"
2556                         ;;
2557                 *)
2558                         __gitcomp "$subcommands"
2559                         ;;
2560                 esac
2561                 return
2562         fi
2563 }
2564
2565 _git_svn ()
2566 {
2567         local subcommands="
2568                 init fetch clone rebase dcommit log find-rev
2569                 set-tree commit-diff info create-ignore propget
2570                 proplist show-ignore show-externals branch tag blame
2571                 migrate mkdirs reset gc
2572                 "
2573         local subcommand="$(__git_find_on_cmdline "$subcommands")"
2574         if [ -z "$subcommand" ]; then
2575                 __gitcomp "$subcommands"
2576         else
2577                 local remote_opts="--username= --config-dir= --no-auth-cache"
2578                 local fc_opts="
2579                         --follow-parent --authors-file= --repack=
2580                         --no-metadata --use-svm-props --use-svnsync-props
2581                         --log-window-size= --no-checkout --quiet
2582                         --repack-flags --use-log-author --localtime
2583                         --ignore-paths= $remote_opts
2584                         "
2585                 local init_opts="
2586                         --template= --shared= --trunk= --tags=
2587                         --branches= --stdlayout --minimize-url
2588                         --no-metadata --use-svm-props --use-svnsync-props
2589                         --rewrite-root= --prefix= --use-log-author
2590                         --add-author-from $remote_opts
2591                         "
2592                 local cmt_opts="
2593                         --edit --rmdir --find-copies-harder --copy-similarity=
2594                         "
2595
2596                 local cur
2597                 _get_comp_words_by_ref -n =: cur
2598                 case "$subcommand,$cur" in
2599                 fetch,--*)
2600                         __gitcomp "--revision= --fetch-all $fc_opts"
2601                         ;;
2602                 clone,--*)
2603                         __gitcomp "--revision= $fc_opts $init_opts"
2604                         ;;
2605                 init,--*)
2606                         __gitcomp "$init_opts"
2607                         ;;
2608                 dcommit,--*)
2609                         __gitcomp "
2610                                 --merge --strategy= --verbose --dry-run
2611                                 --fetch-all --no-rebase --commit-url
2612                                 --revision $cmt_opts $fc_opts
2613                                 "
2614                         ;;
2615                 set-tree,--*)
2616                         __gitcomp "--stdin $cmt_opts $fc_opts"
2617                         ;;
2618                 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2619                 show-externals,--*|mkdirs,--*)
2620                         __gitcomp "--revision="
2621                         ;;
2622                 log,--*)
2623                         __gitcomp "
2624                                 --limit= --revision= --verbose --incremental
2625                                 --oneline --show-commit --non-recursive
2626                                 --authors-file= --color
2627                                 "
2628                         ;;
2629                 rebase,--*)
2630                         __gitcomp "
2631                                 --merge --verbose --strategy= --local
2632                                 --fetch-all --dry-run $fc_opts
2633                                 "
2634                         ;;
2635                 commit-diff,--*)
2636                         __gitcomp "--message= --file= --revision= $cmt_opts"
2637                         ;;
2638                 info,--*)
2639                         __gitcomp "--url"
2640                         ;;
2641                 branch,--*)
2642                         __gitcomp "--dry-run --message --tag"
2643                         ;;
2644                 tag,--*)
2645                         __gitcomp "--dry-run --message"
2646                         ;;
2647                 blame,--*)
2648                         __gitcomp "--git-format"
2649                         ;;
2650                 migrate,--*)
2651                         __gitcomp "
2652                                 --config-dir= --ignore-paths= --minimize
2653                                 --no-auth-cache --username=
2654                                 "
2655                         ;;
2656                 reset,--*)
2657                         __gitcomp "--revision= --parent"
2658                         ;;
2659                 *)
2660                         COMPREPLY=()
2661                         ;;
2662                 esac
2663         fi
2664 }
2665
2666 _git_tag ()
2667 {
2668         local i c=1 f=0
2669         local words cword prev
2670         _get_comp_words_by_ref -n =: words cword prev
2671         while [ $c -lt $cword ]; do
2672                 i="${words[c]}"
2673                 case "$i" in
2674                 -d|-v)
2675                         __gitcomp "$(__git_tags)"
2676                         return
2677                         ;;
2678                 -f)
2679                         f=1
2680                         ;;
2681                 esac
2682                 c=$((++c))
2683         done
2684
2685         case "$prev" in
2686         -m|-F)
2687                 COMPREPLY=()
2688                 ;;
2689         -*|tag)
2690                 if [ $f = 1 ]; then
2691                         __gitcomp "$(__git_tags)"
2692                 else
2693                         COMPREPLY=()
2694                 fi
2695                 ;;
2696         *)
2697                 __gitcomp "$(__git_refs)"
2698                 ;;
2699         esac
2700 }
2701
2702 _git_whatchanged ()
2703 {
2704         _git_log
2705 }
2706
2707 _git ()
2708 {
2709         local i c=1 command __git_dir
2710
2711         if [[ -n ${ZSH_VERSION-} ]]; then
2712                 emulate -L bash
2713                 setopt KSH_TYPESET
2714         fi
2715
2716         local cur words cword
2717         _get_comp_words_by_ref -n =: cur words cword
2718         while [ $c -lt $cword ]; do
2719                 i="${words[c]}"
2720                 case "$i" in
2721                 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2722                 --bare)      __git_dir="." ;;
2723                 --version|-p|--paginate) ;;
2724                 --help) command="help"; break ;;
2725                 *) command="$i"; break ;;
2726                 esac
2727                 c=$((++c))
2728         done
2729
2730         if [ -z "$command" ]; then
2731                 case "$cur" in
2732                 --*)   __gitcomp "
2733                         --paginate
2734                         --no-pager
2735                         --git-dir=
2736                         --bare
2737                         --version
2738                         --exec-path
2739                         --html-path
2740                         --work-tree=
2741                         --help
2742                         "
2743                         ;;
2744                 *)     __git_compute_porcelain_commands
2745                        __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2746                 esac
2747                 return
2748         fi
2749
2750         local completion_func="_git_${command//-/_}"
2751         declare -f $completion_func >/dev/null && $completion_func && return
2752
2753         local expansion=$(__git_aliased_command "$command")
2754         if [ -n "$expansion" ]; then
2755                 completion_func="_git_${expansion//-/_}"
2756                 declare -f $completion_func >/dev/null && $completion_func
2757         fi
2758 }
2759
2760 _gitk ()
2761 {
2762         if [[ -n ${ZSH_VERSION-} ]]; then
2763                 emulate -L bash
2764                 setopt KSH_TYPESET
2765         fi
2766
2767         __git_has_doubledash && return
2768
2769         local cur
2770         local g="$(__gitdir)"
2771         local merge=""
2772         if [ -f "$g/MERGE_HEAD" ]; then
2773                 merge="--merge"
2774         fi
2775         _get_comp_words_by_ref -n =: cur
2776         case "$cur" in
2777         --*)
2778                 __gitcomp "
2779                         $__git_log_common_options
2780                         $__git_log_gitk_options
2781                         $merge
2782                         "
2783                 return
2784                 ;;
2785         esac
2786         __git_complete_revlist
2787 }
2788
2789 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2790         || complete -o default -o nospace -F _git git
2791 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2792         || complete -o default -o nospace -F _gitk gitk
2793
2794 # The following are necessary only for Cygwin, and only are needed
2795 # when the user has tab-completed the executable name and consequently
2796 # included the '.exe' suffix.
2797 #
2798 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2799 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2800         || complete -o default -o nospace -F _git git.exe
2801 fi
2802
2803 if [[ -n ${ZSH_VERSION-} ]]; then
2804         shopt () {
2805                 local option
2806                 if [ $# -ne 2 ]; then
2807                         echo "USAGE: $0 (-q|-s|-u) <option>" >&2
2808                         return 1
2809                 fi
2810                 case "$2" in
2811                 nullglob)
2812                         option="$2"
2813                         ;;
2814                 *)
2815                         echo "$0: invalid option: $2" >&2
2816                         return 1
2817                 esac
2818                 case "$1" in
2819                 -q)     setopt | grep -q "$option" ;;
2820                 -u)     unsetopt "$option" ;;
2821                 -s)     setopt "$option" ;;
2822                 *)
2823                         echo "$0: invalid flag: $1" >&2
2824                         return 1
2825                 esac
2826         }
2827 fi