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