contrib / completion / git-completion.bashon commit stash: introduce 'stash save --keep-index' option (7bedebc)
   1#
   2# bash completion support for core Git.
   3#
   4# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
   5# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
   6# Distributed under the GNU General Public License, version 2.0.
   7#
   8# The contained completion routines provide support for completing:
   9#
  10#    *) local and remote branch names
  11#    *) local and remote tag names
  12#    *) .git/remotes file names
  13#    *) git 'subcommands'
  14#    *) tree paths within 'ref:path/to/file' expressions
  15#    *) common --long-options
  16#
  17# To use these routines:
  18#
  19#    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
  20#    2) Added the following line to your .bashrc:
  21#        source ~/.git-completion.sh
  22#
  23#    3) You may want to make sure the git executable is available
  24#       in your PATH before this script is sourced, as some caching
  25#       is performed while the script loads.  If git isn't found
  26#       at source time then all lookups will be done on demand,
  27#       which may be slightly slower.
  28#
  29#    4) Consider changing your PS1 to also show the current branch:
  30#        PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
  31#
  32#       The argument to __git_ps1 will be displayed only if you
  33#       are currently in a git repository.  The %s token will be
  34#       the name of the current branch.
  35#
  36# To submit patches:
  37#
  38#    *) Read Documentation/SubmittingPatches
  39#    *) Send all patches to the current maintainer:
  40#
  41#       "Shawn O. Pearce" <spearce@spearce.org>
  42#
  43#    *) Always CC the Git mailing list:
  44#
  45#       git@vger.kernel.org
  46#
  47
  48__gitdir ()
  49{
  50        if [ -z "$1" ]; then
  51                if [ -n "$__git_dir" ]; then
  52                        echo "$__git_dir"
  53                elif [ -d .git ]; then
  54                        echo .git
  55                else
  56                        git rev-parse --git-dir 2>/dev/null
  57                fi
  58        elif [ -d "$1/.git" ]; then
  59                echo "$1/.git"
  60        else
  61                echo "$1"
  62        fi
  63}
  64
  65__git_ps1 ()
  66{
  67        local g="$(git rev-parse --git-dir 2>/dev/null)"
  68        if [ -n "$g" ]; then
  69                local r
  70                local b
  71                if [ -d "$g/../.dotest" ]
  72                then
  73                        if test -f "$g/../.dotest/rebasing"
  74                        then
  75                                r="|REBASE"
  76                        elif test -f "$g/../.dotest/applying"
  77                        then
  78                                r="|AM"
  79                        else
  80                                r="|AM/REBASE"
  81                        fi
  82                        b="$(git symbolic-ref HEAD 2>/dev/null)"
  83                elif [ -f "$g/.dotest-merge/interactive" ]
  84                then
  85                        r="|REBASE-i"
  86                        b="$(cat "$g/.dotest-merge/head-name")"
  87                elif [ -d "$g/.dotest-merge" ]
  88                then
  89                        r="|REBASE-m"
  90                        b="$(cat "$g/.dotest-merge/head-name")"
  91                elif [ -f "$g/MERGE_HEAD" ]
  92                then
  93                        r="|MERGING"
  94                        b="$(git symbolic-ref HEAD 2>/dev/null)"
  95                else
  96                        if [ -f "$g/BISECT_LOG" ]
  97                        then
  98                                r="|BISECTING"
  99                        fi
 100                        if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
 101                        then
 102                                if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
 103                                then
 104                                        b="$(cut -c1-7 "$g/HEAD")..."
 105                                fi
 106                        fi
 107                fi
 108
 109                if [ -n "$1" ]; then
 110                        printf "$1" "${b##refs/heads/}$r"
 111                else
 112                        printf " (%s)" "${b##refs/heads/}$r"
 113                fi
 114        fi
 115}
 116
 117__gitcomp ()
 118{
 119        local all c s=$'\n' IFS=' '$'\t'$'\n'
 120        local cur="${COMP_WORDS[COMP_CWORD]}"
 121        if [ $# -gt 2 ]; then
 122                cur="$3"
 123        fi
 124        case "$cur" in
 125        --*=)
 126                COMPREPLY=()
 127                return
 128                ;;
 129        *)
 130                for c in $1; do
 131                        case "$c$4" in
 132                        --*=*) all="$all$c$4$s" ;;
 133                        *.)    all="$all$c$4$s" ;;
 134                        *)     all="$all$c$4 $s" ;;
 135                        esac
 136                done
 137                ;;
 138        esac
 139        IFS=$s
 140        COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
 141        return
 142}
 143
 144__git_heads ()
 145{
 146        local cmd i is_hash=y dir="$(__gitdir "$1")"
 147        if [ -d "$dir" ]; then
 148                for i in $(git --git-dir="$dir" \
 149                        for-each-ref --format='%(refname)' \
 150                        refs/heads ); do
 151                        echo "${i#refs/heads/}"
 152                done
 153                return
 154        fi
 155        for i in $(git ls-remote "$1" 2>/dev/null); do
 156                case "$is_hash,$i" in
 157                y,*) is_hash=n ;;
 158                n,*^{}) is_hash=y ;;
 159                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
 160                n,*) is_hash=y; echo "$i" ;;
 161                esac
 162        done
 163}
 164
 165__git_tags ()
 166{
 167        local cmd i is_hash=y dir="$(__gitdir "$1")"
 168        if [ -d "$dir" ]; then
 169                for i in $(git --git-dir="$dir" \
 170                        for-each-ref --format='%(refname)' \
 171                        refs/tags ); do
 172                        echo "${i#refs/tags/}"
 173                done
 174                return
 175        fi
 176        for i in $(git ls-remote "$1" 2>/dev/null); do
 177                case "$is_hash,$i" in
 178                y,*) is_hash=n ;;
 179                n,*^{}) is_hash=y ;;
 180                n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
 181                n,*) is_hash=y; echo "$i" ;;
 182                esac
 183        done
 184}
 185
 186__git_refs ()
 187{
 188        local cmd i is_hash=y dir="$(__gitdir "$1")"
 189        if [ -d "$dir" ]; then
 190                if [ -e "$dir/HEAD" ]; then echo HEAD; fi
 191                for i in $(git --git-dir="$dir" \
 192                        for-each-ref --format='%(refname)' \
 193                        refs/tags refs/heads refs/remotes); do
 194                        case "$i" in
 195                                refs/tags/*)    echo "${i#refs/tags/}" ;;
 196                                refs/heads/*)   echo "${i#refs/heads/}" ;;
 197                                refs/remotes/*) echo "${i#refs/remotes/}" ;;
 198                                *)              echo "$i" ;;
 199                        esac
 200                done
 201                return
 202        fi
 203        for i in $(git ls-remote "$dir" 2>/dev/null); do
 204                case "$is_hash,$i" in
 205                y,*) is_hash=n ;;
 206                n,*^{}) is_hash=y ;;
 207                n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
 208                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
 209                n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
 210                n,*) is_hash=y; echo "$i" ;;
 211                esac
 212        done
 213}
 214
 215__git_refs2 ()
 216{
 217        local i
 218        for i in $(__git_refs "$1"); do
 219                echo "$i:$i"
 220        done
 221}
 222
 223__git_refs_remotes ()
 224{
 225        local cmd i is_hash=y
 226        for i in $(git ls-remote "$1" 2>/dev/null); do
 227                case "$is_hash,$i" in
 228                n,refs/heads/*)
 229                        is_hash=y
 230                        echo "$i:refs/remotes/$1/${i#refs/heads/}"
 231                        ;;
 232                y,*) is_hash=n ;;
 233                n,*^{}) is_hash=y ;;
 234                n,refs/tags/*) is_hash=y;;
 235                n,*) is_hash=y; ;;
 236                esac
 237        done
 238}
 239
 240__git_remotes ()
 241{
 242        local i ngoff IFS=$'\n' d="$(__gitdir)"
 243        shopt -q nullglob || ngoff=1
 244        shopt -s nullglob
 245        for i in "$d/remotes"/*; do
 246                echo ${i#$d/remotes/}
 247        done
 248        [ "$ngoff" ] && shopt -u nullglob
 249        for i in $(git --git-dir="$d" config --list); do
 250                case "$i" in
 251                remote.*.url=*)
 252                        i="${i#remote.}"
 253                        echo "${i/.url=*/}"
 254                        ;;
 255                esac
 256        done
 257}
 258
 259__git_merge_strategies ()
 260{
 261        if [ -n "$__git_merge_strategylist" ]; then
 262                echo "$__git_merge_strategylist"
 263                return
 264        fi
 265        sed -n "/^all_strategies='/{
 266                s/^all_strategies='//
 267                s/'//
 268                p
 269                q
 270                }" "$(git --exec-path)/git-merge"
 271}
 272__git_merge_strategylist=
 273__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
 274
 275__git_complete_file ()
 276{
 277        local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
 278        case "$cur" in
 279        ?*:*)
 280                ref="${cur%%:*}"
 281                cur="${cur#*:}"
 282                case "$cur" in
 283                ?*/*)
 284                        pfx="${cur%/*}"
 285                        cur="${cur##*/}"
 286                        ls="$ref:$pfx"
 287                        pfx="$pfx/"
 288                        ;;
 289                *)
 290                        ls="$ref"
 291                        ;;
 292            esac
 293                COMPREPLY=($(compgen -P "$pfx" \
 294                        -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
 295                                | sed '/^100... blob /s,^.*     ,,
 296                                       /^040000 tree /{
 297                                           s,^.*        ,,
 298                                           s,$,/,
 299                                       }
 300                                       s/^.*    //')" \
 301                        -- "$cur"))
 302                ;;
 303        *)
 304                __gitcomp "$(__git_refs)"
 305                ;;
 306        esac
 307}
 308
 309__git_complete_revlist ()
 310{
 311        local pfx cur="${COMP_WORDS[COMP_CWORD]}"
 312        case "$cur" in
 313        *...*)
 314                pfx="${cur%...*}..."
 315                cur="${cur#*...}"
 316                __gitcomp "$(__git_refs)" "$pfx" "$cur"
 317                ;;
 318        *..*)
 319                pfx="${cur%..*}.."
 320                cur="${cur#*..}"
 321                __gitcomp "$(__git_refs)" "$pfx" "$cur"
 322                ;;
 323        *.)
 324                __gitcomp "$cur."
 325                ;;
 326        *)
 327                __gitcomp "$(__git_refs)"
 328                ;;
 329        esac
 330}
 331
 332__git_commands ()
 333{
 334        if [ -n "$__git_commandlist" ]; then
 335                echo "$__git_commandlist"
 336                return
 337        fi
 338        local i IFS=" "$'\n'
 339        for i in $(git help -a|egrep '^ ')
 340        do
 341                case $i in
 342                *--*)             : helper pattern;;
 343                applymbox)        : ask gittus;;
 344                applypatch)       : ask gittus;;
 345                archimport)       : import;;
 346                cat-file)         : plumbing;;
 347                check-attr)       : plumbing;;
 348                check-ref-format) : plumbing;;
 349                commit-tree)      : plumbing;;
 350                cvsexportcommit)  : export;;
 351                cvsimport)        : import;;
 352                cvsserver)        : daemon;;
 353                daemon)           : daemon;;
 354                diff-files)       : plumbing;;
 355                diff-index)       : plumbing;;
 356                diff-tree)        : plumbing;;
 357                fast-import)      : import;;
 358                fsck-objects)     : plumbing;;
 359                fetch-pack)       : plumbing;;
 360                fmt-merge-msg)    : plumbing;;
 361                for-each-ref)     : plumbing;;
 362                hash-object)      : plumbing;;
 363                http-*)           : transport;;
 364                index-pack)       : plumbing;;
 365                init-db)          : deprecated;;
 366                local-fetch)      : plumbing;;
 367                mailinfo)         : plumbing;;
 368                mailsplit)        : plumbing;;
 369                merge-*)          : plumbing;;
 370                mktree)           : plumbing;;
 371                mktag)            : plumbing;;
 372                pack-objects)     : plumbing;;
 373                pack-redundant)   : plumbing;;
 374                pack-refs)        : plumbing;;
 375                parse-remote)     : plumbing;;
 376                patch-id)         : plumbing;;
 377                peek-remote)      : plumbing;;
 378                prune)            : plumbing;;
 379                prune-packed)     : plumbing;;
 380                quiltimport)      : import;;
 381                read-tree)        : plumbing;;
 382                receive-pack)     : plumbing;;
 383                reflog)           : plumbing;;
 384                repo-config)      : deprecated;;
 385                rerere)           : plumbing;;
 386                rev-list)         : plumbing;;
 387                rev-parse)        : plumbing;;
 388                runstatus)        : plumbing;;
 389                sh-setup)         : internal;;
 390                shell)            : daemon;;
 391                send-pack)        : plumbing;;
 392                show-index)       : plumbing;;
 393                ssh-*)            : transport;;
 394                stripspace)       : plumbing;;
 395                symbolic-ref)     : plumbing;;
 396                tar-tree)         : deprecated;;
 397                unpack-file)      : plumbing;;
 398                unpack-objects)   : plumbing;;
 399                update-index)     : plumbing;;
 400                update-ref)       : plumbing;;
 401                update-server-info) : daemon;;
 402                upload-archive)   : plumbing;;
 403                upload-pack)      : plumbing;;
 404                write-tree)       : plumbing;;
 405                verify-tag)       : plumbing;;
 406                *) echo $i;;
 407                esac
 408        done
 409}
 410__git_commandlist=
 411__git_commandlist="$(__git_commands 2>/dev/null)"
 412
 413__git_aliases ()
 414{
 415        local i IFS=$'\n'
 416        for i in $(git --git-dir="$(__gitdir)" config --list); do
 417                case "$i" in
 418                alias.*)
 419                        i="${i#alias.}"
 420                        echo "${i/=*/}"
 421                        ;;
 422                esac
 423        done
 424}
 425
 426__git_aliased_command ()
 427{
 428        local word cmdline=$(git --git-dir="$(__gitdir)" \
 429                config --get "alias.$1")
 430        for word in $cmdline; do
 431                if [ "${word##-*}" ]; then
 432                        echo $word
 433                        return
 434                fi
 435        done
 436}
 437
 438__git_find_subcommand ()
 439{
 440        local word subcommand c=1
 441
 442        while [ $c -lt $COMP_CWORD ]; do
 443                word="${COMP_WORDS[c]}"
 444                for subcommand in $1; do
 445                        if [ "$subcommand" = "$word" ]; then
 446                                echo "$subcommand"
 447                                return
 448                        fi
 449                done
 450                c=$((++c))
 451        done
 452}
 453
 454__git_whitespacelist="nowarn warn error error-all strip"
 455
 456_git_am ()
 457{
 458        local cur="${COMP_WORDS[COMP_CWORD]}"
 459        if [ -d .dotest ]; then
 460                __gitcomp "--skip --resolved"
 461                return
 462        fi
 463        case "$cur" in
 464        --whitespace=*)
 465                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 466                return
 467                ;;
 468        --*)
 469                __gitcomp "
 470                        --signoff --utf8 --binary --3way --interactive
 471                        --whitespace=
 472                        "
 473                return
 474        esac
 475        COMPREPLY=()
 476}
 477
 478_git_apply ()
 479{
 480        local cur="${COMP_WORDS[COMP_CWORD]}"
 481        case "$cur" in
 482        --whitespace=*)
 483                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 484                return
 485                ;;
 486        --*)
 487                __gitcomp "
 488                        --stat --numstat --summary --check --index
 489                        --cached --index-info --reverse --reject --unidiff-zero
 490                        --apply --no-add --exclude=
 491                        --whitespace= --inaccurate-eof --verbose
 492                        "
 493                return
 494        esac
 495        COMPREPLY=()
 496}
 497
 498_git_add ()
 499{
 500        local cur="${COMP_WORDS[COMP_CWORD]}"
 501        case "$cur" in
 502        --*)
 503                __gitcomp "
 504                        --interactive --refresh --patch --update --dry-run
 505                        --ignore-errors
 506                        "
 507                return
 508        esac
 509        COMPREPLY=()
 510}
 511
 512_git_bisect ()
 513{
 514        local subcommands="start bad good reset visualize replay log"
 515        local subcommand="$(__git_find_subcommand "$subcommands")"
 516        if [ -z "$subcommand" ]; then
 517                __gitcomp "$subcommands"
 518                return
 519        fi
 520
 521        case "$subcommand" in
 522        bad|good|reset)
 523                __gitcomp "$(__git_refs)"
 524                ;;
 525        *)
 526                COMPREPLY=()
 527                ;;
 528        esac
 529}
 530
 531_git_branch ()
 532{
 533        local i c=1 only_local_ref="n" has_r="n"
 534
 535        while [ $c -lt $COMP_CWORD ]; do
 536                i="${COMP_WORDS[c]}"
 537                case "$i" in
 538                -d|-m)  only_local_ref="y" ;;
 539                -r)     has_r="y" ;;
 540                esac
 541                c=$((++c))
 542        done
 543
 544        case "${COMP_WORDS[COMP_CWORD]}" in
 545        --*=*)  COMPREPLY=() ;;
 546        --*)
 547                __gitcomp "
 548                        --color --no-color --verbose --abbrev= --no-abbrev
 549                        --track --no-track
 550                        "
 551                ;;
 552        *)
 553                if [ $only_local_ref = "y" -a $has_r = "n" ]; then
 554                        __gitcomp "$(__git_heads)"
 555                else
 556                        __gitcomp "$(__git_refs)"
 557                fi
 558                ;;
 559        esac
 560}
 561
 562_git_bundle ()
 563{
 564        local mycword="$COMP_CWORD"
 565        case "${COMP_WORDS[0]}" in
 566        git)
 567                local cmd="${COMP_WORDS[2]}"
 568                mycword="$((mycword-1))"
 569                ;;
 570        git-bundle*)
 571                local cmd="${COMP_WORDS[1]}"
 572                ;;
 573        esac
 574        case "$mycword" in
 575        1)
 576                __gitcomp "create list-heads verify unbundle"
 577                ;;
 578        2)
 579                # looking for a file
 580                ;;
 581        *)
 582                case "$cmd" in
 583                        create)
 584                                __git_complete_revlist
 585                        ;;
 586                esac
 587                ;;
 588        esac
 589}
 590
 591_git_checkout ()
 592{
 593        __gitcomp "$(__git_refs)"
 594}
 595
 596_git_cherry ()
 597{
 598        __gitcomp "$(__git_refs)"
 599}
 600
 601_git_cherry_pick ()
 602{
 603        local cur="${COMP_WORDS[COMP_CWORD]}"
 604        case "$cur" in
 605        --*)
 606                __gitcomp "--edit --no-commit"
 607                ;;
 608        *)
 609                __gitcomp "$(__git_refs)"
 610                ;;
 611        esac
 612}
 613
 614_git_commit ()
 615{
 616        local cur="${COMP_WORDS[COMP_CWORD]}"
 617        case "$cur" in
 618        --*)
 619                __gitcomp "
 620                        --all --author= --signoff --verify --no-verify
 621                        --edit --amend --include --only
 622                        "
 623                return
 624        esac
 625        COMPREPLY=()
 626}
 627
 628_git_describe ()
 629{
 630        __gitcomp "$(__git_refs)"
 631}
 632
 633_git_diff ()
 634{
 635        local cur="${COMP_WORDS[COMP_CWORD]}"
 636        case "$cur" in
 637        --*)
 638                __gitcomp "--cached --stat --numstat --shortstat --summary
 639                        --patch-with-stat --name-only --name-status --color
 640                        --no-color --color-words --no-renames --check
 641                        --full-index --binary --abbrev --diff-filter
 642                        --find-copies-harder --pickaxe-all --pickaxe-regex
 643                        --text --ignore-space-at-eol --ignore-space-change
 644                        --ignore-all-space --exit-code --quiet --ext-diff
 645                        --no-ext-diff
 646                        --no-prefix --src-prefix= --dst-prefix=
 647                        --base --ours --theirs
 648                        "
 649                return
 650                ;;
 651        esac
 652        __git_complete_file
 653}
 654
 655_git_diff_tree ()
 656{
 657        __gitcomp "$(__git_refs)"
 658}
 659
 660_git_fetch ()
 661{
 662        local cur="${COMP_WORDS[COMP_CWORD]}"
 663
 664        case "${COMP_WORDS[0]},$COMP_CWORD" in
 665        git-fetch*,1)
 666                __gitcomp "$(__git_remotes)"
 667                ;;
 668        git,2)
 669                __gitcomp "$(__git_remotes)"
 670                ;;
 671        *)
 672                case "$cur" in
 673                *:*)
 674                        __gitcomp "$(__git_refs)" "" "${cur#*:}"
 675                        ;;
 676                *)
 677                        local remote
 678                        case "${COMP_WORDS[0]}" in
 679                        git-fetch) remote="${COMP_WORDS[1]}" ;;
 680                        git)       remote="${COMP_WORDS[2]}" ;;
 681                        esac
 682                        __gitcomp "$(__git_refs2 "$remote")"
 683                        ;;
 684                esac
 685                ;;
 686        esac
 687}
 688
 689_git_format_patch ()
 690{
 691        local cur="${COMP_WORDS[COMP_CWORD]}"
 692        case "$cur" in
 693        --*)
 694                __gitcomp "
 695                        --stdout --attach --thread
 696                        --output-directory
 697                        --numbered --start-number
 698                        --numbered-files
 699                        --keep-subject
 700                        --signoff
 701                        --in-reply-to=
 702                        --full-index --binary
 703                        --not --all
 704                        --cover-letter
 705                        --no-prefix --src-prefix= --dst-prefix=
 706                        "
 707                return
 708                ;;
 709        esac
 710        __git_complete_revlist
 711}
 712
 713_git_gc ()
 714{
 715        local cur="${COMP_WORDS[COMP_CWORD]}"
 716        case "$cur" in
 717        --*)
 718                __gitcomp "--prune --aggressive"
 719                return
 720                ;;
 721        esac
 722        COMPREPLY=()
 723}
 724
 725_git_ls_remote ()
 726{
 727        __gitcomp "$(__git_remotes)"
 728}
 729
 730_git_ls_tree ()
 731{
 732        __git_complete_file
 733}
 734
 735_git_log ()
 736{
 737        local cur="${COMP_WORDS[COMP_CWORD]}"
 738        case "$cur" in
 739        --pretty=*)
 740                __gitcomp "
 741                        oneline short medium full fuller email raw
 742                        " "" "${cur##--pretty=}"
 743                return
 744                ;;
 745        --date=*)
 746                __gitcomp "
 747                        relative iso8601 rfc2822 short local default
 748                " "" "${cur##--date=}"
 749                return
 750                ;;
 751        --*)
 752                __gitcomp "
 753                        --max-count= --max-age= --since= --after=
 754                        --min-age= --before= --until=
 755                        --root --topo-order --date-order --reverse
 756                        --no-merges --follow
 757                        --abbrev-commit --abbrev=
 758                        --relative-date --date=
 759                        --author= --committer= --grep=
 760                        --all-match
 761                        --pretty= --name-status --name-only --raw
 762                        --not --all
 763                        --left-right --cherry-pick
 764                        --graph
 765                        --stat --numstat --shortstat
 766                        --decorate --diff-filter=
 767                        --color-words --walk-reflogs
 768                        "
 769                return
 770                ;;
 771        esac
 772        __git_complete_revlist
 773}
 774
 775_git_merge ()
 776{
 777        local cur="${COMP_WORDS[COMP_CWORD]}"
 778        case "${COMP_WORDS[COMP_CWORD-1]}" in
 779        -s|--strategy)
 780                __gitcomp "$(__git_merge_strategies)"
 781                return
 782        esac
 783        case "$cur" in
 784        --strategy=*)
 785                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 786                return
 787                ;;
 788        --*)
 789                __gitcomp "
 790                        --no-commit --no-stat --log --no-log --squash --strategy
 791                        "
 792                return
 793        esac
 794        __gitcomp "$(__git_refs)"
 795}
 796
 797_git_merge_base ()
 798{
 799        __gitcomp "$(__git_refs)"
 800}
 801
 802_git_name_rev ()
 803{
 804        __gitcomp "--tags --all --stdin"
 805}
 806
 807_git_pull ()
 808{
 809        local cur="${COMP_WORDS[COMP_CWORD]}"
 810
 811        case "${COMP_WORDS[0]},$COMP_CWORD" in
 812        git-pull*,1)
 813                __gitcomp "$(__git_remotes)"
 814                ;;
 815        git,2)
 816                __gitcomp "$(__git_remotes)"
 817                ;;
 818        *)
 819                local remote
 820                case "${COMP_WORDS[0]}" in
 821                git-pull)  remote="${COMP_WORDS[1]}" ;;
 822                git)       remote="${COMP_WORDS[2]}" ;;
 823                esac
 824                __gitcomp "$(__git_refs "$remote")"
 825                ;;
 826        esac
 827}
 828
 829_git_push ()
 830{
 831        local cur="${COMP_WORDS[COMP_CWORD]}"
 832
 833        case "${COMP_WORDS[0]},$COMP_CWORD" in
 834        git-push*,1)
 835                __gitcomp "$(__git_remotes)"
 836                ;;
 837        git,2)
 838                __gitcomp "$(__git_remotes)"
 839                ;;
 840        *)
 841                case "$cur" in
 842                *:*)
 843                        local remote
 844                        case "${COMP_WORDS[0]}" in
 845                        git-push)  remote="${COMP_WORDS[1]}" ;;
 846                        git)       remote="${COMP_WORDS[2]}" ;;
 847                        esac
 848                        __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
 849                        ;;
 850                +*)
 851                        __gitcomp "$(__git_refs)" + "${cur#+}"
 852                        ;;
 853                *)
 854                        __gitcomp "$(__git_refs)"
 855                        ;;
 856                esac
 857                ;;
 858        esac
 859}
 860
 861_git_rebase ()
 862{
 863        local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
 864        if [ -d .dotest ] || [ -d "$dir"/.dotest-merge ]; then
 865                __gitcomp "--continue --skip --abort"
 866                return
 867        fi
 868        case "${COMP_WORDS[COMP_CWORD-1]}" in
 869        -s|--strategy)
 870                __gitcomp "$(__git_merge_strategies)"
 871                return
 872        esac
 873        case "$cur" in
 874        --strategy=*)
 875                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 876                return
 877                ;;
 878        --*)
 879                __gitcomp "--onto --merge --strategy --interactive"
 880                return
 881        esac
 882        __gitcomp "$(__git_refs)"
 883}
 884
 885_git_config ()
 886{
 887        local cur="${COMP_WORDS[COMP_CWORD]}"
 888        local prv="${COMP_WORDS[COMP_CWORD-1]}"
 889        case "$prv" in
 890        branch.*.remote)
 891                __gitcomp "$(__git_remotes)"
 892                return
 893                ;;
 894        branch.*.merge)
 895                __gitcomp "$(__git_refs)"
 896                return
 897                ;;
 898        remote.*.fetch)
 899                local remote="${prv#remote.}"
 900                remote="${remote%.fetch}"
 901                __gitcomp "$(__git_refs_remotes "$remote")"
 902                return
 903                ;;
 904        remote.*.push)
 905                local remote="${prv#remote.}"
 906                remote="${remote%.push}"
 907                __gitcomp "$(git --git-dir="$(__gitdir)" \
 908                        for-each-ref --format='%(refname):%(refname)' \
 909                        refs/heads)"
 910                return
 911                ;;
 912        pull.twohead|pull.octopus)
 913                __gitcomp "$(__git_merge_strategies)"
 914                return
 915                ;;
 916        color.branch|color.diff|color.status)
 917                __gitcomp "always never auto"
 918                return
 919                ;;
 920        color.*.*)
 921                __gitcomp "
 922                        black red green yellow blue magenta cyan white
 923                        bold dim ul blink reverse
 924                        "
 925                return
 926                ;;
 927        *.*)
 928                COMPREPLY=()
 929                return
 930                ;;
 931        esac
 932        case "$cur" in
 933        --*)
 934                __gitcomp "
 935                        --global --system --file=
 936                        --list --replace-all
 937                        --get --get-all --get-regexp
 938                        --add --unset --unset-all
 939                        --remove-section --rename-section
 940                        "
 941                return
 942                ;;
 943        branch.*.*)
 944                local pfx="${cur%.*}."
 945                cur="${cur##*.}"
 946                __gitcomp "remote merge" "$pfx" "$cur"
 947                return
 948                ;;
 949        branch.*)
 950                local pfx="${cur%.*}."
 951                cur="${cur#*.}"
 952                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
 953                return
 954                ;;
 955        remote.*.*)
 956                local pfx="${cur%.*}."
 957                cur="${cur##*.}"
 958                __gitcomp "
 959                        url fetch push skipDefaultUpdate
 960                        receivepack uploadpack tagopt
 961                        " "$pfx" "$cur"
 962                return
 963                ;;
 964        remote.*)
 965                local pfx="${cur%.*}."
 966                cur="${cur#*.}"
 967                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
 968                return
 969                ;;
 970        esac
 971        __gitcomp "
 972                apply.whitespace
 973                core.fileMode
 974                core.gitProxy
 975                core.ignoreStat
 976                core.preferSymlinkRefs
 977                core.logAllRefUpdates
 978                core.loosecompression
 979                core.repositoryFormatVersion
 980                core.sharedRepository
 981                core.warnAmbiguousRefs
 982                core.compression
 983                core.packedGitWindowSize
 984                core.packedGitLimit
 985                clean.requireForce
 986                color.branch
 987                color.branch.current
 988                color.branch.local
 989                color.branch.remote
 990                color.branch.plain
 991                color.diff
 992                color.diff.plain
 993                color.diff.meta
 994                color.diff.frag
 995                color.diff.old
 996                color.diff.new
 997                color.diff.commit
 998                color.diff.whitespace
 999                color.pager
