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