3 # bash/zsh completion support for core Git.
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.
9 # The contained completion routines provide support for completing:
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
18 # To use these routines:
20 # 1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
21 # 2) Add the following line to your .bashrc/.zshrc:
22 # source ~/.git-completion.sh
24 # 3) Consider changing your PS1 to also show the current branch:
25 # Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
26 # ZSH: PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
28 # The argument to __git_ps1 will be displayed only if you
29 # are currently in a git repository. The %s token will be
30 # the name of the current branch.
32 # In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
33 # value, unstaged (*) and staged (+) changes will be shown next
34 # to the branch name. You can configure this per-repository
35 # with the bash.showDirtyState variable, which defaults to true
36 # once GIT_PS1_SHOWDIRTYSTATE is enabled.
38 # You can also see if currently something is stashed, by setting
39 # GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
40 # then a '$' will be shown next to the branch name.
42 # If you would like to see if there're untracked files, then you can
43 # set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
44 # untracked files, then a '%' will be shown next to the branch name.
46 # If you would like to see the difference between HEAD and its
47 # upstream, set GIT_PS1_SHOWUPSTREAM="auto". A "<" indicates
48 # you are behind, ">" indicates you are ahead, and "<>"
49 # indicates you have diverged. You can further control
50 # behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated
52 # verbose show number of commits ahead/behind (+/-) upstream
53 # legacy don't use the '--count' option available in recent
54 # versions of git-rev-list
55 # git always compare HEAD to @{upstream}
56 # svn always compare HEAD to your SVN upstream
57 # By default, __git_ps1 will compare HEAD to your SVN upstream
58 # if it can find one, or @{upstream} otherwise. Once you have
59 # set GIT_PS1_SHOWUPSTREAM, you can override it on a
60 # per-repository basis by setting the bash.showUpstream config
66 # *) Read Documentation/SubmittingPatches
67 # *) Send all patches to the current maintainer:
69 # "Shawn O. Pearce" <spearce@spearce.org>
71 # *) Always CC the Git mailing list:
76 if [[ -n ${ZSH_VERSION-} ]]; then
77 autoload -U +X bashcompinit && bashcompinit
80 case "$COMP_WORDBREAKS" in
82 *) COMP_WORDBREAKS="$COMP_WORDBREAKS:"
85 # __gitdir accepts 0 or 1 arguments (i.e., location)
86 # returns location of .git repo
89 if [ -z "${1-}" ]; then
90 if [ -n "${__git_dir-}" ]; then
92 elif [ -d .git ]; then
95 git rev-parse --git-dir 2>/dev/null
97 elif [ -d "$1/.git" ]; then
104 # stores the divergence from upstream in $p
105 # used by GIT_PS1_SHOWUPSTREAM
106 __git_ps1_show_upstream ()
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
116 GIT_PS1_SHOWUPSTREAM="$value"
117 if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
123 svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
124 svn_url_pattern+="\\|$value"
125 upstream=svn+git # default upstream is SVN if available, else git
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
133 git|svn) upstream="$option" ;;
134 verbose) verbose=1 ;;
141 git) upstream="@{upstream}" ;;
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]}}
155 if [[ -z "$svn_upstream" ]]; then
156 # default branch name for checkouts with no layout:
157 upstream=${GIT_SVN_ID:-git-svn}
159 upstream=${svn_upstream#/}
161 elif [[ "svn+git" = "$upstream" ]]; then
162 upstream="@{upstream}"
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)"
172 # produce equivalent output to --count for older versions of git
174 if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
176 local commit behind=0 ahead=0
177 for commit in $commits
186 count="$behind $ahead"
192 # calculate the result
193 if [[ -z "$verbose" ]]; then
197 "0 0") # equal to upstream
199 "0 "*) # ahead of upstream
201 *" 0") # behind upstream
203 *) # diverged from upstream
210 "0 0") # equal to upstream
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% *}" ;;
224 # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
225 # returns text to add to bash PS1 prompt (includes branch name)
228 local g="$(__gitdir)"
232 if [ -f "$g/rebase-merge/interactive" ]; then
234 b="$(cat "$g/rebase-merge/head-name")"
235 elif [ -d "$g/rebase-merge" ]; then
237 b="$(cat "$g/rebase-merge/head-name")"
239 if [ -d "$g/rebase-apply" ]; then
240 if [ -f "$g/rebase-apply/rebasing" ]; then
242 elif [ -f "$g/rebase-apply/applying" ]; then
247 elif [ -f "$g/MERGE_HEAD" ]; then
249 elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
251 elif [ -f "$g/BISECT_LOG" ]; then
255 b="$(git symbolic-ref HEAD 2>/dev/null)" || {
258 case "${GIT_PS1_DESCRIBE_STYLE-}" in
260 git describe --contains HEAD ;;
262 git describe --contains --all HEAD ;;
266 git describe --tags --exact-match HEAD ;;
267 esac 2>/dev/null)" ||
269 b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
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
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="+"
299 if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
300 git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
303 if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
304 if [ -n "$(git ls-files --others --exclude-standard)" ]; then
309 if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
310 __git_ps1_show_upstream
315 printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p"
319 # __gitcomp_1 requires 2 arguments
322 local c IFS=' '$'\t'$'\n'
325 --*=*) printf %s$'\n' "$c$2" ;;
326 *.) printf %s$'\n' "$c$2" ;;
327 *) printf %s$'\n' "$c$2 " ;;
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)
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/
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
369 # The argument should be a collection of characters from the list of
370 # word completion separators (COMP_WORDBREAKS) to treat as ordinary
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]}"
391 if [ -z "$exclude" ]; then
392 words_=("${COMP_WORDS[@]}")
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.
403 [ -n "${COMP_WORDS[$i]}" ] &&
404 # word consists of excluded word separators
405 [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
407 # Attach to the previous token,
408 # unless the previous token is the command name.
409 if [ $j -ge 2 ] && [ -n "$first" ]; then
413 words_[$j]=${words_[j]}${COMP_WORDS[i]}
414 if [ $i = $COMP_CWORD ]; then
417 if (($i < ${#COMP_WORDS[@]} - 1)); then
424 words_[$j]=${words_[j]}${COMP_WORDS[i]}
425 if [ $i = $COMP_CWORD ]; then
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
440 __git_reassemble_comp_words_by_ref "$exclude"
441 cur_=${words_[cword_]}
442 while [ $# -gt 0 ]; do
448 prev=${words_[$cword_-1]}
451 words=("${words_[@]}")
461 _get_comp_words_by_ref ()
463 while [ $# -gt 0 ]; do
466 cur=${COMP_WORDS[COMP_CWORD]}
469 prev=${COMP_WORDS[COMP_CWORD-1]}
472 words=("${COMP_WORDS[@]}")
478 # assume COMP_WORDBREAKS is already set sanely
488 # Generates completion reply with compgen, appending a space to possible
489 # completion words, if necessary.
490 # It accepts 1 to 4 arguments:
491 # 1: List of possible completion words.
492 # 2: A prefix to be added to each possible completion word (optional).
493 # 3: Generate possible completion matches for this word (optional).
494 # 4: A suffix to be appended to each possible completion word (optional).
499 if [ $# -gt 2 ]; then
508 COMPREPLY=($(compgen -P "${2-}" \
509 -W "$(__gitcomp_1 "${1-}" "${4-}")" \
515 # Generates completion reply with compgen from newline-separated possible
516 # completion words by appending a space to all of them.
517 # It accepts 1 to 4 arguments:
518 # 1: List of possible completion words, separated by a single newline.
519 # 2: A prefix to be added to each possible completion word (optional).
520 # 3: Generate possible completion matches for this word (optional).
521 # 4: A suffix to be appended to each possible completion word instead of
522 # the default space (optional). If specified but empty, nothing is
526 local s=$'\n' IFS=' '$'\t'$'\n'
527 local cur_="$cur" suffix=" "
529 if [ $# -gt 2 ]; then
531 if [ $# -gt 3 ]; then
537 COMPREPLY=($(compgen -P "${2-}" -S "$suffix" -W "$1" -- "$cur_"))
542 local dir="$(__gitdir)"
543 if [ -d "$dir" ]; then
544 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
552 local dir="$(__gitdir)"
553 if [ -d "$dir" ]; then
554 git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
560 # __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
561 # presence of 2nd argument means use the guess heuristic employed
562 # by checkout for tracking branches
565 local i hash dir="$(__gitdir "${1-}")" track="${2-}"
567 if [ -d "$dir" ]; then
575 for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
576 if [ -e "$dir/$i" ]; then echo $i; fi
578 format="refname:short"
579 refs="refs/tags refs/heads refs/remotes"
582 git --git-dir="$dir" for-each-ref --format="%($format)" \
584 if [ -n "$track" ]; then
585 # employ the heuristic used by git checkout
586 # Try to find a remote branch that matches the completion word
587 # but only output if the branch name is unique
589 git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
594 if [[ "$ref" == "$cur"* ]]; then
603 git ls-remote "$dir" "$cur*" 2>/dev/null | \
604 while read hash i; do
612 git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \
613 while read hash i; do
616 refs/*) echo "${i#refs/*/}" ;;
624 # __git_refs2 requires 1 argument (to pass to __git_refs)
628 for i in $(__git_refs "$1"); do
633 # __git_refs_remotes requires 1 argument (to pass to ls-remote)
634 __git_refs_remotes ()
637 git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
638 while read hash i; do
639 echo "$i:refs/remotes/$1/${i#refs/heads/}"
645 local i ngoff IFS=$'\n' d="$(__gitdir)"
646 __git_shopt -q nullglob || ngoff=1
647 __git_shopt -s nullglob
648 for i in "$d/remotes"/*; do
649 echo ${i#$d/remotes/}
651 [ "$ngoff" ] && __git_shopt -u nullglob
652 for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
658 __git_list_merge_strategies ()
660 git merge -s help 2>&1 |
661 sed -n -e '/[Aa]vailable strategies are: /,/^$/{
670 __git_merge_strategies=
671 # 'git merge -s help' (and thus detection of the merge strategy
672 # list) fails, unfortunately, if run outside of any git working
673 # tree. __git_merge_strategies is set to the empty string in
674 # that case, and the detection will be repeated the next time it
676 __git_compute_merge_strategies ()
678 : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
681 __git_complete_revlist_file ()
683 local pfx ls ref cur_="$cur"
703 case "$COMP_WORDBREAKS" in
705 *) pfx="$ref:$pfx" ;;
709 COMPREPLY=($(compgen -P "$pfx" \
710 -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
711 | sed '/^100... blob /{
727 pfx="${cur_%...*}..."
729 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
734 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
737 __gitcomp_nl "$(__git_refs)"
743 __git_complete_file ()
745 __git_complete_revlist_file
748 __git_complete_revlist ()
750 __git_complete_revlist_file
753 __git_complete_remote_or_refspec ()
755 local cur_="$cur" cmd="${words[1]}"
756 local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
757 while [ $c -lt $cword ]; do
760 --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
763 push) no_complete_refspec=1 ;;
772 *) remote="$i"; break ;;
776 if [ -z "$remote" ]; then
777 __gitcomp_nl "$(__git_remotes)"
780 if [ $no_complete_refspec = 1 ]; then
784 [ "$remote" = "." ] && remote=
787 case "$COMP_WORDBREAKS" in
789 *) pfx="${cur_%%:*}:" ;;
801 if [ $lhs = 1 ]; then
802 __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
804 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
808 if [ $lhs = 1 ]; then
809 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
811 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
815 if [ $lhs = 1 ]; then
816 __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
818 __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
824 __git_complete_strategy ()
826 __git_compute_merge_strategies
829 __gitcomp "$__git_merge_strategies"
834 __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
841 __git_list_all_commands ()
844 for i in $(git help -a|egrep '^ [a-zA-Z0-9]')
847 *--*) : helper pattern;;
854 __git_compute_all_commands ()
856 : ${__git_all_commands:=$(__git_list_all_commands)}
859 __git_list_porcelain_commands ()
862 __git_compute_all_commands
863 for i in "help" $__git_all_commands
866 *--*) : helper pattern;;
867 applymbox) : ask gittus;;
868 applypatch) : ask gittus;;
869 archimport) : import;;
870 cat-file) : plumbing;;
871 check-attr) : plumbing;;
872 check-ref-format) : plumbing;;
873 checkout-index) : plumbing;;
874 commit-tree) : plumbing;;
875 count-objects) : infrequent;;
876 cvsexportcommit) : export;;
877 cvsimport) : import;;
878 cvsserver) : daemon;;
880 diff-files) : plumbing;;
881 diff-index) : plumbing;;
882 diff-tree) : plumbing;;
883 fast-import) : import;;
884 fast-export) : export;;
885 fsck-objects) : plumbing;;
886 fetch-pack) : plumbing;;
887 fmt-merge-msg) : plumbing;;
888 for-each-ref) : plumbing;;
889 hash-object) : plumbing;;
890 http-*) : transport;;
891 index-pack) : plumbing;;
892 init-db) : deprecated;;
893 local-fetch) : plumbing;;
894 lost-found) : infrequent;;
895 ls-files) : plumbing;;
896 ls-remote) : plumbing;;
897 ls-tree) : plumbing;;
898 mailinfo) : plumbing;;
899 mailsplit) : plumbing;;
900 merge-*) : plumbing;;
903 pack-objects) : plumbing;;
904 pack-redundant) : plumbing;;
905 pack-refs) : plumbing;;
906 parse-remote) : plumbing;;
907 patch-id) : plumbing;;
908 peek-remote) : plumbing;;
910 prune-packed) : plumbing;;
911 quiltimport) : import;;
912 read-tree) : plumbing;;
913 receive-pack) : plumbing;;
914 remote-*) : transport;;
915 repo-config) : deprecated;;
917 rev-list) : plumbing;;
918 rev-parse) : plumbing;;
919 runstatus) : plumbing;;
920 sh-setup) : internal;;
922 show-ref) : plumbing;;
923 send-pack) : plumbing;;
924 show-index) : plumbing;;
926 stripspace) : plumbing;;
927 symbolic-ref) : plumbing;;
928 tar-tree) : deprecated;;
929 unpack-file) : plumbing;;
930 unpack-objects) : plumbing;;
931 update-index) : plumbing;;
932 update-ref) : plumbing;;
933 update-server-info) : daemon;;
934 upload-archive) : plumbing;;
935 upload-pack) : plumbing;;
936 write-tree) : plumbing;;
938 verify-pack) : infrequent;;
939 verify-tag) : plumbing;;
945 __git_porcelain_commands=
946 __git_compute_porcelain_commands ()
948 __git_compute_all_commands
949 : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
952 __git_pretty_aliases ()
955 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
968 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
978 # __git_aliased_command requires 1 argument
979 __git_aliased_command ()
981 local word cmdline=$(git --git-dir="$(__gitdir)" \
982 config --get "alias.$1")
983 for word in $cmdline; do
989 \!*) : shell command alias ;;
991 *=*) : setting env ;;
1000 # __git_find_on_cmdline requires 1 argument
1001 __git_find_on_cmdline ()
1003 local word subcommand c=1
1004 while [ $c -lt $cword ]; do
1006 for subcommand in $1; do
1007 if [ "$subcommand" = "$word" ]; then
1016 __git_has_doubledash ()
1019 while [ $c -lt $cword ]; do
1020 if [ "--" = "${words[c]}" ]; then
1028 __git_whitespacelist="nowarn warn error error-all fix"
1032 local dir="$(__gitdir)"
1033 if [ -d "$dir"/rebase-apply ]; then
1034 __gitcomp "--skip --continue --resolved --abort"
1039 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1044 --3way --committer-date-is-author-date --ignore-date
1045 --ignore-whitespace --ignore-space-change
1046 --interactive --keep --no-utf8 --signoff --utf8
1047 --whitespace= --scissors
1058 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1063 --stat --numstat --summary --check --index
1064 --cached --index-info --reverse --reject --unidiff-zero
1065 --apply --no-add --exclude=
1066 --ignore-whitespace --ignore-space-change
1067 --whitespace= --inaccurate-eof --verbose
1076 __git_has_doubledash && return
1081 --interactive --refresh --patch --update --dry-run
1082 --ignore-errors --intent-to-add
1093 __gitcomp "$(git archive --list)" "" "${cur##--format=}"
1097 __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
1102 --format= --list --verbose
1103 --prefix= --remote= --exec=
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"
1121 __gitcomp "replay start"
1126 case "$subcommand" in
1127 bad|good|reset|skip|start)
1128 __gitcomp_nl "$(__git_refs)"
1138 local i c=1 only_local_ref="n" has_r="n"
1140 while [ $c -lt $cword ]; do
1143 -d|-m) only_local_ref="y" ;;
1152 --color --no-color --verbose --abbrev= --no-abbrev
1153 --track --no-track --contains --merged --no-merged
1158 if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1159 __gitcomp_nl "$(__git_heads)"
1161 __gitcomp_nl "$(__git_refs)"
1169 local cmd="${words[2]}"
1172 __gitcomp "create list-heads verify unbundle"
1175 # looking for a file
1180 __git_complete_revlist
1189 __git_has_doubledash && return
1193 __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1197 --quiet --ours --theirs --track --no-track --merge
1198 --conflict= --orphan --patch
1202 # check if --track, --no-track, or --no-guess was specified
1203 # if so, disable DWIM mode
1204 local flags="--track --no-track --no-guess" track=1
1205 if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1208 __gitcomp_nl "$(__git_refs '' $track)"
1215 __gitcomp "$(__git_refs)"
1222 __gitcomp "--edit --no-commit"
1225 __gitcomp_nl "$(__git_refs)"
1232 __git_has_doubledash && return
1236 __gitcomp "--dry-run --quiet"
1269 __git_has_doubledash && return
1273 __gitcomp "default strip verbatim whitespace
1274 " "" "${cur##--cleanup=}"
1277 --reuse-message=*|--reedit-message=*|\
1278 --fixup=*|--squash=*)
1279 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1282 --untracked-files=*)
1283 __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1288 --all --author= --signoff --verify --no-verify
1289 --edit --amend --include --only --interactive
1290 --dry-run --reuse-message= --reedit-message=
1291 --reset-author --file= --message= --template=
1292 --cleanup= --untracked-files --untracked-files=
1293 --verbose --quiet --fixup= --squash=
1305 --all --tags --contains --abbrev= --candidates=
1306 --exact-match --debug --long --match --always
1310 __gitcomp_nl "$(__git_refs)"
1313 __git_diff_common_options="--stat --numstat --shortstat --summary
1314 --patch-with-stat --name-only --name-status --color
1315 --no-color --color-words --no-renames --check
1316 --full-index --binary --abbrev --diff-filter=
1317 --find-copies-harder
1318 --text --ignore-space-at-eol --ignore-space-change
1319 --ignore-all-space --exit-code --quiet --ext-diff
1321 --no-prefix --src-prefix= --dst-prefix=
1322 --inter-hunk-context=
1325 --dirstat --dirstat= --dirstat-by-file
1326 --dirstat-by-file= --cumulative
1331 __git_has_doubledash && return
1335 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1336 --base --ours --theirs --no-index
1337 $__git_diff_common_options
1342 __git_complete_revlist_file
1345 __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1346 tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3
1351 __git_has_doubledash && return
1355 __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1359 __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1360 --base --ours --theirs
1361 --no-renames --diff-filter= --find-copies-harder
1362 --relative --ignore-submodules
1370 __git_fetch_options="
1371 --quiet --verbose --append --upload-pack --force --keep --depth=
1372 --tags --no-tags --all --prune --dry-run
1379 __gitcomp "$__git_fetch_options"
1383 __git_complete_remote_or_refspec
1386 _git_format_patch ()
1392 " "" "${cur##--thread=}"
1397 --stdout --attach --no-attach --thread --thread=
1399 --numbered --start-number
1402 --signoff --signature --no-signature
1403 --in-reply-to= --cc=
1404 --full-index --binary
1407 --no-prefix --src-prefix= --dst-prefix=
1408 --inline --suffix= --ignore-if-in-upstream
1414 __git_complete_revlist
1422 --tags --root --unreachable --cache --no-reflogs --full
1423 --strict --verbose --lost-found
1435 __gitcomp "--prune --aggressive"
1449 __git_has_doubledash && return
1455 --text --ignore-case --word-regexp --invert-match
1456 --full-name --line-number
1457 --extended-regexp --basic-regexp --fixed-strings
1459 --files-with-matches --name-only
1460 --files-without-match
1463 --and --or --not --all-match
1469 __gitcomp_nl "$(__git_refs)"
1476 __gitcomp "--all --info --man --web"
1480 __git_compute_all_commands
1481 __gitcomp "$__git_all_commands $(__git_aliases)
1482 attributes cli core-tutorial cvs-migration
1483 diffcore gitk glossary hooks ignore modules
1484 namespaces repository-layout tutorial tutorial-2
1494 false true umask group all world everybody
1495 " "" "${cur##--shared=}"
1499 __gitcomp "--quiet --bare --template= --shared --shared="
1508 __git_has_doubledash && return
1512 __gitcomp "--cached --deleted --modified --others --ignored
1513 --stage --directory --no-empty-directory --unmerged
1514 --killed --exclude= --exclude-from=
1515 --exclude-per-directory= --exclude-standard
1516 --error-unmatch --with-tree= --full-name
1517 --abbrev --ignored --exclude-per-directory
1527 __gitcomp_nl "$(__git_remotes)"
1535 # Options that go well for log, shortlog and gitk
1536 __git_log_common_options="
1538 --branches --tags --remotes
1539 --first-parent --merges --no-merges
1541 --max-age= --since= --after=
1542 --min-age= --until= --before=
1543 --min-parents= --max-parents=
1544 --no-min-parents --no-max-parents
1546 # Options that go well for log and gitk (not shortlog)
1547 __git_log_gitk_options="
1548 --dense --sparse --full-history
1549 --simplify-merges --simplify-by-decoration
1550 --left-right --notes --no-notes
1552 # Options that go well for log and shortlog (not gitk)
1553 __git_log_shortlog_options="
1554 --author= --committer= --grep=
1558 __git_log_pretty_formats="oneline short medium full fuller email raw format:"
1559 __git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1563 __git_has_doubledash && return
1565 local g="$(git rev-parse --git-dir 2>/dev/null)"
1567 if [ -f "$g/MERGE_HEAD" ]; then
1571 --pretty=*|--format=*)
1572 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1577 __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1581 __gitcomp "long short" "" "${cur##--decorate=}"
1586 $__git_log_common_options
1587 $__git_log_shortlog_options
1588 $__git_log_gitk_options
1589 --root --topo-order --date-order --reverse
1590 --follow --full-diff
1591 --abbrev-commit --abbrev=
1592 --relative-date --date=
1593 --pretty= --format= --oneline
1596 --decorate --decorate=
1598 --parents --children
1600 $__git_diff_common_options
1601 --pickaxe-all --pickaxe-regex
1606 __git_complete_revlist
1609 __git_merge_options="
1610 --no-commit --no-stat --log --no-log --squash --strategy
1611 --commit --stat --no-squash --ff --no-ff --ff-only
1616 __git_complete_strategy && return
1620 __gitcomp "$__git_merge_options"
1623 __gitcomp_nl "$(__git_refs)"
1630 __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1643 __gitcomp_nl "$(__git_refs)"
1650 __gitcomp "--dry-run"
1659 __gitcomp "--tags --all --stdin"
1664 local subcommands='add append copy edit list prune remove show'
1665 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1667 case "$subcommand,$cur" in
1672 case "${words[cword-1]}" in
1674 __gitcomp_nl "$(__git_refs)"
1677 __gitcomp "$subcommands --ref"
1681 add,--reuse-message=*|append,--reuse-message=*|\
1682 add,--reedit-message=*|append,--reedit-message=*)
1683 __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1686 __gitcomp '--file= --message= --reedit-message=
1693 __gitcomp '--dry-run --verbose'
1698 case "${words[cword-1]}" in
1702 __gitcomp_nl "$(__git_refs)"
1711 __git_complete_strategy && return
1716 --rebase --no-rebase
1717 $__git_merge_options
1718 $__git_fetch_options
1723 __git_complete_remote_or_refspec
1730 __gitcomp_nl "$(__git_remotes)"
1735 __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1740 --all --mirror --tags --dry-run --force --verbose
1741 --receive-pack= --repo= --set-upstream
1746 __git_complete_remote_or_refspec
1751 local dir="$(__gitdir)"
1752 if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1753 __gitcomp "--continue --skip --abort"
1756 __git_complete_strategy && return
1759 __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1764 --onto --merge --strategy --interactive
1765 --preserve-merges --stat --no-stat
1766 --committer-date-is-author-date --ignore-date
1767 --ignore-whitespace --whitespace=
1773 __gitcomp_nl "$(__git_refs)"
1778 local subcommands="show delete expire"
1779 local subcommand="$(__git_find_on_cmdline "$subcommands")"
1781 if [ -z "$subcommand" ]; then
1782 __gitcomp "$subcommands"
1784 __gitcomp_nl "$(__git_refs)"
1788 __git_send_email_confirm_options="always never auto cc compose"
1789 __git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1796 $__git_send_email_confirm_options
1797 " "" "${cur##--confirm=}"
1802 $__git_send_email_suppresscc_options
1803 " "" "${cur##--suppress-cc=}"
1807 --smtp-encryption=*)
1808 __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1812 __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1813 --compose --confirm= --dry-run --envelope-sender
1815 --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1816 --no-suppress-from --no-thread --quiet
1817 --signed-off-by-cc --smtp-pass --smtp-server
1818 --smtp-server-port --smtp-encryption= --smtp-user
1819 --subject --suppress-cc= --suppress-from --thread --to
1820 --validate --no-validate"
1832 __git_config_get_set_variables ()
1834 local prevword word config_file= c=$cword
1835 while [ $c -gt 1 ]; do
1838 --global|--system|--file=*)
1843 config_file="$word $prevword"
1851 git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1866 __gitcomp_nl "$(__git_remotes)"
1870 __gitcomp_nl "$(__git_refs)"
1874 local remote="${prev#remote.}"
1875 remote="${remote%.fetch}"
1876 if [ -z "$cur" ]; then
1877 COMPREPLY=("refs/heads/")
1880 __gitcomp_nl "$(__git_refs_remotes "$remote")"
1884 local remote="${prev#remote.}"
1885 remote="${remote%.push}"
1886 __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1887 for-each-ref --format='%(refname):%(refname)' \
1891 pull.twohead|pull.octopus)
1892 __git_compute_merge_strategies
1893 __gitcomp "$__git_merge_strategies"
1896 color.branch|color.diff|color.interactive|\
1897 color.showbranch|color.status|color.ui)
1898 __gitcomp "always never auto"
1902 __gitcomp "false true"
1907 normal black red green yellow blue magenta cyan white
1908 bold dim ul blink reverse
1913 __gitcomp "man info web html"
1917 __gitcomp "$__git_log_date_formats"
1920 sendemail.aliasesfiletype)
1921 __gitcomp "mutt mailrc pine elm gnus"
1925 __gitcomp "$__git_send_email_confirm_options"
1928 sendemail.suppresscc)
1929 __gitcomp "$__git_send_email_suppresscc_options"
1932 --get|--get-all|--unset|--unset-all)
1933 __gitcomp_nl "$(__git_config_get_set_variables)"
1944 --global --system --file=
1945 --list --replace-all
1946 --get --get-all --get-regexp
1947 --add --unset --unset-all
1948 --remove-section --rename-section
1953 local pfx="${cur%.*}." cur_="${cur##*.}"
1954 __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
1958 local pfx="${cur%.*}." cur_="${cur#*.}"
1959 __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1963 local pfx="${cur%.*}." cur_="${cur##*.}"
1965 argprompt cmd confirm needsfile noconsole norescan
1966 prompt revprompt revunmerged title
1971 local pfx="${cur%.*}." cur_="${cur##*.}"
1972 __gitcomp "cmd path" "$pfx" "$cur_"
1976 local pfx="${cur%.*}." cur_="${cur##*.}"
1977 __gitcomp "cmd path" "$pfx" "$cur_"
1981 local pfx="${cur%.*}." cur_="${cur##*.}"
1982 __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1986 local pfx="${cur%.*}." cur_="${cur#*.}"
1987 __git_compute_all_commands
1988 __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1992 local pfx="${cur%.*}." cur_="${cur##*.}"
1994 url proxy fetch push mirror skipDefaultUpdate
1995 receivepack uploadpack tagopt pushurl
2000 local pfx="${cur%.*}." cur_="${cur#*.}"
2001 __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
2005 local pfx="${cur%.*}." cur_="${cur##*.}"
2006 __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2012 advice.commitBeforeMerge
2014 advice.implicitIdentity
2015 advice.pushNonFastForward
2016 advice.resolveConflict
2020 apply.ignorewhitespace
2022 branch.autosetupmerge
2023 branch.autosetuprebase
2027 color.branch.current
2032 color.decorate.branch
2033 color.decorate.remoteBranch
2034 color.decorate.stash
2044 color.diff.whitespace
2049 color.grep.linenumber
2052 color.grep.separator
2054 color.interactive.error
2055 color.interactive.header
2056 color.interactive.help
2057 color.interactive.prompt
2062 color.status.changed
2064 color.status.nobranch
2065 color.status.untracked
2066 color.status.updated
2075 core.bigFileThreshold
2078 core.deltaBaseCacheLimit
2083 core.fsyncobjectfiles
2085 core.ignoreCygwinFSTricks
2088 core.logAllRefUpdates
2089 core.loosecompression
2092 core.packedGitWindowSize
2094 core.preferSymlinkRefs
2097 core.repositoryFormatVersion
2099 core.sharedRepository
2103 core.warnAmbiguousRefs
2106 diff.autorefreshindex
2108 diff.ignoreSubmodules
2113 diff.suppressBlankEmpty
2118 fetch.recurseSubmodules
2127 format.subjectprefix
2138 gc.reflogexpireunreachable
2142 gitcvs.commitmsgannotation
2143 gitcvs.dbTableNamePrefix
2154 gui.copyblamethreshold
2158 gui.matchtrackingbranch
2159 gui.newbranchtemplate
2160 gui.pruneduringfetch
2161 gui.spellingdictionary
2176 http.sslCertPasswordProtected
2181 i18n.logOutputEncoding
2187 imap.preformattedHTML
2197 interactive.singlekey
2213 mergetool.keepBackup
2214 mergetool.keepTemporaries
2219 notes.rewrite.rebase
2223 pack.deltaCacheLimit
2239 receive.denyCurrentBranch
2240 receive.denyDeleteCurrent
2242 receive.denyNonFastForwards
2245 receive.updateserverinfo
2247 repack.usedeltabaseoffset
2251 sendemail.aliasesfile
2252 sendemail.aliasfiletype
2256 sendemail.chainreplyto
2258 sendemail.envelopesender
2262 sendemail.signedoffbycc
2263 sendemail.smtpdomain
2264 sendemail.smtpencryption
2266 sendemail.smtpserver
2267 sendemail.smtpserveroption
2268 sendemail.smtpserverport
2270 sendemail.suppresscc
2271 sendemail.suppressfrom
2276 status.relativePaths
2277 status.showUntrackedFiles
2278 status.submodulesummary
2281 transfer.unpackLimit
2293 local subcommands="add rename rm show prune update set-head"
2294 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2295 if [ -z "$subcommand" ]; then
2296 __gitcomp "$subcommands"
2300 case "$subcommand" in
2301 rename|rm|show|prune)
2302 __gitcomp_nl "$(__git_remotes)"
2305 local i c='' IFS=$'\n'
2306 for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2320 __gitcomp_nl "$(__git_refs)"
2325 __git_has_doubledash && return
2329 __gitcomp "--merge --mixed --hard --soft --patch"
2333 __gitcomp_nl "$(__git_refs)"
2340 __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2344 __gitcomp_nl "$(__git_refs)"
2349 __git_has_doubledash && return
2353 __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2362 __git_has_doubledash && return
2367 $__git_log_common_options
2368 $__git_log_shortlog_options
2369 --numbered --summary
2374 __git_complete_revlist
2379 __git_has_doubledash && return
2382 --pretty=*|--format=*)
2383 __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2388 __gitcomp "--pretty= --format= --abbrev-commit --oneline
2389 $__git_diff_common_options
2402 --all --remotes --topo-order --current --more=
2403 --list --independent --merge-base --no-name
2405 --sha1-name --sparse --topics --reflog
2410 __git_complete_revlist
2415 local save_opts='--keep-index --no-keep-index --quiet --patch'
2416 local subcommands='save list show apply clear drop pop create branch'
2417 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2418 if [ -z "$subcommand" ]; then
2421 __gitcomp "$save_opts"
2424 if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2425 __gitcomp "$subcommands"
2432 case "$subcommand,$cur" in
2434 __gitcomp "$save_opts"
2437 __gitcomp "--index --quiet"
2439 show,--*|drop,--*|branch,--*)
2442 show,*|apply,*|drop,*|pop,*|branch,*)
2443 __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2444 | sed -n -e 's/:.*//p')"
2455 __git_has_doubledash && return
2457 local subcommands="add status init update summary foreach sync"
2458 if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2461 __gitcomp "--quiet --cached"
2464 __gitcomp "$subcommands"
2474 init fetch clone rebase dcommit log find-rev
2475 set-tree commit-diff info create-ignore propget
2476 proplist show-ignore show-externals branch tag blame
2477 migrate mkdirs reset gc
2479 local subcommand="$(__git_find_on_cmdline "$subcommands")"
2480 if [ -z "$subcommand" ]; then
2481 __gitcomp "$subcommands"
2483 local remote_opts="--username= --config-dir= --no-auth-cache"
2485 --follow-parent --authors-file= --repack=
2486 --no-metadata --use-svm-props --use-svnsync-props
2487 --log-window-size= --no-checkout --quiet
2488 --repack-flags --use-log-author --localtime
2489 --ignore-paths= $remote_opts
2492 --template= --shared= --trunk= --tags=
2493 --branches= --stdlayout --minimize-url
2494 --no-metadata --use-svm-props --use-svnsync-props
2495 --rewrite-root= --prefix= --use-log-author
2496 --add-author-from $remote_opts
2499 --edit --rmdir --find-copies-harder --copy-similarity=
2502 case "$subcommand,$cur" in
2504 __gitcomp "--revision= --fetch-all $fc_opts"
2507 __gitcomp "--revision= $fc_opts $init_opts"
2510 __gitcomp "$init_opts"
2514 --merge --strategy= --verbose --dry-run
2515 --fetch-all --no-rebase --commit-url
2516 --revision $cmt_opts $fc_opts
2520 __gitcomp "--stdin $cmt_opts $fc_opts"
2522 create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2523 show-externals,--*|mkdirs,--*)
2524 __gitcomp "--revision="
2528 --limit= --revision= --verbose --incremental
2529 --oneline --show-commit --non-recursive
2530 --authors-file= --color
2535 --merge --verbose --strategy= --local
2536 --fetch-all --dry-run $fc_opts
2540 __gitcomp "--message= --file= --revision= $cmt_opts"
2546 __gitcomp "--dry-run --message --tag"
2549 __gitcomp "--dry-run --message"
2552 __gitcomp "--git-format"
2556 --config-dir= --ignore-paths= --minimize
2557 --no-auth-cache --username=
2561 __gitcomp "--revision= --parent"
2573 while [ $c -lt $cword ]; do
2577 __gitcomp_nl "$(__git_tags)"
2593 __gitcomp_nl "$(__git_tags)"
2599 __gitcomp_nl "$(__git_refs)"
2611 local i c=1 command __git_dir
2613 if [[ -n ${ZSH_VERSION-} ]]; then
2617 # workaround zsh's bug that leaves 'words' as a special
2618 # variable in versions < 4.3.12
2622 local cur words cword prev
2623 _get_comp_words_by_ref -n =: cur words cword prev
2624 while [ $c -lt $cword ]; do
2627 --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2628 --bare) __git_dir="." ;;
2629 --version|-p|--paginate) ;;
2630 --help) command="help"; break ;;
2631 *) command="$i"; break ;;
2636 if [ -z "$command" ]; then
2651 *) __git_compute_porcelain_commands
2652 __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2657 local completion_func="_git_${command//-/_}"
2658 declare -f $completion_func >/dev/null && $completion_func && return
2660 local expansion=$(__git_aliased_command "$command")
2661 if [ -n "$expansion" ]; then
2662 completion_func="_git_${expansion//-/_}"
2663 declare -f $completion_func >/dev/null && $completion_func
2669 if [[ -n ${ZSH_VERSION-} ]]; then
2673 # workaround zsh's bug that leaves 'words' as a special
2674 # variable in versions < 4.3.12
2678 local cur words cword prev
2679 _get_comp_words_by_ref -n =: cur words cword prev
2681 __git_has_doubledash && return
2683 local g="$(__gitdir)"
2685 if [ -f "$g/MERGE_HEAD" ]; then
2691 $__git_log_common_options
2692 $__git_log_gitk_options
2698 __git_complete_revlist
2701 complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2702 || complete -o default -o nospace -F _git git
2703 complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2704 || complete -o default -o nospace -F _gitk gitk
2706 # The following are necessary only for Cygwin, and only are needed
2707 # when the user has tab-completed the executable name and consequently
2708 # included the '.exe' suffix.
2710 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2711 complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2712 || complete -o default -o nospace -F _git git.exe
2715 if [[ -n ${ZSH_VERSION-} ]]; then
2718 if [ $# -ne 2 ]; then
2719 echo "USAGE: $0 (-q|-s|-u) <option>" >&2
2727 echo "$0: invalid option: $2" >&2
2731 -q) setopt | grep -q "$option" ;;
2732 -u) unsetopt "$option" ;;
2733 -s) setopt "$option" ;;
2735 echo "$0: invalid flag: $1" >&2