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