contrib / completion / git-completion.bashon commit Merge branch 'am/maint-push-doc' (664a334)
   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_common_options="--stat --numstat --shortstat --summary
 777                        --patch-with-stat --name-only --name-status --color
 778                        --no-color --color-words --no-renames --check
 779                        --full-index --binary --abbrev --diff-filter=
 780                        --find-copies-harder
 781                        --text --ignore-space-at-eol --ignore-space-change
 782                        --ignore-all-space --exit-code --quiet --ext-diff
 783                        --no-ext-diff
 784                        --no-prefix --src-prefix= --dst-prefix=
 785                        --inter-hunk-context=
 786                        --raw
 787"
 788
 789_git_diff ()
 790{
 791        __git_has_doubledash && return
 792
 793        local cur="${COMP_WORDS[COMP_CWORD]}"
 794        case "$cur" in
 795        --*)
 796                __gitcomp "--cached --pickaxe-all --pickaxe-regex
 797                        --base --ours --theirs
 798                        $__git_diff_common_options
 799                        "
 800                return
 801                ;;
 802        esac
 803        __git_complete_file
 804}
 805
 806_git_fetch ()
 807{
 808        local cur="${COMP_WORDS[COMP_CWORD]}"
 809
 810        if [ "$COMP_CWORD" = 2 ]; then
 811                __gitcomp "$(__git_remotes)"
 812        else
 813                case "$cur" in
 814                *:*)
 815                        local pfx=""
 816                        case "$COMP_WORDBREAKS" in
 817                        *:*) : great ;;
 818                        *)   pfx="${cur%%:*}:" ;;
 819                        esac
 820                        __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
 821                        ;;
 822                *)
 823                        __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
 824                        ;;
 825                esac
 826        fi
 827}
 828
 829_git_format_patch ()
 830{
 831        local cur="${COMP_WORDS[COMP_CWORD]}"
 832        case "$cur" in
 833        --*)
 834                __gitcomp "
 835                        --stdout --attach --thread
 836                        --output-directory
 837                        --numbered --start-number
 838                        --numbered-files
 839                        --keep-subject
 840                        --signoff
 841                        --in-reply-to=
 842                        --full-index --binary
 843                        --not --all
 844                        --cover-letter
 845                        --no-prefix --src-prefix= --dst-prefix=
 846                        --inline --suffix= --ignore-if-in-upstream
 847                        --subject-prefix=
 848                        "
 849                return
 850                ;;
 851        esac
 852        __git_complete_revlist
 853}
 854
 855_git_gc ()
 856{
 857        local cur="${COMP_WORDS[COMP_CWORD]}"
 858        case "$cur" in
 859        --*)
 860                __gitcomp "--prune --aggressive"
 861                return
 862                ;;
 863        esac
 864        COMPREPLY=()
 865}
 866
 867_git_grep ()
 868{
 869        __git_has_doubledash && return
 870
 871        local cur="${COMP_WORDS[COMP_CWORD]}"
 872        case "$cur" in
 873        --*)
 874                __gitcomp "
 875                        --cached
 876                        --text --ignore-case --word-regexp --invert-match
 877                        --full-name
 878                        --extended-regexp --basic-regexp --fixed-strings
 879                        --files-with-matches --name-only
 880                        --files-without-match
 881                        --count
 882                        --and --or --not --all-match
 883                        "
 884                return
 885                ;;
 886        esac
 887        COMPREPLY=()
 888}
 889
 890_git_help ()
 891{
 892        local cur="${COMP_WORDS[COMP_CWORD]}"
 893        case "$cur" in
 894        --*)
 895                __gitcomp "--all --info --man --web"
 896                return
 897                ;;
 898        esac
 899        __gitcomp "$(__git_all_commands)
 900                attributes cli core-tutorial cvs-migration
 901                diffcore gitk glossary hooks ignore modules
 902                repository-layout tutorial tutorial-2
 903                workflows
 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_pretty_formats="oneline short medium full fuller email raw format:"
 956
 957_git_log ()
 958{
 959        __git_has_doubledash && return
 960
 961        local cur="${COMP_WORDS[COMP_CWORD]}"
 962        case "$cur" in
 963        --pretty=*)
 964                __gitcomp "$__git_log_pretty_formats
 965                        " "" "${cur##--pretty=}"
 966                return
 967                ;;
 968        --date=*)
 969                __gitcomp "
 970                        relative iso8601 rfc2822 short local default
 971                " "" "${cur##--date=}"
 972                return
 973                ;;
 974        --*)
 975                __gitcomp "
 976                        --max-count= --max-age= --since= --after=
 977                        --min-age= --before= --until=
 978                        --root --topo-order --date-order --reverse
 979                        --no-merges --follow
 980                        --abbrev-commit --abbrev=
 981                        --relative-date --date=
 982                        --author= --committer= --grep=
 983                        --all-match
 984                        --pretty=
 985                        --not --all
 986                        --left-right --cherry-pick
 987                        --graph
 988                        --decorate
 989                        --walk-reflogs
 990                        --parents --children --full-history
 991                        --merge
 992                        $__git_diff_common_options
 993                        --pickaxe-all --pickaxe-regex
 994                        "
 995                return
 996                ;;
 997        esac
 998        __git_complete_revlist
 999}
