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