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