contrib / completion / git-completion.bashon commit Merge branch 'jp/symlink-dirs' (6eedee5)
   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                        --interactive --keep --no-utf8 --signoff --utf8
 678                        --whitespace=
 679                        "
 680                return
 681        esac
 682        COMPREPLY=()
 683}
 684
 685_git_apply ()
 686{
 687        local cur="${COMP_WORDS[COMP_CWORD]}"
 688        case "$cur" in
 689        --whitespace=*)
 690                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 691                return
 692                ;;
 693        --*)
 694                __gitcomp "
 695                        --stat --numstat --summary --check --index
 696                        --cached --index-info --reverse --reject --unidiff-zero
 697                        --apply --no-add --exclude=
 698                        --whitespace= --inaccurate-eof --verbose
 699                        "
 700                return
 701        esac
 702        COMPREPLY=()
 703}
 704
 705_git_add ()
 706{
 707        __git_has_doubledash && return
 708
 709        local cur="${COMP_WORDS[COMP_CWORD]}"
 710        case "$cur" in
 711        --*)
 712                __gitcomp "
 713                        --interactive --refresh --patch --update --dry-run
 714                        --ignore-errors --intent-to-add
 715                        "
 716                return
 717        esac
 718        COMPREPLY=()
 719}
 720
 721_git_archive ()
 722{
 723        local cur="${COMP_WORDS[COMP_CWORD]}"
 724        case "$cur" in
 725        --format=*)
 726                __gitcomp "$(git archive --list)" "" "${cur##--format=}"
 727                return
 728                ;;
 729        --remote=*)
 730                __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
 731                return
 732                ;;
 733        --*)
 734                __gitcomp "
 735                        --format= --list --verbose
 736                        --prefix= --remote= --exec=
 737                        "
 738                return
 739                ;;
 740        esac
 741        __git_complete_file
 742}
 743
 744_git_bisect ()
 745{
 746        __git_has_doubledash && return
 747
 748        local subcommands="start bad good skip reset visualize replay log run"
 749        local subcommand="$(__git_find_subcommand "$subcommands")"
 750        if [ -z "$subcommand" ]; then
 751                __gitcomp "$subcommands"
 752                return
 753        fi
 754
 755        case "$subcommand" in
 756        bad|good|reset|skip)
 757                __gitcomp "$(__git_refs)"
 758                ;;
 759        *)
 760                COMPREPLY=()
 761                ;;
 762        esac
 763}
 764
 765_git_branch ()
 766{
 767        local i c=1 only_local_ref="n" has_r="n"
 768
 769        while [ $c -lt $COMP_CWORD ]; do
 770                i="${COMP_WORDS[c]}"
 771                case "$i" in
 772                -d|-m)  only_local_ref="y" ;;
 773                -r)     has_r="y" ;;
 774                esac
 775                c=$((++c))
 776        done
 777
 778        case "${COMP_WORDS[COMP_CWORD]}" in
 779        --*)
 780                __gitcomp "
 781                        --color --no-color --verbose --abbrev= --no-abbrev
 782                        --track --no-track --contains --merged --no-merged
 783                        "
 784                ;;
 785        *)
 786                if [ $only_local_ref = "y" -a $has_r = "n" ]; then
 787                        __gitcomp "$(__git_heads)"
 788                else
 789                        __gitcomp "$(__git_refs)"
 790                fi
 791                ;;
 792        esac
 793}
 794
 795_git_bundle ()
 796{
 797        local cmd="${COMP_WORDS[2]}"
 798        case "$COMP_CWORD" in
 799        2)
 800                __gitcomp "create list-heads verify unbundle"
 801                ;;
 802        3)
 803                # looking for a file
 804                ;;
 805        *)
 806                case "$cmd" in
 807                        create)
 808                                __git_complete_revlist
 809                        ;;
 810                esac
 811                ;;
 812        esac
 813}
 814
 815_git_checkout ()
 816{
 817        __git_has_doubledash && return
 818
 819        __gitcomp "$(__git_refs)"
 820}
 821
 822_git_cherry ()
 823{
 824        __gitcomp "$(__git_refs)"
 825}
 826
 827_git_cherry_pick ()
 828{
 829        local cur="${COMP_WORDS[COMP_CWORD]}"
 830        case "$cur" in
 831        --*)
 832                __gitcomp "--edit --no-commit"
 833                ;;
 834        *)
 835                __gitcomp "$(__git_refs)"
 836                ;;
 837        esac
 838}
 839
 840_git_clean ()
 841{
 842        __git_has_doubledash && return
 843
 844        local cur="${COMP_WORDS[COMP_CWORD]}"
 845        case "$cur" in
 846        --*)
 847                __gitcomp "--dry-run --quiet"
 848                return
 849                ;;
 850        esac
 851        COMPREPLY=()
 852}
 853
 854_git_clone ()
 855{
 856        local cur="${COMP_WORDS[COMP_CWORD]}"
 857        case "$cur" in
 858        --*)
 859                __gitcomp "
 860                        --local
 861                        --no-hardlinks
 862                        --shared
 863                        --reference
 864                        --quiet
 865                        --no-checkout
 866                        --bare
 867                        --mirror
 868                        --origin
 869                        --upload-pack
 870                        --template=
 871                        --depth
 872                        "
 873                return
 874                ;;
 875        esac
 876        COMPREPLY=()
 877}
 878
 879_git_commit ()
 880{
 881        __git_has_doubledash && return
 882
 883        local cur="${COMP_WORDS[COMP_CWORD]}"
 884        case "$cur" in
 885        --*)
 886                __gitcomp "
 887                        --all --author= --signoff --verify --no-verify
 888                        --edit --amend --include --only --interactive
 889                        "
 890                return
 891        esac
 892        COMPREPLY=()
 893}
 894
 895_git_describe ()
 896{
 897        local cur="${COMP_WORDS[COMP_CWORD]}"
 898        case "$cur" in
 899        --*)
 900                __gitcomp "
 901                        --all --tags --contains --abbrev= --candidates=
 902                        --exact-match --debug --long --match --always
 903                        "
 904                return
 905        esac
 906        __gitcomp "$(__git_refs)"
 907}
 908
 909__git_diff_common_options="--stat --numstat --shortstat --summary
 910                        --patch-with-stat --name-only --name-status --color
 911                        --no-color --color-words --no-renames --check
 912                        --full-index --binary --abbrev --diff-filter=
 913                        --find-copies-harder
 914                        --text --ignore-space-at-eol --ignore-space-change
 915                        --ignore-all-space --exit-code --quiet --ext-diff
 916                        --no-ext-diff
 917                        --no-prefix --src-prefix= --dst-prefix=
 918                        --inter-hunk-context=
 919                        --patience
 920                        --raw
 921"
 922
 923_git_diff ()
 924{
 925        __git_has_doubledash && return
 926
 927        local cur="${COMP_WORDS[COMP_CWORD]}"
 928        case "$cur" in
 929        --*)
 930                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
 931                        --base --ours --theirs
 932                        $__git_diff_common_options
 933                        "
 934                return
 935                ;;
 936        esac
 937        __git_complete_file
 938}
 939
 940__git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
 941                        tkdiff vimdiff gvimdiff xxdiff araxis
 942"
 943
 944_git_difftool ()
 945{
 946        local cur="${COMP_WORDS[COMP_CWORD]}"
 947        case "$cur" in
 948        --tool=*)
 949                __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
 950                return
 951                ;;
 952        --*)
 953                __gitcomp "--tool="
 954                return
 955                ;;
 956        esac
 957        COMPREPLY=()
 958}
 959
 960__git_fetch_options="
 961        --quiet --verbose --append --upload-pack --force --keep --depth=
 962        --tags --no-tags
 963"
 964
 965_git_fetch ()
 966{
 967        local cur="${COMP_WORDS[COMP_CWORD]}"
 968        case "$cur" in
 969        --*)
 970                __gitcomp "$__git_fetch_options"
 971                return
 972                ;;
 973        esac
 974        __git_complete_remote_or_refspec
 975}
 976
 977_git_format_patch ()
 978{
 979        local cur="${COMP_WORDS[COMP_CWORD]}"
 980        case "$cur" in
 981        --thread=*)
 982                __gitcomp "
 983                        deep shallow
 984                        " "" "${cur##--thread=}"
 985                return
 986                ;;
 987        --*)
 988                __gitcomp "
 989                        --stdout --attach --no-attach --thread --thread=
 990                        --output-directory
 991                        --numbered --start-number
 992                        --numbered-files
 993                        --keep-subject
 994                        --signoff
 995                        --in-reply-to= --cc=
 996                        --full-index --binary
 997                        --not --all
 998                        --cover-letter
 999                        --no-prefix --src-prefix= --dst-prefix=
