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