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