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