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