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