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