1000                        --inline --suffix= --ignore-if-in-upstream
1001                        --subject-prefix=
1002                        "
1003                return
1004                ;;
1005        esac
1006        __git_complete_revlist
1007}
1008
1009_git_fsck ()
1010{
1011        local cur="${COMP_WORDS[COMP_CWORD]}"
1012        case "$cur" in
1013        --*)
1014                __gitcomp "
1015                        --tags --root --unreachable --cache --no-reflogs --full
1016                        --strict --verbose --lost-found
1017                        "
1018                return
1019                ;;
1020        esac
1021        COMPREPLY=()
1022}
1023
1024_git_gc ()
1025{
1026        local cur="${COMP_WORDS[COMP_CWORD]}"
1027        case "$cur" in
1028        --*)
1029                __gitcomp "--prune --aggressive"
1030                return
1031                ;;
1032        esac
1033        COMPREPLY=()
1034}
1035
1036_git_grep ()
1037{
1038        __git_has_doubledash && return
1039
1040        local cur="${COMP_WORDS[COMP_CWORD]}"
1041        case "$cur" in
1042        --*)
1043                __gitcomp "
1044                        --cached
1045                        --text --ignore-case --word-regexp --invert-match
1046                        --full-name
1047                        --extended-regexp --basic-regexp --fixed-strings
1048                        --files-with-matches --name-only
1049                        --files-without-match
1050                        --max-depth
1051                        --count
1052                        --and --or --not --all-match
1053                        "
1054                return
1055                ;;
1056        esac
1057        COMPREPLY=()
1058}
1059
1060_git_help ()
1061{
1062        local cur="${COMP_WORDS[COMP_CWORD]}"
1063        case "$cur" in
1064        --*)
1065                __gitcomp "--all --info --man --web"
1066                return
1067                ;;
1068        esac
1069        __gitcomp "$(__git_all_commands)
1070                attributes cli core-tutorial cvs-migration
1071                diffcore gitk glossary hooks ignore modules
1072                repository-layout tutorial tutorial-2
1073                workflows
1074                "
1075}
1076
1077_git_init ()
1078{
1079        local cur="${COMP_WORDS[COMP_CWORD]}"
1080        case "$cur" in
1081        --shared=*)
1082                __gitcomp "
1083                        false true umask group all world everybody
1084                        " "" "${cur##--shared=}"
1085                return
1086                ;;
1087        --*)
1088                __gitcomp "--quiet --bare --template= --shared --shared="
1089                return
1090                ;;
1091        esac
1092        COMPREPLY=()
1093}
1094
1095_git_ls_files ()
1096{
1097        __git_has_doubledash && return
1098
1099        local cur="${COMP_WORDS[COMP_CWORD]}"
1100        case "$cur" in
1101        --*)
1102                __gitcomp "--cached --deleted --modified --others --ignored
1103                        --stage --directory --no-empty-directory --unmerged
1104                        --killed --exclude= --exclude-from=
1105                        --exclude-per-directory= --exclude-standard
1106                        --error-unmatch --with-tree= --full-name
1107                        --abbrev --ignored --exclude-per-directory
1108                        "
1109                return
1110                ;;
1111        esac
1112        COMPREPLY=()
1113}
1114
1115_git_ls_remote ()
1116{
1117        __gitcomp "$(__git_remotes)"
1118}
1119
1120_git_ls_tree ()
1121{
1122        __git_complete_file
1123}
1124
1125# Options that go well for log, shortlog and gitk
1126__git_log_common_options="
1127        --not --all
1128        --branches --tags --remotes
1129        --first-parent --merges --no-merges
1130        --max-count=
1131        --max-age= --since= --after=
1132        --min-age= --until= --before=
1133"
1134# Options that go well for log and gitk (not shortlog)
1135__git_log_gitk_options="
1136        --dense --sparse --full-history
1137        --simplify-merges --simplify-by-decoration
1138        --left-right
1139"
1140# Options that go well for log and shortlog (not gitk)
1141__git_log_shortlog_options="
1142        --author= --committer= --grep=
1143        --all-match
1144"
1145
1146__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1147__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1148
1149_git_log ()
1150{
1151        __git_has_doubledash && return
1152
1153        local cur="${COMP_WORDS[COMP_CWORD]}"
1154        local g="$(git rev-parse --git-dir 2>/dev/null)"
1155        local merge=""
1156        if [ -f "$g/MERGE_HEAD" ]; then
1157                merge="--merge"
1158        fi
1159        case "$cur" in
1160        --pretty=*)
1161                __gitcomp "$__git_log_pretty_formats
1162                        " "" "${cur##--pretty=}"
1163                return
1164                ;;
1165        --format=*)
1166                __gitcomp "$__git_log_pretty_formats
1167                        " "" "${cur##--format=}"
1168                return
1169                ;;
1170        --date=*)
1171                __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1172                return
1173                ;;
1174        --*)
1175                __gitcomp "
1176                        $__git_log_common_options
1177                        $__git_log_shortlog_options
1178                        $__git_log_gitk_options
1179                        --root --topo-order --date-order --reverse
1180                        --follow --full-diff
1181                        --abbrev-commit --abbrev=
1182                        --relative-date --date=
1183                        --pretty= --format= --oneline
1184                        --cherry-pick
1185                        --graph
1186                        --decorate
1187                        --walk-reflogs
1188                        --parents --children
1189                        $merge
1190                        $__git_diff_common_options
1191                        --pickaxe-all --pickaxe-regex
1192                        "
1193                return
1194                ;;
1195        esac
1196        __git_complete_revlist
1197}
1198
1199__git_merge_options="
1200        --no-commit --no-stat --log --no-log --squash --strategy
1201        --commit --stat --no-squash --ff --no-ff
1202"
1203
1204_git_merge ()
1205{
1206        __git_complete_strategy && return
1207
1208        local cur="${COMP_WORDS[COMP_CWORD]}"
1209        case "$cur" in
1210        --*)
1211                __gitcomp "$__git_merge_options"
1212                return
1213        esac
1214        __gitcomp "$(__git_refs)"
1215}
1216
1217_git_mergetool ()
1218{
1219        local cur="${COMP_WORDS[COMP_CWORD]}"
1220        case "$cur" in
1221        --tool=*)
1222                __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1223                return
1224                ;;
1225        --*)
1226                __gitcomp "--tool="
1227                return
1228                ;;
1229        esac
1230        COMPREPLY=()
1231}
1232
1233_git_merge_base ()
1234{
1235        __gitcomp "$(__git_refs)"
1236}
1237
1238_git_mv ()
1239{
1240        local cur="${COMP_WORDS[COMP_CWORD]}"
1241        case "$cur" in
1242        --*)
1243                __gitcomp "--dry-run"
1244                return
1245                ;;
1246        esac
1247        COMPREPLY=()
1248}
1249
1250_git_name_rev ()
1251{
1252        __gitcomp "--tags --all --stdin"
1253}
1254
1255_git_pull ()
1256{
1257        __git_complete_strategy && return
1258
1259        local cur="${COMP_WORDS[COMP_CWORD]}"
1260        case "$cur" in
1261        --*)
1262                __gitcomp "
1263                        --rebase --no-rebase
1264                        $__git_merge_options
1265                        $__git_fetch_options
1266                "
1267                return
1268                ;;
1269        esac
1270        __git_complete_remote_or_refspec
1271}
1272
1273_git_push ()
1274{
1275        local cur="${COMP_WORDS[COMP_CWORD]}"
1276        case "${COMP_WORDS[COMP_CWORD-1]}" in
1277        --repo)
1278                __gitcomp "$(__git_remotes)"
1279                return
1280        esac
1281        case "$cur" in
1282        --repo=*)
1283                __gitcomp "$(__git_remotes)" "" "${cur##--repo=}"
1284                return
1285                ;;
1286        --*)
1287                __gitcomp "
1288                        --all --mirror --tags --dry-run --force --verbose
1289                        --receive-pack= --repo=
1290                "
1291                return
1292                ;;
1293        esac
1294        __git_complete_remote_or_refspec
1295}
1296
1297_git_rebase ()
1298{
1299        local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1300        if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1301                __gitcomp "--continue --skip --abort"
1302                return
1303        fi
1304        __git_complete_strategy && return
1305        case "$cur" in
1306        --*)
1307                __gitcomp "--onto --merge --strategy --interactive"
1308                return
1309        esac
1310        __gitcomp "$(__git_refs)"
1311}
1312
1313__git_send_email_confirm_options="always never auto cc compose"
1314__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1315
1316_git_send_email ()
1317{
1318        local cur="${COMP_WORDS[COMP_CWORD]}"
1319        case "$cur" in
1320        --confirm=*)
1321                __gitcomp "
1322                        $__git_send_email_confirm_options
1323                        " "" "${cur##--confirm=}"
1324                return
1325                ;;
1326        --suppress-cc=*)
1327                __gitcomp "
1328                        $__git_send_email_suppresscc_options
1329                        " "" "${cur##--suppress-cc=}"
1330
1331                return
1332                ;;
1333        --smtp-encryption=*)
1334                __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1335                return
1336                ;;
1337        --*)
1338                __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1339                        --compose --confirm= --dry-run --envelope-sender
1340                        --from --identity
1341                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1342                        --no-suppress-from --no-thread --quiet
1343                        --signed-off-by-cc --smtp-pass --smtp-server
1344                        --smtp-server-port --smtp-encryption= --smtp-user
1345                        --subject --suppress-cc= --suppress-from --thread --to
1346                        --validate --no-validate"
1347                return
1348                ;;
1349        esac
1350        COMPREPLY=()
1351}
1352
1353__git_config_get_set_variables ()
1354{
1355        local prevword word config_file= c=$COMP_CWORD
1356        while [ $c -gt 1 ]; do
1357                word="${COMP_WORDS[c]}"
1358                case "$word" in
1359                --global|--system|--file=*)
1360                        config_file="$word"
1361                        break
1362                        ;;
1363                -f|--file)
1364                        config_file="$word $prevword"
1365                        break
1366                        ;;
1367                esac
1368                prevword=$word
1369                c=$((--c))
1370        done
1371
1372        git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1373        while read line
1374        do
1375                case "$line" in
1376                *.*=*)
1377                        echo "${line/=*/}"
1378                        ;;
1379                esac
1380        done
1381}
1382
1383_git_config ()
1384{
1385        local cur="${COMP_WORDS[COMP_CWORD]}"
1386        local prv="${COMP_WORDS[COMP_CWORD-1]}"
1387        case "$prv" in
1388        branch.*.remote)
1389                __gitcomp "$(__git_remotes)"
1390                return
1391                ;;
1392        branch.*.merge)
1393                __gitcomp "$(__git_refs)"
1394                return
1395                ;;
1396        remote.*.fetch)
1397                local remote="${prv#remote.}"
1398                remote="${remote%.fetch}"
1399                __gitcomp "$(__git_refs_remotes "$remote")"
1400                return
1401                ;;
1402        remote.*.push)
1403                local remote="${prv#remote.}"
1404                remote="${remote%.push}"
1405                __gitcomp "$(git --git-dir="$(__gitdir)" \
1406                        for-each-ref --format='%(refname):%(refname)' \
1407                        refs/heads)"
1408                return
1409                ;;
1410        pull.twohead|pull.octopus)
1411                __gitcomp "$(__git_merge_strategies)"
1412                return
1413                ;;
1414        color.branch|color.diff|color.interactive|\
1415        color.showbranch|color.status|color.ui)
1416                __gitcomp "always never auto"
1417                return
1418                ;;
1419        color.pager)
1420                __gitcomp "false true"
1421                return
1422                ;;
1423        color.*.*)
1424                __gitcomp "
1425                        normal black red green yellow blue magenta cyan white
1426                        bold dim ul blink reverse
1427                        "
1428                return
1429                ;;
1430        help.format)
1431                __gitcomp "man info web html"
1432                return
1433                ;;
1434        log.date)
1435                __gitcomp "$__git_log_date_formats"
1436                return
1437                ;;
1438        sendemail.aliasesfiletype)
1439                __gitcomp "mutt mailrc pine elm gnus"
1440                return
1441                ;;
1442        sendemail.confirm)
1443                __gitcomp "$__git_send_email_confirm_options"
1444                return
1445                ;;
1446        sendemail.suppresscc)
1447                __gitcomp "$__git_send_email_suppresscc_options"
1448                return
1449                ;;
1450        --get|--get-all|--unset|--unset-all)
1451                __gitcomp "$(__git_config_get_set_variables)"
1452                return
1453                ;;
1454        *.*)
1455                COMPREPLY=()
1456                return
1457                ;;
1458        esac
1459        case "$cur" in
1460        --*)
1461                __gitcomp "
1462                        --global --system --file=
1463                        --list --replace-all
1464                        --get --get-all --get-regexp
1465                        --add --unset --unset-all
1466                        --remove-section --rename-section
1467                        "
1468                return
1469                ;;
1470        branch.*.*)
1471                local pfx="${cur%.*}."
1472                cur="${cur##*.}"
1473                __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur"
1474                return
1475                ;;
1476        branch.*)
1477                local pfx="${cur%.*}."
1478                cur="${cur#*.}"
1479                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1480                return
1481                ;;
1482        guitool.*.*)
1483                local pfx="${cur%.*}."
1484                cur="${cur##*.}"
1485                __gitcomp "
1486                        argprompt cmd confirm needsfile noconsole norescan
1487                        prompt revprompt revunmerged title
1488                        " "$pfx" "$cur"
1489                return
1490                ;;
1491        difftool.*.*)
1492                local pfx="${cur%.*}."
1493                cur="${cur##*.}"
1494                __gitcomp "cmd path" "$pfx" "$cur"
1495                return
1496                ;;
1497        man.*.*)
1498                local pfx="${cur%.*}."
1499                cur="${cur##*.}"
1500                __gitcomp "cmd path" "$pfx" "$cur"
1501                return
1502                ;;
1503        mergetool.*.*)
1504                local pfx="${cur%.*}."
1505                cur="${cur##*.}"
1506                __gitcomp "cmd path trustExitCode" "$pfx" "$cur"
1507                return
1508                ;;
1509        pager.*)
1510                local pfx="${cur%.*}."
1511                cur="${cur#*.}"
1512                __gitcomp "$(__git_all_commands)" "$pfx" "$cur"
1513                return
1514                ;;
1515        remote.*.*)
1516                local pfx="${cur%.*}."
1517                cur="${cur##*.}"
1518                __gitcomp "
1519                        url proxy fetch push mirror skipDefaultUpdate
1520                        receivepack uploadpack tagopt pushurl
1521                        " "$pfx" "$cur"
1522                return
1523                ;;
1524        remote.*)
1525                local pfx="${cur%.*}."
1526                cur="${cur#*.}"
1527                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1528                return
1529                ;;
1530        url.*.*)
1531                local pfx="${cur%.*}."
1532                cur="${cur##*.}"
1533                __gitcomp "insteadof" "$pfx" "$cur"
1534                return
1535                ;;
1536        esac
1537        __gitcomp "
1538                add.ignore-errors
1539                alias.
1540                apply.whitespace
1541                branch.autosetupmerge
1542                branch.autosetuprebase
1543                clean.requireForce
1544                color.branch
1545                color.branch.current
1546                color.branch.local
1547                color.branch.plain
1548                color.branch.remote
1549                color.diff
1550                color.diff.commit
1551                color.diff.frag
1552                color.diff.meta
1553                color.diff.new
1554                color.diff.old
1555                color.diff.plain
1556                color.diff.whitespace
1557                color.grep
1558                color.grep.external
1559                color.grep.match
1560                color.interactive
1561                color.interactive.header
1562                color.interactive.help
1563                color.interactive.prompt
1564                color.pager
1565                color.showbranch
1566                color.status
1567                color.status.added
1568                color.status.changed
1569                color.status.header
1570                color.status.nobranch
1571                color.status.untracked
1572                color.status.updated
1573                color.ui
1574                commit.template
1575                core.autocrlf
1576                core.bare
1577                core.compression
1578                core.createObject
1579                core.deltaBaseCacheLimit
1580                core.editor
1581                core.excludesfile
1582                core.fileMode
1583                core.fsyncobjectfiles
1584                core.gitProxy
1585                core.ignoreCygwinFSTricks
1586                core.ignoreStat
1587                core.logAllRefUpdates
1588                core.loosecompression
1589                core.packedGitLimit
1590                core.packedGitWindowSize
1591                core.pager
1592                core.preferSymlinkRefs
1593                core.preloadindex
1594                core.quotepath
1595                core.repositoryFormatVersion
1596                core.safecrlf
1597                core.sharedRepository
1598                core.symlinks
1599                core.trustctime
1600                core.warnAmbiguousRefs
1601                core.whitespace
1602                core.worktree
1603                diff.autorefreshindex
1604                diff.external
1605                diff.mnemonicprefix
1606                diff.renameLimit
1607                diff.renameLimit.
1608                diff.renames
1609                diff.suppressBlankEmpty
1610                diff.tool
1611                diff.wordRegex
1612                difftool.
1613                difftool.prompt
1614                fetch.unpackLimit
1615                format.attach
1616                format.cc
1617                format.headers
1618                format.numbered
1619                format.pretty
1620                format.signoff
1621                format.subjectprefix
1622                format.suffix
1623                format.thread
1624                gc.aggressiveWindow
1625                gc.auto
1626                gc.autopacklimit
1627                gc.packrefs
1628                gc.pruneexpire
1629                gc.reflogexpire
1630                gc.reflogexpireunreachable
1631                gc.rerereresolved
1632                gc.rerereunresolved
1633                gitcvs.allbinary
1634                gitcvs.commitmsgannotation
1635                gitcvs.dbTableNamePrefix
1636                gitcvs.dbdriver
1637                gitcvs.dbname
1638                gitcvs.dbpass
1639                gitcvs.dbuser
1640                gitcvs.enabled
1641                gitcvs.logfile
1642                gitcvs.usecrlfattr
1643                guitool.
1644                gui.blamehistoryctx
1645                gui.commitmsgwidth
1646                gui.copyblamethreshold
1647                gui.diffcontext
1648                gui.encoding
1649                gui.fastcopyblame
1650                gui.matchtrackingbranch
1651                gui.newbranchtemplate
1652                gui.pruneduringfetch
1653                gui.spellingdictionary
1654                gui.trustmtime
1655                help.autocorrect
1656                help.browser
1657                help.format
1658                http.lowSpeedLimit
1659                http.lowSpeedTime
1660                http.maxRequests
1661                http.noEPSV
1662                http.proxy
1663                http.sslCAInfo
1664                http.sslCAPath
1665                http.sslCert
1666                http.sslKey
1667                http.sslVerify
1668                i18n.commitEncoding
1669                i18n.logOutputEncoding
1670                imap.folder
1671                imap.host
1672                imap.pass
1673                imap.port
1674                imap.preformattedHTML
1675                imap.sslverify
1676                imap.tunnel
1677                imap.user
1678                instaweb.browser
1679                instaweb.httpd
1680                instaweb.local
1681                instaweb.modulepath
1682                instaweb.port
1683                interactive.singlekey
1684                log.date
1685                log.showroot
1686                mailmap.file
1687                man.
1688                man.viewer
1689                merge.conflictstyle
1690                merge.log
1691                merge.renameLimit
1692                merge.stat
1693                merge.tool
1694                merge.verbosity
1695                mergetool.
1696                mergetool.keepBackup
1697                mergetool.prompt
1698                pack.compression
1699                pack.deltaCacheLimit
1700                pack.deltaCacheSize
1701                pack.depth
1702                pack.indexVersion
1703                pack.packSizeLimit
1704                pack.threads
1705                pack.window
1706                pack.windowMemory
1707                pager.
1708                pull.octopus
1709                pull.twohead
1710                push.default
1711                rebase.stat
1712                receive.denyCurrentBranch
1713                receive.denyDeletes
1714                receive.denyNonFastForwards
1715                receive.fsckObjects
1716                receive.unpackLimit
1717                repack.usedeltabaseoffset
1718                rerere.autoupdate
1719                rerere.enabled
1720                sendemail.aliasesfile
1721                sendemail.aliasesfiletype
1722                sendemail.bcc
1723                sendemail.cc
1724                sendemail.cccmd
1725                sendemail.chainreplyto
1726                sendemail.confirm
1727                sendemail.envelopesender
1728                sendemail.multiedit
1729                sendemail.signedoffbycc
1730                sendemail.smtpencryption
1731                sendemail.smtppass
1732                sendemail.smtpserver
1733                sendemail.smtpserverport
1734                sendemail.smtpuser
1735                sendemail.suppresscc
1736                sendemail.suppressfrom
1737                sendemail.thread
1738                sendemail.to
1739                sendemail.validate
1740                showbranch.default
1741                status.relativePaths
1742                status.showUntrackedFiles
1743                tar.umask
1744                transfer.unpackLimit
1745                url.
1746                user.email
1747                user.name
1748                user.signingkey
1749                web.browser
1750                branch. remote.
1751        "
1752}
1753
1754_git_remote ()
1755{
1756        local subcommands="add rename rm show prune update set-head"
1757        local subcommand="$(__git_find_subcommand "$subcommands")"
1758        if [ -z "$subcommand" ]; then
1759                __gitcomp "$subcommands"
1760                return
1761        fi
1762
1763        case "$subcommand" in
1764        rename|rm|show|prune)
1765                __gitcomp "$(__git_remotes)"
1766                ;;
1767        update)
1768                local i c='' IFS=$'\n'
1769                for i in $(git --git-dir="$(__gitdir)" config --list); do
1770                        case "$i" in
1771                        remotes.*)
1772                                i="${i#remotes.}"
1773                                c="$c ${i/=*/}"
1774                                ;;
1775                        esac
1776                done
1777                __gitcomp "$c"
1778                ;;
1779        *)
1780                COMPREPLY=()
1781                ;;
1782        esac
1783}
1784
1785_git_reset ()
1786{
1787        __git_has_doubledash && return
1788
1789        local cur="${COMP_WORDS[COMP_CWORD]}"
1790        case "$cur" in
1791        --*)
1792                __gitcomp "--merge --mixed --hard --soft"
1793                return
1794                ;;
1795        esac
1796        __gitcomp "$(__git_refs)"
1797}
1798
1799_git_revert ()
1800{
1801        local cur="${COMP_WORDS[COMP_CWORD]}"
1802        case "$cur" in
1803        --*)
1804                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1805                return
1806                ;;
1807        esac
1808        __gitcomp "$(__git_refs)"
1809}
1810
1811_git_rm ()
1812{
1813        __git_has_doubledash && return
1814
1815        local cur="${COMP_WORDS[COMP_CWORD]}"
1816        case "$cur" in
1817        --*)
1818                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1819                return
1820                ;;
1821        esac
1822        COMPREPLY=()
1823}
1824
1825_git_shortlog ()
1826{
1827        __git_has_doubledash && return
1828
1829        local cur="${COMP_WORDS[COMP_CWORD]}"
1830        case "$cur" in
1831        --*)
1832                __gitcomp "
1833                        $__git_log_common_options
1834                        $__git_log_shortlog_options
1835                        --numbered --summary
1836                        "
1837                return
1838                ;;
1839        esac
1840        __git_complete_revlist
1841}
1842
1843_git_show ()
1844{
1845        __git_has_doubledash && return
1846
1847        local cur="${COMP_WORDS[COMP_CWORD]}"
1848        case "$cur" in
1849        --pretty=*)
1850                __gitcomp "$__git_log_pretty_formats
1851                        " "" "${cur##--pretty=}"
1852                return
1853                ;;
1854        --format=*)
1855                __gitcomp "$__git_log_pretty_formats
1856                        " "" "${cur##--format=}"
1857                return
1858                ;;
1859        --*)
1860                __gitcomp "--pretty= --format= --abbrev-commit --oneline
1861                        $__git_diff_common_options
1862                        "
1863                return
1864                ;;
1865        esac
1866        __git_complete_file
1867}
1868
1869_git_show_branch ()
1870{
1871        local cur="${COMP_WORDS[COMP_CWORD]}"
1872        case "$cur" in
1873        --*)
1874                __gitcomp "
1875                        --all --remotes --topo-order --current --more=
1876                        --list --independent --merge-base --no-name
1877                        --color --no-color
1878                        --sha1-name --sparse --topics --reflog
1879                        "
1880                return
1881                ;;
1882        esac
1883        __git_complete_revlist
1884}
1885
1886_git_stash ()
1887{
1888        local subcommands='save list show apply clear drop pop create branch'
1889        local subcommand="$(__git_find_subcommand "$subcommands")"
1890        if [ -z "$subcommand" ]; then
1891                __gitcomp "$subcommands"
1892        else
1893                local cur="${COMP_WORDS[COMP_CWORD]}"
1894                case "$subcommand,$cur" in
1895                save,--*)
1896                        __gitcomp "--keep-index"
1897                        ;;
1898                apply,--*|pop,--*)
1899                        __gitcomp "--index"
1900                        ;;
1901                show,--*|drop,--*|branch,--*)
1902                        COMPREPLY=()
1903                        ;;
1904                show,*|apply,*|drop,*|pop,*|branch,*)
1905                        __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1906                                        | sed -n -e 's/:.*//p')"
1907                        ;;
1908                *)
1909                        COMPREPLY=()
1910                        ;;
1911                esac
1912        fi
1913}
1914
1915_git_submodule ()
1916{
1917        __git_has_doubledash && return
1918
1919        local subcommands="add status init update summary foreach sync"
1920        if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1921                local cur="${COMP_WORDS[COMP_CWORD]}"
1922                case "$cur" in
1923                --*)
1924                        __gitcomp "--quiet --cached"
1925                        ;;
1926                *)
1927                        __gitcomp "$subcommands"
1928                        ;;
1929                esac
1930                return
1931        fi
1932}
1933
1934_git_svn ()
1935{
1936        local subcommands="
1937                init fetch clone rebase dcommit log find-rev
1938                set-tree commit-diff info create-ignore propget
1939                proplist show-ignore show-externals branch tag blame
1940                migrate
1941                "
1942        local subcommand="$(__git_find_subcommand "$subcommands")"
1943        if [ -z "$subcommand" ]; then
1944                __gitcomp "$subcommands"
1945        else
1946                local remote_opts="--username= --config-dir= --no-auth-cache"
1947                local fc_opts="
1948                        --follow-parent --authors-file= --repack=
1949                        --no-metadata --use-svm-props --use-svnsync-props
1950                        --log-window-size= --no-checkout --quiet
1951                        --repack-flags --use-log-author --localtime
1952                        --ignore-paths= $remote_opts
1953                        "
1954                local init_opts="
1955                        --template= --shared= --trunk= --tags=
1956                        --branches= --stdlayout --minimize-url
1957                        --no-metadata --use-svm-props --use-svnsync-props
1958                        --rewrite-root= --prefix= --use-log-author
1959                        --add-author-from $remote_opts
1960                        "
1961                local cmt_opts="
1962                        --edit --rmdir --find-copies-harder --copy-similarity=
1963                        "
1964
1965                local cur="${COMP_WORDS[COMP_CWORD]}"
1966                case "$subcommand,$cur" in
1967                fetch,--*)
1968                        __gitcomp "--revision= --fetch-all $fc_opts"
1969                        ;;
1970                clone,--*)
1971                        __gitcomp "--revision= $fc_opts $init_opts"
1972                        ;;
1973                init,--*)
1974                        __gitcomp "$init_opts"
1975                        ;;
1976                dcommit,--*)
1977                        __gitcomp "
1978                                --merge --strategy= --verbose --dry-run
1979                                --fetch-all --no-rebase --commit-url
1980                                --revision $cmt_opts $fc_opts
1981                                "
1982                        ;;
1983                set-tree,--*)
1984                        __gitcomp "--stdin $cmt_opts $fc_opts"
1985                        ;;
1986                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1987                show-externals,--*)
1988                        __gitcomp "--revision="
1989                        ;;
1990                log,--*)
1991                        __gitcomp "
1992                                --limit= --revision= --verbose --incremental
1993                                --oneline --show-commit --non-recursive
1994                                --authors-file= --color
1995                                "
1996                        ;;
1997                rebase,--*)
1998                        __gitcomp "
1999                                --merge --verbose --strategy= --local
2000                                --fetch-all --dry-run $fc_opts
2001                                "
2002                        ;;
2003                commit-diff,--*)
2004                        __gitcomp "--message= --file= --revision= $cmt_opts"
2005                        ;;
2006                info,--*)
2007                        __gitcomp "--url"
2008                        ;;
2009                branch,--*)
2010                        __gitcomp "--dry-run --message --tag"
2011                        ;;
2012                tag,--*)
2013                        __gitcomp "--dry-run --message"
2014                        ;;
2015                blame,--*)
2016                        __gitcomp "--git-format"
2017                        ;;
2018                migrate,--*)
2019                        __gitcomp "
2020                                --config-dir= --ignore-paths= --minimize
2021                                --no-auth-cache --username=
2022                                "
2023                        ;;
2024                *)
2025                        COMPREPLY=()
2026                        ;;
2027                esac
2028        fi
2029}
2030
2031_git_tag ()
2032{
2033        local i c=1 f=0
2034        while [ $c -lt $COMP_CWORD ]; do
2035                i="${COMP_WORDS[c]}"
2036                case "$i" in
2037                -d|-v)
2038                        __gitcomp "$(__git_tags)"
2039                        return
2040                        ;;
2041                -f)
2042                        f=1
2043                        ;;
2044                esac
2045                c=$((++c))
2046        done
2047
2048        case "${COMP_WORDS[COMP_CWORD-1]}" in
2049        -m|-F)
2050                COMPREPLY=()
2051                ;;
2052        -*|tag)
2053                if [ $f = 1 ]; then
2054                        __gitcomp "$(__git_tags)"
2055                else
2056                        COMPREPLY=()
2057                fi
2058                ;;
2059        *)
2060                __gitcomp "$(__git_refs)"
2061                ;;
2062        esac
2063}
2064
2065_git ()
2066{
2067        local i c=1 command __git_dir
2068
2069        while [ $c -lt $COMP_CWORD ]; do
2070                i="${COMP_WORDS[c]}"
2071                case "$i" in
2072                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2073                --bare)      __git_dir="." ;;
2074                --version|-p|--paginate) ;;
2075                --help) command="help"; break ;;
2076                *) command="$i"; break ;;
2077                esac
2078                c=$((++c))
2079        done
2080
2081        if [ -z "$command" ]; then
2082                case "${COMP_WORDS[COMP_CWORD]}" in
2083                --*)   __gitcomp "
2084                        --paginate
2085                        --no-pager
2086                        --git-dir=
2087                        --bare
2088                        --version
2089                        --exec-path
2090                        --html-path
2091                        --work-tree=
2092                        --help
2093                        "
2094                        ;;
2095                *)     __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
2096                esac
2097                return
2098        fi
2099
2100        local expansion=$(__git_aliased_command "$command")
2101        [ "$expansion" ] && command="$expansion"
2102
2103        case "$command" in
2104        am)          _git_am ;;
2105        add)         _git_add ;;
2106        apply)       _git_apply ;;
2107        archive)     _git_archive ;;
2108        bisect)      _git_bisect ;;
2109        bundle)      _git_bundle ;;
2110        branch)      _git_branch ;;
2111        checkout)    _git_checkout ;;
2112        cherry)      _git_cherry ;;
2113        cherry-pick) _git_cherry_pick ;;
2114        clean)       _git_clean ;;
2115        clone)       _git_clone ;;
2116        commit)      _git_commit ;;
2117        config)      _git_config ;;
2118        describe)    _git_describe ;;
2119        diff)        _git_diff ;;
2120        difftool)    _git_difftool ;;
2121        fetch)       _git_fetch ;;
2122        format-patch) _git_format_patch ;;
2123        fsck)        _git_fsck ;;
2124        gc)          _git_gc ;;
2125        grep)        _git_grep ;;
2126        help)        _git_help ;;
2127        init)        _git_init ;;
2128        log)         _git_log ;;
2129        ls-files)    _git_ls_files ;;
2130        ls-remote)   _git_ls_remote ;;
2131        ls-tree)     _git_ls_tree ;;
2132        merge)       _git_merge;;
2133        mergetool)   _git_mergetool;;
2134        merge-base)  _git_merge_base ;;
2135        mv)          _git_mv ;;
2136        name-rev)    _git_name_rev ;;
2137        pull)        _git_pull ;;
2138        push)        _git_push ;;
2139        rebase)      _git_rebase ;;
2140        remote)      _git_remote ;;
2141        reset)       _git_reset ;;
2142        revert)      _git_revert ;;
2143        rm)          _git_rm ;;
2144        send-email)  _git_send_email ;;
2145        shortlog)    _git_shortlog ;;
2146        show)        _git_show ;;
2147        show-branch) _git_show_branch ;;
2148        stash)       _git_stash ;;
2149        stage)       _git_add ;;
2150        submodule)   _git_submodule ;;
2151        svn)         _git_svn ;;
2152        tag)         _git_tag ;;
2153        whatchanged) _git_log ;;
2154        *)           COMPREPLY=() ;;
2155        esac
2156}
2157
2158_gitk ()
2159{
2160        __git_has_doubledash && return
2161
2162        local cur="${COMP_WORDS[COMP_CWORD]}"
2163        local g="$(__gitdir)"
2164        local merge=""
2165        if [ -f "$g/MERGE_HEAD" ]; then
2166                merge="--merge"
2167        fi
2168        case "$cur" in
2169        --*)
2170                __gitcomp "
2171                        $__git_log_common_options
2172                        $__git_log_gitk_options
2173                        $merge
2174                        "
2175                return
2176                ;;
2177        esac
2178        __git_complete_revlist
2179}
2180
2181complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
2182        || complete -o default -o nospace -F _git git
2183complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
2184        || complete -o default -o nospace -F _gitk gitk
2185
2186# The following are necessary only for Cygwin, and only are needed
2187# when the user has tab-completed the executable name and consequently
2188# included the '.exe' suffix.
2189#
2190if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2191complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
2192        || complete -o default -o nospace -F _git git.exe
2193fi