contrib / completion / git-completion.bashon commit Merge branch 'ab/get-short-oid' (ab48bc0)
   1# bash/zsh completion support for core Git.
   2#
   3# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
   4# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
   5# Distributed under the GNU General Public License, version 2.0.
   6#
   7# The contained completion routines provide support for completing:
   8#
   9#    *) local and remote branch names
  10#    *) local and remote tag names
  11#    *) .git/remotes file names
  12#    *) git 'subcommands'
  13#    *) git email aliases for git-send-email
  14#    *) tree paths within 'ref:path/to/file' expressions
  15#    *) file paths within current working directory and index
  16#    *) common --long-options
  17#
  18# To use these routines:
  19#
  20#    1) Copy this file to somewhere (e.g. ~/.git-completion.bash).
  21#    2) Add the following line to your .bashrc/.zshrc:
  22#        source ~/.git-completion.bash
  23#    3) Consider changing your PS1 to also show the current branch,
  24#       see git-prompt.sh for details.
  25#
  26# If you use complex aliases of form '!f() { ... }; f', you can use the null
  27# command ':' as the first command in the function body to declare the desired
  28# completion style.  For example '!f() { : git commit ; ... }; f' will
  29# tell the completion to use commit completion.  This also works with aliases
  30# of form "!sh -c '...'".  For example, "!sh -c ': git commit ; ... '".
  31#
  32# Compatible with bash 3.2.57.
  33#
  34# You can set the following environment variables to influence the behavior of
  35# the completion routines:
  36#
  37#   GIT_COMPLETION_CHECKOUT_NO_GUESS
  38#
  39#     When set to "1", do not include "DWIM" suggestions in git-checkout
  40#     completion (e.g., completing "foo" when "origin/foo" exists).
  41
  42case "$COMP_WORDBREAKS" in
  43*:*) : great ;;
  44*)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
  45esac
  46
  47# Discovers the path to the git repository taking any '--git-dir=<path>' and
  48# '-C <path>' options into account and stores it in the $__git_repo_path
  49# variable.
  50__git_find_repo_path ()
  51{
  52        if [ -n "$__git_repo_path" ]; then
  53                # we already know where it is
  54                return
  55        fi
  56
  57        if [ -n "${__git_C_args-}" ]; then
  58                __git_repo_path="$(git "${__git_C_args[@]}" \
  59                        ${__git_dir:+--git-dir="$__git_dir"} \
  60                        rev-parse --absolute-git-dir 2>/dev/null)"
  61        elif [ -n "${__git_dir-}" ]; then
  62                test -d "$__git_dir" &&
  63                __git_repo_path="$__git_dir"
  64        elif [ -n "${GIT_DIR-}" ]; then
  65                test -d "${GIT_DIR-}" &&
  66                __git_repo_path="$GIT_DIR"
  67        elif [ -d .git ]; then
  68                __git_repo_path=.git
  69        else
  70                __git_repo_path="$(git rev-parse --git-dir 2>/dev/null)"
  71        fi
  72}
  73
  74# Deprecated: use __git_find_repo_path() and $__git_repo_path instead
  75# __gitdir accepts 0 or 1 arguments (i.e., location)
  76# returns location of .git repo
  77__gitdir ()
  78{
  79        if [ -z "${1-}" ]; then
  80                __git_find_repo_path || return 1
  81                echo "$__git_repo_path"
  82        elif [ -d "$1/.git" ]; then
  83                echo "$1/.git"
  84        else
  85                echo "$1"
  86        fi
  87}
  88
  89# Runs git with all the options given as argument, respecting any
  90# '--git-dir=<path>' and '-C <path>' options present on the command line
  91__git ()
  92{
  93        git ${__git_C_args:+"${__git_C_args[@]}"} \
  94                ${__git_dir:+--git-dir="$__git_dir"} "$@" 2>/dev/null
  95}
  96
  97# Removes backslash escaping, single quotes and double quotes from a word,
  98# stores the result in the variable $dequoted_word.
  99# 1: The word to dequote.
 100__git_dequote ()
 101{
 102        local rest="$1" len ch
 103
 104        dequoted_word=""
 105
 106        while test -n "$rest"; do
 107                len=${#dequoted_word}
 108                dequoted_word="$dequoted_word${rest%%[\\\'\"]*}"
 109                rest="${rest:$((${#dequoted_word}-$len))}"
 110
 111                case "${rest:0:1}" in
 112                \\)
 113                        ch="${rest:1:1}"
 114                        case "$ch" in
 115                        $'\n')
 116                                ;;
 117                        *)
 118                                dequoted_word="$dequoted_word$ch"
 119                                ;;
 120                        esac
 121                        rest="${rest:2}"
 122                        ;;
 123                \')
 124                        rest="${rest:1}"
 125                        len=${#dequoted_word}
 126                        dequoted_word="$dequoted_word${rest%%\'*}"
 127                        rest="${rest:$((${#dequoted_word}-$len+1))}"
 128                        ;;
 129                \")
 130                        rest="${rest:1}"
 131                        while test -n "$rest" ; do
 132                                len=${#dequoted_word}
 133                                dequoted_word="$dequoted_word${rest%%[\\\"]*}"
 134                                rest="${rest:$((${#dequoted_word}-$len))}"
 135                                case "${rest:0:1}" in
 136                                \\)
 137                                        ch="${rest:1:1}"
 138                                        case "$ch" in
 139                                        \"|\\|\$|\`)
 140                                                dequoted_word="$dequoted_word$ch"
 141                                                ;;
 142                                        $'\n')
 143                                                ;;
 144                                        *)
 145                                                dequoted_word="$dequoted_word\\$ch"
 146                                                ;;
 147                                        esac
 148                                        rest="${rest:2}"
 149                                        ;;
 150                                \")
 151                                        rest="${rest:1}"
 152                                        break
 153                                        ;;
 154                                esac
 155                        done
 156                        ;;
 157                esac
 158        done
 159}
 160
 161# The following function is based on code from:
 162#
 163#   bash_completion - programmable completion functions for bash 3.2+
 164#
 165#   Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
 166#             © 2009-2010, Bash Completion Maintainers
 167#                     <bash-completion-devel@lists.alioth.debian.org>
 168#
 169#   This program is free software; you can redistribute it and/or modify
 170#   it under the terms of the GNU General Public License as published by
 171#   the Free Software Foundation; either version 2, or (at your option)
 172#   any later version.
 173#
 174#   This program is distributed in the hope that it will be useful,
 175#   but WITHOUT ANY WARRANTY; without even the implied warranty of
 176#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 177#   GNU General Public License for more details.
 178#
 179#   You should have received a copy of the GNU General Public License
 180#   along with this program; if not, see <http://www.gnu.org/licenses/>.
 181#
 182#   The latest version of this software can be obtained here:
 183#
 184#   http://bash-completion.alioth.debian.org/
 185#
 186#   RELEASE: 2.x
 187
 188# This function can be used to access a tokenized list of words
 189# on the command line:
 190#
 191#       __git_reassemble_comp_words_by_ref '=:'
 192#       if test "${words_[cword_-1]}" = -w
 193#       then
 194#               ...
 195#       fi
 196#
 197# The argument should be a collection of characters from the list of
 198# word completion separators (COMP_WORDBREAKS) to treat as ordinary
 199# characters.
 200#
 201# This is roughly equivalent to going back in time and setting
 202# COMP_WORDBREAKS to exclude those characters.  The intent is to
 203# make option types like --date=<type> and <rev>:<path> easy to
 204# recognize by treating each shell word as a single token.
 205#
 206# It is best not to set COMP_WORDBREAKS directly because the value is
 207# shared with other completion scripts.  By the time the completion
 208# function gets called, COMP_WORDS has already been populated so local
 209# changes to COMP_WORDBREAKS have no effect.
 210#
 211# Output: words_, cword_, cur_.
 212
 213__git_reassemble_comp_words_by_ref()
 214{
 215        local exclude i j first
 216        # Which word separators to exclude?
 217        exclude="${1//[^$COMP_WORDBREAKS]}"
 218        cword_=$COMP_CWORD
 219        if [ -z "$exclude" ]; then
 220                words_=("${COMP_WORDS[@]}")
 221                return
 222        fi
 223        # List of word completion separators has shrunk;
 224        # re-assemble words to complete.
 225        for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
 226                # Append each nonempty word consisting of just
 227                # word separator characters to the current word.
 228                first=t
 229                while
 230                        [ $i -gt 0 ] &&
 231                        [ -n "${COMP_WORDS[$i]}" ] &&
 232                        # word consists of excluded word separators
 233                        [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
 234                do
 235                        # Attach to the previous token,
 236                        # unless the previous token is the command name.
 237                        if [ $j -ge 2 ] && [ -n "$first" ]; then
 238                                ((j--))
 239                        fi
 240                        first=
 241                        words_[$j]=${words_[j]}${COMP_WORDS[i]}
 242                        if [ $i = $COMP_CWORD ]; then
 243                                cword_=$j
 244                        fi
 245                        if (($i < ${#COMP_WORDS[@]} - 1)); then
 246                                ((i++))
 247                        else
 248                                # Done.
 249                                return
 250                        fi
 251                done
 252                words_[$j]=${words_[j]}${COMP_WORDS[i]}
 253                if [ $i = $COMP_CWORD ]; then
 254                        cword_=$j
 255                fi
 256        done
 257}
 258
 259if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
 260_get_comp_words_by_ref ()
 261{
 262        local exclude cur_ words_ cword_
 263        if [ "$1" = "-n" ]; then
 264                exclude=$2
 265                shift 2
 266        fi
 267        __git_reassemble_comp_words_by_ref "$exclude"
 268        cur_=${words_[cword_]}
 269        while [ $# -gt 0 ]; do
 270                case "$1" in
 271                cur)
 272                        cur=$cur_
 273                        ;;
 274                prev)
 275                        prev=${words_[$cword_-1]}
 276                        ;;
 277                words)
 278                        words=("${words_[@]}")
 279                        ;;
 280                cword)
 281                        cword=$cword_
 282                        ;;
 283                esac
 284                shift
 285        done
 286}
 287fi
 288
 289# Fills the COMPREPLY array with prefiltered words without any additional
 290# processing.
 291# Callers must take care of providing only words that match the current word
 292# to be completed and adding any prefix and/or suffix (trailing space!), if
 293# necessary.
 294# 1: List of newline-separated matching completion words, complete with
 295#    prefix and suffix.
 296__gitcomp_direct ()
 297{
 298        local IFS=$'\n'
 299
 300        COMPREPLY=($1)
 301}
 302
 303__gitcompappend ()
 304{
 305        local x i=${#COMPREPLY[@]}
 306        for x in $1; do
 307                if [[ "$x" == "$3"* ]]; then
 308                        COMPREPLY[i++]="$2$x$4"
 309                fi
 310        done
 311}
 312
 313__gitcompadd ()
 314{
 315        COMPREPLY=()
 316        __gitcompappend "$@"
 317}
 318
 319# Generates completion reply, appending a space to possible completion words,
 320# if necessary.
 321# It accepts 1 to 4 arguments:
 322# 1: List of possible completion words.
 323# 2: A prefix to be added to each possible completion word (optional).
 324# 3: Generate possible completion matches for this word (optional).
 325# 4: A suffix to be appended to each possible completion word (optional).
 326__gitcomp ()
 327{
 328        local cur_="${3-$cur}"
 329
 330        case "$cur_" in
 331        --*=)
 332                ;;
 333        *)
 334                local c i=0 IFS=$' \t\n'
 335                for c in $1; do
 336                        c="$c${4-}"
 337                        if [[ $c == "$cur_"* ]]; then
 338                                case $c in
 339                                --*=*|*.) ;;
 340                                *) c="$c " ;;
 341                                esac
 342                                COMPREPLY[i++]="${2-}$c"
 343                        fi
 344                done
 345                ;;
 346        esac
 347}
 348
 349# Clear the variables caching builtins' options when (re-)sourcing
 350# the completion script.
 351if [[ -n ${ZSH_VERSION-} ]]; then
 352        unset $(set |sed -ne 's/^\(__gitcomp_builtin_[a-zA-Z0-9_][a-zA-Z0-9_]*\)=.*/\1/p') 2>/dev/null
 353else
 354        unset $(compgen -v __gitcomp_builtin_)
 355fi
 356
 357# This function is equivalent to
 358#
 359#    __gitcomp "$(git xxx --git-completion-helper) ..."
 360#
 361# except that the output is cached. Accept 1-3 arguments:
 362# 1: the git command to execute, this is also the cache key
 363# 2: extra options to be added on top (e.g. negative forms)
 364# 3: options to be excluded
 365__gitcomp_builtin ()
 366{
 367        # spaces must be replaced with underscore for multi-word
 368        # commands, e.g. "git remote add" becomes remote_add.
 369        local cmd="$1"
 370        local incl="$2"
 371        local excl="$3"
 372
 373        local var=__gitcomp_builtin_"${cmd/-/_}"
 374        local options
 375        eval "options=\$$var"
 376
 377        if [ -z "$options" ]; then
 378                # leading and trailing spaces are significant to make
 379                # option removal work correctly.
 380                options=" $(__git ${cmd/_/ } --git-completion-helper) $incl "
 381                for i in $excl; do
 382                        options="${options/ $i / }"
 383                done
 384                eval "$var=\"$options\""
 385        fi
 386
 387        __gitcomp "$options"
 388}
 389
 390# Variation of __gitcomp_nl () that appends to the existing list of
 391# completion candidates, COMPREPLY.
 392__gitcomp_nl_append ()
 393{
 394        local IFS=$'\n'
 395        __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }"
 396}
 397
 398# Generates completion reply from newline-separated possible completion words
 399# by appending a space to all of them.
 400# It accepts 1 to 4 arguments:
 401# 1: List of possible completion words, separated by a single newline.
 402# 2: A prefix to be added to each possible completion word (optional).
 403# 3: Generate possible completion matches for this word (optional).
 404# 4: A suffix to be appended to each possible completion word instead of
 405#    the default space (optional).  If specified but empty, nothing is
 406#    appended.
 407__gitcomp_nl ()
 408{
 409        COMPREPLY=()
 410        __gitcomp_nl_append "$@"
 411}
 412
 413# Fills the COMPREPLY array with prefiltered paths without any additional
 414# processing.
 415# Callers must take care of providing only paths that match the current path
 416# to be completed and adding any prefix path components, if necessary.
 417# 1: List of newline-separated matching paths, complete with all prefix
 418#    path componens.
 419__gitcomp_file_direct ()
 420{
 421        local IFS=$'\n'
 422
 423        COMPREPLY=($1)
 424
 425        # use a hack to enable file mode in bash < 4
 426        compopt -o filenames +o nospace 2>/dev/null ||
 427        compgen -f /non-existing-dir/ >/dev/null ||
 428        true
 429}
 430
 431# Generates completion reply with compgen from newline-separated possible
 432# completion filenames.
 433# It accepts 1 to 3 arguments:
 434# 1: List of possible completion filenames, separated by a single newline.
 435# 2: A directory prefix to be added to each possible completion filename
 436#    (optional).
 437# 3: Generate possible completion matches for this word (optional).
 438__gitcomp_file ()
 439{
 440        local IFS=$'\n'
 441
 442        # XXX does not work when the directory prefix contains a tilde,
 443        # since tilde expansion is not applied.
 444        # This means that COMPREPLY will be empty and Bash default
 445        # completion will be used.
 446        __gitcompadd "$1" "${2-}" "${3-$cur}" ""
 447
 448        # use a hack to enable file mode in bash < 4
 449        compopt -o filenames +o nospace 2>/dev/null ||
 450        compgen -f /non-existing-dir/ >/dev/null ||
 451        true
 452}
 453
 454# Execute 'git ls-files', unless the --committable option is specified, in
 455# which case it runs 'git diff-index' to find out the files that can be
 456# committed.  It return paths relative to the directory specified in the first
 457# argument, and using the options specified in the second argument.
 458__git_ls_files_helper ()
 459{
 460        if [ "$2" == "--committable" ]; then
 461                __git -C "$1" -c core.quotePath=false diff-index \
 462                        --name-only --relative HEAD -- "${3//\\/\\\\}*"
 463        else
 464                # NOTE: $2 is not quoted in order to support multiple options
 465                __git -C "$1" -c core.quotePath=false ls-files \
 466                        --exclude-standard $2 -- "${3//\\/\\\\}*"
 467        fi
 468}
 469
 470
 471# __git_index_files accepts 1 or 2 arguments:
 472# 1: Options to pass to ls-files (required).
 473# 2: A directory path (optional).
 474#    If provided, only files within the specified directory are listed.
 475#    Sub directories are never recursed.  Path must have a trailing
 476#    slash.
 477# 3: List only paths matching this path component (optional).
 478__git_index_files ()
 479{
 480        local root="$2" match="$3"
 481
 482        __git_ls_files_helper "$root" "$1" "$match" |
 483        awk -F / -v pfx="${2//\\/\\\\}" '{
 484                paths[$1] = 1
 485        }
 486        END {
 487                for (p in paths) {
 488                        if (substr(p, 1, 1) != "\"") {
 489                                # No special characters, easy!
 490                                print pfx p
 491                                continue
 492                        }
 493
 494                        # The path is quoted.
 495                        p = dequote(p)
 496                        if (p == "")
 497                                continue
 498
 499                        # Even when a directory name itself does not contain
 500                        # any special characters, it will still be quoted if
 501                        # any of its (stripped) trailing path components do.
 502                        # Because of this we may have seen the same direcory
 503                        # both quoted and unquoted.
 504                        if (p in paths)
 505                                # We have seen the same directory unquoted,
 506                                # skip it.
 507                                continue
 508                        else
 509                                print pfx p
 510                }
 511        }
 512        function dequote(p,    bs_idx, out, esc, esc_idx, dec) {
 513                # Skip opening double quote.
 514                p = substr(p, 2)
 515
 516                # Interpret backslash escape sequences.
 517                while ((bs_idx = index(p, "\\")) != 0) {
 518                        out = out substr(p, 1, bs_idx - 1)
 519                        esc = substr(p, bs_idx + 1, 1)
 520                        p = substr(p, bs_idx + 2)
 521
 522                        if ((esc_idx = index("abtvfr\"\\", esc)) != 0) {
 523                                # C-style one-character escape sequence.
 524                                out = out substr("\a\b\t\v\f\r\"\\",
 525                                                 esc_idx, 1)
 526                        } else if (esc == "n") {
 527                                # Uh-oh, a newline character.
 528                                # We cant reliably put a pathname
 529                                # containing a newline into COMPREPLY,
 530                                # and the newline would create a mess.
 531                                # Skip this path.
 532                                return ""
 533                        } else {
 534                                # Must be a \nnn octal value, then.
 535                                dec = esc             * 64 + \
 536                                      substr(p, 1, 1) * 8  + \
 537                                      substr(p, 2, 1)
 538                                out = out sprintf("%c", dec)
 539                                p = substr(p, 3)
 540                        }
 541                }
 542                # Drop closing double quote, if there is one.
 543                # (There isnt any if this is a directory, as it was
 544                # already stripped with the trailing path components.)
 545                if (substr(p, length(p), 1) == "\"")
 546                        out = out substr(p, 1, length(p) - 1)
 547                else
 548                        out = out p
 549
 550                return out
 551        }'
 552}
 553
 554# __git_complete_index_file requires 1 argument:
 555# 1: the options to pass to ls-file
 556#
 557# The exception is --committable, which finds the files appropriate commit.
 558__git_complete_index_file ()
 559{
 560        local dequoted_word pfx="" cur_
 561
 562        __git_dequote "$cur"
 563
 564        case "$dequoted_word" in
 565        ?*/*)
 566                pfx="${dequoted_word%/*}/"
 567                cur_="${dequoted_word##*/}"
 568                ;;
 569        *)
 570                cur_="$dequoted_word"
 571        esac
 572
 573        __gitcomp_file_direct "$(__git_index_files "$1" "$pfx" "$cur_")"
 574}
 575
 576# Lists branches from the local repository.
 577# 1: A prefix to be added to each listed branch (optional).
 578# 2: List only branches matching this word (optional; list all branches if
 579#    unset or empty).
 580# 3: A suffix to be appended to each listed branch (optional).
 581__git_heads ()
 582{
 583        local pfx="${1-}" cur_="${2-}" sfx="${3-}"
 584
 585        __git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
 586                        "refs/heads/$cur_*" "refs/heads/$cur_*/**"
 587}
 588
 589# Lists tags from the local repository.
 590# Accepts the same positional parameters as __git_heads() above.
 591__git_tags ()
 592{
 593        local pfx="${1-}" cur_="${2-}" sfx="${3-}"
 594
 595        __git for-each-ref --format="${pfx//\%/%%}%(refname:strip=2)$sfx" \
 596                        "refs/tags/$cur_*" "refs/tags/$cur_*/**"
 597}
 598
 599# Lists refs from the local (by default) or from a remote repository.
 600# It accepts 0, 1 or 2 arguments:
 601# 1: The remote to list refs from (optional; ignored, if set but empty).
 602#    Can be the name of a configured remote, a path, or a URL.
 603# 2: In addition to local refs, list unique branches from refs/remotes/ for
 604#    'git checkout's tracking DWIMery (optional; ignored, if set but empty).
 605# 3: A prefix to be added to each listed ref (optional).
 606# 4: List only refs matching this word (optional; list all refs if unset or
 607#    empty).
 608# 5: A suffix to be appended to each listed ref (optional; ignored, if set
 609#    but empty).
 610#
 611# Use __git_complete_refs() instead.
 612__git_refs ()
 613{
 614        local i hash dir track="${2-}"
 615        local list_refs_from=path remote="${1-}"
 616        local format refs
 617        local pfx="${3-}" cur_="${4-$cur}" sfx="${5-}"
 618        local match="${4-}"
 619        local fer_pfx="${pfx//\%/%%}" # "escape" for-each-ref format specifiers
 620
 621        __git_find_repo_path
 622        dir="$__git_repo_path"
 623
 624        if [ -z "$remote" ]; then
 625                if [ -z "$dir" ]; then
 626                        return
 627                fi
 628        else
 629                if __git_is_configured_remote "$remote"; then
 630                        # configured remote takes precedence over a
 631                        # local directory with the same name
 632                        list_refs_from=remote
 633                elif [ -d "$remote/.git" ]; then
 634                        dir="$remote/.git"
 635                elif [ -d "$remote" ]; then
 636                        dir="$remote"
 637                else
 638                        list_refs_from=url
 639                fi
 640        fi
 641
 642        if [ "$list_refs_from" = path ]; then
 643                if [[ "$cur_" == ^* ]]; then
 644                        pfx="$pfx^"
 645                        fer_pfx="$fer_pfx^"
 646                        cur_=${cur_#^}
 647                        match=${match#^}
 648                fi
 649                case "$cur_" in
 650                refs|refs/*)
 651                        format="refname"
 652                        refs=("$match*" "$match*/**")
 653                        track=""
 654                        ;;
 655                *)
 656                        for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD REBASE_HEAD; do
 657                                case "$i" in
 658                                $match*)
 659                                        if [ -e "$dir/$i" ]; then
 660                                                echo "$pfx$i$sfx"
 661                                        fi
 662                                        ;;
 663                                esac
 664                        done
 665                        format="refname:strip=2"
 666                        refs=("refs/tags/$match*" "refs/tags/$match*/**"
 667                                "refs/heads/$match*" "refs/heads/$match*/**"
 668                                "refs/remotes/$match*" "refs/remotes/$match*/**")
 669                        ;;
 670                esac
 671                __git_dir="$dir" __git for-each-ref --format="$fer_pfx%($format)$sfx" \
 672                        "${refs[@]}"
 673                if [ -n "$track" ]; then
 674                        # employ the heuristic used by git checkout
 675                        # Try to find a remote branch that matches the completion word
 676                        # but only output if the branch name is unique
 677                        __git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
 678                                --sort="refname:strip=3" \
 679                                "refs/remotes/*/$match*" "refs/remotes/*/$match*/**" | \
 680                        uniq -u
 681                fi
 682                return
 683        fi
 684        case "$cur_" in
 685        refs|refs/*)
 686                __git ls-remote "$remote" "$match*" | \
 687                while read -r hash i; do
 688                        case "$i" in
 689                        *^{}) ;;
 690                        *) echo "$pfx$i$sfx" ;;
 691                        esac
 692                done
 693                ;;
 694        *)
 695                if [ "$list_refs_from" = remote ]; then
 696                        case "HEAD" in
 697                        $match*)        echo "${pfx}HEAD$sfx" ;;
 698                        esac
 699                        __git for-each-ref --format="$fer_pfx%(refname:strip=3)$sfx" \
 700                                "refs/remotes/$remote/$match*" \
 701                                "refs/remotes/$remote/$match*/**"
 702                else
 703                        local query_symref
 704                        case "HEAD" in
 705                        $match*)        query_symref="HEAD" ;;
 706                        esac
 707                        __git ls-remote "$remote" $query_symref \
 708                                "refs/tags/$match*" "refs/heads/$match*" \
 709                                "refs/remotes/$match*" |
 710                        while read -r hash i; do
 711                                case "$i" in
 712                                *^{})   ;;
 713                                refs/*) echo "$pfx${i#refs/*/}$sfx" ;;
 714                                *)      echo "$pfx$i$sfx" ;;  # symbolic refs
 715                                esac
 716                        done
 717                fi
 718                ;;
 719        esac
 720}
 721
 722# Completes refs, short and long, local and remote, symbolic and pseudo.
 723#
 724# Usage: __git_complete_refs [<option>]...
 725# --remote=<remote>: The remote to list refs from, can be the name of a
 726#                    configured remote, a path, or a URL.
 727# --track: List unique remote branches for 'git checkout's tracking DWIMery.
 728# --pfx=<prefix>: A prefix to be added to each ref.
 729# --cur=<word>: The current ref to be completed.  Defaults to the current
 730#               word to be completed.
 731# --sfx=<suffix>: A suffix to be appended to each ref instead of the default
 732#                 space.
 733__git_complete_refs ()
 734{
 735        local remote track pfx cur_="$cur" sfx=" "
 736
 737        while test $# != 0; do
 738                case "$1" in
 739                --remote=*)     remote="${1##--remote=}" ;;
 740                --track)        track="yes" ;;
 741                --pfx=*)        pfx="${1##--pfx=}" ;;
 742                --cur=*)        cur_="${1##--cur=}" ;;
 743                --sfx=*)        sfx="${1##--sfx=}" ;;
 744                *)              return 1 ;;
 745                esac
 746                shift
 747        done
 748
 749        __gitcomp_direct "$(__git_refs "$remote" "$track" "$pfx" "$cur_" "$sfx")"
 750}
 751
 752# __git_refs2 requires 1 argument (to pass to __git_refs)
 753# Deprecated: use __git_complete_fetch_refspecs() instead.
 754__git_refs2 ()
 755{
 756        local i
 757        for i in $(__git_refs "$1"); do
 758                echo "$i:$i"
 759        done
 760}
 761
 762# Completes refspecs for fetching from a remote repository.
 763# 1: The remote repository.
 764# 2: A prefix to be added to each listed refspec (optional).
 765# 3: The ref to be completed as a refspec instead of the current word to be
 766#    completed (optional)
 767# 4: A suffix to be appended to each listed refspec instead of the default
 768#    space (optional).
 769__git_complete_fetch_refspecs ()
 770{
 771        local i remote="$1" pfx="${2-}" cur_="${3-$cur}" sfx="${4- }"
 772
 773        __gitcomp_direct "$(
 774                for i in $(__git_refs "$remote" "" "" "$cur_") ; do
 775                        echo "$pfx$i:$i$sfx"
 776                done
 777                )"
 778}
 779
 780# __git_refs_remotes requires 1 argument (to pass to ls-remote)
 781__git_refs_remotes ()
 782{
 783        local i hash
 784        __git ls-remote "$1" 'refs/heads/*' | \
 785        while read -r hash i; do
 786                echo "$i:refs/remotes/$1/${i#refs/heads/}"
 787        done
 788}
 789
 790__git_remotes ()
 791{
 792        __git_find_repo_path
 793        test -d "$__git_repo_path/remotes" && ls -1 "$__git_repo_path/remotes"
 794        __git remote
 795}
 796
 797# Returns true if $1 matches the name of a configured remote, false otherwise.
 798__git_is_configured_remote ()
 799{
 800        local remote
 801        for remote in $(__git_remotes); do
 802                if [ "$remote" = "$1" ]; then
 803                        return 0
 804                fi
 805        done
 806        return 1
 807}
 808
 809__git_list_merge_strategies ()
 810{
 811        LANG=C LC_ALL=C git merge -s help 2>&1 |
 812        sed -n -e '/[Aa]vailable strategies are: /,/^$/{
 813                s/\.$//
 814                s/.*://
 815                s/^[    ]*//
 816                s/[     ]*$//
 817                p
 818        }'
 819}
 820
 821__git_merge_strategies=
 822# 'git merge -s help' (and thus detection of the merge strategy
 823# list) fails, unfortunately, if run outside of any git working
 824# tree.  __git_merge_strategies is set to the empty string in
 825# that case, and the detection will be repeated the next time it
 826# is needed.
 827__git_compute_merge_strategies ()
 828{
 829        test -n "$__git_merge_strategies" ||
 830        __git_merge_strategies=$(__git_list_merge_strategies)
 831}
 832
 833__git_complete_revlist_file ()
 834{
 835        local pfx ls ref cur_="$cur"
 836        case "$cur_" in
 837        *..?*:*)
 838                return
 839                ;;
 840        ?*:*)
 841                ref="${cur_%%:*}"
 842                cur_="${cur_#*:}"
 843                case "$cur_" in
 844                ?*/*)
 845                        pfx="${cur_%/*}"
 846                        cur_="${cur_##*/}"
 847                        ls="$ref:$pfx"
 848                        pfx="$pfx/"
 849                        ;;
 850                *)
 851                        ls="$ref"
 852                        ;;
 853                esac
 854
 855                case "$COMP_WORDBREAKS" in
 856                *:*) : great ;;
 857                *)   pfx="$ref:$pfx" ;;
 858                esac
 859
 860                __gitcomp_nl "$(__git ls-tree "$ls" \
 861                                | sed '/^100... blob /{
 862                                           s,^.*        ,,
 863                                           s,$, ,
 864                                       }
 865                                       /^120000 blob /{
 866                                           s,^.*        ,,
 867                                           s,$, ,
 868                                       }
 869                                       /^040000 tree /{
 870                                           s,^.*        ,,
 871                                           s,$,/,
 872                                       }
 873                                       s/^.*    //')" \
 874                        "$pfx" "$cur_" ""
 875                ;;
 876        *...*)
 877                pfx="${cur_%...*}..."
 878                cur_="${cur_#*...}"
 879                __git_complete_refs --pfx="$pfx" --cur="$cur_"
 880                ;;
 881        *..*)
 882                pfx="${cur_%..*}.."
 883                cur_="${cur_#*..}"
 884                __git_complete_refs --pfx="$pfx" --cur="$cur_"
 885                ;;
 886        *)
 887                __git_complete_refs
 888                ;;
 889        esac
 890}
 891
 892__git_complete_file ()
 893{
 894        __git_complete_revlist_file
 895}
 896
 897__git_complete_revlist ()
 898{
 899        __git_complete_revlist_file
 900}
 901
 902__git_complete_remote_or_refspec ()
 903{
 904        local cur_="$cur" cmd="${words[1]}"
 905        local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
 906        if [ "$cmd" = "remote" ]; then
 907                ((c++))
 908        fi
 909        while [ $c -lt $cword ]; do
 910                i="${words[c]}"
 911                case "$i" in
 912                --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
 913                -d|--delete) [ "$cmd" = "push" ] && lhs=0 ;;
 914                --all)
 915                        case "$cmd" in
 916                        push) no_complete_refspec=1 ;;
 917                        fetch)
 918                                return
 919                                ;;
 920                        *) ;;
 921                        esac
 922                        ;;
 923                -*) ;;
 924                *) remote="$i"; break ;;
 925                esac
 926                ((c++))
 927        done
 928        if [ -z "$remote" ]; then
 929                __gitcomp_nl "$(__git_remotes)"
 930                return
 931        fi
 932        if [ $no_complete_refspec = 1 ]; then
 933                return
 934        fi
 935        [ "$remote" = "." ] && remote=
 936        case "$cur_" in
 937        *:*)
 938                case "$COMP_WORDBREAKS" in
 939                *:*) : great ;;
 940                *)   pfx="${cur_%%:*}:" ;;
 941                esac
 942                cur_="${cur_#*:}"
 943                lhs=0
 944                ;;
 945        +*)
 946                pfx="+"
 947                cur_="${cur_#+}"
 948                ;;
 949        esac
 950        case "$cmd" in
 951        fetch)
 952                if [ $lhs = 1 ]; then
 953                        __git_complete_fetch_refspecs "$remote" "$pfx" "$cur_"
 954                else
 955                        __git_complete_refs --pfx="$pfx" --cur="$cur_"
 956                fi
 957                ;;
 958        pull|remote)
 959                if [ $lhs = 1 ]; then
 960                        __git_complete_refs --remote="$remote" --pfx="$pfx" --cur="$cur_"
 961                else
 962                        __git_complete_refs --pfx="$pfx" --cur="$cur_"
 963                fi
 964                ;;
 965        push)
 966                if [ $lhs = 1 ]; then
 967                        __git_complete_refs --pfx="$pfx" --cur="$cur_"
 968                else
 969                        __git_complete_refs --remote="$remote" --pfx="$pfx" --cur="$cur_"
 970                fi
 971                ;;
 972        esac
 973}
 974
 975__git_complete_strategy ()
 976{
 977        __git_compute_merge_strategies
 978        case "$prev" in
 979        -s|--strategy)
 980                __gitcomp "$__git_merge_strategies"
 981                return 0
 982        esac
 983        case "$cur" in
 984        --strategy=*)
 985                __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
 986                return 0
 987                ;;
 988        esac
 989        return 1
 990}
 991
 992__git_commands () {
 993        if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
 994        then
 995                printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
 996        else
 997                git help -a|egrep '^  [a-zA-Z0-9]'
 998        fi
 999}
