contrib / completion / git-completion.bashon commit Merge branch 'maint' (125a5f1)
   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                clean.requireForce
 794                color.branch
 795                color.branch.current
 796                color.branch.local
 797                color.branch.remote
 798                color.branch.plain
 799                color.diff
 800                color.diff.plain
 801                color.diff.meta
 802                color.diff.frag
 803                color.diff.old
 804                color.diff.new
 805                color.diff.commit
 806                color.diff.whitespace
 807                color.pager
 808                color.status
 809                color.status.header
 810                color.status.added
 811                color.status.changed
 812                color.status.untracked
 813                diff.renameLimit
 814                diff.renames
 815                fetch.unpackLimit
 816                format.headers
 817                gitcvs.enabled
 818                gitcvs.logfile
 819                gc.reflogexpire
 820                gc.reflogexpireunreachable
 821                gc.rerereresolved
 822                gc.rerereunresolved
 823                http.sslVerify
 824                http.sslCert
 825                http.sslKey
 826                http.sslCAInfo
 827                http.sslCAPath
 828                http.maxRequests
 829                http.lowSpeedLimit
 830                http.lowSpeedTime
 831                http.noEPSV
 832                i18n.commitEncoding
 833                i18n.logOutputEncoding
 834                log.showroot
 835                merge.summary
 836                merge.verbosity
 837                pack.window
 838                pull.octopus
 839                pull.twohead
 840                repack.useDeltaBaseOffset
 841                show.difftree
 842                showbranch.default
 843                tar.umask
 844                transfer.unpackLimit
 845                receive.unpackLimit
 846                receive.denyNonFastForwards
 847                user.name
 848                user.email
 849                user.signingkey
 850                whatchanged.difftree
 851                branch. remote.
 852        "
 853}
 854
 855_git_remote ()
 856{
 857        local i c=1 command
 858        while [ $c -lt $COMP_CWORD ]; do
 859                i="${COMP_WORDS[c]}"
 860                case "$i" in
 861                add|show|prune) command="$i"; break ;;
 862                esac
 863                c=$((++c))
 864        done
 865
 866        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 867                __gitcomp "add show prune"
 868                return
 869        fi
 870
 871        case "$command" in
 872        show|prune)
 873                __gitcomp "$(__git_remotes)"
 874                ;;
 875        *)
 876                COMPREPLY=()
 877                ;;
 878        esac
 879}
 880
 881_git_reset ()
 882{
 883        local cur="${COMP_WORDS[COMP_CWORD]}"
 884        case "$cur" in
 885        --*)
 886                __gitcomp "--mixed --hard --soft"
 887                return
 888                ;;
 889        esac
 890        __gitcomp "$(__git_refs)"
 891}
 892
 893_git_show ()
 894{
 895        local cur="${COMP_WORDS[COMP_CWORD]}"
 896        case "$cur" in
 897        --pretty=*)
 898                __gitcomp "
 899                        oneline short medium full fuller email raw
 900                        " "" "${cur##--pretty=}"
 901                return
 902                ;;
 903        --*)
 904                __gitcomp "--pretty="
 905                return
 906                ;;
 907        esac
 908        __git_complete_file
 909}
 910
 911_git ()
 912{
 913        local i c=1 command __git_dir
 914
 915        while [ $c -lt $COMP_CWORD ]; do
 916                i="${COMP_WORDS[c]}"
 917                case "$i" in
 918                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
 919                --bare)      __git_dir="." ;;
 920                --version|--help|-p|--paginate) ;;
 921                *) command="$i"; break ;;
 922                esac
 923                c=$((++c))
 924        done
 925
 926        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
 927                case "${COMP_WORDS[COMP_CWORD]}" in
 928                --*=*) COMPREPLY=() ;;
 929                --*)   __gitcomp "--git-dir= --bare --version --exec-path" ;;
 930                *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
 931                esac
 932                return
 933        fi
 934
 935        local expansion=$(__git_aliased_command "$command")
 936        [ "$expansion" ] && command="$expansion"
 937
 938        case "$command" in
 939        am)          _git_am ;;
 940        add)         _git_add ;;
 941        apply)       _git_apply ;;
 942        bisect)      _git_bisect ;;
 943        branch)      _git_branch ;;
 944        checkout)    _git_checkout ;;
 945        cherry)      _git_cherry ;;
 946        cherry-pick) _git_cherry_pick ;;
 947        commit)      _git_commit ;;
 948        config)      _git_config ;;
 949        diff)        _git_diff ;;
 950        diff-tree)   _git_diff_tree ;;
 951        fetch)       _git_fetch ;;
 952        format-patch) _git_format_patch ;;
 953        gc)          _git_gc ;;
 954        log)         _git_log ;;
 955        ls-remote)   _git_ls_remote ;;
 956        ls-tree)     _git_ls_tree ;;
 957        merge)       _git_merge;;
 958        merge-base)  _git_merge_base ;;
 959        name-rev)    _git_name_rev ;;
 960        pull)        _git_pull ;;
 961        push)        _git_push ;;
 962        rebase)      _git_rebase ;;
 963        remote)      _git_remote ;;
 964        reset)       _git_reset ;;
 965        show)        _git_show ;;
 966        show-branch) _git_log ;;
 967        whatchanged) _git_log ;;
 968        *)           COMPREPLY=() ;;
 969        esac
 970}
 971
 972_gitk ()
 973{
 974        local cur="${COMP_WORDS[COMP_CWORD]}"
 975        case "$cur" in
 976        --*)
 977                __gitcomp "--not --all"
 978                return
 979                ;;
 980        esac
 981        __git_complete_revlist
 982}
 983
 984complete -o default -o nospace -F _git git
 985complete -o default -o nospace -F _gitk gitk
 986complete -o default -o nospace -F _git_am git-am
 987complete -o default -o nospace -F _git_apply git-apply
 988complete -o default -o nospace -F _git_bisect git-bisect
 989complete -o default -o nospace -F _git_branch git-branch
 990complete -o default -o nospace -F _git_checkout git-checkout
 991complete -o default -o nospace -F _git_cherry git-cherry
 992complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
 993complete -o default -o nospace -F _git_commit git-commit
 994complete -o default -o nospace -F _git_diff git-diff
 995complete -o default -o nospace -F _git_diff_tree git-diff-tree
 996complete -o default -o nospace -F _git_fetch git-fetch
 997complete -o default -o nospace -F _git_format_patch git-format-patch
 998complete -o default -o nospace -F _git_gc git-gc
 999complete -o default -o nospace -F _git_log git-log
