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