0bb768f1c10494128fce8ecd496efed4cfb9c211
   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                        --commit --stat --no-squash --ff --no-ff
1041                        "
1042                return
1043        esac
1044        __gitcomp "$(__git_refs)"
1045}
1046
1047_git_mergetool ()
1048{
1049        local cur="${COMP_WORDS[COMP_CWORD]}"
1050        case "$cur" in
1051        --tool=*)
1052                __gitcomp "
1053                        kdiff3 tkdiff meld xxdiff emerge
1054                        vimdiff gvimdiff ecmerge opendiff
1055                        " "" "${cur##--tool=}"
1056                return
1057                ;;
1058        --*)
1059                __gitcomp "--tool="
1060                return
1061                ;;
1062        esac
1063        COMPREPLY=()
1064}
1065
1066_git_merge_base ()
1067{
1068        __gitcomp "$(__git_refs)"
1069}
1070
1071_git_mv ()
1072{
1073        local cur="${COMP_WORDS[COMP_CWORD]}"
1074        case "$cur" in
1075        --*)
1076                __gitcomp "--dry-run"
1077                return
1078                ;;
1079        esac
1080        COMPREPLY=()
1081}
1082
1083_git_name_rev ()
1084{
1085        __gitcomp "--tags --all --stdin"
1086}
1087
1088_git_pull ()
1089{
1090        local cur="${COMP_WORDS[COMP_CWORD]}"
1091
1092        if [ "$COMP_CWORD" = 2 ]; then
1093                __gitcomp "$(__git_remotes)"
1094        else
1095                __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1096        fi
1097}
1098
1099_git_push ()
1100{
1101        local cur="${COMP_WORDS[COMP_CWORD]}"
1102
1103        if [ "$COMP_CWORD" = 2 ]; then
1104                __gitcomp "$(__git_remotes)"
1105        else
1106                case "$cur" in
1107                *:*)
1108                        local pfx=""
1109                        case "$COMP_WORDBREAKS" in
1110                        *:*) : great ;;
1111                        *)   pfx="${cur%%:*}:" ;;
1112                        esac
1113
1114                        __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1115                        ;;
1116                +*)
1117                        __gitcomp "$(__git_refs)" + "${cur#+}"
1118                        ;;
1119                *)
1120                        __gitcomp "$(__git_refs)"
1121                        ;;
1122                esac
1123        fi
1124}
1125
1126_git_rebase ()
1127{
1128        local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1129        if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1130                __gitcomp "--continue --skip --abort"
1131                return
1132        fi
1133        case "${COMP_WORDS[COMP_CWORD-1]}" in
1134        -s|--strategy)
1135                __gitcomp "$(__git_merge_strategies)"
1136                return
1137        esac
1138        case "$cur" in
1139        --strategy=*)
1140                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1141                return
1142                ;;
1143        --*)
1144                __gitcomp "--onto --merge --strategy --interactive"
1145                return
1146        esac
1147        __gitcomp "$(__git_refs)"
1148}
1149
1150_git_send_email ()
1151{
1152        local cur="${COMP_WORDS[COMP_CWORD]}"
1153        case "$cur" in
1154        --*)
1155                __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1156                        --dry-run --envelope-sender --from --identity
1157                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1158                        --no-suppress-from --no-thread --quiet
1159                        --signed-off-by-cc --smtp-pass --smtp-server
1160                        --smtp-server-port --smtp-ssl --smtp-user --subject
1161                        --suppress-cc --suppress-from --thread --to
1162                        --validate --no-validate"
1163                return
1164                ;;
1165        esac
1166        COMPREPLY=()
1167}
1168
1169_git_config ()
1170{
1171        local cur="${COMP_WORDS[COMP_CWORD]}"
1172        local prv="${COMP_WORDS[COMP_CWORD-1]}"
1173        case "$prv" in
1174        branch.*.remote)
1175                __gitcomp "$(__git_remotes)"
1176                return
1177                ;;
1178        branch.*.merge)
1179                __gitcomp "$(__git_refs)"
1180                return
1181                ;;
1182        remote.*.fetch)
1183                local remote="${prv#remote.}"
1184                remote="${remote%.fetch}"
1185                __gitcomp "$(__git_refs_remotes "$remote")"
1186                return
1187                ;;
1188        remote.*.push)
1189                local remote="${prv#remote.}"
1190                remote="${remote%.push}"
1191                __gitcomp "$(git --git-dir="$(__gitdir)" \
1192                        for-each-ref --format='%(refname):%(refname)' \
1193                        refs/heads)"
1194                return
1195                ;;
1196        pull.twohead|pull.octopus)
1197                __gitcomp "$(__git_merge_strategies)"
1198                return
1199                ;;
1200        color.branch|color.diff|color.interactive|color.status|color.ui)
1201                __gitcomp "always never auto"
1202                return
1203                ;;
1204        color.pager)
1205                __gitcomp "false true"
1206                return
1207                ;;
1208        color.*.*)
1209                __gitcomp "
1210                        normal black red green yellow blue magenta cyan white
1211                        bold dim ul blink reverse
1212                        "
1213                return
1214                ;;
1215        *.*)
1216                COMPREPLY=()
1217                return
1218                ;;
1219        esac
1220        case "$cur" in
1221        --*)
1222                __gitcomp "
1223                        --global --system --file=
1224                        --list --replace-all
1225                        --get --get-all --get-regexp
1226                        --add --unset --unset-all
1227                        --remove-section --rename-section
1228                        "
1229                return
1230                ;;
1231        branch.*.*)
1232                local pfx="${cur%.*}."
1233                cur="${cur##*.}"
1234                __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1235                return
1236                ;;
1237        branch.*)
1238                local pfx="${cur%.*}."
1239                cur="${cur#*.}"
1240                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1241                return
1242                ;;
1243        remote.*.*)
1244                local pfx="${cur%.*}."
1245                cur="${cur##*.}"
1246                __gitcomp "
1247                        url proxy fetch push mirror skipDefaultUpdate
1248                        receivepack uploadpack tagopt
1249                        " "$pfx" "$cur"
1250                return
1251                ;;
1252        remote.*)
1253                local pfx="${cur%.*}."
1254                cur="${cur#*.}"
1255                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1256                return
1257                ;;
1258        esac
1259        __gitcomp "
1260                apply.whitespace
1261                branch.autosetupmerge
1262                branch.autosetuprebase
1263                clean.requireForce
1264                color.branch
1265                color.branch.current
1266                color.branch.local
1267                color.branch.plain
1268                color.branch.remote
1269                color.diff
1270                color.diff.commit
1271                color.diff.frag
1272                color.diff.meta
1273                color.diff.new
1274                color.diff.old
1275                color.diff.plain
1276                color.diff.whitespace
1277                color.interactive
1278                color.interactive.header
1279                color.interactive.help
1280                color.interactive.prompt
1281                color.pager
1282                color.status
1283                color.status.added
1284                color.status.changed
1285                color.status.header
1286                color.status.nobranch
1287                color.status.untracked
1288                color.status.updated
1289                color.ui
1290                commit.template
1291                core.autocrlf
1292                core.bare
1293                core.compression
1294                core.deltaBaseCacheLimit
1295                core.editor
1296                core.excludesfile
1297                core.fileMode
1298                core.fsyncobjectfiles
1299                core.gitProxy
1300                core.ignoreCygwinFSTricks
1301                core.ignoreStat
1302                core.logAllRefUpdates
1303                core.loosecompression
1304                core.packedGitLimit
1305                core.packedGitWindowSize
1306                core.pager
1307                core.preferSymlinkRefs
1308                core.preloadindex
1309                core.quotepath
1310                core.repositoryFormatVersion
1311                core.safecrlf
1312                core.sharedRepository
1313                core.symlinks
1314                core.trustctime
1315                core.warnAmbiguousRefs
1316                core.whitespace
1317                core.worktree
1318                diff.autorefreshindex
1319                diff.external
1320                diff.mnemonicprefix
1321                diff.renameLimit
1322                diff.renameLimit.
1323                diff.renames
1324                fetch.unpackLimit
1325                format.headers
1326                format.numbered
1327                format.pretty
1328                format.suffix
1329                gc.aggressiveWindow
1330                gc.auto
1331                gc.autopacklimit
1332                gc.packrefs
1333                gc.pruneexpire
1334                gc.reflogexpire
1335                gc.reflogexpireunreachable
1336                gc.rerereresolved
1337                gc.rerereunresolved
1338                gitcvs.allbinary
1339                gitcvs.dbTableNamePrefix
1340                gitcvs.dbdriver
1341                gitcvs.dbname
1342                gitcvs.dbpass
1343                gitcvs.dbuser
1344                gitcvs.enabled
1345                gitcvs.logfile
1346                gitcvs.usecrlfattr
1347                gui.blamehistoryctx
1348                gui.commitmsgwidth
1349                gui.copyblamethreshold
1350                gui.diffcontext
1351                gui.encoding
1352                gui.fastcopyblame
1353                gui.matchtrackingbranch
1354                gui.newbranchtemplate
1355                gui.pruneduringfetch
1356                gui.spellingdictionary
1357                gui.trustmtime
1358                help.autocorrect
1359                help.browser
1360                help.format
1361                http.lowSpeedLimit
1362                http.lowSpeedTime
1363                http.maxRequests
1364                http.noEPSV
1365                http.proxy
1366                http.sslCAInfo
1367                http.sslCAPath
1368                http.sslCert
1369                http.sslKey
1370                http.sslVerify
1371                i18n.commitEncoding
1372                i18n.logOutputEncoding
1373                instaweb.browser
1374                instaweb.httpd
1375                instaweb.local
1376                instaweb.modulepath
1377                instaweb.port
1378                log.date
1379                log.showroot
1380                man.viewer
1381                merge.conflictstyle
1382                merge.log
1383                merge.renameLimit
1384                merge.stat
1385                merge.tool
1386                merge.verbosity
1387                mergetool.keepBackup
1388                pack.compression
1389                pack.deltaCacheLimit
1390                pack.deltaCacheSize
1391                pack.depth
1392                pack.indexVersion
1393                pack.packSizeLimit
1394                pack.threads
1395                pack.window
1396                pack.windowMemory
1397                pull.octopus
1398                pull.twohead
1399                receive.denyCurrentBranch
1400                receive.denyDeletes
1401                receive.denyNonFastForwards
1402                receive.fsckObjects
1403                receive.unpackLimit
1404                repack.usedeltabaseoffset
1405                rerere.autoupdate
1406                rerere.enabled
1407                showbranch.default
1408                status.relativePaths
1409                status.showUntrackedFiles
1410                tar.umask
1411                transfer.unpackLimit
1412                user.email
1413                user.name
1414                user.signingkey
1415                web.browser
1416                branch. remote.
1417        "
1418}
1419
1420_git_remote ()
1421{
1422        local subcommands="add rename rm show prune update"
1423        local subcommand="$(__git_find_subcommand "$subcommands")"
1424        if [ -z "$subcommand" ]; then
1425                __gitcomp "$subcommands"
1426                return
1427        fi
1428
1429        case "$subcommand" in
1430        rename|rm|show|prune)
1431                __gitcomp "$(__git_remotes)"
1432                ;;
1433        update)
1434                local i c='' IFS=$'\n'
1435                for i in $(git --git-dir="$(__gitdir)" config --list); do
1436                        case "$i" in
1437                        remotes.*)
1438                                i="${i#remotes.}"
1439                                c="$c ${i/=*/}"
1440                                ;;
1441                        esac
1442                done
1443                __gitcomp "$c"
1444                ;;
1445        *)
1446                COMPREPLY=()
1447                ;;
1448        esac
1449}
1450
1451_git_reset ()
1452{
1453        __git_has_doubledash && return
1454
1455        local cur="${COMP_WORDS[COMP_CWORD]}"
1456        case "$cur" in
1457        --*)
1458                __gitcomp "--merge --mixed --hard --soft"
1459                return
1460                ;;
1461        esac
1462        __gitcomp "$(__git_refs)"
1463}
1464
1465_git_revert ()
1466{
1467        local cur="${COMP_WORDS[COMP_CWORD]}"
1468        case "$cur" in
1469        --*)
1470                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1471                return
1472                ;;
1473        esac
1474        __gitcomp "$(__git_refs)"
1475}
1476
1477_git_rm ()
1478{
1479        __git_has_doubledash && return
1480
1481        local cur="${COMP_WORDS[COMP_CWORD]}"
1482        case "$cur" in
1483        --*)
1484                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1485                return
1486                ;;
1487        esac
1488        COMPREPLY=()
1489}
1490
1491_git_shortlog ()
1492{
1493        __git_has_doubledash && return
1494
1495        local cur="${COMP_WORDS[COMP_CWORD]}"
1496        case "$cur" in
1497        --*)
1498                __gitcomp "
1499                        --max-count= --max-age= --since= --after=
1500                        --min-age= --before= --until=
1501                        --no-merges
1502                        --author= --committer= --grep=
1503                        --all-match
1504                        --not --all
1505                        --numbered --summary
1506                        "
1507                return
1508                ;;
1509        esac
1510        __git_complete_revlist
1511}
1512
1513_git_show ()
1514{
1515        __git_has_doubledash && return
1516
1517        local cur="${COMP_WORDS[COMP_CWORD]}"
1518        case "$cur" in
1519        --pretty=*)
1520                __gitcomp "$__git_log_pretty_formats
1521                        " "" "${cur##--pretty=}"
1522                return
1523                ;;
1524        --*)
1525                __gitcomp "--pretty=
1526                        $__git_diff_common_options
1527                        "
1528                return
1529                ;;
1530        esac
1531        __git_complete_file
1532}
1533
1534_git_show_branch ()
1535{
1536        local cur="${COMP_WORDS[COMP_CWORD]}"
1537        case "$cur" in
1538        --*)
1539                __gitcomp "
1540                        --all --remotes --topo-order --current --more=
1541                        --list --independent --merge-base --no-name
1542                        --sha1-name --topics --reflog
1543                        "
1544                return
1545                ;;
1546        esac
1547        __git_complete_revlist
1548}
1549
1550_git_stash ()
1551{
1552        local subcommands='save list show apply clear drop pop create branch'
1553        local subcommand="$(__git_find_subcommand "$subcommands")"
1554        if [ -z "$subcommand" ]; then
1555                __gitcomp "$subcommands"
1556        else
1557                local cur="${COMP_WORDS[COMP_CWORD]}"
1558                case "$subcommand,$cur" in
1559                save,--*)
1560                        __gitcomp "--keep-index"
1561                        ;;
1562                apply,--*)
1563                        __gitcomp "--index"
1564                        ;;
1565                show,--*|drop,--*|pop,--*|branch,--*)
1566                        COMPREPLY=()
1567                        ;;
1568                show,*|apply,*|drop,*|pop,*|branch,*)
1569                        __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1570                                        | sed -n -e 's/:.*//p')"
1571                        ;;
1572                *)
1573                        COMPREPLY=()
1574                        ;;
1575                esac
1576        fi
1577}
1578
1579_git_submodule ()
1580{
1581        __git_has_doubledash && return
1582
1583        local subcommands="add status init update summary foreach sync"
1584        if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1585                local cur="${COMP_WORDS[COMP_CWORD]}"
1586                case "$cur" in
1587                --*)
1588                        __gitcomp "--quiet --cached"
1589                        ;;
1590                *)
1591                        __gitcomp "$subcommands"
1592                        ;;
1593                esac
1594                return
1595        fi
1596}
1597
1598_git_svn ()
1599{
1600        local subcommands="
1601                init fetch clone rebase dcommit log find-rev
1602                set-tree commit-diff info create-ignore propget
1603                proplist show-ignore show-externals
1604                "
1605        local subcommand="$(__git_find_subcommand "$subcommands")"
1606        if [ -z "$subcommand" ]; then
1607                __gitcomp "$subcommands"
1608        else
1609                local remote_opts="--username= --config-dir= --no-auth-cache"
1610                local fc_opts="
1611                        --follow-parent --authors-file= --repack=
1612                        --no-metadata --use-svm-props --use-svnsync-props
1613                        --log-window-size= --no-checkout --quiet
1614                        --repack-flags --use-log-author --localtime $remote_opts
1615                        "
1616                local init_opts="
1617                        --template= --shared= --trunk= --tags=
1618                        --branches= --stdlayout --minimize-url
1619                        --no-metadata --use-svm-props --use-svnsync-props
1620                        --rewrite-root= $remote_opts
1621                        "
1622                local cmt_opts="
1623                        --edit --rmdir --find-copies-harder --copy-similarity=
1624                        "
1625
1626                local cur="${COMP_WORDS[COMP_CWORD]}"
1627                case "$subcommand,$cur" in
1628                fetch,--*)
1629                        __gitcomp "--revision= --fetch-all $fc_opts"
1630                        ;;
1631                clone,--*)
1632                        __gitcomp "--revision= $fc_opts $init_opts"
1633                        ;;
1634                init,--*)
1635                        __gitcomp "$init_opts"
1636                        ;;
1637                dcommit,--*)
1638                        __gitcomp "
1639                                --merge --strategy= --verbose --dry-run
1640                                --fetch-all --no-rebase $cmt_opts $fc_opts
1641                                "
1642                        ;;
1643                set-tree,--*)
1644                        __gitcomp "--stdin $cmt_opts $fc_opts"
1645                        ;;
1646                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1647                show-externals,--*)
1648                        __gitcomp "--revision="
1649                        ;;
1650                log,--*)
1651                        __gitcomp "
1652                                --limit= --revision= --verbose --incremental
1653                                --oneline --show-commit --non-recursive
1654                                --authors-file=
1655                                "
1656                        ;;
1657                rebase,--*)
1658                        __gitcomp "
1659                                --merge --verbose --strategy= --local
1660                                --fetch-all $fc_opts
1661                                "
1662                        ;;
1663                commit-diff,--*)
1664                        __gitcomp "--message= --file= --revision= $cmt_opts"
1665                        ;;
1666                info,--*)
1667                        __gitcomp "--url"
1668                        ;;
1669                *)
1670                        COMPREPLY=()
1671                        ;;
1672                esac
1673        fi
1674}
1675
1676_git_tag ()
1677{
1678        local i c=1 f=0
1679        while [ $c -lt $COMP_CWORD ]; do
1680                i="${COMP_WORDS[c]}"
1681                case "$i" in
1682                -d|-v)
1683                        __gitcomp "$(__git_tags)"
1684                        return
1685                        ;;
1686                -f)
1687                        f=1
1688                        ;;
1689                esac
1690                c=$((++c))
1691        done
1692
1693        case "${COMP_WORDS[COMP_CWORD-1]}" in
1694        -m|-F)
1695                COMPREPLY=()
1696                ;;
1697        -*|tag)
1698                if [ $f = 1 ]; then
1699                        __gitcomp "$(__git_tags)"
1700                else
1701                        COMPREPLY=()
1702                fi
1703                ;;
1704        *)
1705                __gitcomp "$(__git_refs)"
1706                ;;
1707        esac
1708}
1709
1710_git ()
1711{
1712        local i c=1 command __git_dir
1713
1714        while [ $c -lt $COMP_CWORD ]; do
1715                i="${COMP_WORDS[c]}"
1716                case "$i" in
1717                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1718                --bare)      __git_dir="." ;;
1719                --version|-p|--paginate) ;;
1720                --help) command="help"; break ;;
1721                *) command="$i"; break ;;
1722                esac
1723                c=$((++c))
1724        done
1725
1726        if [ -z "$command" ]; then
1727                case "${COMP_WORDS[COMP_CWORD]}" in
1728                --*)   __gitcomp "
1729                        --paginate
1730                        --no-pager
1731                        --git-dir=
1732                        --bare
1733                        --version
1734                        --exec-path
1735                        --work-tree=
1736                        --help
1737                        "
1738                        ;;
1739                *)     __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1740                esac
1741                return
1742        fi
1743
1744        local expansion=$(__git_aliased_command "$command")
1745        [ "$expansion" ] && command="$expansion"
1746
1747        case "$command" in
1748        am)          _git_am ;;
1749        add)         _git_add ;;
1750        apply)       _git_apply ;;
1751        archive)     _git_archive ;;
1752        bisect)      _git_bisect ;;
1753        bundle)      _git_bundle ;;
1754        branch)      _git_branch ;;
1755        checkout)    _git_checkout ;;
1756        cherry)      _git_cherry ;;
1757        cherry-pick) _git_cherry_pick ;;
1758        clean)       _git_clean ;;
1759        clone)       _git_clone ;;
1760        commit)      _git_commit ;;
1761        config)      _git_config ;;
1762        describe)    _git_describe ;;
1763        diff)        _git_diff ;;
1764        fetch)       _git_fetch ;;
1765        format-patch) _git_format_patch ;;
1766        gc)          _git_gc ;;
1767        grep)        _git_grep ;;
1768        help)        _git_help ;;
1769        init)        _git_init ;;
1770        log)         _git_log ;;
1771        ls-files)    _git_ls_files ;;
1772        ls-remote)   _git_ls_remote ;;
1773        ls-tree)     _git_ls_tree ;;
1774        merge)       _git_merge;;
1775        mergetool)   _git_mergetool;;
1776        merge-base)  _git_merge_base ;;
1777        mv)          _git_mv ;;
1778        name-rev)    _git_name_rev ;;
1779        pull)        _git_pull ;;
1780        push)        _git_push ;;
1781        rebase)      _git_rebase ;;
1782        remote)      _git_remote ;;
1783        reset)       _git_reset ;;
1784        revert)      _git_revert ;;
1785        rm)          _git_rm ;;
1786        send-email)  _git_send_email ;;
1787        shortlog)    _git_shortlog ;;
1788        show)        _git_show ;;
1789        show-branch) _git_show_branch ;;
1790        stash)       _git_stash ;;
1791        stage)       _git_add ;;
1792        submodule)   _git_submodule ;;
1793        svn)         _git_svn ;;
1794        tag)         _git_tag ;;
1795        whatchanged) _git_log ;;
1796        *)           COMPREPLY=() ;;
1797        esac
1798}
1799
1800_gitk ()
1801{
1802        __git_has_doubledash && return
1803
1804        local cur="${COMP_WORDS[COMP_CWORD]}"
1805        local g="$(git rev-parse --git-dir 2>/dev/null)"
1806        local merge=""
1807        if [ -f $g/MERGE_HEAD ]; then
1808                merge="--merge"
1809        fi
1810        case "$cur" in
1811        --*)
1812                __gitcomp "--not --all $merge"
1813                return
1814                ;;
1815        esac
1816        __git_complete_revlist
1817}
1818
1819complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1820        || complete -o default -o nospace -F _git git
1821complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1822        || complete -o default -o nospace -F _gitk gitk
1823
1824# The following are necessary only for Cygwin, and only are needed
1825# when the user has tab-completed the executable name and consequently
1826# included the '.exe' suffix.
1827#
1828if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1829complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1830        || complete -o default -o nospace -F _git git.exe
1831fi