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