contrib / completion / git-completion.bashon commit completion: also complete git-log's --left-right and --cherry-pick option (7d37b5b)
   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                        --left-right --cherry-pick
 645                        "
 646                return
 647                ;;
 648        esac
 649        __git_complete_revlist
 650}
 651
 652_git_merge ()
 653{
 654        local cur="${COMP_WORDS[COMP_CWORD]}"
 655        case "${COMP_WORDS[COMP_CWORD-1]}" in
 656        -s|--strategy)
 657                __gitcomp "$(__git_merge_strategies)"
 658                return
 659        esac
 660        case "$cur" in
 661        --strategy=*)
 662                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 663                return
 664                ;;
 665        --*)
 666                __gitcomp "
 667                        --no-commit --no-summary --squash --strategy
 668                        "
 669                return
 670        esac
 671        __gitcomp "$(__git_refs)"
 672}
 673
 674_git_merge_base ()
 675{
 676        __gitcomp "$(__git_refs)"
 677}
 678
 679_git_name_rev ()
 680{
 681        __gitcomp "--tags --all --stdin"
 682}
 683
 684_git_pull ()
 685{
 686        local cur="${COMP_WORDS[COMP_CWORD]}"
 687
 688        case "${COMP_WORDS[0]},$COMP_CWORD" in
 689        git-pull*,1)
 690                __gitcomp "$(__git_remotes)"
 691                ;;
 692        git,2)
 693                __gitcomp "$(__git_remotes)"
 694                ;;
 695        *)
 696                local remote
 697                case "${COMP_WORDS[0]}" in
 698                git-pull)  remote="${COMP_WORDS[1]}" ;;
 699                git)       remote="${COMP_WORDS[2]}" ;;
 700                esac
 701                __gitcomp "$(__git_refs "$remote")"
 702                ;;
 703        esac
 704}
 705
 706_git_push ()
 707{
 708        local cur="${COMP_WORDS[COMP_CWORD]}"
 709
 710        case "${COMP_WORDS[0]},$COMP_CWORD" in
 711        git-push*,1)
 712                __gitcomp "$(__git_remotes)"
 713                ;;
 714        git,2)
 715                __gitcomp "$(__git_remotes)"
 716                ;;
 717        *)
 718                case "$cur" in
 719                *:*)
 720                        local remote
 721                        case "${COMP_WORDS[0]}" in
 722                        git-push)  remote="${COMP_WORDS[1]}" ;;
 723                        git)       remote="${COMP_WORDS[2]}" ;;
 724                        esac
 725                        __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
 726                        ;;
 727                +*)
 728                        __gitcomp "$(__git_refs)" + "${cur#+}"
 729                        ;;
 730                *)
 731                        __gitcomp "$(__git_refs)"
 732                        ;;
 733                esac
 734                ;;
 735        esac
 736}
 737
 738_git_rebase ()
 739{
 740        local cur="${COMP_WORDS[COMP_CWORD]}"
 741        if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
 742                __gitcomp "--continue --skip --abort"
 743                return
 744        fi
 745        case "${COMP_WORDS[COMP_CWORD-1]}" in
 746        -s|--strategy)
 747                __gitcomp "$(__git_merge_strategies)"
 748                return
 749        esac
 750        case "$cur" in
 751        --strategy=*)
 752                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 753                return
 754                ;;
 755        --*)
 756                __gitcomp "--onto --merge --strategy"
 757                return
 758        esac
 759        __gitcomp "$(__git_refs)"
 760}
 761
 762_git_config ()
 763{
 764        local cur="${COMP_WORDS[COMP_CWORD]}"
 765        local prv="${COMP_WORDS[COMP_CWORD-1]}"
 766        case "$prv" in
 767        branch.*.remote)
 768                __gitcomp "$(__git_remotes)"
 769                return
 770                ;;
 771        branch.*.merge)
 772                __gitcomp "$(__git_refs)"
 773                return
 774                ;;
 775        remote.*.fetch)
 776                local remote="${prv#remote.}"
 777                remote="${remote%.fetch}"
 778                __gitcomp "$(__git_refs_remotes "$remote")"
 779                return
 780                ;;
 781        remote.*.push)
 782                local remote="${prv#remote.}"
 783                remote="${remote%.push}"
 784                __gitcomp "$(git --git-dir="$(__gitdir)" \
 785                        for-each-ref --format='%(refname):%(refname)' \
 786                        refs/heads)"
 787                return
 788                ;;
 789        pull.twohead|pull.octopus)
 790                __gitcomp "$(__git_merge_strategies)"
 791                return
 792                ;;
 793        color.branch|color.diff|color.status)
 794                __gitcomp "always never auto"
 795                return
 796                ;;
 797        color.*.*)
 798                __gitcomp "
 799                        black red green yellow blue magenta cyan white
 800                        bold dim ul blink reverse
 801                        "
 802                return
 803                ;;
 804        *.*)
 805                COMPREPLY=()
 806                return
 807                ;;
 808        esac
 809        case "$cur" in
 810        --*)
 811                __gitcomp "
 812                        --global --system --file=
 813                        --list --replace-all
 814                        --get --get-all --get-regexp
 815                        --add --unset --unset-all
 816                        --remove-section --rename-section
 817                        "
 818                return
 819                ;;
 820        branch.*.*)
 821                local pfx="${cur%.*}."
 822                cur="${cur##*.}"
 823                __gitcomp "remote merge" "$pfx" "$cur"
 824                return
 825                ;;
 826        branch.*)
 827                local pfx="${cur%.*}."
 828                cur="${cur#*.}"
 829                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
 830                return
 831                ;;
 832        remote.*.*)
 833                local pfx="${cur%.*}."
 834                cur="${cur##*.}"
 835                __gitcomp "
 836                        url fetch push skipDefaultUpdate
 837                        receivepack uploadpack tagopt
 838                        " "$pfx" "$cur"
 839                return
 840                ;;
 841        remote.*)
 842                local pfx="${cur%.*}."
 843                cur="${cur#*.}"
 844                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
 845                return
 846                ;;
 847        esac
 848        __gitcomp "
 849                apply.whitespace
 850                core.fileMode
 851                core.gitProxy
 852                core.ignoreStat
 853                core.preferSymlinkRefs
 854                core.logAllRefUpdates
 855                core.loosecompression
 856                core.repositoryFormatVersion
 857                core.sharedRepository
 858                core.warnAmbiguousRefs
 859                core.compression
 860                core.legacyHeaders
 861                core.packedGitWindowSize
 862                core.packedGitLimit
 863                clean.requireForce
 864                color.branch
 865                color.branch.current
 866                color.branch.local
 867                color.branch.remote
 868                color.branch.plain
 869                color.diff
 870                color.diff.plain
 871                color.diff.meta
 872                color.diff.frag
 873                color.diff.old
 874                color.diff.new
 875                color.diff.commit
 876                color.diff.whitespace
 877                color.pager
 878                color.status
 879                color.status.header
 880                color.status.added
 881                color.status.changed
 882                color.status.untracked
 883                diff.renameLimit
 884                diff.renames
 885                fetch.unpackLimit
 886                format.headers
 887                format.subjectprefix
 888                gitcvs.enabled
 889                gitcvs.logfile
 890                gitcvs.allbinary
 891                gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
 892                gc.packrefs
 893                gc.reflogexpire
 894                gc.reflogexpireunreachable
 895                gc.rerereresolved
 896                gc.rerereunresolved
 897                http.sslVerify
 898                http.sslCert
 899                http.sslKey
 900                http.sslCAInfo
 901                http.sslCAPath
 902                http.maxRequests
 903                http.lowSpeedLimit
 904                http.lowSpeedTime
 905                http.noEPSV
 906                i18n.commitEncoding
 907                i18n.logOutputEncoding
 908                log.showroot
 909                merge.tool
 910                merge.summary
 911                merge.verbosity
 912                pack.window
 913                pack.depth
 914                pack.windowMemory
 915                pack.compression
 916                pack.deltaCacheSize
 917                pack.deltaCacheLimit
 918                pull.octopus
 919                pull.twohead
 920                repack.useDeltaBaseOffset
 921                show.difftree
 922                showbranch.default
 923                tar.umask
 924                transfer.unpackLimit
 925                receive.unpackLimit
 926                receive.denyNonFastForwards
 927                user.name
 928                user.email
 929                user.signingkey
 930                whatchanged.difftree
 931                branch. remote.
 932        "
 933}
 934
 935_git_remote ()
 936{
 937        local i c=1 command
 938        while [ $c -lt $COMP_CWORD ]; do
 939                i="${COMP_WORDS[c]}"
 940                case "$i" in
 941                add|show|prune|update) command="$i"; break ;;
 942                esac
 943                c=$((++c))
 944        done
 945
 946        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 947                __gitcomp "add show prune update"
 948                return
 949        fi
 950
 951        case "$command" in
 952        show|prune)
 953                __gitcomp "$(__git_remotes)"
 954                ;;
 955        update)
 956                local i c='' IFS=$'\n'
 957                for i in $(git --git-dir="$(__gitdir)" config --list); do
 958                        case "$i" in
 959                        remotes.*)
 960                                i="${i#remotes.}"
 961                                c="$c ${i/=*/}"
 962                                ;;
 963                        esac
 964                done
 965                __gitcomp "$c"
 966                ;;
 967        *)
 968                COMPREPLY=()
 969                ;;
 970        esac
 971}
 972
 973_git_reset ()
 974{
 975        local cur="${COMP_WORDS[COMP_CWORD]}"
 976        case "$cur" in
 977        --*)
 978                __gitcomp "--mixed --hard --soft"
 979                return
 980                ;;
 981        esac
 982        __gitcomp "$(__git_refs)"
 983}
 984
 985_git_shortlog ()
 986{
 987        local cur="${COMP_WORDS[COMP_CWORD]}"
 988        case "$cur" in
 989        --*)
 990                __gitcomp "
 991                        --max-count= --max-age= --since= --after=
 992                        --min-age= --before= --until=
 993                        --no-merges
 994                        --author= --committer= --grep=
 995                        --all-match
 996                        --not --all
 997                        --numbered --summary
 998                        "
 999                return
