a3b25d04e79a95e5aadd2b288d7c5fe09a94be91
   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        case "$cur" in
1453        --*)
1454                __gitcomp "--heads --tags --refs --get-url --symref"
1455                return
1456                ;;
1457        esac
1458        __gitcomp_nl "$(__git_remotes)"
1459}
1460
1461_git_ls_tree ()
1462{
1463        __git_complete_file
1464}
1465
1466# Options that go well for log, shortlog and gitk
1467__git_log_common_options="
1468        --not --all
1469        --branches --tags --remotes
1470        --first-parent --merges --no-merges
1471        --max-count=
1472        --max-age= --since= --after=
1473        --min-age= --until= --before=
1474        --min-parents= --max-parents=
1475        --no-min-parents --no-max-parents
1476"
1477# Options that go well for log and gitk (not shortlog)
1478__git_log_gitk_options="
1479        --dense --sparse --full-history
1480        --simplify-merges --simplify-by-decoration
1481        --left-right --notes --no-notes
1482"
1483# Options that go well for log and shortlog (not gitk)
1484__git_log_shortlog_options="
1485        --author= --committer= --grep=
1486        --all-match --invert-grep
1487"
1488
1489__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1490__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1491
1492_git_log ()
1493{
1494        __git_has_doubledash && return
1495
1496        local g="$(git rev-parse --git-dir 2>/dev/null)"
1497        local merge=""
1498        if [ -f "$g/MERGE_HEAD" ]; then
1499                merge="--merge"
1500        fi
1501        case "$cur" in
1502        --pretty=*|--format=*)
1503                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1504                        " "" "${cur#*=}"
1505                return
1506                ;;
1507        --date=*)
1508                __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1509                return
1510                ;;
1511        --decorate=*)
1512                __gitcomp "full short no" "" "${cur##--decorate=}"
1513                return
1514                ;;
1515        --diff-algorithm=*)
1516                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1517                return
1518                ;;
1519        --submodule=*)
1520                __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
1521                return
1522                ;;
1523        --*)
1524                __gitcomp "
1525                        $__git_log_common_options
1526                        $__git_log_shortlog_options
1527                        $__git_log_gitk_options
1528                        --root --topo-order --date-order --reverse
1529                        --follow --full-diff
1530                        --abbrev-commit --abbrev=
1531                        --relative-date --date=
1532                        --pretty= --format= --oneline
1533                        --show-signature
1534                        --cherry-mark
1535                        --cherry-pick
1536                        --graph
1537                        --decorate --decorate=
1538                        --walk-reflogs
1539                        --parents --children
1540                        $merge
1541                        $__git_diff_common_options
1542                        --pickaxe-all --pickaxe-regex
1543                        "
1544                return
1545                ;;
1546        esac
1547        __git_complete_revlist
1548}
1549
1550# Common merge options shared by git-merge(1) and git-pull(1).
1551__git_merge_options="
1552        --no-commit --no-stat --log --no-log --squash --strategy
1553        --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1554        --verify-signatures --no-verify-signatures --gpg-sign
1555        --quiet --verbose --progress --no-progress
1556"
1557
1558_git_merge ()
1559{
1560        __git_complete_strategy && return
1561
1562        case "$cur" in
1563        --*)
1564                __gitcomp "$__git_merge_options
1565                        --rerere-autoupdate --no-rerere-autoupdate --abort --continue"
1566                return
1567        esac
1568        __gitcomp_nl "$(__git_refs)"
1569}
1570
1571_git_mergetool ()
1572{
1573        case "$cur" in
1574        --tool=*)
1575                __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1576                return
1577                ;;
1578        --*)
1579                __gitcomp "--tool="
1580                return
1581                ;;
1582        esac
1583}
1584
1585_git_merge_base ()
1586{
1587        case "$cur" in
1588        --*)
1589                __gitcomp "--octopus --independent --is-ancestor --fork-point"
1590                return
1591                ;;
1592        esac
1593        __gitcomp_nl "$(__git_refs)"
1594}
1595
1596_git_mv ()
1597{
1598        case "$cur" in
1599        --*)
1600                __gitcomp "--dry-run"
1601                return
1602                ;;
1603        esac
1604
1605        if [ $(__git_count_arguments "mv") -gt 0 ]; then
1606                # We need to show both cached and untracked files (including
1607                # empty directories) since this may not be the last argument.
1608                __git_complete_index_file "--cached --others --directory"
1609        else
1610                __git_complete_index_file "--cached"
1611        fi
1612}
1613
1614_git_name_rev ()
1615{
1616        __gitcomp "--tags --all --stdin"
1617}
1618
1619_git_notes ()
1620{
1621        local subcommands='add append copy edit list prune remove show'
1622        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1623
1624        case "$subcommand,$cur" in
1625        ,--*)
1626                __gitcomp '--ref'
1627                ;;
1628        ,*)
1629                case "$prev" in
1630                --ref)
1631                        __gitcomp_nl "$(__git_refs)"
1632                        ;;
1633                *)
1634                        __gitcomp "$subcommands --ref"
1635                        ;;
1636                esac
1637                ;;
1638        add,--reuse-message=*|append,--reuse-message=*|\
1639        add,--reedit-message=*|append,--reedit-message=*)
1640                __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1641                ;;
1642        add,--*|append,--*)
1643                __gitcomp '--file= --message= --reedit-message=
1644                                --reuse-message='
1645                ;;
1646        copy,--*)
1647                __gitcomp '--stdin'
1648                ;;
1649        prune,--*)
1650                __gitcomp '--dry-run --verbose'
1651                ;;
1652        prune,*)
1653                ;;
1654        *)
1655                case "$prev" in
1656                -m|-F)
1657                        ;;
1658                *)
1659                        __gitcomp_nl "$(__git_refs)"
1660                        ;;
1661                esac
1662                ;;
1663        esac
1664}
1665
1666_git_pull ()
1667{
1668        __git_complete_strategy && return
1669
1670        case "$cur" in
1671        --recurse-submodules=*)
1672                __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1673                return
1674                ;;
1675        --*)
1676                __gitcomp "
1677                        --rebase --no-rebase
1678                        $__git_merge_options
1679                        $__git_fetch_options
1680                "
1681                return
1682                ;;
1683        esac
1684        __git_complete_remote_or_refspec
1685}
1686
1687__git_push_recurse_submodules="check on-demand"
1688
1689__git_complete_force_with_lease ()
1690{
1691        local cur_=$1
1692
1693        case "$cur_" in
1694        --*=)
1695                ;;
1696        *:*)
1697                __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
1698                ;;
1699        *)
1700                __gitcomp_nl "$(__git_refs)" "" "$cur_"
1701                ;;
1702        esac
1703}
1704
1705_git_push ()
1706{
1707        case "$prev" in
1708        --repo)
1709                __gitcomp_nl "$(__git_remotes)"
1710                return
1711                ;;
1712        --recurse-submodules)
1713                __gitcomp "$__git_push_recurse_submodules"
1714                return
1715                ;;
1716        esac
1717        case "$cur" in
1718        --repo=*)
1719                __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1720                return
1721                ;;
1722        --recurse-submodules=*)
1723                __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1724                return
1725                ;;
1726        --force-with-lease=*)
1727                __git_complete_force_with_lease "${cur##--force-with-lease=}"
1728                return
1729                ;;
1730        --*)
1731                __gitcomp "
1732                        --all --mirror --tags --dry-run --force --verbose
1733                        --quiet --prune --delete --follow-tags
1734                        --receive-pack= --repo= --set-upstream
1735                        --force-with-lease --force-with-lease= --recurse-submodules=
1736                "
1737                return
1738                ;;
1739        esac
1740        __git_complete_remote_or_refspec
1741}
1742
1743_git_rebase ()
1744{
1745        local dir="$(__gitdir)"
1746        if [ -f "$dir"/rebase-merge/interactive ]; then
1747                __gitcomp "--continue --skip --abort --quit --edit-todo"
1748                return
1749        elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1750                __gitcomp "--continue --skip --abort --quit"
1751                return
1752        fi
1753        __git_complete_strategy && return
1754        case "$cur" in
1755        --whitespace=*)
1756                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1757                return
1758                ;;
1759        --*)
1760                __gitcomp "
1761                        --onto --merge --strategy --interactive
1762                        --preserve-merges --stat --no-stat
1763                        --committer-date-is-author-date --ignore-date
1764                        --ignore-whitespace --whitespace=
1765                        --autosquash --no-autosquash
1766                        --fork-point --no-fork-point
1767                        --autostash --no-autostash
1768                        --verify --no-verify
1769                        --keep-empty --root --force-rebase --no-ff
1770                        --exec
1771                        "
1772
1773                return
1774        esac
1775        __gitcomp_nl "$(__git_refs)"
1776}
1777
1778_git_reflog ()
1779{
1780        local subcommands="show delete expire"
1781        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1782
1783        if [ -z "$subcommand" ]; then
1784                __gitcomp "$subcommands"
1785        else
1786                __gitcomp_nl "$(__git_refs)"
1787        fi
1788}
1789
1790__git_send_email_confirm_options="always never auto cc compose"
1791__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1792
1793_git_send_email ()
1794{
1795        case "$prev" in
1796        --to|--cc|--bcc|--from)
1797                __gitcomp "
1798                $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1799                "
1800                return
1801                ;;
1802        esac
1803
1804        case "$cur" in
1805        --confirm=*)
1806                __gitcomp "
1807                        $__git_send_email_confirm_options
1808                        " "" "${cur##--confirm=}"
1809                return
1810                ;;
1811        --suppress-cc=*)
1812                __gitcomp "
1813                        $__git_send_email_suppresscc_options
1814                        " "" "${cur##--suppress-cc=}"
1815
1816                return
1817                ;;
1818        --smtp-encryption=*)
1819                __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1820                return
1821                ;;
1822        --thread=*)
1823                __gitcomp "
1824                        deep shallow
1825                        " "" "${cur##--thread=}"
1826                return
1827                ;;
1828        --to=*|--cc=*|--bcc=*|--from=*)
1829                __gitcomp "
1830                $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1831                " "" "${cur#--*=}"
1832                return
1833                ;;
1834        --*)
1835                __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1836                        --compose --confirm= --dry-run --envelope-sender
1837                        --from --identity
1838                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1839                        --no-suppress-from --no-thread --quiet
1840                        --signed-off-by-cc --smtp-pass --smtp-server
1841                        --smtp-server-port --smtp-encryption= --smtp-user
1842                        --subject --suppress-cc= --suppress-from --thread --to
1843                        --validate --no-validate
1844                        $__git_format_patch_options"
1845                return
1846                ;;
1847        esac
1848        __git_complete_revlist
1849}
1850
1851_git_stage ()
1852{
1853        _git_add
1854}
1855
1856_git_status ()
1857{
1858        local complete_opt
1859        local untracked_state
1860
1861        case "$cur" in
1862        --ignore-submodules=*)
1863                __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
1864                return
1865                ;;
1866        --untracked-files=*)
1867                __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1868                return
1869                ;;
1870        --column=*)
1871                __gitcomp "
1872                        always never auto column row plain dense nodense
1873                        " "" "${cur##--column=}"
1874                return
1875                ;;
1876        --*)
1877                __gitcomp "
1878                        --short --branch --porcelain --long --verbose
1879                        --untracked-files= --ignore-submodules= --ignored
1880                        --column= --no-column
1881                        "
1882                return
1883                ;;
1884        esac
1885
1886        untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
1887                "$__git_untracked_file_modes" "status.showUntrackedFiles")"
1888
1889        case "$untracked_state" in
1890        no)
1891                # --ignored option does not matter
1892                complete_opt=
1893                ;;
1894        all|normal|*)
1895                complete_opt="--cached --directory --no-empty-directory --others"
1896
1897                if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
1898                        complete_opt="$complete_opt --ignored --exclude=*"
1899                fi
1900                ;;
1901        esac
1902
1903        __git_complete_index_file "$complete_opt"
1904}
1905
1906__git_config_get_set_variables ()
1907{
1908        local prevword word config_file= c=$cword
1909        while [ $c -gt 1 ]; do
1910                word="${words[c]}"
1911                case "$word" in
1912                --system|--global|--local|--file=*)
1913                        config_file="$word"
1914                        break
1915                        ;;
1916                -f|--file)
1917                        config_file="$word $prevword"
1918                        break
1919                        ;;
1920                esac
1921                prevword=$word
1922                c=$((--c))
1923        done
1924
1925        git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
1926}
1927
1928_git_config ()
1929{
1930        case "$prev" in
1931        branch.*.remote|branch.*.pushremote)
1932                __gitcomp_nl "$(__git_remotes)"
1933                return
1934                ;;
1935        branch.*.merge)
1936                __gitcomp_nl "$(__git_refs)"
1937                return
1938                ;;
1939        branch.*.rebase)
1940                __gitcomp "false true preserve interactive"
1941                return
1942                ;;
1943        remote.pushdefault)
1944                __gitcomp_nl "$(__git_remotes)"
1945                return
1946                ;;
1947        remote.*.fetch)
1948                local remote="${prev#remote.}"
1949                remote="${remote%.fetch}"
1950                if [ -z "$cur" ]; then
1951                        __gitcomp_nl "refs/heads/" "" "" ""
1952                        return
1953                fi
1954                __gitcomp_nl "$(__git_refs_remotes "$remote")"
1955                return
1956                ;;
1957        remote.*.push)
1958                local remote="${prev#remote.}"
1959                remote="${remote%.push}"
1960                __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1961                        for-each-ref --format='%(refname):%(refname)' \
1962                        refs/heads)"
1963                return
1964                ;;
1965        pull.twohead|pull.octopus)
1966                __git_compute_merge_strategies
1967                __gitcomp "$__git_merge_strategies"
1968                return
1969                ;;
1970        color.branch|color.diff|color.interactive|\
1971        color.showbranch|color.status|color.ui)
1972                __gitcomp "always never auto"
1973                return
1974                ;;
1975        color.pager)
1976                __gitcomp "false true"
1977                return
1978                ;;
1979        color.*.*)
1980                __gitcomp "
1981                        normal black red green yellow blue magenta cyan white
1982                        bold dim ul blink reverse
1983                        "
1984                return
1985                ;;
1986        diff.submodule)
1987                __gitcomp "log short"
1988                return
1989                ;;
1990        help.format)
1991                __gitcomp "man info web html"
1992                return
1993                ;;
1994        log.date)
1995                __gitcomp "$__git_log_date_formats"
1996                return
1997                ;;
1998        sendemail.aliasesfiletype)
1999                __gitcomp "mutt mailrc pine elm gnus"
2000                return
2001                ;;
2002        sendemail.confirm)
2003                __gitcomp "$__git_send_email_confirm_options"
2004                return
2005                ;;
2006        sendemail.suppresscc)
2007                __gitcomp "$__git_send_email_suppresscc_options"
2008                return
2009                ;;
2010        sendemail.transferencoding)
2011                __gitcomp "7bit 8bit quoted-printable base64"
2012                return
2013                ;;
2014        --get|--get-all|--unset|--unset-all)
2015                __gitcomp_nl "$(__git_config_get_set_variables)"
2016                return
2017                ;;
2018        *.*)
2019                return
2020                ;;
2021        esac
2022        case "$cur" in
2023        --*)
2024                __gitcomp "
2025                        --system --global --local --file=
2026                        --list --replace-all
2027                        --get --get-all --get-regexp
2028                        --add --unset --unset-all
2029                        --remove-section --rename-section
2030                        --name-only
2031                        "
2032                return
2033                ;;
2034        branch.*.*)
2035                local pfx="${cur%.*}." cur_="${cur##*.}"
2036                __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
2037                return
2038                ;;
2039        branch.*)
2040                local pfx="${cur%.*}." cur_="${cur#*.}"
2041                __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
2042                __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
2043                return
2044                ;;
2045        guitool.*.*)
2046                local pfx="${cur%.*}." cur_="${cur##*.}"
2047                __gitcomp "
2048                        argprompt cmd confirm needsfile noconsole norescan
2049                        prompt revprompt revunmerged title
2050                        " "$pfx" "$cur_"
2051                return
2052                ;;
2053        difftool.*.*)
2054                local pfx="${cur%.*}." cur_="${cur##*.}"
2055                __gitcomp "cmd path" "$pfx" "$cur_"
2056                return
2057                ;;
2058        man.*.*)
2059                local pfx="${cur%.*}." cur_="${cur##*.}"
2060                __gitcomp "cmd path" "$pfx" "$cur_"
2061                return
2062                ;;
2063        mergetool.*.*)
2064                local pfx="${cur%.*}." cur_="${cur##*.}"
2065                __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
2066                return
2067                ;;
2068        pager.*)
2069                local pfx="${cur%.*}." cur_="${cur#*.}"
2070                __git_compute_all_commands
2071                __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
2072                return
2073                ;;
2074        remote.*.*)
2075                local pfx="${cur%.*}." cur_="${cur##*.}"
2076                __gitcomp "
2077                        url proxy fetch push mirror skipDefaultUpdate
2078                        receivepack uploadpack tagopt pushurl
2079                        " "$pfx" "$cur_"
2080                return
2081                ;;
2082        remote.*)
2083                local pfx="${cur%.*}." cur_="${cur#*.}"
2084                __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
2085                __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
2086                return
2087                ;;
2088        url.*.*)
2089                local pfx="${cur%.*}." cur_="${cur##*.}"
2090                __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2091                return
2092                ;;
2093        esac
2094        __gitcomp "
2095                add.ignoreErrors
2096                advice.commitBeforeMerge
2097                advice.detachedHead
2098                advice.implicitIdentity
2099                advice.pushNonFastForward
2100                advice.resolveConflict
2101                advice.statusHints
2102                alias.
2103                am.keepcr
2104                apply.ignorewhitespace
2105                apply.whitespace
2106                branch.autosetupmerge
2107                branch.autosetuprebase
2108                browser.
2109                clean.requireForce
2110                color.branch
2111                color.branch.current
2112                color.branch.local
2113                color.branch.plain
2114                color.branch.remote
2115                color.decorate.HEAD
2116                color.decorate.branch
2117                color.decorate.remoteBranch
2118                color.decorate.stash
2119                color.decorate.tag
2120                color.diff
2121                color.diff.commit
2122                color.diff.frag
2123                color.diff.func
2124                color.diff.meta
2125                color.diff.new
2126                color.diff.old
2127                color.diff.plain
2128                color.diff.whitespace
2129                color.grep
2130                color.grep.context
2131                color.grep.filename
2132                color.grep.function
2133                color.grep.linenumber
2134                color.grep.match
2135                color.grep.selected
2136                color.grep.separator
2137                color.interactive
2138                color.interactive.error
2139                color.interactive.header
2140                color.interactive.help
2141                color.interactive.prompt
2142                color.pager
2143                color.showbranch
2144                color.status
2145                color.status.added
2146                color.status.changed
2147                color.status.header
2148                color.status.nobranch
2149                color.status.unmerged
2150                color.status.untracked
2151                color.status.updated
2152                color.ui
2153                commit.status
2154                commit.template
2155                core.abbrev
2156                core.askpass
2157                core.attributesfile
2158                core.autocrlf
2159                core.bare
2160                core.bigFileThreshold
2161                core.compression
2162                core.createObject
2163                core.deltaBaseCacheLimit
2164                core.editor
2165                core.eol
2166                core.excludesfile
2167                core.fileMode
2168                core.fsyncobjectfiles
2169                core.gitProxy
2170                core.ignoreStat
2171                core.ignorecase
2172                core.logAllRefUpdates
2173                core.loosecompression
2174                core.notesRef
2175                core.packedGitLimit
2176                core.packedGitWindowSize
2177                core.pager
2178                core.preferSymlinkRefs
2179                core.preloadindex
2180                core.quotepath
2181                core.repositoryFormatVersion
2182                core.safecrlf
2183                core.sharedRepository
2184                core.sparseCheckout
2185                core.symlinks
2186                core.trustctime
2187                core.untrackedCache
2188                core.warnAmbiguousRefs
2189                core.whitespace
2190                core.worktree
2191                diff.autorefreshindex
2192                diff.external
2193                diff.ignoreSubmodules
2194                diff.mnemonicprefix
2195                diff.noprefix
2196                diff.renameLimit
2197                diff.renames
2198                diff.statGraphWidth
2199                diff.submodule
2200                diff.suppressBlankEmpty
2201                diff.tool
2202                diff.wordRegex
2203                diff.algorithm
2204                difftool.
2205                difftool.prompt
2206                fetch.recurseSubmodules
2207                fetch.unpackLimit
2208                format.attach
2209                format.cc
2210                format.coverLetter
2211                format.from
2212                format.headers
2213                format.numbered
2214                format.pretty
2215                format.signature
2216                format.signoff
2217                format.subjectprefix
2218                format.suffix
2219                format.thread
2220                format.to
2221                gc.
2222                gc.aggressiveWindow
2223                gc.auto
2224                gc.autopacklimit
2225                gc.packrefs
2226                gc.pruneexpire
2227                gc.reflogexpire
2228                gc.reflogexpireunreachable
2229                gc.rerereresolved
2230                gc.rerereunresolved
2231                gitcvs.allbinary
2232                gitcvs.commitmsgannotation
2233                gitcvs.dbTableNamePrefix
2234                gitcvs.dbdriver
2235                gitcvs.dbname
2236                gitcvs.dbpass
2237                gitcvs.dbuser
2238                gitcvs.enabled
2239                gitcvs.logfile
2240                gitcvs.usecrlfattr
2241                guitool.
2242                gui.blamehistoryctx
2243                gui.commitmsgwidth
2244                gui.copyblamethreshold
2245                gui.diffcontext
2246                gui.encoding
2247                gui.fastcopyblame
2248                gui.matchtrackingbranch
2249                gui.newbranchtemplate
2250                gui.pruneduringfetch
2251                gui.spellingdictionary
2252                gui.trustmtime
2253                help.autocorrect
2254                help.browser
2255                help.format
2256                http.lowSpeedLimit
2257                http.lowSpeedTime
2258                http.maxRequests
2259                http.minSessions
2260                http.noEPSV
2261                http.postBuffer
2262                http.proxy
2263                http.sslCipherList
2264                http.sslVersion
2265                http.sslCAInfo
2266                http.sslCAPath
2267                http.sslCert
2268                http.sslCertPasswordProtected
2269                http.sslKey
2270                http.sslVerify
2271                http.useragent
2272                i18n.commitEncoding
2273                i18n.logOutputEncoding
2274                imap.authMethod
2275                imap.folder
2276                imap.host
2277                imap.pass
2278                imap.port
2279                imap.preformattedHTML
2280                imap.sslverify
2281                imap.tunnel
2282                imap.user
2283                init.templatedir
2284                instaweb.browser
2285                instaweb.httpd
2286                instaweb.local
2287                instaweb.modulepath
2288                instaweb.port
2289                interactive.singlekey
2290                log.date
2291                log.decorate
2292                log.showroot
2293                mailmap.file
2294                man.
2295                man.viewer
2296                merge.
2297                merge.conflictstyle
2298                merge.log
2299                merge.renameLimit
2300                merge.renormalize
2301                merge.stat
2302                merge.tool
2303                merge.verbosity
2304                mergetool.
2305                mergetool.keepBackup
2306                mergetool.keepTemporaries
2307                mergetool.prompt
2308                notes.displayRef
2309                notes.rewrite.
2310                notes.rewrite.amend
2311                notes.rewrite.rebase
2312                notes.rewriteMode
2313                notes.rewriteRef
2314                pack.compression
2315                pack.deltaCacheLimit
2316                pack.deltaCacheSize
2317                pack.depth
2318                pack.indexVersion
2319                pack.packSizeLimit
2320                pack.threads
2321                pack.window
2322                pack.windowMemory
2323                pager.
2324                pretty.
2325                pull.octopus
2326                pull.twohead
2327                push.default
2328                push.followTags
2329                rebase.autosquash
2330                rebase.stat
2331                receive.autogc
2332                receive.denyCurrentBranch
2333                receive.denyDeleteCurrent
2334                receive.denyDeletes
2335                receive.denyNonFastForwards
2336                receive.fsckObjects
2337                receive.unpackLimit
2338                receive.updateserverinfo
2339                remote.pushdefault
2340                remotes.
2341                repack.usedeltabaseoffset
2342                rerere.autoupdate
2343                rerere.enabled
2344                sendemail.
2345                sendemail.aliasesfile
2346                sendemail.aliasfiletype
2347                sendemail.bcc
2348                sendemail.cc
2349                sendemail.cccmd
2350                sendemail.chainreplyto
2351                sendemail.confirm
2352                sendemail.envelopesender
2353                sendemail.from
2354                sendemail.identity
2355                sendemail.multiedit
2356                sendemail.signedoffbycc
2357                sendemail.smtpdomain
2358                sendemail.smtpencryption
2359                sendemail.smtppass
2360                sendemail.smtpserver
2361                sendemail.smtpserveroption
2362                sendemail.smtpserverport
2363                sendemail.smtpuser
2364                sendemail.suppresscc
2365                sendemail.suppressfrom
2366                sendemail.thread
2367                sendemail.to
2368                sendemail.validate
2369                showbranch.default
2370                status.relativePaths
2371                status.showUntrackedFiles
2372                status.submodulesummary
2373                submodule.
2374                tar.umask
2375                transfer.unpackLimit
2376                url.
2377                user.email
2378                user.name
2379                user.signingkey
2380                web.browser
2381                branch. remote.
2382        "
2383}
2384
2385_git_remote ()
2386{
2387        local subcommands="
2388                add rename remove set-head set-branches
2389                get-url set-url show prune update
2390                "
2391        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2392        if [ -z "$subcommand" ]; then
2393                case "$cur" in
2394                --*)
2395                        __gitcomp "--verbose"
2396                        ;;
2397                *)
2398                        __gitcomp "$subcommands"
2399                        ;;
2400                esac
2401                return
2402        fi
2403
2404        case "$subcommand,$cur" in
2405        add,--*)
2406                __gitcomp "--track --master --fetch --tags --no-tags --mirror="
2407                ;;
2408        add,*)
2409                ;;
2410        set-head,--*)
2411                __gitcomp "--auto --delete"
2412                ;;
2413        set-branches,--*)
2414                __gitcomp "--add"
2415                ;;
2416        set-head,*|set-branches,*)
2417                __git_complete_remote_or_refspec
2418                ;;
2419        update,--*)
2420                __gitcomp "--prune"
2421                ;;
2422        update,*)
2423                __gitcomp "$(__git_get_config_variables "remotes")"
2424                ;;
2425        set-url,--*)
2426                __gitcomp "--push --add --delete"
2427                ;;
2428        get-url,--*)
2429                __gitcomp "--push --all"
2430                ;;
2431        prune,--*)
2432                __gitcomp "--dry-run"
2433                ;;
2434        *)
2435                __gitcomp_nl "$(__git_remotes)"
2436                ;;
2437        esac
2438}
2439
2440_git_replace ()
2441{
2442        case "$cur" in
2443        --*)
2444                __gitcomp "--edit --graft --format= --list --delete"
2445                return
2446                ;;
2447        esac
2448        __gitcomp_nl "$(__git_refs)"
2449}
2450
2451_git_rerere ()
2452{
2453        local subcommands="clear forget diff remaining status gc"
2454        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2455        if test -z "$subcommand"
2456        then
2457                __gitcomp "$subcommands"
2458                return
2459        fi
2460}
2461
2462_git_reset ()
2463{
2464        __git_has_doubledash && return
2465
2466        case "$cur" in
2467        --*)
2468                __gitcomp "--merge --mixed --hard --soft --patch"
2469                return
2470                ;;
2471        esac
2472        __gitcomp_nl "$(__git_refs)"
2473}
2474
2475_git_revert ()
2476{
2477        local dir="$(__gitdir)"
2478        if [ -f "$dir"/REVERT_HEAD ]; then
2479                __gitcomp "--continue --quit --abort"
2480                return
2481        fi
2482        case "$cur" in
2483        --*)
2484                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2485                return
2486                ;;
2487        esac
2488        __gitcomp_nl "$(__git_refs)"
2489}
2490
2491_git_rm ()
2492{
2493        case "$cur" in
2494        --*)
2495                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2496                return
2497                ;;
2498        esac
2499
2500        __git_complete_index_file "--cached"
2501}
2502
2503_git_shortlog ()
2504{
2505        __git_has_doubledash && return
2506
2507        case "$cur" in
2508        --*)
2509                __gitcomp "
2510                        $__git_log_common_options
2511                        $__git_log_shortlog_options
2512                        --numbered --summary
2513                        "
2514                return
2515                ;;
2516        esac
2517        __git_complete_revlist
2518}
2519
2520_git_show ()
2521{
2522        __git_has_doubledash && return
2523
2524        case "$cur" in
2525        --pretty=*|--format=*)
2526                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2527                        " "" "${cur#*=}"
2528                return
2529                ;;
2530        --diff-algorithm=*)
2531                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2532                return
2533                ;;
2534        --submodule=*)
2535                __gitcomp "$__git_diff_submodule_formats" "" "${cur##--submodule=}"
2536                return
2537                ;;
2538        --*)
2539                __gitcomp "--pretty= --format= --abbrev-commit --oneline
2540                        --show-signature
2541                        $__git_diff_common_options
2542                        "
2543                return
2544                ;;
2545        esac
2546        __git_complete_revlist_file
2547}
2548
2549_git_show_branch ()
2550{
2551        case "$cur" in
2552        --*)
2553                __gitcomp "
2554                        --all --remotes --topo-order --date-order --current --more=
2555                        --list --independent --merge-base --no-name
2556                        --color --no-color
2557                        --sha1-name --sparse --topics --reflog
2558                        "
2559                return
2560                ;;
2561        esac
2562        __git_complete_revlist
2563}
2564
2565_git_stash ()
2566{
2567        local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
2568        local subcommands='save list show apply clear drop pop create branch'
2569        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2570        if [ -z "$subcommand" ]; then
2571                case "$cur" in
2572                --*)
2573                        __gitcomp "$save_opts"
2574                        ;;
2575                *)
2576                        if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2577                                __gitcomp "$subcommands"
2578                        fi
2579                        ;;
2580                esac
2581        else
2582                case "$subcommand,$cur" in
2583                save,--*)
2584                        __gitcomp "$save_opts"
2585                        ;;
2586                apply,--*|pop,--*)
2587                        __gitcomp "--index --quiet"
2588                        ;;
2589                drop,--*)
2590                        __gitcomp "--quiet"
2591                        ;;
2592                show,--*|branch,--*)
2593                        ;;
2594                branch,*)
2595                        if [ $cword -eq 3 ]; then
2596                                __gitcomp_nl "$(__git_refs)";
2597                        else
2598                                __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2599                                                | sed -n -e 's/:.*//p')"
2600                        fi
2601                        ;;
2602                show,*|apply,*|drop,*|pop,*)
2603                        __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2604                                        | sed -n -e 's/:.*//p')"
2605                        ;;
2606                *)
2607                        ;;
2608                esac
2609        fi
2610}
2611
2612_git_submodule ()
2613{
2614        __git_has_doubledash && return
2615
2616        local subcommands="add status init deinit update summary foreach sync"
2617        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2618        if [ -z "$subcommand" ]; then
2619                case "$cur" in
2620                --*)
2621                        __gitcomp "--quiet"
2622                        ;;
2623                *)
2624                        __gitcomp "$subcommands"
2625                        ;;
2626                esac
2627                return
2628        fi
2629
2630        case "$subcommand,$cur" in
2631        add,--*)
2632                __gitcomp "--branch --force --name --reference --depth"
2633                ;;
2634        status,--*)
2635                __gitcomp "--cached --recursive"
2636                ;;
2637        deinit,--*)
2638                __gitcomp "--force --all"
2639                ;;
2640        update,--*)
2641                __gitcomp "
2642                        --init --remote --no-fetch
2643                        --recommend-shallow --no-recommend-shallow
2644                        --force --rebase --merge --reference --depth --recursive --jobs
2645                "
2646                ;;
2647        summary,--*)
2648                __gitcomp "--cached --files --summary-limit"
2649                ;;
2650        foreach,--*|sync,--*)
2651                __gitcomp "--recursive"
2652                ;;
2653        *)
2654                ;;
2655        esac
2656}
2657
2658_git_svn ()
2659{
2660        local subcommands="
2661                init fetch clone rebase dcommit log find-rev
2662                set-tree commit-diff info create-ignore propget
2663                proplist show-ignore show-externals branch tag blame
2664                migrate mkdirs reset gc
2665                "
2666        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2667        if [ -z "$subcommand" ]; then
2668                __gitcomp "$subcommands"
2669        else
2670                local remote_opts="--username= --config-dir= --no-auth-cache"
2671                local fc_opts="
2672                        --follow-parent --authors-file= --repack=
2673                        --no-metadata --use-svm-props --use-svnsync-props
2674                        --log-window-size= --no-checkout --quiet
2675                        --repack-flags --use-log-author --localtime
2676                        --ignore-paths= --include-paths= $remote_opts
2677                        "
2678                local init_opts="
2679                        --template= --shared= --trunk= --tags=
2680                        --branches= --stdlayout --minimize-url
2681                        --no-metadata --use-svm-props --use-svnsync-props
2682                        --rewrite-root= --prefix= --use-log-author
2683                        --add-author-from $remote_opts
2684                        "
2685                local cmt_opts="
2686                        --edit --rmdir --find-copies-harder --copy-similarity=
2687                        "
2688
2689                case "$subcommand,$cur" in
2690                fetch,--*)
2691                        __gitcomp "--revision= --fetch-all $fc_opts"
2692                        ;;
2693                clone,--*)
2694                        __gitcomp "--revision= $fc_opts $init_opts"
2695                        ;;
2696                init,--*)
2697                        __gitcomp "$init_opts"
2698                        ;;
2699                dcommit,--*)
2700                        __gitcomp "
2701                                --merge --strategy= --verbose --dry-run
2702                                --fetch-all --no-rebase --commit-url
2703                                --revision --interactive $cmt_opts $fc_opts
2704                                "
2705                        ;;
2706                set-tree,--*)
2707                        __gitcomp "--stdin $cmt_opts $fc_opts"
2708                        ;;
2709                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2710                show-externals,--*|mkdirs,--*)
2711                        __gitcomp "--revision="
2712                        ;;
2713                log,--*)
2714                        __gitcomp "
2715                                --limit= --revision= --verbose --incremental
2716                                --oneline --show-commit --non-recursive
2717                                --authors-file= --color
2718                                "
2719                        ;;
2720                rebase,--*)
2721                        __gitcomp "
2722                                --merge --verbose --strategy= --local
2723                                --fetch-all --dry-run $fc_opts
2724                                "
2725                        ;;
2726                commit-diff,--*)
2727                        __gitcomp "--message= --file= --revision= $cmt_opts"
2728                        ;;
2729                info,--*)
2730                        __gitcomp "--url"
2731                        ;;
2732                branch,--*)
2733                        __gitcomp "--dry-run --message --tag"
2734                        ;;
2735                tag,--*)
2736                        __gitcomp "--dry-run --message"
2737                        ;;
2738                blame,--*)
2739                        __gitcomp "--git-format"
2740                        ;;
2741                migrate,--*)
2742                        __gitcomp "
2743                                --config-dir= --ignore-paths= --minimize
2744                                --no-auth-cache --username=
2745                                "
2746                        ;;
2747                reset,--*)
2748                        __gitcomp "--revision= --parent"
2749                        ;;
2750                *)
2751                        ;;
2752                esac
2753        fi
2754}
2755
2756_git_tag ()
2757{
2758        local i c=1 f=0
2759        while [ $c -lt $cword ]; do
2760                i="${words[c]}"
2761                case "$i" in
2762                -d|-v)
2763                        __gitcomp_nl "$(__git_tags)"
2764                        return
2765                        ;;
2766                -f)
2767                        f=1
2768                        ;;
2769                esac
2770                ((c++))
2771        done
2772
2773        case "$prev" in
2774        -m|-F)
2775                ;;
2776        -*|tag)
2777                if [ $f = 1 ]; then
2778                        __gitcomp_nl "$(__git_tags)"
2779                fi
2780                ;;
2781        *)
2782                __gitcomp_nl "$(__git_refs)"
2783                ;;
2784        esac
2785
2786        case "$cur" in
2787        --*)
2788                __gitcomp "
2789                        --list --delete --verify --annotate --message --file
2790                        --sign --cleanup --local-user --force --column --sort
2791                        --contains --points-at
2792                        "
2793                ;;
2794        esac
2795}
2796
2797_git_whatchanged ()
2798{
2799        _git_log
2800}
2801
2802_git_worktree ()
2803{
2804        local subcommands="add list lock prune unlock"
2805        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2806        if [ -z "$subcommand" ]; then
2807                __gitcomp "$subcommands"
2808        else
2809                case "$subcommand,$cur" in
2810                add,--*)
2811                        __gitcomp "--detach"
2812                        ;;
2813                list,--*)
2814                        __gitcomp "--porcelain"
2815                        ;;
2816                lock,--*)
2817                        __gitcomp "--reason"
2818                        ;;
2819                prune,--*)
2820                        __gitcomp "--dry-run --expire --verbose"
2821                        ;;
2822                *)
2823                        ;;
2824                esac
2825        fi
2826}
2827
2828__git_main ()
2829{
2830        local i c=1 command __git_dir
2831
2832        while [ $c -lt $cword ]; do
2833                i="${words[c]}"
2834                case "$i" in
2835                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2836                --git-dir)   ((c++)) ; __git_dir="${words[c]}" ;;
2837                --bare)      __git_dir="." ;;
2838                --help) command="help"; break ;;
2839                -c|--work-tree|--namespace) ((c++)) ;;
2840                -*) ;;
2841                *) command="$i"; break ;;
2842                esac
2843                ((c++))
2844        done
2845
2846        if [ -z "$command" ]; then
2847                case "$cur" in
2848                --*)   __gitcomp "
2849                        --paginate
2850                        --no-pager
2851                        --git-dir=
2852                        --bare
2853                        --version
2854                        --exec-path
2855                        --exec-path=
2856                        --html-path
2857                        --man-path
2858                        --info-path
2859                        --work-tree=
2860                        --namespace=
2861                        --no-replace-objects
2862                        --help
2863                        "
2864                        ;;
2865                *)     __git_compute_porcelain_commands
2866                       __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2867                esac
2868                return
2869        fi
2870
2871        local completion_func="_git_${command//-/_}"
2872        declare -f $completion_func >/dev/null && $completion_func && return
2873
2874        local expansion=$(__git_aliased_command "$command")
2875        if [ -n "$expansion" ]; then
2876                words[1]=$expansion
2877                completion_func="_git_${expansion//-/_}"
2878                declare -f $completion_func >/dev/null && $completion_func
2879        fi
2880}
2881
2882__gitk_main ()
2883{
2884        __git_has_doubledash && return
2885
2886        local g="$(__gitdir)"
2887        local merge=""
2888        if [ -f "$g/MERGE_HEAD" ]; then
2889                merge="--merge"
2890        fi
2891        case "$cur" in
2892        --*)
2893                __gitcomp "
2894                        $__git_log_common_options
2895                        $__git_log_gitk_options
2896                        $merge
2897                        "
2898                return
2899                ;;
2900        esac
2901        __git_complete_revlist
2902}
2903
2904if [[ -n ${ZSH_VERSION-} ]]; then
2905        echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2906
2907        autoload -U +X compinit && compinit
2908
2909        __gitcomp ()
2910        {
2911                emulate -L zsh
2912
2913                local cur_="${3-$cur}"
2914
2915                case "$cur_" in
2916                --*=)
2917                        ;;
2918                *)
2919                        local c IFS=$' \t\n'
2920                        local -a array
2921                        for c in ${=1}; do
2922                                c="$c${4-}"
2923                                case $c in
2924                                --*=*|*.) ;;
2925                                *) c="$c " ;;
2926                                esac
2927                                array[${#array[@]}+1]="$c"
2928                        done
2929                        compset -P '*[=:]'
2930                        compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2931                        ;;
2932                esac
2933        }
2934
2935        __gitcomp_nl ()
2936        {
2937                emulate -L zsh
2938
2939                local IFS=$'\n'
2940                compset -P '*[=:]'
2941                compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2942        }
2943
2944        __gitcomp_file ()
2945        {
2946                emulate -L zsh
2947
2948                local IFS=$'\n'
2949                compset -P '*[=:]'
2950                compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2951        }
2952
2953        _git ()
2954        {
2955                local _ret=1 cur cword prev
2956                cur=${words[CURRENT]}
2957                prev=${words[CURRENT-1]}
2958                let cword=CURRENT-1
2959                emulate ksh -c __${service}_main
2960                let _ret && _default && _ret=0
2961                return _ret
2962        }
2963
2964        compdef _git git gitk
2965        return
2966fi
2967
2968__git_func_wrap ()
2969{
2970        local cur words cword prev
2971        _get_comp_words_by_ref -n =: cur words cword prev
2972        $1
2973}
2974
2975# Setup completion for certain functions defined above by setting common
2976# variables and workarounds.
2977# This is NOT a public function; use at your own risk.
2978__git_complete ()
2979{
2980        local wrapper="__git_wrap${2}"
2981        eval "$wrapper () { __git_func_wrap $2 ; }"
2982        complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2983                || complete -o default -o nospace -F $wrapper $1
2984}
2985
2986# wrapper for backwards compatibility
2987_git ()
2988{
2989        __git_wrap__git_main
2990}
2991
2992# wrapper for backwards compatibility
2993_gitk ()
2994{
2995        __git_wrap__gitk_main
2996}
2997
2998__git_complete git __git_main
2999__git_complete gitk __gitk_main
3000
3001# The following are necessary only for Cygwin, and only are needed
3002# when the user has tab-completed the executable name and consequently
3003# included the '.exe' suffix.
3004#
3005if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
3006__git_complete git.exe __git_main
3007fi