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