contrib / completion / git-completion.bashon commit am: --rebasing (3041c32)
   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        __gitcomp "$(__git_refs)"
 518}
 519
 520_git_bundle ()
 521{
 522        local mycword="$COMP_CWORD"
 523        case "${COMP_WORDS[0]}" in
 524        git)
 525                local cmd="${COMP_WORDS[2]}"
 526                mycword="$((mycword-1))"
 527                ;;
 528        git-bundle*)
 529                local cmd="${COMP_WORDS[1]}"
 530                ;;
 531        esac
 532        case "$mycword" in
 533        1)
 534                __gitcomp "create list-heads verify unbundle"
 535                ;;
 536        2)
 537                # looking for a file
 538                ;;
 539        *)
 540                case "$cmd" in
 541                        create)
 542                                __git_complete_revlist
 543                        ;;
 544                esac
 545                ;;
 546        esac
 547}
 548
 549_git_checkout ()
 550{
 551        __gitcomp "$(__git_refs)"
 552}
 553
 554_git_cherry ()
 555{
 556        __gitcomp "$(__git_refs)"
 557}
 558
 559_git_cherry_pick ()
 560{
 561        local cur="${COMP_WORDS[COMP_CWORD]}"
 562        case "$cur" in
 563        --*)
 564                __gitcomp "--edit --no-commit"
 565                ;;
 566        *)
 567                __gitcomp "$(__git_refs)"
 568                ;;
 569        esac
 570}
 571
 572_git_commit ()
 573{
 574        local cur="${COMP_WORDS[COMP_CWORD]}"
 575        case "$cur" in
 576        --*)
 577                __gitcomp "
 578                        --all --author= --signoff --verify --no-verify
 579                        --edit --amend --include --only
 580                        "
 581                return
 582        esac
 583        COMPREPLY=()
 584}
 585
 586_git_describe ()
 587{
 588        __gitcomp "$(__git_refs)"
 589}
 590
 591_git_diff ()
 592{
 593        local cur="${COMP_WORDS[COMP_CWORD]}"
 594        case "$cur" in
 595        --*)
 596                __gitcomp "--cached --stat --numstat --shortstat --summary
 597                        --patch-with-stat --name-only --name-status --color
 598                        --no-color --color-words --no-renames --check
 599                        --full-index --binary --abbrev --diff-filter
 600                        --find-copies-harder --pickaxe-all --pickaxe-regex
 601                        --text --ignore-space-at-eol --ignore-space-change
 602                        --ignore-all-space --exit-code --quiet --ext-diff
 603                        --no-ext-diff"
 604                return
 605                ;;
 606        esac
 607        __git_complete_file
 608}
 609
 610_git_diff_tree ()
 611{
 612        __gitcomp "$(__git_refs)"
 613}
 614
 615_git_fetch ()
 616{
 617        local cur="${COMP_WORDS[COMP_CWORD]}"
 618
 619        case "${COMP_WORDS[0]},$COMP_CWORD" in
 620        git-fetch*,1)
 621                __gitcomp "$(__git_remotes)"
 622                ;;
 623        git,2)
 624                __gitcomp "$(__git_remotes)"
 625                ;;
 626        *)
 627                case "$cur" in
 628                *:*)
 629                        __gitcomp "$(__git_refs)" "" "${cur#*:}"
 630                        ;;
 631                *)
 632                        local remote
 633                        case "${COMP_WORDS[0]}" in
 634                        git-fetch) remote="${COMP_WORDS[1]}" ;;
 635                        git)       remote="${COMP_WORDS[2]}" ;;
 636                        esac
 637                        __gitcomp "$(__git_refs2 "$remote")"
 638                        ;;
 639                esac
 640                ;;
 641        esac
 642}
 643
 644_git_format_patch ()
 645{
 646        local cur="${COMP_WORDS[COMP_CWORD]}"
 647        case "$cur" in
 648        --*)
 649                __gitcomp "
 650                        --stdout --attach --thread
 651                        --output-directory
 652                        --numbered --start-number
 653                        --numbered-files
 654                        --keep-subject
 655                        --signoff
 656                        --in-reply-to=
 657                        --full-index --binary
 658                        --not --all
 659                        --cover-letter
 660                        "
 661                return
 662                ;;
 663        esac
 664        __git_complete_revlist
 665}
 666
 667_git_gc ()
 668{
 669        local cur="${COMP_WORDS[COMP_CWORD]}"
 670        case "$cur" in
 671        --*)
 672                __gitcomp "--prune --aggressive"
 673                return
 674                ;;
 675        esac
 676        COMPREPLY=()
 677}
 678
 679_git_ls_remote ()
 680{
 681        __gitcomp "$(__git_remotes)"
 682}
 683
 684_git_ls_tree ()
 685{
 686        __git_complete_file
 687}
 688
 689_git_log ()
 690{
 691        local cur="${COMP_WORDS[COMP_CWORD]}"
 692        case "$cur" in
 693        --pretty=*)
 694                __gitcomp "
 695                        oneline short medium full fuller email raw
 696                        " "" "${cur##--pretty=}"
 697                return
 698                ;;
 699        --date=*)
 700                __gitcomp "
 701                        relative iso8601 rfc2822 short local default
 702                " "" "${cur##--date=}"
 703                return
 704                ;;
 705        --*)
 706                __gitcomp "
 707                        --max-count= --max-age= --since= --after=
 708                        --min-age= --before= --until=
 709                        --root --topo-order --date-order --reverse
 710                        --no-merges --follow
 711                        --abbrev-commit --abbrev=
 712                        --relative-date --date=
 713                        --author= --committer= --grep=
 714                        --all-match
 715                        --pretty= --name-status --name-only --raw
 716                        --not --all
 717                        --left-right --cherry-pick
 718                        "
 719                return
 720                ;;
 721        esac
 722        __git_complete_revlist
 723}
 724
 725_git_merge ()
 726{
 727        local cur="${COMP_WORDS[COMP_CWORD]}"
 728        case "${COMP_WORDS[COMP_CWORD-1]}" in
 729        -s|--strategy)
 730                __gitcomp "$(__git_merge_strategies)"
 731                return
 732        esac
 733        case "$cur" in
 734        --strategy=*)
 735                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 736                return
 737                ;;
 738        --*)
 739                __gitcomp "
 740                        --no-commit --no-summary --squash --strategy
 741                        "
 742                return
 743        esac
 744        __gitcomp "$(__git_refs)"
 745}
 746
 747_git_merge_base ()
 748{
 749        __gitcomp "$(__git_refs)"
 750}
 751
 752_git_name_rev ()
 753{
 754        __gitcomp "--tags --all --stdin"
 755}
 756
 757_git_pull ()
 758{
 759        local cur="${COMP_WORDS[COMP_CWORD]}"
 760
 761        case "${COMP_WORDS[0]},$COMP_CWORD" in
 762        git-pull*,1)
 763                __gitcomp "$(__git_remotes)"
 764                ;;
 765        git,2)
 766                __gitcomp "$(__git_remotes)"
 767                ;;
 768        *)
 769                local remote
 770                case "${COMP_WORDS[0]}" in
 771                git-pull)  remote="${COMP_WORDS[1]}" ;;
 772                git)       remote="${COMP_WORDS[2]}" ;;
 773                esac
 774                __gitcomp "$(__git_refs "$remote")"
 775                ;;
 776        esac
 777}
 778
 779_git_push ()
 780{
 781        local cur="${COMP_WORDS[COMP_CWORD]}"
 782
 783        case "${COMP_WORDS[0]},$COMP_CWORD" in
 784        git-push*,1)
 785                __gitcomp "$(__git_remotes)"
 786                ;;
 787        git,2)
 788                __gitcomp "$(__git_remotes)"
 789                ;;
 790        *)
 791                case "$cur" in
 792                *:*)
 793                        local remote
 794                        case "${COMP_WORDS[0]}" in
 795                        git-push)  remote="${COMP_WORDS[1]}" ;;
 796                        git)       remote="${COMP_WORDS[2]}" ;;
 797                        esac
 798                        __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
 799                        ;;
 800                +*)
 801                        __gitcomp "$(__git_refs)" + "${cur#+}"
 802                        ;;
 803                *)
 804                        __gitcomp "$(__git_refs)"
 805                        ;;
 806                esac
 807                ;;
 808        esac
 809}
 810
 811_git_rebase ()
 812{
 813        local cur="${COMP_WORDS[COMP_CWORD]}"
 814        if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
 815                __gitcomp "--continue --skip --abort"
 816                return
 817        fi
 818        case "${COMP_WORDS[COMP_CWORD-1]}" in
 819        -s|--strategy)
 820                __gitcomp "$(__git_merge_strategies)"
 821                return
 822        esac
 823        case "$cur" in
 824        --strategy=*)
 825                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 826                return
 827                ;;
 828        --*)
 829                __gitcomp "--onto --merge --strategy"
 830                return
 831        esac
 832        __gitcomp "$(__git_refs)"
 833}
 834
 835_git_config ()
 836{
 837        local cur="${COMP_WORDS[COMP_CWORD]}"
 838        local prv="${COMP_WORDS[COMP_CWORD-1]}"
 839        case "$prv" in
 840        branch.*.remote)
 841                __gitcomp "$(__git_remotes)"
 842                return
 843                ;;
 844        branch.*.merge)
 845                __gitcomp "$(__git_refs)"
 846                return
 847                ;;
 848        remote.*.fetch)
 849                local remote="${prv#remote.}"
 850                remote="${remote%.fetch}"
 851                __gitcomp "$(__git_refs_remotes "$remote")"
 852                return
 853                ;;
 854        remote.*.push)
 855                local remote="${prv#remote.}"
 856                remote="${remote%.push}"
 857                __gitcomp "$(git --git-dir="$(__gitdir)" \
 858                        for-each-ref --format='%(refname):%(refname)' \
 859                        refs/heads)"
 860                return
 861                ;;
 862        pull.twohead|pull.octopus)
 863                __gitcomp "$(__git_merge_strategies)"
 864                return
 865                ;;
 866        color.branch|color.diff|color.status)
 867                __gitcomp "always never auto"
 868                return
 869                ;;
 870        color.*.*)
 871                __gitcomp "
 872                        black red green yellow blue magenta cyan white
 873                        bold dim ul blink reverse
 874                        "
 875                return
 876                ;;
 877        *.*)
 878                COMPREPLY=()
 879                return
 880                ;;
 881        esac
 882        case "$cur" in
 883        --*)
 884                __gitcomp "
 885                        --global --system --file=
 886                        --list --replace-all
 887                        --get --get-all --get-regexp
 888                        --add --unset --unset-all
 889                        --remove-section --rename-section
 890                        "
 891                return
 892                ;;
 893        branch.*.*)
 894                local pfx="${cur%.*}."
 895                cur="${cur##*.}"
 896                __gitcomp "remote merge" "$pfx" "$cur"
 897                return
 898                ;;
 899        branch.*)
 900                local pfx="${cur%.*}."
 901                cur="${cur#*.}"
 902                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
 903                return
 904                ;;
 905        remote.*.*)
 906                local pfx="${cur%.*}."
 907                cur="${cur##*.}"
 908                __gitcomp "
 909                        url fetch push skipDefaultUpdate
 910                        receivepack uploadpack tagopt
 911                        " "$pfx" "$cur"
 912                return
 913                ;;
 914        remote.*)
 915                local pfx="${cur%.*}."
 916                cur="${cur#*.}"
 917                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
 918                return
 919                ;;
 920        esac
 921        __gitcomp "
 922                apply.whitespace
 923                core.fileMode
 924                core.gitProxy
 925                core.ignoreStat
 926                core.preferSymlinkRefs
 927                core.logAllRefUpdates
 928                core.loosecompression
 929                core.repositoryFormatVersion
 930                core.sharedRepository
 931                core.warnAmbiguousRefs
 932                core.compression
 933                core.legacyHeaders
 934                core.packedGitWindowSize
 935                core.packedGitLimit
 936                clean.requireForce
 937                color.branch
 938                color.branch.current
 939                color.branch.local
 940                color.branch.remote
 941                color.branch.plain
 942                color.diff
 943                color.diff.plain
 944                color.diff.meta
 945                color.diff.frag
 946                color.diff.old
 947                color.diff.new
 948                color.diff.commit
 949                color.diff.whitespace
 950                color.pager
 951                color.status
 952                color.status.header
 953                color.status.added
 954                color.status.changed
 955                color.status.untracked
 956                diff.renameLimit
 957                diff.renames
 958                fetch.unpackLimit
 959                format.headers
 960                format.subjectprefix
 961                gitcvs.enabled
 962                gitcvs.logfile
 963                gitcvs.allbinary
 964                gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
 965                gc.packrefs
 966                gc.reflogexpire
 967                gc.reflogexpireunreachable
 968                gc.rerereresolved
 969                gc.rerereunresolved
 970                http.sslVerify
 971                http.sslCert
 972                http.sslKey
 973                http.sslCAInfo
 974                http.sslCAPath
 975                http.maxRequests
 976                http.lowSpeedLimit
 977                http.lowSpeedTime
 978                http.noEPSV
 979                i18n.commitEncoding
 980                i18n.logOutputEncoding
 981                log.showroot
 982                merge.tool
 983                merge.summary
 984                merge.verbosity
 985                pack.window
 986                pack.depth
 987                pack.windowMemory
 988                pack.compression
 989                pack.deltaCacheSize
 990                pack.deltaCacheLimit
 991                pull.octopus
 992                pull.twohead
 993                repack.useDeltaBaseOffset
 994                show.difftree
 995                showbranch.default
 996                tar.umask
 997                transfer.unpackLimit
 998                receive.unpackLimit
 999                receive.denyNonFastForwards
