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