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