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