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