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