contrib / completion / git-completion.bashon commit Merge branch 'db/remote' (322bcd9)
   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"
 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_checkout ()
 463{
 464        __gitcomp "$(__git_refs)"
 465}
 466
 467_git_cherry ()
 468{
 469        __gitcomp "$(__git_refs)"
 470}
 471
 472_git_cherry_pick ()
 473{
 474        local cur="${COMP_WORDS[COMP_CWORD]}"
 475        case "$cur" in
 476        --*)
 477                __gitcomp "--edit --no-commit"
 478                ;;
 479        *)
 480                __gitcomp "$(__git_refs)"
 481                ;;
 482        esac
 483}
 484
 485_git_commit ()
 486{
 487        local cur="${COMP_WORDS[COMP_CWORD]}"
 488        case "$cur" in
 489        --*)
 490                __gitcomp "
 491                        --all --author= --signoff --verify --no-verify
 492                        --edit --amend --include --only
 493                        "
 494                return
 495        esac
 496        COMPREPLY=()
 497}
 498
 499_git_diff ()
 500{
 501        __git_complete_file
 502}
 503
 504_git_diff_tree ()
 505{
 506        __gitcomp "$(__git_refs)"
 507}
 508
 509_git_fetch ()
 510{
 511        local cur="${COMP_WORDS[COMP_CWORD]}"
 512
 513        case "${COMP_WORDS[0]},$COMP_CWORD" in
 514        git-fetch*,1)
 515                __gitcomp "$(__git_remotes)"
 516                ;;
 517        git,2)
 518                __gitcomp "$(__git_remotes)"
 519                ;;
 520        *)
 521                case "$cur" in
 522                *:*)
 523                        __gitcomp "$(__git_refs)" "" "${cur#*:}"
 524                        ;;
 525                *)
 526                        local remote
 527                        case "${COMP_WORDS[0]}" in
 528                        git-fetch) remote="${COMP_WORDS[1]}" ;;
 529                        git)       remote="${COMP_WORDS[2]}" ;;
 530                        esac
 531                        __gitcomp "$(__git_refs2 "$remote")"
 532                        ;;
 533                esac
 534                ;;
 535        esac
 536}
 537
 538_git_format_patch ()
 539{
 540        local cur="${COMP_WORDS[COMP_CWORD]}"
 541        case "$cur" in
 542        --*)
 543                __gitcomp "
 544                        --stdout --attach --thread
 545                        --output-directory
 546                        --numbered --start-number
 547                        --keep-subject
 548                        --signoff
 549                        --in-reply-to=
 550                        --full-index --binary
 551                        --not --all
 552                        "
 553                return
 554                ;;
 555        esac
 556        __git_complete_revlist
 557}
 558
 559_git_gc ()
 560{
 561        local cur="${COMP_WORDS[COMP_CWORD]}"
 562        case "$cur" in
 563        --*)
 564                __gitcomp "--prune"
 565                return
 566                ;;
 567        esac
 568        COMPREPLY=()
 569}
 570
 571_git_ls_remote ()
 572{
 573        __gitcomp "$(__git_remotes)"
 574}
 575
 576_git_ls_tree ()
 577{
 578        __git_complete_file
 579}
 580
 581_git_log ()
 582{
 583        local cur="${COMP_WORDS[COMP_CWORD]}"
 584        case "$cur" in
 585        --pretty=*)
 586                __gitcomp "
 587                        oneline short medium full fuller email raw
 588                        " "" "${cur##--pretty=}"
 589                return
 590                ;;
 591        --*)
 592                __gitcomp "
 593                        --max-count= --max-age= --since= --after=
 594                        --min-age= --before= --until=
 595                        --root --topo-order --date-order --reverse
 596                        --no-merges
 597                        --abbrev-commit --abbrev=
 598                        --relative-date
 599                        --author= --committer= --grep=
 600                        --all-match
 601                        --pretty= --name-status --name-only --raw
 602                        --not --all
 603                        "
 604                return
 605                ;;
 606        esac
 607        __git_complete_revlist
 608}
 609
 610_git_merge ()
 611{
 612        local cur="${COMP_WORDS[COMP_CWORD]}"
 613        case "${COMP_WORDS[COMP_CWORD-1]}" in
 614        -s|--strategy)
 615                __gitcomp "$(__git_merge_strategies)"
 616                return
 617        esac
 618        case "$cur" in
 619        --strategy=*)
 620                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 621                return
 622                ;;
 623        --*)
 624                __gitcomp "
 625                        --no-commit --no-summary --squash --strategy
 626                        "
 627                return
 628        esac
 629        __gitcomp "$(__git_refs)"
 630}
 631
 632_git_merge_base ()
 633{
 634        __gitcomp "$(__git_refs)"
 635}
 636
 637_git_name_rev ()
 638{
 639        __gitcomp "--tags --all --stdin"
 640}
 641
 642_git_pull ()
 643{
 644        local cur="${COMP_WORDS[COMP_CWORD]}"
 645
 646        case "${COMP_WORDS[0]},$COMP_CWORD" in
 647        git-pull*,1)
 648                __gitcomp "$(__git_remotes)"
 649                ;;
 650        git,2)
 651                __gitcomp "$(__git_remotes)"
 652                ;;
 653        *)
 654                local remote
 655                case "${COMP_WORDS[0]}" in
 656                git-pull)  remote="${COMP_WORDS[1]}" ;;
 657                git)       remote="${COMP_WORDS[2]}" ;;
 658                esac
 659                __gitcomp "$(__git_refs "$remote")"
 660                ;;
 661        esac
 662}
 663
 664_git_push ()
 665{
 666        local cur="${COMP_WORDS[COMP_CWORD]}"
 667
 668        case "${COMP_WORDS[0]},$COMP_CWORD" in
 669        git-push*,1)
 670                __gitcomp "$(__git_remotes)"
 671                ;;
 672        git,2)
 673                __gitcomp "$(__git_remotes)"
 674                ;;
 675        *)
 676                case "$cur" in
 677                *:*)
 678                        local remote
 679                        case "${COMP_WORDS[0]}" in
 680                        git-push)  remote="${COMP_WORDS[1]}" ;;
 681                        git)       remote="${COMP_WORDS[2]}" ;;
 682                        esac
 683                        __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
 684                        ;;
 685                *)
 686                        __gitcomp "$(__git_refs2)"
 687                        ;;
 688                esac
 689                ;;
 690        esac
 691}
 692
 693_git_rebase ()
 694{
 695        local cur="${COMP_WORDS[COMP_CWORD]}"
 696        if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
 697                __gitcomp "--continue --skip --abort"
 698                return
 699        fi
 700        case "${COMP_WORDS[COMP_CWORD-1]}" in
 701        -s|--strategy)
 702                __gitcomp "$(__git_merge_strategies)"
 703                return
 704        esac
 705        case "$cur" in
 706        --strategy=*)
 707                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 708                return
 709                ;;
 710        --*)
 711                __gitcomp "--onto --merge --strategy"
 712                return
 713        esac
 714        __gitcomp "$(__git_refs)"
 715}
 716
 717_git_config ()
 718{
 719        local cur="${COMP_WORDS[COMP_CWORD]}"
 720        local prv="${COMP_WORDS[COMP_CWORD-1]}"
 721        case "$prv" in
 722        branch.*.remote)
 723                __gitcomp "$(__git_remotes)"
 724                return
 725                ;;
 726        branch.*.merge)
 727                __gitcomp "$(__git_refs)"
 728                return
 729                ;;
 730        remote.*.fetch)
 731                local remote="${prv#remote.}"
 732                remote="${remote%.fetch}"
 733                __gitcomp "$(__git_refs_remotes "$remote")"
 734                return
 735                ;;
 736        remote.*.push)
 737                local remote="${prv#remote.}"
 738                remote="${remote%.push}"
 739                __gitcomp "$(git --git-dir="$(__gitdir)" \
 740                        for-each-ref --format='%(refname):%(refname)' \
 741                        refs/heads)"
 742                return
 743                ;;
 744        pull.twohead|pull.octopus)
 745                __gitcomp "$(__git_merge_strategies)"
 746                return
 747                ;;
 748        color.branch|color.diff|color.status)
 749                __gitcomp "always never auto"
 750                return
 751                ;;
 752        color.*.*)
 753                __gitcomp "
 754                        black red green yellow blue magenta cyan white
 755                        bold dim ul blink reverse
 756                        "
 757                return
 758                ;;
 759        *.*)
 760                COMPREPLY=()
 761                return
 762                ;;
 763        esac
 764        case "$cur" in
 765        --*)
 766                __gitcomp "
 767                        --global --system
 768                        --list --replace-all
 769                        --get --get-all --get-regexp
 770                        --add --unset --unset-all
 771                        --remove-section --rename-section
 772                        "
 773                return
 774                ;;
 775        branch.*.*)
 776                local pfx="${cur%.*}."
 777                cur="${cur##*.}"
 778                __gitcomp "remote merge" "$pfx" "$cur"
 779                return
 780                ;;
 781        branch.*)
 782                local pfx="${cur%.*}."
 783                cur="${cur#*.}"
 784                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
 785                return
 786                ;;
 787        remote.*.*)
 788                local pfx="${cur%.*}."
 789                cur="${cur##*.}"
 790                __gitcomp "
 791                        url fetch push skipDefaultUpdate
 792                        receivepack uploadpack tagopt
 793                        " "$pfx" "$cur"
 794                return
 795                ;;
 796        remote.*)
 797                local pfx="${cur%.*}."
 798                cur="${cur#*.}"
 799                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
 800                return
 801                ;;
 802        esac
 803        __gitcomp "
 804                apply.whitespace
 805                core.fileMode
 806                core.gitProxy
 807                core.ignoreStat
 808                core.preferSymlinkRefs
 809                core.logAllRefUpdates
 810                core.repositoryFormatVersion
 811                core.sharedRepository
 812                core.warnAmbiguousRefs
 813                core.compression
 814                core.legacyHeaders
 815                core.packedGitWindowSize
 816                core.packedGitLimit
 817                clean.requireForce
 818                color.branch
 819                color.branch.current
 820                color.branch.local
 821                color.branch.remote
 822                color.branch.plain
 823                color.diff
 824                color.diff.plain
 825                color.diff.meta
 826                color.diff.frag
 827                color.diff.old
 828                color.diff.new
 829                color.diff.commit
 830                color.diff.whitespace
 831                color.pager
 832                color.status
 833                color.status.header
 834                color.status.added
 835                color.status.changed
 836                color.status.untracked
 837                diff.renameLimit
 838                diff.renames
 839                fetch.unpackLimit
 840                format.headers
 841                gitcvs.enabled
 842                gitcvs.logfile
 843                gitcvs.allbinary
 844                gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
 845                gc.packrefs
 846                gc.reflogexpire
 847                gc.reflogexpireunreachable
 848                gc.rerereresolved
 849                gc.rerereunresolved
 850                http.sslVerify
 851                http.sslCert
 852                http.sslKey
 853                http.sslCAInfo
 854                http.sslCAPath
 855                http.maxRequests
 856                http.lowSpeedLimit
 857                http.lowSpeedTime
 858                http.noEPSV
 859                i18n.commitEncoding
 860                i18n.logOutputEncoding
 861                log.showroot
 862                merge.tool
 863                merge.summary
 864                merge.verbosity
 865                pack.window
 866                pack.depth
 867                pull.octopus
 868                pull.twohead
 869                repack.useDeltaBaseOffset
 870                show.difftree
 871                showbranch.default
 872                tar.umask
 873                transfer.unpackLimit
 874                receive.unpackLimit
 875                receive.denyNonFastForwards
 876                user.name
 877                user.email
 878                user.signingkey
 879                whatchanged.difftree
 880                branch. remote.
 881        "
 882}
 883
 884_git_remote ()
 885{
 886        local i c=1 command
 887        while [ $c -lt $COMP_CWORD ]; do
 888                i="${COMP_WORDS[c]}"
 889                case "$i" in
 890                add|show|prune|update) command="$i"; break ;;
 891                esac
 892                c=$((++c))
 893        done
 894
 895        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 896                __gitcomp "add show prune update"
 897                return
 898        fi
 899
 900        case "$command" in
 901        show|prune)
 902                __gitcomp "$(__git_remotes)"
 903                ;;
 904        update)
 905                local i c='' IFS=$'\n'
 906                for i in $(git --git-dir="$(__gitdir)" config --list); do
 907                        case "$i" in
 908                        remotes.*)
 909                                i="${i#remotes.}"
 910                                c="$c ${i/=*/}"
 911                                ;;
 912                        esac
 913                done
 914                __gitcomp "$c"
 915                ;;
 916        *)
 917                COMPREPLY=()
 918                ;;
 919        esac
 920}
 921
 922_git_reset ()
 923{
 924        local cur="${COMP_WORDS[COMP_CWORD]}"
 925        case "$cur" in
 926        --*)
 927                __gitcomp "--mixed --hard --soft"
 928                return
 929                ;;
 930        esac
 931        __gitcomp "$(__git_refs)"
 932}
 933
 934_git_shortlog ()
 935{
 936        local cur="${COMP_WORDS[COMP_CWORD]}"
 937        case "$cur" in
 938        --*)
 939                __gitcomp "
 940                        --max-count= --max-age= --since= --after=
 941                        --min-age= --before= --until=
 942                        --no-merges
 943                        --author= --committer= --grep=
 944                        --all-match
 945                        --not --all
 946                        --numbered --summary
 947                        "
 948                return
 949                ;;
 950        esac
 951        __git_complete_revlist
 952}
 953
 954_git_show ()
 955{
 956        local cur="${COMP_WORDS[COMP_CWORD]}"
 957        case "$cur" in
 958        --pretty=*)
 959                __gitcomp "
 960                        oneline short medium full fuller email raw
 961                        " "" "${cur##--pretty=}"
 962                return
 963                ;;
 964        --*)
 965                __gitcomp "--pretty="
 966                return
 967                ;;
 968        esac
 969        __git_complete_file
 970}
 971
 972_git ()
 973{
 974        local i c=1 command __git_dir
 975
 976        while [ $c -lt $COMP_CWORD ]; do
 977                i="${COMP_WORDS[c]}"
 978                case "$i" in
 979                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
 980                --bare)      __git_dir="." ;;
 981                --version|--help|-p|--paginate) ;;
 982                *) command="$i"; break ;;
 983                esac
 984                c=$((++c))
 985        done
 986
 987        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 988                case "${COMP_WORDS[COMP_CWORD]}" in
 989                --*=*) COMPREPLY=() ;;
 990                --*)   __gitcomp "--git-dir= --bare --version --exec-path" ;;
 991                *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
 992                esac
 993                return
 994        fi
 995
 996        local expansion=$(__git_aliased_command "$command")
 997        [ "$expansion" ] && command="$expansion"
 998
 999        case "$command" in