1000complete -o default -o nospace -F _git_ls_remote git-ls-remote
1001complete -o default -o nospace -F _git_ls_tree git-ls-tree
1002complete -o default -o nospace -F _git_merge git-merge
1003complete -o default -o nospace -F _git_merge_base git-merge-base
1004complete -o default -o nospace -F _git_name_rev git-name-rev
1005complete -o default -o nospace -F _git_pull git-pull
1006complete -o default -o nospace -F _git_push git-push
1007complete -o default -o nospace -F _git_rebase git-rebase
1008complete -o default -o nospace -F _git_config git-config
1009complete -o default -o nospace -F _git_remote git-remote
1010complete -o default -o nospace -F _git_reset git-reset
1011complete -o default -o nospace -F _git_show git-show
1012complete -o default -o nospace -F _git_log git-show-branch
1013complete -o default -o nospace -F _git_log git-whatchanged
1014
1015# The following are necessary only for Cygwin, and only are needed
1016# when the user has tab-completed the executable name and consequently
1017# included the '.exe' suffix.
1018#
1019if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1020complete -o default -o nospace -F _git_add git-add.exe
1021complete -o default -o nospace -F _git_apply git-apply.exe
1022complete -o default -o nospace -F _git git.exe
1023complete -o default -o nospace -F _git_branch git-branch.exe
1024complete -o default -o nospace -F _git_cherry git-cherry.exe
1025complete -o default -o nospace -F _git_diff git-diff.exe
1026complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
1027complete -o default -o nospace -F _git_format_patch git-format-patch.exe
1028complete -o default -o nospace -F _git_log git-log.exe
1029complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
1030complete -o default -o nospace -F _git_merge_base git-merge-base.exe
1031complete -o default -o nospace -F _git_name_rev git-name-rev.exe
1032complete -o default -o nospace -F _git_push git-push.exe
1033complete -o default -o nospace -F _git_config git-config
1034complete -o default -o nospace -F _git_show git-show.exe
1035complete -o default -o nospace -F _git_log git-show-branch.exe
1036complete -o default -o nospace -F _git_log git-whatchanged.exe
1037fi