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