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