1000        am)          _git_am ;;
1001        add)         _git_add ;;
1002        apply)       _git_apply ;;
1003        bisect)      _git_bisect ;;
1004        branch)      _git_branch ;;
1005        checkout)    _git_checkout ;;
1006        cherry)      _git_cherry ;;
1007        cherry-pick) _git_cherry_pick ;;
1008        commit)      _git_commit ;;
1009        config)      _git_config ;;
1010        diff)        _git_diff ;;
1011        fetch)       _git_fetch ;;
1012        format-patch) _git_format_patch ;;
1013        gc)          _git_gc ;;
1014        log)         _git_log ;;
1015        ls-remote)   _git_ls_remote ;;
1016        ls-tree)     _git_ls_tree ;;
1017        merge)       _git_merge;;
1018        merge-base)  _git_merge_base ;;
1019        name-rev)    _git_name_rev ;;
1020        pull)        _git_pull ;;
1021        push)        _git_push ;;
1022        rebase)      _git_rebase ;;
1023        remote)      _git_remote ;;
1024        reset)       _git_reset ;;
1025        shortlog)    _git_shortlog ;;
1026        show)        _git_show ;;
1027        show-branch) _git_log ;;
1028        whatchanged) _git_log ;;
1029        *)           COMPREPLY=() ;;
1030        esac
1031}
1032
1033_gitk ()
1034{
1035        local cur="${COMP_WORDS[COMP_CWORD]}"
1036        case "$cur" in
1037        --*)
1038                __gitcomp "--not --all"
1039                return
1040                ;;
1041        esac
1042        __git_complete_revlist
1043}
1044
1045complete -o default -o nospace -F _git git
1046complete -o default -o nospace -F _gitk gitk
1047complete -o default -o nospace -F _git_am git-am
1048complete -o default -o nospace -F _git_apply git-apply
1049complete -o default -o nospace -F _git_bisect git-bisect
1050complete -o default -o nospace -F _git_branch git-branch
1051complete -o default -o nospace -F _git_checkout git-checkout
1052complete -o default -o nospace -F _git_cherry git-cherry
1053complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
1054complete -o default -o nospace -F _git_commit git-commit
1055complete -o default -o nospace -F _git_diff git-diff
1056complete -o default -o nospace -F _git_fetch git-fetch
1057complete -o default -o nospace -F _git_format_patch git-format-patch
1058complete -o default -o nospace -F _git_gc git-gc
1059complete -o default -o nospace -F _git_log git-log
1060complete -o default -o nospace -F _git_ls_remote git-ls-remote
1061complete -o default -o nospace -F _git_ls_tree git-ls-tree
1062complete -o default -o nospace -F _git_merge git-merge
1063complete -o default -o nospace -F _git_merge_base git-merge-base
1064complete -o default -o nospace -F _git_name_rev git-name-rev
1065complete -o default -o nospace -F _git_pull git-pull
1066complete -o default -o nospace -F _git_push git-push
1067complete -o default -o nospace -F _git_rebase git-rebase
1068complete -o default -o nospace -F _git_config git-config
1069complete -o default -o nospace -F _git_remote git-remote
1070complete -o default -o nospace -F _git_reset git-reset
1071complete -o default -o nospace -F _git_shortlog git-shortlog
1072complete -o default -o nospace -F _git_show git-show
1073complete -o default -o nospace -F _git_log git-show-branch
1074complete -o default -o nospace -F _git_log git-whatchanged
1075
1076# The following are necessary only for Cygwin, and only are needed
1077# when the user has tab-completed the executable name and consequently
1078# included the '.exe' suffix.
1079#
1080if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1081complete -o default -o nospace -F _git_add git-add.exe
1082complete -o default -o nospace -F _git_apply git-apply.exe
1083complete -o default -o nospace -F _git git.exe
1084complete -o default -o nospace -F _git_branch git-branch.exe
1085complete -o default -o nospace -F _git_cherry git-cherry.exe
1086complete -o default -o nospace -F _git_diff git-diff.exe
1087complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1088complete -o default -o nospace -F _git_log git-log.exe
1089complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1090complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1091complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1092complete -o default -o nospace -F _git_push git-push.exe
1093complete -o default -o nospace -F _git_config git-config
1094complete -o default -o nospace -F _git_shortlog git-shortlog.exe
1095complete -o default -o nospace -F _git_show git-show.exe
1096complete -o default -o nospace -F _git_log git-show-branch.exe
1097complete -o default -o nospace -F _git_log git-whatchanged.exe
1098fi