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