1000                ;;
1001        esac
1002        __git_complete_revlist
1003}
1004
1005_git_show ()
1006{
1007        local cur="${COMP_WORDS[COMP_CWORD]}"
1008        case "$cur" in
1009        --pretty=*)
1010                __gitcomp "
1011                        oneline short medium full fuller email raw
1012                        " "" "${cur##--pretty=}"
1013                return
1014                ;;
1015        --*)
1016                __gitcomp "--pretty="
1017                return
1018                ;;
1019        esac
1020        __git_complete_file
1021}
1022
1023_git_stash ()
1024{
1025        __gitcomp 'list show apply clear'
1026}
1027
1028_git_submodule ()
1029{
1030        local i c=1 command
1031        while [ $c -lt $COMP_CWORD ]; do
1032                i="${COMP_WORDS[c]}"
1033                case "$i" in
1034                add|status|init|update) command="$i"; break ;;
1035                esac
1036                c=$((++c))
1037        done
1038
1039        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1040                local cur="${COMP_WORDS[COMP_CWORD]}"
1041                case "$cur" in
1042                --*)
1043                        __gitcomp "--quiet --cached"
1044                        ;;
1045                *)
1046                        __gitcomp "add status init update"
1047                        ;;
1048                esac
1049                return
1050        fi
1051}
1052
1053_git ()
1054{
1055        local i c=1 command __git_dir
1056
1057        while [ $c -lt $COMP_CWORD ]; do
1058                i="${COMP_WORDS[c]}"
1059                case "$i" in
1060                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1061                --bare)      __git_dir="." ;;
1062                --version|--help|-p|--paginate) ;;
1063                *) command="$i"; break ;;
1064                esac
1065                c=$((++c))
1066        done
1067
1068        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
1069                case "${COMP_WORDS[COMP_CWORD]}" in
1070                --*=*) COMPREPLY=() ;;
1071                --*)   __gitcomp "
1072                        --no-pager
1073                        --git-dir=
1074                        --bare
1075                        --version
1076                        --exec-path
1077                        "
1078                        ;;
1079                *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
1080                esac
1081                return
1082        fi
1083
1084        local expansion=$(__git_aliased_command "$command")
1085        [ "$expansion" ] && command="$expansion"
1086
1087        case "$command" in
1088        am)          _git_am ;;
1089        add)         _git_add ;;
1090        apply)       _git_apply ;;
1091        bisect)      _git_bisect ;;
1092        bundle)      _git_bundle ;;
1093        branch)      _git_branch ;;
1094        checkout)    _git_checkout ;;
1095        cherry)      _git_cherry ;;
1096        cherry-pick) _git_cherry_pick ;;
1097        commit)      _git_commit ;;
1098        config)      _git_config ;;
1099        describe)    _git_describe ;;
1100        diff)        _git_diff ;;
1101        fetch)       _git_fetch ;;
1102        format-patch) _git_format_patch ;;
1103        gc)          _git_gc ;;
1104        log)         _git_log ;;
1105        ls-remote)   _git_ls_remote ;;
1106        ls-tree)     _git_ls_tree ;;
1107        merge)       _git_merge;;
1108        merge-base)  _git_merge_base ;;
1109        name-rev)    _git_name_rev ;;
1110        pull)        _git_pull ;;
1111        push)        _git_push ;;
1112        rebase)      _git_rebase ;;
1113        remote)      _git_remote ;;
1114        reset)       _git_reset ;;
1115        shortlog)    _git_shortlog ;;
1116        show)        _git_show ;;
1117        show-branch) _git_log ;;
1118        stash)       _git_stash ;;
1119        submodule)   _git_submodule ;;
1120        whatchanged) _git_log ;;
1121        *)           COMPREPLY=() ;;
1122        esac
1123}
1124
1125_gitk ()
1126{
1127        local cur="${COMP_WORDS[COMP_CWORD]}"
1128        case "$cur" in
1129        --*)
1130                __gitcomp "--not --all"
1131                return
1132                ;;
1133        esac
1134        __git_complete_revlist
1135}
1136
1137complete -o default -o nospace -F _git git
1138complete -o default -o nospace -F _gitk gitk
1139complete -o default -o nospace -F _git_am git-am
1140complete -o default -o nospace -F _git_apply git-apply
1141complete -o default -o nospace -F _git_bisect git-bisect
1142complete -o default -o nospace -F _git_branch git-branch
1143complete -o default -o nospace -F _git_bundle git-bundle
1144complete -o default -o nospace -F _git_checkout git-checkout
1145complete -o default -o nospace -F _git_cherry git-cherry
1146complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1147complete -o default -o nospace -F _git_commit git-commit
1148complete -o default -o nospace -F _git_describe git-describe
1149complete -o default -o nospace -F _git_diff git-diff
1150complete -o default -o nospace -F _git_fetch git-fetch
1151complete -o default -o nospace -F _git_format_patch git-format-patch
1152complete -o default -o nospace -F _git_gc git-gc
1153complete -o default -o nospace -F _git_log git-log
1154complete -o default -o nospace -F _git_ls_remote git-ls-remote
1155complete -o default -o nospace -F _git_ls_tree git-ls-tree
1156complete -o default -o nospace -F _git_merge git-merge
1157complete -o default -o nospace -F _git_merge_base git-merge-base
1158complete -o default -o nospace -F _git_name_rev git-name-rev
1159complete -o default -o nospace -F _git_pull git-pull
1160complete -o default -o nospace -F _git_push git-push
1161complete -o default -o nospace -F _git_rebase git-rebase
1162complete -o default -o nospace -F _git_config git-config
1163complete -o default -o nospace -F _git_remote git-remote
1164complete -o default -o nospace -F _git_reset git-reset
1165complete -o default -o nospace -F _git_shortlog git-shortlog
1166complete -o default -o nospace -F _git_show git-show
1167complete -o default -o nospace -F _git_stash git-stash
1168complete -o default -o nospace -F _git_submodule git-submodule
1169complete -o default -o nospace -F _git_log git-show-branch
1170complete -o default -o nospace -F _git_log git-whatchanged
1171
1172# The following are necessary only for Cygwin, and only are needed
1173# when the user has tab-completed the executable name and consequently
1174# included the '.exe' suffix.
1175#
1176if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1177complete -o default -o nospace -F _git_add git-add.exe
1178complete -o default -o nospace -F _git_apply git-apply.exe
1179complete -o default -o nospace -F _git git.exe
1180complete -o default -o nospace -F _git_branch git-branch.exe
1181complete -o default -o nospace -F _git_bundle git-bundle.exe
1182complete -o default -o nospace -F _git_cherry git-cherry.exe
1183complete -o default -o nospace -F _git_describe git-describe.exe
1184complete -o default -o nospace -F _git_diff git-diff.exe
1185complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1186complete -o default -o nospace -F _git_log git-log.exe
1187complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1188complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1189complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1190complete -o default -o nospace -F _git_push git-push.exe
1191complete -o default -o nospace -F _git_config git-config
1192complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1193complete -o default -o nospace -F _git_show git-show.exe
1194complete -o default -o nospace -F _git_log git-show-branch.exe
1195complete -o default -o nospace -F _git_log git-whatchanged.exe
1196fi