contrib / completion / git-completion.bashon commit Merge branch 'jc/post-simplify' into tr/rev-list-docs (00b718e)
   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 strip"
 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_merge_base ()
1005{
1006        __gitcomp "$(__git_refs)"
1007}
1008
1009_git_mv ()
1010{
1011        local cur="${COMP_WORDS[COMP_CWORD]}"
1012        case "$cur" in
1013        --*)
1014                __gitcomp "--dry-run"
1015                return
1016                ;;
1017        esac
1018        COMPREPLY=()
1019}
1020
1021_git_name_rev ()
1022{
1023        __gitcomp "--tags --all --stdin"
1024}
1025
1026_git_pull ()
1027{
1028        local cur="${COMP_WORDS[COMP_CWORD]}"
1029
1030        case "${COMP_WORDS[0]},$COMP_CWORD" in
1031        git-pull*,1)
1032                __gitcomp "$(__git_remotes)"
1033                ;;
1034        git,2)
1035                __gitcomp "$(__git_remotes)"
1036                ;;
1037        *)
1038                local remote
1039                case "${COMP_WORDS[0]}" in
1040                git-pull)  remote="${COMP_WORDS[1]}" ;;
1041                git)       remote="${COMP_WORDS[2]}" ;;
1042                esac
1043                __gitcomp "$(__git_refs "$remote")"
1044                ;;
1045        esac
1046}
1047
1048_git_push ()
1049{
1050        local cur="${COMP_WORDS[COMP_CWORD]}"
1051
1052        case "${COMP_WORDS[0]},$COMP_CWORD" in
1053        git-push*,1)
1054                __gitcomp "$(__git_remotes)"
1055                ;;
1056        git,2)
1057                __gitcomp "$(__git_remotes)"
1058                ;;
1059        *)
1060                case "$cur" in
1061                *:*)
1062                        local remote
1063                        case "${COMP_WORDS[0]}" in
1064                        git-push)  remote="${COMP_WORDS[1]}" ;;
1065                        git)       remote="${COMP_WORDS[2]}" ;;
1066                        esac
1067
1068                        local pfx=""
1069                        case "$COMP_WORDBREAKS" in
1070                        *:*) : great ;;
1071                        *)   pfx="${cur%%:*}:" ;;
1072                        esac
1073
1074                        __gitcomp "$(__git_refs "$remote")" "$pfx" "${cur#*:}"
1075                        ;;
1076                +*)
1077                        __gitcomp "$(__git_refs)" + "${cur#+}"
1078                        ;;
1079                *)
1080                        __gitcomp "$(__git_refs)"
1081                        ;;
1082                esac
1083                ;;
1084        esac
1085}
1086
1087_git_rebase ()
1088{
1089        local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1090        if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1091                __gitcomp "--continue --skip --abort"
1092                return
1093        fi
1094        case "${COMP_WORDS[COMP_CWORD-1]}" in
1095        -s|--strategy)
1096                __gitcomp "$(__git_merge_strategies)"
1097                return
1098        esac
1099        case "$cur" in
1100        --strategy=*)
1101                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1102                return
1103                ;;
1104        --*)
1105                __gitcomp "--onto --merge --strategy --interactive"
1106                return
1107        esac
1108        __gitcomp "$(__git_refs)"
1109}
1110
1111_git_send_email ()
1112{
1113        local cur="${COMP_WORDS[COMP_CWORD]}"
1114        case "$cur" in
1115        --*)
1116                __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1117                        --dry-run --envelope-sender --from --identity
1118                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1119                        --no-suppress-from --no-thread --quiet
1120                        --signed-off-by-cc --smtp-pass --smtp-server
1121                        --smtp-server-port --smtp-ssl --smtp-user --subject
1122                        --suppress-cc --suppress-from --thread --to"
1123                return
1124                ;;
1125        esac
1126        COMPREPLY=()
1127}
1128
1129_git_config ()
1130{
1131        local cur="${COMP_WORDS[COMP_CWORD]}"
1132        local prv="${COMP_WORDS[COMP_CWORD-1]}"
1133        case "$prv" in
1134        branch.*.remote)
1135                __gitcomp "$(__git_remotes)"
1136                return
1137                ;;
1138        branch.*.merge)
1139                __gitcomp "$(__git_refs)"
1140                return
1141                ;;
1142        remote.*.fetch)
1143                local remote="${prv#remote.}"
1144                remote="${remote%.fetch}"
1145                __gitcomp "$(__git_refs_remotes "$remote")"
1146                return
1147                ;;
1148        remote.*.push)
1149                local remote="${prv#remote.}"
1150                remote="${remote%.push}"
1151                __gitcomp "$(git --git-dir="$(__gitdir)" \
1152                        for-each-ref --format='%(refname):%(refname)' \
1153                        refs/heads)"
1154                return
1155                ;;
1156        pull.twohead|pull.octopus)
1157                __gitcomp "$(__git_merge_strategies)"
1158                return
1159                ;;
1160        color.branch|color.diff|color.status)
1161                __gitcomp "always never auto"
1162                return
1163                ;;
1164        color.*.*)
1165                __gitcomp "
1166                        black red green yellow blue magenta cyan white
1167                        bold dim ul blink reverse
1168                        "
1169                return
1170                ;;
1171        *.*)
1172                COMPREPLY=()
1173                return
1174                ;;
1175        esac
1176        case "$cur" in
1177        --*)
1178                __gitcomp "
1179                        --global --system --file=
1180                        --list --replace-all
1181                        --get --get-all --get-regexp
1182                        --add --unset --unset-all
1183                        --remove-section --rename-section
1184                        "
1185                return
1186                ;;
1187        branch.*.*)
1188                local pfx="${cur%.*}."
1189                cur="${cur##*.}"
1190                __gitcomp "remote merge" "$pfx" "$cur"
1191                return
1192                ;;
1193        branch.*)
1194                local pfx="${cur%.*}."
1195                cur="${cur#*.}"
1196                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1197                return
1198                ;;
1199        remote.*.*)
1200                local pfx="${cur%.*}."
1201                cur="${cur##*.}"
1202                __gitcomp "
1203                        url fetch push skipDefaultUpdate
1204                        receivepack uploadpack tagopt
1205                        " "$pfx" "$cur"
1206                return
1207                ;;
1208        remote.*)
1209                local pfx="${cur%.*}."
1210                cur="${cur#*.}"
1211                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1212                return
1213                ;;
1214        esac
1215        __gitcomp "
1216                apply.whitespace
1217                core.fileMode
1218                core.gitProxy
1219                core.ignoreStat
1220                core.preferSymlinkRefs
1221                core.logAllRefUpdates
1222                core.loosecompression
1223                core.repositoryFormatVersion
1224                core.sharedRepository
1225                core.warnAmbiguousRefs
1226                core.compression
1227                core.packedGitWindowSize
1228                core.packedGitLimit
1229                clean.requireForce
1230                color.branch
1231                color.branch.current
1232                color.branch.local
1233                color.branch.remote
1234                color.branch.plain
1235                color.diff
1236                color.diff.plain
1237                color.diff.meta
1238                color.diff.frag
1239                color.diff.old
1240                color.diff.new
1241                color.diff.commit
1242                color.diff.whitespace
1243                color.pager
1244                color.status
1245                color.status.header
1246                color.status.added
1247                color.status.changed
1248                color.status.untracked
1249                diff.renameLimit
1250                diff.renames
1251                fetch.unpackLimit
1252                format.headers
1253                format.subjectprefix
1254                gitcvs.enabled
1255                gitcvs.logfile
1256                gitcvs.allbinary
1257                gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1258                gitcvs.dbtablenameprefix
1259                gc.packrefs
1260                gc.reflogexpire
1261                gc.reflogexpireunreachable
1262                gc.rerereresolved
1263                gc.rerereunresolved
1264                http.sslVerify
1265                http.sslCert
1266                http.sslKey
1267                http.sslCAInfo
1268                http.sslCAPath
1269                http.maxRequests
1270                http.lowSpeedLimit
1271                http.lowSpeedTime
1272                http.noEPSV
1273                i18n.commitEncoding
1274                i18n.logOutputEncoding
1275                log.showroot
1276                merge.tool
1277                merge.summary
1278                merge.verbosity
1279                pack.window
1280                pack.depth
1281                pack.windowMemory
1282                pack.compression
1283                pack.deltaCacheSize
1284                pack.deltaCacheLimit
1285                pull.octopus
1286                pull.twohead
1287                repack.useDeltaBaseOffset
1288                showbranch.default
1289                tar.umask
1290                transfer.unpackLimit
1291                receive.unpackLimit
1292                receive.denyNonFastForwards
1293                user.name
1294                user.email
1295                user.signingkey
1296                branch. remote.
1297        "
1298}
1299
1300_git_remote ()
1301{
1302        local subcommands="add rm show prune update"
1303        local subcommand="$(__git_find_subcommand "$subcommands")"
1304        if [ -z "$subcommand" ]; then
1305                __gitcomp "$subcommands"
1306                return
1307        fi
1308
1309        case "$subcommand" in
1310        rm|show|prune)
1311                __gitcomp "$(__git_remotes)"
1312                ;;
1313        update)
1314                local i c='' IFS=$'\n'
1315                for i in $(git --git-dir="$(__gitdir)" config --list); do
1316                        case "$i" in
1317                        remotes.*)
1318                                i="${i#remotes.}"
1319                                c="$c ${i/=*/}"
1320                                ;;
1321                        esac
1322                done
1323                __gitcomp "$c"
1324                ;;
1325        *)
1326                COMPREPLY=()
1327                ;;
1328        esac
1329}
1330
1331_git_reset ()
1332{
1333        __git_has_doubledash && return
1334
1335        local cur="${COMP_WORDS[COMP_CWORD]}"
1336        case "$cur" in
1337        --*)
1338                __gitcomp "--mixed --hard --soft"
1339                return
1340                ;;
1341        esac
1342        __gitcomp "$(__git_refs)"
1343}
1344
1345_git_revert ()
1346{
1347        local cur="${COMP_WORDS[COMP_CWORD]}"
1348        case "$cur" in
1349        --*)
1350                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1351                return
1352                ;;
1353        esac
1354        COMPREPLY=()
1355}
1356
1357_git_rm ()
1358{
1359        __git_has_doubledash && return
1360
1361        local cur="${COMP_WORDS[COMP_CWORD]}"
1362        case "$cur" in
1363        --*)
1364                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1365                return
1366                ;;
1367        esac
1368        COMPREPLY=()
1369}
1370
1371_git_shortlog ()
1372{
1373        __git_has_doubledash && return
1374
1375        local cur="${COMP_WORDS[COMP_CWORD]}"
1376        case "$cur" in
1377        --*)
1378                __gitcomp "
1379                        --max-count= --max-age= --since= --after=
1380                        --min-age= --before= --until=
1381                        --no-merges
1382                        --author= --committer= --grep=
1383                        --all-match
1384                        --not --all
1385                        --numbered --summary
1386                        "
1387                return
1388                ;;
1389        esac
1390        __git_complete_revlist
1391}
1392
1393_git_show ()
1394{
1395        local cur="${COMP_WORDS[COMP_CWORD]}"
1396        case "$cur" in
1397        --pretty=*)
1398                __gitcomp "
1399                        oneline short medium full fuller email raw
1400                        " "" "${cur##--pretty=}"
1401                return
1402                ;;
1403        --*)
1404                __gitcomp "--pretty="
1405                return
1406                ;;
1407        esac
1408        __git_complete_file
1409}
1410
1411_git_show_branch ()
1412{
1413        local cur="${COMP_WORDS[COMP_CWORD]}"
1414        case "$cur" in
1415        --*)
1416                __gitcomp "
1417                        --all --remotes --topo-order --current --more=
1418                        --list --independent --merge-base --no-name
1419                        --sha1-name --topics --reflog
1420                        "
1421                return
1422                ;;
1423        esac
1424        __git_complete_revlist
1425}
1426
1427_git_stash ()
1428{
1429        local subcommands='save list show apply clear drop pop create branch'
1430        local subcommand="$(__git_find_subcommand "$subcommands")"
1431        if [ -z "$subcommand" ]; then
1432                __gitcomp "$subcommands"
1433        else
1434                local cur="${COMP_WORDS[COMP_CWORD]}"
1435                case "$subcommand,$cur" in
1436                save,--*)
1437                        __gitcomp "--keep-index"
1438                        ;;
1439                apply,--*)
1440                        __gitcomp "--index"
1441                        ;;
1442                show,--*|drop,--*|pop,--*|branch,--*)
1443                        COMPREPLY=()
1444                        ;;
1445                show,*|apply,*|drop,*|pop,*|branch,*)
1446                        __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1447                                        | sed -n -e 's/:.*//p')"
1448                        ;;
1449                *)
1450                        COMPREPLY=()
1451                        ;;
1452                esac
1453        fi
1454}
1455
1456_git_submodule ()
1457{
1458        __git_has_doubledash && return
1459
1460        local subcommands="add status init update"
1461        if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1462                local cur="${COMP_WORDS[COMP_CWORD]}"
1463                case "$cur" in
1464                --*)
1465                        __gitcomp "--quiet --cached"
1466                        ;;
1467                *)
1468                        __gitcomp "$subcommands"
1469                        ;;
1470                esac
1471                return
1472        fi
1473}
1474
1475_git_svn ()
1476{
1477        local subcommands="
1478                init fetch clone rebase dcommit log find-rev
1479                set-tree commit-diff info create-ignore propget
1480                proplist show-ignore show-externals
1481                "
1482        local subcommand="$(__git_find_subcommand "$subcommands")"
1483        if [ -z "$subcommand" ]; then
1484                __gitcomp "$subcommands"
1485        else
1486                local remote_opts="--username= --config-dir= --no-auth-cache"
1487                local fc_opts="
1488                        --follow-parent --authors-file= --repack=
1489                        --no-metadata --use-svm-props --use-svnsync-props
1490                        --log-window-size= --no-checkout --quiet
1491                        --repack-flags --user-log-author $remote_opts
1492                        "
1493                local init_opts="
1494                        --template= --shared= --trunk= --tags=
1495                        --branches= --stdlayout --minimize-url
1496                        --no-metadata --use-svm-props --use-svnsync-props
1497                        --rewrite-root= $remote_opts
1498                        "
1499                local cmt_opts="
1500                        --edit --rmdir --find-copies-harder --copy-similarity=
1501                        "
1502
1503                local cur="${COMP_WORDS[COMP_CWORD]}"
1504                case "$subcommand,$cur" in
1505                fetch,--*)
1506                        __gitcomp "--revision= --fetch-all $fc_opts"
1507                        ;;
1508                clone,--*)
1509                        __gitcomp "--revision= $fc_opts $init_opts"
1510                        ;;
1511                init,--*)
1512                        __gitcomp "$init_opts"
1513                        ;;
1514                dcommit,--*)
1515                        __gitcomp "
1516                                --merge --strategy= --verbose --dry-run
1517                                --fetch-all --no-rebase $cmt_opts $fc_opts
1518                                "
1519                        ;;
1520                set-tree,--*)
1521                        __gitcomp "--stdin $cmt_opts $fc_opts"
1522                        ;;
1523                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1524                show-externals,--*)
1525                        __gitcomp "--revision="
1526                        ;;
1527                log,--*)
1528                        __gitcomp "
1529                                --limit= --revision= --verbose --incremental
1530                                --oneline --show-commit --non-recursive
1531                                --authors-file=
1532                                "
1533                        ;;
1534                rebase,--*)
1535                        __gitcomp "
1536                                --merge --verbose --strategy= --local
1537                                --fetch-all $fc_opts
1538                                "
1539                        ;;
1540                commit-diff,--*)
1541                        __gitcomp "--message= --file= --revision= $cmt_opts"
1542                        ;;
1543                info,--*)
1544                        __gitcomp "--url"
1545                        ;;
1546                *)
1547                        COMPREPLY=()
1548                        ;;
1549                esac
1550        fi
1551}
1552
1553_git_tag ()
1554{
1555        local i c=1 f=0
1556        while [ $c -lt $COMP_CWORD ]; do
1557                i="${COMP_WORDS[c]}"
1558                case "$i" in
1559                -d|-v)
1560                        __gitcomp "$(__git_tags)"
1561                        return
1562                        ;;
1563                -f)
1564                        f=1
1565                        ;;
1566                esac
1567                c=$((++c))
1568        done
1569
1570        case "${COMP_WORDS[COMP_CWORD-1]}" in
1571        -m|-F)
1572                COMPREPLY=()
1573                ;;
1574        -*|tag|git-tag)
1575                if [ $f = 1 ]; then
1576                        __gitcomp "$(__git_tags)"
1577                else
1578                        COMPREPLY=()
1579                fi
1580                ;;
1581        *)
1582                __gitcomp "$(__git_refs)"
1583                ;;
1584        esac
1585}
1586
1587_git ()
1588{
1589        local i c=1 command __git_dir
1590
1591        while [ $c -lt $COMP_CWORD ]; do
1592                i="${COMP_WORDS[c]}"
1593                case "$i" in
1594                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1595                --bare)      __git_dir="." ;;
1596                --version|-p|--paginate) ;;
1597                --help) command="help"; break ;;
1598                *) command="$i"; break ;;
1599                esac
1600                c=$((++c))
1601        done
1602
1603        if [ -z "$command" ]; then
1604                case "${COMP_WORDS[COMP_CWORD]}" in
1605                --*=*) COMPREPLY=() ;;
1606                --*)   __gitcomp "
1607                        --paginate
1608                        --no-pager
1609                        --git-dir=
1610                        --bare
1611                        --version
1612                        --exec-path
1613                        --work-tree=
1614                        --help
1615                        "
1616                        ;;
1617                *)     __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1618                esac
1619                return
1620        fi
1621
1622        local expansion=$(__git_aliased_command "$command")
1623        [ "$expansion" ] && command="$expansion"
1624
1625        case "$command" in
1626        am)          _git_am ;;
1627        add)         _git_add ;;
1628        apply)       _git_apply ;;
1629        archive)     _git_archive ;;
1630        bisect)      _git_bisect ;;
1631        bundle)      _git_bundle ;;
1632        branch)      _git_branch ;;
1633        checkout)    _git_checkout ;;
1634        cherry)      _git_cherry ;;
1635        cherry-pick) _git_cherry_pick ;;
1636        clean)       _git_clean ;;
1637        clone)       _git_clone ;;
1638        commit)      _git_commit ;;
1639        config)      _git_config ;;
1640        describe)    _git_describe ;;
1641        diff)        _git_diff ;;
1642        fetch)       _git_fetch ;;
1643        format-patch) _git_format_patch ;;
1644        gc)          _git_gc ;;
1645        grep)        _git_grep ;;
1646        help)        _git_help ;;
1647        init)        _git_init ;;
1648        log)         _git_log ;;
1649        ls-files)    _git_ls_files ;;
1650        ls-remote)   _git_ls_remote ;;
1651        ls-tree)     _git_ls_tree ;;
1652        merge)       _git_merge;;
1653        merge-base)  _git_merge_base ;;
1654        mv)          _git_mv ;;
1655        name-rev)    _git_name_rev ;;
1656        pull)        _git_pull ;;
1657        push)        _git_push ;;
1658        rebase)      _git_rebase ;;
1659        remote)      _git_remote ;;
1660        reset)       _git_reset ;;
1661        revert)      _git_revert ;;
1662        rm)          _git_rm ;;
1663        send-email)  _git_send_email ;;
1664        shortlog)    _git_shortlog ;;
1665        show)        _git_show ;;
1666        show-branch) _git_show_branch ;;
1667        stash)       _git_stash ;;
1668        submodule)   _git_submodule ;;
1669        svn)         _git_svn ;;
1670        tag)         _git_tag ;;
1671        whatchanged) _git_log ;;
1672        *)           COMPREPLY=() ;;
1673        esac
1674}
1675
1676_gitk ()
1677{
1678        __git_has_doubledash && return
1679
1680        local cur="${COMP_WORDS[COMP_CWORD]}"
1681        local g="$(git rev-parse --git-dir 2>/dev/null)"
1682        local merge=""
1683        if [ -f $g/MERGE_HEAD ]; then
1684                merge="--merge"
1685        fi
1686        case "$cur" in
1687        --*)
1688                __gitcomp "--not --all $merge"
1689                return
1690                ;;
1691        esac
1692        __git_complete_revlist
1693}
1694
1695complete -o default -o nospace -F _git git
1696complete -o default -o nospace -F _gitk gitk
1697
1698# The following are necessary only for Cygwin, and only are needed
1699# when the user has tab-completed the executable name and consequently
1700# included the '.exe' suffix.
1701#
1702if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1703complete -o default -o nospace -F _git git.exe
1704fi