contrib / completion / git-completion.bashon commit bash completion: Don't offer "a.." as a completion for "a." (6c36c9e)
   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 reset visualize replay log"
 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)
 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
 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                        "
 789                return
 790                ;;
 791        esac
 792        __git_complete_revlist
 793}
 794
 795_git_merge ()
 796{
 797        local cur="${COMP_WORDS[COMP_CWORD]}"
 798        case "${COMP_WORDS[COMP_CWORD-1]}" in
 799        -s|--strategy)
 800                __gitcomp "$(__git_merge_strategies)"
 801                return
 802        esac
 803        case "$cur" in
 804        --strategy=*)
 805                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 806                return
 807                ;;
 808        --*)
 809                __gitcomp "
 810                        --no-commit --no-stat --log --no-log --squash --strategy
 811                        "
 812                return
 813        esac
 814        __gitcomp "$(__git_refs)"
 815}
 816
 817_git_merge_base ()
 818{
 819        __gitcomp "$(__git_refs)"
 820}
 821
 822_git_name_rev ()
 823{
 824        __gitcomp "--tags --all --stdin"
 825}
 826
 827_git_pull ()
 828{
 829        local cur="${COMP_WORDS[COMP_CWORD]}"
 830
 831        case "${COMP_WORDS[0]},$COMP_CWORD" in
 832        git-pull*,1)
 833                __gitcomp "$(__git_remotes)"
 834                ;;
 835        git,2)
 836                __gitcomp "$(__git_remotes)"
 837                ;;
 838        *)
 839                local remote
 840                case "${COMP_WORDS[0]}" in
 841                git-pull)  remote="${COMP_WORDS[1]}" ;;
 842                git)       remote="${COMP_WORDS[2]}" ;;
 843                esac
 844                __gitcomp "$(__git_refs "$remote")"
 845                ;;
 846        esac
 847}
 848
 849_git_push ()
 850{
 851        local cur="${COMP_WORDS[COMP_CWORD]}"
 852
 853        case "${COMP_WORDS[0]},$COMP_CWORD" in
 854        git-push*,1)
 855                __gitcomp "$(__git_remotes)"
 856                ;;
 857        git,2)
 858                __gitcomp "$(__git_remotes)"
 859                ;;
 860        *)
 861                case "$cur" in
 862                *:*)
 863                        local remote
 864                        case "${COMP_WORDS[0]}" in
 865                        git-push)  remote="${COMP_WORDS[1]}" ;;
 866                        git)       remote="${COMP_WORDS[2]}" ;;
 867                        esac
 868                        __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
 869                        ;;
 870                +*)
 871                        __gitcomp "$(__git_refs)" + "${cur#+}"
 872                        ;;
 873                *)
 874                        __gitcomp "$(__git_refs)"
 875                        ;;
 876                esac
 877                ;;
 878        esac
 879}
 880
 881_git_rebase ()
 882{
 883        local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
 884        if [ -d .dotest ] || [ -d "$dir"/.dotest-merge ]; then
 885                __gitcomp "--continue --skip --abort"
 886                return
 887        fi
 888        case "${COMP_WORDS[COMP_CWORD-1]}" in
 889        -s|--strategy)
 890                __gitcomp "$(__git_merge_strategies)"
 891                return
 892        esac
 893        case "$cur" in
 894        --strategy=*)
 895                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 896                return
 897                ;;
 898        --*)
 899                __gitcomp "--onto --merge --strategy --interactive"
 900                return
 901        esac
 902        __gitcomp "$(__git_refs)"
 903}
 904
 905_git_config ()
 906{
 907        local cur="${COMP_WORDS[COMP_CWORD]}"
 908        local prv="${COMP_WORDS[COMP_CWORD-1]}"
 909        case "$prv" in
 910        branch.*.remote)
 911                __gitcomp "$(__git_remotes)"
 912                return
 913                ;;
 914        branch.*.merge)
 915                __gitcomp "$(__git_refs)"
 916                return
 917                ;;
 918        remote.*.fetch)
 919                local remote="${prv#remote.}"
 920                remote="${remote%.fetch}"
 921                __gitcomp "$(__git_refs_remotes "$remote")"
 922                return
 923                ;;
 924        remote.*.push)
 925                local remote="${prv#remote.}"
 926                remote="${remote%.push}"
 927                __gitcomp "$(git --git-dir="$(__gitdir)" \
 928                        for-each-ref --format='%(refname):%(refname)' \
 929                        refs/heads)"
 930                return
 931                ;;
 932        pull.twohead|pull.octopus)
 933                __gitcomp "$(__git_merge_strategies)"
 934                return
 935                ;;
 936        color.branch|color.diff|color.status)
 937                __gitcomp "always never auto"
 938                return
 939                ;;
 940        color.*.*)
 941                __gitcomp "
 942                        black red green yellow blue magenta cyan white
 943                        bold dim ul blink reverse
 944                        "
 945                return
 946                ;;
 947        *.*)
 948                COMPREPLY=()
 949                return
 950                ;;
 951        esac
 952        case "$cur" in
 953        --*)
 954                __gitcomp "
 955                        --global --system --file=
 956                        --list --replace-all
 957                        --get --get-all --get-regexp
 958                        --add --unset --unset-all
 959                        --remove-section --rename-section
 960                        "
 961                return
 962                ;;
 963        branch.*.*)
 964                local pfx="${cur%.*}."
 965                cur="${cur##*.}"
 966                __gitcomp "remote merge" "$pfx" "$cur"
 967                return
 968                ;;
 969        branch.*)
 970                local pfx="${cur%.*}."
 971                cur="${cur#*.}"
 972                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
 973                return
 974                ;;
 975        remote.*.*)
 976                local pfx="${cur%.*}."
 977                cur="${cur##*.}"
 978                __gitcomp "
 979                        url fetch push skipDefaultUpdate
 980                        receivepack uploadpack tagopt
 981                        " "$pfx" "$cur"
 982                return
 983                ;;
 984        remote.*)
 985                local pfx="${cur%.*}."
 986                cur="${cur#*.}"
 987                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
 988                return
 989                ;;
 990        esac
 991        __gitcomp "
 992                apply.whitespace
 993                core.fileMode
 994                core.gitProxy
 995                core.ignoreStat
 996                core.preferSymlinkRefs
 997                core.logAllRefUpdates
 998                core.loosecompression
 999                core.repositoryFormatVersion
