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