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