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