contrib / completion / git-completion.bashon commit Initialize tree descriptors with a helper function rather than by hand. (6fda5e5)
   1#
   2# bash completion support for core Git.
   3#
   4# Copyright (C) 2006,2007 Shawn Pearce
   5# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
   6#
   7# The contained completion routines provide support for completing:
   8#
   9#    *) local and remote branch names
  10#    *) local and remote tag names
  11#    *) .git/remotes file names
  12#    *) git 'subcommands'
  13#    *) tree paths within 'ref:path/to/file' expressions
  14#
  15# To use these routines:
  16#
  17#    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
  18#    2) Added the following line to your .bashrc:
  19#        source ~/.git-completion.sh
  20#
  21#    3) You may want to make sure the git executable is available
  22#       in your PATH before this script is sourced, as some caching
  23#       is performed while the script loads.  If git isn't found
  24#       at source time then all lookups will be done on demand,
  25#       which may be slightly slower.
  26#
  27#    4) Consider changing your PS1 to also show the current branch:
  28#        PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
  29#
  30#       The argument to __git_ps1 will be displayed only if you
  31#       are currently in a git repository.  The %s token will be
  32#       the name of the current branch.
  33#
  34
  35__gitdir ()
  36{
  37        if [ -z "$1" ]; then
  38                if [ -n "$__git_dir" ]; then
  39                        echo "$__git_dir"
  40                elif [ -d .git ]; then
  41                        echo .git
  42                else
  43                        git rev-parse --git-dir 2>/dev/null
  44                fi
  45        elif [ -d "$1/.git" ]; then
  46                echo "$1/.git"
  47        else
  48                echo "$1"
  49        fi
  50}
  51
  52__git_ps1 ()
  53{
  54        local b="$(git symbolic-ref HEAD 2>/dev/null)"
  55        if [ -n "$b" ]; then
  56                if [ -n "$1" ]; then
  57                        printf "$1" "${b##refs/heads/}"
  58                else
  59                        printf " (%s)" "${b##refs/heads/}"
  60                fi
  61        fi
  62}
  63
  64__gitcomp ()
  65{
  66        local all c s=$'\n' IFS=' '$'\t'$'\n'
  67        local cur="${COMP_WORDS[COMP_CWORD]}"
  68        if [ $# -gt 2 ]; then
  69                cur="$3"
  70        fi
  71        for c in $1; do
  72                case "$c$4" in
  73                --*=*) all="$all$c$4$s" ;;
  74                *.)    all="$all$c$4$s" ;;
  75                *)     all="$all$c$4 $s" ;;
  76                esac
  77        done
  78        IFS=$s
  79        COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
  80        return
  81}
  82
  83__git_heads ()
  84{
  85        local cmd i is_hash=y dir="$(__gitdir "$1")"
  86        if [ -d "$dir" ]; then
  87                for i in $(git --git-dir="$dir" \
  88                        for-each-ref --format='%(refname)' \
  89                        refs/heads ); do
  90                        echo "${i#refs/heads/}"
  91                done
  92                return
  93        fi
  94        for i in $(git-ls-remote "$1" 2>/dev/null); do
  95                case "$is_hash,$i" in
  96                y,*) is_hash=n ;;
  97                n,*^{}) is_hash=y ;;
  98                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
  99                n,*) is_hash=y; echo "$i" ;;
 100                esac
 101        done
 102}
 103
 104__git_refs ()
 105{
 106        local cmd i is_hash=y dir="$(__gitdir "$1")"
 107        if [ -d "$dir" ]; then
 108                if [ -e "$dir/HEAD" ]; then echo HEAD; fi
 109                for i in $(git --git-dir="$dir" \
 110                        for-each-ref --format='%(refname)' \
 111                        refs/tags refs/heads refs/remotes); do
 112                        case "$i" in
 113                                refs/tags/*)    echo "${i#refs/tags/}" ;;
 114                                refs/heads/*)   echo "${i#refs/heads/}" ;;
 115                                refs/remotes/*) echo "${i#refs/remotes/}" ;;
 116                                *)              echo "$i" ;;
 117                        esac
 118                done
 119                return
 120        fi
 121        for i in $(git-ls-remote "$dir" 2>/dev/null); do
 122                case "$is_hash,$i" in
 123                y,*) is_hash=n ;;
 124                n,*^{}) is_hash=y ;;
 125                n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
 126                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
 127                n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
 128                n,*) is_hash=y; echo "$i" ;;
 129                esac
 130        done
 131}
 132
 133__git_refs2 ()
 134{
 135        local i
 136        for i in $(__git_refs "$1"); do
 137                echo "$i:$i"
 138        done
 139}
 140
 141__git_refs_remotes ()
 142{
 143        local cmd i is_hash=y
 144        for i in $(git-ls-remote "$1" 2>/dev/null); do
 145                case "$is_hash,$i" in
 146                n,refs/heads/*)
 147                        is_hash=y
 148                        echo "$i:refs/remotes/$1/${i#refs/heads/}"
 149                        ;;
 150                y,*) is_hash=n ;;
 151                n,*^{}) is_hash=y ;;
 152                n,refs/tags/*) is_hash=y;;
 153                n,*) is_hash=y; ;;
 154                esac
 155        done
 156}
 157
 158__git_remotes ()
 159{
 160        local i ngoff IFS=$'\n' d="$(__gitdir)"
 161        shopt -q nullglob || ngoff=1
 162        shopt -s nullglob
 163        for i in "$d/remotes"/*; do
 164                echo ${i#$d/remotes/}
 165        done
 166        [ "$ngoff" ] && shopt -u nullglob
 167        for i in $(git --git-dir="$d" config --list); do
 168                case "$i" in
 169                remote.*.url=*)
 170                        i="${i#remote.}"
 171                        echo "${i/.url=*/}"
 172                        ;;
 173                esac
 174        done
 175}
 176
 177__git_merge_strategies ()
 178{
 179        if [ -n "$__git_merge_strategylist" ]; then
 180                echo "$__git_merge_strategylist"
 181                return
 182        fi
 183        sed -n "/^all_strategies='/{
 184                s/^all_strategies='//
 185                s/'//
 186                p
 187                q
 188                }" "$(git --exec-path)/git-merge"
 189}
 190__git_merge_strategylist=
 191__git_merge_strategylist="$(__git_merge_strategies 2>/dev/null)"
 192
 193__git_complete_file ()
 194{
 195        local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
 196        case "$cur" in
 197        ?*:*)
 198                ref="${cur%%:*}"
 199                cur="${cur#*:}"
 200                case "$cur" in
 201                ?*/*)
 202                        pfx="${cur%/*}"
 203                        cur="${cur##*/}"
 204                        ls="$ref:$pfx"
 205                        pfx="$pfx/"
 206                        ;;
 207                *)
 208                        ls="$ref"
 209                        ;;
 210            esac
 211                COMPREPLY=($(compgen -P "$pfx" \
 212                        -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
 213                                | sed '/^100... blob /s,^.*     ,,
 214                                       /^040000 tree /{
 215                                           s,^.*        ,,
 216                                           s,$,/,
 217                                       }
 218                                       s/^.*    //')" \
 219                        -- "$cur"))
 220                ;;
 221        *)
 222                __gitcomp "$(__git_refs)"
 223                ;;
 224        esac
 225}
 226
 227__git_complete_revlist ()
 228{
 229        local pfx cur="${COMP_WORDS[COMP_CWORD]}"
 230        case "$cur" in
 231        *...*)
 232                pfx="${cur%...*}..."
 233                cur="${cur#*...}"
 234                __gitcomp "$(__git_refs)" "$pfx" "$cur"
 235                ;;
 236        *..*)
 237                pfx="${cur%..*}.."
 238                cur="${cur#*..}"
 239                __gitcomp "$(__git_refs)" "$pfx" "$cur"
 240                ;;
 241        *.)
 242                __gitcomp "$cur."
 243                ;;
 244        *)
 245                __gitcomp "$(__git_refs)"
 246                ;;
 247        esac
 248}
 249
 250__git_commands ()
 251{
 252        if [ -n "$__git_commandlist" ]; then
 253                echo "$__git_commandlist"
 254                return
 255        fi
 256        local i IFS=" "$'\n'
 257        for i in $(git help -a|egrep '^ ')
 258        do
 259                case $i in
 260                add--interactive) : plumbing;;
 261                applymbox)        : ask gittus;;
 262                applypatch)       : ask gittus;;
 263                archimport)       : import;;
 264                cat-file)         : plumbing;;
 265                check-ref-format) : plumbing;;
 266                commit-tree)      : plumbing;;
 267                convert-objects)  : plumbing;;
 268                cvsexportcommit)  : export;;
 269                cvsimport)        : import;;
 270                cvsserver)        : daemon;;
 271                daemon)           : daemon;;
 272                fast-import)      : import;;
 273                fsck-objects)     : plumbing;;
 274                fetch-pack)       : plumbing;;
 275                fmt-merge-msg)    : plumbing;;
 276                hash-object)      : plumbing;;
 277                http-*)           : transport;;
 278                index-pack)       : plumbing;;
 279                init-db)          : deprecated;;
 280                local-fetch)      : plumbing;;
 281                mailinfo)         : plumbing;;
 282                mailsplit)        : plumbing;;
 283                merge-*)          : plumbing;;
 284                mktree)           : plumbing;;
 285                mktag)            : plumbing;;
 286                pack-objects)     : plumbing;;
 287                pack-redundant)   : plumbing;;
 288                pack-refs)        : plumbing;;
 289                parse-remote)     : plumbing;;
 290                patch-id)         : plumbing;;
 291                peek-remote)      : plumbing;;
 292                prune)            : plumbing;;
 293                prune-packed)     : plumbing;;
 294                quiltimport)      : import;;
 295                read-tree)        : plumbing;;
 296                receive-pack)     : plumbing;;
 297                reflog)           : plumbing;;
 298                repo-config)      : plumbing;;
 299                rerere)           : plumbing;;
 300                rev-list)         : plumbing;;
 301                rev-parse)        : plumbing;;
 302                runstatus)        : plumbing;;
 303                sh-setup)         : internal;;
 304                shell)            : daemon;;
 305                send-pack)        : plumbing;;
 306                show-index)       : plumbing;;
 307                ssh-*)            : transport;;
 308                stripspace)       : plumbing;;
 309                svn)              : import export;;
 310                svnimport)        : import;;
 311                symbolic-ref)     : plumbing;;
 312                tar-tree)         : deprecated;;
 313                unpack-file)      : plumbing;;
 314                unpack-objects)   : plumbing;;
 315                update-index)     : plumbing;;
 316                update-ref)       : plumbing;;
 317                update-server-info) : daemon;;
 318                upload-archive)   : plumbing;;
 319                upload-pack)      : plumbing;;
 320                write-tree)       : plumbing;;
 321                verify-tag)       : plumbing;;
 322                *) echo $i;;
 323                esac
 324        done
 325}
 326__git_commandlist=
 327__git_commandlist="$(__git_commands 2>/dev/null)"
 328
 329__git_aliases ()
 330{
 331        local i IFS=$'\n'
 332        for i in $(git --git-dir="$(__gitdir)" config --list); do
 333                case "$i" in
 334                alias.*)
 335                        i="${i#alias.}"
 336                        echo "${i/=*/}"
 337                        ;;
 338                esac
 339        done
 340}
 341
 342__git_aliased_command ()
 343{
 344        local word cmdline=$(git --git-dir="$(__gitdir)" \
 345                config --get "alias.$1")
 346        for word in $cmdline; do
 347                if [ "${word##-*}" ]; then
 348                        echo $word
 349                        return
 350                fi
 351        done
 352}
 353
 354__git_whitespacelist="nowarn warn error error-all strip"
 355
 356_git_am ()
 357{
 358        local cur="${COMP_WORDS[COMP_CWORD]}"
 359        if [ -d .dotest ]; then
 360                __gitcomp "--skip --resolved"
 361                return
 362        fi
 363        case "$cur" in
 364        --whitespace=*)
 365                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 366                return
 367                ;;
 368        --*)
 369                __gitcomp "
 370                        --signoff --utf8 --binary --3way --interactive
 371                        --whitespace=
 372                        "
 373                return
 374        esac
 375        COMPREPLY=()
 376}
 377
 378_git_apply ()
 379{
 380        local cur="${COMP_WORDS[COMP_CWORD]}"
 381        case "$cur" in
 382        --whitespace=*)
 383                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 384                return
 385                ;;
 386        --*)
 387                __gitcomp "
 388                        --stat --numstat --summary --check --index
 389                        --cached --index-info --reverse --reject --unidiff-zero
 390                        --apply --no-add --exclude=
 391                        --whitespace= --inaccurate-eof --verbose
 392                        "
 393                return
 394        esac
 395        COMPREPLY=()
 396}
 397
 398_git_add ()
 399{
 400        local cur="${COMP_WORDS[COMP_CWORD]}"
 401        case "$cur" in
 402        --*)
 403                __gitcomp "--interactive"
 404                return
 405        esac
 406        COMPREPLY=()
 407}
 408
 409_git_bisect ()
 410{
 411        local i c=1 command
 412        while [ $c -lt $COMP_CWORD ]; do
 413                i="${COMP_WORDS[c]}"
 414                case "$i" in
 415                start|bad|good|reset|visualize|replay|log)
 416                        command="$i"
 417                        break
 418                        ;;
 419                esac
 420                c=$((++c))
 421        done
 422
 423        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 424                __gitcomp "start bad good reset visualize replay log"
 425                return
 426        fi
 427
 428        case "$command" in
 429        bad|good|reset)
 430                __gitcomp "$(__git_refs)"
 431                ;;
 432        *)
 433                COMPREPLY=()
 434                ;;
 435        esac
 436}
 437
 438_git_branch ()
 439{
 440        __gitcomp "$(__git_refs)"
 441}
 442
 443_git_checkout ()
 444{
 445        __gitcomp "$(__git_refs)"
 446}
 447
 448_git_cherry ()
 449{
 450        __gitcomp "$(__git_refs)"
 451}
 452
 453_git_cherry_pick ()
 454{
 455        local cur="${COMP_WORDS[COMP_CWORD]}"
 456        case "$cur" in
 457        --*)
 458                __gitcomp "--edit --no-commit"
 459                ;;
 460        *)
 461                __gitcomp "$(__git_refs)"
 462                ;;
 463        esac
 464}
 465
 466_git_commit ()
 467{
 468        local cur="${COMP_WORDS[COMP_CWORD]}"
 469        case "$cur" in
 470        --*)
 471                __gitcomp "
 472                        --all --author= --signoff --verify --no-verify
 473                        --edit --amend --include --only
 474                        "
 475                return
 476        esac
 477        COMPREPLY=()
 478}
 479
 480_git_diff ()
 481{
 482        __git_complete_file
 483}
 484
 485_git_diff_tree ()
 486{
 487        __gitcomp "$(__git_refs)"
 488}
 489
 490_git_fetch ()
 491{
 492        local cur="${COMP_WORDS[COMP_CWORD]}"
 493
 494        case "${COMP_WORDS[0]},$COMP_CWORD" in
 495        git-fetch*,1)
 496                __gitcomp "$(__git_remotes)"
 497                ;;
 498        git,2)
 499                __gitcomp "$(__git_remotes)"
 500                ;;
 501        *)
 502                case "$cur" in
 503                *:*)
 504                        __gitcomp "$(__git_refs)" "" "${cur#*:}"
 505                        ;;
 506                *)
 507                        local remote
 508                        case "${COMP_WORDS[0]}" in
 509                        git-fetch) remote="${COMP_WORDS[1]}" ;;
 510                        git)       remote="${COMP_WORDS[2]}" ;;
 511                        esac
 512                        __gitcomp "$(__git_refs2 "$remote")"
 513                        ;;
 514                esac
 515                ;;
 516        esac
 517}
 518
 519_git_format_patch ()
 520{
 521        local cur="${COMP_WORDS[COMP_CWORD]}"
 522        case "$cur" in
 523        --*)
 524                __gitcomp "
 525                        --stdout --attach --thread
 526                        --output-directory
 527                        --numbered --start-number
 528                        --keep-subject
 529                        --signoff
 530                        --in-reply-to=
 531                        --full-index --binary
 532                        --not --all
 533                        "
 534                return
 535                ;;
 536        esac
 537        __git_complete_revlist
 538}
 539
 540_git_gc ()
 541{
 542        local cur="${COMP_WORDS[COMP_CWORD]}"
 543        case "$cur" in
 544        --*)
 545                __gitcomp "--prune"
 546                return
 547                ;;
 548        esac
 549        COMPREPLY=()
 550}
 551
 552_git_ls_remote ()
 553{
 554        __gitcomp "$(__git_remotes)"
 555}
 556
 557_git_ls_tree ()
 558{
 559        __git_complete_file
 560}
 561
 562_git_log ()
 563{
 564        local cur="${COMP_WORDS[COMP_CWORD]}"
 565        case "$cur" in
 566        --pretty=*)
 567                __gitcomp "
 568                        oneline short medium full fuller email raw
 569                        " "" "${cur##--pretty=}"
 570                return
 571                ;;
 572        --*)
 573                __gitcomp "
 574                        --max-count= --max-age= --since= --after=
 575                        --min-age= --before= --until=
 576                        --root --not --topo-order --date-order
 577                        --no-merges
 578                        --abbrev-commit --abbrev=
 579                        --relative-date
 580                        --author= --committer= --grep=
 581                        --all-match
 582                        --pretty= --name-status --name-only
 583                        --not --all
 584                        "
 585                return
 586                ;;
 587        esac
 588        __git_complete_revlist
 589}
 590
 591_git_merge ()
 592{
 593        local cur="${COMP_WORDS[COMP_CWORD]}"
 594        case "${COMP_WORDS[COMP_CWORD-1]}" in
 595        -s|--strategy)
 596                __gitcomp "$(__git_merge_strategies)"
 597                return
 598        esac
 599        case "$cur" in
 600        --strategy=*)
 601                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 602                return
 603                ;;
 604        --*)
 605                __gitcomp "
 606                        --no-commit --no-summary --squash --strategy
 607                        "
 608                return
 609        esac
 610        __gitcomp "$(__git_refs)"
 611}
 612
 613_git_merge_base ()
 614{
 615        __gitcomp "$(__git_refs)"
 616}
 617
 618_git_name_rev ()
 619{
 620        __gitcomp "--tags --all --stdin"
 621}
 622
 623_git_pull ()
 624{
 625        local cur="${COMP_WORDS[COMP_CWORD]}"
 626
 627        case "${COMP_WORDS[0]},$COMP_CWORD" in
 628        git-pull*,1)
 629                __gitcomp "$(__git_remotes)"
 630                ;;
 631        git,2)
 632                __gitcomp "$(__git_remotes)"
 633                ;;
 634        *)
 635                local remote
 636                case "${COMP_WORDS[0]}" in
 637                git-pull)  remote="${COMP_WORDS[1]}" ;;
 638                git)       remote="${COMP_WORDS[2]}" ;;
 639                esac
 640                __gitcomp "$(__git_refs "$remote")"
 641                ;;
 642        esac
 643}
 644
 645_git_push ()
 646{
 647        local cur="${COMP_WORDS[COMP_CWORD]}"
 648
 649        case "${COMP_WORDS[0]},$COMP_CWORD" in
 650        git-push*,1)
 651                __gitcomp "$(__git_remotes)"
 652                ;;
 653        git,2)
 654                __gitcomp "$(__git_remotes)"
 655                ;;
 656        *)
 657                case "$cur" in
 658                *:*)
 659                        local remote
 660                        case "${COMP_WORDS[0]}" in
 661                        git-push)  remote="${COMP_WORDS[1]}" ;;
 662                        git)       remote="${COMP_WORDS[2]}" ;;
 663                        esac
 664                        __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
 665                        ;;
 666                *)
 667                        __gitcomp "$(__git_refs2)"
 668                        ;;
 669                esac
 670                ;;
 671        esac
 672}
 673
 674_git_rebase ()
 675{
 676        local cur="${COMP_WORDS[COMP_CWORD]}"
 677        if [ -d .dotest ] || [ -d .git/.dotest-merge ]; then
 678                __gitcomp "--continue --skip --abort"
 679                return
 680        fi
 681        case "${COMP_WORDS[COMP_CWORD-1]}" in
 682        -s|--strategy)
 683                __gitcomp "$(__git_merge_strategies)"
 684                return
 685        esac
 686        case "$cur" in
 687        --strategy=*)
 688                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
 689                return
 690                ;;
 691        --*)
 692                __gitcomp "--onto --merge --strategy"
 693                return
 694        esac
 695        __gitcomp "$(__git_refs)"
 696}
 697
 698_git_config ()
 699{
 700        local cur="${COMP_WORDS[COMP_CWORD]}"
 701        local prv="${COMP_WORDS[COMP_CWORD-1]}"
 702        case "$prv" in
 703        branch.*.remote)
 704                __gitcomp "$(__git_remotes)"
 705                return
 706                ;;
 707        branch.*.merge)
 708                __gitcomp "$(__git_refs)"
 709                return
 710                ;;
 711        remote.*.fetch)
 712                local remote="${prv#remote.}"
 713                remote="${remote%.fetch}"
 714                __gitcomp "$(__git_refs_remotes "$remote")"
 715                return
 716                ;;
 717        remote.*.push)
 718                local remote="${prv#remote.}"
 719                remote="${remote%.push}"
 720                __gitcomp "$(git --git-dir="$(__gitdir)" \
 721                        for-each-ref --format='%(refname):%(refname)' \
 722                        refs/heads)"
 723                return
 724                ;;
 725        pull.twohead|pull.octopus)
 726                __gitcomp "$(__git_merge_strategies)"
 727                return
 728                ;;
 729        color.branch|color.diff|color.status)
 730                __gitcomp "always never auto"
 731                return
 732                ;;
 733        color.*.*)
 734                __gitcomp "
 735                        black red green yellow blue magenta cyan white
 736                        bold dim ul blink reverse
 737                        "
 738                return
 739                ;;
 740        *.*)
 741                COMPREPLY=()
 742                return
 743                ;;
 744        esac
 745        case "$cur" in
 746        --*)
 747                __gitcomp "
 748                        --global --list --replace-all
 749                        --get --get-all --get-regexp
 750                        --add --unset --unset-all
 751                        "
 752                return
 753                ;;
 754        branch.*.*)
 755                local pfx="${cur%.*}."
 756                cur="${cur##*.}"
 757                __gitcomp "remote merge" "$pfx" "$cur"
 758                return
 759                ;;
 760        branch.*)
 761                local pfx="${cur%.*}."
 762                cur="${cur#*.}"
 763                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
 764                return
 765                ;;
 766        remote.*.*)
 767                local pfx="${cur%.*}."
 768                cur="${cur##*.}"
 769                __gitcomp "url fetch push" "$pfx" "$cur"
 770                return
 771                ;;
 772        remote.*)
 773                local pfx="${cur%.*}."
 774                cur="${cur#*.}"
 775                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
 776                return
 777                ;;
 778        esac
 779        __gitcomp "
 780                apply.whitespace
 781                core.fileMode
 782                core.gitProxy
 783                core.ignoreStat
 784                core.preferSymlinkRefs
 785                core.logAllRefUpdates
 786                core.repositoryFormatVersion
 787                core.sharedRepository
 788                core.warnAmbiguousRefs
 789                core.compression
 790                core.legacyHeaders
 791                core.packedGitWindowSize
 792                core.packedGitLimit
 793                color.branch
 794                color.branch.current
 795                color.branch.local
 796                color.branch.remote
 797                color.branch.plain
 798                color.diff
 799                color.diff.plain
 800                color.diff.meta
 801                color.diff.frag
 802                color.diff.old
 803                color.diff.new
 804                color.diff.commit
 805                color.diff.whitespace
 806                color.pager
 807                color.status
 808                color.status.header
 809                color.status.added
 810                color.status.changed
 811                color.status.untracked
 812                diff.renameLimit
 813                diff.renames
 814                fetch.unpackLimit
 815                format.headers
 816                gitcvs.enabled
 817                gitcvs.logfile
 818                gc.reflogexpire
 819                gc.reflogexpireunreachable
 820                gc.rerereresolved
 821                gc.rerereunresolved
 822                http.sslVerify
 823                http.sslCert
 824                http.sslKey
 825                http.sslCAInfo
 826                http.sslCAPath
 827                http.maxRequests
 828                http.lowSpeedLimit
 829                http.lowSpeedTime
 830                http.noEPSV
 831                i18n.commitEncoding
 832                i18n.logOutputEncoding
 833                log.showroot
 834                merge.summary
 835                merge.verbosity
 836                pack.window
 837                pull.octopus
 838                pull.twohead
 839                repack.useDeltaBaseOffset
 840                show.difftree
 841                showbranch.default
 842                tar.umask
 843                transfer.unpackLimit
 844                receive.unpackLimit
 845                receive.denyNonFastForwards
 846                user.name
 847                user.email
 848                user.signingkey
 849                whatchanged.difftree
 850                branch. remote.
 851        "
 852}
 853
 854_git_remote ()
 855{
 856        local i c=1 command
 857        while [ $c -lt $COMP_CWORD ]; do
 858                i="${COMP_WORDS[c]}"
 859                case "$i" in
 860                add|show|prune) command="$i"; break ;;
 861                esac
 862                c=$((++c))
 863        done
 864
 865        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 866                __gitcomp "add show prune"
 867                return
 868        fi
 869
 870        case "$command" in
 871        show|prune)
 872                __gitcomp "$(__git_remotes)"
 873                ;;
 874        *)
 875                COMPREPLY=()
 876                ;;
 877        esac
 878}
 879
 880_git_reset ()
 881{
 882        local cur="${COMP_WORDS[COMP_CWORD]}"
 883        case "$cur" in
 884        --*)
 885                __gitcomp "--mixed --hard --soft"
 886                return
 887                ;;
 888        esac
 889        __gitcomp "$(__git_refs)"
 890}
 891
 892_git_show ()
 893{
 894        local cur="${COMP_WORDS[COMP_CWORD]}"
 895        case "$cur" in
 896        --pretty=*)
 897                __gitcomp "
 898                        oneline short medium full fuller email raw
 899                        " "" "${cur##--pretty=}"
 900                return
 901                ;;
 902        --*)
 903                __gitcomp "--pretty="
 904                return
 905                ;;
 906        esac
 907        __git_complete_file
 908}
 909
 910_git ()
 911{
 912        local i c=1 command __git_dir
 913
 914        while [ $c -lt $COMP_CWORD ]; do
 915                i="${COMP_WORDS[c]}"
 916                case "$i" in
 917                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
 918                --bare)      __git_dir="." ;;
 919                --version|--help|-p|--paginate) ;;
 920                *) command="$i"; break ;;
 921                esac
 922                c=$((++c))
 923        done
 924
 925        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 926                case "${COMP_WORDS[COMP_CWORD]}" in
 927                --*=*) COMPREPLY=() ;;
 928                --*)   __gitcomp "--git-dir= --bare --version --exec-path" ;;
 929                *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
 930                esac
 931                return
 932        fi
 933
 934        local expansion=$(__git_aliased_command "$command")
 935        [ "$expansion" ] && command="$expansion"
 936
 937        case "$command" in
 938        am)          _git_am ;;
 939        add)         _git_add ;;
 940        apply)       _git_apply ;;
 941        bisect)      _git_bisect ;;
 942        branch)      _git_branch ;;
 943        checkout)    _git_checkout ;;
 944        cherry)      _git_cherry ;;
 945        cherry-pick) _git_cherry_pick ;;
 946        commit)      _git_commit ;;
 947        config)      _git_config ;;
 948        diff)        _git_diff ;;
 949        diff-tree)   _git_diff_tree ;;
 950        fetch)       _git_fetch ;;
 951        format-patch) _git_format_patch ;;
 952        gc)          _git_gc ;;
 953        log)         _git_log ;;
 954        ls-remote)   _git_ls_remote ;;
 955        ls-tree)     _git_ls_tree ;;
 956        merge)       _git_merge;;
 957        merge-base)  _git_merge_base ;;
 958        name-rev)    _git_name_rev ;;
 959        pull)        _git_pull ;;
 960        push)        _git_push ;;
 961        rebase)      _git_rebase ;;
 962        remote)      _git_remote ;;
 963        reset)       _git_reset ;;
 964        show)        _git_show ;;
 965        show-branch) _git_log ;;
 966        whatchanged) _git_log ;;
 967        *)           COMPREPLY=() ;;
 968        esac
 969}
 970
 971_gitk ()
 972{
 973        local cur="${COMP_WORDS[COMP_CWORD]}"
 974        case "$cur" in
 975        --*)
 976                __gitcomp "--not --all"
 977                return
 978                ;;
 979        esac
 980        __git_complete_revlist
 981}
 982
 983complete -o default -o nospace -F _git git
 984complete -o default -o nospace -F _gitk gitk
 985complete -o default -o nospace -F _git_am git-am
 986complete -o default -o nospace -F _git_apply git-apply
 987complete -o default -o nospace -F _git_bisect git-bisect
 988complete -o default -o nospace -F _git_branch git-branch
 989complete -o default -o nospace -F _git_checkout git-checkout
 990complete -o default -o nospace -F _git_cherry git-cherry
 991complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
 992complete -o default -o nospace -F _git_commit git-commit
 993complete -o default -o nospace -F _git_diff git-diff
 994complete -o default -o nospace -F _git_diff_tree git-diff-tree
 995complete -o default -o nospace -F _git_fetch git-fetch
 996complete -o default -o nospace -F _git_format_patch git-format-patch
 997complete -o default -o nospace -F _git_gc git-gc
 998complete -o default -o nospace -F _git_log git-log
 999complete -o default -o nospace -F _git_ls_remote git-ls-remote
