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