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