1000                user.name
1001                user.email
1002                user.signingkey
1003                whatchanged.difftree
1004                branch. remote.
1005        "
1006}
1007
1008_git_remote ()
1009{
1010        local i c=1 command
1011        while [ $c -lt $COMP_CWORD ]; do
1012                i="${COMP_WORDS[c]}"
1013                case "$i" in
1014                add|rm|show|prune|update) command="$i"; break ;;
1015                esac
1016                c=$((++c))
1017        done
1018
1019        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1020                __gitcomp "add rm show prune update"
1021                return
1022        fi
1023
1024        case "$command" in
1025        rm|show|prune)
1026                __gitcomp "$(__git_remotes)"
1027                ;;
1028        update)
1029                local i c='' IFS=$'\n'
1030                for i in $(git --git-dir="$(__gitdir)" config --list); do
1031                        case "$i" in
1032                        remotes.*)
1033                                i="${i#remotes.}"
1034                                c="$c ${i/=*/}"
1035                                ;;
1036                        esac
1037                done
1038                __gitcomp "$c"
1039                ;;
1040        *)
1041                COMPREPLY=()
1042                ;;
1043        esac
1044}
1045
1046_git_reset ()
1047{
1048        local cur="${COMP_WORDS[COMP_CWORD]}"
1049        case "$cur" in
1050        --*)
1051                __gitcomp "--mixed --hard --soft"
1052                return
1053                ;;
1054        esac
1055        __gitcomp "$(__git_refs)"
1056}
1057
1058_git_shortlog ()
1059{
1060        local cur="${COMP_WORDS[COMP_CWORD]}"
1061        case "$cur" in
1062        --*)
1063                __gitcomp "
1064                        --max-count= --max-age= --since= --after=
1065                        --min-age= --before= --until=
1066                        --no-merges
1067                        --author= --committer= --grep=
1068                        --all-match
1069                        --not --all
1070                        --numbered --summary
1071                        "
1072                return
1073                ;;
1074        esac
1075        __git_complete_revlist
1076}
1077
1078_git_show ()
1079{
1080        local cur="${COMP_WORDS[COMP_CWORD]}"
1081        case "$cur" in
1082        --pretty=*)
1083                __gitcomp "
1084                        oneline short medium full fuller email raw
1085                        " "" "${cur##--pretty=}"
1086                return
1087                ;;
1088        --*)
1089                __gitcomp "--pretty="
1090                return
1091                ;;
1092        esac
1093        __git_complete_file
1094}
1095
1096_git_stash ()
1097{
1098        __gitcomp 'list show apply clear'
1099}
1100
1101_git_submodule ()
1102{
1103        local i c=1 command
1104        while [ $c -lt $COMP_CWORD ]; do
1105                i="${COMP_WORDS[c]}"
1106                case "$i" in
1107                add|status|init|update) command="$i"; break ;;
1108                esac
1109                c=$((++c))
1110        done
1111
1112        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1113                local cur="${COMP_WORDS[COMP_CWORD]}"
1114                case "$cur" in
1115                --*)
1116                        __gitcomp "--quiet --cached"
1117                        ;;
1118                *)
1119                        __gitcomp "add status init update"
1120                        ;;
1121                esac
1122                return
1123        fi
1124}
1125
1126_git_tag ()
1127{
1128        local i c=1 f=0
1129        while [ $c -lt $COMP_CWORD ]; do
1130                i="${COMP_WORDS[c]}"
1131                case "$i" in
1132                -d|-v)
1133                        __gitcomp "$(__git_tags)"
1134                        return
1135                        ;;
1136                -f)
1137                        f=1
1138                        ;;
1139                esac
1140                c=$((++c))
1141        done
1142
1143        case "${COMP_WORDS[COMP_CWORD-1]}" in
1144        -m|-F)
1145                COMPREPLY=()
1146                ;;
1147        -*|tag|git-tag)
1148                if [ $f = 1 ]; then
1149                        __gitcomp "$(__git_tags)"
1150                else
1151                        COMPREPLY=()
1152                fi
1153                ;;
1154        *)
1155                __gitcomp "$(__git_refs)"
1156                ;;
1157        esac
1158}
1159
1160_git ()
1161{
1162        local i c=1 command __git_dir
1163
1164        while [ $c -lt $COMP_CWORD ]; do
1165                i="${COMP_WORDS[c]}"
1166                case "$i" in
1167                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1168                --bare)      __git_dir="." ;;
1169                --version|--help|-p|--paginate) ;;
1170                *) command="$i"; break ;;
1171                esac
1172                c=$((++c))
1173        done
1174
1175        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1176                case "${COMP_WORDS[COMP_CWORD]}" in
1177                --*=*) COMPREPLY=() ;;
1178                --*)   __gitcomp "
1179                        --no-pager
1180                        --git-dir=
1181                        --bare
1182                        --version
1183                        --exec-path
1184                        "
1185                        ;;
1186                *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1187                esac
1188                return
1189        fi
1190
1191        local expansion=$(__git_aliased_command "$command")
1192        [ "$expansion" ] && command="$expansion"
1193
1194        case "$command" in
1195        am)          _git_am ;;
1196        add)         _git_add ;;
1197        apply)       _git_apply ;;
1198        bisect)      _git_bisect ;;
1199        bundle)      _git_bundle ;;
1200        branch)      _git_branch ;;
1201        checkout)    _git_checkout ;;
1202        cherry)      _git_cherry ;;
1203        cherry-pick) _git_cherry_pick ;;
1204        commit)      _git_commit ;;
1205        config)      _git_config ;;
1206        describe)    _git_describe ;;
1207        diff)        _git_diff ;;
1208        fetch)       _git_fetch ;;
1209        format-patch) _git_format_patch ;;
1210        gc)          _git_gc ;;
1211        log)         _git_log ;;
1212        ls-remote)   _git_ls_remote ;;
1213        ls-tree)     _git_ls_tree ;;
1214        merge)       _git_merge;;
1215        merge-base)  _git_merge_base ;;
1216        name-rev)    _git_name_rev ;;
1217        pull)        _git_pull ;;
1218        push)        _git_push ;;
1219        rebase)      _git_rebase ;;
1220        remote)      _git_remote ;;
1221        reset)       _git_reset ;;
1222        shortlog)    _git_shortlog ;;
1223        show)        _git_show ;;
1224        show-branch) _git_log ;;
1225        stash)       _git_stash ;;
1226        submodule)   _git_submodule ;;
1227        tag)         _git_tag ;;
1228        whatchanged) _git_log ;;
1229        *)           COMPREPLY=() ;;
1230        esac
1231}
1232
1233_gitk ()
1234{
1235        local cur="${COMP_WORDS[COMP_CWORD]}"
1236        case "$cur" in
1237        --*)
1238                __gitcomp "--not --all"
1239                return
1240                ;;
1241        esac
1242        __git_complete_revlist
1243}
1244
1245complete -o default -o nospace -F _git git
1246complete -o default -o nospace -F _gitk gitk
1247complete -o default -o nospace -F _git_am git-am
1248complete -o default -o nospace -F _git_apply git-apply
1249complete -o default -o nospace -F _git_bisect git-bisect
1250complete -o default -o nospace -F _git_branch git-branch
1251complete -o default -o nospace -F _git_bundle git-bundle
1252complete -o default -o nospace -F _git_checkout git-checkout
1253complete -o default -o nospace -F _git_cherry git-cherry
1254complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1255complete -o default -o nospace -F _git_commit git-commit
1256complete -o default -o nospace -F _git_describe git-describe
1257complete -o default -o nospace -F _git_diff git-diff
1258complete -o default -o nospace -F _git_fetch git-fetch
1259complete -o default -o nospace -F _git_format_patch git-format-patch
1260complete -o default -o nospace -F _git_gc git-gc
1261complete -o default -o nospace -F _git_log git-log
1262complete -o default -o nospace -F _git_ls_remote git-ls-remote
1263complete -o default -o nospace -F _git_ls_tree git-ls-tree
1264complete -o default -o nospace -F _git_merge git-merge
1265complete -o default -o nospace -F _git_merge_base git-merge-base
1266complete -o default -o nospace -F _git_name_rev git-name-rev
1267complete -o default -o nospace -F _git_pull git-pull
1268complete -o default -o nospace -F _git_push git-push
1269complete -o default -o nospace -F _git_rebase git-rebase
1270complete -o default -o nospace -F _git_config git-config
1271complete -o default -o nospace -F _git_remote git-remote
1272complete -o default -o nospace -F _git_reset git-reset
1273complete -o default -o nospace -F _git_shortlog git-shortlog
1274complete -o default -o nospace -F _git_show git-show
1275complete -o default -o nospace -F _git_stash git-stash
1276complete -o default -o nospace -F _git_submodule git-submodule
1277complete -o default -o nospace -F _git_log git-show-branch
1278complete -o default -o nospace -F _git_tag git-tag
1279complete -o default -o nospace -F _git_log git-whatchanged
1280
1281# The following are necessary only for Cygwin, and only are needed
1282# when the user has tab-completed the executable name and consequently
1283# included the '.exe' suffix.
1284#
1285if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1286complete -o default -o nospace -F _git_add git-add.exe
1287complete -o default -o nospace -F _git_apply git-apply.exe
1288complete -o default -o nospace -F _git git.exe
1289complete -o default -o nospace -F _git_branch git-branch.exe
1290complete -o default -o nospace -F _git_bundle git-bundle.exe
1291complete -o default -o nospace -F _git_cherry git-cherry.exe
1292complete -o default -o nospace -F _git_describe git-describe.exe
1293complete -o default -o nospace -F _git_diff git-diff.exe
1294complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1295complete -o default -o nospace -F _git_log git-log.exe
1296complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1297complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1298complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1299complete -o default -o nospace -F _git_push git-push.exe
1300complete -o default -o nospace -F _git_config git-config
1301complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1302complete -o default -o nospace -F _git_show git-show.exe
1303complete -o default -o nospace -F _git_log git-show-branch.exe
1304complete -o default -o nospace -F _git_tag git-tag.exe
1305complete -o default -o nospace -F _git_log git-whatchanged.exe
1306fi