1000                color.status
1001                color.status.header
1002                color.status.added
1003                color.status.changed
1004                color.status.untracked
1005                diff.renameLimit
1006                diff.renames
1007                fetch.unpackLimit
1008                format.headers
1009                format.subjectprefix
1010                gitcvs.enabled
1011                gitcvs.logfile
1012                gitcvs.allbinary
1013                gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1014                gitcvs.dbtablenameprefix
1015                gc.packrefs
1016                gc.reflogexpire
1017                gc.reflogexpireunreachable
1018                gc.rerereresolved
1019                gc.rerereunresolved
1020                http.sslVerify
1021                http.sslCert
1022                http.sslKey
1023                http.sslCAInfo
1024                http.sslCAPath
1025                http.maxRequests
1026                http.lowSpeedLimit
1027                http.lowSpeedTime
1028                http.noEPSV
1029                i18n.commitEncoding
1030                i18n.logOutputEncoding
1031                log.showroot
1032                merge.tool
1033                merge.summary
1034                merge.verbosity
1035                pack.window
1036                pack.depth
1037                pack.windowMemory
1038                pack.compression
1039                pack.deltaCacheSize
1040                pack.deltaCacheLimit
1041                pull.octopus
1042                pull.twohead
1043                repack.useDeltaBaseOffset
1044                showbranch.default
1045                tar.umask
1046                transfer.unpackLimit
1047                receive.unpackLimit
1048                receive.denyNonFastForwards
1049                user.name
1050                user.email
1051                user.signingkey
1052                branch. remote.
1053        "
1054}
1055
1056_git_remote ()
1057{
1058        local subcommands="add rm show prune update"
1059        local subcommand="$(__git_find_subcommand "$subcommands")"
1060        if [ -z "$subcommand" ]; then
1061                __gitcomp "$subcommands"
1062                return
1063        fi
1064
1065        case "$subcommand" in
1066        rm|show|prune)
1067                __gitcomp "$(__git_remotes)"
1068                ;;
1069        update)
1070                local i c='' IFS=$'\n'
1071                for i in $(git --git-dir="$(__gitdir)" config --list); do
1072                        case "$i" in
1073                        remotes.*)
1074                                i="${i#remotes.}"
1075                                c="$c ${i/=*/}"
1076                                ;;
1077                        esac
1078                done
1079                __gitcomp "$c"
1080                ;;
1081        *)
1082                COMPREPLY=()
1083                ;;
1084        esac
1085}
1086
1087_git_reset ()
1088{
1089        local cur="${COMP_WORDS[COMP_CWORD]}"
1090        case "$cur" in
1091        --*)
1092                __gitcomp "--mixed --hard --soft"
1093                return
1094                ;;
1095        esac
1096        __gitcomp "$(__git_refs)"
1097}
1098
1099_git_shortlog ()
1100{
1101        local cur="${COMP_WORDS[COMP_CWORD]}"
1102        case "$cur" in
1103        --*)
1104                __gitcomp "
1105                        --max-count= --max-age= --since= --after=
1106                        --min-age= --before= --until=
1107                        --no-merges
1108                        --author= --committer= --grep=
1109                        --all-match
1110                        --not --all
1111                        --numbered --summary
1112                        "
1113                return
1114                ;;
1115        esac
1116        __git_complete_revlist
1117}
1118
1119_git_show ()
1120{
1121        local cur="${COMP_WORDS[COMP_CWORD]}"
1122        case "$cur" in
1123        --pretty=*)
1124                __gitcomp "
1125                        oneline short medium full fuller email raw
1126                        " "" "${cur##--pretty=}"
1127                return
1128                ;;
1129        --*)
1130                __gitcomp "--pretty="
1131                return
1132                ;;
1133        esac
1134        __git_complete_file
1135}
1136
1137_git_stash ()
1138{
1139        local subcommands='save list show apply clear drop pop create'
1140        local subcommand="$(__git_find_subcommand "$subcommands")"
1141        if [ -z "$subcommand" ]; then
1142                __gitcomp "$subcommands"
1143        else
1144                local cur="${COMP_WORDS[COMP_CWORD]}"
1145                case "$subcommand,$cur" in
1146                save,--*)
1147                        __gitcomp "--keep-index"
1148                        ;;
1149                *)
1150                        COMPREPLY=()
1151                        ;;
1152                esac
1153        fi
1154}
1155
1156_git_submodule ()
1157{
1158        local subcommands="add status init update"
1159        if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1160                local cur="${COMP_WORDS[COMP_CWORD]}"
1161                case "$cur" in
1162                --*)
1163                        __gitcomp "--quiet --cached"
1164                        ;;
1165                *)
1166                        __gitcomp "$subcommands"
1167                        ;;
1168                esac
1169                return
1170        fi
1171}
1172
1173_git_svn ()
1174{
1175        local subcommands="
1176                init fetch clone rebase dcommit log find-rev
1177                set-tree commit-diff info create-ignore propget
1178                proplist show-ignore show-externals
1179                "
1180        local subcommand="$(__git_find_subcommand "$subcommands")"
1181        if [ -z "$subcommand" ]; then
1182                __gitcomp "$subcommands"
1183        else
1184                local remote_opts="--username= --config-dir= --no-auth-cache"
1185                local fc_opts="
1186                        --follow-parent --authors-file= --repack=
1187                        --no-metadata --use-svm-props --use-svnsync-props
1188                        --log-window-size= --no-checkout --quiet
1189                        --repack-flags --user-log-author $remote_opts
1190                        "
1191                local init_opts="
1192                        --template= --shared= --trunk= --tags=
1193                        --branches= --stdlayout --minimize-url
1194                        --no-metadata --use-svm-props --use-svnsync-props
1195                        --rewrite-root= $remote_opts
1196                        "
1197                local cmt_opts="
1198                        --edit --rmdir --find-copies-harder --copy-similarity=
1199                        "
1200
1201                local cur="${COMP_WORDS[COMP_CWORD]}"
1202                case "$subcommand,$cur" in
1203                fetch,--*)
1204                        __gitcomp "--revision= --fetch-all $fc_opts"
1205                        ;;
1206                clone,--*)
1207                        __gitcomp "--revision= $fc_opts $init_opts"
1208                        ;;
1209                init,--*)
1210                        __gitcomp "$init_opts"
1211                        ;;
1212                dcommit,--*)
1213                        __gitcomp "
1214                                --merge --strategy= --verbose --dry-run
1215                                --fetch-all --no-rebase $cmt_opts $fc_opts
1216                                "
1217                        ;;
1218                set-tree,--*)
1219                        __gitcomp "--stdin $cmt_opts $fc_opts"
1220                        ;;
1221                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1222                show-externals,--*)
1223                        __gitcomp "--revision="
1224                        ;;
1225                log,--*)
1226                        __gitcomp "
1227                                --limit= --revision= --verbose --incremental
1228                                --oneline --show-commit --non-recursive
1229                                --authors-file=
1230                                "
1231                        ;;
1232                rebase,--*)
1233                        __gitcomp "
1234                                --merge --verbose --strategy= --local
1235                                --fetch-all $fc_opts
1236                                "
1237                        ;;
1238                commit-diff,--*)
1239                        __gitcomp "--message= --file= --revision= $cmt_opts"
1240                        ;;
1241                info,--*)
1242                        __gitcomp "--url"
1243                        ;;
1244                *)
1245                        COMPREPLY=()
1246                        ;;
1247                esac
1248        fi
1249}
1250
1251_git_tag ()
1252{
1253        local i c=1 f=0
1254        while [ $c -lt $COMP_CWORD ]; do
1255                i="${COMP_WORDS[c]}"
1256                case "$i" in
1257                -d|-v)
1258                        __gitcomp "$(__git_tags)"
1259                        return
1260                        ;;
1261                -f)
1262                        f=1
1263                        ;;
1264                esac
1265                c=$((++c))
1266        done
1267
1268        case "${COMP_WORDS[COMP_CWORD-1]}" in
1269        -m|-F)
1270                COMPREPLY=()
1271                ;;
1272        -*|tag|git-tag)
1273                if [ $f = 1 ]; then
1274                        __gitcomp "$(__git_tags)"
1275                else
1276                        COMPREPLY=()
1277                fi
1278                ;;
1279        *)
1280                __gitcomp "$(__git_refs)"
1281                ;;
1282        esac
1283}
1284
1285_git ()
1286{
1287        local i c=1 command __git_dir
1288
1289        while [ $c -lt $COMP_CWORD ]; do
1290                i="${COMP_WORDS[c]}"
1291                case "$i" in
1292                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1293                --bare)      __git_dir="." ;;
1294                --version|--help|-p|--paginate) ;;
1295                *) command="$i"; break ;;
1296                esac
1297                c=$((++c))
1298        done
1299
1300        if [ -z "$command" ]; then
1301                case "${COMP_WORDS[COMP_CWORD]}" in
1302                --*=*) COMPREPLY=() ;;
1303                --*)   __gitcomp "
1304                        --paginate
1305                        --no-pager
1306                        --git-dir=
1307                        --bare
1308                        --version
1309                        --exec-path
1310                        --work-tree=
1311                        --help
1312                        "
1313                        ;;
1314                *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1315                esac
1316                return
1317        fi
1318
1319        local expansion=$(__git_aliased_command "$command")
1320        [ "$expansion" ] && command="$expansion"
1321
1322        case "$command" in
1323        am)          _git_am ;;
1324        add)         _git_add ;;
1325        apply)       _git_apply ;;
1326        bisect)      _git_bisect ;;
1327        bundle)      _git_bundle ;;
1328        branch)      _git_branch ;;
1329        checkout)    _git_checkout ;;
1330        cherry)      _git_cherry ;;
1331        cherry-pick) _git_cherry_pick ;;
1332        commit)      _git_commit ;;
1333        config)      _git_config ;;
1334        describe)    _git_describe ;;
1335        diff)        _git_diff ;;
1336        fetch)       _git_fetch ;;
1337        format-patch) _git_format_patch ;;
1338        gc)          _git_gc ;;
1339        log)         _git_log ;;
1340        ls-remote)   _git_ls_remote ;;
1341        ls-tree)     _git_ls_tree ;;
1342        merge)       _git_merge;;
1343        merge-base)  _git_merge_base ;;
1344        name-rev)    _git_name_rev ;;
1345        pull)        _git_pull ;;
1346        push)        _git_push ;;
1347        rebase)      _git_rebase ;;
1348        remote)      _git_remote ;;
1349        reset)       _git_reset ;;
1350        shortlog)    _git_shortlog ;;
1351        show)        _git_show ;;
1352        show-branch) _git_log ;;
1353        stash)       _git_stash ;;
1354        submodule)   _git_submodule ;;
1355        svn)         _git_svn ;;
1356        tag)         _git_tag ;;
1357        whatchanged) _git_log ;;
1358        *)           COMPREPLY=() ;;
1359        esac
1360}
1361
1362_gitk ()
1363{
1364        local cur="${COMP_WORDS[COMP_CWORD]}"
1365        local g="$(git rev-parse --git-dir 2>/dev/null)"
1366        local merge=""
1367        if [ -f $g/MERGE_HEAD ]; then
1368                merge="--merge"
1369        fi
1370        case "$cur" in
1371        --*)
1372                __gitcomp "--not --all $merge"
1373                return
1374                ;;
1375        esac
1376        __git_complete_revlist
1377}
1378
1379complete -o default -o nospace -F _git git
1380complete -o default -o nospace -F _gitk gitk
1381complete -o default -o nospace -F _git_am git-am
1382complete -o default -o nospace -F _git_apply git-apply
1383complete -o default -o nospace -F _git_bisect git-bisect
1384complete -o default -o nospace -F _git_branch git-branch
1385complete -o default -o nospace -F _git_bundle git-bundle
1386complete -o default -o nospace -F _git_checkout git-checkout
1387complete -o default -o nospace -F _git_cherry git-cherry
1388complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1389complete -o default -o nospace -F _git_commit git-commit
1390complete -o default -o nospace -F _git_describe git-describe
1391complete -o default -o nospace -F _git_diff git-diff
1392complete -o default -o nospace -F _git_fetch git-fetch
1393complete -o default -o nospace -F _git_format_patch git-format-patch
1394complete -o default -o nospace -F _git_gc git-gc
1395complete -o default -o nospace -F _git_log git-log
1396complete -o default -o nospace -F _git_ls_remote git-ls-remote
1397complete -o default -o nospace -F _git_ls_tree git-ls-tree
1398complete -o default -o nospace -F _git_merge git-merge
1399complete -o default -o nospace -F _git_merge_base git-merge-base
1400complete -o default -o nospace -F _git_name_rev git-name-rev
1401complete -o default -o nospace -F _git_pull git-pull
1402complete -o default -o nospace -F _git_push git-push
1403complete -o default -o nospace -F _git_rebase git-rebase
1404complete -o default -o nospace -F _git_config git-config
1405complete -o default -o nospace -F _git_remote git-remote
1406complete -o default -o nospace -F _git_reset git-reset
1407complete -o default -o nospace -F _git_shortlog git-shortlog
1408complete -o default -o nospace -F _git_show git-show
1409complete -o default -o nospace -F _git_stash git-stash
1410complete -o default -o nospace -F _git_submodule git-submodule
1411complete -o default -o nospace -F _git_svn git-svn
1412complete -o default -o nospace -F _git_log git-show-branch
1413complete -o default -o nospace -F _git_tag git-tag
1414complete -o default -o nospace -F _git_log git-whatchanged
1415
1416# The following are necessary only for Cygwin, and only are needed
1417# when the user has tab-completed the executable name and consequently
1418# included the '.exe' suffix.
1419#
1420if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1421complete -o default -o nospace -F _git_add git-add.exe
1422complete -o default -o nospace -F _git_apply git-apply.exe
1423complete -o default -o nospace -F _git git.exe
1424complete -o default -o nospace -F _git_branch git-branch.exe
1425complete -o default -o nospace -F _git_bundle git-bundle.exe
1426complete -o default -o nospace -F _git_cherry git-cherry.exe
1427complete -o default -o nospace -F _git_describe git-describe.exe
1428complete -o default -o nospace -F _git_diff git-diff.exe
1429complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1430complete -o default -o nospace -F _git_log git-log.exe
1431complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1432complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1433complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1434complete -o default -o nospace -F _git_push git-push.exe
1435complete -o default -o nospace -F _git_config git-config
1436complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1437complete -o default -o nospace -F _git_show git-show.exe
1438complete -o default -o nospace -F _git_log git-show-branch.exe
1439complete -o default -o nospace -F _git_tag git-tag.exe
1440complete -o default -o nospace -F _git_log git-whatchanged.exe
1441fi