Code

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