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