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