1000                core.sharedRepository
1001                core.warnAmbiguousRefs
1002                core.compression
1003                core.packedGitWindowSize
1004                core.packedGitLimit
1005                clean.requireForce
1006                color.branch
1007                color.branch.current
1008                color.branch.local
1009                color.branch.remote
1010                color.branch.plain
1011                color.diff
1012                color.diff.plain
1013                color.diff.meta
1014                color.diff.frag
1015                color.diff.old
1016                color.diff.new
1017                color.diff.commit
1018                color.diff.whitespace
1019                color.pager
1020                color.status
1021                color.status.header
1022                color.status.added
1023                color.status.changed
1024                color.status.untracked
1025                diff.renameLimit
1026                diff.renames
1027                fetch.unpackLimit
1028                format.headers
1029                format.subjectprefix
1030                gitcvs.enabled
1031                gitcvs.logfile
1032                gitcvs.allbinary
1033                gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dbpass
1034                gitcvs.dbtablenameprefix
1035                gc.packrefs
1036                gc.reflogexpire
1037                gc.reflogexpireunreachable
1038                gc.rerereresolved
1039                gc.rerereunresolved
1040                http.sslVerify
1041                http.sslCert
1042                http.sslKey
1043                http.sslCAInfo
1044                http.sslCAPath
1045                http.maxRequests
1046                http.lowSpeedLimit
1047                http.lowSpeedTime
1048                http.noEPSV
1049                i18n.commitEncoding
1050                i18n.logOutputEncoding
1051                log.showroot
1052                merge.tool
1053                merge.summary
1054                merge.verbosity
1055                pack.window
1056                pack.depth
1057                pack.windowMemory
1058                pack.compression
1059                pack.deltaCacheSize
1060                pack.deltaCacheLimit
1061                pull.octopus
1062                pull.twohead
1063                repack.useDeltaBaseOffset
1064                show.difftree
1065                showbranch.default
1066                tar.umask
1067                transfer.unpackLimit
1068                receive.unpackLimit
1069                receive.denyNonFastForwards
1070                user.name
1071                user.email
1072                user.signingkey
1073                whatchanged.difftree
1074                branch. remote.
1075        "
1076}
1077
1078_git_remote ()
1079{
1080        local subcommands="add rm show prune update"
1081        local subcommand="$(__git_find_subcommand "$subcommands")"
1082        if [ -z "$subcommand" ]; then
1083                __gitcomp "$subcommands"
1084                return
1085        fi
1086
1087        case "$subcommand" in
1088        rm|show|prune)
1089                __gitcomp "$(__git_remotes)"
1090                ;;
1091        update)
1092                local i c='' IFS=$'\n'
1093                for i in $(git --git-dir="$(__gitdir)" config --list); do
1094                        case "$i" in
1095                        remotes.*)
1096                                i="${i#remotes.}"
1097                                c="$c ${i/=*/}"
1098                                ;;
1099                        esac
1100                done
1101                __gitcomp "$c"
1102                ;;
1103        *)
1104                COMPREPLY=()
1105                ;;
1106        esac
1107}
1108
1109_git_reset ()
1110{
1111        __git_has_doubledash && return
1112
1113        local cur="${COMP_WORDS[COMP_CWORD]}"
1114        case "$cur" in
1115        --*)
1116                __gitcomp "--mixed --hard --soft"
1117                return
1118                ;;
1119        esac
1120        __gitcomp "$(__git_refs)"
1121}
1122
1123_git_shortlog ()
1124{
1125        __git_has_doubledash && return
1126
1127        local cur="${COMP_WORDS[COMP_CWORD]}"
1128        case "$cur" in
1129        --*)
1130                __gitcomp "
1131                        --max-count= --max-age= --since= --after=
1132                        --min-age= --before= --until=
1133                        --no-merges
1134                        --author= --committer= --grep=
1135                        --all-match
1136                        --not --all
1137                        --numbered --summary
1138                        "
1139                return
1140                ;;
1141        esac
1142        __git_complete_revlist
1143}
1144
1145_git_show ()
1146{
1147        local cur="${COMP_WORDS[COMP_CWORD]}"
1148        case "$cur" in
1149        --pretty=*)
1150                __gitcomp "
1151                        oneline short medium full fuller email raw
1152                        " "" "${cur##--pretty=}"
1153                return
1154                ;;
1155        --*)
1156                __gitcomp "--pretty="
1157                return
1158                ;;
1159        esac
1160        __git_complete_file
1161}
1162
1163_git_stash ()
1164{
1165        local subcommands='save list show apply clear drop pop create'
1166        if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1167                __gitcomp "$subcommands"
1168        fi
1169}
1170
1171_git_submodule ()
1172{
1173        __git_has_doubledash && return
1174
1175        local subcommands="add status init update"
1176        if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1177                local cur="${COMP_WORDS[COMP_CWORD]}"
1178                case "$cur" in
1179                --*)
1180                        __gitcomp "--quiet --cached"
1181                        ;;
1182                *)
1183                        __gitcomp "$subcommands"
1184                        ;;
1185                esac
1186                return
1187        fi
1188}
1189
1190_git_svn ()
1191{
1192        local subcommands="
1193                init fetch clone rebase dcommit log find-rev
1194                set-tree commit-diff info create-ignore propget
1195                proplist show-ignore show-externals
1196                "
1197        local subcommand="$(__git_find_subcommand "$subcommands")"
1198        if [ -z "$subcommand" ]; then
1199                __gitcomp "$subcommands"
1200        else
1201                local remote_opts="--username= --config-dir= --no-auth-cache"
1202                local fc_opts="
1203                        --follow-parent --authors-file= --repack=
1204                        --no-metadata --use-svm-props --use-svnsync-props
1205                        --log-window-size= --no-checkout --quiet
1206                        --repack-flags --user-log-author $remote_opts
1207                        "
1208                local init_opts="
1209                        --template= --shared= --trunk= --tags=
1210                        --branches= --stdlayout --minimize-url
1211                        --no-metadata --use-svm-props --use-svnsync-props
1212                        --rewrite-root= $remote_opts
1213                        "
1214                local cmt_opts="
1215                        --edit --rmdir --find-copies-harder --copy-similarity=
1216                        "
1217
1218                local cur="${COMP_WORDS[COMP_CWORD]}"
1219                case "$subcommand,$cur" in
1220                fetch,--*)
1221                        __gitcomp "--revision= --fetch-all $fc_opts"
1222                        ;;
1223                clone,--*)
1224                        __gitcomp "--revision= $fc_opts $init_opts"
1225                        ;;
1226                init,--*)
1227                        __gitcomp "$init_opts"
1228                        ;;
1229                dcommit,--*)
1230                        __gitcomp "
1231                                --merge --strategy= --verbose --dry-run
1232                                --fetch-all --no-rebase $cmt_opts $fc_opts
1233                                "
1234                        ;;
1235                set-tree,--*)
1236                        __gitcomp "--stdin $cmt_opts $fc_opts"
1237                        ;;
1238                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1239                show-externals,--*)
1240                        __gitcomp "--revision="
1241                        ;;
1242                log,--*)
1243                        __gitcomp "
1244                                --limit= --revision= --verbose --incremental
1245                                --oneline --show-commit --non-recursive
1246                                --authors-file=
1247                                "
1248                        ;;
1249                rebase,--*)
1250                        __gitcomp "
1251                                --merge --verbose --strategy= --local
1252                                --fetch-all $fc_opts
1253                                "
1254                        ;;
1255                commit-diff,--*)
1256                        __gitcomp "--message= --file= --revision= $cmt_opts"
1257                        ;;
1258                info,--*)
1259                        __gitcomp "--url"
1260                        ;;
1261                *)
1262                        COMPREPLY=()
1263                        ;;
1264                esac
1265        fi
1266}
1267
1268_git_tag ()
1269{
1270        local i c=1 f=0
1271        while [ $c -lt $COMP_CWORD ]; do
1272                i="${COMP_WORDS[c]}"
1273                case "$i" in
1274                -d|-v)
1275                        __gitcomp "$(__git_tags)"
1276                        return
1277                        ;;
1278                -f)
1279                        f=1
1280                        ;;
1281                esac
1282                c=$((++c))
1283        done
1284
1285        case "${COMP_WORDS[COMP_CWORD-1]}" in
1286        -m|-F)
1287                COMPREPLY=()
1288                ;;
1289        -*|tag|git-tag)
1290                if [ $f = 1 ]; then
1291                        __gitcomp "$(__git_tags)"
1292                else
1293                        COMPREPLY=()
1294                fi
1295                ;;
1296        *)
1297                __gitcomp "$(__git_refs)"
1298                ;;
1299        esac
1300}
1301
1302_git ()
1303{
1304        local i c=1 command __git_dir
1305
1306        while [ $c -lt $COMP_CWORD ]; do
1307                i="${COMP_WORDS[c]}"
1308                case "$i" in
1309                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1310                --bare)      __git_dir="." ;;
1311                --version|--help|-p|--paginate) ;;
1312                *) command="$i"; break ;;
1313                esac
1314                c=$((++c))
1315        done
1316
1317        if [ -z "$command" ]; then
1318                case "${COMP_WORDS[COMP_CWORD]}" in
1319                --*=*) COMPREPLY=() ;;
1320                --*)   __gitcomp "
1321                        --paginate
1322                        --no-pager
1323                        --git-dir=
1324                        --bare
1325                        --version
1326                        --exec-path
1327                        --work-tree=
1328                        --help
1329                        "
1330                        ;;
1331                *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1332                esac
1333                return
1334        fi
1335
1336        local expansion=$(__git_aliased_command "$command")
1337        [ "$expansion" ] && command="$expansion"
1338
1339        case "$command" in
1340        am)          _git_am ;;
1341        add)         _git_add ;;
1342        apply)       _git_apply ;;
1343        bisect)      _git_bisect ;;
1344        bundle)      _git_bundle ;;
1345        branch)      _git_branch ;;
1346        checkout)    _git_checkout ;;
1347        cherry)      _git_cherry ;;
1348        cherry-pick) _git_cherry_pick ;;
1349        commit)      _git_commit ;;
1350        config)      _git_config ;;
1351        describe)    _git_describe ;;
1352        diff)        _git_diff ;;
1353        fetch)       _git_fetch ;;
1354        format-patch) _git_format_patch ;;
1355        gc)          _git_gc ;;
1356        log)         _git_log ;;
1357        ls-remote)   _git_ls_remote ;;
1358        ls-tree)     _git_ls_tree ;;
1359        merge)       _git_merge;;
1360        merge-base)  _git_merge_base ;;
1361        name-rev)    _git_name_rev ;;
1362        pull)        _git_pull ;;
1363        push)        _git_push ;;
1364        rebase)      _git_rebase ;;
1365        remote)      _git_remote ;;
1366        reset)       _git_reset ;;
1367        shortlog)    _git_shortlog ;;
1368        show)        _git_show ;;
1369        show-branch) _git_log ;;
1370        stash)       _git_stash ;;
1371        submodule)   _git_submodule ;;
1372        svn)         _git_svn ;;
1373        tag)         _git_tag ;;
1374        whatchanged) _git_log ;;
1375        *)           COMPREPLY=() ;;
1376        esac
1377}
1378
1379_gitk ()
1380{
1381        __git_has_doubledash && return
1382
1383        local cur="${COMP_WORDS[COMP_CWORD]}"
1384        local g="$(git rev-parse --git-dir 2>/dev/null)"
1385        local merge=""
1386        if [ -f $g/MERGE_HEAD ]; then
1387                merge="--merge"
1388        fi
1389        case "$cur" in
1390        --*)
1391                __gitcomp "--not --all $merge"
1392                return
1393                ;;
1394        esac
1395        __git_complete_revlist
1396}
1397
1398complete -o default -o nospace -F _git git
1399complete -o default -o nospace -F _gitk gitk
1400complete -o default -o nospace -F _git_am git-am
1401complete -o default -o nospace -F _git_apply git-apply
1402complete -o default -o nospace -F _git_bisect git-bisect
1403complete -o default -o nospace -F _git_branch git-branch
1404complete -o default -o nospace -F _git_bundle git-bundle
1405complete -o default -o nospace -F _git_checkout git-checkout
1406complete -o default -o nospace -F _git_cherry git-cherry
1407complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1408complete -o default -o nospace -F _git_commit git-commit
1409complete -o default -o nospace -F _git_describe git-describe
1410complete -o default -o nospace -F _git_diff git-diff
1411complete -o default -o nospace -F _git_fetch git-fetch
1412complete -o default -o nospace -F _git_format_patch git-format-patch
1413complete -o default -o nospace -F _git_gc git-gc
1414complete -o default -o nospace -F _git_log git-log
1415complete -o default -o nospace -F _git_ls_remote git-ls-remote
1416complete -o default -o nospace -F _git_ls_tree git-ls-tree
1417complete -o default -o nospace -F _git_merge git-merge
1418complete -o default -o nospace -F _git_merge_base git-merge-base
1419complete -o default -o nospace -F _git_name_rev git-name-rev
1420complete -o default -o nospace -F _git_pull git-pull
1421complete -o default -o nospace -F _git_push git-push
1422complete -o default -o nospace -F _git_rebase git-rebase
1423complete -o default -o nospace -F _git_config git-config
1424complete -o default -o nospace -F _git_remote git-remote
1425complete -o default -o nospace -F _git_reset git-reset
1426complete -o default -o nospace -F _git_shortlog git-shortlog
1427complete -o default -o nospace -F _git_show git-show
1428complete -o default -o nospace -F _git_stash git-stash
1429complete -o default -o nospace -F _git_submodule git-submodule
1430complete -o default -o nospace -F _git_svn git-svn
1431complete -o default -o nospace -F _git_log git-show-branch
1432complete -o default -o nospace -F _git_tag git-tag
1433complete -o default -o nospace -F _git_log git-whatchanged
1434
1435# The following are necessary only for Cygwin, and only are needed
1436# when the user has tab-completed the executable name and consequently
1437# included the '.exe' suffix.
1438#
1439if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1440complete -o default -o nospace -F _git_add git-add.exe
1441complete -o default -o nospace -F _git_apply git-apply.exe
1442complete -o default -o nospace -F _git git.exe
1443complete -o default -o nospace -F _git_branch git-branch.exe
1444complete -o default -o nospace -F _git_bundle git-bundle.exe
1445complete -o default -o nospace -F _git_cherry git-cherry.exe
1446complete -o default -o nospace -F _git_describe git-describe.exe
1447complete -o default -o nospace -F _git_diff git-diff.exe
1448complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1449complete -o default -o nospace -F _git_log git-log.exe
1450complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1451complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1452complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1453complete -o default -o nospace -F _git_push git-push.exe
1454complete -o default -o nospace -F _git_config git-config
1455complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1456complete -o default -o nospace -F _git_show git-show.exe
1457complete -o default -o nospace -F _git_log git-show-branch.exe
1458complete -o default -o nospace -F _git_tag git-tag.exe
1459complete -o default -o nospace -F _git_log git-whatchanged.exe
1460fi