contrib / completion / git-completion.bashon commit Merge branch 'maint' (5071877)
   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 b="$(git symbolic-ref HEAD 2>/dev/null)"
  68        if [ -n "$b" ]; then
  69                if [ -n "$1" ]; then
  70                        printf "$1" "${b##refs/heads/}"
  71                else
  72                        printf " (%s)" "${b##refs/heads/}"
  73                fi
  74        fi
  75}
  76
  77__gitcomp ()
  78{
  79        local all c s=$'\n' IFS=' '$'\t'$'\n'
  80        local cur="${COMP_WORDS[COMP_CWORD]}"
  81        if [ $# -gt 2 ]; then
  82                cur="$3"
  83        fi
  84        for c in $1; do
  85                case "$c$4" in
  86                --*=*) all="$all$c$4$s" ;;
  87                *.)    all="$all$c$4$s" ;;
  88                *)     all="$all$c$4 $s" ;;
  89                esac
  90        done
  91        IFS=$s
  92        COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
  93        return
  94}
  95
  96__git_heads ()
  97{
  98        local cmd i is_hash=y dir="$(__gitdir "$1")"
  99        if [ -d "$dir" ]; then
 100                for i in $(git --git-dir="$dir" \
 101                        for-each-ref --format='%(refname)' \
 102                        refs/heads ); do
 103                        echo "${i#refs/heads/}"
 104                done
 105                return
 106        fi
 107        for i in $(git-ls-remote "$1" 2>/dev/null); do
 108                case "$is_hash,$i" in
 109                y,*) is_hash=n ;;
 110                n,*^{}) is_hash=y ;;
 111                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
 112                n,*) is_hash=y; echo "$i" ;;
 113                esac
 114        done
 115}
 116
 117__git_refs ()
 118{
 119        local cmd i is_hash=y dir="$(__gitdir "$1")"
 120        if [ -d "$dir" ]; then
 121                if [ -e "$dir/HEAD" ]; then echo HEAD; fi
 122                for i in $(git --git-dir="$dir" \
 123                        for-each-ref --format='%(refname)' \
 124                        refs/tags refs/heads refs/remotes); do
 125                        case "$i" in
 126                                refs/tags/*)    echo "${i#refs/tags/}" ;;
 127                                refs/heads/*)   echo "${i#refs/heads/}" ;;
 128                                refs/remotes/*) echo "${i#refs/remotes/}" ;;
 129                                *)              echo "$i" ;;
 130                        esac
 131                done
 132                return
 133        fi
 134        for i in $(git-ls-remote "$dir" 2>/dev/null); do
 135                case "$is_hash,$i" in
 136                y,*) is_hash=n ;;
 137                n,*^{}) is_hash=y ;;
 138                n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
 139                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
 140                n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
 141                n,*) is_hash=y; echo "$i" ;;
 142                esac
 143        done
 144}
 145
 146__git_refs2 ()
 147{
 148        local i
 149        for i in $(__git_refs "$1"); do
 150                echo "$i:$i"
 151        done
 152}
 153
 154__git_refs_remotes ()
 155{
 156        local cmd i is_hash=y
 157        for i in $(git-ls-remote "$1" 2>/dev/null); do
 158                case "$is_hash,$i" in
 159                n,refs/heads/*)
 160                        is_hash=y
 161                        echo "$i:refs/remotes/$1/${i#refs/heads/}"
 162                        ;;
 163                y,*) is_hash=n ;;
 164                n,*^{}) is_hash=y ;;
 165                n,refs/tags/*) is_hash=y;;
 166                n,*) is_hash=y; ;;
 167                esac
 168        done
 169}
 170
 171__git_remotes ()
 172{
 173        local i ngoff IFS=$'\n' d="$(__gitdir)"
 174        shopt -q nullglob || ngoff=1
 175        shopt -s nullglob
 176        for i in "$d/remotes"/*; do
 177                echo ${i#$d/remotes/}
 178        done
 179        [ "$ngoff" ] && shopt -u nullglob
 180        for i in $(git --git-dir="$d" config --list); do
 181                case "$i" in
 182                remote.*.url=*)
 183                        i="${i#remote.}"
 184                        echo "${i/.url=*/}"
 185                        ;;
 186                esac
 187        done
 188}
 189
 190__git_merge_strategies ()
 191{
 192        if [ -n "$__git_merge_strategylist" ]; then
 193                echo "$__git_merge_strategylist"
 194                return
 195        fi
 196        sed -n "/^all_strategies='/{
 197                s/^all_strategies='//
 198                s/'//
 199                p
 200                q
 201                }" "$(git --exec-path)/git-merge"
 202}
 203__git_merge_strategylist=
 204__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
 205
 206__git_complete_file ()
 207{
 208        local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
 209        case "$cur" in
 210        ?*:*)
 211                ref="${cur%%:*}"
 212                cur="${cur#*:}"
 213                case "$cur" in
 214                ?*/*)
 215                        pfx="${cur%/*}"
 216                        cur="${cur##*/}"
 217                        ls="$ref:$pfx"
 218                        pfx="$pfx/"
 219                        ;;
 220                *)
 221                        ls="$ref"
 222                        ;;
 223            esac
 224                COMPREPLY=($(compgen -P "$pfx" \
 225                        -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
 226                                | sed '/^100... blob /s,^.*     ,,
 227                                       /^040000 tree /{
 228                                           s,^.*        ,,
 229                                           s,$,/,
 230                                       }
 231                                       s/^.*    //')" \
 232                        -- "$cur"))
 233                ;;
 234        *)
 235                __gitcomp "$(__git_refs)"
 236                ;;
 237        esac
 238}
 239
 240__git_complete_revlist ()
 241{
 242        local pfx cur="${COMP_WORDS[COMP_CWORD]}"
 243        case "$cur" in
 244        *...*)
 245                pfx="${cur%...*}..."
 246                cur="${cur#*...}"
 247                __gitcomp "$(__git_refs)" "$pfx" "$cur"
 248                ;;
 249        *..*)
 250                pfx="${cur%..*}.."
 251                cur="${cur#*..}"
 252                __gitcomp "$(__git_refs)" "$pfx" "$cur"
 253                ;;
 254        *.)
 255                __gitcomp "$cur."
 256                ;;
 257        *)
 258                __gitcomp "$(__git_refs)"
 259                ;;
 260        esac
 261}
 262
 263__git_commands ()
 264{
 265        if [ -n "$__git_commandlist" ]; then
 266                echo "$__git_commandlist"
 267                return
 268        fi
 269        local i IFS=" "$'\n'
 270        for i in $(git help -a|egrep '^ ')
 271        do
 272                case $i in
 273                add--interactive) : plumbing;;
 274                applymbox)        : ask gittus;;
 275                applypatch)       : ask gittus;;
 276                archimport)       : import;;
 277                cat-file)         : plumbing;;
 278                check-attr)       : plumbing;;
 279                check-ref-format) : plumbing;;
 280                commit-tree)      : plumbing;;
 281                convert-objects)  : plumbing;;
 282                cvsexportcommit)  : export;;
 283                cvsimport)        : import;;
 284                cvsserver)        : daemon;;
 285                daemon)           : daemon;;
 286                diff-files)       : plumbing;;
 287                diff-index)       : plumbing;;
 288                diff-tree)        : plumbing;;
 289                fast-import)      : import;;
 290                fsck-objects)     : plumbing;;
 291                fetch--tool)      : plumbing;;
 292                fetch-pack)       : plumbing;;
 293                fmt-merge-msg)    : plumbing;;
 294                for-each-ref)     : plumbing;;
 295                hash-object)      : plumbing;;
 296                http-*)           : transport;;
 297                index-pack)       : plumbing;;
 298                init-db)          : deprecated;;
 299                local-fetch)      : plumbing;;
 300                mailinfo)         : plumbing;;
 301                mailsplit)        : plumbing;;
 302                merge-*)          : plumbing;;
 303                mktree)           : plumbing;;
 304                mktag)            : plumbing;;
 305                pack-objects)     : plumbing;;
 306                pack-redundant)   : plumbing;;
 307                pack-refs)        : plumbing;;
 308                parse-remote)     : plumbing;;
 309                patch-id)         : plumbing;;
 310                peek-remote)      : plumbing;;
 311                prune)            : plumbing;;
 312                prune-packed)     : plumbing;;
 313                quiltimport)      : import;;
 314                read-tree)        : plumbing;;
 315                receive-pack)     : plumbing;;
 316                reflog)           : plumbing;;
 317                repo-config)      : plumbing;;
 318                rerere)           : plumbing;;
 319                rev-list)         : plumbing;;
 320                rev-parse)        : plumbing;;
 321                runstatus)        : plumbing;;
 322                sh-setup)         : internal;;
 323                shell)            : daemon;;
 324                send-pack)        : plumbing;;
 325                show-index)       : plumbing;;
 326                ssh-*)            : transport;;
 327                stripspace)       : plumbing;;
 328                svn)              : import export;;
 329                svnimport)        : import;;
 330                symbolic-ref)     : plumbing;;
 331                tar-tree)         : deprecated;;
 332                unpack-file)      : plumbing;;
 333                unpack-objects)   : plumbing;;
 334                update-index)     : plumbing;;
 335                update-ref)       : plumbing;;
 336                update-server-info) : daemon;;
 337                upload-archive)   : plumbing;;
 338                upload-pack)      : plumbing;;
 339                write-tree)       : plumbing;;
 340                verify-tag)       : plumbing;;
 341                *) echo $i;;
 342                esac
 343        done
 344}
 345__git_commandlist=
 346__git_commandlist="$(__git_commands 2>/dev/null)"
 347
 348__git_aliases ()
 349{
 350        local i IFS=$'\n'
 351        for i in $(git --git-dir="$(__gitdir)" config --list); do
 352                case "$i" in
 353                alias.*)
 354                        i="${i#alias.}"
 355                        echo "${i/=*/}"
 356                        ;;
 357                esac
 358        done
 359}
 360
 361__git_aliased_command ()
 362{
 363        local word cmdline=$(git --git-dir="$(__gitdir)" \
 364                config --get "alias.$1")
 365        for word in $cmdline; do
 366                if [ "${word##-*}" ]; then
 367                        echo $word
 368                        return
 369                fi
 370        done
 371}
 372
 373__git_whitespacelist="nowarn warn error error-all strip"
 374
 375_git_am ()
 376{
 377        local cur="${COMP_WORDS[COMP_CWORD]}"
 378        if [ -d .dotest ]; then
 379                __gitcomp "--skip --resolved"
 380                return
 381        fi
 382        case "$cur" in
 383        --whitespace=*)
 384                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 385                return
 386                ;;
 387        --*)
 388                __gitcomp "
 389                        --signoff --utf8 --binary --3way --interactive
 390                        --whitespace=
 391                        "
 392                return
 393        esac
 394        COMPREPLY=()
 395}
 396
 397_git_apply ()
 398{
 399        local cur="${COMP_WORDS[COMP_CWORD]}"
 400        case "$cur" in
 401        --whitespace=*)
 402                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 403                return
 404                ;;
 405        --*)
 406                __gitcomp "
 407                        --stat --numstat --summary --check --index
 408                        --cached --index-info --reverse --reject --unidiff-zero
 409                        --apply --no-add --exclude=
 410                        --whitespace= --inaccurate-eof --verbose
 411                        "
 412                return
 413        esac
 414        COMPREPLY=()
 415}
 416
 417_git_add ()
 418{
 419        local cur="${COMP_WORDS[COMP_CWORD]}"
 420        case "$cur" in
 421        --*)
 422                __gitcomp "--interactive --refresh"
 423                return
 424        esac
 425        COMPREPLY=()
 426}
 427
 428_git_bisect ()
 429{
 430        local i c=1 command
 431        while [ $c -lt $COMP_CWORD ]; do
 432                i="${COMP_WORDS[c]}"
 433                case "$i" in
 434                start|bad|good|reset|visualize|replay|log)
 435                        command="$i"
 436                        break
 437                        ;;
 438                esac
 439                c=$((++c))
 440        done
 441
 442        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 443                __gitcomp "start bad good reset visualize replay log"
 444                return
 445        fi
 446
 447        case "$command" in
 448        bad|good|reset)
 449                __gitcomp "$(__git_refs)"
 450                ;;
 451        *)
 452                COMPREPLY=()
 453                ;;
 454        esac
 455}
 456
 457_git_branch ()
 458{
 459        __gitcomp "$(__git_refs)"
 460}
 461
 462_git_bundle ()
 463{
 464        local mycword="$COMP_CWORD"
 465        case "${COMP_WORDS[0]}" in
 466        git)
 467                local cmd="${COMP_WORDS[2]}"
 468                mycword="$((mycword-1))"
 469                ;;
 470        git-bundle*)
 471                local cmd="${COMP_WORDS[1]}"
 472                ;;
 473        esac
 474        case "$mycword" in
 475        1)
 476                __gitcomp "create list-heads verify unbundle"
 477                ;;
 478        2)
 479                # looking for a file
 480                ;;
 481        *)
 482                case "$cmd" in
 483                        create)
 484                                __git_complete_revlist
 485                        ;;
 486                esac
 487                ;;
 488        esac
 489}
 490
 491_git_checkout ()
 492{
 493        __gitcomp "$(__git_refs)"
 494}
 495
 496_git_cherry ()
 497{
 498        __gitcomp "$(__git_refs)"
 499}
 500
 501_git_cherry_pick ()
 502{
 503        local cur="${COMP_WORDS[COMP_CWORD]}"
 504        case "$cur" in
 505        --*)
 506                __gitcomp "--edit --no-commit"
 507                ;;
 508        *)
 509                __gitcomp "$(__git_refs)"
 510                ;;
 511        esac
 512}
 513
 514_git_commit ()
 515{
 516        local cur="${COMP_WORDS[COMP_CWORD]}"
 517        case "$cur" in
 518        --*)
 519                __gitcomp "
 520                        --all --author= --signoff --verify --no-verify
 521                        --edit --amend --include --only
 522                        "
 523                return
 524        esac
 525        COMPREPLY=()
 526}
 527
 528_git_describe ()
 529{
 530        __gitcomp "$(__git_refs)"
 531}
 532
 533_git_diff ()
 534{
 535        __git_complete_file
 536}
 537
 538_git_diff_tree ()
 539{
 540        __gitcomp "$(__git_refs)"
 541}
 542
 543_git_fetch ()
 544{
 545        local cur="${COMP_WORDS[COMP_CWORD]}"
 546
 547        case "${COMP_WORDS[0]},$COMP_CWORD" in
 548        git-fetch*,1)
 549                __gitcomp "$(__git_remotes)"
 550                ;;
 551        git,2)
 552                __gitcomp "$(__git_remotes)"
 553                ;;
 554        *)
 555                case "$cur" in
 556                *:*)
 557                        __gitcomp "$(__git_refs)" "" "${cur#*:}"
 558                        ;;
 559                *)
 560                        local remote
 561                        case "${COMP_WORDS[0]}" in
 562                        git-fetch) remote="${COMP_WORDS[1]}" ;;
 563                        git)       remote="${COMP_WORDS[2]}" ;;
 564                        esac
 565                        __gitcomp "$(__git_refs2 "$remote")"
 566                        ;;
 567                esac
 568                ;;
 569        esac
 570}
 571
 572_git_format_patch ()
 573{
 574        local cur="${COMP_WORDS[COMP_CWORD]}"
 575        case "$cur" in
 576        --*)
 577                __gitcomp "
 578                        --stdout --attach --thread
 579                        --output-directory
 580                        --numbered --start-number
 581                        --numbered-files
 582                        --keep-subject
 583                        --signoff
 584                        --in-reply-to=
 585                        --full-index --binary
 586                        --not --all
 587                        "
 588                return
 589                ;;
 590        esac
 591        __git_complete_revlist
 592}
 593
 594_git_gc ()
 595{
 596        local cur="${COMP_WORDS[COMP_CWORD]}"
 597        case "$cur" in
 598        --*)
 599                __gitcomp "--prune --aggressive"
 600                return
 601                ;;
 602        esac
 603        COMPREPLY=()
 604}
 605
 606_git_ls_remote ()
 607{
 608        __gitcomp "$(__git_remotes)"
 609}
 610
 611_git_ls_tree ()
 612{
 613        __git_complete_file
 614}
 615
 616_git_log ()
 617{
 618        local cur="${COMP_WORDS[COMP_CWORD]}"
 619        case "$cur" in
 620        --pretty=*)
 621                __gitcomp "
 622                        oneline short medium full fuller email raw
 623                        " "" "${cur##--pretty=}"
 624                return
 625                ;;
 626        --date=*)
 627                __gitcomp "
 628                        relative iso8601 rfc2822 short local default
 629                " "" "${cur##--date=}"
 630                return
 631                ;;
 632        --*)
 633                __gitcomp "
 634                        --max-count= --max-age= --since= --after=
 635                        --min-age= --before= --until=
 636                        --root --topo-order --date-order --reverse
 637                        --no-merges --follow
 638                        --abbrev-commit --abbrev=
 639                        --relative-date --date=
 640                        --author= --committer= --grep=
 641                        --all-match
 642                        --pretty= --name-status --name-only --raw
 643                        --not --all
 644                        "
 645                return
 646                ;;
 647        esac
 648        __git_complete_revlist
 649}
 650
 651_git_merge ()
 652{
 653        local cur="${COMP_WORDS[COMP_CWORD]}"
 654        case "${COMP_WORDS[COMP_CWORD-1]}" in
 655        -s|--strategy)
 656                __gitcomp "$(__git_merge_strategies)"
 657                return
 658        esac
 659        case "$cur" in
 660        --strategy=*)
 661                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 662                return
 663                ;;
 664        --*)
 665                __gitcomp "
 666                        --no-commit --no-summary --squash --strategy
 667                        "
 668                return
 669        esac
 670        __gitcomp "$(__git_refs)"
 671}
 672
 673_git_merge_base ()
 674{
 675        __gitcomp "$(__git_refs)"
 676}
 677
 678_git_name_rev ()
 679{
 680        __gitcomp "--tags --all --stdin"
 681}
 682
 683_git_pull ()
 684{
 685        local cur="${COMP_WORDS[COMP_CWORD]}"
 686
 687        case "${COMP_WORDS[0]},$COMP_CWORD" in
 688        git-pull*,1)
 689                __gitcomp "$(__git_remotes)"
 690                ;;
 691        git,2)
 692                __gitcomp "$(__git_remotes)"
 693                ;;
 694        *)
 695                local remote
 696                case "${COMP_WORDS[0]}" in
 697                git-pull)  remote="${COMP_WORDS[1]}" ;;
 698                git)       remote="${COMP_WORDS[2]}" ;;
 699                esac
 700                __gitcomp "$(__git_refs "$remote")"
 701                ;;
 702        esac
 703}
 704
 705_git_push ()
 706{
 707        local cur="${COMP_WORDS[COMP_CWORD]}"
 708
 709        case "${COMP_WORDS[0]},$COMP_CWORD" in
 710        git-push*,1)
 711                __gitcomp "$(__git_remotes)"
 712                ;;
 713        git,2)
 714                __gitcomp "$(__git_remotes)"
 715                ;;
 716        *)
 717                case "$cur" in
 718                *:*)
 719                        local remote
 720                        case "${COMP_WORDS[0]}" in
 721                        git-push)  remote="${COMP_WORDS[1]}" ;;
 722                        git)       remote="${COMP_WORDS[2]}" ;;
 723                        esac
 724                        __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
 725                        ;;
 726                +*)
 727                        __gitcomp "$(__git_refs)" + "${cur#+}"
 728                        ;;
 729                *)
 730                        __gitcomp "$(__git_refs)"
 731                        ;;
 732                esac
 733                ;;
 734        esac
 735}
 736
 737_git_rebase ()
 738{
 739        local cur="${COMP_WORDS[COMP_CWORD]}"
 740        if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
 741                __gitcomp "--continue --skip --abort"
 742                return
 743        fi
 744        case "${COMP_WORDS[COMP_CWORD-1]}" in
 745        -s|--strategy)
 746                __gitcomp "$(__git_merge_strategies)"
 747                return
 748        esac
 749        case "$cur" in
 750        --strategy=*)
 751                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 752                return
 753                ;;
 754        --*)
 755                __gitcomp "--onto --merge --strategy"
 756                return
 757        esac
 758        __gitcomp "$(__git_refs)"
 759}
 760
 761_git_config ()
 762{
 763        local cur="${COMP_WORDS[COMP_CWORD]}"
 764        local prv="${COMP_WORDS[COMP_CWORD-1]}"
 765        case "$prv" in
 766        branch.*.remote)
 767                __gitcomp "$(__git_remotes)"
 768                return
 769                ;;
 770        branch.*.merge)
 771                __gitcomp "$(__git_refs)"
 772                return
 773                ;;
 774        remote.*.fetch)
 775                local remote="${prv#remote.}"
 776                remote="${remote%.fetch}"
 777                __gitcomp "$(__git_refs_remotes "$remote")"
 778                return
 779                ;;
 780        remote.*.push)
 781                local remote="${prv#remote.}"
 782                remote="${remote%.push}"
 783                __gitcomp "$(git --git-dir="$(__gitdir)" \
 784                        for-each-ref --format='%(refname):%(refname)' \
 785                        refs/heads)"
 786                return
 787                ;;
 788        pull.twohead|pull.octopus)
 789                __gitcomp "$(__git_merge_strategies)"
 790                return
 791                ;;
 792        color.branch|color.diff|color.status)
 793                __gitcomp "always never auto"
 794                return
 795                ;;
 796        color.*.*)
 797                __gitcomp "
 798                        black red green yellow blue magenta cyan white
 799                        bold dim ul blink reverse
 800                        "
 801                return
 802                ;;
 803        *.*)
 804                COMPREPLY=()
 805                return
 806                ;;
 807        esac
 808        case "$cur" in
 809        --*)
 810                __gitcomp "
 811                        --global --system --file=
 812                        --list --replace-all
 813                        --get --get-all --get-regexp
 814                        --add --unset --unset-all
 815                        --remove-section --rename-section
 816                        "
 817                return
 818                ;;
 819        branch.*.*)
 820                local pfx="${cur%.*}."
 821                cur="${cur##*.}"
 822                __gitcomp "remote merge" "$pfx" "$cur"
 823                return
 824                ;;
 825        branch.*)
 826                local pfx="${cur%.*}."
 827                cur="${cur#*.}"
 828                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
 829                return
 830                ;;
 831        remote.*.*)
 832                local pfx="${cur%.*}."
 833                cur="${cur##*.}"
 834                __gitcomp "
 835                        url fetch push skipDefaultUpdate
 836                        receivepack uploadpack tagopt
 837                        " "$pfx" "$cur"
 838                return
 839                ;;
 840        remote.*)
 841                local pfx="${cur%.*}."
 842                cur="${cur#*.}"
 843                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
 844                return
 845                ;;
 846        esac
 847        __gitcomp "
 848                apply.whitespace
 849                core.fileMode
 850                core.gitProxy
 851                core.ignoreStat
 852                core.preferSymlinkRefs
 853                core.logAllRefUpdates
 854                core.loosecompression
 855                core.repositoryFormatVersion
 856                core.sharedRepository
 857                core.warnAmbiguousRefs
 858                core.compression
 859                core.legacyHeaders
 860                core.packedGitWindowSize
 861                core.packedGitLimit
 862                clean.requireForce
 863                color.branch
 864                color.branch.current
 865                color.branch.local
 866                color.branch.remote
 867                color.branch.plain
 868                color.diff
 869                color.diff.plain
 870                color.diff.meta
 871                color.diff.frag
 872                color.diff.old
 873                color.diff.new
 874                color.diff.commit
 875                color.diff.whitespace
 876                color.pager
 877                color.status
 878                color.status.header
 879                color.status.added
 880                color.status.changed
 881                color.status.untracked
 882                diff.renameLimit
 883                diff.renames
 884                fetch.unpackLimit
 885                format.headers
 886                format.subjectprefix
 887                gitcvs.enabled
 888                gitcvs.logfile
 889                gitcvs.allbinary
 890                gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
 891                gc.packrefs
 892                gc.reflogexpire
 893                gc.reflogexpireunreachable
 894                gc.rerereresolved
 895                gc.rerereunresolved
 896                http.sslVerify
 897                http.sslCert
 898                http.sslKey
 899                http.sslCAInfo
 900                http.sslCAPath
 901                http.maxRequests
 902                http.lowSpeedLimit
 903                http.lowSpeedTime
 904                http.noEPSV
 905                i18n.commitEncoding
 906                i18n.logOutputEncoding
 907                log.showroot
 908                merge.tool
 909                merge.summary
 910                merge.verbosity
 911                pack.window
 912                pack.depth
 913                pack.windowMemory
 914                pack.compression
 915                pack.deltaCacheSize
 916                pack.deltaCacheLimit
 917                pull.octopus
 918                pull.twohead
 919                repack.useDeltaBaseOffset
 920                show.difftree
 921                showbranch.default
 922                tar.umask
 923                transfer.unpackLimit
 924                receive.unpackLimit
 925                receive.denyNonFastForwards
 926                user.name
 927                user.email
 928                user.signingkey
 929                whatchanged.difftree
 930                branch. remote.
 931        "
 932}
 933
 934_git_remote ()
 935{
 936        local i c=1 command
 937        while [ $c -lt $COMP_CWORD ]; do
 938                i="${COMP_WORDS[c]}"
 939                case "$i" in
 940                add|show|prune|update) command="$i"; break ;;
 941                esac
 942                c=$((++c))
 943        done
 944
 945        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 946                __gitcomp "add show prune update"
 947                return
 948        fi
 949
 950        case "$command" in
 951        show|prune)
 952                __gitcomp "$(__git_remotes)"
 953                ;;
 954        update)
 955                local i c='' IFS=$'\n'
 956                for i in $(git --git-dir="$(__gitdir)" config --list); do
 957                        case "$i" in
 958                        remotes.*)
 959                                i="${i#remotes.}"
 960                                c="$c ${i/=*/}"
 961                                ;;
 962                        esac
 963                done
 964                __gitcomp "$c"
 965                ;;
 966        *)
 967                COMPREPLY=()
 968                ;;
 969        esac
 970}
 971
 972_git_reset ()
 973{
 974        local cur="${COMP_WORDS[COMP_CWORD]}"
 975        case "$cur" in
 976        --*)
 977                __gitcomp "--mixed --hard --soft"
 978                return
 979                ;;
 980        esac
 981        __gitcomp "$(__git_refs)"
 982}
 983
 984_git_shortlog ()
 985{
 986        local cur="${COMP_WORDS[COMP_CWORD]}"
 987        case "$cur" in
 988        --*)
 989                __gitcomp "
 990                        --max-count= --max-age= --since= --after=
 991                        --min-age= --before= --until=
 992                        --no-merges
 993                        --author= --committer= --grep=
 994                        --all-match
 995                        --not --all
 996                        --numbered --summary
 997                        "
 998                return
 999                ;;
