Code

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