1000
1001_git_merge ()
1002{
1003        local cur="${COMP_WORDS[COMP_CWORD]}"
1004        case "${COMP_WORDS[COMP_CWORD-1]}" in
1005        -s|--strategy)
1006                __gitcomp "$(__git_merge_strategies)"
1007                return
1008        esac
1009        case "$cur" in
1010        --strategy=*)
1011                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1012                return
1013                ;;
1014        --*)
1015                __gitcomp "
1016                        --no-commit --no-stat --log --no-log --squash --strategy
1017                        "
1018                return
1019        esac
1020        __gitcomp "$(__git_refs)"
1021}
1022
1023_git_mergetool ()
1024{
1025        local cur="${COMP_WORDS[COMP_CWORD]}"
1026        case "$cur" in
1027        --tool=*)
1028                __gitcomp "
1029                        kdiff3 tkdiff meld xxdiff emerge
1030                        vimdiff gvimdiff ecmerge opendiff
1031                        " "" "${cur##--tool=}"
1032                return
1033                ;;
1034        --*)
1035                __gitcomp "--tool="
1036                return
1037                ;;
1038        esac
1039        COMPREPLY=()
1040}
1041
1042_git_merge_base ()
1043{
1044        __gitcomp "$(__git_refs)"
1045}
1046
1047_git_mv ()
1048{
1049        local cur="${COMP_WORDS[COMP_CWORD]}"
1050        case "$cur" in
1051        --*)
1052                __gitcomp "--dry-run"
1053                return
1054                ;;
1055        esac
1056        COMPREPLY=()
1057}
1058
1059_git_name_rev ()
1060{
1061        __gitcomp "--tags --all --stdin"
1062}
1063
1064_git_pull ()
1065{
1066        local cur="${COMP_WORDS[COMP_CWORD]}"
1067
1068        if [ "$COMP_CWORD" = 2 ]; then
1069                __gitcomp "$(__git_remotes)"
1070        else
1071                __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1072        fi
1073}
1074
1075_git_push ()
1076{
1077        local cur="${COMP_WORDS[COMP_CWORD]}"
1078
1079        if [ "$COMP_CWORD" = 2 ]; then
1080                __gitcomp "$(__git_remotes)"
1081        else
1082                case "$cur" in
1083                *:*)
1084                        local pfx=""
1085                        case "$COMP_WORDBREAKS" in
1086                        *:*) : great ;;
1087                        *)   pfx="${cur%%:*}:" ;;
1088                        esac
1089
1090                        __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1091                        ;;
1092                +*)
1093                        __gitcomp "$(__git_refs)" + "${cur#+}"
1094                        ;;
1095                *)
1096                        __gitcomp "$(__git_refs)"
1097                        ;;
1098                esac
1099        fi
1100}
1101
1102_git_rebase ()
1103{
1104        local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1105        if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1106                __gitcomp "--continue --skip --abort"
1107                return
1108        fi
1109        case "${COMP_WORDS[COMP_CWORD-1]}" in
1110        -s|--strategy)
1111                __gitcomp "$(__git_merge_strategies)"
1112                return
1113        esac
1114        case "$cur" in
1115        --strategy=*)
1116                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1117                return
1118                ;;
1119        --*)
1120                __gitcomp "--onto --merge --strategy --interactive"
1121                return
1122        esac
1123        __gitcomp "$(__git_refs)"
1124}
1125
1126_git_send_email ()
1127{
1128        local cur="${COMP_WORDS[COMP_CWORD]}"
1129        case "$cur" in
1130        --*)
1131                __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1132                        --dry-run --envelope-sender --from --identity
1133                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1134                        --no-suppress-from --no-thread --quiet
1135                        --signed-off-by-cc --smtp-pass --smtp-server
1136                        --smtp-server-port --smtp-ssl --smtp-user --subject
1137                        --suppress-cc --suppress-from --thread --to
1138                        --validate --no-validate"
1139                return
1140                ;;
1141        esac
1142        COMPREPLY=()
1143}
1144
1145_git_config ()
1146{
1147        local cur="${COMP_WORDS[COMP_CWORD]}"
1148        local prv="${COMP_WORDS[COMP_CWORD-1]}"
1149        case "$prv" in
1150        branch.*.remote)
1151                __gitcomp "$(__git_remotes)"
1152                return
1153                ;;
1154        branch.*.merge)
1155                __gitcomp "$(__git_refs)"
1156                return
1157                ;;
1158        remote.*.fetch)
1159                local remote="${prv#remote.}"
1160                remote="${remote%.fetch}"
1161                __gitcomp "$(__git_refs_remotes "$remote")"
1162                return
1163                ;;
1164        remote.*.push)
1165                local remote="${prv#remote.}"
1166                remote="${remote%.push}"
1167                __gitcomp "$(git --git-dir="$(__gitdir)" \
1168                        for-each-ref --format='%(refname):%(refname)' \
1169                        refs/heads)"
1170                return
1171                ;;
1172        pull.twohead|pull.octopus)
1173                __gitcomp "$(__git_merge_strategies)"
1174                return
1175                ;;
1176        color.branch|color.diff|color.status)
1177                __gitcomp "always never auto"
1178                return
1179                ;;
1180        color.*.*)
1181                __gitcomp "
1182                        normal black red green yellow blue magenta cyan white
1183                        bold dim ul blink reverse
1184                        "
1185                return
1186                ;;
1187        *.*)
1188                COMPREPLY=()
1189                return
1190                ;;
1191        esac
1192        case "$cur" in
1193        --*)
1194                __gitcomp "
1195                        --global --system --file=
1196                        --list --replace-all
1197                        --get --get-all --get-regexp
1198                        --add --unset --unset-all
1199                        --remove-section --rename-section
1200                        "
1201                return
1202                ;;
1203        branch.*.*)
1204                local pfx="${cur%.*}."
1205                cur="${cur##*.}"
1206                __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1207                return
1208                ;;
1209        branch.*)
1210                local pfx="${cur%.*}."
1211                cur="${cur#*.}"
1212                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1213                return
1214                ;;
1215        remote.*.*)
1216                local pfx="${cur%.*}."
1217                cur="${cur##*.}"
1218                __gitcomp "
1219                        url proxy fetch push mirror skipDefaultUpdate
1220                        receivepack uploadpack tagopt
1221                        " "$pfx" "$cur"
1222                return
1223                ;;
1224        remote.*)
1225                local pfx="${cur%.*}."
1226                cur="${cur#*.}"
1227                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1228                return
1229                ;;
1230        esac
1231        __gitcomp "
1232                apply.whitespace
1233                branch.autosetupmerge
1234                branch.autosetuprebase
1235                clean.requireForce
1236                color.branch
1237                color.branch.current
1238                color.branch.local
1239                color.branch.plain
1240                color.branch.remote
1241                color.diff
1242                color.diff.commit
1243                color.diff.frag
1244                color.diff.meta
1245                color.diff.new
1246                color.diff.old
1247                color.diff.plain
1248                color.diff.whitespace
1249                color.interactive
1250                color.interactive.header
1251                color.interactive.help
1252                color.interactive.prompt
1253                color.pager
1254                color.status
1255                color.status.added
1256                color.status.changed
1257                color.status.header
1258                color.status.nobranch
1259                color.status.untracked
1260                color.status.updated
1261                color.ui
1262                commit.template
1263                core.autocrlf
1264                core.bare
1265                core.compression
1266                core.deltaBaseCacheLimit
1267                core.editor
1268                core.excludesfile
1269                core.fileMode
1270                core.fsyncobjectfiles
1271                core.gitProxy
1272                core.ignoreCygwinFSTricks
1273                core.ignoreStat
1274                core.logAllRefUpdates
1275                core.loosecompression
1276                core.packedGitLimit
1277                core.packedGitWindowSize
1278                core.pager
1279                core.preferSymlinkRefs
1280                core.preloadindex
1281                core.quotepath
1282                core.repositoryFormatVersion
1283                core.safecrlf
1284                core.sharedRepository
1285                core.symlinks
1286                core.trustctime
1287                core.warnAmbiguousRefs
1288                core.whitespace
1289                core.worktree
1290                diff.autorefreshindex
1291                diff.external
1292                diff.mnemonicprefix
1293                diff.renameLimit
1294                diff.renameLimit.
1295                diff.renames
1296                fetch.unpackLimit
1297                format.headers
1298                format.numbered
1299                format.pretty
1300                format.suffix
1301                gc.aggressiveWindow
1302                gc.auto
1303                gc.autopacklimit
1304                gc.packrefs
1305                gc.pruneexpire
1306                gc.reflogexpire
1307                gc.reflogexpireunreachable
1308                gc.rerereresolved
1309                gc.rerereunresolved
1310                gitcvs.allbinary
1311                gitcvs.dbTableNamePrefix
1312                gitcvs.dbdriver
1313                gitcvs.dbname
1314                gitcvs.dbpass
1315                gitcvs.dbuser
1316                gitcvs.enabled
1317                gitcvs.logfile
1318                gitcvs.usecrlfattr
1319                gui.blamehistoryctx
1320                gui.commitmsgwidth
1321                gui.copyblamethreshold
1322                gui.diffcontext
1323                gui.encoding
1324                gui.fastcopyblame
1325                gui.matchtrackingbranch
1326                gui.newbranchtemplate
1327                gui.pruneduringfetch
1328                gui.spellingdictionary
1329                gui.trustmtime
1330                help.autocorrect
1331                help.browser
1332                help.format
1333                http.lowSpeedLimit
1334                http.lowSpeedTime
1335                http.maxRequests
1336                http.noEPSV
1337                http.proxy
1338                http.sslCAInfo
1339                http.sslCAPath
1340                http.sslCert
1341                http.sslKey
1342                http.sslVerify
1343                i18n.commitEncoding
1344                i18n.logOutputEncoding
1345                instaweb.browser
1346                instaweb.httpd
1347                instaweb.local
1348                instaweb.modulepath
1349                instaweb.port
1350                log.date
1351                log.showroot
1352                man.viewer
1353                merge.conflictstyle
1354                merge.log
1355                merge.renameLimit
1356                merge.stat
1357                merge.tool
1358                merge.verbosity
1359                mergetool.keepBackup
1360                pack.compression
1361                pack.deltaCacheLimit
1362                pack.deltaCacheSize
1363                pack.depth
1364                pack.indexVersion
1365                pack.packSizeLimit
1366                pack.threads
1367                pack.window
1368                pack.windowMemory
1369                pull.octopus
1370                pull.twohead
1371                receive.denyCurrentBranch
1372                receive.denyDeletes
1373                receive.denyNonFastForwards
1374                receive.fsckObjects
1375                receive.unpackLimit
1376                repack.usedeltabaseoffset
1377                rerere.autoupdate
1378                rerere.enabled
1379                showbranch.default
1380                status.relativePaths
1381                status.showUntrackedFiles
1382                tar.umask
1383                transfer.unpackLimit
1384                user.email
1385                user.name
1386                user.signingkey
1387                web.browser
1388                branch. remote.
1389        "
1390}
1391
1392_git_remote ()
1393{
1394        local subcommands="add rename rm show prune update"
1395        local subcommand="$(__git_find_subcommand "$subcommands")"
1396        if [ -z "$subcommand" ]; then
1397                __gitcomp "$subcommands"
1398                return
1399        fi
1400
1401        case "$subcommand" in
1402        rename|rm|show|prune)
1403                __gitcomp "$(__git_remotes)"
1404                ;;
1405        update)
1406                local i c='' IFS=$'\n'
1407                for i in $(git --git-dir="$(__gitdir)" config --list); do
1408                        case "$i" in
1409                        remotes.*)
1410                                i="${i#remotes.}"
1411                                c="$c ${i/=*/}"
1412                                ;;
1413                        esac
1414                done
1415                __gitcomp "$c"
1416                ;;
1417        *)
1418                COMPREPLY=()
1419                ;;
1420        esac
1421}
1422
1423_git_reset ()
1424{
1425        __git_has_doubledash && return
1426
1427        local cur="${COMP_WORDS[COMP_CWORD]}"
1428        case "$cur" in
1429        --*)
1430                __gitcomp "--merge --mixed --hard --soft"
1431                return
1432                ;;
1433        esac
1434        __gitcomp "$(__git_refs)"
1435}
1436
1437_git_revert ()
1438{
1439        local cur="${COMP_WORDS[COMP_CWORD]}"
1440        case "$cur" in
1441        --*)
1442                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1443                return
1444                ;;
1445        esac
1446        __gitcomp "$(__git_refs)"
1447}
1448
1449_git_rm ()
1450{
1451        __git_has_doubledash && return
1452
1453        local cur="${COMP_WORDS[COMP_CWORD]}"
1454        case "$cur" in
1455        --*)
1456                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1457                return
1458                ;;
1459        esac
1460        COMPREPLY=()
1461}
1462
1463_git_shortlog ()
1464{
1465        __git_has_doubledash && return
1466
1467        local cur="${COMP_WORDS[COMP_CWORD]}"
1468        case "$cur" in
1469        --*)
1470                __gitcomp "
1471                        --max-count= --max-age= --since= --after=
1472                        --min-age= --before= --until=
1473                        --no-merges
1474                        --author= --committer= --grep=
1475                        --all-match
1476                        --not --all
1477                        --numbered --summary
1478                        "
1479                return
1480                ;;
1481        esac
1482        __git_complete_revlist
1483}
1484
1485_git_show ()
1486{
1487        __git_has_doubledash && return
1488
1489        local cur="${COMP_WORDS[COMP_CWORD]}"
1490        case "$cur" in
1491        --pretty=*)
1492                __gitcomp "$__git_log_pretty_formats
1493                        " "" "${cur##--pretty=}"
1494                return
1495                ;;
1496        --*)
1497                __gitcomp "--pretty=
1498                        $__git_diff_common_options
1499                        "
1500                return
1501                ;;
1502        esac
1503        __git_complete_file
1504}
1505
1506_git_show_branch ()
1507{
1508        local cur="${COMP_WORDS[COMP_CWORD]}"
1509        case "$cur" in
1510        --*)
1511                __gitcomp "
1512                        --all --remotes --topo-order --current --more=
1513                        --list --independent --merge-base --no-name
1514                        --sha1-name --topics --reflog
1515                        "
1516                return
1517                ;;
1518        esac
1519        __git_complete_revlist
1520}
1521
1522_git_stash ()
1523{
1524        local subcommands='save list show apply clear drop pop create branch'
1525        local subcommand="$(__git_find_subcommand "$subcommands")"
1526        if [ -z "$subcommand" ]; then
1527                __gitcomp "$subcommands"
1528        else
1529                local cur="${COMP_WORDS[COMP_CWORD]}"
1530                case "$subcommand,$cur" in
1531                save,--*)
1532                        __gitcomp "--keep-index"
1533                        ;;
1534                apply,--*)
1535                        __gitcomp "--index"
1536                        ;;
1537                show,--*|drop,--*|pop,--*|branch,--*)
1538                        COMPREPLY=()
1539                        ;;
1540                show,*|apply,*|drop,*|pop,*|branch,*)
1541                        __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1542                                        | sed -n -e 's/:.*//p')"
1543                        ;;
1544                *)
1545                        COMPREPLY=()
1546                        ;;
1547                esac
1548        fi
1549}
1550
1551_git_submodule ()
1552{
1553        __git_has_doubledash && return
1554
1555        local subcommands="add status init update summary foreach sync"
1556        if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1557                local cur="${COMP_WORDS[COMP_CWORD]}"
1558                case "$cur" in
1559                --*)
1560                        __gitcomp "--quiet --cached"
1561                        ;;
1562                *)
1563                        __gitcomp "$subcommands"
1564                        ;;
1565                esac
1566                return
1567        fi
1568}
1569
1570_git_svn ()
1571{
1572        local subcommands="
1573                init fetch clone rebase dcommit log find-rev
1574                set-tree commit-diff info create-ignore propget
1575                proplist show-ignore show-externals
1576                "
1577        local subcommand="$(__git_find_subcommand "$subcommands")"
1578        if [ -z "$subcommand" ]; then
1579                __gitcomp "$subcommands"
1580        else
1581                local remote_opts="--username= --config-dir= --no-auth-cache"
1582                local fc_opts="
1583                        --follow-parent --authors-file= --repack=
1584                        --no-metadata --use-svm-props --use-svnsync-props
1585                        --log-window-size= --no-checkout --quiet
1586                        --repack-flags --user-log-author --localtime $remote_opts
1587                        "
1588                local init_opts="
1589                        --template= --shared= --trunk= --tags=
1590                        --branches= --stdlayout --minimize-url
1591                        --no-metadata --use-svm-props --use-svnsync-props
1592                        --rewrite-root= $remote_opts
1593                        "
1594                local cmt_opts="
1595                        --edit --rmdir --find-copies-harder --copy-similarity=
1596                        "
1597
1598                local cur="${COMP_WORDS[COMP_CWORD]}"
1599                case "$subcommand,$cur" in
1600                fetch,--*)
1601                        __gitcomp "--revision= --fetch-all $fc_opts"
1602                        ;;
1603                clone,--*)
1604                        __gitcomp "--revision= $fc_opts $init_opts"
1605                        ;;
1606                init,--*)
1607                        __gitcomp "$init_opts"
1608                        ;;
1609                dcommit,--*)
1610                        __gitcomp "
1611                                --merge --strategy= --verbose --dry-run
1612                                --fetch-all --no-rebase $cmt_opts $fc_opts
1613                                "
1614                        ;;
1615                set-tree,--*)
1616                        __gitcomp "--stdin $cmt_opts $fc_opts"
1617                        ;;
1618                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1619                show-externals,--*)
1620                        __gitcomp "--revision="
1621                        ;;
1622                log,--*)
1623                        __gitcomp "
1624                                --limit= --revision= --verbose --incremental
1625                                --oneline --show-commit --non-recursive
1626                                --authors-file=
1627                                "
1628                        ;;
1629                rebase,--*)
1630                        __gitcomp "
1631                                --merge --verbose --strategy= --local
1632                                --fetch-all $fc_opts
1633                                "
1634                        ;;
1635                commit-diff,--*)
1636                        __gitcomp "--message= --file= --revision= $cmt_opts"
1637                        ;;
1638                info,--*)
1639                        __gitcomp "--url"
1640                        ;;
1641                *)
1642                        COMPREPLY=()
1643                        ;;
1644                esac
1645        fi
1646}
1647
1648_git_tag ()
1649{
1650        local i c=1 f=0
1651        while [ $c -lt $COMP_CWORD ]; do
1652                i="${COMP_WORDS[c]}"
1653                case "$i" in
1654                -d|-v)
1655                        __gitcomp "$(__git_tags)"
1656                        return
1657                        ;;
1658                -f)
1659                        f=1
1660                        ;;
1661                esac
1662                c=$((++c))
1663        done
1664
1665        case "${COMP_WORDS[COMP_CWORD-1]}" in
1666        -m|-F)
1667                COMPREPLY=()
1668                ;;
1669        -*|tag)
1670                if [ $f = 1 ]; then
1671                        __gitcomp "$(__git_tags)"
1672                else
1673                        COMPREPLY=()
1674                fi
1675                ;;
1676        *)
1677                __gitcomp "$(__git_refs)"
1678                ;;
1679        esac
1680}
1681
1682_git ()
1683{
1684        local i c=1 command __git_dir
1685
1686        while [ $c -lt $COMP_CWORD ]; do
1687                i="${COMP_WORDS[c]}"
1688                case "$i" in
1689                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1690                --bare)      __git_dir="." ;;
1691                --version|-p|--paginate) ;;
1692                --help) command="help"; break ;;
1693                *) command="$i"; break ;;
1694                esac
1695                c=$((++c))
1696        done
1697
1698        if [ -z "$command" ]; then
1699                case "${COMP_WORDS[COMP_CWORD]}" in
1700                --*)   __gitcomp "
1701                        --paginate
1702                        --no-pager
1703                        --git-dir=
1704                        --bare
1705                        --version
1706                        --exec-path
1707                        --work-tree=
1708                        --help
1709                        "
1710                        ;;
1711                *)     __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1712                esac
1713                return
1714        fi
1715
1716        local expansion=$(__git_aliased_command "$command")
1717        [ "$expansion" ] && command="$expansion"
1718
1719        case "$command" in
1720        am)          _git_am ;;
1721        add)         _git_add ;;
1722        apply)       _git_apply ;;
1723        archive)     _git_archive ;;
1724        bisect)      _git_bisect ;;
1725        bundle)      _git_bundle ;;
1726        branch)      _git_branch ;;
1727        checkout)    _git_checkout ;;
1728        cherry)      _git_cherry ;;
1729        cherry-pick) _git_cherry_pick ;;
1730        clean)       _git_clean ;;
1731        clone)       _git_clone ;;
1732        commit)      _git_commit ;;
1733        config)      _git_config ;;
1734        describe)    _git_describe ;;
1735        diff)        _git_diff ;;
1736        fetch)       _git_fetch ;;
1737        format-patch) _git_format_patch ;;
1738        gc)          _git_gc ;;
1739        grep)        _git_grep ;;
1740        help)        _git_help ;;
1741        init)        _git_init ;;
1742        log)         _git_log ;;
1743        ls-files)    _git_ls_files ;;
1744        ls-remote)   _git_ls_remote ;;
1745        ls-tree)     _git_ls_tree ;;
1746        merge)       _git_merge;;
1747        mergetool)   _git_mergetool;;
1748        merge-base)  _git_merge_base ;;
1749        mv)          _git_mv ;;
1750        name-rev)    _git_name_rev ;;
1751        pull)        _git_pull ;;
1752        push)        _git_push ;;
1753        rebase)      _git_rebase ;;
1754        remote)      _git_remote ;;
1755        reset)       _git_reset ;;
1756        revert)      _git_revert ;;
1757        rm)          _git_rm ;;
1758        send-email)  _git_send_email ;;
1759        shortlog)    _git_shortlog ;;
1760        show)        _git_show ;;
1761        show-branch) _git_show_branch ;;
1762        stash)       _git_stash ;;
1763        stage)       _git_add ;;
1764        submodule)   _git_submodule ;;
1765        svn)         _git_svn ;;
1766        tag)         _git_tag ;;
1767        whatchanged) _git_log ;;
1768        *)           COMPREPLY=() ;;
1769        esac
1770}
1771
1772_gitk ()
1773{
1774        __git_has_doubledash && return
1775
1776        local cur="${COMP_WORDS[COMP_CWORD]}"
1777        local g="$(git rev-parse --git-dir 2>/dev/null)"
1778        local merge=""
1779        if [ -f $g/MERGE_HEAD ]; then
1780                merge="--merge"
1781        fi
1782        case "$cur" in
1783        --*)
1784                __gitcomp "--not --all $merge"
1785                return
1786                ;;
1787        esac
1788        __git_complete_revlist
1789}
1790
1791complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1792        || complete -o default -o nospace -F _git git
1793complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1794        || complete -o default -o nospace -F _gitk gitk
1795
1796# The following are necessary only for Cygwin, and only are needed
1797# when the user has tab-completed the executable name and consequently
1798# included the '.exe' suffix.
1799#
1800if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1801complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1802        || complete -o default -o nospace -F _git git.exe
1803fi