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