1000        esac
1001        __git_complete_revlist
1002}
1003
1004_git_show ()
1005{
1006        local cur="${COMP_WORDS[COMP_CWORD]}"
1007        case "$cur" in
1008        --pretty=*)
1009                __gitcomp "
1010                        oneline short medium full fuller email raw
1011                        " "" "${cur##--pretty=}"
1012                return
1013                ;;
1014        --*)
1015                __gitcomp "--pretty="
1016                return
1017                ;;
1018        esac
1019        __git_complete_file
1020}
1021
1022_git_stash ()
1023{
1024        __gitcomp 'list show apply clear'
1025}
1026
1027_git_submodule ()
1028{
1029        local i c=1 command
1030        while [ $c -lt $COMP_CWORD ]; do
1031                i="${COMP_WORDS[c]}"
1032                case "$i" in
1033                add|status|init|update) command="$i"; break ;;
1034                esac
1035                c=$((++c))
1036        done
1037
1038        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1039                local cur="${COMP_WORDS[COMP_CWORD]}"
1040                case "$cur" in
1041                --*)
1042                        __gitcomp "--quiet --cached"
1043                        ;;
1044                *)
1045                        __gitcomp "add status init update"
1046                        ;;
1047                esac
1048                return
1049        fi
1050}
1051
1052_git ()
1053{
1054        local i c=1 command __git_dir
1055
1056        while [ $c -lt $COMP_CWORD ]; do
1057                i="${COMP_WORDS[c]}"
1058                case "$i" in
1059                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1060                --bare)      __git_dir="." ;;
1061                --version|--help|-p|--paginate) ;;
1062                *) command="$i"; break ;;
1063                esac
1064                c=$((++c))
1065        done
1066
1067        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1068                case "${COMP_WORDS[COMP_CWORD]}" in
1069                --*=*) COMPREPLY=() ;;
1070                --*)   __gitcomp "
1071                        --no-pager
1072                        --git-dir=
1073                        --bare
1074                        --version
1075                        --exec-path
1076                        "
1077                        ;;
1078                *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1079                esac
1080                return
1081        fi
1082
1083        local expansion=$(__git_aliased_command "$command")
1084        [ "$expansion" ] && command="$expansion"
1085
1086        case "$command" in
1087        am)          _git_am ;;
1088        add)         _git_add ;;
1089        apply)       _git_apply ;;
1090        bisect)      _git_bisect ;;
1091        bundle)      _git_bundle ;;
1092        branch)      _git_branch ;;
1093        checkout)    _git_checkout ;;
1094        cherry)      _git_cherry ;;
1095        cherry-pick) _git_cherry_pick ;;
1096        commit)      _git_commit ;;
1097        config)      _git_config ;;
1098        describe)    _git_describe ;;
1099        diff)        _git_diff ;;
1100        fetch)       _git_fetch ;;
1101        format-patch) _git_format_patch ;;
1102        gc)          _git_gc ;;
1103        log)         _git_log ;;
1104        ls-remote)   _git_ls_remote ;;
1105        ls-tree)     _git_ls_tree ;;
1106        merge)       _git_merge;;
1107        merge-base)  _git_merge_base ;;
1108        name-rev)    _git_name_rev ;;
1109        pull)        _git_pull ;;
1110        push)        _git_push ;;
1111        rebase)      _git_rebase ;;
1112        remote)      _git_remote ;;
1113        reset)       _git_reset ;;
1114        shortlog)    _git_shortlog ;;
1115        show)        _git_show ;;
1116        show-branch) _git_log ;;
1117        stash)       _git_stash ;;
1118        submodule)   _git_submodule ;;
1119        whatchanged) _git_log ;;
1120        *)           COMPREPLY=() ;;
1121        esac
1122}
1123
1124_gitk ()
1125{
1126        local cur="${COMP_WORDS[COMP_CWORD]}"
1127        case "$cur" in
1128        --*)
1129                __gitcomp "--not --all"
1130                return
1131                ;;
1132        esac
1133        __git_complete_revlist
1134}
1135
1136complete -o default -o nospace -F _git git
1137complete -o default -o nospace -F _gitk gitk
1138complete -o default -o nospace -F _git_am git-am
1139complete -o default -o nospace -F _git_apply git-apply
1140complete -o default -o nospace -F _git_bisect git-bisect
1141complete -o default -o nospace -F _git_branch git-branch
1142complete -o default -o nospace -F _git_bundle git-bundle
1143complete -o default -o nospace -F _git_checkout git-checkout
1144complete -o default -o nospace -F _git_cherry git-cherry
1145complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1146complete -o default -o nospace -F _git_commit git-commit
1147complete -o default -o nospace -F _git_describe git-describe
1148complete -o default -o nospace -F _git_diff git-diff
1149complete -o default -o nospace -F _git_fetch git-fetch
1150complete -o default -o nospace -F _git_format_patch git-format-patch
1151complete -o default -o nospace -F _git_gc git-gc
1152complete -o default -o nospace -F _git_log git-log
1153complete -o default -o nospace -F _git_ls_remote git-ls-remote
1154complete -o default -o nospace -F _git_ls_tree git-ls-tree
1155complete -o default -o nospace -F _git_merge git-merge
1156complete -o default -o nospace -F _git_merge_base git-merge-base
1157complete -o default -o nospace -F _git_name_rev git-name-rev
1158complete -o default -o nospace -F _git_pull git-pull
1159complete -o default -o nospace -F _git_push git-push
1160complete -o default -o nospace -F _git_rebase git-rebase
1161complete -o default -o nospace -F _git_config git-config
1162complete -o default -o nospace -F _git_remote git-remote
1163complete -o default -o nospace -F _git_reset git-reset
1164complete -o default -o nospace -F _git_shortlog git-shortlog
1165complete -o default -o nospace -F _git_show git-show
1166complete -o default -o nospace -F _git_stash git-stash
1167complete -o default -o nospace -F _git_submodule git-submodule
1168complete -o default -o nospace -F _git_log git-show-branch
1169complete -o default -o nospace -F _git_log git-whatchanged
1170
1171# The following are necessary only for Cygwin, and only are needed
1172# when the user has tab-completed the executable name and consequently
1173# included the '.exe' suffix.
1174#
1175if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1176complete -o default -o nospace -F _git_add git-add.exe
1177complete -o default -o nospace -F _git_apply git-apply.exe
1178complete -o default -o nospace -F _git git.exe
1179complete -o default -o nospace -F _git_branch git-branch.exe
1180complete -o default -o nospace -F _git_bundle git-bundle.exe
1181complete -o default -o nospace -F _git_cherry git-cherry.exe
1182complete -o default -o nospace -F _git_describe git-describe.exe
1183complete -o default -o nospace -F _git_diff git-diff.exe
1184complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1185complete -o default -o nospace -F _git_log git-log.exe
1186complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1187complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1188complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1189complete -o default -o nospace -F _git_push git-push.exe
1190complete -o default -o nospace -F _git_config git-config
1191complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1192complete -o default -o nospace -F _git_show git-show.exe
1193complete -o default -o nospace -F _git_log git-show-branch.exe
1194complete -o default -o nospace -F _git_log git-whatchanged.exe
1195fi