contrib / completion / git-completion.bashon commit Merge branch 'maint-1.7.0' into maint-1.7.1 (206af7c)
   1#!bash
   2#
   3# bash completion support for core Git.
   4#
   5# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
   6# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
   7# Distributed under the GNU General Public License, version 2.0.
   8#
   9# The contained completion routines provide support for completing:
  10#
  11#    *) local and remote branch names
  12#    *) local and remote tag names
  13#    *) .git/remotes file names
  14#    *) git 'subcommands'
  15#    *) tree paths within 'ref:path/to/file' expressions
  16#    *) common --long-options
  17#
  18# To use these routines:
  19#
  20#    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
  21#    2) Added the following line to your .bashrc:
  22#        source ~/.git-completion.sh
  23#
  24#    3) Consider changing your PS1 to also show the current branch:
  25#        PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
  26#
  27#       The argument to __git_ps1 will be displayed only if you
  28#       are currently in a git repository.  The %s token will be
  29#       the name of the current branch.
  30#
  31#       In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
  32#       value, unstaged (*) and staged (+) changes will be shown next
  33#       to the branch name.  You can configure this per-repository
  34#       with the bash.showDirtyState variable, which defaults to true
  35#       once GIT_PS1_SHOWDIRTYSTATE is enabled.
  36#
  37#       You can also see if currently something is stashed, by setting
  38#       GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
  39#       then a '$' will be shown next to the branch name.
  40#
  41#       If you would like to see if there're untracked files, then you can
  42#       set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
  43#       untracked files, then a '%' will be shown next to the branch name.
  44#
  45# To submit patches:
  46#
  47#    *) Read Documentation/SubmittingPatches
  48#    *) Send all patches to the current maintainer:
  49#
  50#       "Shawn O. Pearce" <spearce@spearce.org>
  51#
  52#    *) Always CC the Git mailing list:
  53#
  54#       git@vger.kernel.org
  55#
  56
  57case "$COMP_WORDBREAKS" in
  58*:*) : great ;;
  59*)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
  60esac
  61
  62# __gitdir accepts 0 or 1 arguments (i.e., location)
  63# returns location of .git repo
  64__gitdir ()
  65{
  66        if [ -z "${1-}" ]; then
  67                if [ -n "${__git_dir-}" ]; then
  68                        echo "$__git_dir"
  69                elif [ -d .git ]; then
  70                        echo .git
  71                else
  72                        git rev-parse --git-dir 2>/dev/null
  73                fi
  74        elif [ -d "$1/.git" ]; then
  75                echo "$1/.git"
  76        else
  77                echo "$1"
  78        fi
  79}
  80
  81# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
  82# returns text to add to bash PS1 prompt (includes branch name)
  83__git_ps1 ()
  84{
  85        local g="$(__gitdir)"
  86        if [ -n "$g" ]; then
  87                local r
  88                local b
  89                if [ -f "$g/rebase-merge/interactive" ]; then
  90                        r="|REBASE-i"
  91                        b="$(cat "$g/rebase-merge/head-name")"
  92                elif [ -d "$g/rebase-merge" ]; then
  93                        r="|REBASE-m"
  94                        b="$(cat "$g/rebase-merge/head-name")"
  95                else
  96                        if [ -d "$g/rebase-apply" ]; then
  97                                if [ -f "$g/rebase-apply/rebasing" ]; then
  98                                        r="|REBASE"
  99                                elif [ -f "$g/rebase-apply/applying" ]; then
 100                                        r="|AM"
 101                                else
 102                                        r="|AM/REBASE"
 103                                fi
 104                        elif [ -f "$g/MERGE_HEAD" ]; then
 105                                r="|MERGING"
 106                        elif [ -f "$g/BISECT_LOG" ]; then
 107                                r="|BISECTING"
 108                        fi
 109
 110                        b="$(git symbolic-ref HEAD 2>/dev/null)" || {
 111
 112                                b="$(
 113                                case "${GIT_PS1_DESCRIBE_STYLE-}" in
 114                                (contains)
 115                                        git describe --contains HEAD ;;
 116                                (branch)
 117                                        git describe --contains --all HEAD ;;
 118                                (describe)
 119                                        git describe HEAD ;;
 120                                (* | default)
 121                                        git describe --exact-match HEAD ;;
 122                                esac 2>/dev/null)" ||
 123
 124                                b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
 125                                b="unknown"
 126                                b="($b)"
 127                        }
 128                fi
 129
 130                local w
 131                local i
 132                local s
 133                local u
 134                local c
 135
 136                if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
 137                        if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
 138                                c="BARE:"
 139                        else
 140                                b="GIT_DIR!"
 141                        fi
 142                elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
 143                        if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
 144                                if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
 145                                        git diff --no-ext-diff --quiet --exit-code || w="*"
 146                                        if git rev-parse --quiet --verify HEAD >/dev/null; then
 147                                                git diff-index --cached --quiet HEAD -- || i="+"
 148                                        else
 149                                                i="#"
 150                                        fi
 151                                fi
 152                        fi
 153                        if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
 154                                git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
 155                        fi
 156
 157                        if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
 158                           if [ -n "$(git ls-files --others --exclude-standard)" ]; then
 159                              u="%"
 160                           fi
 161                        fi
 162                fi
 163
 164                local f="$w$i$s$u"
 165                printf "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r"
 166        fi
 167}
 168
 169# __gitcomp_1 requires 2 arguments
 170__gitcomp_1 ()
 171{
 172        local c IFS=' '$'\t'$'\n'
 173        for c in $1; do
 174                case "$c$2" in
 175                --*=*) printf %s$'\n' "$c$2" ;;
 176                *.)    printf %s$'\n' "$c$2" ;;
 177                *)     printf %s$'\n' "$c$2 " ;;
 178                esac
 179        done
 180}
 181
 182# __gitcomp accepts 1, 2, 3, or 4 arguments
 183# generates completion reply with compgen
 184__gitcomp ()
 185{
 186        local cur="${COMP_WORDS[COMP_CWORD]}"
 187        if [ $# -gt 2 ]; then
 188                cur="$3"
 189        fi
 190        case "$cur" in
 191        --*=)
 192                COMPREPLY=()
 193                ;;
 194        *)
 195                local IFS=$'\n'
 196                COMPREPLY=($(compgen -P "${2-}" \
 197                        -W "$(__gitcomp_1 "${1-}" "${4-}")" \
 198                        -- "$cur"))
 199                ;;
 200        esac
 201}
 202
 203# __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
 204__git_heads ()
 205{
 206        local cmd i is_hash=y dir="$(__gitdir "${1-}")"
 207        if [ -d "$dir" ]; then
 208                git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
 209                        refs/heads
 210                return
 211        fi
 212        for i in $(git ls-remote "${1-}" 2>/dev/null); do
 213                case "$is_hash,$i" in
 214                y,*) is_hash=n ;;
 215                n,*^{}) is_hash=y ;;
 216                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
 217                n,*) is_hash=y; echo "$i" ;;
 218                esac
 219        done
 220}
 221
 222# __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
 223__git_tags ()
 224{
 225        local cmd i is_hash=y dir="$(__gitdir "${1-}")"
 226        if [ -d "$dir" ]; then
 227                git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
 228                        refs/tags
 229                return
 230        fi
 231        for i in $(git ls-remote "${1-}" 2>/dev/null); do
 232                case "$is_hash,$i" in
 233                y,*) is_hash=n ;;
 234                n,*^{}) is_hash=y ;;
 235                n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
 236                n,*) is_hash=y; echo "$i" ;;
 237                esac
 238        done
 239}
 240
 241# __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
 242__git_refs ()
 243{
 244        local i is_hash=y dir="$(__gitdir "${1-}")"
 245        local cur="${COMP_WORDS[COMP_CWORD]}" format refs
 246        if [ -d "$dir" ]; then
 247                case "$cur" in
 248                refs|refs/*)
 249                        format="refname"
 250                        refs="${cur%/*}"
 251                        ;;
 252                *)
 253                        for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
 254                                if [ -e "$dir/$i" ]; then echo $i; fi
 255                        done
 256                        format="refname:short"
 257                        refs="refs/tags refs/heads refs/remotes"
 258                        ;;
 259                esac
 260                git --git-dir="$dir" for-each-ref --format="%($format)" \
 261                        $refs
 262                return
 263        fi
 264        for i in $(git ls-remote "$dir" 2>/dev/null); do
 265                case "$is_hash,$i" in
 266                y,*) is_hash=n ;;
 267                n,*^{}) is_hash=y ;;
 268                n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
 269                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
 270                n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
 271                n,*) is_hash=y; echo "$i" ;;
 272                esac
 273        done
 274}
 275
 276# __git_refs2 requires 1 argument (to pass to __git_refs)
 277__git_refs2 ()
 278{
 279        local i
 280        for i in $(__git_refs "$1"); do
 281                echo "$i:$i"
 282        done
 283}
 284
 285# __git_refs_remotes requires 1 argument (to pass to ls-remote)
 286__git_refs_remotes ()
 287{
 288        local cmd i is_hash=y
 289        for i in $(git ls-remote "$1" 2>/dev/null); do
 290                case "$is_hash,$i" in
 291                n,refs/heads/*)
 292                        is_hash=y
 293                        echo "$i:refs/remotes/$1/${i#refs/heads/}"
 294                        ;;
 295                y,*) is_hash=n ;;
 296                n,*^{}) is_hash=y ;;
 297                n,refs/tags/*) is_hash=y;;
 298                n,*) is_hash=y; ;;
 299                esac
 300        done
 301}
 302
 303__git_remotes ()
 304{
 305        local i ngoff IFS=$'\n' d="$(__gitdir)"
 306        shopt -q nullglob || ngoff=1
 307        shopt -s nullglob
 308        for i in "$d/remotes"/*; do
 309                echo ${i#$d/remotes/}
 310        done
 311        [ "$ngoff" ] && shopt -u nullglob
 312        for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
 313                i="${i#remote.}"
 314                echo "${i/.url*/}"
 315        done
 316}
 317
 318__git_list_merge_strategies ()
 319{
 320        git merge -s help 2>&1 |
 321        sed -n -e '/[Aa]vailable strategies are: /,/^$/{
 322                s/\.$//
 323                s/.*://
 324                s/^[    ]*//
 325                s/[     ]*$//
 326                p
 327        }'
 328}
 329
 330__git_merge_strategies=
 331# 'git merge -s help' (and thus detection of the merge strategy
 332# list) fails, unfortunately, if run outside of any git working
 333# tree.  __git_merge_strategies is set to the empty string in
 334# that case, and the detection will be repeated the next time it
 335# is needed.
 336__git_compute_merge_strategies ()
 337{
 338        : ${__git_merge_strategies:=$(__git_list_merge_strategies)}
 339}
 340
 341__git_complete_file ()
 342{
 343        local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
 344        case "$cur" in
 345        ?*:*)
 346                ref="${cur%%:*}"
 347                cur="${cur#*:}"
 348                case "$cur" in
 349                ?*/*)
 350                        pfx="${cur%/*}"
 351                        cur="${cur##*/}"
 352                        ls="$ref:$pfx"
 353                        pfx="$pfx/"
 354                        ;;
 355                *)
 356                        ls="$ref"
 357                        ;;
 358            esac
 359
 360                case "$COMP_WORDBREAKS" in
 361                *:*) : great ;;
 362                *)   pfx="$ref:$pfx" ;;
 363                esac
 364
 365                local IFS=$'\n'
 366                COMPREPLY=($(compgen -P "$pfx" \
 367                        -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
 368                                | sed '/^100... blob /{
 369                                           s,^.*        ,,
 370                                           s,$, ,
 371                                       }
 372                                       /^120000 blob /{
 373                                           s,^.*        ,,
 374                                           s,$, ,
 375                                       }
 376                                       /^040000 tree /{
 377                                           s,^.*        ,,
 378                                           s,$,/,
 379                                       }
 380                                       s/^.*    //')" \
 381                        -- "$cur"))
 382                ;;
 383        *)
 384                __gitcomp "$(__git_refs)"
 385                ;;
 386        esac
 387}
 388
 389__git_complete_revlist ()
 390{
 391        local pfx cur="${COMP_WORDS[COMP_CWORD]}"
 392        case "$cur" in
 393        *...*)
 394                pfx="${cur%...*}..."
 395                cur="${cur#*...}"
 396                __gitcomp "$(__git_refs)" "$pfx" "$cur"
 397                ;;
 398        *..*)
 399                pfx="${cur%..*}.."
 400                cur="${cur#*..}"
 401                __gitcomp "$(__git_refs)" "$pfx" "$cur"
 402                ;;
 403        *)
 404                __gitcomp "$(__git_refs)"
 405                ;;
 406        esac
 407}
 408
 409__git_complete_remote_or_refspec ()
 410{
 411        local cmd="${COMP_WORDS[1]}"
 412        local cur="${COMP_WORDS[COMP_CWORD]}"
 413        local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
 414        while [ $c -lt $COMP_CWORD ]; do
 415                i="${COMP_WORDS[c]}"
 416                case "$i" in
 417                --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
 418                --all)
 419                        case "$cmd" in
 420                        push) no_complete_refspec=1 ;;
 421                        fetch)
 422                                COMPREPLY=()
 423                                return
 424                                ;;
 425                        *) ;;
 426                        esac
 427                        ;;
 428                -*) ;;
 429                *) remote="$i"; break ;;
 430                esac
 431                c=$((++c))
 432        done
 433        if [ -z "$remote" ]; then
 434                __gitcomp "$(__git_remotes)"
 435                return
 436        fi
 437        if [ $no_complete_refspec = 1 ]; then
 438                COMPREPLY=()
 439                return
 440        fi
 441        [ "$remote" = "." ] && remote=
 442        case "$cur" in
 443        *:*)
 444                case "$COMP_WORDBREAKS" in
 445                *:*) : great ;;
 446                *)   pfx="${cur%%:*}:" ;;
 447                esac
 448                cur="${cur#*:}"
 449                lhs=0
 450                ;;
 451        +*)
 452                pfx="+"
 453                cur="${cur#+}"
 454                ;;
 455        esac
 456        case "$cmd" in
 457        fetch)
 458                if [ $lhs = 1 ]; then
 459                        __gitcomp "$(__git_refs2 "$remote")" "$pfx" "$cur"
 460                else
 461                        __gitcomp "$(__git_refs)" "$pfx" "$cur"
 462                fi
 463                ;;
 464        pull)
 465                if [ $lhs = 1 ]; then
 466                        __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
 467                else
 468                        __gitcomp "$(__git_refs)" "$pfx" "$cur"
 469                fi
 470                ;;
 471        push)
 472                if [ $lhs = 1 ]; then
 473                        __gitcomp "$(__git_refs)" "$pfx" "$cur"
 474                else
 475                        __gitcomp "$(__git_refs "$remote")" "$pfx" "$cur"
 476                fi
 477                ;;
 478        esac
 479}
 480
 481__git_complete_strategy ()
 482{
 483        __git_compute_merge_strategies
 484        case "${COMP_WORDS[COMP_CWORD-1]}" in
 485        -s|--strategy)
 486                __gitcomp "$__git_merge_strategies"
 487                return 0
 488        esac
 489        local cur="${COMP_WORDS[COMP_CWORD]}"
 490        case "$cur" in
 491        --strategy=*)
 492                __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
 493                return 0
 494                ;;
 495        esac
 496        return 1
 497}
 498
 499__git_list_all_commands ()
 500{
 501        local i IFS=" "$'\n'
 502        for i in $(git help -a|egrep '^  [a-zA-Z0-9]')
 503        do
 504                case $i in
 505                *--*)             : helper pattern;;
 506                *) echo $i;;
 507                esac
 508        done
 509}
 510
 511__git_all_commands=
 512__git_compute_all_commands ()
 513{
 514        : ${__git_all_commands:=$(__git_list_all_commands)}
 515}
 516
 517__git_list_porcelain_commands ()
 518{
 519        local i IFS=" "$'\n'
 520        __git_compute_all_commands
 521        for i in "help" $__git_all_commands
 522        do
 523                case $i in
 524                *--*)             : helper pattern;;
 525                applymbox)        : ask gittus;;
 526                applypatch)       : ask gittus;;
 527                archimport)       : import;;
 528                cat-file)         : plumbing;;
 529                check-attr)       : plumbing;;
 530                check-ref-format) : plumbing;;
 531                checkout-index)   : plumbing;;
 532                commit-tree)      : plumbing;;
 533                count-objects)    : infrequent;;
 534                cvsexportcommit)  : export;;
 535                cvsimport)        : import;;
 536                cvsserver)        : daemon;;
 537                daemon)           : daemon;;
 538                diff-files)       : plumbing;;
 539                diff-index)       : plumbing;;
 540                diff-tree)        : plumbing;;
 541                fast-import)      : import;;
 542                fast-export)      : export;;
 543                fsck-objects)     : plumbing;;
 544                fetch-pack)       : plumbing;;
 545                fmt-merge-msg)    : plumbing;;
 546                for-each-ref)     : plumbing;;
 547                hash-object)      : plumbing;;
 548                http-*)           : transport;;
 549                index-pack)       : plumbing;;
 550                init-db)          : deprecated;;
 551                local-fetch)      : plumbing;;
 552                lost-found)       : infrequent;;
 553                ls-files)         : plumbing;;
 554                ls-remote)        : plumbing;;
 555                ls-tree)          : plumbing;;
 556                mailinfo)         : plumbing;;
 557                mailsplit)        : plumbing;;
 558                merge-*)          : plumbing;;
 559                mktree)           : plumbing;;
 560                mktag)            : plumbing;;
 561                pack-objects)     : plumbing;;
 562                pack-redundant)   : plumbing;;
 563                pack-refs)        : plumbing;;
 564                parse-remote)     : plumbing;;
 565                patch-id)         : plumbing;;
 566                peek-remote)      : plumbing;;
 567                prune)            : plumbing;;
 568                prune-packed)     : plumbing;;
 569                quiltimport)      : import;;
 570                read-tree)        : plumbing;;
 571                receive-pack)     : plumbing;;
 572                reflog)           : plumbing;;
 573                remote-*)         : transport;;
 574                repo-config)      : deprecated;;
 575                rerere)           : plumbing;;
 576                rev-list)         : plumbing;;
 577                rev-parse)        : plumbing;;
 578                runstatus)        : plumbing;;
 579                sh-setup)         : internal;;
 580                shell)            : daemon;;
 581                show-ref)         : plumbing;;
 582                send-pack)        : plumbing;;
 583                show-index)       : plumbing;;
 584                ssh-*)            : transport;;
 585                stripspace)       : plumbing;;
 586                symbolic-ref)     : plumbing;;
 587                tar-tree)         : deprecated;;
 588                unpack-file)      : plumbing;;
 589                unpack-objects)   : plumbing;;
 590                update-index)     : plumbing;;
 591                update-ref)       : plumbing;;
 592                update-server-info) : daemon;;
 593                upload-archive)   : plumbing;;
 594                upload-pack)      : plumbing;;
 595                write-tree)       : plumbing;;
 596                var)              : infrequent;;
 597                verify-pack)      : infrequent;;
 598                verify-tag)       : plumbing;;
 599                *) echo $i;;
 600                esac
 601        done
 602}
 603
 604__git_porcelain_commands=
 605__git_compute_porcelain_commands ()
 606{
 607        __git_compute_all_commands
 608        : ${__git_porcelain_commands:=$(__git_list_porcelain_commands)}
 609}
 610
 611__git_aliases ()
 612{
 613        local i IFS=$'\n'
 614        for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
 615                case "$i" in
 616                alias.*)
 617                        i="${i#alias.}"
 618                        echo "${i/ */}"
 619                        ;;
 620                esac
 621        done
 622}
 623
 624# __git_aliased_command requires 1 argument
 625__git_aliased_command ()
 626{
 627        local word cmdline=$(git --git-dir="$(__gitdir)" \
 628                config --get "alias.$1")
 629        for word in $cmdline; do
 630                case "$word" in
 631                \!gitk|gitk)
 632                        echo "gitk"
 633                        return
 634                        ;;
 635                \!*)    : shell command alias ;;
 636                -*)     : option ;;
 637                *=*)    : setting env ;;
 638                git)    : git itself ;;
 639                *)
 640                        echo "$word"
 641                        return
 642                esac
 643        done
 644}
 645
 646# __git_find_on_cmdline requires 1 argument
 647__git_find_on_cmdline ()
 648{
 649        local word subcommand c=1
 650
 651        while [ $c -lt $COMP_CWORD ]; do
 652                word="${COMP_WORDS[c]}"
 653                for subcommand in $1; do
 654                        if [ "$subcommand" = "$word" ]; then
 655                                echo "$subcommand"
 656                                return
 657                        fi
 658                done
 659                c=$((++c))
 660        done
 661}
 662
 663__git_has_doubledash ()
 664{
 665        local c=1
 666        while [ $c -lt $COMP_CWORD ]; do
 667                if [ "--" = "${COMP_WORDS[c]}" ]; then
 668                        return 0
 669                fi
 670                c=$((++c))
 671        done
 672        return 1
 673}
 674
 675__git_whitespacelist="nowarn warn error error-all fix"
 676
 677_git_am ()
 678{
 679        local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
 680        if [ -d "$dir"/rebase-apply ]; then
 681                __gitcomp "--skip --continue --resolved --abort"
 682                return
 683        fi
 684        case "$cur" in
 685        --whitespace=*)
 686                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 687                return
 688                ;;
 689        --*)
 690                __gitcomp "
 691                        --3way --committer-date-is-author-date --ignore-date
 692                        --ignore-whitespace --ignore-space-change
 693                        --interactive --keep --no-utf8 --signoff --utf8
 694                        --whitespace= --scissors
 695                        "
 696                return
 697        esac
 698        COMPREPLY=()
 699}
 700
 701_git_apply ()
 702{
 703        local cur="${COMP_WORDS[COMP_CWORD]}"
 704        case "$cur" in
 705        --whitespace=*)
 706                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 707                return
 708                ;;
 709        --*)
 710                __gitcomp "
 711                        --stat --numstat --summary --check --index
 712                        --cached --index-info --reverse --reject --unidiff-zero
 713                        --apply --no-add --exclude=
 714                        --ignore-whitespace --ignore-space-change
 715                        --whitespace= --inaccurate-eof --verbose
 716                        "
 717                return
 718        esac
 719        COMPREPLY=()
 720}
 721
 722_git_add ()
 723{
 724        __git_has_doubledash && return
 725
 726        local cur="${COMP_WORDS[COMP_CWORD]}"
 727        case "$cur" in
 728        --*)
 729                __gitcomp "
 730                        --interactive --refresh --patch --update --dry-run
 731                        --ignore-errors --intent-to-add
 732                        "
 733                return
 734        esac
 735        COMPREPLY=()
 736}
 737
 738_git_archive ()
 739{
 740        local cur="${COMP_WORDS[COMP_CWORD]}"
 741        case "$cur" in
 742        --format=*)
 743                __gitcomp "$(git archive --list)" "" "${cur##--format=}"
 744                return
 745                ;;
 746        --remote=*)
 747                __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
 748                return
 749                ;;
 750        --*)
 751                __gitcomp "
 752                        --format= --list --verbose
 753                        --prefix= --remote= --exec=
 754                        "
 755                return
 756                ;;
 757        esac
 758        __git_complete_file
 759}
 760
 761_git_bisect ()
 762{
 763        __git_has_doubledash && return
 764
 765        local subcommands="start bad good skip reset visualize replay log run"
 766        local subcommand="$(__git_find_on_cmdline "$subcommands")"
 767        if [ -z "$subcommand" ]; then
 768                __gitcomp "$subcommands"
 769                return
 770        fi
 771
 772        case "$subcommand" in
 773        bad|good|reset|skip)
 774                __gitcomp "$(__git_refs)"
 775                ;;
 776        *)
 777                COMPREPLY=()
 778                ;;
 779        esac
 780}
 781
 782_git_branch ()
 783{
 784        local i c=1 only_local_ref="n" has_r="n"
 785
 786        while [ $c -lt $COMP_CWORD ]; do
 787                i="${COMP_WORDS[c]}"
 788                case "$i" in
 789                -d|-m)  only_local_ref="y" ;;
 790                -r)     has_r="y" ;;
 791                esac
 792                c=$((++c))
 793        done
 794
 795        case "${COMP_WORDS[COMP_CWORD]}" in
 796        --*)
 797                __gitcomp "
 798                        --color --no-color --verbose --abbrev= --no-abbrev
 799                        --track --no-track --contains --merged --no-merged
 800                        --set-upstream
 801                        "
 802                ;;
 803        *)
 804                if [ $only_local_ref = "y" -a $has_r = "n" ]; then
 805                        __gitcomp "$(__git_heads)"
 806                else
 807                        __gitcomp "$(__git_refs)"
 808                fi
 809                ;;
 810        esac
 811}
 812
 813_git_bundle ()
 814{
 815        local cmd="${COMP_WORDS[2]}"
 816        case "$COMP_CWORD" in
 817        2)
 818                __gitcomp "create list-heads verify unbundle"
 819                ;;
 820        3)
 821                # looking for a file
 822                ;;
 823        *)
 824                case "$cmd" in
 825                        create)
 826                                __git_complete_revlist
 827                        ;;
 828                esac
 829                ;;
 830        esac
 831}
 832
 833_git_checkout ()
 834{
 835        __git_has_doubledash && return
 836
 837        local cur="${COMP_WORDS[COMP_CWORD]}"
 838        case "$cur" in
 839        --conflict=*)
 840                __gitcomp "diff3 merge" "" "${cur##--conflict=}"
 841                ;;
 842        --*)
 843                __gitcomp "
 844                        --quiet --ours --theirs --track --no-track --merge
 845                        --conflict= --patch
 846                        "
 847                ;;
 848        *)
 849                __gitcomp "$(__git_refs)"
 850                ;;
 851        esac
 852}
 853
 854_git_cherry ()
 855{
 856        __gitcomp "$(__git_refs)"
 857}
 858
 859_git_cherry_pick ()
 860{
 861        local cur="${COMP_WORDS[COMP_CWORD]}"
 862        case "$cur" in
 863        --*)
 864                __gitcomp "--edit --no-commit"
 865                ;;
 866        *)
 867                __gitcomp "$(__git_refs)"
 868                ;;
 869        esac
 870}
 871
 872_git_clean ()
 873{
 874        __git_has_doubledash && return
 875
 876        local cur="${COMP_WORDS[COMP_CWORD]}"
 877        case "$cur" in
 878        --*)
 879                __gitcomp "--dry-run --quiet"
 880                return
 881                ;;
 882        esac
 883        COMPREPLY=()
 884}
 885
 886_git_clone ()
 887{
 888        local cur="${COMP_WORDS[COMP_CWORD]}"
 889        case "$cur" in
 890        --*)
 891                __gitcomp "
 892                        --local
 893                        --no-hardlinks
 894                        --shared
 895                        --reference
 896                        --quiet
 897                        --no-checkout
 898                        --bare
 899                        --mirror
 900                        --origin
 901                        --upload-pack
 902                        --template=
 903                        --depth
 904                        "
 905                return
 906                ;;
 907        esac
 908        COMPREPLY=()
 909}
 910
 911_git_commit ()
 912{
 913        __git_has_doubledash && return
 914
 915        local cur="${COMP_WORDS[COMP_CWORD]}"
 916        case "$cur" in
 917        --cleanup=*)
 918                __gitcomp "default strip verbatim whitespace
 919                        " "" "${cur##--cleanup=}"
 920                return
 921                ;;
 922        --reuse-message=*)
 923                __gitcomp "$(__git_refs)" "" "${cur##--reuse-message=}"
 924                return
 925                ;;
 926        --reedit-message=*)
 927                __gitcomp "$(__git_refs)" "" "${cur##--reedit-message=}"
 928                return
 929                ;;
 930        --untracked-files=*)
 931                __gitcomp "all no normal" "" "${cur##--untracked-files=}"
 932                return
 933                ;;
 934        --*)
 935                __gitcomp "
 936                        --all --author= --signoff --verify --no-verify
 937                        --edit --amend --include --only --interactive
 938                        --dry-run --reuse-message= --reedit-message=
 939                        --reset-author --file= --message= --template=
 940                        --cleanup= --untracked-files --untracked-files=
 941                        --verbose --quiet
 942                        "
 943                return
 944        esac
 945        COMPREPLY=()
 946}
 947
 948_git_describe ()
 949{
 950        local cur="${COMP_WORDS[COMP_CWORD]}"
 951        case "$cur" in
 952        --*)
 953                __gitcomp "
 954                        --all --tags --contains --abbrev= --candidates=
 955                        --exact-match --debug --long --match --always
 956                        "
 957                return
 958        esac
 959        __gitcomp "$(__git_refs)"
 960}
 961
 962__git_diff_common_options="--stat --numstat --shortstat --summary
 963                        --patch-with-stat --name-only --name-status --color
 964                        --no-color --color-words --no-renames --check
 965                        --full-index --binary --abbrev --diff-filter=
 966                        --find-copies-harder
 967                        --text --ignore-space-at-eol --ignore-space-change
 968                        --ignore-all-space --exit-code --quiet --ext-diff
 969                        --no-ext-diff
 970                        --no-prefix --src-prefix= --dst-prefix=
 971                        --inter-hunk-context=
 972                        --patience
 973                        --raw
 974                        --dirstat --dirstat= --dirstat-by-file
 975                        --dirstat-by-file= --cumulative
 976"
 977
 978_git_diff ()
 979{
 980        __git_has_doubledash && return
 981
 982        local cur="${COMP_WORDS[COMP_CWORD]}"
 983        case "$cur" in
 984        --*)
 985                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
 986                        --base --ours --theirs
 987                        $__git_diff_common_options
 988                        "
 989                return
 990                ;;
 991        esac
 992        __git_complete_file
 993}
 994
 995__git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
 996                        tkdiff vimdiff gvimdiff xxdiff araxis p4merge
 997"
 998
 999_git_difftool ()
