16b8dda17dbe1e3c09f3b1377e4a98b9c19900f7
   1#
   2# bash completion support for core Git.
   3#
   4# Copyright (C) 2006 Shawn Pearce
   5# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
   6#
   7# The contained completion routines provide support for completing:
   8#
   9#    *) local and remote branch names
  10#    *) local and remote tag names
  11#    *) .git/remotes file names
  12#    *) git 'subcommands'
  13#    *) tree paths within 'ref:path/to/file' expressions
  14#
  15# To use these routines:
  16#
  17#    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
  18#    2) Added the following line to your .bashrc:
  19#        source ~/.git-completion.sh
  20#
  21#    3) Consider changing your PS1 to also show the current branch:
  22#        PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
  23#
  24#       The argument to __git_ps1 will be displayed only if you
  25#       are currently in a git repository.  The %s token will be
  26#       the name of the current branch.
  27#
  28
  29__gitdir ()
  30{
  31        echo "${__git_dir:-$(git rev-parse --git-dir 2>/dev/null)}"
  32}
  33
  34__git_ps1 ()
  35{
  36        local b="$(git symbolic-ref HEAD 2>/dev/null)"
  37        if [ -n "$b" ]; then
  38                if [ -n "$1" ]; then
  39                        printf "$1" "${b##refs/heads/}"
  40                else
  41                        printf " (%s)" "${b##refs/heads/}"
  42                fi
  43        fi
  44}
  45
  46__git_heads ()
  47{
  48        local cmd i is_hash=y dir="${1:-$(__gitdir)}"
  49        if [ -d "$dir" ]; then
  50                for i in $(git --git-dir="$dir" \
  51                        for-each-ref --format='%(refname)' \
  52                        refs/heads ); do
  53                        echo "${i#refs/heads/}"
  54                done
  55                return
  56        fi
  57        for i in $(git-ls-remote "$dir" 2>/dev/null); do
  58                case "$is_hash,$i" in
  59                y,*) is_hash=n ;;
  60                n,*^{}) is_hash=y ;;
  61                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
  62                n,*) is_hash=y; echo "$i" ;;
  63                esac
  64        done
  65}
  66
  67__git_refs ()
  68{
  69        local cmd i is_hash=y dir="${1:-$(__gitdir)}"
  70        if [ -d "$dir" ]; then
  71                if [ -e "$dir/HEAD" ]; then echo HEAD; fi
  72                for i in $(git --git-dir="$dir" \
  73                        for-each-ref --format='%(refname)' \
  74                        refs/tags refs/heads refs/remotes); do
  75                        case "$i" in
  76                                refs/tags/*)    echo "${i#refs/tags/}" ;;
  77                                refs/heads/*)   echo "${i#refs/heads/}" ;;
  78                                refs/remotes/*) echo "${i#refs/remotes/}" ;;
  79                                *)              echo "$i" ;;
  80                        esac
  81                done
  82                return
  83        fi
  84        for i in $(git-ls-remote "$dir" 2>/dev/null); do
  85                case "$is_hash,$i" in
  86                y,*) is_hash=n ;;
  87                n,*^{}) is_hash=y ;;
  88                n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
  89                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
  90                n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
  91                n,*) is_hash=y; echo "$i" ;;
  92                esac
  93        done
  94}
  95
  96__git_refs2 ()
  97{
  98        local cmd i is_hash=y dir="${1:-$(__gitdir)}"
  99        if [ -d "$dir" ]; then
 100                cmd=git-peek-remote
 101        else
 102                cmd=git-ls-remote
 103        fi
 104        for i in $($cmd "$dir" 2>/dev/null); do
 105                case "$is_hash,$i" in
 106                y,*) is_hash=n ;;
 107                n,*^{}) is_hash=y ;;
 108                n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}:${i#refs/tags/}" ;;
 109                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}:${i#refs/heads/}" ;;
 110                n,*) is_hash=y; echo "$i:$i" ;;
 111                esac
 112        done
 113}
 114
 115__git_refs_remotes ()
 116{
 117        local cmd i is_hash=y
 118        for i in $(git-ls-remote "$1" 2>/dev/null); do
 119                case "$is_hash,$i" in
 120                n,refs/heads/*)
 121                        is_hash=y
 122                        echo "$i:refs/remotes/$1/${i#refs/heads/}"
 123                        ;;
 124                y,*) is_hash=n ;;
 125                n,*^{}) is_hash=y ;;
 126                n,refs/tags/*) is_hash=y;;
 127                n,*) is_hash=y; ;;
 128                esac
 129        done
 130}
 131
 132__git_remotes ()
 133{
 134        local i ngoff IFS=$'\n' d="$(__gitdir)"
 135        shopt -q nullglob || ngoff=1
 136        shopt -s nullglob
 137        for i in "$d/remotes"/*; do
 138                echo ${i#$d/remotes/}
 139        done
 140        [ "$ngoff" ] && shopt -u nullglob
 141        for i in $(git --git-dir="$d" repo-config --list); do
 142                case "$i" in
 143                remote.*.url=*)
 144                        i="${i#remote.}"
 145                        echo "${i/.url=*/}"
 146                        ;;
 147                esac
 148        done
 149}
 150
 151__git_merge_strategies ()
 152{
 153        sed -n "/^all_strategies='/{
 154                s/^all_strategies='//
 155                s/'//
 156                p
 157                q
 158                }" "$(git --exec-path)/git-merge"
 159}
 160
 161__git_complete_file ()
 162{
 163        local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
 164        case "$cur" in
 165        ?*:*)
 166                ref="${cur%%:*}"
 167                cur="${cur#*:}"
 168                case "$cur" in
 169                ?*/*)
 170                        pfx="${cur%/*}"
 171                        cur="${cur##*/}"
 172                        ls="$ref:$pfx"
 173                        pfx="$pfx/"
 174                        ;;
 175                *)
 176                        ls="$ref"
 177                        ;;
 178            esac
 179                COMPREPLY=($(compgen -P "$pfx" \
 180                        -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
 181                                | sed '/^100... blob /s,^.*     ,,
 182                                       /^040000 tree /{
 183                                           s,^.*        ,,
 184                                           s,$,/,
 185                                       }
 186                                       s/^.*    //')" \
 187                        -- "$cur"))
 188                ;;
 189        *)
 190                COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
 191                ;;
 192        esac
 193}
 194
 195__git_complete_revlist ()
 196{
 197        local pfx cur="${COMP_WORDS[COMP_CWORD]}"
 198        case "$cur" in
 199        *...*)
 200                pfx="${cur%...*}..."
 201                cur="${cur#*...}"
 202                COMPREPLY=($(compgen -P "$pfx" -W "$(__git_refs)" -- "$cur"))
 203                ;;
 204        *..*)
 205                pfx="${cur%..*}.."
 206                cur="${cur#*..}"
 207                COMPREPLY=($(compgen -P "$pfx" -W "$(__git_refs)" -- "$cur"))
 208                ;;
 209        *)
 210                COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
 211                ;;
 212        esac
 213}
 214
 215__git_commands ()
 216{
 217        local i IFS=" "$'\n'
 218        for i in $(git help -a|egrep '^ ')
 219        do
 220                case $i in
 221                check-ref-format) : plumbing;;
 222                commit-tree)      : plumbing;;
 223                convert-objects)  : plumbing;;
 224                cvsserver)        : daemon;;
 225                daemon)           : daemon;;
 226                fetch-pack)       : plumbing;;
 227                hash-object)      : plumbing;;
 228                http-*)           : transport;;
 229                index-pack)       : plumbing;;
 230                local-fetch)      : plumbing;;
 231                mailinfo)         : plumbing;;
 232                mailsplit)        : plumbing;;
 233                merge-*)          : plumbing;;
 234                mktree)           : plumbing;;
 235                mktag)            : plumbing;;
 236                pack-objects)     : plumbing;;
 237                pack-redundant)   : plumbing;;
 238                pack-refs)        : plumbing;;
 239                parse-remote)     : plumbing;;
 240                patch-id)         : plumbing;;
 241                peek-remote)      : plumbing;;
 242                read-tree)        : plumbing;;
 243                receive-pack)     : plumbing;;
 244                rerere)           : plumbing;;
 245                rev-list)         : plumbing;;
 246                rev-parse)        : plumbing;;
 247                runstatus)        : plumbing;;
 248                sh-setup)         : internal;;
 249                shell)            : daemon;;
 250                send-pack)        : plumbing;;
 251                show-index)       : plumbing;;
 252                ssh-*)            : transport;;
 253                stripspace)       : plumbing;;
 254                symbolic-ref)     : plumbing;;
 255                unpack-file)      : plumbing;;
 256                unpack-objects)   : plumbing;;
 257                update-ref)       : plumbing;;
 258                update-server-info) : daemon;;
 259                upload-archive)   : plumbing;;
 260                upload-pack)      : plumbing;;
 261                write-tree)       : plumbing;;
 262                *) echo $i;;
 263                esac
 264        done
 265}
 266
 267__git_aliases ()
 268{
 269        local i IFS=$'\n'
 270        for i in $(git --git-dir="$(__gitdir)" repo-config --list); do
 271                case "$i" in
 272                alias.*)
 273                        i="${i#alias.}"
 274                        echo "${i/=*/}"
 275                        ;;
 276                esac
 277        done
 278}
 279
 280__git_aliased_command ()
 281{
 282        local word cmdline=$(git --git-dir="$(__gitdir)" \
 283                repo-config --get "alias.$1")
 284        for word in $cmdline; do
 285                if [ "${word##-*}" ]; then
 286                        echo $word
 287                        return
 288                fi
 289        done
 290}
 291
 292_git_branch ()
 293{
 294        local cur="${COMP_WORDS[COMP_CWORD]}"
 295        COMPREPLY=($(compgen -W "-l -f -d -D $(__git_refs)" -- "$cur"))
 296}
 297
 298_git_cat_file ()
 299{
 300        local cur="${COMP_WORDS[COMP_CWORD]}"
 301        case "${COMP_WORDS[0]},$COMP_CWORD" in
 302        git-cat-file*,1)
 303                COMPREPLY=($(compgen -W "-p -t blob tree commit tag" -- "$cur"))
 304                ;;
 305        git,2)
 306                COMPREPLY=($(compgen -W "-p -t blob tree commit tag" -- "$cur"))
 307                ;;
 308        *)
 309                __git_complete_file
 310                ;;
 311        esac
 312}
 313
 314_git_checkout ()
 315{
 316        local cur="${COMP_WORDS[COMP_CWORD]}"
 317        COMPREPLY=($(compgen -W "-l -b $(__git_refs)" -- "$cur"))
 318}
 319
 320_git_cherry_pick ()
 321{
 322        local cur="${COMP_WORDS[COMP_CWORD]}"
 323        case "$cur" in
 324        --*)
 325                COMPREPLY=($(compgen -W "
 326                        --edit --no-commit
 327                        " -- "$cur"))
 328                ;;
 329        *)
 330                COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
 331                ;;
 332        esac
 333}
 334
 335_git_diff ()
 336{
 337        __git_complete_file
 338}
 339
 340_git_diff_tree ()
 341{
 342        local cur="${COMP_WORDS[COMP_CWORD]}"
 343        COMPREPLY=($(compgen -W "-r -p -M $(__git_refs)" -- "$cur"))
 344}
 345
 346_git_fetch ()
 347{
 348        local cur="${COMP_WORDS[COMP_CWORD]}"
 349
 350        case "${COMP_WORDS[0]},$COMP_CWORD" in
 351        git-fetch*,1)
 352                COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
 353                ;;
 354        git,2)
 355                COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
 356                ;;
 357        *)
 358                case "$cur" in
 359                *:*)
 360                        cur="${cur#*:}"
 361                        COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
 362                        ;;
 363                *)
 364                        local remote
 365                        case "${COMP_WORDS[0]}" in
 366                        git-fetch) remote="${COMP_WORDS[1]}" ;;
 367                        git)       remote="${COMP_WORDS[2]}" ;;
 368                        esac
 369                        COMPREPLY=($(compgen -W "$(__git_refs2 "$remote")" -- "$cur"))
 370                        ;;
 371                esac
 372                ;;
 373        esac
 374}
 375
 376_git_format_patch ()
 377{
 378        local cur="${COMP_WORDS[COMP_CWORD]}"
 379        case "$cur" in
 380        --*)
 381                COMPREPLY=($(compgen -W "
 382                        --stdout --attach --thread
 383                        --output-directory
 384                        --numbered --start-number
 385                        --keep-subject
 386                        --signoff
 387                        --in-reply-to=
 388                        --full-index --binary
 389                        " -- "$cur"))
 390                return
 391                ;;
 392        esac
 393        __git_complete_revlist
 394}
 395
 396_git_ls_remote ()
 397{
 398        local cur="${COMP_WORDS[COMP_CWORD]}"
 399        COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
 400}
 401
 402_git_ls_tree ()
 403{
 404        __git_complete_file
 405}
 406
 407_git_log ()
 408{
 409        local cur="${COMP_WORDS[COMP_CWORD]}"
 410        case "$cur" in
 411        --pretty=*)
 412                COMPREPLY=($(compgen -W "
 413                        oneline short medium full fuller email raw
 414                        " -- "${cur##--pretty=}"))
 415                return
 416                ;;
 417        --*)
 418                COMPREPLY=($(compgen -W "
 419                        --max-count= --max-age= --since= --after=
 420                        --min-age= --before= --until=
 421                        --root --not --topo-order --date-order
 422                        --no-merges
 423                        --abbrev-commit --abbrev=
 424                        --relative-date
 425                        --author= --committer= --grep=
 426                        --all-match
 427                        --pretty= --name-status --name-only
 428                        " -- "$cur"))
 429                return
 430                ;;
 431        esac
 432        __git_complete_revlist
 433}
 434
 435_git_merge ()
 436{
 437        local cur="${COMP_WORDS[COMP_CWORD]}"
 438        case "${COMP_WORDS[COMP_CWORD-1]}" in
 439        -s|--strategy)
 440                COMPREPLY=($(compgen -W "$(__git_merge_strategies)" -- "$cur"))
 441                return
 442        esac
 443        case "$cur" in
 444        --strategy=*)
 445                COMPREPLY=($(compgen -W "$(__git_merge_strategies)" \
 446                        -- "${cur##--strategy=}"))
 447                return
 448                ;;
 449        --*)
 450                COMPREPLY=($(compgen -W "
 451                        --no-commit --no-summary --squash --strategy
 452                        " -- "$cur"))
 453                return
 454        esac
 455        COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
 456}
 457
 458_git_merge_base ()
 459{
 460        local cur="${COMP_WORDS[COMP_CWORD]}"
 461        COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
 462}
 463
 464_git_name_rev ()
 465{
 466        local cur="${COMP_WORDS[COMP_CWORD]}"
 467        COMPREPLY=($(compgen -W "--tags --all --stdin" -- "$cur"))
 468}
 469
 470_git_pull ()
 471{
 472        local cur="${COMP_WORDS[COMP_CWORD]}"
 473
 474        case "${COMP_WORDS[0]},$COMP_CWORD" in
 475        git-pull*,1)
 476                COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
 477                ;;
 478        git,2)
 479                COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
 480                ;;
 481        *)
 482                local remote
 483                case "${COMP_WORDS[0]}" in
 484                git-pull)  remote="${COMP_WORDS[1]}" ;;
 485                git)       remote="${COMP_WORDS[2]}" ;;
 486                esac
 487                COMPREPLY=($(compgen -W "$(__git_refs "$remote")" -- "$cur"))
 488                ;;
 489        esac
 490}
 491
 492_git_push ()
 493{
 494        local cur="${COMP_WORDS[COMP_CWORD]}"
 495
 496        case "${COMP_WORDS[0]},$COMP_CWORD" in
 497        git-push*,1)
 498                COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
 499                ;;
 500        git,2)
 501                COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
 502                ;;
 503        *)
 504                case "$cur" in
 505                *:*)
 506                        local remote
 507                        case "${COMP_WORDS[0]}" in
 508                        git-push)  remote="${COMP_WORDS[1]}" ;;
 509                        git)       remote="${COMP_WORDS[2]}" ;;
 510                        esac
 511                        cur="${cur#*:}"
 512                        COMPREPLY=($(compgen -W "$(__git_refs "$remote")" -- "$cur"))
 513                        ;;
 514                *)
 515                        COMPREPLY=($(compgen -W "$(__git_refs2)" -- "$cur"))
 516                        ;;
 517                esac
 518                ;;
 519        esac
 520}
 521
 522_git_rebase ()
 523{
 524        local cur="${COMP_WORDS[COMP_CWORD]}"
 525        if [ -d .dotest ]; then
 526                COMPREPLY=($(compgen -W "
 527                        --continue --skip --abort
 528                        " -- "$cur"))
 529                return
 530        fi
 531        case "${COMP_WORDS[COMP_CWORD-1]}" in
 532        -s|--strategy)
 533                COMPREPLY=($(compgen -W "$(__git_merge_strategies)" -- "$cur"))
 534                return
 535        esac
 536        case "$cur" in
 537        --strategy=*)
 538                COMPREPLY=($(compgen -W "$(__git_merge_strategies)" \
 539                        -- "${cur##--strategy=}"))
 540                return
 541                ;;
 542        --*)
 543                COMPREPLY=($(compgen -W "
 544                        --onto --merge --strategy
 545                        " -- "$cur"))
 546                return
 547        esac
 548        COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
 549}
 550
 551_git_repo_config ()
 552{
 553        local cur="${COMP_WORDS[COMP_CWORD]}"
 554        local prv="${COMP_WORDS[COMP_CWORD-1]}"
 555        case "$prv" in
 556        branch.*.remote)
 557                COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
 558                return
 559                ;;
 560        branch.*.merge)
 561                COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
 562                return
 563                ;;
 564        remote.*.fetch)
 565                local remote="${prv#remote.}"
 566                remote="${remote%.fetch}"
 567                COMPREPLY=($(compgen -W "$(__git_refs_remotes "$remote")" \
 568                        -- "$cur"))
 569                return
 570                ;;
 571        remote.*.push)
 572                local remote="${prv#remote.}"
 573                remote="${remote%.push}"
 574                COMPREPLY=($(compgen -W "$(git --git-dir="$(__gitdir)" \
 575                        for-each-ref --format='%(refname):%(refname)' \
 576                        refs/heads)" -- "$cur"))
 577                return
 578                ;;
 579        *.*)
 580                COMPREPLY=()
 581                return
 582                ;;
 583        esac
 584        case "$cur" in
 585        --*)
 586                COMPREPLY=($(compgen -W "
 587                        --global --list --replace-all
 588                        --get --get-all --get-regexp
 589                        --unset --unset-all
 590                        " -- "$cur"))
 591                return
 592                ;;
 593        branch.*.*)
 594                local pfx="${cur%.*}."
 595                cur="${cur##*.}"
 596                COMPREPLY=($(compgen -P "$pfx" -W "remote merge" -- "$cur"))
 597                return
 598                ;;
 599        branch.*)
 600                local pfx="${cur%.*}."
 601                cur="${cur#*.}"
 602                COMPREPLY=($(compgen -P "$pfx" -S . \
 603                        -W "$(__git_heads)" -- "$cur"))
 604                return
 605                ;;
 606        remote.*.*)
 607                local pfx="${cur%.*}."
 608                cur="${cur##*.}"
 609                COMPREPLY=($(compgen -P "$pfx" -W "url fetch push" -- "$cur"))
 610                return
 611                ;;
 612        remote.*)
 613                local pfx="${cur%.*}."
 614                cur="${cur#*.}"
 615                COMPREPLY=($(compgen -P "$pfx" -S . \
 616                        -W "$(__git_remotes)" -- "$cur"))
 617                return
 618                ;;
 619        esac
 620        COMPREPLY=($(compgen -W "
 621                apply.whitespace
 622                core.fileMode
 623                core.gitProxy
 624                core.ignoreStat
 625                core.preferSymlinkRefs
 626                core.logAllRefUpdates
 627                core.repositoryFormatVersion
 628                core.sharedRepository
 629                core.warnAmbiguousRefs
 630                core.compression
 631                core.legacyHeaders
 632                i18n.commitEncoding
 633                diff.color
 634                diff.renameLimit
 635                diff.renames
 636                pager.color
 637                status.color
 638                log.showroot
 639                show.difftree
 640                showbranch.default
 641                whatchanged.difftree
 642                http.sslVerify
 643                http.sslCert
 644                http.sslKey
 645                http.sslCAInfo
 646                http.sslCAPath
 647                http.maxRequests
 648                http.lowSpeedLimit http.lowSpeedTime
 649                http.noEPSV
 650                pack.window
 651                repack.useDeltaBaseOffset
 652                pull.octopus pull.twohead
 653                merge.summary
 654                receive.unpackLimit
 655                receive.denyNonFastForwards
 656                user.name user.email
 657                tar.umask
 658                gitcvs.enabled
 659                gitcvs.logfile
 660                branch. remote.
 661        " -- "$cur"))
 662}
 663
 664_git_reset ()
 665{
 666        local cur="${COMP_WORDS[COMP_CWORD]}"
 667        local opt="--mixed --hard --soft"
 668        COMPREPLY=($(compgen -W "$opt $(__git_refs)" -- "$cur"))
 669}
 670
 671_git ()
 672{
 673        local i c=1 command __git_dir
 674
 675        while [ $c -lt $COMP_CWORD ]; do
 676                i="${COMP_WORDS[c]}"
 677                case "$i" in
 678                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
 679                --bare)      __git_dir="." ;;
 680                --version|--help|-p|--paginate) ;;
 681                *) command="$i"; break ;;
 682                esac
 683                c=$((++c))
 684        done
 685
 686        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 687                COMPREPLY=($(compgen -W "
 688                        --git-dir= --version --exec-path
 689                        $(__git_commands)
 690                        $(__git_aliases)
 691                        " -- "${COMP_WORDS[COMP_CWORD]}"))
 692                return;
 693        fi
 694
 695        local expansion=$(__git_aliased_command "$command")
 696        [ "$expansion" ] && command="$expansion"
 697
 698        case "$command" in
 699        branch)      _git_branch ;;
 700        cat-file)    _git_cat_file ;;
 701        checkout)    _git_checkout ;;
 702        cherry-pick) _git_cherry_pick ;;
 703        diff)        _git_diff ;;
 704        diff-tree)   _git_diff_tree ;;
 705        fetch)       _git_fetch ;;
 706        format-patch) _git_format_patch ;;
 707        log)         _git_log ;;
 708        ls-remote)   _git_ls_remote ;;
 709        ls-tree)     _git_ls_tree ;;
 710        merge)       _git_merge;;
 711        merge-base)  _git_merge_base ;;
 712        name-rev)    _git_name_rev ;;
 713        pull)        _git_pull ;;
 714        push)        _git_push ;;
 715        rebase)      _git_rebase ;;
 716        repo-config) _git_repo_config ;;
 717        reset)       _git_reset ;;
 718        show)        _git_log ;;
 719        show-branch) _git_log ;;
 720        whatchanged) _git_log ;;
 721        *)           COMPREPLY=() ;;
 722        esac
 723}
 724
 725_gitk ()
 726{
 727        local cur="${COMP_WORDS[COMP_CWORD]}"
 728        COMPREPLY=($(compgen -W "--all $(__git_refs)" -- "$cur"))
 729}
 730
 731complete -o default -o nospace -F _git git
 732complete -o default            -F _gitk gitk
 733complete -o default            -F _git_branch git-branch
 734complete -o default -o nospace -F _git_cat_file git-cat-file
 735complete -o default            -F _git_checkout git-checkout
 736complete -o default            -F _git_cherry_pick git-cherry-pick
 737complete -o default -o nospace -F _git_diff git-diff
 738complete -o default            -F _git_diff_tree git-diff-tree
 739complete -o default -o nospace -F _git_fetch git-fetch
 740complete -o default -o nospace -F _git_format_patch git-format-patch
 741complete -o default -o nospace -F _git_log git-log
 742complete -o default            -F _git_ls_remote git-ls-remote
 743complete -o default -o nospace -F _git_ls_tree git-ls-tree
 744complete -o default            -F _git_merge git-merge
 745complete -o default            -F _git_merge_base git-merge-base
 746complete -o default            -F _git_name_rev git-name-rev
 747complete -o default -o nospace -F _git_pull git-pull
 748complete -o default -o nospace -F _git_push git-push
 749complete -o default            -F _git_rebase git-rebase
 750complete -o default            -F _git_repo_config git-repo-config
 751complete -o default            -F _git_reset git-reset
 752complete -o default            -F _git_log git-show
 753complete -o default -o nospace -F _git_log git-show-branch
 754complete -o default -o nospace -F _git_log git-whatchanged
 755
 756# The following are necessary only for Cygwin, and only are needed
 757# when the user has tab-completed the executable name and consequently
 758# included the '.exe' suffix.
 759#
 760if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
 761complete -o default -o nospace -F _git git.exe
 762complete -o default            -F _git_branch git-branch.exe
 763complete -o default -o nospace -F _git_cat_file git-cat-file.exe
 764complete -o default -o nospace -F _git_diff git-diff.exe
 765complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
 766complete -o default -o nospace -F _git_format_patch git-format-patch.exe
 767complete -o default -o nospace -F _git_log git-log.exe
 768complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
 769complete -o default            -F _git_merge_base git-merge-base.exe
 770complete -o default            -F _git_name_rev git-name-rev.exe
 771complete -o default -o nospace -F _git_push git-push.exe
 772complete -o default            -F _git_repo_config git-repo-config
 773complete -o default -o nospace -F _git_log git-show.exe
 774complete -o default -o nospace -F _git_log git-show-branch.exe
 775complete -o default -o nospace -F _git_log git-whatchanged.exe
 776fi