d926518fb78b18f6a9878b1b420e24b8dcd82010
   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_builtin apply
1138                return
1139        esac
1140}
1141
1142_git_add ()
1143{
1144        case "$cur" in
1145        --*)
1146                __gitcomp_builtin add
1147                return
1148        esac
1149
1150        local complete_opt="--others --modified --directory --no-empty-directory"
1151        if test -n "$(__git_find_on_cmdline "-u --update")"
1152        then
1153                complete_opt="--modified"
1154        fi
1155        __git_complete_index_file "$complete_opt"
1156}
1157
1158_git_archive ()
1159{
1160        case "$cur" in
1161        --format=*)
1162                __gitcomp "$(git archive --list)" "" "${cur##--format=}"
1163                return
1164                ;;
1165        --remote=*)
1166                __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
1167                return
1168                ;;
1169        --*)
1170                __gitcomp "
1171                        --format= --list --verbose
1172                        --prefix= --remote= --exec= --output
1173                        "
1174                return
1175                ;;
1176        esac
1177        __git_complete_file
1178}
1179
1180_git_bisect ()
1181{
1182        __git_has_doubledash && return
1183
1184        local subcommands="start bad good skip reset visualize replay log run"
1185        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1186        if [ -z "$subcommand" ]; then
1187                __git_find_repo_path
1188                if [ -f "$__git_repo_path"/BISECT_START ]; then
1189                        __gitcomp "$subcommands"
1190                else
1191                        __gitcomp "replay start"
1192                fi
1193                return
1194        fi
1195
1196        case "$subcommand" in
1197        bad|good|reset|skip|start)
1198                __git_complete_refs
1199                ;;
1200        *)
1201                ;;
1202        esac
1203}
1204
1205_git_branch ()
1206{
1207        local i c=1 only_local_ref="n" has_r="n"
1208
1209        while [ $c -lt $cword ]; do
1210                i="${words[c]}"
1211                case "$i" in
1212                -d|--delete|-m|--move)  only_local_ref="y" ;;
1213                -r|--remotes)           has_r="y" ;;
1214                esac
1215                ((c++))
1216        done
1217
1218        case "$cur" in
1219        --set-upstream-to=*)
1220                __git_complete_refs --cur="${cur##--set-upstream-to=}"
1221                ;;
1222        --*)
1223                __gitcomp_builtin branch "--no-color --no-abbrev
1224                        --no-track --no-column
1225                        "
1226                ;;
1227        *)
1228                if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1229                        __gitcomp_direct "$(__git_heads "" "$cur" " ")"
1230                else
1231                        __git_complete_refs
1232                fi
1233                ;;
1234        esac
1235}
1236
1237_git_bundle ()
1238{
1239        local cmd="${words[2]}"
1240        case "$cword" in
1241        2)
1242                __gitcomp "create list-heads verify unbundle"
1243                ;;
1244        3)
1245                # looking for a file
1246                ;;
1247        *)
1248                case "$cmd" in
1249                        create)
1250                                __git_complete_revlist
1251                        ;;
1252                esac
1253                ;;
1254        esac
1255}
1256
1257_git_checkout ()
1258{
1259        __git_has_doubledash && return
1260
1261        case "$cur" in
1262        --conflict=*)
1263                __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1264                ;;
1265        --*)
1266                __gitcomp "
1267                        --quiet --ours --theirs --track --no-track --merge
1268                        --conflict= --orphan --patch --detach --ignore-skip-worktree-bits
1269                        --recurse-submodules --no-recurse-submodules
1270                        "
1271                ;;
1272        *)
1273                # check if --track, --no-track, or --no-guess was specified
1274                # if so, disable DWIM mode
1275                local flags="--track --no-track --no-guess" track_opt="--track"
1276                if [ "$GIT_COMPLETION_CHECKOUT_NO_GUESS" = "1" ] ||
1277                   [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1278                        track_opt=''
1279                fi
1280                __git_complete_refs $track_opt
1281                ;;
1282        esac
1283}
1284
1285_git_cherry ()
1286{
1287        __git_complete_refs
1288}
1289
1290_git_cherry_pick ()
1291{
1292        __git_find_repo_path
1293        if [ -f "$__git_repo_path"/CHERRY_PICK_HEAD ]; then
1294                __gitcomp "--continue --quit --abort"
1295                return
1296        fi
1297        case "$cur" in
1298        --*)
1299                __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1300                ;;
1301        *)
1302                __git_complete_refs
1303                ;;
1304        esac
1305}
1306
1307_git_clean ()
1308{
1309        case "$cur" in
1310        --*)
1311                __gitcomp "--dry-run --quiet"
1312                return
1313                ;;
1314        esac
1315
1316        # XXX should we check for -x option ?
1317        __git_complete_index_file "--others --directory"
1318}
1319
1320_git_clone ()
1321{
1322        case "$cur" in
1323        --*)
1324                __gitcomp "
1325                        --local
1326                        --no-hardlinks
1327                        --shared
1328                        --reference
1329                        --quiet
1330                        --no-checkout
1331                        --bare
1332                        --mirror
1333                        --origin
1334                        --upload-pack
1335                        --template=
1336                        --depth
1337                        --single-branch
1338                        --no-tags
1339                        --branch
1340                        --recurse-submodules
1341                        --no-single-branch
1342                        --shallow-submodules
1343                        "
1344                return
1345                ;;
1346        esac
1347}
1348
1349__git_untracked_file_modes="all no normal"
1350
1351_git_commit ()
1352{
1353        case "$prev" in
1354        -c|-C)
1355                __git_complete_refs
1356                return
1357                ;;
1358        esac
1359
1360        case "$cur" in
1361        --cleanup=*)
1362                __gitcomp "default scissors strip verbatim whitespace
1363                        " "" "${cur##--cleanup=}"
1364                return
1365                ;;
1366        --reuse-message=*|--reedit-message=*|\
1367        --fixup=*|--squash=*)
1368                __git_complete_refs --cur="${cur#*=}"
1369                return
1370                ;;
1371        --untracked-files=*)
1372                __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1373                return
1374                ;;
1375        --*)
1376                __gitcomp "
1377                        --all --author= --signoff --verify --no-verify
1378                        --edit --no-edit
1379                        --amend --include --only --interactive
1380                        --dry-run --reuse-message= --reedit-message=
1381                        --reset-author --file= --message= --template=
1382                        --cleanup= --untracked-files --untracked-files=
1383                        --verbose --quiet --fixup= --squash=
1384                        --patch --short --date --allow-empty
1385                        "
1386                return
1387        esac
1388
1389        if __git rev-parse --verify --quiet HEAD >/dev/null; then
1390                __git_complete_index_file "--committable"
1391        else
1392                # This is the first commit
1393                __git_complete_index_file "--cached"
1394        fi
1395}
1396
1397_git_describe ()
1398{
1399        case "$cur" in
1400        --*)
1401                __gitcomp "
1402                        --all --tags --contains --abbrev= --candidates=
1403                        --exact-match --debug --long --match --always --first-parent
1404                        --exclude --dirty --broken
1405                        "
1406                return
1407        esac
1408        __git_complete_refs
1409}
1410
1411__git_diff_algorithms="myers minimal patience histogram"
1412
1413__git_diff_submodule_formats="diff log short"
1414
1415__git_diff_common_options="--stat --numstat --shortstat --summary
1416                        --patch-with-stat --name-only --name-status --color
1417                        --no-color --color-words --no-renames --check
1418                        --full-index --binary --abbrev --diff-filter=
1419                        --find-copies-harder --ignore-cr-at-eol
1420                        --text --ignore-space-at-eol --ignore-space-change
1421                        --ignore-all-space --ignore-blank-lines --exit-code
1422                        --quiet --ext-diff --no-ext-diff
1423                        --no-prefix --src-prefix= --dst-prefix=
1424                        --inter-hunk-context=
1425                        --patience --histogram --minimal
1426                        --raw --word-diff --word-diff-regex=
1427                        --dirstat --dirstat= --dirstat-by-file
1428                        --dirstat-by-file= --cumulative
1429                        --diff-algorithm=
1430                        --submodule --submodule=
1431"
1432
1433_git_diff ()
1434{
1435        __git_has_doubledash && return
1436
1437        case "$cur" in
1438        --diff-algorithm=*)
1439                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1440                return
1441                ;;
1442        --submodule=*)
1443                __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1444                return
1445                ;;
1446        --*)
1447                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1448                        --base --ours --theirs --no-index
1449                        $__git_diff_common_options
1450                        "
1451                return
1452                ;;
1453        esac
1454        __git_complete_revlist_file
1455}
1456
1457__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1458                        tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
1459"
1460
1461_git_difftool ()
1462{
1463        __git_has_doubledash && return
1464
1465        case "$cur" in
1466        --tool=*)
1467                __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1468                return
1469                ;;
1470        --*)
1471                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1472                        --base --ours --theirs
1473                        --no-renames --diff-filter= --find-copies-harder
1474                        --relative --ignore-submodules
1475                        --tool="
1476                return
1477                ;;
1478        esac
1479        __git_complete_revlist_file
1480}
1481
1482__git_fetch_recurse_submodules="yes on-demand no"
1483
1484__git_fetch_options="
1485        --quiet --verbose --append --upload-pack --force --keep --depth=
1486        --tags --no-tags --all --prune --dry-run --recurse-submodules=
1487        --unshallow --update-shallow
1488"
1489
1490_git_fetch ()
1491{
1492        case "$cur" in
1493        --recurse-submodules=*)
1494                __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1495                return
1496                ;;
1497        --*)
1498                __gitcomp "$__git_fetch_options"
1499                return
1500                ;;
1501        esac
1502        __git_complete_remote_or_refspec
1503}
1504
1505__git_format_patch_options="
1506        --stdout --attach --no-attach --thread --thread= --no-thread
1507        --numbered --start-number --numbered-files --keep-subject --signoff
1508        --signature --no-signature --in-reply-to= --cc= --full-index --binary
1509        --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1510        --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1511        --output-directory --reroll-count --to= --quiet --notes
1512"
1513
1514_git_format_patch ()
1515{
1516        case "$cur" in
1517        --thread=*)
1518                __gitcomp "
1519                        deep shallow
1520                        " "" "${cur##--thread=}"
1521                return
1522                ;;
1523        --*)
1524                __gitcomp "$__git_format_patch_options"
1525                return
1526                ;;
1527        esac
1528        __git_complete_revlist
1529}
1530
1531_git_fsck ()
1532{
1533        case "$cur" in
1534        --*)
1535                __gitcomp "
1536                        --tags --root --unreachable --cache --no-reflogs --full
1537                        --strict --verbose --lost-found --name-objects
1538                        "
1539                return
1540                ;;
1541        esac
1542}
1543
1544_git_gc ()
1545{
1546        case "$cur" in
1547        --*)
1548                __gitcomp "--prune --aggressive"
1549                return
1550                ;;
1551        esac
1552}
1553
1554_git_gitk ()
1555{
1556        _gitk
1557}
1558
1559# Lists matching symbol names from a tag (as in ctags) file.
1560# 1: List symbol names matching this word.
1561# 2: The tag file to list symbol names from.
1562# 3: A prefix to be added to each listed symbol name (optional).
1563# 4: A suffix to be appended to each listed symbol name (optional).
1564__git_match_ctag () {
1565        awk -v pfx="${3-}" -v sfx="${4-}" "
1566                /^${1//\//\\/}/ { print pfx \$1 sfx }
1567                " "$2"
1568}
1569
1570# Complete symbol names from a tag file.
1571# Usage: __git_complete_symbol [<option>]...
1572# --tags=<file>: The tag file to list symbol names from instead of the
1573#                default "tags".
1574# --pfx=<prefix>: A prefix to be added to each symbol name.
1575# --cur=<word>: The current symbol name to be completed.  Defaults to
1576#               the current word to be completed.
1577# --sfx=<suffix>: A suffix to be appended to each symbol name instead
1578#                 of the default space.
1579__git_complete_symbol () {
1580        local tags=tags pfx="" cur_="${cur-}" sfx=" "
1581
1582        while test $# != 0; do
1583                case "$1" in
1584                --tags=*)       tags="${1##--tags=}" ;;
1585                --pfx=*)        pfx="${1##--pfx=}" ;;
1586                --cur=*)        cur_="${1##--cur=}" ;;
1587                --sfx=*)        sfx="${1##--sfx=}" ;;
1588                *)              return 1 ;;
1589                esac
1590                shift
1591        done
1592
1593        if test -r "$tags"; then
1594                __gitcomp_direct "$(__git_match_ctag "$cur_" "$tags" "$pfx" "$sfx")"
1595        fi
1596}
1597
1598_git_grep ()
1599{
1600        __git_has_doubledash && return
1601
1602        case "$cur" in
1603        --*)
1604                __gitcomp "
1605                        --cached
1606                        --text --ignore-case --word-regexp --invert-match
1607                        --full-name --line-number
1608                        --extended-regexp --basic-regexp --fixed-strings
1609                        --perl-regexp
1610                        --threads
1611                        --files-with-matches --name-only
1612                        --files-without-match
1613                        --max-depth
1614                        --count
1615                        --and --or --not --all-match
1616                        --break --heading --show-function --function-context
1617                        --untracked --no-index
1618                        "
1619                return
1620                ;;
1621        esac
1622
1623        case "$cword,$prev" in
1624        2,*|*,-*)
1625                __git_complete_symbol && return
1626                ;;
1627        esac
1628
1629        __git_complete_refs
1630}
1631
1632_git_help ()
1633{
1634        case "$cur" in
1635        --*)
1636                __gitcomp "--all --guides --info --man --web"
1637                return
1638                ;;
1639        esac
1640        __git_compute_all_commands
1641        __gitcomp "$__git_all_commands $(__git_aliases)
1642                attributes cli core-tutorial cvs-migration
1643                diffcore everyday gitk glossary hooks ignore modules
1644                namespaces repository-layout revisions tutorial tutorial-2
1645                workflows
1646                "
1647}
1648
1649_git_init ()
1650{
1651        case "$cur" in
1652        --shared=*)
1653                __gitcomp "
1654                        false true umask group all world everybody
1655                        " "" "${cur##--shared=}"
1656                return
1657                ;;
1658        --*)
1659                __gitcomp "--quiet --bare --template= --shared --shared="
1660                return
1661                ;;
1662        esac
1663}
1664
1665_git_ls_files ()
1666{
1667        case "$cur" in
1668        --*)
1669                __gitcomp "--cached --deleted --modified --others --ignored
1670                        --stage --directory --no-empty-directory --unmerged
1671                        --killed --exclude= --exclude-from=
1672                        --exclude-per-directory= --exclude-standard
1673                        --error-unmatch --with-tree= --full-name
1674                        --abbrev --ignored --exclude-per-directory
1675                        "
1676                return
1677                ;;
1678        esac
1679
1680        # XXX ignore options like --modified and always suggest all cached
1681        # files.
1682        __git_complete_index_file "--cached"
1683}
1684
1685_git_ls_remote ()
1686{
1687        case "$cur" in
1688        --*)
1689                __gitcomp "--heads --tags --refs --get-url --symref"
1690                return
1691                ;;
1692        esac
1693        __gitcomp_nl "$(__git_remotes)"
1694}
1695
1696_git_ls_tree ()
1697{
1698        __git_complete_file
1699}
1700
1701# Options that go well for log, shortlog and gitk
1702__git_log_common_options="
1703        --not --all
1704        --branches --tags --remotes
1705        --first-parent --merges --no-merges
1706        --max-count=
1707        --max-age= --since= --after=
1708        --min-age= --until= --before=
1709        --min-parents= --max-parents=
1710        --no-min-parents --no-max-parents
1711"
1712# Options that go well for log and gitk (not shortlog)
1713__git_log_gitk_options="
1714        --dense --sparse --full-history
1715        --simplify-merges --simplify-by-decoration
1716        --left-right --notes --no-notes
1717"
1718# Options that go well for log and shortlog (not gitk)
1719__git_log_shortlog_options="
1720        --author= --committer= --grep=
1721        --all-match --invert-grep
1722"
1723
1724__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1725__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1726
1727_git_log ()
1728{
1729        __git_has_doubledash && return
1730        __git_find_repo_path
1731
1732        local merge=""
1733        if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
1734                merge="--merge"
1735        fi
1736        case "$prev,$cur" in
1737        -L,:*:*)
1738                return  # fall back to Bash filename completion
1739                ;;
1740        -L,:*)
1741                __git_complete_symbol --cur="${cur#:}" --sfx=":"
1742                return
1743                ;;
1744        -G,*|-S,*)
1745                __git_complete_symbol
1746                return
1747                ;;
1748        esac
1749        case "$cur" in
1750        --pretty=*|--format=*)
1751                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1752                        " "" "${cur#*=}"
1753                return
1754                ;;
1755        --date=*)
1756                __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1757                return
1758                ;;
1759        --decorate=*)
1760                __gitcomp "full short no" "" "${cur##--decorate=}"
1761                return
1762                ;;
1763        --diff-algorithm=*)
1764                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1765                return
1766                ;;
1767        --submodule=*)
1768                __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1769                return
1770                ;;
1771        --*)
1772                __gitcomp "
1773                        $__git_log_common_options
1774                        $__git_log_shortlog_options
1775                        $__git_log_gitk_options
1776                        --root --topo-order --date-order --reverse
1777                        --follow --full-diff
1778                        --abbrev-commit --abbrev=
1779                        --relative-date --date=
1780                        --pretty= --format= --oneline
1781                        --show-signature
1782                        --cherry-mark
1783                        --cherry-pick
1784                        --graph
1785                        --decorate --decorate=
1786                        --walk-reflogs
1787                        --parents --children
1788                        $merge
1789                        $__git_diff_common_options
1790                        --pickaxe-all --pickaxe-regex
1791                        "
1792                return
1793                ;;
1794        -L:*:*)
1795                return  # fall back to Bash filename completion
1796                ;;
1797        -L:*)
1798                __git_complete_symbol --cur="${cur#-L:}" --sfx=":"
1799                return
1800                ;;
1801        -G*)
1802                __git_complete_symbol --pfx="-G" --cur="${cur#-G}"
1803                return
1804                ;;
1805        -S*)
1806                __git_complete_symbol --pfx="-S" --cur="${cur#-S}"
1807                return
1808                ;;
1809        esac
1810        __git_complete_revlist
1811}
1812
1813# Common merge options shared by git-merge(1) and git-pull(1).
1814__git_merge_options="
1815        --no-commit --no-stat --log --no-log --squash --strategy
1816        --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1817        --verify-signatures --no-verify-signatures --gpg-sign
1818        --quiet --verbose --progress --no-progress
1819"
1820
1821_git_merge ()
1822{
1823        __git_complete_strategy && return
1824
1825        case "$cur" in
1826        --*)
1827                __gitcomp "$__git_merge_options
1828                        --rerere-autoupdate --no-rerere-autoupdate --abort --continue"
1829                return
1830        esac
1831        __git_complete_refs
1832}
1833
1834_git_mergetool ()
1835{
1836        case "$cur" in
1837        --tool=*)
1838                __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1839                return
1840                ;;
1841        --*)
1842                __gitcomp "--tool= --prompt --no-prompt"
1843                return
1844                ;;
1845        esac
1846}
1847
1848_git_merge_base ()
1849{
1850        case "$cur" in
1851        --*)
1852                __gitcomp "--octopus --independent --is-ancestor --fork-point"
1853                return
1854                ;;
1855        esac
1856        __git_complete_refs
1857}
1858
1859_git_mv ()
1860{
1861        case "$cur" in
1862        --*)
1863                __gitcomp "--dry-run"
1864                return
1865                ;;
1866        esac
1867
1868        if [ $(__git_count_arguments "mv") -gt 0 ]; then
1869                # We need to show both cached and untracked files (including
1870                # empty directories) since this may not be the last argument.
1871                __git_complete_index_file "--cached --others --directory"
1872        else
1873                __git_complete_index_file "--cached"
1874        fi
1875}
1876
1877_git_name_rev ()
1878{
1879        __gitcomp "--tags --all --stdin"
1880}
1881
1882_git_notes ()
1883{
1884        local subcommands='add append copy edit list prune remove show'
1885        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1886
1887        case "$subcommand,$cur" in
1888        ,--*)
1889                __gitcomp '--ref'
1890                ;;
1891        ,*)
1892                case "$prev" in
1893                --ref)
1894                        __git_complete_refs
1895                        ;;
1896                *)
1897                        __gitcomp "$subcommands --ref"
1898                        ;;
1899                esac
1900                ;;
1901        add,--reuse-message=*|append,--reuse-message=*|\
1902        add,--reedit-message=*|append,--reedit-message=*)
1903                __git_complete_refs --cur="${cur#*=}"
1904                ;;
1905        add,--*|append,--*)
1906                __gitcomp '--file= --message= --reedit-message=
1907                                --reuse-message='
1908                ;;
1909        copy,--*)
1910                __gitcomp '--stdin'
1911                ;;
1912        prune,--*)
1913                __gitcomp '--dry-run --verbose'
1914                ;;
1915        prune,*)
1916                ;;
1917        *)
1918                case "$prev" in
1919                -m|-F)
1920                        ;;
1921                *)
1922                        __git_complete_refs
1923                        ;;
1924                esac
1925                ;;
1926        esac
1927}
1928
1929_git_pull ()
1930{
1931        __git_complete_strategy && return
1932
1933        case "$cur" in
1934        --recurse-submodules=*)
1935                __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1936                return
1937                ;;
1938        --*)
1939                __gitcomp "
1940                        --rebase --no-rebase
1941                        --autostash --no-autostash
1942                        $__git_merge_options
1943                        $__git_fetch_options
1944                "
1945                return
1946                ;;
1947        esac
1948        __git_complete_remote_or_refspec
1949}
1950
1951__git_push_recurse_submodules="check on-demand only"
1952
1953__git_complete_force_with_lease ()
1954{
1955        local cur_=$1
1956
1957        case "$cur_" in
1958        --*=)
1959                ;;
1960        *:*)
1961                __git_complete_refs --cur="${cur_#*:}"
1962                ;;
1963        *)
1964                __git_complete_refs --cur="$cur_"
1965                ;;
1966        esac
1967}
1968
1969_git_push ()
1970{
1971        case "$prev" in
1972        --repo)
1973                __gitcomp_nl "$(__git_remotes)"
1974                return
1975                ;;
1976        --recurse-submodules)
1977                __gitcomp "$__git_push_recurse_submodules"
1978                return
1979                ;;
1980        esac
1981        case "$cur" in
1982        --repo=*)
1983                __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1984                return
1985                ;;
1986        --recurse-submodules=*)
1987                __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1988                return
1989                ;;
1990        --force-with-lease=*)
1991                __git_complete_force_with_lease "${cur##--force-with-lease=}"
1992                return
1993                ;;
1994        --*)
1995                __gitcomp "
1996                        --all --mirror --tags --dry-run --force --verbose
1997                        --quiet --prune --delete --follow-tags
1998                        --receive-pack= --repo= --set-upstream
1999                        --force-with-lease --force-with-lease= --recurse-submodules=
2000                "
2001                return
2002                ;;
2003        esac
2004        __git_complete_remote_or_refspec
2005}
2006
2007_git_rebase ()
2008{
2009        __git_find_repo_path
2010        if [ -f "$__git_repo_path"/rebase-merge/interactive ]; then
2011                __gitcomp "--continue --skip --abort --quit --edit-todo"
2012                return
2013        elif [ -d "$__git_repo_path"/rebase-apply ] || \
2014             [ -d "$__git_repo_path"/rebase-merge ]; then
2015                __gitcomp "--continue --skip --abort --quit"
2016                return
2017        fi
2018        __git_complete_strategy && return
2019        case "$cur" in
2020        --whitespace=*)
2021                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
2022                return
2023                ;;
2024        --*)
2025                __gitcomp "
2026                        --onto --merge --strategy --interactive
2027                        --preserve-merges --stat --no-stat
2028                        --committer-date-is-author-date --ignore-date
2029                        --ignore-whitespace --whitespace=
2030                        --autosquash --no-autosquash
2031                        --fork-point --no-fork-point
2032                        --autostash --no-autostash
2033                        --verify --no-verify
2034                        --keep-empty --root --force-rebase --no-ff
2035                        --exec
2036                        "
2037
2038                return
2039        esac
2040        __git_complete_refs
2041}
2042
2043_git_reflog ()
2044{
2045        local subcommands="show delete expire"
2046        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2047
2048        if [ -z "$subcommand" ]; then
2049                __gitcomp "$subcommands"
2050        else
2051                __git_complete_refs
2052        fi
2053}
2054
2055__git_send_email_confirm_options="always never auto cc compose"
2056__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
2057
2058_git_send_email ()
2059{
2060        case "$prev" in
2061        --to|--cc|--bcc|--from)
2062                __gitcomp "$(__git send-email --dump-aliases)"
2063                return
2064                ;;
2065        esac
2066
2067        case "$cur" in
2068        --confirm=*)
2069                __gitcomp "
2070                        $__git_send_email_confirm_options
2071                        " "" "${cur##--confirm=}"
2072                return
2073                ;;
2074        --suppress-cc=*)
2075                __gitcomp "
2076                        $__git_send_email_suppresscc_options
2077                        " "" "${cur##--suppress-cc=}"
2078
2079                return
2080                ;;
2081        --smtp-encryption=*)
2082                __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
2083                return
2084                ;;
2085        --thread=*)
2086                __gitcomp "
2087                        deep shallow
2088                        " "" "${cur##--thread=}"
2089                return
2090                ;;
2091        --to=*|--cc=*|--bcc=*|--from=*)
2092                __gitcomp "$(__git send-email --dump-aliases)" "" "${cur#--*=}"
2093                return
2094                ;;
2095        --*)
2096                __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
2097                        --compose --confirm= --dry-run --envelope-sender
2098                        --from --identity
2099                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
2100                        --no-suppress-from --no-thread --quiet
2101                        --signed-off-by-cc --smtp-pass --smtp-server
2102                        --smtp-server-port --smtp-encryption= --smtp-user
2103                        --subject --suppress-cc= --suppress-from --thread --to
2104                        --validate --no-validate
2105                        $__git_format_patch_options"
2106                return
2107                ;;
2108        esac
2109        __git_complete_revlist
2110}
2111
2112_git_stage ()
2113{
2114        _git_add
2115}
2116
2117_git_status ()
2118{
2119        local complete_opt
2120        local untracked_state
2121
2122        case "$cur" in
2123        --ignore-submodules=*)
2124                __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
2125                return
2126                ;;
2127        --untracked-files=*)
2128                __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
2129                return
2130                ;;
2131        --column=*)
2132                __gitcomp "
2133                        always never auto column row plain dense nodense
2134                        " "" "${cur##--column=}"
2135                return
2136                ;;
2137        --*)
2138                __gitcomp "
2139                        --short --branch --porcelain --long --verbose
2140                        --untracked-files= --ignore-submodules= --ignored
2141                        --column= --no-column
2142                        "
2143                return
2144                ;;
2145        esac
2146
2147        untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
2148                "$__git_untracked_file_modes" "status.showUntrackedFiles")"
2149
2150        case "$untracked_state" in
2151        no)
2152                # --ignored option does not matter
2153                complete_opt=
2154                ;;
2155        all|normal|*)
2156                complete_opt="--cached --directory --no-empty-directory --others"
2157
2158                if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
2159                        complete_opt="$complete_opt --ignored --exclude=*"
2160                fi
2161                ;;
2162        esac
2163
2164        __git_complete_index_file "$complete_opt"
2165}
2166
2167__git_config_get_set_variables ()
2168{
2169        local prevword word config_file= c=$cword
2170        while [ $c -gt 1 ]; do
2171                word="${words[c]}"
2172                case "$word" in
2173                --system|--global|--local|--file=*)
2174                        config_file="$word"
2175                        break
2176                        ;;
2177                -f|--file)
2178                        config_file="$word $prevword"
2179                        break
2180                        ;;
2181                esac
2182                prevword=$word
2183                c=$((--c))
2184        done
2185
2186        __git config $config_file --name-only --list
2187}
2188
2189_git_config ()
2190{
2191        case "$prev" in
2192        branch.*.remote|branch.*.pushremote)
2193                __gitcomp_nl "$(__git_remotes)"
2194                return
2195                ;;
2196        branch.*.merge)
2197                __git_complete_refs
2198                return
2199                ;;
2200        branch.*.rebase)
2201                __gitcomp "false true preserve interactive"
2202                return
2203                ;;
2204        remote.pushdefault)
2205                __gitcomp_nl "$(__git_remotes)"
2206                return
2207                ;;
2208        remote.*.fetch)
2209                local remote="${prev#remote.}"
2210                remote="${remote%.fetch}"
2211                if [ -z "$cur" ]; then
2212                        __gitcomp_nl "refs/heads/" "" "" ""
2213                        return
2214                fi
2215                __gitcomp_nl "$(__git_refs_remotes "$remote")"
2216                return
2217                ;;
2218        remote.*.push)
2219                local remote="${prev#remote.}"
2220                remote="${remote%.push}"
2221                __gitcomp_nl "$(__git for-each-ref \
2222                        --format='%(refname):%(refname)' refs/heads)"
2223                return
2224                ;;
2225        pull.twohead|pull.octopus)
2226                __git_compute_merge_strategies
2227                __gitcomp "$__git_merge_strategies"
2228                return
2229                ;;
2230        color.branch|color.diff|color.interactive|\
2231        color.showbranch|color.status|color.ui)
2232                __gitcomp "always never auto"
2233                return
2234                ;;
2235        color.pager)
2236                __gitcomp "false true"
2237                return
2238                ;;
2239        color.*.*)
2240                __gitcomp "
2241                        normal black red green yellow blue magenta cyan white
2242                        bold dim ul blink reverse
2243                        "
2244                return
2245                ;;
2246        diff.submodule)
2247                __gitcomp "log short"
2248                return
2249                ;;
2250        help.format)
2251                __gitcomp "man info web html"
2252                return
2253                ;;
2254        log.date)
2255                __gitcomp "$__git_log_date_formats"
2256                return
2257                ;;
2258        sendemail.aliasesfiletype)
2259                __gitcomp "mutt mailrc pine elm gnus"
2260                return
2261                ;;
2262        sendemail.confirm)
2263                __gitcomp "$__git_send_email_confirm_options"
2264                return
2265                ;;
2266        sendemail.suppresscc)
2267                __gitcomp "$__git_send_email_suppresscc_options"
2268                return
2269                ;;
2270        sendemail.transferencoding)
2271                __gitcomp "7bit 8bit quoted-printable base64"
2272                return
2273                ;;
2274        --get|--get-all|--unset|--unset-all)
2275                __gitcomp_nl "$(__git_config_get_set_variables)"
2276                return
2277                ;;
2278        *.*)
2279                return
2280                ;;
2281        esac
2282        case "$cur" in
2283        --*)
2284                __gitcomp "
2285                        --system --global --local --file=
2286                        --list --replace-all
2287                        --get --get-all --get-regexp
2288                        --add --unset --unset-all
2289                        --remove-section --rename-section
2290                        --name-only
2291                        "
2292                return
2293                ;;
2294        branch.*.*)
2295                local pfx="${cur%.*}." cur_="${cur##*.}"
2296                __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
2297                return
2298                ;;
2299        branch.*)
2300                local pfx="${cur%.*}." cur_="${cur#*.}"
2301                __gitcomp_direct "$(__git_heads "$pfx" "$cur_" ".")"
2302                __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
2303                return
2304                ;;
2305        guitool.*.*)
2306                local pfx="${cur%.*}." cur_="${cur##*.}"
2307                __gitcomp "
2308                        argprompt cmd confirm needsfile noconsole norescan
2309                        prompt revprompt revunmerged title
2310                        " "$pfx" "$cur_"
2311                return
2312                ;;
2313        difftool.*.*)
2314                local pfx="${cur%.*}." cur_="${cur##*.}"
2315                __gitcomp "cmd path" "$pfx" "$cur_"
2316                return
2317                ;;
2318        man.*.*)
2319                local pfx="${cur%.*}." cur_="${cur##*.}"
2320                __gitcomp "cmd path" "$pfx" "$cur_"
2321                return
2322                ;;
2323        mergetool.*.*)
2324                local pfx="${cur%.*}." cur_="${cur##*.}"
2325                __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
2326                return
2327                ;;
2328        pager.*)
2329                local pfx="${cur%.*}." cur_="${cur#*.}"
2330                __git_compute_all_commands
2331                __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
2332                return
2333                ;;
2334        remote.*.*)
2335                local pfx="${cur%.*}." cur_="${cur##*.}"
2336                __gitcomp "
2337                        url proxy fetch push mirror skipDefaultUpdate
2338                        receivepack uploadpack tagopt pushurl
2339                        " "$pfx" "$cur_"
2340                return
2341                ;;
2342        remote.*)
2343                local pfx="${cur%.*}." cur_="${cur#*.}"
2344                __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
2345                __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
2346                return
2347                ;;
2348        url.*.*)
2349                local pfx="${cur%.*}." cur_="${cur##*.}"
2350                __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2351                return
2352                ;;
2353        esac
2354        __gitcomp "
2355                add.ignoreErrors
2356                advice.amWorkDir
2357                advice.commitBeforeMerge
2358                advice.detachedHead
2359                advice.implicitIdentity
2360                advice.pushAlreadyExists
2361                advice.pushFetchFirst
2362                advice.pushNeedsForce
2363                advice.pushNonFFCurrent
2364                advice.pushNonFFMatching
2365                advice.pushUpdateRejected
2366                advice.resolveConflict
2367                advice.rmHints
2368                advice.statusHints
2369                advice.statusUoption
2370                advice.ignoredHook
2371                alias.
2372                am.keepcr
2373                am.threeWay
2374                apply.ignorewhitespace
2375                apply.whitespace
2376                branch.autosetupmerge
2377                branch.autosetuprebase
2378                browser.
2379                clean.requireForce
2380                color.branch
2381                color.branch.current
2382                color.branch.local
2383                color.branch.plain
2384                color.branch.remote
2385                color.decorate.HEAD
2386                color.decorate.branch
2387                color.decorate.remoteBranch
2388                color.decorate.stash
2389                color.decorate.tag
2390                color.diff
2391                color.diff.commit
2392                color.diff.frag
2393                color.diff.func
2394                color.diff.meta
2395                color.diff.new
2396                color.diff.old
2397                color.diff.plain
2398                color.diff.whitespace
2399                color.grep
2400                color.grep.context
2401                color.grep.filename
2402                color.grep.function
2403                color.grep.linenumber
2404                color.grep.match
2405                color.grep.selected
2406                color.grep.separator
2407                color.interactive
2408                color.interactive.error
2409                color.interactive.header
2410                color.interactive.help
2411                color.interactive.prompt
2412                color.pager
2413                color.showbranch
2414                color.status
2415                color.status.added
2416                color.status.changed
2417                color.status.header
2418                color.status.localBranch
2419                color.status.nobranch
2420                color.status.remoteBranch
2421                color.status.unmerged
2422                color.status.untracked
2423                color.status.updated
2424                color.ui
2425                commit.cleanup
2426                commit.gpgSign
2427                commit.status
2428                commit.template
2429                commit.verbose
2430                core.abbrev
2431                core.askpass
2432                core.attributesfile
2433                core.autocrlf
2434                core.bare
2435                core.bigFileThreshold
2436                core.checkStat
2437                core.commentChar
2438                core.compression
2439                core.createObject
2440                core.deltaBaseCacheLimit
2441                core.editor
2442                core.eol
2443                core.excludesfile
2444                core.fileMode
2445                core.fsyncobjectfiles
2446                core.gitProxy
2447                core.hideDotFiles
2448                core.hooksPath
2449                core.ignoreStat
2450                core.ignorecase
2451                core.logAllRefUpdates
2452                core.loosecompression
2453                core.notesRef
2454                core.packedGitLimit
2455                core.packedGitWindowSize
2456                core.packedRefsTimeout
2457                core.pager
2458                core.precomposeUnicode
2459                core.preferSymlinkRefs
2460                core.preloadindex
2461                core.protectHFS
2462                core.protectNTFS
2463                core.quotepath
2464                core.repositoryFormatVersion
2465                core.safecrlf
2466                core.sharedRepository
2467                core.sparseCheckout
2468                core.splitIndex
2469                core.sshCommand
2470                core.symlinks
2471                core.trustctime
2472                core.untrackedCache
2473                core.warnAmbiguousRefs
2474                core.whitespace
2475                core.worktree
2476                credential.helper
2477                credential.useHttpPath
2478                credential.username
2479                credentialCache.ignoreSIGHUP
2480                diff.autorefreshindex
2481                diff.external
2482                diff.ignoreSubmodules
2483                diff.mnemonicprefix
2484                diff.noprefix
2485                diff.renameLimit
2486                diff.renames
2487                diff.statGraphWidth
2488                diff.submodule
2489                diff.suppressBlankEmpty
2490                diff.tool
2491                diff.wordRegex
2492                diff.algorithm
2493                difftool.
2494                difftool.prompt
2495                fetch.recurseSubmodules
2496                fetch.unpackLimit
2497                format.attach
2498                format.cc
2499                format.coverLetter
2500                format.from
2501                format.headers
2502                format.numbered
2503                format.pretty
2504                format.signature
2505                format.signoff
2506                format.subjectprefix
2507                format.suffix
2508                format.thread
2509                format.to
2510                gc.
2511                gc.aggressiveDepth
2512                gc.aggressiveWindow
2513                gc.auto
2514                gc.autoDetach
2515                gc.autopacklimit
2516                gc.logExpiry
2517                gc.packrefs
2518                gc.pruneexpire
2519                gc.reflogexpire
2520                gc.reflogexpireunreachable
2521                gc.rerereresolved
2522                gc.rerereunresolved
2523                gc.worktreePruneExpire
2524                gitcvs.allbinary
2525                gitcvs.commitmsgannotation
2526                gitcvs.dbTableNamePrefix
2527                gitcvs.dbdriver
2528                gitcvs.dbname
2529                gitcvs.dbpass
2530                gitcvs.dbuser
2531                gitcvs.enabled
2532                gitcvs.logfile
2533                gitcvs.usecrlfattr
2534                guitool.
2535                gui.blamehistoryctx
2536                gui.commitmsgwidth
2537                gui.copyblamethreshold
2538                gui.diffcontext
2539                gui.encoding
2540                gui.fastcopyblame
2541                gui.matchtrackingbranch
2542                gui.newbranchtemplate
2543                gui.pruneduringfetch
2544                gui.spellingdictionary
2545                gui.trustmtime
2546                help.autocorrect
2547                help.browser
2548                help.format
2549                http.lowSpeedLimit
2550                http.lowSpeedTime
2551                http.maxRequests
2552                http.minSessions
2553                http.noEPSV
2554                http.postBuffer
2555                http.proxy
2556                http.sslCipherList
2557                http.sslVersion
2558                http.sslCAInfo
2559                http.sslCAPath
2560                http.sslCert
2561                http.sslCertPasswordProtected
2562                http.sslKey
2563                http.sslVerify
2564                http.useragent
2565                i18n.commitEncoding
2566                i18n.logOutputEncoding
2567                imap.authMethod
2568                imap.folder
2569                imap.host
2570                imap.pass
2571                imap.port
2572                imap.preformattedHTML
2573                imap.sslverify
2574                imap.tunnel
2575                imap.user
2576                init.templatedir
2577                instaweb.browser
2578                instaweb.httpd
2579                instaweb.local
2580                instaweb.modulepath
2581                instaweb.port
2582                interactive.singlekey
2583                log.date
2584                log.decorate
2585                log.showroot
2586                mailmap.file
2587                man.
2588                man.viewer
2589                merge.
2590                merge.conflictstyle
2591                merge.log
2592                merge.renameLimit
2593                merge.renormalize
2594                merge.stat
2595                merge.tool
2596                merge.verbosity
2597                mergetool.
2598                mergetool.keepBackup
2599                mergetool.keepTemporaries
2600                mergetool.prompt
2601                notes.displayRef
2602                notes.rewrite.
2603                notes.rewrite.amend
2604                notes.rewrite.rebase
2605                notes.rewriteMode
2606                notes.rewriteRef
2607                pack.compression
2608                pack.deltaCacheLimit
2609                pack.deltaCacheSize
2610                pack.depth
2611                pack.indexVersion
2612                pack.packSizeLimit
2613                pack.threads
2614                pack.window
2615                pack.windowMemory
2616                pager.
2617                pretty.
2618                pull.octopus
2619                pull.twohead
2620                push.default
2621                push.followTags
2622                rebase.autosquash
2623                rebase.stat
2624                receive.autogc
2625                receive.denyCurrentBranch
2626                receive.denyDeleteCurrent
2627                receive.denyDeletes
2628                receive.denyNonFastForwards
2629                receive.fsckObjects
2630                receive.unpackLimit
2631                receive.updateserverinfo
2632                remote.pushdefault
2633                remotes.
2634                repack.usedeltabaseoffset
2635                rerere.autoupdate
2636                rerere.enabled
2637                sendemail.
2638                sendemail.aliasesfile
2639                sendemail.aliasfiletype
2640                sendemail.bcc
2641                sendemail.cc
2642                sendemail.cccmd
2643                sendemail.chainreplyto
2644                sendemail.confirm
2645                sendemail.envelopesender
2646                sendemail.from
2647                sendemail.identity
2648                sendemail.multiedit
2649                sendemail.signedoffbycc
2650                sendemail.smtpdomain
2651                sendemail.smtpencryption
2652                sendemail.smtppass
2653                sendemail.smtpserver
2654                sendemail.smtpserveroption
2655                sendemail.smtpserverport
2656                sendemail.smtpuser
2657                sendemail.suppresscc
2658                sendemail.suppressfrom
2659                sendemail.thread
2660                sendemail.to
2661                sendemail.tocmd
2662                sendemail.validate
2663                sendemail.smtpbatchsize
2664                sendemail.smtprelogindelay
2665                showbranch.default
2666                status.relativePaths
2667                status.showUntrackedFiles
2668                status.submodulesummary
2669                submodule.
2670                tar.umask
2671                transfer.unpackLimit
2672                url.
2673                user.email
2674                user.name
2675                user.signingkey
2676                web.browser
2677                branch. remote.
2678        "
2679}
2680
2681_git_remote ()
2682{
2683        local subcommands="
2684                add rename remove set-head set-branches
2685                get-url set-url show prune update
2686                "
2687        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2688        if [ -z "$subcommand" ]; then
2689                case "$cur" in
2690                --*)
2691                        __gitcomp "--verbose"
2692                        ;;
2693                *)
2694                        __gitcomp "$subcommands"
2695                        ;;
2696                esac
2697                return
2698        fi
2699
2700        case "$subcommand,$cur" in
2701        add,--*)
2702                __gitcomp "--track --master --fetch --tags --no-tags --mirror="
2703                ;;
2704        add,*)
2705                ;;
2706        set-head,--*)
2707                __gitcomp "--auto --delete"
2708                ;;
2709        set-branches,--*)
2710                __gitcomp "--add"
2711                ;;
2712        set-head,*|set-branches,*)
2713                __git_complete_remote_or_refspec
2714                ;;
2715        update,--*)
2716                __gitcomp "--prune"
2717                ;;
2718        update,*)
2719                __gitcomp "$(__git_get_config_variables "remotes")"
2720                ;;
2721        set-url,--*)
2722                __gitcomp "--push --add --delete"
2723                ;;
2724        get-url,--*)
2725                __gitcomp "--push --all"
2726                ;;
2727        prune,--*)
2728                __gitcomp "--dry-run"
2729                ;;
2730        *)
2731                __gitcomp_nl "$(__git_remotes)"
2732                ;;
2733        esac
2734}
2735
2736_git_replace ()
2737{
2738        case "$cur" in
2739        --*)
2740                __gitcomp "--edit --graft --format= --list --delete"
2741                return
2742                ;;
2743        esac
2744        __git_complete_refs
2745}
2746
2747_git_rerere ()
2748{
2749        local subcommands="clear forget diff remaining status gc"
2750        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2751        if test -z "$subcommand"
2752        then
2753                __gitcomp "$subcommands"
2754                return
2755        fi
2756}
2757
2758_git_reset ()
2759{
2760        __git_has_doubledash && return
2761
2762        case "$cur" in
2763        --*)
2764                __gitcomp "--merge --mixed --hard --soft --patch --keep"
2765                return
2766                ;;
2767        esac
2768        __git_complete_refs
2769}
2770
2771_git_revert ()
2772{
2773        __git_find_repo_path
2774        if [ -f "$__git_repo_path"/REVERT_HEAD ]; then
2775                __gitcomp "--continue --quit --abort"
2776                return
2777        fi
2778        case "$cur" in
2779        --*)
2780                __gitcomp "
2781                        --edit --mainline --no-edit --no-commit --signoff
2782                        --strategy= --strategy-option=
2783                        "
2784                return
2785                ;;
2786        esac
2787        __git_complete_refs
2788}
2789
2790_git_rm ()
2791{
2792        case "$cur" in
2793        --*)
2794                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2795                return
2796                ;;
2797        esac
2798
2799        __git_complete_index_file "--cached"
2800}
2801
2802_git_shortlog ()
2803{
2804        __git_has_doubledash && return
2805
2806        case "$cur" in
2807        --*)
2808                __gitcomp "
2809                        $__git_log_common_options
2810                        $__git_log_shortlog_options
2811                        --numbered --summary --email
2812                        "
2813                return
2814                ;;
2815        esac
2816        __git_complete_revlist
2817}
2818
2819_git_show ()
2820{
2821        __git_has_doubledash && return
2822
2823        case "$cur" in
2824        --pretty=*|--format=*)
2825                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2826                        " "" "${cur#*=}"
2827                return
2828                ;;
2829        --diff-algorithm=*)
2830                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2831                return
2832                ;;
2833        --submodule=*)
2834                __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
2835                return
2836                ;;
2837        --*)
2838                __gitcomp "--pretty= --format= --abbrev-commit --oneline
2839                        --show-signature
2840                        $__git_diff_common_options
2841                        "
2842                return
2843                ;;
2844        esac
2845        __git_complete_revlist_file
2846}
2847
2848_git_show_branch ()
2849{
2850        case "$cur" in
2851        --*)
2852                __gitcomp "
2853                        --all --remotes --topo-order --date-order --current --more=
2854                        --list --independent --merge-base --no-name
2855                        --color --no-color
2856                        --sha1-name --sparse --topics --reflog
2857                        "
2858                return
2859                ;;
2860        esac
2861        __git_complete_revlist
2862}
2863
2864_git_stash ()
2865{
2866        local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
2867        local subcommands='push save list show apply clear drop pop create branch'
2868        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2869        if [ -z "$subcommand" ]; then
2870                case "$cur" in
2871                --*)
2872                        __gitcomp "$save_opts"
2873                        ;;
2874                *)
2875                        if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2876                                __gitcomp "$subcommands"
2877                        fi
2878                        ;;
2879                esac
2880        else
2881                case "$subcommand,$cur" in
2882                push,--*)
2883                        __gitcomp "$save_opts --message"
2884                        ;;
2885                save,--*)
2886                        __gitcomp "$save_opts"
2887                        ;;
2888                apply,--*|pop,--*)
2889                        __gitcomp "--index --quiet"
2890                        ;;
2891                drop,--*)
2892                        __gitcomp "--quiet"
2893                        ;;
2894                show,--*|branch,--*)
2895                        ;;
2896                branch,*)
2897                        if [ $cword -eq 3 ]; then
2898                                __git_complete_refs
2899                        else
2900                                __gitcomp_nl "$(__git stash list \
2901                                                | sed -n -e 's/:.*//p')"
2902                        fi
2903                        ;;
2904                show,*|apply,*|drop,*|pop,*)
2905                        __gitcomp_nl "$(__git stash list \
2906                                        | sed -n -e 's/:.*//p')"
2907                        ;;
2908                *)
2909                        ;;
2910                esac
2911        fi
2912}
2913
2914_git_submodule ()
2915{
2916        __git_has_doubledash && return
2917
2918        local subcommands="add status init deinit update summary foreach sync"
2919        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2920        if [ -z "$subcommand" ]; then
2921                case "$cur" in
2922                --*)
2923                        __gitcomp "--quiet"
2924                        ;;
2925                *)
2926                        __gitcomp "$subcommands"
2927                        ;;
2928                esac
2929                return
2930        fi
2931
2932        case "$subcommand,$cur" in
2933        add,--*)
2934                __gitcomp "--branch --force --name --reference --depth"
2935                ;;
2936        status,--*)
2937                __gitcomp "--cached --recursive"
2938                ;;
2939        deinit,--*)
2940                __gitcomp "--force --all"
2941                ;;
2942        update,--*)
2943                __gitcomp "
2944                        --init --remote --no-fetch
2945                        --recommend-shallow --no-recommend-shallow
2946                        --force --rebase --merge --reference --depth --recursive --jobs
2947                "
2948                ;;
2949        summary,--*)
2950                __gitcomp "--cached --files --summary-limit"
2951                ;;
2952        foreach,--*|sync,--*)
2953                __gitcomp "--recursive"
2954                ;;
2955        *)
2956                ;;
2957        esac
2958}
2959
2960_git_svn ()
2961{
2962        local subcommands="
2963                init fetch clone rebase dcommit log find-rev
2964                set-tree commit-diff info create-ignore propget
2965                proplist show-ignore show-externals branch tag blame
2966                migrate mkdirs reset gc
2967                "
2968        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2969        if [ -z "$subcommand" ]; then
2970                __gitcomp "$subcommands"
2971        else
2972                local remote_opts="--username= --config-dir= --no-auth-cache"
2973                local fc_opts="
2974                        --follow-parent --authors-file= --repack=
2975                        --no-metadata --use-svm-props --use-svnsync-props
2976                        --log-window-size= --no-checkout --quiet
2977                        --repack-flags --use-log-author --localtime
2978                        --add-author-from
2979                        --ignore-paths= --include-paths= $remote_opts
2980                        "
2981                local init_opts="
2982                        --template= --shared= --trunk= --tags=
2983                        --branches= --stdlayout --minimize-url
2984                        --no-metadata --use-svm-props --use-svnsync-props
2985                        --rewrite-root= --prefix= $remote_opts
2986                        "
2987                local cmt_opts="
2988                        --edit --rmdir --find-copies-harder --copy-similarity=
2989                        "
2990
2991                case "$subcommand,$cur" in
2992                fetch,--*)
2993                        __gitcomp "--revision= --fetch-all $fc_opts"
2994                        ;;
2995                clone,--*)
2996                        __gitcomp "--revision= $fc_opts $init_opts"
2997                        ;;
2998                init,--*)
2999                        __gitcomp "$init_opts"
3000                        ;;
3001                dcommit,--*)
3002                        __gitcomp "
3003                                --merge --strategy= --verbose --dry-run
3004                                --fetch-all --no-rebase --commit-url
3005                                --revision --interactive $cmt_opts $fc_opts
3006                                "
3007                        ;;
3008                set-tree,--*)
3009                        __gitcomp "--stdin $cmt_opts $fc_opts"
3010                        ;;
3011                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
3012                show-externals,--*|mkdirs,--*)
3013                        __gitcomp "--revision="
3014                        ;;
3015                log,--*)
3016                        __gitcomp "
3017                                --limit= --revision= --verbose --incremental
3018                                --oneline --show-commit --non-recursive
3019                                --authors-file= --color
3020                                "
3021                        ;;
3022                rebase,--*)
3023                        __gitcomp "
3024                                --merge --verbose --strategy= --local
3025                                --fetch-all --dry-run $fc_opts
3026                                "
3027                        ;;
3028                commit-diff,--*)
3029                        __gitcomp "--message= --file= --revision= $cmt_opts"
3030                        ;;
3031                info,--*)
3032                        __gitcomp "--url"
3033                        ;;
3034                branch,--*)
3035                        __gitcomp "--dry-run --message --tag"
3036                        ;;
3037                tag,--*)
3038                        __gitcomp "--dry-run --message"
3039                        ;;
3040                blame,--*)
3041                        __gitcomp "--git-format"
3042                        ;;
3043                migrate,--*)
3044                        __gitcomp "
3045                                --config-dir= --ignore-paths= --minimize
3046                                --no-auth-cache --username=
3047                                "
3048                        ;;
3049                reset,--*)
3050                        __gitcomp "--revision= --parent"
3051                        ;;
3052                *)
3053                        ;;
3054                esac
3055        fi
3056}
3057
3058_git_tag ()
3059{
3060        local i c=1 f=0
3061        while [ $c -lt $cword ]; do
3062                i="${words[c]}"
3063                case "$i" in
3064                -d|-v)
3065                        __gitcomp_direct "$(__git_tags "" "$cur" " ")"
3066                        return
3067                        ;;
3068                -f)
3069                        f=1
3070                        ;;
3071                esac
3072                ((c++))
3073        done
3074
3075        case "$prev" in
3076        -m|-F)
3077                ;;
3078        -*|tag)
3079                if [ $f = 1 ]; then
3080                        __gitcomp_direct "$(__git_tags "" "$cur" " ")"
3081                fi
3082                ;;
3083        *)
3084                __git_complete_refs
3085                ;;
3086        esac
3087
3088        case "$cur" in
3089        --*)
3090                __gitcomp "
3091                        --list --delete --verify --annotate --message --file
3092                        --sign --cleanup --local-user --force --column --sort=
3093                        --contains --no-contains --points-at --merged --no-merged --create-reflog
3094                        "
3095                ;;
3096        esac
3097}
3098
3099_git_whatchanged ()
3100{
3101        _git_log
3102}
3103
3104_git_worktree ()
3105{
3106        local subcommands="add list lock prune unlock"
3107        local subcommand="$(__git_find_on_cmdline "$subcommands")"
3108        if [ -z "$subcommand" ]; then
3109                __gitcomp "$subcommands"
3110        else
3111                case "$subcommand,$cur" in
3112                add,--*)
3113                        __gitcomp "--detach"
3114                        ;;
3115                list,--*)
3116                        __gitcomp "--porcelain"
3117                        ;;
3118                lock,--*)
3119                        __gitcomp "--reason"
3120                        ;;
3121                prune,--*)
3122                        __gitcomp "--dry-run --expire --verbose"
3123                        ;;
3124                *)
3125                        ;;
3126                esac
3127        fi
3128}
3129
3130__git_main ()
3131{
3132        local i c=1 command __git_dir __git_repo_path
3133        local __git_C_args C_args_count=0
3134
3135        while [ $c -lt $cword ]; do
3136                i="${words[c]}"
3137                case "$i" in
3138                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
3139                --git-dir)   ((c++)) ; __git_dir="${words[c]}" ;;
3140                --bare)      __git_dir="." ;;
3141                --help) command="help"; break ;;
3142                -c|--work-tree|--namespace) ((c++)) ;;
3143                -C)     __git_C_args[C_args_count++]=-C
3144                        ((c++))
3145                        __git_C_args[C_args_count++]="${words[c]}"
3146                        ;;
3147                -*) ;;
3148                *) command="$i"; break ;;
3149                esac
3150                ((c++))
3151        done
3152
3153        if [ -z "$command" ]; then
3154                case "$prev" in
3155                --git-dir|-C|--work-tree)
3156                        # these need a path argument, let's fall back to
3157                        # Bash filename completion
3158                        return
3159                        ;;
3160                -c|--namespace)
3161                        # we don't support completing these options' arguments
3162                        return
3163                        ;;
3164                esac
3165                case "$cur" in
3166                --*)   __gitcomp "
3167                        --paginate
3168                        --no-pager
3169                        --git-dir=
3170                        --bare
3171                        --version
3172                        --exec-path
3173                        --exec-path=
3174                        --html-path
3175                        --man-path
3176                        --info-path
3177                        --work-tree=
3178                        --namespace=
3179                        --no-replace-objects
3180                        --help
3181                        "
3182                        ;;
3183                *)     __git_compute_porcelain_commands
3184                       __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
3185                esac
3186                return
3187        fi
3188
3189        local completion_func="_git_${command//-/_}"
3190        declare -f $completion_func >/dev/null 2>/dev/null && $completion_func && return
3191
3192        local expansion=$(__git_aliased_command "$command")
3193        if [ -n "$expansion" ]; then
3194                words[1]=$expansion
3195                completion_func="_git_${expansion//-/_}"
3196                declare -f $completion_func >/dev/null 2>/dev/null && $completion_func
3197        fi
3198}
3199
3200__gitk_main ()
3201{
3202        __git_has_doubledash && return
3203
3204        local __git_repo_path
3205        __git_find_repo_path
3206
3207        local merge=""
3208        if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
3209                merge="--merge"
3210        fi
3211        case "$cur" in
3212        --*)
3213                __gitcomp "
3214                        $__git_log_common_options
3215                        $__git_log_gitk_options
3216                        $merge
3217                        "
3218                return
3219                ;;
3220        esac
3221        __git_complete_revlist
3222}
3223
3224if [[ -n ${ZSH_VERSION-} ]]; then
3225        echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
3226
3227        autoload -U +X compinit && compinit
3228
3229        __gitcomp ()
3230        {
3231                emulate -L zsh
3232
3233                local cur_="${3-$cur}"
3234
3235                case "$cur_" in
3236                --*=)
3237                        ;;
3238                *)
3239                        local c IFS=$' \t\n'
3240                        local -a array
3241                        for c in ${=1}; do
3242                                c="$c${4-}"
3243                                case $c in
3244                                --*=*|*.) ;;
3245                                *) c="$c " ;;
3246                                esac
3247                                array[${#array[@]}+1]="$c"
3248                        done
3249                        compset -P '*[=:]'
3250                        compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
3251                        ;;
3252                esac
3253        }
3254
3255        __gitcomp_direct ()
3256        {
3257                emulate -L zsh
3258
3259                local IFS=$'\n'
3260                compset -P '*[=:]'
3261                compadd -Q -- ${=1} && _ret=0
3262        }
3263
3264        __gitcomp_nl ()
3265        {
3266                emulate -L zsh
3267
3268                local IFS=$'\n'
3269                compset -P '*[=:]'
3270                compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
3271        }
3272
3273        __gitcomp_file ()
3274        {
3275                emulate -L zsh
3276
3277                local IFS=$'\n'
3278                compset -P '*[=:]'
3279                compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
3280        }
3281
3282        _git ()
3283        {
3284                local _ret=1 cur cword prev
3285                cur=${words[CURRENT]}
3286                prev=${words[CURRENT-1]}
3287                let cword=CURRENT-1
3288                emulate ksh -c __${service}_main
3289                let _ret && _default && _ret=0
3290                return _ret
3291        }
3292
3293        compdef _git git gitk
3294        return
3295fi
3296
3297__git_func_wrap ()
3298{
3299        local cur words cword prev
3300        _get_comp_words_by_ref -n =: cur words cword prev
3301        $1
3302}
3303
3304# Setup completion for certain functions defined above by setting common
3305# variables and workarounds.
3306# This is NOT a public function; use at your own risk.
3307__git_complete ()
3308{
3309        local wrapper="__git_wrap${2}"
3310        eval "$wrapper () { __git_func_wrap $2 ; }"
3311        complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
3312                || complete -o default -o nospace -F $wrapper $1
3313}
3314
3315# wrapper for backwards compatibility
3316_git ()
3317{
3318        __git_wrap__git_main
3319}
3320
3321# wrapper for backwards compatibility
3322_gitk ()
3323{
3324        __git_wrap__gitk_main
3325}
3326
3327__git_complete git __git_main
3328__git_complete gitk __gitk_main
3329
3330# The following are necessary only for Cygwin, and only are needed
3331# when the user has tab-completed the executable name and consequently
3332# included the '.exe' suffix.
3333#
3334if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
3335__git_complete git.exe __git_main
3336fi