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