1000complete -o default -o nospace -F _git_ls_tree git-ls-tree
1001complete -o default -o nospace -F _git_merge git-merge
1002complete -o default -o nospace -F _git_merge_base git-merge-base
1003complete -o default -o nospace -F _git_name_rev git-name-rev
1004complete -o default -o nospace -F _git_pull git-pull
1005complete -o default -o nospace -F _git_push git-push
1006complete -o default -o nospace -F _git_rebase git-rebase
1007complete -o default -o nospace -F _git_config git-config
1008complete -o default -o nospace -F _git_remote git-remote
1009complete -o default -o nospace -F _git_reset git-reset
1010complete -o default -o nospace -F _git_show git-show
1011complete -o default -o nospace -F _git_log git-show-branch
1012complete -o default -o nospace -F _git_log git-whatchanged
1013
1014# The following are necessary only for Cygwin, and only are needed
1015# when the user has tab-completed the executable name and consequently
1016# included the '.exe' suffix.
1017#
1018if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1019complete -o default -o nospace -F _git_add git-add.exe
1020complete -o default -o nospace -F _git_apply git-apply.exe
1021complete -o default -o nospace -F _git git.exe
1022complete -o default -o nospace -F _git_branch git-branch.exe
1023complete -o default -o nospace -F _git_cherry git-cherry.exe
1024complete -o default -o nospace -F _git_diff git-diff.exe
1025complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
1026complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1027complete -o default -o nospace -F _git_log git-log.exe
1028complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1029complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1030complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1031complete -o default -o nospace -F _git_push git-push.exe
1032complete -o default -o nospace -F _git_config git-config
1033complete -o default -o nospace -F _git_show git-show.exe
1034complete -o default -o nospace -F _git_log git-show-branch.exe
1035complete -o default -o nospace -F _git_log git-whatchanged.exe
1036fi