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