1000
1001__git_list_all_commands ()
1002{
1003        local i IFS=" "$'\n'
1004        for i in $(__git_commands)
1005        do
1006                case $i in
1007                *--*)             : helper pattern;;
1008                *) echo $i;;
1009                esac
1010        done
1011}
1012
1013__git_all_commands=
1014__git_compute_all_commands ()
1015{
1016        test -n "$__git_all_commands" ||
1017        __git_all_commands=$(__git_list_all_commands)
1018}
1019
1020__git_list_porcelain_commands ()
1021{
1022        local i IFS=" "$'\n'
1023        __git_compute_all_commands
1024        for i in $__git_all_commands
1025        do
1026                case $i in
1027                *--*)             : helper pattern;;
1028                applymbox)        : ask gittus;;
1029                applypatch)       : ask gittus;;
1030                archimport)       : import;;
1031                cat-file)         : plumbing;;
1032                check-attr)       : plumbing;;
1033                check-ignore)     : plumbing;;
1034                check-mailmap)    : plumbing;;
1035                check-ref-format) : plumbing;;
1036                checkout-index)   : plumbing;;
1037                column)           : internal helper;;
1038                commit-graph)     : plumbing;;
1039                commit-tree)      : plumbing;;
1040                count-objects)    : infrequent;;
1041                credential)       : credentials;;
1042                credential-*)     : credentials helper;;
1043                cvsexportcommit)  : export;;
1044                cvsimport)        : import;;
1045                cvsserver)        : daemon;;
1046                daemon)           : daemon;;
1047                diff-files)       : plumbing;;
1048                diff-index)       : plumbing;;
1049                diff-tree)        : plumbing;;
1050                fast-import)      : import;;
1051                fast-export)      : export;;
1052                fsck-objects)     : plumbing;;
1053                fetch-pack)       : plumbing;;
1054                fmt-merge-msg)    : plumbing;;
1055                for-each-ref)     : plumbing;;
1056                hash-object)      : plumbing;;
1057                http-*)           : transport;;
1058                index-pack)       : plumbing;;
1059                init-db)          : deprecated;;
1060                local-fetch)      : plumbing;;
1061                ls-files)         : plumbing;;
1062                ls-remote)        : plumbing;;
1063                ls-tree)          : plumbing;;
1064                mailinfo)         : plumbing;;
1065                mailsplit)        : plumbing;;
1066                merge-*)          : plumbing;;
1067                mktree)           : plumbing;;
1068                mktag)            : plumbing;;
1069                pack-objects)     : plumbing;;
1070                pack-redundant)   : plumbing;;
1071                pack-refs)        : plumbing;;
1072                parse-remote)     : plumbing;;
1073                patch-id)         : plumbing;;
1074                prune)            : plumbing;;
1075                prune-packed)     : plumbing;;
1076                quiltimport)      : import;;
1077                read-tree)        : plumbing;;
1078                receive-pack)     : plumbing;;
1079                remote-*)         : transport;;
1080                rerere)           : plumbing;;
1081                rev-list)         : plumbing;;
1082                rev-parse)        : plumbing;;
1083                runstatus)        : plumbing;;
1084                sh-setup)         : internal;;
1085                shell)            : daemon;;
1086                show-ref)         : plumbing;;
1087                send-pack)        : plumbing;;
1088                show-index)       : plumbing;;
1089                ssh-*)            : transport;;
1090                stripspace)       : plumbing;;
1091                symbolic-ref)     : plumbing;;
1092                unpack-file)      : plumbing;;
1093                unpack-objects)   : plumbing;;
1094                update-index)     : plumbing;;
1095                update-ref)       : plumbing;;
1096                update-server-info) : daemon;;
1097                upload-archive)   : plumbing;;
1098                upload-pack)      : plumbing;;
1099                write-tree)       : plumbing;;
1100                var)              : infrequent;;
1101                verify-pack)      : infrequent;;
1102                verify-tag)       : plumbing;;
1103                *) echo $i;;
1104                esac
1105        done
1106}
1107
1108__git_porcelain_commands=
1109__git_compute_porcelain_commands ()
1110{
1111        test -n "$__git_porcelain_commands" ||
1112        __git_porcelain_commands=$(__git_list_porcelain_commands)
1113}
1114
1115# Lists all set config variables starting with the given section prefix,
1116# with the prefix removed.
1117__git_get_config_variables ()
1118{
1119        local section="$1" i IFS=$'\n'
1120        for i in $(__git config --name-only --get-regexp "^$section\..*"); do
1121                echo "${i#$section.}"
1122        done
1123}
1124
1125__git_pretty_aliases ()
1126{
1127        __git_get_config_variables "pretty"
1128}
1129
1130__git_aliases ()
1131{
1132        __git_get_config_variables "alias"
1133}
1134
1135# __git_aliased_command requires 1 argument
1136__git_aliased_command ()
1137{
1138        local word cmdline=$(__git config --get "alias.$1")
1139        for word in $cmdline; do
1140                case "$word" in
1141                \!gitk|gitk)
1142                        echo "gitk"
1143                        return
1144                        ;;
1145                \!*)    : shell command alias ;;
1146                -*)     : option ;;
1147                *=*)    : setting env ;;
1148                git)    : git itself ;;
1149                \(\))   : skip parens of shell function definition ;;
1150                {)      : skip start of shell helper function ;;
1151                :)      : skip null command ;;
1152                \'*)    : skip opening quote after sh -c ;;
1153                *)
1154                        echo "$word"
1155                        return
1156                esac
1157        done
1158}
1159
1160# __git_find_on_cmdline requires 1 argument
1161__git_find_on_cmdline ()
1162{
1163        local word subcommand c=1
1164        while [ $c -lt $cword ]; do
1165                word="${words[c]}"
1166                for subcommand in $1; do
1167                        if [ "$subcommand" = "$word" ]; then
1168                                echo "$subcommand"
1169                                return
1170                        fi
1171                done
1172                ((c++))
1173        done
1174}
1175
1176# Echo the value of an option set on the command line or config
1177#
1178# $1: short option name
1179# $2: long option name including =
1180# $3: list of possible values
1181# $4: config string (optional)
1182#
1183# example:
1184# result="$(__git_get_option_value "-d" "--do-something=" \
1185#     "yes no" "core.doSomething")"
1186#
1187# result is then either empty (no option set) or "yes" or "no"
1188#
1189# __git_get_option_value requires 3 arguments
1190__git_get_option_value ()
1191{
1192        local c short_opt long_opt val
1193        local result= values config_key word
1194
1195        short_opt="$1"
1196        long_opt="$2"
1197        values="$3"
1198        config_key="$4"
1199
1200        ((c = $cword - 1))
1201        while [ $c -ge 0 ]; do
1202                word="${words[c]}"
1203                for val in $values; do
1204                        if [ "$short_opt$val" = "$word" ] ||
1205                           [ "$long_opt$val"  = "$word" ]; then
1206                                result="$val"
1207                                break 2
1208                        fi
1209                done
1210                ((c--))
1211        done
1212
1213        if [ -n "$config_key" ] && [ -z "$result" ]; then
1214                result="$(__git config "$config_key")"
1215        fi
1216
1217        echo "$result"
1218}
1219
1220__git_has_doubledash ()
1221{
1222        local c=1
1223        while [ $c -lt $cword ]; do
1224                if [ "--" = "${words[c]}" ]; then
1225                        return 0
1226                fi
1227                ((c++))
1228        done
1229        return 1
1230}
1231
1232# Try to count non option arguments passed on the command line for the
1233# specified git command.
1234# When options are used, it is necessary to use the special -- option to
1235# tell the implementation were non option arguments begin.
1236# XXX this can not be improved, since options can appear everywhere, as
1237# an example:
1238#       git mv x -n y
1239#
1240# __git_count_arguments requires 1 argument: the git command executed.
1241__git_count_arguments ()
1242{
1243        local word i c=0
1244
1245        # Skip "git" (first argument)
1246        for ((i=1; i < ${#words[@]}; i++)); do
1247                word="${words[i]}"
1248
1249                case "$word" in
1250                        --)
1251                                # Good; we can assume that the following are only non
1252                                # option arguments.
1253                                ((c = 0))
1254                                ;;
1255                        "$1")
1256                                # Skip the specified git command and discard git
1257                                # main options
1258                                ((c = 0))
1259                                ;;
1260                        ?*)
1261                                ((c++))
1262                                ;;
1263                esac
1264        done
1265
1266        printf "%d" $c
1267}
1268
1269__git_whitespacelist="nowarn warn error error-all fix"
1270__git_am_inprogress_options="--skip --continue --resolved --abort --quit --show-current-patch"
1271
1272_git_am ()
1273{
1274        __git_find_repo_path
1275        if [ -d "$__git_repo_path"/rebase-apply ]; then
1276                __gitcomp "$__git_am_inprogress_options"
1277                return
1278        fi
1279        case "$cur" in
1280        --whitespace=*)
1281                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1282                return
1283                ;;
1284        --*)
1285                __gitcomp_builtin am "--no-utf8" \
1286                        "$__git_am_inprogress_options"
1287                return
1288        esac
1289}
1290
1291_git_apply ()
1292{
1293        case "$cur" in
1294        --whitespace=*)
1295                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1296                return
1297                ;;
1298        --*)
1299                __gitcomp_builtin apply
1300                return
1301        esac
1302}
1303
1304_git_add ()
1305{
1306        case "$cur" in
1307        --*)
1308                __gitcomp_builtin add
1309                return
1310        esac
1311
1312        local complete_opt="--others --modified --directory --no-empty-directory"
1313        if test -n "$(__git_find_on_cmdline "-u --update")"
1314        then
1315                complete_opt="--modified"
1316        fi
1317        __git_complete_index_file "$complete_opt"
1318}
1319
1320_git_archive ()
1321{
1322        case "$cur" in
1323        --format=*)
1324                __gitcomp "$(git archive --list)" "" "${cur##--format=}"
1325                return
1326                ;;
1327        --remote=*)
1328                __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
1329                return
1330                ;;
1331        --*)
1332                __gitcomp "
1333                        --format= --list --verbose
1334                        --prefix= --remote= --exec= --output
1335                        "
1336                return
1337                ;;
1338        esac
1339        __git_complete_file
1340}
1341
1342_git_bisect ()
1343{
1344        __git_has_doubledash && return
1345
1346        local subcommands="start bad good skip reset visualize replay log run"
1347        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1348        if [ -z "$subcommand" ]; then
1349                __git_find_repo_path
1350                if [ -f "$__git_repo_path"/BISECT_START ]; then
1351                        __gitcomp "$subcommands"
1352                else
1353                        __gitcomp "replay start"
1354                fi
1355                return
1356        fi
1357
1358        case "$subcommand" in
1359        bad|good|reset|skip|start)
1360                __git_complete_refs
1361                ;;
1362        *)
1363                ;;
1364        esac
1365}
1366
1367_git_branch ()
1368{
1369        local i c=1 only_local_ref="n" has_r="n"
1370
1371        while [ $c -lt $cword ]; do
1372                i="${words[c]}"
1373                case "$i" in
1374                -d|--delete|-m|--move)  only_local_ref="y" ;;
1375                -r|--remotes)           has_r="y" ;;
1376                esac
1377                ((c++))
1378        done
1379
1380        case "$cur" in
1381        --set-upstream-to=*)
1382                __git_complete_refs --cur="${cur##--set-upstream-to=}"
1383                ;;
1384        --*)
1385                __gitcomp_builtin branch "--no-color --no-abbrev
1386                        --no-track --no-column
1387                        "
1388                ;;
1389        *)
1390                if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1391                        __gitcomp_direct "$(__git_heads "" "$cur" " ")"
1392                else
1393                        __git_complete_refs
1394                fi
1395                ;;
1396        esac
1397}
1398
1399_git_bundle ()
1400{
1401        local cmd="${words[2]}"
1402        case "$cword" in
1403        2)
1404                __gitcomp "create list-heads verify unbundle"
1405                ;;
1406        3)
1407                # looking for a file
1408                ;;
1409        *)
1410                case "$cmd" in
1411                        create)
1412                                __git_complete_revlist
1413                        ;;
1414                esac
1415                ;;
1416        esac
1417}
1418
1419_git_checkout ()
1420{
1421        __git_has_doubledash && return
1422
1423        case "$cur" in
1424        --conflict=*)
1425                __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1426                ;;
1427        --*)
1428                __gitcomp_builtin checkout "--no-track --no-recurse-submodules"
1429                ;;
1430        *)
1431                # check if --track, --no-track, or --no-guess was specified
1432                # if so, disable DWIM mode
1433                local flags="--track --no-track --no-guess" track_opt="--track"
1434                if [ "$GIT_COMPLETION_CHECKOUT_NO_GUESS" = "1" ] ||
1435                   [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1436                        track_opt=''
1437                fi
1438                __git_complete_refs $track_opt
1439                ;;
1440        esac
1441}
1442
1443_git_cherry ()
1444{
1445        case "$cur" in
1446        --*)
1447                __gitcomp_builtin cherry
1448                return
1449        esac
1450
1451        __git_complete_refs
1452}
1453
1454__git_cherry_pick_inprogress_options="--continue --quit --abort"
1455
1456_git_cherry_pick ()
1457{
1458        __git_find_repo_path
1459        if [ -f "$__git_repo_path"/CHERRY_PICK_HEAD ]; then
1460                __gitcomp "$__git_cherry_pick_inprogress_options"
1461                return
1462        fi
1463        case "$cur" in
1464        --*)
1465                __gitcomp_builtin cherry-pick "" \
1466                        "$__git_cherry_pick_inprogress_options"
1467                ;;
1468        *)
1469                __git_complete_refs
1470                ;;
1471        esac
1472}
1473
1474_git_clean ()
1475{
1476        case "$cur" in
1477        --*)
1478                __gitcomp_builtin clean
1479                return
1480                ;;
1481        esac
1482
1483        # XXX should we check for -x option ?
1484        __git_complete_index_file "--others --directory"
1485}
1486
1487_git_clone ()
1488{
1489        case "$cur" in
1490        --*)
1491                __gitcomp_builtin clone "--no-single-branch"
1492                return
1493                ;;
1494        esac
1495}
1496
1497__git_untracked_file_modes="all no normal"
1498
1499_git_commit ()
1500{
1501        case "$prev" in
1502        -c|-C)
1503                __git_complete_refs
1504                return
1505                ;;
1506        esac
1507
1508        case "$cur" in
1509        --cleanup=*)
1510                __gitcomp "default scissors strip verbatim whitespace
1511                        " "" "${cur##--cleanup=}"
1512                return
1513                ;;
1514        --reuse-message=*|--reedit-message=*|\
1515        --fixup=*|--squash=*)
1516                __git_complete_refs --cur="${cur#*=}"
1517                return
1518                ;;
1519        --untracked-files=*)
1520                __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1521                return
1522                ;;
1523        --*)
1524                __gitcomp_builtin commit "--no-edit --verify"
1525                return
1526        esac
1527
1528        if __git rev-parse --verify --quiet HEAD >/dev/null; then
1529                __git_complete_index_file "--committable"
1530        else
1531                # This is the first commit
1532                __git_complete_index_file "--cached"
1533        fi
1534}
1535
1536_git_describe ()
1537{
1538        case "$cur" in
1539        --*)
1540                __gitcomp_builtin describe
1541                return
1542        esac
1543        __git_complete_refs
1544}
1545
1546__git_diff_algorithms="myers minimal patience histogram"
1547
1548__git_diff_submodule_formats="diff log short"
1549
1550__git_diff_common_options="--stat --numstat --shortstat --summary
1551                        --patch-with-stat --name-only --name-status --color
1552                        --no-color --color-words --no-renames --check
1553                        --full-index --binary --abbrev --diff-filter=
1554                        --find-copies-harder --ignore-cr-at-eol
1555                        --text --ignore-space-at-eol --ignore-space-change
1556                        --ignore-all-space --ignore-blank-lines --exit-code
1557                        --quiet --ext-diff --no-ext-diff
1558                        --no-prefix --src-prefix= --dst-prefix=
1559                        --inter-hunk-context=
1560                        --patience --histogram --minimal
1561                        --raw --word-diff --word-diff-regex=
1562                        --dirstat --dirstat= --dirstat-by-file
1563                        --dirstat-by-file= --cumulative
1564                        --diff-algorithm=
1565                        --submodule --submodule= --ignore-submodules
1566"
1567
1568_git_diff ()
1569{
1570        __git_has_doubledash && return
1571
1572        case "$cur" in
1573        --diff-algorithm=*)
1574                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1575                return
1576                ;;
1577        --submodule=*)
1578                __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1579                return
1580                ;;
1581        --*)
1582                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1583                        --base --ours --theirs --no-index
1584                        $__git_diff_common_options
1585                        "
1586                return
1587                ;;
1588        esac
1589        __git_complete_revlist_file
1590}
1591
1592__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1593                        tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
1594"
1595
1596_git_difftool ()
1597{
1598        __git_has_doubledash && return
1599
1600        case "$cur" in
1601        --tool=*)
1602                __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1603                return
1604                ;;
1605        --*)
1606                __gitcomp_builtin difftool "$__git_diff_common_options
1607                                        --base --cached --ours --theirs
1608                                        --pickaxe-all --pickaxe-regex
1609                                        --relative --staged
1610                                        "
1611                return
1612                ;;
1613        esac
1614        __git_complete_revlist_file
1615}
1616
1617__git_fetch_recurse_submodules="yes on-demand no"
1618
1619_git_fetch ()
1620{
1621        case "$cur" in
1622        --recurse-submodules=*)
1623                __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1624                return
1625                ;;
1626        --*)
1627                __gitcomp_builtin fetch "--no-tags"
1628                return
1629                ;;
1630        esac
1631        __git_complete_remote_or_refspec
1632}
1633
1634__git_format_patch_options="
1635        --stdout --attach --no-attach --thread --thread= --no-thread
1636        --numbered --start-number --numbered-files --keep-subject --signoff
1637        --signature --no-signature --in-reply-to= --cc= --full-index --binary
1638        --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1639        --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1640        --output-directory --reroll-count --to= --quiet --notes
1641"
1642
1643_git_format_patch ()
1644{
1645        case "$cur" in
1646        --thread=*)
1647                __gitcomp "
1648                        deep shallow
1649                        " "" "${cur##--thread=}"
1650                return
1651                ;;
1652        --*)
1653                __gitcomp "$__git_format_patch_options"
1654                return
1655                ;;
1656        esac
1657        __git_complete_revlist
1658}
1659
1660_git_fsck ()
1661{
1662        case "$cur" in
1663        --*)
1664                __gitcomp_builtin fsck "--no-reflogs"
1665                return
1666                ;;
1667        esac
1668}
1669
1670_git_gitk ()
1671{
1672        _gitk
1673}
1674
1675# Lists matching symbol names from a tag (as in ctags) file.
1676# 1: List symbol names matching this word.
1677# 2: The tag file to list symbol names from.
1678# 3: A prefix to be added to each listed symbol name (optional).
1679# 4: A suffix to be appended to each listed symbol name (optional).
1680__git_match_ctag () {
1681        awk -v pfx="${3-}" -v sfx="${4-}" "
1682                /^${1//\//\\/}/ { print pfx \$1 sfx }
1683                " "$2"
1684}
1685
1686# Complete symbol names from a tag file.
1687# Usage: __git_complete_symbol [<option>]...
1688# --tags=<file>: The tag file to list symbol names from instead of the
1689#                default "tags".
1690# --pfx=<prefix>: A prefix to be added to each symbol name.
1691# --cur=<word>: The current symbol name to be completed.  Defaults to
1692#               the current word to be completed.
1693# --sfx=<suffix>: A suffix to be appended to each symbol name instead
1694#                 of the default space.
1695__git_complete_symbol () {
1696        local tags=tags pfx="" cur_="${cur-}" sfx=" "
1697
1698        while test $# != 0; do
1699                case "$1" in
1700                --tags=*)       tags="${1##--tags=}" ;;
1701                --pfx=*)        pfx="${1##--pfx=}" ;;
1702                --cur=*)        cur_="${1##--cur=}" ;;
1703                --sfx=*)        sfx="${1##--sfx=}" ;;
1704                *)              return 1 ;;
1705                esac
1706                shift
1707        done
1708
1709        if test -r "$tags"; then
1710                __gitcomp_direct "$(__git_match_ctag "$cur_" "$tags" "$pfx" "$sfx")"
1711        fi
1712}
1713
1714_git_grep ()
1715{
1716        __git_has_doubledash && return
1717
1718        case "$cur" in
1719        --*)
1720                __gitcomp_builtin grep
1721                return
1722                ;;
1723        esac
1724
1725        case "$cword,$prev" in
1726        2,*|*,-*)
1727                __git_complete_symbol && return
1728                ;;
1729        esac
1730
1731        __git_complete_refs
1732}
1733
1734_git_help ()
1735{
1736        case "$cur" in
1737        --*)
1738                __gitcomp_builtin help
1739                return
1740                ;;
1741        esac
1742        __git_compute_all_commands
1743        __gitcomp "$__git_all_commands $(__git_aliases)
1744                attributes cli core-tutorial cvs-migration
1745                diffcore everyday gitk glossary hooks ignore modules
1746                namespaces repository-layout revisions tutorial tutorial-2
1747                workflows
1748                "
1749}
1750
1751_git_init ()
1752{
1753        case "$cur" in
1754        --shared=*)
1755                __gitcomp "
1756                        false true umask group all world everybody
1757                        " "" "${cur##--shared=}"
1758                return
1759                ;;
1760        --*)
1761                __gitcomp_builtin init
1762                return
1763                ;;
1764        esac
1765}
1766
1767_git_ls_files ()
1768{
1769        case "$cur" in
1770        --*)
1771                __gitcomp_builtin ls-files "--no-empty-directory"
1772                return
1773                ;;
1774        esac
1775
1776        # XXX ignore options like --modified and always suggest all cached
1777        # files.
1778        __git_complete_index_file "--cached"
1779}
1780
1781_git_ls_remote ()
1782{
1783        case "$cur" in
1784        --*)
1785                __gitcomp_builtin ls-remote
1786                return
1787                ;;
1788        esac
1789        __gitcomp_nl "$(__git_remotes)"
1790}
1791
1792_git_ls_tree ()
1793{
1794        case "$cur" in
1795        --*)
1796                __gitcomp_builtin ls-tree
1797                return
1798                ;;
1799        esac
1800
1801        __git_complete_file
1802}
1803
1804# Options that go well for log, shortlog and gitk
1805__git_log_common_options="
1806        --not --all
1807        --branches --tags --remotes
1808        --first-parent --merges --no-merges
1809        --max-count=
1810        --max-age= --since= --after=
1811        --min-age= --until= --before=
1812        --min-parents= --max-parents=
1813        --no-min-parents --no-max-parents
1814"
1815# Options that go well for log and gitk (not shortlog)
1816__git_log_gitk_options="
1817        --dense --sparse --full-history
1818        --simplify-merges --simplify-by-decoration
1819        --left-right --notes --no-notes
1820"
1821# Options that go well for log and shortlog (not gitk)
1822__git_log_shortlog_options="
1823        --author= --committer= --grep=
1824        --all-match --invert-grep
1825"
1826
1827__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1828__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1829
1830_git_log ()
1831{
1832        __git_has_doubledash && return
1833        __git_find_repo_path
1834
1835        local merge=""
1836        if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
1837                merge="--merge"
1838        fi
1839        case "$prev,$cur" in
1840        -L,:*:*)
1841                return  # fall back to Bash filename completion
1842                ;;
1843        -L,:*)
1844                __git_complete_symbol --cur="${cur#:}" --sfx=":"
1845                return
1846                ;;
1847        -G,*|-S,*)
1848                __git_complete_symbol
1849                return
1850                ;;
1851        esac
1852        case "$cur" in
1853        --pretty=*|--format=*)
1854                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1855                        " "" "${cur#*=}"
1856                return
1857                ;;
1858        --date=*)
1859                __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1860                return
1861                ;;
1862        --decorate=*)
1863                __gitcomp "full short no" "" "${cur##--decorate=}"
1864                return
1865                ;;
1866        --diff-algorithm=*)
1867                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1868                return
1869                ;;
1870        --submodule=*)
1871                __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1872                return
1873                ;;
1874        --*)
1875                __gitcomp "
1876                        $__git_log_common_options
1877                        $__git_log_shortlog_options
1878                        $__git_log_gitk_options
1879                        --root --topo-order --date-order --reverse
1880                        --follow --full-diff
1881                        --abbrev-commit --abbrev=
1882                        --relative-date --date=
1883                        --pretty= --format= --oneline
1884                        --show-signature
1885                        --cherry-mark
1886                        --cherry-pick
1887                        --graph
1888                        --decorate --decorate=
1889                        --walk-reflogs
1890                        --parents --children
1891                        $merge
1892                        $__git_diff_common_options
1893                        --pickaxe-all --pickaxe-regex
1894                        "
1895                return
1896                ;;
1897        -L:*:*)
1898                return  # fall back to Bash filename completion
1899                ;;
1900        -L:*)
1901                __git_complete_symbol --cur="${cur#-L:}" --sfx=":"
1902                return
1903                ;;
1904        -G*)
1905                __git_complete_symbol --pfx="-G" --cur="${cur#-G}"
1906                return
1907                ;;
1908        -S*)
1909                __git_complete_symbol --pfx="-S" --cur="${cur#-S}"
1910                return
1911                ;;
1912        esac
1913        __git_complete_revlist
1914}
1915
1916_git_merge ()
1917{
1918        __git_complete_strategy && return
1919
1920        case "$cur" in
1921        --*)
1922                __gitcomp_builtin merge "--no-rerere-autoupdate
1923                                --no-commit --no-edit --no-ff
1924                                --no-log --no-progress
1925                                --no-squash --no-stat
1926                                --no-verify-signatures
1927                                "
1928                return
1929        esac
1930        __git_complete_refs
1931}
1932
1933_git_mergetool ()
1934{
1935        case "$cur" in
1936        --tool=*)
1937                __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1938                return
1939                ;;
1940        --*)
1941                __gitcomp "--tool= --prompt --no-prompt"
1942                return
1943                ;;
1944        esac
1945}
1946
1947_git_merge_base ()
1948{
1949        case "$cur" in
1950        --*)
1951                __gitcomp_builtin merge-base
1952                return
1953                ;;
1954        esac
1955        __git_complete_refs
1956}
1957
1958_git_mv ()
1959{
1960        case "$cur" in
1961        --*)
1962                __gitcomp_builtin mv
1963                return
1964                ;;
1965        esac
1966
1967        if [ $(__git_count_arguments "mv") -gt 0 ]; then
1968                # We need to show both cached and untracked files (including
1969                # empty directories) since this may not be the last argument.
1970                __git_complete_index_file "--cached --others --directory"
1971        else
1972                __git_complete_index_file "--cached"
1973        fi
1974}
1975
1976_git_notes ()
1977{
1978        local subcommands='add append copy edit get-ref list merge prune remove show'
1979        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1980
1981        case "$subcommand,$cur" in
1982        ,--*)
1983                __gitcomp_builtin notes
1984                ;;
1985        ,*)
1986                case "$prev" in
1987                --ref)
1988                        __git_complete_refs
1989                        ;;
1990                *)
1991                        __gitcomp "$subcommands --ref"
1992                        ;;
1993                esac
1994                ;;
1995        *,--reuse-message=*|*,--reedit-message=*)
1996                __git_complete_refs --cur="${cur#*=}"
1997                ;;
1998        *,--*)
1999                __gitcomp_builtin notes_$subcommand
2000                ;;
2001        prune,*|get-ref,*)
2002                # this command does not take a ref, do not complete it
2003                ;;
2004        *)
2005                case "$prev" in
2006                -m|-F)
2007                        ;;
2008                *)
2009                        __git_complete_refs
2010                        ;;
2011                esac
2012                ;;
2013        esac
2014}
2015
2016_git_pull ()
2017{
2018        __git_complete_strategy && return
2019
2020        case "$cur" in
2021        --recurse-submodules=*)
2022                __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
2023                return
2024                ;;
2025        --*)
2026                __gitcomp_builtin pull "--no-autostash --no-commit --no-edit
2027                                        --no-ff --no-log --no-progress --no-rebase
2028                                        --no-squash --no-stat --no-tags
2029                                        --no-verify-signatures"
2030
2031                return
2032                ;;
2033        esac
2034        __git_complete_remote_or_refspec
2035}
2036
2037__git_push_recurse_submodules="check on-demand only"
2038
2039__git_complete_force_with_lease ()
2040{
2041        local cur_=$1
2042
2043        case "$cur_" in
2044        --*=)
2045                ;;
2046        *:*)
2047                __git_complete_refs --cur="${cur_#*:}"
2048                ;;
2049        *)
2050                __git_complete_refs --cur="$cur_"
2051                ;;
2052        esac
2053}
2054
2055_git_push ()
2056{
2057        case "$prev" in
2058        --repo)
2059                __gitcomp_nl "$(__git_remotes)"
2060                return
2061                ;;
2062        --recurse-submodules)
2063                __gitcomp "$__git_push_recurse_submodules"
2064                return
2065                ;;
2066        esac
2067        case "$cur" in
2068        --repo=*)
2069                __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
2070                return
2071                ;;
2072        --recurse-submodules=*)
2073                __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
2074                return
2075                ;;
2076        --force-with-lease=*)
2077                __git_complete_force_with_lease "${cur##--force-with-lease=}"
2078                return
2079                ;;
2080        --*)
2081                __gitcomp_builtin push
2082                return
2083                ;;
2084        esac
2085        __git_complete_remote_or_refspec
2086}
2087
2088_git_rebase ()
2089{
2090        __git_find_repo_path
2091        if [ -f "$__git_repo_path"/rebase-merge/interactive ]; then
2092                __gitcomp "--continue --skip --abort --quit --edit-todo --show-current-patch"
2093                return
2094        elif [ -d "$__git_repo_path"/rebase-apply ] || \
2095             [ -d "$__git_repo_path"/rebase-merge ]; then
2096                __gitcomp "--continue --skip --abort --quit --show-current-patch"
2097                return
2098        fi
2099        __git_complete_strategy && return
2100        case "$cur" in
2101        --whitespace=*)
2102                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
2103                return
2104                ;;
2105        --*)
2106                __gitcomp "
2107                        --onto --merge --strategy --interactive
2108                        --rebase-merges --preserve-merges --stat --no-stat
2109                        --committer-date-is-author-date --ignore-date
2110                        --ignore-whitespace --whitespace=
2111                        --autosquash --no-autosquash
2112                        --fork-point --no-fork-point
2113                        --autostash --no-autostash
2114                        --verify --no-verify
2115                        --keep-empty --root --force-rebase --no-ff
2116                        --rerere-autoupdate
2117                        --exec
2118                        "
2119
2120                return
2121        esac
2122        __git_complete_refs
2123}
2124
2125_git_reflog ()
2126{
2127        local subcommands="show delete expire"
2128        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2129
2130        if [ -z "$subcommand" ]; then
2131                __gitcomp "$subcommands"
2132        else
2133                __git_complete_refs
2134        fi
2135}
2136
2137__git_send_email_confirm_options="always never auto cc compose"
2138__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
2139
2140_git_send_email ()
2141{
2142        case "$prev" in
2143        --to|--cc|--bcc|--from)
2144                __gitcomp "$(__git send-email --dump-aliases)"
2145                return
2146                ;;
2147        esac
2148
2149        case "$cur" in
2150        --confirm=*)
2151                __gitcomp "
2152                        $__git_send_email_confirm_options
2153                        " "" "${cur##--confirm=}"
2154                return
2155                ;;
2156        --suppress-cc=*)
2157                __gitcomp "
2158                        $__git_send_email_suppresscc_options
2159                        " "" "${cur##--suppress-cc=}"
2160
2161                return
2162                ;;
2163        --smtp-encryption=*)
2164                __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
2165                return
2166                ;;
2167        --thread=*)
2168                __gitcomp "
2169                        deep shallow
2170                        " "" "${cur##--thread=}"
2171                return
2172                ;;
2173        --to=*|--cc=*|--bcc=*|--from=*)
2174                __gitcomp "$(__git send-email --dump-aliases)" "" "${cur#--*=}"
2175                return
2176                ;;
2177        --*)
2178                __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
2179                        --compose --confirm= --dry-run --envelope-sender
2180                        --from --identity
2181                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
2182                        --no-suppress-from --no-thread --quiet --reply-to
2183                        --signed-off-by-cc --smtp-pass --smtp-server
2184                        --smtp-server-port --smtp-encryption= --smtp-user
2185                        --subject --suppress-cc= --suppress-from --thread --to
2186                        --validate --no-validate
2187                        $__git_format_patch_options"
2188                return
2189                ;;
2190        esac
2191        __git_complete_revlist
2192}
2193
2194_git_stage ()
2195{
2196        _git_add
2197}
2198
2199_git_status ()
2200{
2201        local complete_opt
2202        local untracked_state
2203
2204        case "$cur" in
2205        --ignore-submodules=*)
2206                __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
2207                return
2208                ;;
2209        --untracked-files=*)
2210                __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
2211                return
2212                ;;
2213        --column=*)
2214                __gitcomp "
2215                        always never auto column row plain dense nodense
2216                        " "" "${cur##--column=}"
2217                return
2218                ;;
2219        --*)
2220                __gitcomp_builtin status "--no-column"
2221                return
2222                ;;
2223        esac
2224
2225        untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
2226                "$__git_untracked_file_modes" "status.showUntrackedFiles")"
2227
2228        case "$untracked_state" in
2229        no)
2230                # --ignored option does not matter
2231                complete_opt=
2232                ;;
2233        all|normal|*)
2234                complete_opt="--cached --directory --no-empty-directory --others"
2235
2236                if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
2237                        complete_opt="$complete_opt --ignored --exclude=*"
2238                fi
2239                ;;
2240        esac
2241
2242        __git_complete_index_file "$complete_opt"
2243}
2244
2245__git_config_get_set_variables ()
2246{
2247        local prevword word config_file= c=$cword
2248        while [ $c -gt 1 ]; do
2249                word="${words[c]}"
2250                case "$word" in
2251                --system|--global|--local|--file=*)
2252                        config_file="$word"
2253                        break
2254                        ;;
2255                -f|--file)
2256                        config_file="$word $prevword"
2257                        break
2258                        ;;
2259                esac
2260                prevword=$word
2261                c=$((--c))
2262        done
2263
2264        __git config $config_file --name-only --list
2265}
2266
2267_git_config ()
2268{
2269        case "$prev" in
2270        branch.*.remote|branch.*.pushremote)
2271                __gitcomp_nl "$(__git_remotes)"
2272                return
2273                ;;
2274        branch.*.merge)
2275                __git_complete_refs
2276                return
2277                ;;
2278        branch.*.rebase)
2279                __gitcomp "false true merges preserve interactive"
2280                return
2281                ;;
2282        remote.pushdefault)
2283                __gitcomp_nl "$(__git_remotes)"
2284                return
2285                ;;
2286        remote.*.fetch)
2287                local remote="${prev#remote.}"
2288                remote="${remote%.fetch}"
2289                if [ -z "$cur" ]; then
2290                        __gitcomp_nl "refs/heads/" "" "" ""
2291                        return
2292                fi
2293                __gitcomp_nl "$(__git_refs_remotes "$remote")"
2294                return
2295                ;;
2296        remote.*.push)
2297                local remote="${prev#remote.}"
2298                remote="${remote%.push}"
2299                __gitcomp_nl "$(__git for-each-ref \
2300                        --format='%(refname):%(refname)' refs/heads)"
2301                return
2302                ;;
2303        pull.twohead|pull.octopus)
2304                __git_compute_merge_strategies
2305                __gitcomp "$__git_merge_strategies"
2306                return
2307                ;;
2308        color.branch|color.diff|color.interactive|\
2309        color.showbranch|color.status|color.ui)
2310                __gitcomp "always never auto"
2311                return
2312                ;;
2313        color.pager)
2314                __gitcomp "false true"
2315                return
2316                ;;
2317        color.*.*)
2318                __gitcomp "
2319                        normal black red green yellow blue magenta cyan white
2320                        bold dim ul blink reverse
2321                        "
2322                return
2323                ;;
2324        diff.submodule)
2325                __gitcomp "log short"
2326                return
2327                ;;
2328        help.format)
2329                __gitcomp "man info web html"
2330                return
2331                ;;
2332        log.date)
2333                __gitcomp "$__git_log_date_formats"
2334                return
2335                ;;
2336        sendemail.aliasfiletype)
2337                __gitcomp "mutt mailrc pine elm gnus"
2338                return
2339                ;;
2340        sendemail.confirm)
2341                __gitcomp "$__git_send_email_confirm_options"
2342                return
2343                ;;
2344        sendemail.suppresscc)
2345                __gitcomp "$__git_send_email_suppresscc_options"
2346                return
2347                ;;
2348        sendemail.transferencoding)
2349                __gitcomp "7bit 8bit quoted-printable base64"
2350                return
2351                ;;
2352        --get|--get-all|--unset|--unset-all)
2353                __gitcomp_nl "$(__git_config_get_set_variables)"
2354                return
2355                ;;
2356        *.*)
2357                return
2358                ;;
2359        esac
2360        case "$cur" in
2361        --*)
2362                __gitcomp_builtin config
2363                return
2364                ;;
2365        branch.*.*)
2366                local pfx="${cur%.*}." cur_="${cur##*.}"
2367                __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
2368                return
2369                ;;
2370        branch.*)
2371                local pfx="${cur%.*}." cur_="${cur#*.}"
2372                __gitcomp_direct "$(__git_heads "$pfx" "$cur_" ".")"
2373                __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
2374                return
2375                ;;
2376        guitool.*.*)
2377                local pfx="${cur%.*}." cur_="${cur##*.}"
2378                __gitcomp "
2379                        argprompt cmd confirm needsfile noconsole norescan
2380                        prompt revprompt revunmerged title
2381                        " "$pfx" "$cur_"
2382                return
2383                ;;
2384        difftool.*.*)
2385                local pfx="${cur%.*}." cur_="${cur##*.}"
2386                __gitcomp "cmd path" "$pfx" "$cur_"
2387                return
2388                ;;
2389        man.*.*)
2390                local pfx="${cur%.*}." cur_="${cur##*.}"
2391                __gitcomp "cmd path" "$pfx" "$cur_"
2392                return
2393                ;;
2394        mergetool.*.*)
2395                local pfx="${cur%.*}." cur_="${cur##*.}"
2396                __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
2397                return
2398                ;;
2399        pager.*)
2400                local pfx="${cur%.*}." cur_="${cur#*.}"
2401                __git_compute_all_commands
2402                __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
2403                return
2404                ;;
2405        remote.*.*)
2406                local pfx="${cur%.*}." cur_="${cur##*.}"
2407                __gitcomp "
2408                        url proxy fetch push mirror skipDefaultUpdate
2409                        receivepack uploadpack tagopt pushurl
2410                        " "$pfx" "$cur_"
2411                return
2412                ;;
2413        remote.*)
2414                local pfx="${cur%.*}." cur_="${cur#*.}"
2415                __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
2416                __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
2417                return
2418                ;;
2419        url.*.*)
2420                local pfx="${cur%.*}." cur_="${cur##*.}"
2421                __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2422                return
2423                ;;
2424        esac
2425        __gitcomp "
2426                add.ignoreErrors
2427                advice.amWorkDir
2428                advice.commitBeforeMerge
2429                advice.detachedHead
2430                advice.implicitIdentity
2431                advice.pushAlreadyExists
2432                advice.pushFetchFirst
2433                advice.pushNeedsForce
2434                advice.pushNonFFCurrent
2435                advice.pushNonFFMatching
2436                advice.pushUpdateRejected
2437                advice.resolveConflict
2438                advice.rmHints
2439                advice.statusHints
2440                advice.statusUoption
2441                advice.ignoredHook
2442                alias.
2443                am.keepcr
2444                am.threeWay
2445                apply.ignorewhitespace
2446                apply.whitespace
2447                branch.autosetupmerge
2448                branch.autosetuprebase
2449                browser.
2450                clean.requireForce
2451                color.branch
2452                color.branch.current
2453                color.branch.local
2454                color.branch.plain
2455                color.branch.remote
2456                color.decorate.HEAD
2457                color.decorate.branch
2458                color.decorate.remoteBranch
2459                color.decorate.stash
2460                color.decorate.tag
2461                color.diff
2462                color.diff.commit
2463                color.diff.frag
2464                color.diff.func
2465                color.diff.meta
2466                color.diff.new
2467                color.diff.old
2468                color.diff.plain
2469                color.diff.whitespace
2470                color.grep
2471                color.grep.context
2472                color.grep.filename
2473                color.grep.function
2474                color.grep.linenumber
2475                color.grep.match
2476                color.grep.selected
2477                color.grep.separator
2478                color.interactive
2479                color.interactive.error
2480                color.interactive.header
2481                color.interactive.help
2482                color.interactive.prompt
2483                color.pager
2484                color.showbranch
2485                color.status
2486                color.status.added
2487                color.status.changed
2488                color.status.header
2489                color.status.localBranch
2490                color.status.nobranch
2491                color.status.remoteBranch
2492                color.status.unmerged
2493                color.status.untracked
2494                color.status.updated
2495                color.ui
2496                commit.cleanup
2497                commit.gpgSign
2498                commit.status
2499                commit.template
2500                commit.verbose
2501                core.abbrev
2502                core.askpass
2503                core.attributesfile
2504                core.autocrlf
2505                core.bare
2506                core.bigFileThreshold
2507                core.checkStat
2508                core.commentChar
2509                core.commitGraph
2510                core.compression
2511                core.createObject
2512                core.deltaBaseCacheLimit
2513                core.editor
2514                core.eol
2515                core.excludesfile
2516                core.fileMode
2517                core.fsyncobjectfiles
2518                core.gitProxy
2519                core.hideDotFiles
2520                core.hooksPath
2521                core.ignoreStat
2522                core.ignorecase
2523                core.logAllRefUpdates
2524                core.loosecompression
2525                core.notesRef
2526                core.packedGitLimit
2527                core.packedGitWindowSize
2528                core.packedRefsTimeout
2529                core.pager
2530                core.precomposeUnicode
2531                core.preferSymlinkRefs
2532                core.preloadindex
2533                core.protectHFS
2534                core.protectNTFS
2535                core.quotepath
2536                core.repositoryFormatVersion
2537                core.safecrlf
2538                core.sharedRepository
2539                core.sparseCheckout
2540                core.splitIndex
2541                core.sshCommand
2542                core.symlinks
2543                core.trustctime
2544                core.untrackedCache
2545                core.warnAmbiguousRefs
2546                core.whitespace
2547                core.worktree
2548                credential.helper
2549                credential.useHttpPath
2550                credential.username
2551                credentialCache.ignoreSIGHUP
2552                diff.autorefreshindex
2553                diff.external
2554                diff.ignoreSubmodules
2555                diff.mnemonicprefix
2556                diff.noprefix
2557                diff.renameLimit
2558                diff.renames
2559                diff.statGraphWidth
2560                diff.submodule
2561                diff.suppressBlankEmpty
2562                diff.tool
2563                diff.wordRegex
2564                diff.algorithm
2565                difftool.
2566                difftool.prompt
2567                fetch.recurseSubmodules
2568                fetch.unpackLimit
2569                format.attach
2570                format.cc
2571                format.coverLetter
2572                format.from
2573                format.headers
2574                format.numbered
2575                format.pretty
2576                format.signature
2577                format.signoff
2578                format.subjectprefix
2579                format.suffix
2580                format.thread
2581                format.to
2582                gc.
2583                gc.aggressiveDepth
2584                gc.aggressiveWindow
2585                gc.auto
2586                gc.autoDetach
2587                gc.autopacklimit
2588                gc.logExpiry
2589                gc.packrefs
2590                gc.pruneexpire
2591                gc.reflogexpire
2592                gc.reflogexpireunreachable
2593                gc.rerereresolved
2594                gc.rerereunresolved
2595                gc.worktreePruneExpire
2596                gitcvs.allbinary
2597                gitcvs.commitmsgannotation
2598                gitcvs.dbTableNamePrefix
2599                gitcvs.dbdriver
2600                gitcvs.dbname
2601                gitcvs.dbpass
2602                gitcvs.dbuser
2603                gitcvs.enabled
2604                gitcvs.logfile
2605                gitcvs.usecrlfattr
2606                guitool.
2607                gui.blamehistoryctx
2608                gui.commitmsgwidth
2609                gui.copyblamethreshold
2610                gui.diffcontext
2611                gui.encoding
2612                gui.fastcopyblame
2613                gui.matchtrackingbranch
2614                gui.newbranchtemplate
2615                gui.pruneduringfetch
2616                gui.spellingdictionary
2617                gui.trustmtime
2618                help.autocorrect
2619                help.browser
2620                help.format
2621                http.lowSpeedLimit
2622                http.lowSpeedTime
2623                http.maxRequests
2624                http.minSessions
2625                http.noEPSV
2626                http.postBuffer
2627                http.proxy
2628                http.sslCipherList
2629                http.sslVersion
2630                http.sslCAInfo
2631                http.sslCAPath
2632                http.sslCert
2633                http.sslCertPasswordProtected
2634                http.sslKey
2635                http.sslVerify
2636                http.useragent
2637                i18n.commitEncoding
2638                i18n.logOutputEncoding
2639                imap.authMethod
2640                imap.folder
2641                imap.host
2642                imap.pass
2643                imap.port
2644                imap.preformattedHTML
2645                imap.sslverify
2646                imap.tunnel
2647                imap.user
2648                init.templatedir
2649                instaweb.browser
2650                instaweb.httpd
2651                instaweb.local
2652                instaweb.modulepath
2653                instaweb.port
2654                interactive.singlekey
2655                log.date
2656                log.decorate
2657                log.showroot
2658                mailmap.file
2659                man.
2660                man.viewer
2661                merge.
2662                merge.conflictstyle
2663                merge.log
2664                merge.renameLimit
2665                merge.renormalize
2666                merge.stat
2667                merge.tool
2668                merge.verbosity
2669                mergetool.
2670                mergetool.keepBackup
2671                mergetool.keepTemporaries
2672                mergetool.prompt
2673                notes.displayRef
2674                notes.rewrite.
2675                notes.rewrite.amend
2676                notes.rewrite.rebase
2677                notes.rewriteMode
2678                notes.rewriteRef
2679                pack.compression
2680                pack.deltaCacheLimit
2681                pack.deltaCacheSize
2682                pack.depth
2683                pack.indexVersion
2684                pack.packSizeLimit
2685                pack.threads
2686                pack.window
2687                pack.windowMemory
2688                pager.
2689                pretty.
2690                pull.octopus
2691                pull.twohead
2692                push.default
2693                push.followTags
2694                rebase.autosquash
2695                rebase.stat
2696                receive.autogc
2697                receive.denyCurrentBranch
2698                receive.denyDeleteCurrent
2699                receive.denyDeletes
2700                receive.denyNonFastForwards
2701                receive.fsckObjects
2702                receive.unpackLimit
2703                receive.updateserverinfo
2704                remote.pushdefault
2705                remotes.
2706                repack.usedeltabaseoffset
2707                rerere.autoupdate
2708                rerere.enabled
2709                sendemail.
2710                sendemail.aliasesfile
2711                sendemail.aliasfiletype
2712                sendemail.bcc
2713                sendemail.cc
2714                sendemail.cccmd
2715                sendemail.chainreplyto
2716                sendemail.confirm
2717                sendemail.envelopesender
2718                sendemail.from
2719                sendemail.identity
2720                sendemail.multiedit
2721                sendemail.signedoffbycc
2722                sendemail.smtpdomain
2723                sendemail.smtpencryption
2724                sendemail.smtppass
2725                sendemail.smtpserver
2726                sendemail.smtpserveroption
2727                sendemail.smtpserverport
2728                sendemail.smtpuser
2729                sendemail.suppresscc
2730                sendemail.suppressfrom
2731                sendemail.thread
2732                sendemail.to
2733                sendemail.tocmd
2734                sendemail.validate
2735                sendemail.smtpbatchsize
2736                sendemail.smtprelogindelay
2737                showbranch.default
2738                status.relativePaths
2739                status.showUntrackedFiles
2740                status.submodulesummary
2741                submodule.
2742                tar.umask
2743                transfer.unpackLimit
2744                url.
2745                user.email
2746                user.name
2747                user.signingkey
2748                web.browser
2749                branch. remote.
2750        "
2751}
2752
2753_git_remote ()
2754{
2755        local subcommands="
2756                add rename remove set-head set-branches
2757                get-url set-url show prune update
2758                "
2759        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2760        if [ -z "$subcommand" ]; then
2761                case "$cur" in
2762                --*)
2763                        __gitcomp_builtin remote
2764                        ;;
2765                *)
2766                        __gitcomp "$subcommands"
2767                        ;;
2768                esac
2769                return
2770        fi
2771
2772        case "$subcommand,$cur" in
2773        add,--*)
2774                __gitcomp_builtin remote_add "--no-tags"
2775                ;;
2776        add,*)
2777                ;;
2778        set-head,--*)
2779                __gitcomp_builtin remote_set-head
2780                ;;
2781        set-branches,--*)
2782                __gitcomp_builtin remote_set-branches
2783                ;;
2784        set-head,*|set-branches,*)
2785                __git_complete_remote_or_refspec
2786                ;;
2787        update,--*)
2788                __gitcomp_builtin remote_update
2789                ;;
2790        update,*)
2791                __gitcomp "$(__git_get_config_variables "remotes")"
2792                ;;
2793        set-url,--*)
2794                __gitcomp_builtin remote_set-url
2795                ;;
2796        get-url,--*)
2797                __gitcomp_builtin remote_get-url
2798                ;;
2799        prune,--*)
2800                __gitcomp_builtin remote_prune
2801                ;;
2802        *)
2803                __gitcomp_nl "$(__git_remotes)"
2804                ;;
2805        esac
2806}
2807
2808_git_replace ()
2809{
2810        case "$cur" in
2811        --*)
2812                __gitcomp_builtin replace
2813                return
2814                ;;
2815        esac
2816        __git_complete_refs
2817}
2818
2819_git_rerere ()
2820{
2821        local subcommands="clear forget diff remaining status gc"
2822        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2823        if test -z "$subcommand"
2824        then
2825                __gitcomp "$subcommands"
2826                return
2827        fi
2828}
2829
2830_git_reset ()
2831{
2832        __git_has_doubledash && return
2833
2834        case "$cur" in
2835        --*)
2836                __gitcomp_builtin reset
2837                return
2838                ;;
2839        esac
2840        __git_complete_refs
2841}
2842
2843__git_revert_inprogress_options="--continue --quit --abort"
2844
2845_git_revert ()
2846{
2847        __git_find_repo_path
2848        if [ -f "$__git_repo_path"/REVERT_HEAD ]; then
2849                __gitcomp "$__git_revert_inprogress_options"
2850                return
2851        fi
2852        case "$cur" in
2853        --*)
2854                __gitcomp_builtin revert "--no-edit" \
2855                        "$__git_revert_inprogress_options"
2856                return
2857                ;;
2858        esac
2859        __git_complete_refs
2860}
2861
2862_git_rm ()
2863{
2864        case "$cur" in
2865        --*)
2866                __gitcomp_builtin rm
2867                return
2868                ;;
2869        esac
2870
2871        __git_complete_index_file "--cached"
2872}
2873
2874_git_shortlog ()
2875{
2876        __git_has_doubledash && return
2877
2878        case "$cur" in
2879        --*)
2880                __gitcomp "
2881                        $__git_log_common_options
2882                        $__git_log_shortlog_options
2883                        --numbered --summary --email
2884                        "
2885                return
2886                ;;
2887        esac
2888        __git_complete_revlist
2889}
2890
2891_git_show ()
2892{
2893        __git_has_doubledash && return
2894
2895        case "$cur" in
2896        --pretty=*|--format=*)
2897                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2898                        " "" "${cur#*=}"
2899                return
2900                ;;
2901        --diff-algorithm=*)
2902                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2903                return
2904                ;;
2905        --submodule=*)
2906                __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
2907                return
2908                ;;
2909        --*)
2910                __gitcomp "--pretty= --format= --abbrev-commit --oneline
2911                        --show-signature
2912                        $__git_diff_common_options
2913                        "
2914                return
2915                ;;
2916        esac
2917        __git_complete_revlist_file
2918}
2919
2920_git_show_branch ()
2921{
2922        case "$cur" in
2923        --*)
2924                __gitcomp_builtin show-branch "--no-color"
2925                return
2926                ;;
2927        esac
2928        __git_complete_revlist
2929}
2930
2931_git_stash ()
2932{
2933        local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
2934        local subcommands='push list show apply clear drop pop create branch'
2935        local subcommand="$(__git_find_on_cmdline "$subcommands save")"
2936        if [ -n "$(__git_find_on_cmdline "-p")" ]; then
2937                subcommand="push"
2938        fi
2939        if [ -z "$subcommand" ]; then
2940                case "$cur" in
2941                --*)
2942                        __gitcomp "$save_opts"
2943                        ;;
2944                sa*)
2945                        if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2946                                __gitcomp "save"
2947                        fi
2948                        ;;
2949                *)
2950                        if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2951                                __gitcomp "$subcommands"
2952                        fi
2953                        ;;
2954                esac
2955        else
2956                case "$subcommand,$cur" in
2957                push,--*)
2958                        __gitcomp "$save_opts --message"
2959                        ;;
2960                save,--*)
2961                        __gitcomp "$save_opts"
2962                        ;;
2963                apply,--*|pop,--*)
2964                        __gitcomp "--index --quiet"
2965                        ;;
2966                drop,--*)
2967                        __gitcomp "--quiet"
2968                        ;;
2969                show,--*|branch,--*)
2970                        ;;
2971                branch,*)
2972                        if [ $cword -eq 3 ]; then
2973                                __git_complete_refs
2974                        else
2975                                __gitcomp_nl "$(__git stash list \
2976                                                | sed -n -e 's/:.*//p')"
2977                        fi
2978                        ;;
2979                show,*|apply,*|drop,*|pop,*)
2980                        __gitcomp_nl "$(__git stash list \
2981                                        | sed -n -e 's/:.*//p')"
2982                        ;;
2983                *)
2984                        ;;
2985                esac
2986        fi
2987}
2988
2989_git_submodule ()
2990{
2991        __git_has_doubledash && return
2992
2993        local subcommands="add status init deinit update summary foreach sync"
2994        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2995        if [ -z "$subcommand" ]; then
2996                case "$cur" in
2997                --*)
2998                        __gitcomp "--quiet"
2999                        ;;
3000                *)
3001                        __gitcomp "$subcommands"
3002                        ;;
3003                esac
3004                return
3005        fi
3006
3007        case "$subcommand,$cur" in
3008        add,--*)
3009                __gitcomp "--branch --force --name --reference --depth"
3010                ;;
3011        status,--*)
3012                __gitcomp "--cached --recursive"
3013                ;;
3014        deinit,--*)
3015                __gitcomp "--force --all"
3016                ;;
3017        update,--*)
3018                __gitcomp "
3019                        --init --remote --no-fetch
3020                        --recommend-shallow --no-recommend-shallow
3021                        --force --rebase --merge --reference --depth --recursive --jobs
3022                "
3023                ;;
3024        summary,--*)
3025                __gitcomp "--cached --files --summary-limit"
3026                ;;
3027        foreach,--*|sync,--*)
3028                __gitcomp "--recursive"
3029                ;;
3030        *)
3031                ;;
3032        esac
3033}
3034
3035_git_svn ()
3036{
3037        local subcommands="
3038                init fetch clone rebase dcommit log find-rev
3039                set-tree commit-diff info create-ignore propget
3040                proplist show-ignore show-externals branch tag blame
3041                migrate mkdirs reset gc
3042                "
3043        local subcommand="$(__git_find_on_cmdline "$subcommands")"
3044        if [ -z "$subcommand" ]; then
3045                __gitcomp "$subcommands"
3046        else
3047                local remote_opts="--username= --config-dir= --no-auth-cache"
3048                local fc_opts="
3049                        --follow-parent --authors-file= --repack=
3050                        --no-metadata --use-svm-props --use-svnsync-props
3051                        --log-window-size= --no-checkout --quiet
3052                        --repack-flags --use-log-author --localtime
3053                        --add-author-from
3054                        --ignore-paths= --include-paths= $remote_opts
3055                        "
3056                local init_opts="
3057                        --template= --shared= --trunk= --tags=
3058                        --branches= --stdlayout --minimize-url
3059                        --no-metadata --use-svm-props --use-svnsync-props
3060                        --rewrite-root= --prefix= $remote_opts
3061                        "
3062                local cmt_opts="
3063                        --edit --rmdir --find-copies-harder --copy-similarity=
3064                        "
3065
3066                case "$subcommand,$cur" in
3067                fetch,--*)
3068                        __gitcomp "--revision= --fetch-all $fc_opts"
3069                        ;;
3070                clone,--*)
3071                        __gitcomp "--revision= $fc_opts $init_opts"
3072                        ;;
3073                init,--*)
3074                        __gitcomp "$init_opts"
3075                        ;;
3076                dcommit,--*)
3077                        __gitcomp "
3078                                --merge --strategy= --verbose --dry-run
3079                                --fetch-all --no-rebase --commit-url
3080                                --revision --interactive $cmt_opts $fc_opts
3081                                "
3082                        ;;
3083                set-tree,--*)
3084                        __gitcomp "--stdin $cmt_opts $fc_opts"
3085                        ;;
3086                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
3087                show-externals,--*|mkdirs,--*)
3088                        __gitcomp "--revision="
3089                        ;;
3090                log,--*)
3091                        __gitcomp "
3092                                --limit= --revision= --verbose --incremental
3093                                --oneline --show-commit --non-recursive
3094                                --authors-file= --color
3095                                "
3096                        ;;
3097                rebase,--*)
3098                        __gitcomp "
3099                                --merge --verbose --strategy= --local
3100                                --fetch-all --dry-run $fc_opts
3101                                "
3102                        ;;
3103                commit-diff,--*)
3104                        __gitcomp "--message= --file= --revision= $cmt_opts"
3105                        ;;
3106                info,--*)
3107                        __gitcomp "--url"
3108                        ;;
3109                branch,--*)
3110                        __gitcomp "--dry-run --message --tag"
3111                        ;;
3112                tag,--*)
3113                        __gitcomp "--dry-run --message"
3114                        ;;
3115                blame,--*)
3116                        __gitcomp "--git-format"
3117                        ;;
3118                migrate,--*)
3119                        __gitcomp "
3120                                --config-dir= --ignore-paths= --minimize
3121                                --no-auth-cache --username=
3122                                "
3123                        ;;
3124                reset,--*)
3125                        __gitcomp "--revision= --parent"
3126                        ;;
3127                *)
3128                        ;;
3129                esac
3130        fi
3131}
3132
3133_git_tag ()
3134{
3135        local i c=1 f=0
3136        while [ $c -lt $cword ]; do
3137                i="${words[c]}"
3138                case "$i" in
3139                -d|--delete|-v|--verify)
3140                        __gitcomp_direct "$(__git_tags "" "$cur" " ")"
3141                        return
3142                        ;;
3143                -f)
3144                        f=1
3145                        ;;
3146                esac
3147                ((c++))
3148        done
3149
3150        case "$prev" in
3151        -m|-F)
3152                ;;
3153        -*|tag)
3154                if [ $f = 1 ]; then
3155                        __gitcomp_direct "$(__git_tags "" "$cur" " ")"
3156                fi
3157                ;;
3158        *)
3159                __git_complete_refs
3160                ;;
3161        esac
3162
3163        case "$cur" in
3164        --*)
3165                __gitcomp_builtin tag
3166                ;;
3167        esac
3168}
3169
3170_git_whatchanged ()
3171{
3172        _git_log
3173}
3174
3175_git_worktree ()
3176{
3177        local subcommands="add list lock move prune remove unlock"
3178        local subcommand="$(__git_find_on_cmdline "$subcommands")"
3179        if [ -z "$subcommand" ]; then
3180                __gitcomp "$subcommands"
3181        else
3182                case "$subcommand,$cur" in
3183                add,--*)
3184                        __gitcomp_builtin worktree_add
3185                        ;;
3186                list,--*)
3187                        __gitcomp_builtin worktree_list
3188                        ;;
3189                lock,--*)
3190                        __gitcomp_builtin worktree_lock
3191                        ;;
3192                prune,--*)
3193                        __gitcomp_builtin worktree_prune
3194                        ;;
3195                remove,--*)
3196                        __gitcomp "--force"
3197                        ;;
3198                *)
3199                        ;;
3200                esac
3201        fi
3202}
3203
3204__git_complete_common () {
3205        local command="$1"
3206
3207        case "$cur" in
3208        --*)
3209                __gitcomp_builtin "$command"
3210                ;;
3211        esac
3212}
3213
3214__git_cmds_with_parseopt_helper=
3215__git_support_parseopt_helper () {
3216        test -n "$__git_cmds_with_parseopt_helper" ||
3217                __git_cmds_with_parseopt_helper="$(__git --list-parseopt-builtins)"
3218
3219        case " $__git_cmds_with_parseopt_helper " in
3220        *" $1 "*)
3221                return 0
3222                ;;
3223        *)
3224                return 1
3225                ;;
3226        esac
3227}
3228
3229__git_complete_command () {
3230        local command="$1"
3231        local completion_func="_git_${command//-/_}"
3232        if ! declare -f $completion_func >/dev/null 2>/dev/null &&
3233                declare -f _completion_loader >/dev/null 2>/dev/null
3234        then
3235                _completion_loader "git-$command"
3236        fi
3237        if declare -f $completion_func >/dev/null 2>/dev/null
3238        then
3239                $completion_func
3240                return 0
3241        elif __git_support_parseopt_helper "$command"
3242        then
3243                __git_complete_common "$command"
3244                return 0
3245        else
3246                return 1
3247        fi
3248}
3249
3250__git_main ()
3251{
3252        local i c=1 command __git_dir __git_repo_path
3253        local __git_C_args C_args_count=0
3254
3255        while [ $c -lt $cword ]; do
3256                i="${words[c]}"
3257                case "$i" in
3258                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
3259                --git-dir)   ((c++)) ; __git_dir="${words[c]}" ;;
3260                --bare)      __git_dir="." ;;
3261                --help) command="help"; break ;;
3262                -c|--work-tree|--namespace) ((c++)) ;;
3263                -C)     __git_C_args[C_args_count++]=-C
3264                        ((c++))
3265                        __git_C_args[C_args_count++]="${words[c]}"
3266                        ;;
3267                -*) ;;
3268                *) command="$i"; break ;;
3269                esac
3270                ((c++))
3271        done
3272
3273        if [ -z "$command" ]; then
3274                case "$prev" in
3275                --git-dir|-C|--work-tree)
3276                        # these need a path argument, let's fall back to
3277                        # Bash filename completion
3278                        return
3279                        ;;
3280                -c|--namespace)
3281                        # we don't support completing these options' arguments
3282                        return
3283                        ;;
3284                esac
3285                case "$cur" in
3286                --*)   __gitcomp "
3287                        --paginate
3288                        --no-pager
3289                        --git-dir=
3290                        --bare
3291                        --version
3292                        --exec-path
3293                        --exec-path=
3294                        --html-path
3295                        --man-path
3296                        --info-path
3297                        --work-tree=
3298                        --namespace=
3299                        --no-replace-objects
3300                        --help
3301                        "
3302                        ;;
3303                *)     __git_compute_porcelain_commands
3304                       __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
3305                esac
3306                return
3307        fi
3308
3309        __git_complete_command "$command" && return
3310
3311        local expansion=$(__git_aliased_command "$command")
3312        if [ -n "$expansion" ]; then
3313                words[1]=$expansion
3314                __git_complete_command "$expansion"
3315        fi
3316}
3317
3318__gitk_main ()
3319{
3320        __git_has_doubledash && return
3321
3322        local __git_repo_path
3323        __git_find_repo_path
3324
3325        local merge=""
3326        if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
3327                merge="--merge"
3328        fi
3329        case "$cur" in
3330        --*)
3331                __gitcomp "
3332                        $__git_log_common_options
3333                        $__git_log_gitk_options
3334                        $merge
3335                        "
3336                return
3337                ;;
3338        esac
3339        __git_complete_revlist
3340}
3341
3342if [[ -n ${ZSH_VERSION-} ]]; then
3343        echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
3344
3345        autoload -U +X compinit && compinit
3346
3347        __gitcomp ()
3348        {
3349                emulate -L zsh
3350
3351                local cur_="${3-$cur}"
3352
3353                case "$cur_" in
3354                --*=)
3355                        ;;
3356                *)
3357                        local c IFS=$' \t\n'
3358                        local -a array
3359                        for c in ${=1}; do
3360                                c="$c${4-}"
3361                                case $c in
3362                                --*=*|*.) ;;
3363                                *) c="$c " ;;
3364                                esac
3365                                array[${#array[@]}+1]="$c"
3366                        done
3367                        compset -P '*[=:]'
3368                        compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
3369                        ;;
3370                esac
3371        }
3372
3373        __gitcomp_direct ()
3374        {
3375                emulate -L zsh
3376
3377                local IFS=$'\n'
3378                compset -P '*[=:]'
3379                compadd -Q -- ${=1} && _ret=0
3380        }
3381
3382        __gitcomp_nl ()
3383        {
3384                emulate -L zsh
3385
3386                local IFS=$'\n'
3387                compset -P '*[=:]'
3388                compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
3389        }
3390
3391        __gitcomp_file_direct ()
3392        {
3393                emulate -L zsh
3394
3395                local IFS=$'\n'
3396                compset -P '*[=:]'
3397                compadd -Q -f -- ${=1} && _ret=0
3398        }
3399
3400        __gitcomp_file ()
3401        {
3402                emulate -L zsh
3403
3404                local IFS=$'\n'
3405                compset -P '*[=:]'
3406                compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
3407        }
3408
3409        _git ()
3410        {
3411                local _ret=1 cur cword prev
3412                cur=${words[CURRENT]}
3413                prev=${words[CURRENT-1]}
3414                let cword=CURRENT-1
3415                emulate ksh -c __${service}_main
3416                let _ret && _default && _ret=0
3417                return _ret
3418        }
3419
3420        compdef _git git gitk
3421        return
3422fi
3423
3424__git_func_wrap ()
3425{
3426        local cur words cword prev
3427        _get_comp_words_by_ref -n =: cur words cword prev
3428        $1
3429}
3430
3431# Setup completion for certain functions defined above by setting common
3432# variables and workarounds.
3433# This is NOT a public function; use at your own risk.
3434__git_complete ()
3435{
3436        local wrapper="__git_wrap${2}"
3437        eval "$wrapper () { __git_func_wrap $2 ; }"
3438        complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
3439                || complete -o default -o nospace -F $wrapper $1
3440}
3441
3442# wrapper for backwards compatibility
3443_git ()
3444{
3445        __git_wrap__git_main
3446}
3447
3448# wrapper for backwards compatibility
3449_gitk ()
3450{
3451        __git_wrap__gitk_main
3452}
3453
3454__git_complete git __git_main
3455__git_complete gitk __gitk_main
3456
3457# The following are necessary only for Cygwin, and only are needed
3458# when the user has tab-completed the executable name and consequently
3459# included the '.exe' suffix.
3460#
3461if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
3462__git_complete git.exe __git_main
3463fi