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