1000{
1001        __git_has_doubledash && return
1002
1003        local cur="${COMP_WORDS[COMP_CWORD]}"
1004        case "$cur" in
1005        --tool=*)
1006                __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1007                return
1008                ;;
1009        --*)
1010                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1011                        --base --ours --theirs
1012                        --no-renames --diff-filter= --find-copies-harder
1013                        --relative --ignore-submodules
1014                        --tool="
1015                return
1016                ;;
1017        esac
1018        __git_complete_file
1019}
1020
1021__git_fetch_options="
1022        --quiet --verbose --append --upload-pack --force --keep --depth=
1023        --tags --no-tags --all --prune --dry-run
1024"
1025
1026_git_fetch ()
1027{
1028        local cur="${COMP_WORDS[COMP_CWORD]}"
1029        case "$cur" in
1030        --*)
1031                __gitcomp "$__git_fetch_options"
1032                return
1033                ;;
1034        esac
1035        __git_complete_remote_or_refspec
1036}
1037
1038_git_format_patch ()
1039{
1040        local cur="${COMP_WORDS[COMP_CWORD]}"
1041        case "$cur" in
1042        --thread=*)
1043                __gitcomp "
1044                        deep shallow
1045                        " "" "${cur##--thread=}"
1046                return
1047                ;;
1048        --*)
1049                __gitcomp "
1050                        --stdout --attach --no-attach --thread --thread=
1051                        --output-directory
1052                        --numbered --start-number
1053                        --numbered-files
1054                        --keep-subject
1055                        --signoff
1056                        --in-reply-to= --cc=
1057                        --full-index --binary
1058                        --not --all
1059                        --cover-letter
1060                        --no-prefix --src-prefix= --dst-prefix=
1061                        --inline --suffix= --ignore-if-in-upstream
1062                        --subject-prefix=
1063                        "
1064                return
1065                ;;
1066        esac
1067        __git_complete_revlist
1068}
1069
1070_git_fsck ()
1071{
1072        local cur="${COMP_WORDS[COMP_CWORD]}"
1073        case "$cur" in
1074        --*)
1075                __gitcomp "
1076                        --tags --root --unreachable --cache --no-reflogs --full
1077                        --strict --verbose --lost-found
1078                        "
1079                return
1080                ;;
1081        esac
1082        COMPREPLY=()
1083}
1084
1085_git_gc ()
1086{
1087        local cur="${COMP_WORDS[COMP_CWORD]}"
1088        case "$cur" in
1089        --*)
1090                __gitcomp "--prune --aggressive"
1091                return
1092                ;;
1093        esac
1094        COMPREPLY=()
1095}
1096
1097_git_gitk ()
1098{
1099        _gitk
1100}
1101
1102_git_grep ()
1103{
1104        __git_has_doubledash && return
1105
1106        local cur="${COMP_WORDS[COMP_CWORD]}"
1107        case "$cur" in
1108        --*)
1109                __gitcomp "
1110                        --cached
1111                        --text --ignore-case --word-regexp --invert-match
1112                        --full-name
1113                        --extended-regexp --basic-regexp --fixed-strings
1114                        --files-with-matches --name-only
1115                        --files-without-match
1116                        --max-depth
1117                        --count
1118                        --and --or --not --all-match
1119                        "
1120                return
1121                ;;
1122        esac
1123
1124        __gitcomp "$(__git_refs)"
1125}
1126
1127_git_help ()
1128{
1129        local cur="${COMP_WORDS[COMP_CWORD]}"
1130        case "$cur" in
1131        --*)
1132                __gitcomp "--all --info --man --web"
1133                return
1134                ;;
1135        esac
1136        __git_compute_all_commands
1137        __gitcomp "$__git_all_commands
1138                attributes cli core-tutorial cvs-migration
1139                diffcore gitk glossary hooks ignore modules
1140                repository-layout tutorial tutorial-2
1141                workflows
1142                "
1143}
1144
1145_git_init ()
1146{
1147        local cur="${COMP_WORDS[COMP_CWORD]}"
1148        case "$cur" in
1149        --shared=*)
1150                __gitcomp "
1151                        false true umask group all world everybody
1152                        " "" "${cur##--shared=}"
1153                return
1154                ;;
1155        --*)
1156                __gitcomp "--quiet --bare --template= --shared --shared="
1157                return
1158                ;;
1159        esac
1160        COMPREPLY=()
1161}
1162
1163_git_ls_files ()
1164{
1165        __git_has_doubledash && return
1166
1167        local cur="${COMP_WORDS[COMP_CWORD]}"
1168        case "$cur" in
1169        --*)
1170                __gitcomp "--cached --deleted --modified --others --ignored
1171                        --stage --directory --no-empty-directory --unmerged
1172                        --killed --exclude= --exclude-from=
1173                        --exclude-per-directory= --exclude-standard
1174                        --error-unmatch --with-tree= --full-name
1175                        --abbrev --ignored --exclude-per-directory
1176                        "
1177                return
1178                ;;
1179        esac
1180        COMPREPLY=()
1181}
1182
1183_git_ls_remote ()
1184{
1185        __gitcomp "$(__git_remotes)"
1186}
1187
1188_git_ls_tree ()
1189{
1190        __git_complete_file
1191}
1192
1193# Options that go well for log, shortlog and gitk
1194__git_log_common_options="
1195        --not --all
1196        --branches --tags --remotes
1197        --first-parent --merges --no-merges
1198        --max-count=
1199        --max-age= --since= --after=
1200        --min-age= --until= --before=
1201"
1202# Options that go well for log and gitk (not shortlog)
1203__git_log_gitk_options="
1204        --dense --sparse --full-history
1205        --simplify-merges --simplify-by-decoration
1206        --left-right
1207"
1208# Options that go well for log and shortlog (not gitk)
1209__git_log_shortlog_options="
1210        --author= --committer= --grep=
1211        --all-match
1212"
1213
1214__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1215__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1216
1217_git_log ()
1218{
1219        __git_has_doubledash && return
1220
1221        local cur="${COMP_WORDS[COMP_CWORD]}"
1222        local g="$(git rev-parse --git-dir 2>/dev/null)"
1223        local merge=""
1224        if [ -f "$g/MERGE_HEAD" ]; then
1225                merge="--merge"
1226        fi
1227        case "$cur" in
1228        --pretty=*)
1229                __gitcomp "$__git_log_pretty_formats
1230                        " "" "${cur##--pretty=}"
1231                return
1232                ;;
1233        --format=*)
1234                __gitcomp "$__git_log_pretty_formats
1235                        " "" "${cur##--format=}"
1236                return
1237                ;;
1238        --date=*)
1239                __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1240                return
1241                ;;
1242        --decorate=*)
1243                __gitcomp "long short" "" "${cur##--decorate=}"
1244                return
1245                ;;
1246        --*)
1247                __gitcomp "
1248                        $__git_log_common_options
1249                        $__git_log_shortlog_options
1250                        $__git_log_gitk_options
1251                        --root --topo-order --date-order --reverse
1252                        --follow --full-diff
1253                        --abbrev-commit --abbrev=
1254                        --relative-date --date=
1255                        --pretty= --format= --oneline
1256                        --cherry-pick
1257                        --graph
1258                        --decorate --decorate=
1259                        --walk-reflogs
1260                        --parents --children
1261                        $merge
1262                        $__git_diff_common_options
1263                        --pickaxe-all --pickaxe-regex
1264                        "
1265                return
1266                ;;
1267        esac
1268        __git_complete_revlist
1269}
1270
1271__git_merge_options="
1272        --no-commit --no-stat --log --no-log --squash --strategy
1273        --commit --stat --no-squash --ff --no-ff --ff-only
1274"
1275
1276_git_merge ()
1277{
1278        __git_complete_strategy && return
1279
1280        local cur="${COMP_WORDS[COMP_CWORD]}"
1281        case "$cur" in
1282        --*)
1283                __gitcomp "$__git_merge_options"
1284                return
1285        esac
1286        __gitcomp "$(__git_refs)"
1287}
1288
1289_git_mergetool ()
1290{
1291        local cur="${COMP_WORDS[COMP_CWORD]}"
1292        case "$cur" in
1293        --tool=*)
1294                __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1295                return
1296                ;;
1297        --*)
1298                __gitcomp "--tool="
1299                return
1300                ;;
1301        esac
1302        COMPREPLY=()
1303}
1304
1305_git_merge_base ()
1306{
1307        __gitcomp "$(__git_refs)"
1308}
1309
1310_git_mv ()
1311{
1312        local cur="${COMP_WORDS[COMP_CWORD]}"
1313        case "$cur" in
1314        --*)
1315                __gitcomp "--dry-run"
1316                return
1317                ;;
1318        esac
1319        COMPREPLY=()
1320}
1321
1322_git_name_rev ()
1323{
1324        __gitcomp "--tags --all --stdin"
1325}
1326
1327_git_notes ()
1328{
1329        local subcommands="edit show"
1330        if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
1331                __gitcomp "$subcommands"
1332                return
1333        fi
1334
1335        case "${COMP_WORDS[COMP_CWORD-1]}" in
1336        -m|-F)
1337                COMPREPLY=()
1338                ;;
1339        *)
1340                __gitcomp "$(__git_refs)"
1341                ;;
1342        esac
1343}
1344
1345_git_pull ()
1346{
1347        __git_complete_strategy && return
1348
1349        local cur="${COMP_WORDS[COMP_CWORD]}"
1350        case "$cur" in
1351        --*)
1352                __gitcomp "
1353                        --rebase --no-rebase
1354                        $__git_merge_options
1355                        $__git_fetch_options
1356                "
1357                return
1358                ;;
1359        esac
1360        __git_complete_remote_or_refspec
1361}
1362
1363_git_push ()
1364{
1365        local cur="${COMP_WORDS[COMP_CWORD]}"
1366        case "${COMP_WORDS[COMP_CWORD-1]}" in
1367        --repo)
1368                __gitcomp "$(__git_remotes)"
1369                return
1370        esac
1371        case "$cur" in
1372        --repo=*)
1373                __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1374                return
1375                ;;
1376        --*)
1377                __gitcomp "
1378                        --all --mirror --tags --dry-run --force --verbose
1379                        --receive-pack= --repo=
1380                "
1381                return
1382                ;;
1383        esac
1384        __git_complete_remote_or_refspec
1385}
1386
1387_git_rebase ()
1388{
1389        local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1390        if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1391                __gitcomp "--continue --skip --abort"
1392                return
1393        fi
1394        __git_complete_strategy && return
1395        case "$cur" in
1396        --whitespace=*)
1397                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1398                return
1399                ;;
1400        --*)
1401                __gitcomp "
1402                        --onto --merge --strategy --interactive
1403                        --preserve-merges --stat --no-stat
1404                        --committer-date-is-author-date --ignore-date
1405                        --ignore-whitespace --whitespace=
1406                        --autosquash
1407                        "
1408
1409                return
1410        esac
1411        __gitcomp "$(__git_refs)"
1412}
1413
1414__git_send_email_confirm_options="always never auto cc compose"
1415__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1416
1417_git_send_email ()
1418{
1419        local cur="${COMP_WORDS[COMP_CWORD]}"
1420        case "$cur" in
1421        --confirm=*)
1422                __gitcomp "
1423                        $__git_send_email_confirm_options
1424                        " "" "${cur##--confirm=}"
1425                return
1426                ;;
1427        --suppress-cc=*)
1428                __gitcomp "
1429                        $__git_send_email_suppresscc_options
1430                        " "" "${cur##--suppress-cc=}"
1431
1432                return
1433                ;;
1434        --smtp-encryption=*)
1435                __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1436                return
1437                ;;
1438        --*)
1439                __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1440                        --compose --confirm= --dry-run --envelope-sender
1441                        --from --identity
1442                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1443                        --no-suppress-from --no-thread --quiet
1444                        --signed-off-by-cc --smtp-pass --smtp-server
1445                        --smtp-server-port --smtp-encryption= --smtp-user
1446                        --subject --suppress-cc= --suppress-from --thread --to
1447                        --validate --no-validate"
1448                return
1449                ;;
1450        esac
1451        COMPREPLY=()
1452}
1453
1454_git_stage ()
1455{
1456        _git_add
1457}
1458
1459__git_config_get_set_variables ()
1460{
1461        local prevword word config_file= c=$COMP_CWORD
1462        while [ $c -gt 1 ]; do
1463                word="${COMP_WORDS[c]}"
1464                case "$word" in
1465                --global|--system|--file=*)
1466                        config_file="$word"
1467                        break
1468                        ;;
1469                -f|--file)
1470                        config_file="$word $prevword"
1471                        break
1472                        ;;
1473                esac
1474                prevword=$word
1475                c=$((--c))
1476        done
1477
1478        git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1479        while read line
1480        do
1481                case "$line" in
1482                *.*=*)
1483                        echo "${line/=*/}"
1484                        ;;
1485                esac
1486        done
1487}
1488
1489_git_config ()
1490{
1491        local cur="${COMP_WORDS[COMP_CWORD]}"
1492        local prv="${COMP_WORDS[COMP_CWORD-1]}"
1493        case "$prv" in
1494        branch.*.remote)
1495                __gitcomp "$(__git_remotes)"
1496                return
1497                ;;
1498        branch.*.merge)
1499                __gitcomp "$(__git_refs)"
1500                return
1501                ;;
1502        remote.*.fetch)
1503                local remote="${prv#remote.}"
1504                remote="${remote%.fetch}"
1505                __gitcomp "$(__git_refs_remotes "$remote")"
1506                return
1507                ;;
1508        remote.*.push)
1509                local remote="${prv#remote.}"
1510                remote="${remote%.push}"
1511                __gitcomp "$(git --git-dir="$(__gitdir)" \
1512                        for-each-ref --format='%(refname):%(refname)' \
1513                        refs/heads)"
1514                return
1515                ;;
1516        pull.twohead|pull.octopus)
1517                __git_compute_merge_strategies
1518                __gitcomp "$__git_merge_strategies"
1519                return
1520                ;;
1521        color.branch|color.diff|color.interactive|\
1522        color.showbranch|color.status|color.ui)
1523                __gitcomp "always never auto"
1524                return
1525                ;;
1526        color.pager)
1527                __gitcomp "false true"
1528                return
1529                ;;
1530        color.*.*)
1531                __gitcomp "
1532                        normal black red green yellow blue magenta cyan white
1533                        bold dim ul blink reverse
1534                        "
1535                return
1536                ;;
1537        help.format)
1538                __gitcomp "man info web html"
1539                return
1540                ;;
1541        log.date)
1542                __gitcomp "$__git_log_date_formats"
1543                return
1544                ;;
1545        sendemail.aliasesfiletype)
1546                __gitcomp "mutt mailrc pine elm gnus"
1547                return
1548                ;;
1549        sendemail.confirm)
1550                __gitcomp "$__git_send_email_confirm_options"
1551                return
1552                ;;
1553        sendemail.suppresscc)
1554                __gitcomp "$__git_send_email_suppresscc_options"
1555                return
1556                ;;
1557        --get|--get-all|--unset|--unset-all)
1558                __gitcomp "$(__git_config_get_set_variables)"
1559                return
1560                ;;
1561        *.*)
1562                COMPREPLY=()
1563                return
1564                ;;
1565        esac
1566        case "$cur" in
1567        --*)
1568                __gitcomp "
1569                        --global --system --file=
1570                        --list --replace-all
1571                        --get --get-all --get-regexp
1572                        --add --unset --unset-all
1573                        --remove-section --rename-section
1574                        "
1575                return
1576                ;;
1577        branch.*.*)
1578                local pfx="${cur%.*}."
1579                cur="${cur##*.}"
1580                __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
1581                return
1582                ;;
1583        branch.*)
1584                local pfx="${cur%.*}."
1585                cur="${cur#*.}"
1586                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1587                return
1588                ;;
1589        guitool.*.*)
1590                local pfx="${cur%.*}."
1591                cur="${cur##*.}"
1592                __gitcomp "
1593                        argprompt cmd confirm needsfile noconsole norescan
1594                        prompt revprompt revunmerged title
1595                        " "$pfx" "$cur"
1596                return
1597                ;;
1598        difftool.*.*)
1599                local pfx="${cur%.*}."
1600                cur="${cur##*.}"
1601                __gitcomp "cmd path" "$pfx" "$cur"
1602                return
1603                ;;
1604        man.*.*)
1605                local pfx="${cur%.*}."
1606                cur="${cur##*.}"
1607                __gitcomp "cmd path" "$pfx" "$cur"
1608                return
1609                ;;
1610        mergetool.*.*)
1611                local pfx="${cur%.*}."
1612                cur="${cur##*.}"
1613                __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1614                return
1615                ;;
1616        pager.*)
1617                local pfx="${cur%.*}."
1618                cur="${cur#*.}"
1619                __git_compute_all_commands
1620                __gitcomp "$__git_all_commands" "$pfx" "$cur"
1621                return
1622                ;;
1623        remote.*.*)
1624                local pfx="${cur%.*}."
1625                cur="${cur##*.}"
1626                __gitcomp "
1627                        url proxy fetch push mirror skipDefaultUpdate
1628                        receivepack uploadpack tagopt pushurl
1629                        " "$pfx" "$cur"
1630                return
1631                ;;
1632        remote.*)
1633                local pfx="${cur%.*}."
1634                cur="${cur#*.}"
1635                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1636                return
1637                ;;
1638        url.*.*)
1639                local pfx="${cur%.*}."
1640                cur="${cur##*.}"
1641                __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur"
1642                return
1643                ;;
1644        esac
1645        __gitcomp "
1646                add.ignore-errors
1647                alias.
1648                apply.ignorewhitespace
1649                apply.whitespace
1650                branch.autosetupmerge
1651                branch.autosetuprebase
1652                clean.requireForce
1653                color.branch
1654                color.branch.current
1655                color.branch.local
1656                color.branch.plain
1657                color.branch.remote
1658                color.diff
1659                color.diff.commit
1660                color.diff.frag
1661                color.diff.meta
1662                color.diff.new
1663                color.diff.old
1664                color.diff.plain
1665                color.diff.whitespace
1666                color.grep
1667                color.grep.external
1668                color.grep.match
1669                color.interactive
1670                color.interactive.header
1671                color.interactive.help
1672                color.interactive.prompt
1673                color.pager
1674                color.showbranch
1675                color.status
1676                color.status.added
1677                color.status.changed
1678                color.status.header
1679                color.status.nobranch
1680                color.status.untracked
1681                color.status.updated
1682                color.ui
1683                commit.template
1684                core.autocrlf
1685                core.bare
1686                core.compression
1687                core.createObject
1688                core.deltaBaseCacheLimit
1689                core.editor
1690                core.excludesfile
1691                core.fileMode
1692                core.fsyncobjectfiles
1693                core.gitProxy
1694                core.ignoreCygwinFSTricks
1695                core.ignoreStat
1696                core.logAllRefUpdates
1697                core.loosecompression
1698                core.packedGitLimit
1699                core.packedGitWindowSize
1700                core.pager
1701                core.preferSymlinkRefs
1702                core.preloadindex
1703                core.quotepath
1704                core.repositoryFormatVersion
1705                core.safecrlf
1706                core.sharedRepository
1707                core.symlinks
1708                core.trustctime
1709                core.warnAmbiguousRefs
1710                core.whitespace
1711                core.worktree
1712                diff.autorefreshindex
1713                diff.external
1714                diff.mnemonicprefix
1715                diff.renameLimit
1716                diff.renameLimit.
1717                diff.renames
1718                diff.suppressBlankEmpty
1719                diff.tool
1720                diff.wordRegex
1721                difftool.
1722                difftool.prompt
1723                fetch.unpackLimit
1724                format.attach
1725                format.cc
1726                format.headers
1727                format.numbered
1728                format.pretty
1729                format.signoff
1730                format.subjectprefix
1731                format.suffix
1732                format.thread
1733                gc.aggressiveWindow
1734                gc.auto
1735                gc.autopacklimit
1736                gc.packrefs
1737                gc.pruneexpire
1738                gc.reflogexpire
1739                gc.reflogexpireunreachable
1740                gc.rerereresolved
1741                gc.rerereunresolved
1742                gitcvs.allbinary
1743                gitcvs.commitmsgannotation
1744                gitcvs.dbTableNamePrefix
1745                gitcvs.dbdriver
1746                gitcvs.dbname
1747                gitcvs.dbpass
1748                gitcvs.dbuser
1749                gitcvs.enabled
1750                gitcvs.logfile
1751                gitcvs.usecrlfattr
1752                guitool.
1753                gui.blamehistoryctx
1754                gui.commitmsgwidth
1755                gui.copyblamethreshold
1756                gui.diffcontext
1757                gui.encoding
1758                gui.fastcopyblame
1759                gui.matchtrackingbranch
1760                gui.newbranchtemplate
1761                gui.pruneduringfetch
1762                gui.spellingdictionary
1763                gui.trustmtime
1764                help.autocorrect
1765                help.browser
1766                help.format
1767                http.lowSpeedLimit
1768                http.lowSpeedTime
1769                http.maxRequests
1770                http.noEPSV
1771                http.proxy
1772                http.sslCAInfo
1773                http.sslCAPath
1774                http.sslCert
1775                http.sslKey
1776                http.sslVerify
1777                i18n.commitEncoding
1778                i18n.logOutputEncoding
1779                imap.folder
1780                imap.host
1781                imap.pass
1782                imap.port
1783                imap.preformattedHTML
1784                imap.sslverify
1785                imap.tunnel
1786                imap.user
1787                instaweb.browser
1788                instaweb.httpd
1789                instaweb.local
1790                instaweb.modulepath
1791                instaweb.port
1792                interactive.singlekey
1793                log.date
1794                log.showroot
1795                mailmap.file
1796                man.
1797                man.viewer
1798                merge.conflictstyle
1799                merge.log
1800                merge.renameLimit
1801                merge.stat
1802                merge.tool
1803                merge.verbosity
1804                mergetool.
1805                mergetool.keepBackup
1806                mergetool.prompt
1807                pack.compression
1808                pack.deltaCacheLimit
1809                pack.deltaCacheSize
1810                pack.depth
1811                pack.indexVersion
1812                pack.packSizeLimit
1813                pack.threads
1814                pack.window
1815                pack.windowMemory
1816                pager.
1817                pull.octopus
1818                pull.twohead
1819                push.default
1820                rebase.stat
1821                receive.denyCurrentBranch
1822                receive.denyDeletes
1823                receive.denyNonFastForwards
1824                receive.fsckObjects
1825                receive.unpackLimit
1826                repack.usedeltabaseoffset
1827                rerere.autoupdate
1828                rerere.enabled
1829                sendemail.aliasesfile
1830                sendemail.aliasesfiletype
1831                sendemail.bcc
1832                sendemail.cc
1833                sendemail.cccmd
1834                sendemail.chainreplyto
1835                sendemail.confirm
1836                sendemail.envelopesender
1837                sendemail.multiedit
1838                sendemail.signedoffbycc
1839                sendemail.smtpencryption
1840                sendemail.smtppass
1841                sendemail.smtpserver
1842                sendemail.smtpserverport
1843                sendemail.smtpuser
1844                sendemail.suppresscc
1845                sendemail.suppressfrom
1846                sendemail.thread
1847                sendemail.to
1848                sendemail.validate
1849                showbranch.default
1850                status.relativePaths
1851                status.showUntrackedFiles
1852                tar.umask
1853                transfer.unpackLimit
1854                url.
1855                user.email
1856                user.name
1857                user.signingkey
1858                web.browser
1859                branch. remote.
1860        "
1861}
1862
1863_git_remote ()
1864{
1865        local subcommands="add rename rm show prune update set-head"
1866        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1867        if [ -z "$subcommand" ]; then
1868                __gitcomp "$subcommands"
1869                return
1870        fi
1871
1872        case "$subcommand" in
1873        rename|rm|show|prune)
1874                __gitcomp "$(__git_remotes)"
1875                ;;
1876        update)
1877                local i c='' IFS=$'\n'
1878                for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
1879                        i="${i#remotes.}"
1880                        c="$c ${i/ */}"
1881                done
1882                __gitcomp "$c"
1883                ;;
1884        *)
1885                COMPREPLY=()
1886                ;;
1887        esac
1888}
1889
1890_git_replace ()
1891{
1892        __gitcomp "$(__git_refs)"
1893}
1894
1895_git_reset ()
1896{
1897        __git_has_doubledash && return
1898
1899        local cur="${COMP_WORDS[COMP_CWORD]}"
1900        case "$cur" in
1901        --*)
1902                __gitcomp "--merge --mixed --hard --soft --patch"
1903                return
1904                ;;
1905        esac
1906        __gitcomp "$(__git_refs)"
1907}
1908
1909_git_revert ()
1910{
1911        local cur="${COMP_WORDS[COMP_CWORD]}"
1912        case "$cur" in
1913        --*)
1914                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1915                return
1916                ;;
1917        esac
1918        __gitcomp "$(__git_refs)"
1919}
1920
1921_git_rm ()
1922{
1923        __git_has_doubledash && return
1924
1925        local cur="${COMP_WORDS[COMP_CWORD]}"
1926        case "$cur" in
1927        --*)
1928                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1929                return
1930                ;;
1931        esac
1932        COMPREPLY=()
1933}
1934
1935_git_shortlog ()
1936{
1937        __git_has_doubledash && return
1938
1939        local cur="${COMP_WORDS[COMP_CWORD]}"
1940        case "$cur" in
1941        --*)
1942                __gitcomp "
1943                        $__git_log_common_options
1944                        $__git_log_shortlog_options
1945                        --numbered --summary
1946                        "
1947                return
1948                ;;
1949        esac
1950        __git_complete_revlist
1951}
1952
1953_git_show ()
1954{
1955        __git_has_doubledash && return
1956
1957        local cur="${COMP_WORDS[COMP_CWORD]}"
1958        case "$cur" in
1959        --pretty=*)
1960                __gitcomp "$__git_log_pretty_formats
1961                        " "" "${cur##--pretty=}"
1962                return
1963                ;;
1964        --format=*)
1965                __gitcomp "$__git_log_pretty_formats
1966                        " "" "${cur##--format=}"
1967                return
1968                ;;
1969        --*)
1970                __gitcomp "--pretty= --format= --abbrev-commit --oneline
1971                        $__git_diff_common_options
1972                        "
1973                return
1974                ;;
1975        esac
1976        __git_complete_file
1977}
1978
1979_git_show_branch ()
1980{
1981        local cur="${COMP_WORDS[COMP_CWORD]}"
1982        case "$cur" in
1983        --*)
1984                __gitcomp "
1985                        --all --remotes --topo-order --current --more=
1986                        --list --independent --merge-base --no-name
1987                        --color --no-color
1988                        --sha1-name --sparse --topics --reflog
1989                        "
1990                return
1991                ;;
1992        esac
1993        __git_complete_revlist
1994}
1995
1996_git_stash ()
1997{
1998        local cur="${COMP_WORDS[COMP_CWORD]}"
1999        local save_opts='--keep-index --no-keep-index --quiet --patch'
2000        local subcommands='save list show apply clear drop pop create branch'
2001        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2002        if [ -z "$subcommand" ]; then
2003                case "$cur" in
2004                --*)
2005                        __gitcomp "$save_opts"
2006                        ;;
2007                *)
2008                        if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2009                                __gitcomp "$subcommands"
2010                        else
2011                                COMPREPLY=()
2012                        fi
2013                        ;;
2014                esac
2015        else
2016                case "$subcommand,$cur" in
2017                save,--*)
2018                        __gitcomp "$save_opts"
2019                        ;;
2020                apply,--*|pop,--*)
2021                        __gitcomp "--index --quiet"
2022                        ;;
2023                show,--*|drop,--*|branch,--*)
2024                        COMPREPLY=()
2025                        ;;
2026                show,*|apply,*|drop,*|pop,*|branch,*)
2027                        __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
2028                                        | sed -n -e 's/:.*//p')"
2029                        ;;
2030                *)
2031                        COMPREPLY=()
2032                        ;;
2033                esac
2034        fi
2035}
2036
2037_git_submodule ()
2038{
2039        __git_has_doubledash && return
2040
2041        local subcommands="add status init update summary foreach sync"
2042        if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2043                local cur="${COMP_WORDS[COMP_CWORD]}"
2044                case "$cur" in
2045                --*)
2046                        __gitcomp "--quiet --cached"
2047                        ;;
2048                *)
2049                        __gitcomp "$subcommands"
2050                        ;;
2051                esac
2052                return
2053        fi
2054}
2055
2056_git_svn ()
2057{
2058        local subcommands="
2059                init fetch clone rebase dcommit log find-rev
2060                set-tree commit-diff info create-ignore propget
2061                proplist show-ignore show-externals branch tag blame
2062                migrate mkdirs reset gc
2063                "
2064        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2065        if [ -z "$subcommand" ]; then
2066                __gitcomp "$subcommands"
2067        else
2068                local remote_opts="--username= --config-dir= --no-auth-cache"
2069                local fc_opts="
2070                        --follow-parent --authors-file= --repack=
2071                        --no-metadata --use-svm-props --use-svnsync-props
2072                        --log-window-size= --no-checkout --quiet
2073                        --repack-flags --use-log-author --localtime
2074                        --ignore-paths= $remote_opts
2075                        "
2076                local init_opts="
2077                        --template= --shared= --trunk= --tags=
2078                        --branches= --stdlayout --minimize-url
2079                        --no-metadata --use-svm-props --use-svnsync-props
2080                        --rewrite-root= --prefix= --use-log-author
2081                        --add-author-from $remote_opts
2082                        "
2083                local cmt_opts="
2084                        --edit --rmdir --find-copies-harder --copy-similarity=
2085                        "
2086
2087                local cur="${COMP_WORDS[COMP_CWORD]}"
2088                case "$subcommand,$cur" in
2089                fetch,--*)
2090                        __gitcomp "--revision= --fetch-all $fc_opts"
2091                        ;;
2092                clone,--*)
2093                        __gitcomp "--revision= $fc_opts $init_opts"
2094                        ;;
2095                init,--*)
2096                        __gitcomp "$init_opts"
2097                        ;;
2098                dcommit,--*)
2099                        __gitcomp "
2100                                --merge --strategy= --verbose --dry-run
2101                                --fetch-all --no-rebase --commit-url
2102                                --revision $cmt_opts $fc_opts
2103                                "
2104                        ;;
2105                set-tree,--*)
2106                        __gitcomp "--stdin $cmt_opts $fc_opts"
2107                        ;;
2108                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2109                show-externals,--*|mkdirs,--*)
2110                        __gitcomp "--revision="
2111                        ;;
2112                log,--*)
2113                        __gitcomp "
2114                                --limit= --revision= --verbose --incremental
2115                                --oneline --show-commit --non-recursive
2116                                --authors-file= --color
2117                                "
2118                        ;;
2119                rebase,--*)
2120                        __gitcomp "
2121                                --merge --verbose --strategy= --local
2122                                --fetch-all --dry-run $fc_opts
2123                                "
2124                        ;;
2125                commit-diff,--*)
2126                        __gitcomp "--message= --file= --revision= $cmt_opts"
2127                        ;;
2128                info,--*)
2129                        __gitcomp "--url"
2130                        ;;
2131                branch,--*)
2132                        __gitcomp "--dry-run --message --tag"
2133                        ;;
2134                tag,--*)
2135                        __gitcomp "--dry-run --message"
2136                        ;;
2137                blame,--*)
2138                        __gitcomp "--git-format"
2139                        ;;
2140                migrate,--*)
2141                        __gitcomp "
2142                                --config-dir= --ignore-paths= --minimize
2143                                --no-auth-cache --username=
2144                                "
2145                        ;;
2146                reset,--*)
2147                        __gitcomp "--revision= --parent"
2148                        ;;
2149                *)
2150                        COMPREPLY=()
2151                        ;;
2152                esac
2153        fi
2154}
2155
2156_git_tag ()
2157{
2158        local i c=1 f=0
2159        while [ $c -lt $COMP_CWORD ]; do
2160                i="${COMP_WORDS[c]}"
2161                case "$i" in
2162                -d|-v)
2163                        __gitcomp "$(__git_tags)"
2164                        return
2165                        ;;
2166                -f)
2167                        f=1
2168                        ;;
2169                esac
2170                c=$((++c))
2171        done
2172
2173        case "${COMP_WORDS[COMP_CWORD-1]}" in
2174        -m|-F)
2175                COMPREPLY=()
2176                ;;
2177        -*|tag)
2178                if [ $f = 1 ]; then
2179                        __gitcomp "$(__git_tags)"
2180                else
2181                        COMPREPLY=()
2182                fi
2183                ;;
2184        *)
2185                __gitcomp "$(__git_refs)"
2186                ;;
2187        esac
2188}
2189
2190_git_whatchanged ()
2191{
2192        _git_log
2193}
2194
2195_git ()
2196{
2197        local i c=1 command __git_dir
2198
2199        while [ $c -lt $COMP_CWORD ]; do
2200                i="${COMP_WORDS[c]}"
2201                case "$i" in
2202                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2203                --bare)      __git_dir="." ;;
2204                --version|-p|--paginate) ;;
2205                --help) command="help"; break ;;
2206                *) command="$i"; break ;;
2207                esac
2208                c=$((++c))
2209        done
2210
2211        if [ -z "$command" ]; then
2212                case "${COMP_WORDS[COMP_CWORD]}" in
2213                --*)   __gitcomp "
2214                        --paginate
2215                        --no-pager
2216                        --git-dir=
2217                        --bare
2218                        --version
2219                        --exec-path
2220                        --html-path
2221                        --work-tree=
2222                        --help
2223                        "
2224                        ;;
2225                *)     __git_compute_porcelain_commands
2226                       __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2227                esac
2228                return
2229        fi
2230
2231        local completion_func="_git_${command//-/_}"
2232        declare -F $completion_func >/dev/null && $completion_func && return
2233
2234        local expansion=$(__git_aliased_command "$command")
2235        if [ -n "$expansion" ]; then
2236                completion_func="_git_${expansion//-/_}"
2237                declare -F $completion_func >/dev/null && $completion_func
2238        fi
2239}
2240
2241_gitk ()
2242{
2243        __git_has_doubledash && return
2244
2245        local cur="${COMP_WORDS[COMP_CWORD]}"
2246        local g="$(__gitdir)"
2247        local merge=""
2248        if [ -f "$g/MERGE_HEAD" ]; then
2249                merge="--merge"
2250        fi
2251        case "$cur" in
2252        --*)
2253                __gitcomp "
2254                        $__git_log_common_options
2255                        $__git_log_gitk_options
2256                        $merge
2257                        "
2258                return
2259                ;;
2260        esac
2261        __git_complete_revlist
2262}
2263
2264complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2265        || complete -o default -o nospace -F _git git
2266complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2267        || complete -o default -o nospace -F _gitk gitk
2268
2269# The following are necessary only for Cygwin, and only are needed
2270# when the user has tab-completed the executable name and consequently
2271# included the '.exe' suffix.
2272#
2273if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2274complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2275        || complete -o default -o nospace -F _git git.exe
2276fi