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