a2b86034165802031967ebbc09ff552f1c93ddf9
   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                --all)
 713                        case "$cmd" in
 714                        push) no_complete_refspec=1 ;;
 715                        fetch)
 716                                return
 717                                ;;
 718                        *) ;;
 719                        esac
 720                        ;;
 721                -*) ;;
 722                *) remote="$i"; break ;;
 723                esac
 724                ((c++))
 725        done
 726        if [ -z "$remote" ]; then
 727                __gitcomp_nl "$(__git_remotes)"
 728                return
 729        fi
 730        if [ $no_complete_refspec = 1 ]; then
 731                return
 732        fi
 733        [ "$remote" = "." ] && remote=
 734        case "$cur_" in
 735        *:*)
 736                case "$COMP_WORDBREAKS" in
 737                *:*) : great ;;
 738                *)   pfx="${cur_%%:*}:" ;;
 739                esac
 740                cur_="${cur_#*:}"
 741                lhs=0
 742                ;;
 743        +*)
 744                pfx="+"
 745                cur_="${cur_#+}"
 746                ;;
 747        esac
 748        case "$cmd" in
 749        fetch)
 750                if [ $lhs = 1 ]; then
 751                        __git_complete_fetch_refspecs "$remote" "$pfx" "$cur_"
 752                else
 753                        __git_complete_refs --pfx="$pfx" --cur="$cur_"
 754                fi
 755                ;;
 756        pull|remote)
 757                if [ $lhs = 1 ]; then
 758                        __git_complete_refs --remote="$remote" --pfx="$pfx" --cur="$cur_"
 759                else
 760                        __git_complete_refs --pfx="$pfx" --cur="$cur_"
 761                fi
 762                ;;
 763        push)
 764                if [ $lhs = 1 ]; then
 765                        __git_complete_refs --pfx="$pfx" --cur="$cur_"
 766                else
 767                        __git_complete_refs --remote="$remote" --pfx="$pfx" --cur="$cur_"
 768                fi
 769                ;;
 770        esac
 771}
 772
 773__git_complete_strategy ()
 774{
 775        __git_compute_merge_strategies
 776        case "$prev" in
 777        -s|--strategy)
 778                __gitcomp "$__git_merge_strategies"
 779                return 0
 780        esac
 781        case "$cur" in
 782        --strategy=*)
 783                __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
 784                return 0
 785                ;;
 786        esac
 787        return 1
 788}
 789
 790__git_commands () {
 791        if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
 792        then
 793                printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
 794        else
 795                git help -a|egrep '^  [a-zA-Z0-9]'
 796        fi
 797}
 798
 799__git_list_all_commands ()
 800{
 801        local i IFS=" "$'\n'
 802        for i in $(__git_commands)
 803        do
 804                case $i in
 805                *--*)             : helper pattern;;
 806                *) echo $i;;
 807                esac
 808        done
 809}
 810
 811__git_all_commands=
 812__git_compute_all_commands ()
 813{
 814        test -n "$__git_all_commands" ||
 815        __git_all_commands=$(__git_list_all_commands)
 816}
 817
 818__git_list_porcelain_commands ()
 819{
 820        local i IFS=" "$'\n'
 821        __git_compute_all_commands
 822        for i in $__git_all_commands
 823        do
 824                case $i in
 825                *--*)             : helper pattern;;
 826                applymbox)        : ask gittus;;
 827                applypatch)       : ask gittus;;
 828                archimport)       : import;;
 829                cat-file)         : plumbing;;
 830                check-attr)       : plumbing;;
 831                check-ignore)     : plumbing;;
 832                check-mailmap)    : plumbing;;
 833                check-ref-format) : plumbing;;
 834                checkout-index)   : plumbing;;
 835                column)           : internal helper;;
 836                commit-tree)      : plumbing;;
 837                count-objects)    : infrequent;;
 838                credential)       : credentials;;
 839                credential-*)     : credentials helper;;
 840                cvsexportcommit)  : export;;
 841                cvsimport)        : import;;
 842                cvsserver)        : daemon;;
 843                daemon)           : daemon;;
 844                diff-files)       : plumbing;;
 845                diff-index)       : plumbing;;
 846                diff-tree)        : plumbing;;
 847                fast-import)      : import;;
 848                fast-export)      : export;;
 849                fsck-objects)     : plumbing;;
 850                fetch-pack)       : plumbing;;
 851                fmt-merge-msg)    : plumbing;;
 852                for-each-ref)     : plumbing;;
 853                hash-object)      : plumbing;;
 854                http-*)           : transport;;
 855                index-pack)       : plumbing;;
 856                init-db)          : deprecated;;
 857                local-fetch)      : plumbing;;
 858                ls-files)         : plumbing;;
 859                ls-remote)        : plumbing;;
 860                ls-tree)          : plumbing;;
 861                mailinfo)         : plumbing;;
 862                mailsplit)        : plumbing;;
 863                merge-*)          : plumbing;;
 864                mktree)           : plumbing;;
 865                mktag)            : plumbing;;
 866                pack-objects)     : plumbing;;
 867                pack-redundant)   : plumbing;;
 868                pack-refs)        : plumbing;;
 869                parse-remote)     : plumbing;;
 870                patch-id)         : plumbing;;
 871                prune)            : plumbing;;
 872                prune-packed)     : plumbing;;
 873                quiltimport)      : import;;
 874                read-tree)        : plumbing;;
 875                receive-pack)     : plumbing;;
 876                remote-*)         : transport;;
 877                rerere)           : plumbing;;
 878                rev-list)         : plumbing;;
 879                rev-parse)        : plumbing;;
 880                runstatus)        : plumbing;;
 881                sh-setup)         : internal;;
 882                shell)            : daemon;;
 883                show-ref)         : plumbing;;
 884                send-pack)        : plumbing;;
 885                show-index)       : plumbing;;
 886                ssh-*)            : transport;;
 887                stripspace)       : plumbing;;
 888                symbolic-ref)     : plumbing;;
 889                unpack-file)      : plumbing;;
 890                unpack-objects)   : plumbing;;
 891                update-index)     : plumbing;;
 892                update-ref)       : plumbing;;
 893                update-server-info) : daemon;;
 894                upload-archive)   : plumbing;;
 895                upload-pack)      : plumbing;;
 896                write-tree)       : plumbing;;
 897                var)              : infrequent;;
 898                verify-pack)      : infrequent;;
 899                verify-tag)       : plumbing;;
 900                *) echo $i;;
 901                esac
 902        done
 903}
 904
 905__git_porcelain_commands=
 906__git_compute_porcelain_commands ()
 907{
 908        test -n "$__git_porcelain_commands" ||
 909        __git_porcelain_commands=$(__git_list_porcelain_commands)
 910}
 911
 912# Lists all set config variables starting with the given section prefix,
 913# with the prefix removed.
 914__git_get_config_variables ()
 915{
 916        local section="$1" i IFS=$'\n'
 917        for i in $(__git config --name-only --get-regexp "^$section\..*"); do
 918                echo "${i#$section.}"
 919        done
 920}
 921
 922__git_pretty_aliases ()
 923{
 924        __git_get_config_variables "pretty"
 925}
 926
 927__git_aliases ()
 928{
 929        __git_get_config_variables "alias"
 930}
 931
 932# __git_aliased_command requires 1 argument
 933__git_aliased_command ()
 934{
 935        local word cmdline=$(__git config --get "alias.$1")
 936        for word in $cmdline; do
 937                case "$word" in
 938                \!gitk|gitk)
 939                        echo "gitk"
 940                        return
 941                        ;;
 942                \!*)    : shell command alias ;;
 943                -*)     : option ;;
 944                *=*)    : setting env ;;
 945                git)    : git itself ;;
 946                \(\))   : skip parens of shell function definition ;;
 947                {)      : skip start of shell helper function ;;
 948                :)      : skip null command ;;
 949                \'*)    : skip opening quote after sh -c ;;
 950                *)
 951                        echo "$word"
 952                        return
 953                esac
 954        done
 955}
 956
 957# __git_find_on_cmdline requires 1 argument
 958__git_find_on_cmdline ()
 959{
 960        local word subcommand c=1
 961        while [ $c -lt $cword ]; do
 962                word="${words[c]}"
 963                for subcommand in $1; do
 964                        if [ "$subcommand" = "$word" ]; then
 965                                echo "$subcommand"
 966                                return
 967                        fi
 968                done
 969                ((c++))
 970        done
 971}
 972
 973# Echo the value of an option set on the command line or config
 974#
 975# $1: short option name
 976# $2: long option name including =
 977# $3: list of possible values
 978# $4: config string (optional)
 979#
 980# example:
 981# result="$(__git_get_option_value "-d" "--do-something=" \
 982#     "yes no" "core.doSomething")"
 983#
 984# result is then either empty (no option set) or "yes" or "no"
 985#
 986# __git_get_option_value requires 3 arguments
 987__git_get_option_value ()
 988{
 989        local c short_opt long_opt val
 990        local result= values config_key word
 991
 992        short_opt="$1"
 993        long_opt="$2"
 994        values="$3"
 995        config_key="$4"
 996
 997        ((c = $cword - 1))
 998        while [ $c -ge 0 ]; do
 999                word="${words[c]}"
1000                for val in $values; do
1001                        if [ "$short_opt$val" = "$word" ] ||
1002                           [ "$long_opt$val"  = "$word" ]; then
1003                                result="$val"
1004                                break 2
1005                        fi
1006                done
1007                ((c--))
1008        done
1009
1010        if [ -n "$config_key" ] && [ -z "$result" ]; then
1011                result="$(__git config "$config_key")"
1012        fi
1013
1014        echo "$result"
1015}
1016
1017__git_has_doubledash ()
1018{
1019        local c=1
1020        while [ $c -lt $cword ]; do
1021                if [ "--" = "${words[c]}" ]; then
1022                        return 0
1023                fi
1024                ((c++))
1025        done
1026        return 1
1027}
1028
1029# Try to count non option arguments passed on the command line for the
1030# specified git command.
1031# When options are used, it is necessary to use the special -- option to
1032# tell the implementation were non option arguments begin.
1033# XXX this can not be improved, since options can appear everywhere, as
1034# an example:
1035#       git mv x -n y
1036#
1037# __git_count_arguments requires 1 argument: the git command executed.
1038__git_count_arguments ()
1039{
1040        local word i c=0
1041
1042        # Skip "git" (first argument)
1043        for ((i=1; i < ${#words[@]}; i++)); do
1044                word="${words[i]}"
1045
1046                case "$word" in
1047                        --)
1048                                # Good; we can assume that the following are only non
1049                                # option arguments.
1050                                ((c = 0))
1051                                ;;
1052                        "$1")
1053                                # Skip the specified git command and discard git
1054                                # main options
1055                                ((c = 0))
1056                                ;;
1057                        ?*)
1058                                ((c++))
1059                                ;;
1060                esac
1061        done
1062
1063        printf "%d" $c
1064}
1065
1066__git_whitespacelist="nowarn warn error error-all fix"
1067
1068_git_am ()
1069{
1070        __git_find_repo_path
1071        if [ -d "$__git_repo_path"/rebase-apply ]; then
1072                __gitcomp "--skip --continue --resolved --abort"
1073                return
1074        fi
1075        case "$cur" in
1076        --whitespace=*)
1077                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1078                return
1079                ;;
1080        --*)
1081                __gitcomp "
1082                        --3way --committer-date-is-author-date --ignore-date
1083                        --ignore-whitespace --ignore-space-change
1084                        --interactive --keep --no-utf8 --signoff --utf8
1085                        --whitespace= --scissors
1086                        "
1087                return
1088        esac
1089}
1090
1091_git_apply ()
1092{
1093        case "$cur" in
1094        --whitespace=*)
1095                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1096                return
1097                ;;
1098        --*)
1099                __gitcomp "
1100                        --stat --numstat --summary --check --index
1101                        --cached --index-info --reverse --reject --unidiff-zero
1102                        --apply --no-add --exclude=
1103                        --ignore-whitespace --ignore-space-change
1104                        --whitespace= --inaccurate-eof --verbose
1105                        "
1106                return
1107        esac
1108}
1109
1110_git_add ()
1111{
1112        case "$cur" in
1113        --*)
1114                __gitcomp "
1115                        --interactive --refresh --patch --update --dry-run
1116                        --ignore-errors --intent-to-add
1117                        "
1118                return
1119        esac
1120
1121        # XXX should we check for --update and --all options ?
1122        __git_complete_index_file "--others --modified --directory --no-empty-directory"
1123}
1124
1125_git_archive ()
1126{
1127        case "$cur" in
1128        --format=*)
1129                __gitcomp "$(git archive --list)" "" "${cur##--format=}"
1130                return
1131                ;;
1132        --remote=*)
1133                __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
1134                return
1135                ;;
1136        --*)
1137                __gitcomp "
1138                        --format= --list --verbose
1139                        --prefix= --remote= --exec=
1140                        "
1141                return
1142                ;;
1143        esac
1144        __git_complete_file
1145}
1146
1147_git_bisect ()
1148{
1149        __git_has_doubledash && return
1150
1151        local subcommands="start bad good skip reset visualize replay log run"
1152        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1153        if [ -z "$subcommand" ]; then
1154                __git_find_repo_path
1155                if [ -f "$__git_repo_path"/BISECT_START ]; then
1156                        __gitcomp "$subcommands"
1157                else
1158                        __gitcomp "replay start"
1159                fi
1160                return
1161        fi
1162
1163        case "$subcommand" in
1164        bad|good|reset|skip|start)
1165                __git_complete_refs
1166                ;;
1167        *)
1168                ;;
1169        esac
1170}
1171
1172_git_branch ()
1173{
1174        local i c=1 only_local_ref="n" has_r="n"
1175
1176        while [ $c -lt $cword ]; do
1177                i="${words[c]}"
1178                case "$i" in
1179                -d|--delete|-m|--move)  only_local_ref="y" ;;
1180                -r|--remotes)           has_r="y" ;;
1181                esac
1182                ((c++))
1183        done
1184
1185        case "$cur" in
1186        --set-upstream-to=*)
1187                __git_complete_refs --cur="${cur##--set-upstream-to=}"
1188                ;;
1189        --*)
1190                __gitcomp "
1191                        --color --no-color --verbose --abbrev= --no-abbrev
1192                        --track --no-track --contains --merged --no-merged
1193                        --set-upstream-to= --edit-description --list
1194                        --unset-upstream --delete --move --remotes
1195                        "
1196                ;;
1197        *)
1198                if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1199                        __gitcomp_direct "$(__git_heads "" "$cur" " ")"
1200                else
1201                        __git_complete_refs
1202                fi
1203                ;;
1204        esac
1205}
1206
1207_git_bundle ()
1208{
1209        local cmd="${words[2]}"
1210        case "$cword" in
1211        2)
1212                __gitcomp "create list-heads verify unbundle"
1213                ;;
1214        3)
1215                # looking for a file
1216                ;;
1217        *)
1218                case "$cmd" in
1219                        create)
1220                                __git_complete_revlist
1221                        ;;
1222                esac
1223                ;;
1224        esac
1225}
1226
1227_git_checkout ()
1228{
1229        __git_has_doubledash && return
1230
1231        case "$cur" in
1232        --conflict=*)
1233                __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1234                ;;
1235        --*)
1236                __gitcomp "
1237                        --quiet --ours --theirs --track --no-track --merge
1238                        --conflict= --orphan --patch
1239                        "
1240                ;;
1241        *)
1242                # check if --track, --no-track, or --no-guess was specified
1243                # if so, disable DWIM mode
1244                local flags="--track --no-track --no-guess" track_opt="--track"
1245                if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1246                        track_opt=''
1247                fi
1248                __git_complete_refs $track_opt
1249                ;;
1250        esac
1251}
1252
1253_git_cherry ()
1254{
1255        __git_complete_refs
1256}
1257
1258_git_cherry_pick ()
1259{
1260        __git_find_repo_path
1261        if [ -f "$__git_repo_path"/CHERRY_PICK_HEAD ]; then
1262                __gitcomp "--continue --quit --abort"
1263                return
1264        fi
1265        case "$cur" in
1266        --*)
1267                __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1268                ;;
1269        *)
1270                __git_complete_refs
1271                ;;
1272        esac
1273}
1274
1275_git_clean ()
1276{
1277        case "$cur" in
1278        --*)
1279                __gitcomp "--dry-run --quiet"
1280                return
1281                ;;
1282        esac
1283
1284        # XXX should we check for -x option ?
1285        __git_complete_index_file "--others --directory"
1286}
1287
1288_git_clone ()
1289{
1290        case "$cur" in
1291        --*)
1292                __gitcomp "
1293                        --local
1294                        --no-hardlinks
1295                        --shared
1296                        --reference
1297                        --quiet
1298                        --no-checkout
1299                        --bare
1300                        --mirror
1301                        --origin
1302                        --upload-pack
1303                        --template=
1304                        --depth
1305                        --single-branch
1306                        --branch
1307                        --recurse-submodules
1308                        "
1309                return
1310                ;;
1311        esac
1312}
1313
1314__git_untracked_file_modes="all no normal"
1315
1316_git_commit ()
1317{
1318        case "$prev" in
1319        -c|-C)
1320                __git_complete_refs
1321                return
1322                ;;
1323        esac
1324
1325        case "$cur" in
1326        --cleanup=*)
1327                __gitcomp "default scissors strip verbatim whitespace
1328                        " "" "${cur##--cleanup=}"
1329                return
1330                ;;
1331        --reuse-message=*|--reedit-message=*|\
1332        --fixup=*|--squash=*)
1333                __git_complete_refs --cur="${cur#*=}"
1334                return
1335                ;;
1336        --untracked-files=*)
1337                __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1338                return
1339                ;;
1340        --*)
1341                __gitcomp "
1342                        --all --author= --signoff --verify --no-verify
1343                        --edit --no-edit
1344                        --amend --include --only --interactive
1345                        --dry-run --reuse-message= --reedit-message=
1346                        --reset-author --file= --message= --template=
1347                        --cleanup= --untracked-files --untracked-files=
1348                        --verbose --quiet --fixup= --squash=
1349                        "
1350                return
1351        esac
1352
1353        if __git rev-parse --verify --quiet HEAD >/dev/null; then
1354                __git_complete_index_file "--committable"
1355        else
1356                # This is the first commit
1357                __git_complete_index_file "--cached"
1358        fi
1359}
1360
1361_git_describe ()
1362{
1363        case "$cur" in
1364        --*)
1365                __gitcomp "
1366                        --all --tags --contains --abbrev= --candidates=
1367                        --exact-match --debug --long --match --always
1368                        "
1369                return
1370        esac
1371        __git_complete_refs
1372}
1373
1374__git_diff_algorithms="myers minimal patience histogram"
1375
1376__git_diff_submodule_formats="diff log short"
1377
1378__git_diff_common_options="--stat --numstat --shortstat --summary
1379                        --patch-with-stat --name-only --name-status --color
1380                        --no-color --color-words --no-renames --check
1381                        --full-index --binary --abbrev --diff-filter=
1382                        --find-copies-harder
1383                        --text --ignore-space-at-eol --ignore-space-change
1384                        --ignore-all-space --ignore-blank-lines --exit-code
1385                        --quiet --ext-diff --no-ext-diff
1386                        --no-prefix --src-prefix= --dst-prefix=
1387                        --inter-hunk-context=
1388                        --patience --histogram --minimal
1389                        --raw --word-diff --word-diff-regex=
1390                        --dirstat --dirstat= --dirstat-by-file
1391                        --dirstat-by-file= --cumulative
1392                        --diff-algorithm=
1393                        --submodule --submodule=
1394"
1395
1396_git_diff ()
1397{
1398        __git_has_doubledash && return
1399
1400        case "$cur" in
1401        --diff-algorithm=*)
1402                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1403                return
1404                ;;
1405        --submodule=*)
1406                __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1407                return
1408                ;;
1409        --*)
1410                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1411                        --base --ours --theirs --no-index
1412                        $__git_diff_common_options
1413                        "
1414                return
1415                ;;
1416        esac
1417        __git_complete_revlist_file
1418}
1419
1420__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1421                        tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
1422"
1423
1424_git_difftool ()
1425{
1426        __git_has_doubledash && return
1427
1428        case "$cur" in
1429        --tool=*)
1430                __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1431                return
1432                ;;
1433        --*)
1434                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1435                        --base --ours --theirs
1436                        --no-renames --diff-filter= --find-copies-harder
1437                        --relative --ignore-submodules
1438                        --tool="
1439                return
1440                ;;
1441        esac
1442        __git_complete_revlist_file
1443}
1444
1445__git_fetch_recurse_submodules="yes on-demand no"
1446
1447__git_fetch_options="
1448        --quiet --verbose --append --upload-pack --force --keep --depth=
1449        --tags --no-tags --all --prune --dry-run --recurse-submodules=
1450"
1451
1452_git_fetch ()
1453{
1454        case "$cur" in
1455        --recurse-submodules=*)
1456                __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1457                return
1458                ;;
1459        --*)
1460                __gitcomp "$__git_fetch_options"
1461                return
1462                ;;
1463        esac
1464        __git_complete_remote_or_refspec
1465}
1466
1467__git_format_patch_options="
1468        --stdout --attach --no-attach --thread --thread= --no-thread
1469        --numbered --start-number --numbered-files --keep-subject --signoff
1470        --signature --no-signature --in-reply-to= --cc= --full-index --binary
1471        --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1472        --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1473        --output-directory --reroll-count --to= --quiet --notes
1474"
1475
1476_git_format_patch ()
1477{
1478        case "$cur" in
1479        --thread=*)
1480                __gitcomp "
1481                        deep shallow
1482                        " "" "${cur##--thread=}"
1483                return
1484                ;;
1485        --*)
1486                __gitcomp "$__git_format_patch_options"
1487                return
1488                ;;
1489        esac
1490        __git_complete_revlist
1491}
1492
1493_git_fsck ()
1494{
1495        case "$cur" in
1496        --*)
1497                __gitcomp "
1498                        --tags --root --unreachable --cache --no-reflogs --full
1499                        --strict --verbose --lost-found
1500                        "
1501                return
1502                ;;
1503        esac
1504}
1505
1506_git_gc ()
1507{
1508        case "$cur" in
1509        --*)
1510                __gitcomp "--prune --aggressive"
1511                return
1512                ;;
1513        esac
1514}
1515
1516_git_gitk ()
1517{
1518        _gitk
1519}
1520
1521# Lists matching symbol names from a tag (as in ctags) file.
1522# 1: List symbol names matching this word.
1523# 2: The tag file to list symbol names from.
1524# 3: A prefix to be added to each listed symbol name (optional).
1525# 4: A suffix to be appended to each listed symbol name (optional).
1526__git_match_ctag () {
1527        awk -v pfx="${3-}" -v sfx="${4-}" "
1528                /^${1//\//\\/}/ { print pfx \$1 sfx }
1529                " "$2"
1530}
1531
1532# Complete symbol names from a tag file.
1533# Usage: __git_complete_symbol [<option>]...
1534# --tags=<file>: The tag file to list symbol names from instead of the
1535#                default "tags".
1536# --pfx=<prefix>: A prefix to be added to each symbol name.
1537# --cur=<word>: The current symbol name to be completed.  Defaults to
1538#               the current word to be completed.
1539# --sfx=<suffix>: A suffix to be appended to each symbol name instead
1540#                 of the default space.
1541__git_complete_symbol () {
1542        local tags=tags pfx="" cur_="${cur-}" sfx=" "
1543
1544        while test $# != 0; do
1545                case "$1" in
1546                --tags=*)       tags="${1##--tags=}" ;;
1547                --pfx=*)        pfx="${1##--pfx=}" ;;
1548                --cur=*)        cur_="${1##--cur=}" ;;
1549                --sfx=*)        sfx="${1##--sfx=}" ;;
1550                *)              return 1 ;;
1551                esac
1552                shift
1553        done
1554
1555        if test -r "$tags"; then
1556                __gitcomp_direct "$(__git_match_ctag "$cur_" "$tags" "$pfx" "$sfx")"
1557        fi
1558}
1559
1560_git_grep ()
1561{
1562        __git_has_doubledash && return
1563
1564        case "$cur" in
1565        --*)
1566                __gitcomp "
1567                        --cached
1568                        --text --ignore-case --word-regexp --invert-match
1569                        --full-name --line-number
1570                        --extended-regexp --basic-regexp --fixed-strings
1571                        --perl-regexp
1572                        --threads
1573                        --files-with-matches --name-only
1574                        --files-without-match
1575                        --max-depth
1576                        --count
1577                        --and --or --not --all-match
1578                        "
1579                return
1580                ;;
1581        esac
1582
1583        case "$cword,$prev" in
1584        2,*|*,-*)
1585                __git_complete_symbol && return
1586                ;;
1587        esac
1588
1589        __git_complete_refs
1590}
1591
1592_git_help ()
1593{
1594        case "$cur" in
1595        --*)
1596                __gitcomp "--all --guides --info --man --web"
1597                return
1598                ;;
1599        esac
1600        __git_compute_all_commands
1601        __gitcomp "$__git_all_commands $(__git_aliases)
1602                attributes cli core-tutorial cvs-migration
1603                diffcore everyday gitk glossary hooks ignore modules
1604                namespaces repository-layout revisions tutorial tutorial-2
1605                workflows
1606                "
1607}
1608
1609_git_init ()
1610{
1611        case "$cur" in
1612        --shared=*)
1613                __gitcomp "
1614                        false true umask group all world everybody
1615                        " "" "${cur##--shared=}"
1616                return
1617                ;;
1618        --*)
1619                __gitcomp "--quiet --bare --template= --shared --shared="
1620                return
1621                ;;
1622        esac
1623}
1624
1625_git_ls_files ()
1626{
1627        case "$cur" in
1628        --*)
1629                __gitcomp "--cached --deleted --modified --others --ignored
1630                        --stage --directory --no-empty-directory --unmerged
1631                        --killed --exclude= --exclude-from=
1632                        --exclude-per-directory= --exclude-standard
1633                        --error-unmatch --with-tree= --full-name
1634                        --abbrev --ignored --exclude-per-directory
1635                        "
1636                return
1637                ;;
1638        esac
1639
1640        # XXX ignore options like --modified and always suggest all cached
1641        # files.
1642        __git_complete_index_file "--cached"
1643}
1644
1645_git_ls_remote ()
1646{
1647        __gitcomp_nl "$(__git_remotes)"
1648}
1649
1650_git_ls_tree ()
1651{
1652        __git_complete_file
1653}
1654
1655# Options that go well for log, shortlog and gitk
1656__git_log_common_options="
1657        --not --all
1658        --branches --tags --remotes
1659        --first-parent --merges --no-merges
1660        --max-count=
1661        --max-age= --since= --after=
1662        --min-age= --until= --before=
1663        --min-parents= --max-parents=
1664        --no-min-parents --no-max-parents
1665"
1666# Options that go well for log and gitk (not shortlog)
1667__git_log_gitk_options="
1668        --dense --sparse --full-history
1669        --simplify-merges --simplify-by-decoration
1670        --left-right --notes --no-notes
1671"
1672# Options that go well for log and shortlog (not gitk)
1673__git_log_shortlog_options="
1674        --author= --committer= --grep=
1675        --all-match --invert-grep
1676"
1677
1678__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1679__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1680
1681_git_log ()
1682{
1683        __git_has_doubledash && return
1684        __git_find_repo_path
1685
1686        local merge=""
1687        if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
1688                merge="--merge"
1689        fi
1690        case "$cur" in
1691        --pretty=*|--format=*)
1692                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1693                        " "" "${cur#*=}"
1694                return
1695                ;;
1696        --date=*)
1697                __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1698                return
1699                ;;
1700        --decorate=*)
1701                __gitcomp "full short no" "" "${cur##--decorate=}"
1702                return
1703                ;;
1704        --diff-algorithm=*)
1705                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1706                return
1707                ;;
1708        --submodule=*)
1709                __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1710                return
1711                ;;
1712        --*)
1713                __gitcomp "
1714                        $__git_log_common_options
1715                        $__git_log_shortlog_options
1716                        $__git_log_gitk_options
1717                        --root --topo-order --date-order --reverse
1718                        --follow --full-diff
1719                        --abbrev-commit --abbrev=
1720                        --relative-date --date=
1721                        --pretty= --format= --oneline
1722                        --show-signature
1723                        --cherry-mark
1724                        --cherry-pick
1725                        --graph
1726                        --decorate --decorate=
1727                        --walk-reflogs
1728                        --parents --children
1729                        $merge
1730                        $__git_diff_common_options
1731                        --pickaxe-all --pickaxe-regex
1732                        "
1733                return
1734                ;;
1735        esac
1736        __git_complete_revlist
1737}
1738
1739# Common merge options shared by git-merge(1) and git-pull(1).
1740__git_merge_options="
1741        --no-commit --no-stat --log --no-log --squash --strategy
1742        --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1743        --verify-signatures --no-verify-signatures --gpg-sign
1744        --quiet --verbose --progress --no-progress
1745"
1746
1747_git_merge ()
1748{
1749        __git_complete_strategy && return
1750
1751        case "$cur" in
1752        --*)
1753                __gitcomp "$__git_merge_options
1754                        --rerere-autoupdate --no-rerere-autoupdate --abort --continue"
1755                return
1756        esac
1757        __git_complete_refs
1758}
1759
1760_git_mergetool ()
1761{
1762        case "$cur" in
1763        --tool=*)
1764                __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1765                return
1766                ;;
1767        --*)
1768                __gitcomp "--tool="
1769                return
1770                ;;
1771        esac
1772}
1773
1774_git_merge_base ()
1775{
1776        case "$cur" in
1777        --*)
1778                __gitcomp "--octopus --independent --is-ancestor --fork-point"
1779                return
1780                ;;
1781        esac
1782        __git_complete_refs
1783}
1784
1785_git_mv ()
1786{
1787        case "$cur" in
1788        --*)
1789                __gitcomp "--dry-run"
1790                return
1791                ;;
1792        esac
1793
1794        if [ $(__git_count_arguments "mv") -gt 0 ]; then
1795                # We need to show both cached and untracked files (including
1796                # empty directories) since this may not be the last argument.
1797                __git_complete_index_file "--cached --others --directory"
1798        else
1799                __git_complete_index_file "--cached"
1800        fi
1801}
1802
1803_git_name_rev ()
1804{
1805        __gitcomp "--tags --all --stdin"
1806}
1807
1808_git_notes ()
1809{
1810        local subcommands='add append copy edit list prune remove show'
1811        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1812
1813        case "$subcommand,$cur" in
1814        ,--*)
1815                __gitcomp '--ref'
1816                ;;
1817        ,*)
1818                case "$prev" in
1819                --ref)
1820                        __git_complete_refs
1821                        ;;
1822                *)
1823                        __gitcomp "$subcommands --ref"
1824                        ;;
1825                esac
1826                ;;
1827        add,--reuse-message=*|append,--reuse-message=*|\
1828        add,--reedit-message=*|append,--reedit-message=*)
1829                __git_complete_refs --cur="${cur#*=}"
1830                ;;
1831        add,--*|append,--*)
1832                __gitcomp '--file= --message= --reedit-message=
1833                                --reuse-message='
1834                ;;
1835        copy,--*)
1836                __gitcomp '--stdin'
1837                ;;
1838        prune,--*)
1839                __gitcomp '--dry-run --verbose'
1840                ;;
1841        prune,*)
1842                ;;
1843        *)
1844                case "$prev" in
1845                -m|-F)
1846                        ;;
1847                *)
1848                        __git_complete_refs
1849                        ;;
1850                esac
1851                ;;
1852        esac
1853}
1854
1855_git_pull ()
1856{
1857        __git_complete_strategy && return
1858
1859        case "$cur" in
1860        --recurse-submodules=*)
1861                __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1862                return
1863                ;;
1864        --*)
1865                __gitcomp "
1866                        --rebase --no-rebase
1867                        $__git_merge_options
1868                        $__git_fetch_options
1869                "
1870                return
1871                ;;
1872        esac
1873        __git_complete_remote_or_refspec
1874}
1875
1876__git_push_recurse_submodules="check on-demand"
1877
1878__git_complete_force_with_lease ()
1879{
1880        local cur_=$1
1881
1882        case "$cur_" in
1883        --*=)
1884                ;;
1885        *:*)
1886                __git_complete_refs --cur="${cur_#*:}"
1887                ;;
1888        *)
1889                __git_complete_refs --cur="$cur_"
1890                ;;
1891        esac
1892}
1893
1894_git_push ()
1895{
1896        case "$prev" in
1897        --repo)
1898                __gitcomp_nl "$(__git_remotes)"
1899                return
1900                ;;
1901        --recurse-submodules)
1902                __gitcomp "$__git_push_recurse_submodules"
1903                return
1904                ;;
1905        esac
1906        case "$cur" in
1907        --repo=*)
1908                __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1909                return
1910                ;;
1911        --recurse-submodules=*)
1912                __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1913                return
1914                ;;
1915        --force-with-lease=*)
1916                __git_complete_force_with_lease "${cur##--force-with-lease=}"
1917                return
1918                ;;
1919        --*)
1920                __gitcomp "
1921                        --all --mirror --tags --dry-run --force --verbose
1922                        --quiet --prune --delete --follow-tags
1923                        --receive-pack= --repo= --set-upstream
1924                        --force-with-lease --force-with-lease= --recurse-submodules=
1925                "
1926                return
1927                ;;
1928        esac
1929        __git_complete_remote_or_refspec
1930}
1931
1932_git_rebase ()
1933{
1934        __git_find_repo_path
1935        if [ -f "$__git_repo_path"/rebase-merge/interactive ]; then
1936                __gitcomp "--continue --skip --abort --quit --edit-todo"
1937                return
1938        elif [ -d "$__git_repo_path"/rebase-apply ] || \
1939             [ -d "$__git_repo_path"/rebase-merge ]; then
1940                __gitcomp "--continue --skip --abort --quit"
1941                return
1942        fi
1943        __git_complete_strategy && return
1944        case "$cur" in
1945        --whitespace=*)
1946                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1947                return
1948                ;;
1949        --*)
1950                __gitcomp "
1951                        --onto --merge --strategy --interactive
1952                        --preserve-merges --stat --no-stat
1953                        --committer-date-is-author-date --ignore-date
1954                        --ignore-whitespace --whitespace=
1955                        --autosquash --no-autosquash
1956                        --fork-point --no-fork-point
1957                        --autostash --no-autostash
1958                        --verify --no-verify
1959                        --keep-empty --root --force-rebase --no-ff
1960                        --exec
1961                        "
1962
1963                return
1964        esac
1965        __git_complete_refs
1966}
1967
1968_git_reflog ()
1969{
1970        local subcommands="show delete expire"
1971        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1972
1973        if [ -z "$subcommand" ]; then
1974                __gitcomp "$subcommands"
1975        else
1976                __git_complete_refs
1977        fi
1978}
1979
1980__git_send_email_confirm_options="always never auto cc compose"
1981__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1982
1983_git_send_email ()
1984{
1985        case "$prev" in
1986        --to|--cc|--bcc|--from)
1987                __gitcomp "$(__git send-email --dump-aliases)"
1988                return
1989                ;;
1990        esac
1991
1992        case "$cur" in
1993        --confirm=*)
1994                __gitcomp "
1995                        $__git_send_email_confirm_options
1996                        " "" "${cur##--confirm=}"
1997                return
1998                ;;
1999        --suppress-cc=*)
2000                __gitcomp "
2001                        $__git_send_email_suppresscc_options
2002                        " "" "${cur##--suppress-cc=}"
2003
2004                return
2005                ;;
2006        --smtp-encryption=*)
2007                __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
2008                return
2009                ;;
2010        --thread=*)
2011                __gitcomp "
2012                        deep shallow
2013                        " "" "${cur##--thread=}"
2014                return
2015                ;;
2016        --to=*|--cc=*|--bcc=*|--from=*)
2017                __gitcomp "$(__git send-email --dump-aliases)" "" "${cur#--*=}"
2018                return
2019                ;;
2020        --*)
2021                __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
2022                        --compose --confirm= --dry-run --envelope-sender
2023                        --from --identity
2024                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
2025                        --no-suppress-from --no-thread --quiet
2026                        --signed-off-by-cc --smtp-pass --smtp-server
2027                        --smtp-server-port --smtp-encryption= --smtp-user
2028                        --subject --suppress-cc= --suppress-from --thread --to
2029                        --validate --no-validate
2030                        $__git_format_patch_options"
2031                return
2032                ;;
2033        esac
2034        __git_complete_revlist
2035}
2036
2037_git_stage ()
2038{
2039        _git_add
2040}
2041
2042_git_status ()
2043{
2044        local complete_opt
2045        local untracked_state
2046
2047        case "$cur" in
2048        --ignore-submodules=*)
2049                __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
2050                return
2051                ;;
2052        --untracked-files=*)
2053                __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
2054                return
2055                ;;
2056        --column=*)
2057                __gitcomp "
2058                        always never auto column row plain dense nodense
2059                        " "" "${cur##--column=}"
2060                return
2061                ;;
2062        --*)
2063                __gitcomp "
2064                        --short --branch --porcelain --long --verbose
2065                        --untracked-files= --ignore-submodules= --ignored
2066                        --column= --no-column
2067                        "
2068                return
2069                ;;
2070        esac
2071
2072        untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
2073                "$__git_untracked_file_modes" "status.showUntrackedFiles")"
2074
2075        case "$untracked_state" in
2076        no)
2077                # --ignored option does not matter
2078                complete_opt=
2079                ;;
2080        all|normal|*)
2081                complete_opt="--cached --directory --no-empty-directory --others"
2082
2083                if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
2084                        complete_opt="$complete_opt --ignored --exclude=*"
2085                fi
2086                ;;
2087        esac
2088
2089        __git_complete_index_file "$complete_opt"
2090}
2091
2092__git_config_get_set_variables ()
2093{
2094        local prevword word config_file= c=$cword
2095        while [ $c -gt 1 ]; do
2096                word="${words[c]}"
2097                case "$word" in
2098                --system|--global|--local|--file=*)
2099                        config_file="$word"
2100                        break
2101                        ;;
2102                -f|--file)
2103                        config_file="$word $prevword"
2104                        break
2105                        ;;
2106                esac
2107                prevword=$word
2108                c=$((--c))
2109        done
2110
2111        __git config $config_file --name-only --list
2112}
2113
2114_git_config ()
2115{
2116        case "$prev" in
2117        branch.*.remote|branch.*.pushremote)
2118                __gitcomp_nl "$(__git_remotes)"
2119                return
2120                ;;
2121        branch.*.merge)
2122                __git_complete_refs
2123                return
2124                ;;
2125        branch.*.rebase)
2126                __gitcomp "false true preserve interactive"
2127                return
2128                ;;
2129        remote.pushdefault)
2130                __gitcomp_nl "$(__git_remotes)"
2131                return
2132                ;;
2133        remote.*.fetch)
2134                local remote="${prev#remote.}"
2135                remote="${remote%.fetch}"
2136                if [ -z "$cur" ]; then
2137                        __gitcomp_nl "refs/heads/" "" "" ""
2138                        return
2139                fi
2140                __gitcomp_nl "$(__git_refs_remotes "$remote")"
2141                return
2142                ;;
2143        remote.*.push)
2144                local remote="${prev#remote.}"
2145                remote="${remote%.push}"
2146                __gitcomp_nl "$(__git for-each-ref \
2147                        --format='%(refname):%(refname)' refs/heads)"
2148                return
2149                ;;
2150        pull.twohead|pull.octopus)
2151                __git_compute_merge_strategies
2152                __gitcomp "$__git_merge_strategies"
2153                return
2154                ;;
2155        color.branch|color.diff|color.interactive|\
2156        color.showbranch|color.status|color.ui)
2157                __gitcomp "always never auto"
2158                return
2159                ;;
2160        color.pager)
2161                __gitcomp "false true"
2162                return
2163                ;;
2164        color.*.*)
2165                __gitcomp "
2166                        normal black red green yellow blue magenta cyan white
2167                        bold dim ul blink reverse
2168                        "
2169                return
2170                ;;
2171        diff.submodule)
2172                __gitcomp "log short"
2173                return
2174                ;;
2175        help.format)
2176                __gitcomp "man info web html"
2177                return
2178                ;;
2179        log.date)
2180                __gitcomp "$__git_log_date_formats"
2181                return
2182                ;;
2183        sendemail.aliasesfiletype)
2184                __gitcomp "mutt mailrc pine elm gnus"
2185                return
2186                ;;
2187        sendemail.confirm)
2188                __gitcomp "$__git_send_email_confirm_options"
2189                return
2190                ;;
2191        sendemail.suppresscc)
2192                __gitcomp "$__git_send_email_suppresscc_options"
2193                return
2194                ;;
2195        sendemail.transferencoding)
2196                __gitcomp "7bit 8bit quoted-printable base64"
2197                return
2198                ;;
2199        --get|--get-all|--unset|--unset-all)
2200                __gitcomp_nl "$(__git_config_get_set_variables)"
2201                return
2202                ;;
2203        *.*)
2204                return
2205                ;;
2206        esac
2207        case "$cur" in
2208        --*)
2209                __gitcomp "
2210                        --system --global --local --file=
2211                        --list --replace-all
2212                        --get --get-all --get-regexp
2213                        --add --unset --unset-all
2214                        --remove-section --rename-section
2215                        --name-only
2216                        "
2217                return
2218                ;;
2219        branch.*.*)
2220                local pfx="${cur%.*}." cur_="${cur##*.}"
2221                __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
2222                return
2223                ;;
2224        branch.*)
2225                local pfx="${cur%.*}." cur_="${cur#*.}"
2226                __gitcomp_direct "$(__git_heads "$pfx" "$cur_" ".")"
2227                __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
2228                return
2229                ;;
2230        guitool.*.*)
2231                local pfx="${cur%.*}." cur_="${cur##*.}"
2232                __gitcomp "
2233                        argprompt cmd confirm needsfile noconsole norescan
2234                        prompt revprompt revunmerged title
2235                        " "$pfx" "$cur_"
2236                return
2237                ;;
2238        difftool.*.*)
2239                local pfx="${cur%.*}." cur_="${cur##*.}"
2240                __gitcomp "cmd path" "$pfx" "$cur_"
2241                return
2242                ;;
2243        man.*.*)
2244                local pfx="${cur%.*}." cur_="${cur##*.}"
2245                __gitcomp "cmd path" "$pfx" "$cur_"
2246                return
2247                ;;
2248        mergetool.*.*)
2249                local pfx="${cur%.*}." cur_="${cur##*.}"
2250                __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
2251                return
2252                ;;
2253        pager.*)
2254                local pfx="${cur%.*}." cur_="${cur#*.}"
2255                __git_compute_all_commands
2256                __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
2257                return
2258                ;;
2259        remote.*.*)
2260                local pfx="${cur%.*}." cur_="${cur##*.}"
2261                __gitcomp "
2262                        url proxy fetch push mirror skipDefaultUpdate
2263                        receivepack uploadpack tagopt pushurl
2264                        " "$pfx" "$cur_"
2265                return
2266                ;;
2267        remote.*)
2268                local pfx="${cur%.*}." cur_="${cur#*.}"
2269                __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
2270                __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
2271                return
2272                ;;
2273        url.*.*)
2274                local pfx="${cur%.*}." cur_="${cur##*.}"
2275                __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2276                return
2277                ;;
2278        esac
2279        __gitcomp "
2280                add.ignoreErrors
2281                advice.commitBeforeMerge
2282                advice.detachedHead
2283                advice.implicitIdentity
2284                advice.pushNonFastForward
2285                advice.resolveConflict
2286                advice.statusHints
2287                alias.
2288                am.keepcr
2289                apply.ignorewhitespace
2290                apply.whitespace
2291                branch.autosetupmerge
2292                branch.autosetuprebase
2293                browser.
2294                clean.requireForce
2295                color.branch
2296                color.branch.current
2297                color.branch.local
2298                color.branch.plain
2299                color.branch.remote
2300                color.decorate.HEAD
2301                color.decorate.branch
2302                color.decorate.remoteBranch
2303                color.decorate.stash
2304                color.decorate.tag
2305                color.diff
2306                color.diff.commit
2307                color.diff.frag
2308                color.diff.func
2309                color.diff.meta
2310                color.diff.new
2311                color.diff.old
2312                color.diff.plain
2313                color.diff.whitespace
2314                color.grep
2315                color.grep.context
2316                color.grep.filename
2317                color.grep.function
2318                color.grep.linenumber
2319                color.grep.match
2320                color.grep.selected
2321                color.grep.separator
2322                color.interactive
2323                color.interactive.error
2324                color.interactive.header
2325                color.interactive.help
2326                color.interactive.prompt
2327                color.pager
2328                color.showbranch
2329                color.status
2330                color.status.added
2331                color.status.changed
2332                color.status.header
2333                color.status.nobranch
2334                color.status.unmerged
2335                color.status.untracked
2336                color.status.updated
2337                color.ui
2338                commit.status
2339                commit.template
2340                core.abbrev
2341                core.askpass
2342                core.attributesfile
2343                core.autocrlf
2344                core.bare
2345                core.bigFileThreshold
2346                core.compression
2347                core.createObject
2348                core.deltaBaseCacheLimit
2349                core.editor
2350                core.eol
2351                core.excludesfile
2352                core.fileMode
2353                core.fsyncobjectfiles
2354                core.gitProxy
2355                core.ignoreStat
2356                core.ignorecase
2357                core.logAllRefUpdates
2358                core.loosecompression
2359                core.notesRef
2360                core.packedGitLimit
2361                core.packedGitWindowSize
2362                core.pager
2363                core.preferSymlinkRefs
2364                core.preloadindex
2365                core.quotepath
2366                core.repositoryFormatVersion
2367                core.safecrlf
2368                core.sharedRepository
2369                core.sparseCheckout
2370                core.symlinks
2371                core.trustctime
2372                core.untrackedCache
2373                core.warnAmbiguousRefs
2374                core.whitespace
2375                core.worktree
2376                diff.autorefreshindex
2377                diff.external
2378                diff.ignoreSubmodules
2379                diff.mnemonicprefix
2380                diff.noprefix
2381                diff.renameLimit
2382                diff.renames
2383                diff.statGraphWidth
2384                diff.submodule
2385                diff.suppressBlankEmpty
2386                diff.tool
2387                diff.wordRegex
2388                diff.algorithm
2389                difftool.
2390                difftool.prompt
2391                fetch.recurseSubmodules
2392                fetch.unpackLimit
2393                format.attach
2394                format.cc
2395                format.coverLetter
2396                format.from
2397                format.headers
2398                format.numbered
2399                format.pretty
2400                format.signature
2401                format.signoff
2402                format.subjectprefix
2403                format.suffix
2404                format.thread
2405                format.to
2406                gc.
2407                gc.aggressiveWindow
2408                gc.auto
2409                gc.autopacklimit
2410                gc.packrefs
2411                gc.pruneexpire
2412                gc.reflogexpire
2413                gc.reflogexpireunreachable
2414                gc.rerereresolved
2415                gc.rerereunresolved
2416                gitcvs.allbinary
2417                gitcvs.commitmsgannotation
2418                gitcvs.dbTableNamePrefix
2419                gitcvs.dbdriver
2420                gitcvs.dbname
2421                gitcvs.dbpass
2422                gitcvs.dbuser
2423                gitcvs.enabled
2424                gitcvs.logfile
2425                gitcvs.usecrlfattr
2426                guitool.
2427                gui.blamehistoryctx
2428                gui.commitmsgwidth
2429                gui.copyblamethreshold
2430                gui.diffcontext
2431                gui.encoding
2432                gui.fastcopyblame
2433                gui.matchtrackingbranch
2434                gui.newbranchtemplate
2435                gui.pruneduringfetch
2436                gui.spellingdictionary
2437                gui.trustmtime
2438                help.autocorrect
2439                help.browser
2440                help.format
2441                http.lowSpeedLimit
2442                http.lowSpeedTime
2443                http.maxRequests
2444                http.minSessions
2445                http.noEPSV
2446                http.postBuffer
2447                http.proxy
2448                http.sslCipherList
2449                http.sslVersion
2450                http.sslCAInfo
2451                http.sslCAPath
2452                http.sslCert
2453                http.sslCertPasswordProtected
2454                http.sslKey
2455                http.sslVerify
2456                http.useragent
2457                i18n.commitEncoding
2458                i18n.logOutputEncoding
2459                imap.authMethod
2460                imap.folder
2461                imap.host
2462                imap.pass
2463                imap.port
2464                imap.preformattedHTML
2465                imap.sslverify
2466                imap.tunnel
2467                imap.user
2468                init.templatedir
2469                instaweb.browser
2470                instaweb.httpd
2471                instaweb.local
2472                instaweb.modulepath
2473                instaweb.port
2474                interactive.singlekey
2475                log.date
2476                log.decorate
2477                log.showroot
2478                mailmap.file
2479                man.
2480                man.viewer
2481                merge.
2482                merge.conflictstyle
2483                merge.log
2484                merge.renameLimit
2485                merge.renormalize
2486                merge.stat
2487                merge.tool
2488                merge.verbosity
2489                mergetool.
2490                mergetool.keepBackup
2491                mergetool.keepTemporaries
2492                mergetool.prompt
2493                notes.displayRef
2494                notes.rewrite.
2495                notes.rewrite.amend
2496                notes.rewrite.rebase
2497                notes.rewriteMode
2498                notes.rewriteRef
2499                pack.compression
2500                pack.deltaCacheLimit
2501                pack.deltaCacheSize
2502                pack.depth
2503                pack.indexVersion
2504                pack.packSizeLimit
2505                pack.threads
2506                pack.window
2507                pack.windowMemory
2508                pager.
2509                pretty.
2510                pull.octopus
2511                pull.twohead
2512                push.default
2513                push.followTags
2514                rebase.autosquash
2515                rebase.stat
2516                receive.autogc
2517                receive.denyCurrentBranch
2518                receive.denyDeleteCurrent
2519                receive.denyDeletes
2520                receive.denyNonFastForwards
2521                receive.fsckObjects
2522                receive.unpackLimit
2523                receive.updateserverinfo
2524                remote.pushdefault
2525                remotes.
2526                repack.usedeltabaseoffset
2527                rerere.autoupdate
2528                rerere.enabled
2529                sendemail.
2530                sendemail.aliasesfile
2531                sendemail.aliasfiletype
2532                sendemail.bcc
2533                sendemail.cc
2534                sendemail.cccmd
2535                sendemail.chainreplyto
2536                sendemail.confirm
2537                sendemail.envelopesender
2538                sendemail.from
2539                sendemail.identity
2540                sendemail.multiedit
2541                sendemail.signedoffbycc
2542                sendemail.smtpdomain
2543                sendemail.smtpencryption
2544                sendemail.smtppass
2545                sendemail.smtpserver
2546                sendemail.smtpserveroption
2547                sendemail.smtpserverport
2548                sendemail.smtpuser
2549                sendemail.suppresscc
2550                sendemail.suppressfrom
2551                sendemail.thread
2552                sendemail.to
2553                sendemail.validate
2554                showbranch.default
2555                status.relativePaths
2556                status.showUntrackedFiles
2557                status.submodulesummary
2558                submodule.
2559                tar.umask
2560                transfer.unpackLimit
2561                url.
2562                user.email
2563                user.name
2564                user.signingkey
2565                web.browser
2566                branch. remote.
2567        "
2568}
2569
2570_git_remote ()
2571{
2572        local subcommands="add rename remove set-head set-branches set-url show prune update"
2573        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2574        if [ -z "$subcommand" ]; then
2575                __gitcomp "$subcommands"
2576                return
2577        fi
2578
2579        case "$subcommand" in
2580        rename|remove|set-url|show|prune)
2581                __gitcomp_nl "$(__git_remotes)"
2582                ;;
2583        set-head|set-branches)
2584                __git_complete_remote_or_refspec
2585                ;;
2586        update)
2587                __gitcomp "$(__git_get_config_variables "remotes")"
2588                ;;
2589        *)
2590                ;;
2591        esac
2592}
2593
2594_git_replace ()
2595{
2596        __git_complete_refs
2597}
2598
2599_git_reset ()
2600{
2601        __git_has_doubledash && return
2602
2603        case "$cur" in
2604        --*)
2605                __gitcomp "--merge --mixed --hard --soft --patch"
2606                return
2607                ;;
2608        esac
2609        __git_complete_refs
2610}
2611
2612_git_revert ()
2613{
2614        __git_find_repo_path
2615        if [ -f "$__git_repo_path"/REVERT_HEAD ]; then
2616                __gitcomp "--continue --quit --abort"
2617                return
2618        fi
2619        case "$cur" in
2620        --*)
2621                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2622                return
2623                ;;
2624        esac
2625        __git_complete_refs
2626}
2627
2628_git_rm ()
2629{
2630        case "$cur" in
2631        --*)
2632                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2633                return
2634                ;;
2635        esac
2636
2637        __git_complete_index_file "--cached"
2638}
2639
2640_git_shortlog ()
2641{
2642        __git_has_doubledash && return
2643
2644        case "$cur" in
2645        --*)
2646                __gitcomp "
2647                        $__git_log_common_options
2648                        $__git_log_shortlog_options
2649                        --numbered --summary
2650                        "
2651                return
2652                ;;
2653        esac
2654        __git_complete_revlist
2655}
2656
2657_git_show ()
2658{
2659        __git_has_doubledash && return
2660
2661        case "$cur" in
2662        --pretty=*|--format=*)
2663                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2664                        " "" "${cur#*=}"
2665                return
2666                ;;
2667        --diff-algorithm=*)
2668                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2669                return
2670                ;;
2671        --submodule=*)
2672                __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
2673                return
2674                ;;
2675        --*)
2676                __gitcomp "--pretty= --format= --abbrev-commit --oneline
2677                        --show-signature
2678                        $__git_diff_common_options
2679                        "
2680                return
2681                ;;
2682        esac
2683        __git_complete_revlist_file
2684}
2685
2686_git_show_branch ()
2687{
2688        case "$cur" in
2689        --*)
2690                __gitcomp "
2691                        --all --remotes --topo-order --date-order --current --more=
2692                        --list --independent --merge-base --no-name
2693                        --color --no-color
2694                        --sha1-name --sparse --topics --reflog
2695                        "
2696                return
2697                ;;
2698        esac
2699        __git_complete_revlist
2700}
2701
2702_git_stash ()
2703{
2704        local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
2705        local subcommands='save list show apply clear drop pop create branch'
2706        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2707        if [ -z "$subcommand" ]; then
2708                case "$cur" in
2709                --*)
2710                        __gitcomp "$save_opts"
2711                        ;;
2712                *)
2713                        if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2714                                __gitcomp "$subcommands"
2715                        fi
2716                        ;;
2717                esac
2718        else
2719                case "$subcommand,$cur" in
2720                save,--*)
2721                        __gitcomp "$save_opts"
2722                        ;;
2723                apply,--*|pop,--*)
2724                        __gitcomp "--index --quiet"
2725                        ;;
2726                drop,--*)
2727                        __gitcomp "--quiet"
2728                        ;;
2729                show,--*|branch,--*)
2730                        ;;
2731                branch,*)
2732                        if [ $cword -eq 3 ]; then
2733                                __git_complete_refs
2734                        else
2735                                __gitcomp_nl "$(__git stash list \
2736                                                | sed -n -e 's/:.*//p')"
2737                        fi
2738                        ;;
2739                show,*|apply,*|drop,*|pop,*)
2740                        __gitcomp_nl "$(__git stash list \
2741                                        | sed -n -e 's/:.*//p')"
2742                        ;;
2743                *)
2744                        ;;
2745                esac
2746        fi
2747}
2748
2749_git_submodule ()
2750{
2751        __git_has_doubledash && return
2752
2753        local subcommands="add status init deinit update summary foreach sync"
2754        if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2755                case "$cur" in
2756                --*)
2757                        __gitcomp "--quiet --cached"
2758                        ;;
2759                *)
2760                        __gitcomp "$subcommands"
2761                        ;;
2762                esac
2763                return
2764        fi
2765}
2766
2767_git_svn ()
2768{
2769        local subcommands="
2770                init fetch clone rebase dcommit log find-rev
2771                set-tree commit-diff info create-ignore propget
2772                proplist show-ignore show-externals branch tag blame
2773                migrate mkdirs reset gc
2774                "
2775        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2776        if [ -z "$subcommand" ]; then
2777                __gitcomp "$subcommands"
2778        else
2779                local remote_opts="--username= --config-dir= --no-auth-cache"
2780                local fc_opts="
2781                        --follow-parent --authors-file= --repack=
2782                        --no-metadata --use-svm-props --use-svnsync-props
2783                        --log-window-size= --no-checkout --quiet
2784                        --repack-flags --use-log-author --localtime
2785                        --ignore-paths= --include-paths= $remote_opts
2786                        "
2787                local init_opts="
2788                        --template= --shared= --trunk= --tags=
2789                        --branches= --stdlayout --minimize-url
2790                        --no-metadata --use-svm-props --use-svnsync-props
2791                        --rewrite-root= --prefix= --use-log-author
2792                        --add-author-from $remote_opts
2793                        "
2794                local cmt_opts="
2795                        --edit --rmdir --find-copies-harder --copy-similarity=
2796                        "
2797
2798                case "$subcommand,$cur" in
2799                fetch,--*)
2800                        __gitcomp "--revision= --fetch-all $fc_opts"
2801                        ;;
2802                clone,--*)
2803                        __gitcomp "--revision= $fc_opts $init_opts"
2804                        ;;
2805                init,--*)
2806                        __gitcomp "$init_opts"
2807                        ;;
2808                dcommit,--*)
2809                        __gitcomp "
2810                                --merge --strategy= --verbose --dry-run
2811                                --fetch-all --no-rebase --commit-url
2812                                --revision --interactive $cmt_opts $fc_opts
2813                                "
2814                        ;;
2815                set-tree,--*)
2816                        __gitcomp "--stdin $cmt_opts $fc_opts"
2817                        ;;
2818                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2819                show-externals,--*|mkdirs,--*)
2820                        __gitcomp "--revision="
2821                        ;;
2822                log,--*)
2823                        __gitcomp "
2824                                --limit= --revision= --verbose --incremental
2825                                --oneline --show-commit --non-recursive
2826                                --authors-file= --color
2827                                "
2828                        ;;
2829                rebase,--*)
2830                        __gitcomp "
2831                                --merge --verbose --strategy= --local
2832                                --fetch-all --dry-run $fc_opts
2833                                "
2834                        ;;
2835                commit-diff,--*)
2836                        __gitcomp "--message= --file= --revision= $cmt_opts"
2837                        ;;
2838                info,--*)
2839                        __gitcomp "--url"
2840                        ;;
2841                branch,--*)
2842                        __gitcomp "--dry-run --message --tag"
2843                        ;;
2844                tag,--*)
2845                        __gitcomp "--dry-run --message"
2846                        ;;
2847                blame,--*)
2848                        __gitcomp "--git-format"
2849                        ;;
2850                migrate,--*)
2851                        __gitcomp "
2852                                --config-dir= --ignore-paths= --minimize
2853                                --no-auth-cache --username=
2854                                "
2855                        ;;
2856                reset,--*)
2857                        __gitcomp "--revision= --parent"
2858                        ;;
2859                *)
2860                        ;;
2861                esac
2862        fi
2863}
2864
2865_git_tag ()
2866{
2867        local i c=1 f=0
2868        while [ $c -lt $cword ]; do
2869                i="${words[c]}"
2870                case "$i" in
2871                -d|-v)
2872                        __gitcomp_direct "$(__git_tags "" "$cur" " ")"
2873                        return
2874                        ;;
2875                -f)
2876                        f=1
2877                        ;;
2878                esac
2879                ((c++))
2880        done
2881
2882        case "$prev" in
2883        -m|-F)
2884                ;;
2885        -*|tag)
2886                if [ $f = 1 ]; then
2887                        __gitcomp_direct "$(__git_tags "" "$cur" " ")"
2888                fi
2889                ;;
2890        *)
2891                __git_complete_refs
2892                ;;
2893        esac
2894
2895        case "$cur" in
2896        --*)
2897                __gitcomp "
2898                        --list --delete --verify --annotate --message --file
2899                        --sign --cleanup --local-user --force --column --sort
2900                        --contains --points-at
2901                        "
2902                ;;
2903        esac
2904}
2905
2906_git_whatchanged ()
2907{
2908        _git_log
2909}
2910
2911_git_worktree ()
2912{
2913        local subcommands="add list lock prune unlock"
2914        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2915        if [ -z "$subcommand" ]; then
2916                __gitcomp "$subcommands"
2917        else
2918                case "$subcommand,$cur" in
2919                add,--*)
2920                        __gitcomp "--detach"
2921                        ;;
2922                list,--*)
2923                        __gitcomp "--porcelain"
2924                        ;;
2925                lock,--*)
2926                        __gitcomp "--reason"
2927                        ;;
2928                prune,--*)
2929                        __gitcomp "--dry-run --expire --verbose"
2930                        ;;
2931                *)
2932                        ;;
2933                esac
2934        fi
2935}
2936
2937__git_main ()
2938{
2939        local i c=1 command __git_dir __git_repo_path
2940        local __git_C_args C_args_count=0
2941
2942        while [ $c -lt $cword ]; do
2943                i="${words[c]}"
2944                case "$i" in
2945                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2946                --git-dir)   ((c++)) ; __git_dir="${words[c]}" ;;
2947                --bare)      __git_dir="." ;;
2948                --help) command="help"; break ;;
2949                -c|--work-tree|--namespace) ((c++)) ;;
2950                -C)     __git_C_args[C_args_count++]=-C
2951                        ((c++))
2952                        __git_C_args[C_args_count++]="${words[c]}"
2953                        ;;
2954                -*) ;;
2955                *) command="$i"; break ;;
2956                esac
2957                ((c++))
2958        done
2959
2960        if [ -z "$command" ]; then
2961                case "$prev" in
2962                --git-dir|-C|--work-tree)
2963                        # these need a path argument, let's fall back to
2964                        # Bash filename completion
2965                        return
2966                        ;;
2967                -c|--namespace)
2968                        # we don't support completing these options' arguments
2969                        return
2970                        ;;
2971                esac
2972                case "$cur" in
2973                --*)   __gitcomp "
2974                        --paginate
2975                        --no-pager
2976                        --git-dir=
2977                        --bare
2978                        --version
2979                        --exec-path
2980                        --exec-path=
2981                        --html-path
2982                        --man-path
2983                        --info-path
2984                        --work-tree=
2985                        --namespace=
2986                        --no-replace-objects
2987                        --help
2988                        "
2989                        ;;
2990                *)     __git_compute_porcelain_commands
2991                       __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2992                esac
2993                return
2994        fi
2995
2996        local completion_func="_git_${command//-/_}"
2997        declare -f $completion_func >/dev/null 2>/dev/null && $completion_func && return
2998
2999        local expansion=$(__git_aliased_command "$command")
3000        if [ -n "$expansion" ]; then
3001                words[1]=$expansion
3002                completion_func="_git_${expansion//-/_}"
3003                declare -f $completion_func >/dev/null 2>/dev/null && $completion_func
3004        fi
3005}
3006
3007__gitk_main ()
3008{
3009        __git_has_doubledash && return
3010
3011        local __git_repo_path
3012        __git_find_repo_path
3013
3014        local merge=""
3015        if [ -f "$__git_repo_path/MERGE_HEAD" ]; then
3016                merge="--merge"
3017        fi
3018        case "$cur" in
3019        --*)
3020                __gitcomp "
3021                        $__git_log_common_options
3022                        $__git_log_gitk_options
3023                        $merge
3024                        "
3025                return
3026                ;;
3027        esac
3028        __git_complete_revlist
3029}
3030
3031if [[ -n ${ZSH_VERSION-} ]]; then
3032        echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
3033
3034        autoload -U +X compinit && compinit
3035
3036        __gitcomp ()
3037        {
3038                emulate -L zsh
3039
3040                local cur_="${3-$cur}"
3041
3042                case "$cur_" in
3043                --*=)
3044                        ;;
3045                *)
3046                        local c IFS=$' \t\n'
3047                        local -a array
3048                        for c in ${=1}; do
3049                                c="$c${4-}"
3050                                case $c in
3051                                --*=*|*.) ;;
3052                                *) c="$c " ;;
3053                                esac
3054                                array[${#array[@]}+1]="$c"
3055                        done
3056                        compset -P '*[=:]'
3057                        compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
3058                        ;;
3059                esac
3060        }
3061
3062        __gitcomp_direct ()
3063        {
3064                emulate -L zsh
3065
3066                local IFS=$'\n'
3067                compset -P '*[=:]'
3068                compadd -Q -- ${=1} && _ret=0
3069        }
3070
3071        __gitcomp_nl ()
3072        {
3073                emulate -L zsh
3074
3075                local IFS=$'\n'
3076                compset -P '*[=:]'
3077                compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
3078        }
3079
3080        __gitcomp_file ()
3081        {
3082                emulate -L zsh
3083
3084                local IFS=$'\n'
3085                compset -P '*[=:]'
3086                compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
3087        }
3088
3089        _git ()
3090        {
3091                local _ret=1 cur cword prev
3092                cur=${words[CURRENT]}
3093                prev=${words[CURRENT-1]}
3094                let cword=CURRENT-1
3095                emulate ksh -c __${service}_main
3096                let _ret && _default && _ret=0
3097                return _ret
3098        }
3099
3100        compdef _git git gitk
3101        return
3102fi
3103
3104__git_func_wrap ()
3105{
3106        local cur words cword prev
3107        _get_comp_words_by_ref -n =: cur words cword prev
3108        $1
3109}
3110
3111# Setup completion for certain functions defined above by setting common
3112# variables and workarounds.
3113# This is NOT a public function; use at your own risk.
3114__git_complete ()
3115{
3116        local wrapper="__git_wrap${2}"
3117        eval "$wrapper () { __git_func_wrap $2 ; }"
3118        complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
3119                || complete -o default -o nospace -F $wrapper $1
3120}
3121
3122# wrapper for backwards compatibility
3123_git ()
3124{
3125        __git_wrap__git_main
3126}
3127
3128# wrapper for backwards compatibility
3129_gitk ()
3130{
3131        __git_wrap__gitk_main
3132}
3133
3134__git_complete git __git_main
3135__git_complete gitk __gitk_main
3136
3137# The following are necessary only for Cygwin, and only are needed
3138# when the user has tab-completed the executable name and consequently
3139# included the '.exe' suffix.
3140#
3141if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
3142__git_complete git.exe __git_main
3143fi