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