Code

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