contrib / completion / git-completion.bashon commit bash completion: add --format= and --oneline options for "git log" (72de29c)
   1#!bash
   2#
   3# bash completion support for core Git.
   4#
   5# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
   6# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
   7# Distributed under the GNU General Public License, version 2.0.
   8#
   9# The contained completion routines provide support for completing:
  10#
  11#    *) local and remote branch names
  12#    *) local and remote tag names
  13#    *) .git/remotes file names
  14#    *) git 'subcommands'
  15#    *) tree paths within 'ref:path/to/file' expressions
  16#    *) common --long-options
  17#
  18# To use these routines:
  19#
  20#    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
  21#    2) Added the following line to your .bashrc:
  22#        source ~/.git-completion.sh
  23#
  24#    3) You may want to make sure the git executable is available
  25#       in your PATH before this script is sourced, as some caching
  26#       is performed while the script loads.  If git isn't found
  27#       at source time then all lookups will be done on demand,
  28#       which may be slightly slower.
  29#
  30#    4) Consider changing your PS1 to also show the current branch:
  31#        PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
  32#
  33#       The argument to __git_ps1 will be displayed only if you
  34#       are currently in a git repository.  The %s token will be
  35#       the name of the current branch.
  36#
  37#       In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
  38#       value, unstaged (*) and staged (+) changes will be shown next
  39#       to the branch name.  You can configure this per-repository
  40#       with the bash.showDirtyState variable, which defaults to true
  41#       once GIT_PS1_SHOWDIRTYSTATE is enabled.
  42#
  43# To submit patches:
  44#
  45#    *) Read Documentation/SubmittingPatches
  46#    *) Send all patches to the current maintainer:
  47#
  48#       "Shawn O. Pearce" <spearce@spearce.org>
  49#
  50#    *) Always CC the Git mailing list:
  51#
  52#       git@vger.kernel.org
  53#
  54
  55case "$COMP_WORDBREAKS" in
  56*:*) : great ;;
  57*)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
  58esac
  59
  60# __gitdir accepts 0 or 1 arguments (i.e., location)
  61# returns location of .git repo
  62__gitdir ()
  63{
  64        if [ -z "${1-}" ]; then
  65                if [ -n "$__git_dir" ]; then
  66                        echo "$__git_dir"
  67                elif [ -d .git ]; then
  68                        echo .git
  69                else
  70                        git rev-parse --git-dir 2>/dev/null
  71                fi
  72        elif [ -d "$1/.git" ]; then
  73                echo "$1/.git"
  74        else
  75                echo "$1"
  76        fi
  77}
  78
  79# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
  80# returns text to add to bash PS1 prompt (includes branch name)
  81__git_ps1 ()
  82{
  83        local g="$(git rev-parse --git-dir 2>/dev/null)"
  84        if [ -n "$g" ]; then
  85                local r
  86                local b
  87                if [ -d "$g/rebase-apply" ]
  88                then
  89                        if test -f "$g/rebase-apply/rebasing"
  90                        then
  91                                r="|REBASE"
  92                        elif test -f "$g/rebase-apply/applying"
  93                        then
  94                                r="|AM"
  95                        else
  96                                r="|AM/REBASE"
  97                        fi
  98                        b="$(git symbolic-ref HEAD 2>/dev/null)"
  99                elif [ -f "$g/rebase-merge/interactive" ]
 100                then
 101                        r="|REBASE-i"
 102                        b="$(cat "$g/rebase-merge/head-name")"
 103                elif [ -d "$g/rebase-merge" ]
 104                then
 105                        r="|REBASE-m"
 106                        b="$(cat "$g/rebase-merge/head-name")"
 107                elif [ -f "$g/MERGE_HEAD" ]
 108                then
 109                        r="|MERGING"
 110                        b="$(git symbolic-ref HEAD 2>/dev/null)"
 111                else
 112                        if [ -f "$g/BISECT_LOG" ]
 113                        then
 114                                r="|BISECTING"
 115                        fi
 116                        if ! b="$(git symbolic-ref HEAD 2>/dev/null)"
 117                        then
 118                                if ! b="$(git describe --exact-match HEAD 2>/dev/null)"
 119                                then
 120                                        b="$(cut -c1-7 "$g/HEAD")..."
 121                                fi
 122                        fi
 123                fi
 124
 125                local w
 126                local i
 127
 128                if test -n "${GIT_PS1_SHOWDIRTYSTATE-}"; then
 129                        if test "$(git config --bool bash.showDirtyState)" != "false"; then
 130                                git diff --no-ext-diff --ignore-submodules \
 131                                        --quiet --exit-code || w="*"
 132                                if git rev-parse --quiet --verify HEAD >/dev/null; then
 133                                        git diff-index --cached --quiet \
 134                                                --ignore-submodules HEAD -- || i="+"
 135                                else
 136                                        i="#"
 137                                fi
 138                        fi
 139                fi
 140
 141                if [ -n "${1-}" ]; then
 142                        printf "$1" "${b##refs/heads/}$w$i$r"
 143                else
 144                        printf " (%s)" "${b##refs/heads/}$w$i$r"
 145                fi
 146        fi
 147}
 148
 149# __gitcomp_1 requires 2 arguments
 150__gitcomp_1 ()
 151{
 152        local c IFS=' '$'\t'$'\n'
 153        for c in $1; do
 154                case "$c$2" in
 155                --*=*) printf %s$'\n' "$c$2" ;;
 156                *.)    printf %s$'\n' "$c$2" ;;
 157                *)     printf %s$'\n' "$c$2 " ;;
 158                esac
 159        done
 160}
 161
 162# __gitcomp accepts 1, 2, 3, or 4 arguments
 163# generates completion reply with compgen
 164__gitcomp ()
 165{
 166        local cur="${COMP_WORDS[COMP_CWORD]}"
 167        if [ $# -gt 2 ]; then
 168                cur="$3"
 169        fi
 170        case "$cur" in
 171        --*=)
 172                COMPREPLY=()
 173                ;;
 174        *)
 175                local IFS=$'\n'
 176                COMPREPLY=($(compgen -P "${2-}" \
 177                        -W "$(__gitcomp_1 "${1-}" "${4-}")" \
 178                        -- "$cur"))
 179                ;;
 180        esac
 181}
 182
 183# __git_heads accepts 0 or 1 arguments (to pass to __gitdir)
 184__git_heads ()
 185{
 186        local cmd i is_hash=y dir="$(__gitdir "${1-}")"
 187        if [ -d "$dir" ]; then
 188                git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
 189                        refs/heads
 190                return
 191        fi
 192        for i in $(git ls-remote "${1-}" 2>/dev/null); do
 193                case "$is_hash,$i" in
 194                y,*) is_hash=n ;;
 195                n,*^{}) is_hash=y ;;
 196                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
 197                n,*) is_hash=y; echo "$i" ;;
 198                esac
 199        done
 200}
 201
 202# __git_tags accepts 0 or 1 arguments (to pass to __gitdir)
 203__git_tags ()
 204{
 205        local cmd i is_hash=y dir="$(__gitdir "${1-}")"
 206        if [ -d "$dir" ]; then
 207                git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
 208                        refs/tags
 209                return
 210        fi
 211        for i in $(git ls-remote "${1-}" 2>/dev/null); do
 212                case "$is_hash,$i" in
 213                y,*) is_hash=n ;;
 214                n,*^{}) is_hash=y ;;
 215                n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
 216                n,*) is_hash=y; echo "$i" ;;
 217                esac
 218        done
 219}
 220
 221# __git_refs accepts 0 or 1 arguments (to pass to __gitdir)
 222__git_refs ()
 223{
 224        local i is_hash=y dir="$(__gitdir "${1-}")"
 225        local cur="${COMP_WORDS[COMP_CWORD]}" format refs
 226        if [ -d "$dir" ]; then
 227                case "$cur" in
 228                refs|refs/*)
 229                        format="refname"
 230                        refs="${cur%/*}"
 231                        ;;
 232                *)
 233                        if [ -e "$dir/HEAD" ]; then echo HEAD; fi
 234                        format="refname:short"
 235                        refs="refs/tags refs/heads refs/remotes"
 236                        ;;
 237                esac
 238                git --git-dir="$dir" for-each-ref --format="%($format)" \
 239                        $refs
 240                return
 241        fi
 242        for i in $(git ls-remote "$dir" 2>/dev/null); do
 243                case "$is_hash,$i" in
 244                y,*) is_hash=n ;;
 245                n,*^{}) is_hash=y ;;
 246                n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
 247                n,refs/heads/*) is_hash=y; echo "${i#refs/heads/}" ;;
 248                n,refs/remotes/*) is_hash=y; echo "${i#refs/remotes/}" ;;
 249                n,*) is_hash=y; echo "$i" ;;
 250                esac
 251        done
 252}
 253
 254# __git_refs2 requires 1 argument (to pass to __git_refs)
 255__git_refs2 ()
 256{
 257        local i
 258        for i in $(__git_refs "$1"); do
 259                echo "$i:$i"
 260        done
 261}
 262
 263# __git_refs_remotes requires 1 argument (to pass to ls-remote)
 264__git_refs_remotes ()
 265{
 266        local cmd i is_hash=y
 267        for i in $(git ls-remote "$1" 2>/dev/null); do
 268                case "$is_hash,$i" in
 269                n,refs/heads/*)
 270                        is_hash=y
 271                        echo "$i:refs/remotes/$1/${i#refs/heads/}"
 272                        ;;
 273                y,*) is_hash=n ;;
 274                n,*^{}) is_hash=y ;;
 275                n,refs/tags/*) is_hash=y;;
 276                n,*) is_hash=y; ;;
 277                esac
 278        done
 279}
 280
 281__git_remotes ()
 282{
 283        local i ngoff IFS=$'\n' d="$(__gitdir)"
 284        shopt -q nullglob || ngoff=1
 285        shopt -s nullglob
 286        for i in "$d/remotes"/*; do
 287                echo ${i#$d/remotes/}
 288        done
 289        [ "$ngoff" ] && shopt -u nullglob
 290        for i in $(git --git-dir="$d" config --list); do
 291                case "$i" in
 292                remote.*.url=*)
 293                        i="${i#remote.}"
 294                        echo "${i/.url=*/}"
 295                        ;;
 296                esac
 297        done
 298}
 299
 300__git_merge_strategies ()
 301{
 302        if [ -n "$__git_merge_strategylist" ]; then
 303                echo "$__git_merge_strategylist"
 304                return
 305        fi
 306        git merge -s help 2>&1 |
 307        sed -n -e '/[Aa]vailable strategies are: /,/^$/{
 308                s/\.$//
 309                s/.*://
 310                s/^[    ]*//
 311                s/[     ]*$//
 312                p
 313        }'
 314}
 315__git_merge_strategylist=
 316__git_merge_strategylist=$(__git_merge_strategies 2>/dev/null)
 317
 318__git_complete_file ()
 319{
 320        local pfx ls ref cur="${COMP_WORDS[COMP_CWORD]}"
 321        case "$cur" in
 322        ?*:*)
 323                ref="${cur%%:*}"
 324                cur="${cur#*:}"
 325                case "$cur" in
 326                ?*/*)
 327                        pfx="${cur%/*}"
 328                        cur="${cur##*/}"
 329                        ls="$ref:$pfx"
 330                        pfx="$pfx/"
 331                        ;;
 332                *)
 333                        ls="$ref"
 334                        ;;
 335            esac
 336
 337                case "$COMP_WORDBREAKS" in
 338                *:*) : great ;;
 339                *)   pfx="$ref:$pfx" ;;
 340                esac
 341
 342                local IFS=$'\n'
 343                COMPREPLY=($(compgen -P "$pfx" \
 344                        -W "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
 345                                | sed '/^100... blob /{
 346                                           s,^.*        ,,
 347                                           s,$, ,
 348                                       }
 349                                       /^120000 blob /{
 350                                           s,^.*        ,,
 351                                           s,$, ,
 352                                       }
 353                                       /^040000 tree /{
 354                                           s,^.*        ,,
 355                                           s,$,/,
 356                                       }
 357                                       s/^.*    //')" \
 358                        -- "$cur"))
 359                ;;
 360        *)
 361                __gitcomp "$(__git_refs)"
 362                ;;
 363        esac
 364}
 365
 366__git_complete_revlist ()
 367{
 368        local pfx cur="${COMP_WORDS[COMP_CWORD]}"
 369        case "$cur" in
 370        *...*)
 371                pfx="${cur%...*}..."
 372                cur="${cur#*...}"
 373                __gitcomp "$(__git_refs)" "$pfx" "$cur"
 374                ;;
 375        *..*)
 376                pfx="${cur%..*}.."
 377                cur="${cur#*..}"
 378                __gitcomp "$(__git_refs)" "$pfx" "$cur"
 379                ;;
 380        *)
 381                __gitcomp "$(__git_refs)"
 382                ;;
 383        esac
 384}
 385
 386__git_all_commands ()
 387{
 388        if [ -n "$__git_all_commandlist" ]; then
 389                echo "$__git_all_commandlist"
 390                return
 391        fi
 392        local i IFS=" "$'\n'
 393        for i in $(git help -a|egrep '^ ')
 394        do
 395                case $i in
 396                *--*)             : helper pattern;;
 397                *) echo $i;;
 398                esac
 399        done
 400}
 401__git_all_commandlist=
 402__git_all_commandlist="$(__git_all_commands 2>/dev/null)"
 403
 404__git_porcelain_commands ()
 405{
 406        if [ -n "$__git_porcelain_commandlist" ]; then
 407                echo "$__git_porcelain_commandlist"
 408                return
 409        fi
 410        local i IFS=" "$'\n'
 411        for i in "help" $(__git_all_commands)
 412        do
 413                case $i in
 414                *--*)             : helper pattern;;
 415                applymbox)        : ask gittus;;
 416                applypatch)       : ask gittus;;
 417                archimport)       : import;;
 418                cat-file)         : plumbing;;
 419                check-attr)       : plumbing;;
 420                check-ref-format) : plumbing;;
 421                checkout-index)   : plumbing;;
 422                commit-tree)      : plumbing;;
 423                count-objects)    : infrequent;;
 424                cvsexportcommit)  : export;;
 425                cvsimport)        : import;;
 426                cvsserver)        : daemon;;
 427                daemon)           : daemon;;
 428                diff-files)       : plumbing;;
 429                diff-index)       : plumbing;;
 430                diff-tree)        : plumbing;;
 431                fast-import)      : import;;
 432                fast-export)      : export;;
 433                fsck-objects)     : plumbing;;
 434                fetch-pack)       : plumbing;;
 435                fmt-merge-msg)    : plumbing;;
 436                for-each-ref)     : plumbing;;
 437                hash-object)      : plumbing;;
 438                http-*)           : transport;;
 439                index-pack)       : plumbing;;
 440                init-db)          : deprecated;;
 441                local-fetch)      : plumbing;;
 442                lost-found)       : infrequent;;
 443                ls-files)         : plumbing;;
 444                ls-remote)        : plumbing;;
 445                ls-tree)          : plumbing;;
 446                mailinfo)         : plumbing;;
 447                mailsplit)        : plumbing;;
 448                merge-*)          : plumbing;;
 449                mktree)           : plumbing;;
 450                mktag)            : plumbing;;
 451                pack-objects)     : plumbing;;
 452                pack-redundant)   : plumbing;;
 453                pack-refs)        : plumbing;;
 454                parse-remote)     : plumbing;;
 455                patch-id)         : plumbing;;
 456                peek-remote)      : plumbing;;
 457                prune)            : plumbing;;
 458                prune-packed)     : plumbing;;
 459                quiltimport)      : import;;
 460                read-tree)        : plumbing;;
 461                receive-pack)     : plumbing;;
 462                reflog)           : plumbing;;
 463                repo-config)      : deprecated;;
 464                rerere)           : plumbing;;
 465                rev-list)         : plumbing;;
 466                rev-parse)        : plumbing;;
 467                runstatus)        : plumbing;;
 468                sh-setup)         : internal;;
 469                shell)            : daemon;;
 470                show-ref)         : plumbing;;
 471                send-pack)        : plumbing;;
 472                show-index)       : plumbing;;
 473                ssh-*)            : transport;;
 474                stripspace)       : plumbing;;
 475                symbolic-ref)     : plumbing;;
 476                tar-tree)         : deprecated;;
 477                unpack-file)      : plumbing;;
 478                unpack-objects)   : plumbing;;
 479                update-index)     : plumbing;;
 480                update-ref)       : plumbing;;
 481                update-server-info) : daemon;;
 482                upload-archive)   : plumbing;;
 483                upload-pack)      : plumbing;;
 484                write-tree)       : plumbing;;
 485                var)              : infrequent;;
 486                verify-pack)      : infrequent;;
 487                verify-tag)       : plumbing;;
 488                *) echo $i;;
 489                esac
 490        done
 491}
 492__git_porcelain_commandlist=
 493__git_porcelain_commandlist="$(__git_porcelain_commands 2>/dev/null)"
 494
 495__git_aliases ()
 496{
 497        local i IFS=$'\n'
 498        for i in $(git --git-dir="$(__gitdir)" config --list); do
 499                case "$i" in
 500                alias.*)
 501                        i="${i#alias.}"
 502                        echo "${i/=*/}"
 503                        ;;
 504                esac
 505        done
 506}
 507
 508# __git_aliased_command requires 1 argument
 509__git_aliased_command ()
 510{
 511        local word cmdline=$(git --git-dir="$(__gitdir)" \
 512                config --get "alias.$1")
 513        for word in $cmdline; do
 514                if [ "${word##-*}" ]; then
 515                        echo $word
 516                        return
 517                fi
 518        done
 519}
 520
 521# __git_find_subcommand requires 1 argument
 522__git_find_subcommand ()
 523{
 524        local word subcommand c=1
 525
 526        while [ $c -lt $COMP_CWORD ]; do
 527                word="${COMP_WORDS[c]}"
 528                for subcommand in $1; do
 529                        if [ "$subcommand" = "$word" ]; then
 530                                echo "$subcommand"
 531                                return
 532                        fi
 533                done
 534                c=$((++c))
 535        done
 536}
 537
 538__git_has_doubledash ()
 539{
 540        local c=1
 541        while [ $c -lt $COMP_CWORD ]; do
 542                if [ "--" = "${COMP_WORDS[c]}" ]; then
 543                        return 0
 544                fi
 545                c=$((++c))
 546        done
 547        return 1
 548}
 549
 550__git_whitespacelist="nowarn warn error error-all fix"
 551
 552_git_am ()
 553{
 554        local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
 555        if [ -d "$dir"/rebase-apply ]; then
 556                __gitcomp "--skip --resolved --abort"
 557                return
 558        fi
 559        case "$cur" in
 560        --whitespace=*)
 561                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 562                return
 563                ;;
 564        --*)
 565                __gitcomp "
 566                        --signoff --utf8 --binary --3way --interactive
 567                        --whitespace=
 568                        "
 569                return
 570        esac
 571        COMPREPLY=()
 572}
 573
 574_git_apply ()
 575{
 576        local cur="${COMP_WORDS[COMP_CWORD]}"
 577        case "$cur" in
 578        --whitespace=*)
 579                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 580                return
 581                ;;
 582        --*)
 583                __gitcomp "
 584                        --stat --numstat --summary --check --index
 585                        --cached --index-info --reverse --reject --unidiff-zero
 586                        --apply --no-add --exclude=
 587                        --whitespace= --inaccurate-eof --verbose
 588                        "
 589                return
 590        esac
 591        COMPREPLY=()
 592}
 593
 594_git_add ()
 595{
 596        __git_has_doubledash && return
 597
 598        local cur="${COMP_WORDS[COMP_CWORD]}"
 599        case "$cur" in
 600        --*)
 601                __gitcomp "
 602                        --interactive --refresh --patch --update --dry-run
 603                        --ignore-errors --intent-to-add
 604                        "
 605                return
 606        esac
 607        COMPREPLY=()
 608}
 609
 610_git_archive ()
 611{
 612        local cur="${COMP_WORDS[COMP_CWORD]}"
 613        case "$cur" in
 614        --format=*)
 615                __gitcomp "$(git archive --list)" "" "${cur##--format=}"
 616                return
 617                ;;
 618        --remote=*)
 619                __gitcomp "$(__git_remotes)" "" "${cur##--remote=}"
 620                return
 621                ;;
 622        --*)
 623                __gitcomp "
 624                        --format= --list --verbose
 625                        --prefix= --remote= --exec=
 626                        "
 627                return
 628                ;;
 629        esac
 630        __git_complete_file
 631}
 632
 633_git_bisect ()
 634{
 635        __git_has_doubledash && return
 636
 637        local subcommands="start bad good skip reset visualize replay log run"
 638        local subcommand="$(__git_find_subcommand "$subcommands")"
 639        if [ -z "$subcommand" ]; then
 640                __gitcomp "$subcommands"
 641                return
 642        fi
 643
 644        case "$subcommand" in
 645        bad|good|reset|skip)
 646                __gitcomp "$(__git_refs)"
 647                ;;
 648        *)
 649                COMPREPLY=()
 650                ;;
 651        esac
 652}
 653
 654_git_branch ()
 655{
 656        local i c=1 only_local_ref="n" has_r="n"
 657
 658        while [ $c -lt $COMP_CWORD ]; do
 659                i="${COMP_WORDS[c]}"
 660                case "$i" in
 661                -d|-m)  only_local_ref="y" ;;
 662                -r)     has_r="y" ;;
 663                esac
 664                c=$((++c))
 665        done
 666
 667        case "${COMP_WORDS[COMP_CWORD]}" in
 668        --*)
 669                __gitcomp "
 670                        --color --no-color --verbose --abbrev= --no-abbrev
 671                        --track --no-track --contains --merged --no-merged
 672                        "
 673                ;;
 674        *)
 675                if [ $only_local_ref = "y" -a $has_r = "n" ]; then
 676                        __gitcomp "$(__git_heads)"
 677                else
 678                        __gitcomp "$(__git_refs)"
 679                fi
 680                ;;
 681        esac
 682}
 683
 684_git_bundle ()
 685{
 686        local cmd="${COMP_WORDS[2]}"
 687        case "$COMP_CWORD" in
 688        2)
 689                __gitcomp "create list-heads verify unbundle"
 690                ;;
 691        3)
 692                # looking for a file
 693                ;;
 694        *)
 695                case "$cmd" in
 696                        create)
 697                                __git_complete_revlist
 698                        ;;
 699                esac
 700                ;;
 701        esac
 702}
 703
 704_git_checkout ()
 705{
 706        __git_has_doubledash && return
 707
 708        __gitcomp "$(__git_refs)"
 709}
 710
 711_git_cherry ()
 712{
 713        __gitcomp "$(__git_refs)"
 714}
 715
 716_git_cherry_pick ()
 717{
 718        local cur="${COMP_WORDS[COMP_CWORD]}"
 719        case "$cur" in
 720        --*)
 721                __gitcomp "--edit --no-commit"
 722                ;;
 723        *)
 724                __gitcomp "$(__git_refs)"
 725                ;;
 726        esac
 727}
 728
 729_git_clean ()
 730{
 731        __git_has_doubledash && return
 732
 733        local cur="${COMP_WORDS[COMP_CWORD]}"
 734        case "$cur" in
 735        --*)
 736                __gitcomp "--dry-run --quiet"
 737                return
 738                ;;
 739        esac
 740        COMPREPLY=()
 741}
 742
 743_git_clone ()
 744{
 745        local cur="${COMP_WORDS[COMP_CWORD]}"
 746        case "$cur" in
 747        --*)
 748                __gitcomp "
 749                        --local
 750                        --no-hardlinks
 751                        --shared
 752                        --reference
 753                        --quiet
 754                        --no-checkout
 755                        --bare
 756                        --mirror
 757                        --origin
 758                        --upload-pack
 759                        --template=
 760                        --depth
 761                        "
 762                return
 763                ;;
 764        esac
 765        COMPREPLY=()
 766}
 767
 768_git_commit ()
 769{
 770        __git_has_doubledash && return
 771
 772        local cur="${COMP_WORDS[COMP_CWORD]}"
 773        case "$cur" in
 774        --*)
 775                __gitcomp "
 776                        --all --author= --signoff --verify --no-verify
 777                        --edit --amend --include --only --interactive
 778                        "
 779                return
 780        esac
 781        COMPREPLY=()
 782}
 783
 784_git_describe ()
 785{
 786        local cur="${COMP_WORDS[COMP_CWORD]}"
 787        case "$cur" in
 788        --*)
 789                __gitcomp "
 790                        --all --tags --contains --abbrev= --candidates=
 791                        --exact-match --debug --long --match --always
 792                        "
 793                return
 794        esac
 795        __gitcomp "$(__git_refs)"
 796}
 797
 798__git_diff_common_options="--stat --numstat --shortstat --summary
 799                        --patch-with-stat --name-only --name-status --color
 800                        --no-color --color-words --no-renames --check
 801                        --full-index --binary --abbrev --diff-filter=
 802                        --find-copies-harder
 803                        --text --ignore-space-at-eol --ignore-space-change
 804                        --ignore-all-space --exit-code --quiet --ext-diff
 805                        --no-ext-diff
 806                        --no-prefix --src-prefix= --dst-prefix=
 807                        --inter-hunk-context=
 808                        --patience
 809                        --raw
 810"
 811
 812_git_diff ()
 813{
 814        __git_has_doubledash && return
 815
 816        local cur="${COMP_WORDS[COMP_CWORD]}"
 817        case "$cur" in
 818        --*)
 819                __gitcomp "--cached --pickaxe-all --pickaxe-regex
 820                        --base --ours --theirs
 821                        $__git_diff_common_options
 822                        "
 823                return
 824                ;;
 825        esac
 826        __git_complete_file
 827}
 828
 829_git_fetch ()
 830{
 831        local cur="${COMP_WORDS[COMP_CWORD]}"
 832
 833        if [ "$COMP_CWORD" = 2 ]; then
 834                __gitcomp "$(__git_remotes)"
 835        else
 836                case "$cur" in
 837                *:*)
 838                        local pfx=""
 839                        case "$COMP_WORDBREAKS" in
 840                        *:*) : great ;;
 841                        *)   pfx="${cur%%:*}:" ;;
 842                        esac
 843                        __gitcomp "$(__git_refs)" "$pfx" "${cur#*:}"
 844                        ;;
 845                *)
 846                        __gitcomp "$(__git_refs2 "${COMP_WORDS[2]}")"
 847                        ;;
 848                esac
 849        fi
 850}
 851
 852_git_format_patch ()
 853{
 854        local cur="${COMP_WORDS[COMP_CWORD]}"
 855        case "$cur" in
 856        --*)
 857                __gitcomp "
 858                        --stdout --attach --thread
 859                        --output-directory
 860                        --numbered --start-number
 861                        --numbered-files
 862                        --keep-subject
 863                        --signoff
 864                        --in-reply-to=
 865                        --full-index --binary
 866                        --not --all
 867                        --cover-letter
 868                        --no-prefix --src-prefix= --dst-prefix=
 869                        --inline --suffix= --ignore-if-in-upstream
 870                        --subject-prefix=
 871                        "
 872                return
 873                ;;
 874        esac
 875        __git_complete_revlist
 876}
 877
 878_git_gc ()
 879{
 880        local cur="${COMP_WORDS[COMP_CWORD]}"
 881        case "$cur" in
 882        --*)
 883                __gitcomp "--prune --aggressive"
 884                return
 885                ;;
 886        esac
 887        COMPREPLY=()
 888}
 889
 890_git_grep ()
 891{
 892        __git_has_doubledash && return
 893
 894        local cur="${COMP_WORDS[COMP_CWORD]}"
 895        case "$cur" in
 896        --*)
 897                __gitcomp "
 898                        --cached
 899                        --text --ignore-case --word-regexp --invert-match
 900                        --full-name
 901                        --extended-regexp --basic-regexp --fixed-strings
 902                        --files-with-matches --name-only
 903                        --files-without-match
 904                        --count
 905                        --and --or --not --all-match
 906                        "
 907                return
 908                ;;
 909        esac
 910        COMPREPLY=()
 911}
 912
 913_git_help ()
 914{
 915        local cur="${COMP_WORDS[COMP_CWORD]}"
 916        case "$cur" in
 917        --*)
 918                __gitcomp "--all --info --man --web"
 919                return
 920                ;;
 921        esac
 922        __gitcomp "$(__git_all_commands)
 923                attributes cli core-tutorial cvs-migration
 924                diffcore gitk glossary hooks ignore modules
 925                repository-layout tutorial tutorial-2
 926                workflows
 927                "
 928}
 929
 930_git_init ()
 931{
 932        local cur="${COMP_WORDS[COMP_CWORD]}"
 933        case "$cur" in
 934        --shared=*)
 935                __gitcomp "
 936                        false true umask group all world everybody
 937                        " "" "${cur##--shared=}"
 938                return
 939                ;;
 940        --*)
 941                __gitcomp "--quiet --bare --template= --shared --shared="
 942                return
 943                ;;
 944        esac
 945        COMPREPLY=()
 946}
 947
 948_git_ls_files ()
 949{
 950        __git_has_doubledash && return
 951
 952        local cur="${COMP_WORDS[COMP_CWORD]}"
 953        case "$cur" in
 954        --*)
 955                __gitcomp "--cached --deleted --modified --others --ignored
 956                        --stage --directory --no-empty-directory --unmerged
 957                        --killed --exclude= --exclude-from=
 958                        --exclude-per-directory= --exclude-standard
 959                        --error-unmatch --with-tree= --full-name
 960                        --abbrev --ignored --exclude-per-directory
 961                        "
 962                return
 963                ;;
 964        esac
 965        COMPREPLY=()
 966}
 967
 968_git_ls_remote ()
 969{
 970        __gitcomp "$(__git_remotes)"
 971}
 972
 973_git_ls_tree ()
 974{
 975        __git_complete_file
 976}
 977
 978# Options that go well for log, shortlog and gitk
 979__git_log_common_options="
 980        --not --all
 981        --branches --tags --remotes
 982        --first-parent --no-merges
 983        --max-count=
 984        --max-age= --since= --after=
 985        --min-age= --until= --before=
 986"
 987# Options that go well for log and gitk (not shortlog)
 988__git_log_gitk_options="
 989        --dense --sparse --full-history
 990        --simplify-merges --simplify-by-decoration
 991        --left-right
 992"
 993# Options that go well for log and shortlog (not gitk)
 994__git_log_shortlog_options="
 995        --author= --committer= --grep=
 996        --all-match
 997"
 998
 999__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1000
1001_git_log ()
1002{
1003        __git_has_doubledash && return
1004
1005        local cur="${COMP_WORDS[COMP_CWORD]}"
1006        local g="$(git rev-parse --git-dir 2>/dev/null)"
1007        local merge=""
1008        if [ -f $g/MERGE_HEAD ]; then
1009                merge="--merge"
1010        fi
1011        case "$cur" in
1012        --pretty=*)
1013                __gitcomp "$__git_log_pretty_formats
1014                        " "" "${cur##--pretty=}"
1015                return
1016                ;;
1017        --format=*)
1018                __gitcomp "$__git_log_pretty_formats
1019                        " "" "${cur##--format=}"
1020                return
1021                ;;
1022        --date=*)
1023                __gitcomp "
1024                        relative iso8601 rfc2822 short local default
1025                " "" "${cur##--date=}"
1026                return
1027                ;;
1028        --*)
1029                __gitcomp "
1030                        $__git_log_common_options
1031                        $__git_log_shortlog_options
1032                        $__git_log_gitk_options
1033                        --root --topo-order --date-order --reverse
1034                        --follow
1035                        --abbrev-commit --abbrev=
1036                        --relative-date --date=
1037                        --pretty= --format= --oneline
1038                        --cherry-pick
1039                        --graph
1040                        --decorate
1041                        --walk-reflogs
1042                        --parents --children
1043                        $merge
1044                        $__git_diff_common_options
1045                        --pickaxe-all --pickaxe-regex
1046                        "
1047                return
1048                ;;
1049        esac
1050        __git_complete_revlist
1051}
1052
1053_git_merge ()
1054{
1055        local cur="${COMP_WORDS[COMP_CWORD]}"
1056        case "${COMP_WORDS[COMP_CWORD-1]}" in
1057        -s|--strategy)
1058                __gitcomp "$(__git_merge_strategies)"
1059                return
1060        esac
1061        case "$cur" in
1062        --strategy=*)
1063                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1064                return
1065                ;;
1066        --*)
1067                __gitcomp "
1068                        --no-commit --no-stat --log --no-log --squash --strategy
1069                        --commit --stat --no-squash --ff --no-ff
1070                        "
1071                return
1072        esac
1073        __gitcomp "$(__git_refs)"
1074}
1075
1076_git_mergetool ()
1077{
1078        local cur="${COMP_WORDS[COMP_CWORD]}"
1079        case "$cur" in
1080        --tool=*)
1081                __gitcomp "
1082                        kdiff3 tkdiff meld xxdiff emerge
1083                        vimdiff gvimdiff ecmerge opendiff
1084                        " "" "${cur##--tool=}"
1085                return
1086                ;;
1087        --*)
1088                __gitcomp "--tool="
1089                return
1090                ;;
1091        esac
1092        COMPREPLY=()
1093}
1094
1095_git_merge_base ()
1096{
1097        __gitcomp "$(__git_refs)"
1098}
1099
1100_git_mv ()
1101{
1102        local cur="${COMP_WORDS[COMP_CWORD]}"
1103        case "$cur" in
1104        --*)
1105                __gitcomp "--dry-run"
1106                return
1107                ;;
1108        esac
1109        COMPREPLY=()
1110}
1111
1112_git_name_rev ()
1113{
1114        __gitcomp "--tags --all --stdin"
1115}
1116
1117_git_pull ()
1118{
1119        local cur="${COMP_WORDS[COMP_CWORD]}"
1120
1121        if [ "$COMP_CWORD" = 2 ]; then
1122                __gitcomp "$(__git_remotes)"
1123        else
1124                __gitcomp "$(__git_refs "${COMP_WORDS[2]}")"
1125        fi
1126}
1127
1128_git_push ()
1129{
1130        local cur="${COMP_WORDS[COMP_CWORD]}"
1131
1132        if [ "$COMP_CWORD" = 2 ]; then
1133                __gitcomp "$(__git_remotes)"
1134        else
1135                case "$cur" in
1136                *:*)
1137                        local pfx=""
1138                        case "$COMP_WORDBREAKS" in
1139                        *:*) : great ;;
1140                        *)   pfx="${cur%%:*}:" ;;
1141                        esac
1142
1143                        __gitcomp "$(__git_refs "${COMP_WORDS[2]}")" "$pfx" "${cur#*:}"
1144                        ;;
1145                +*)
1146                        __gitcomp "$(__git_refs)" + "${cur#+}"
1147                        ;;
1148                *)
1149                        __gitcomp "$(__git_refs)"
1150                        ;;
1151                esac
1152        fi
1153}
1154
1155_git_rebase ()
1156{
1157        local cur="${COMP_WORDS[COMP_CWORD]}" dir="$(__gitdir)"
1158        if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1159                __gitcomp "--continue --skip --abort"
1160                return
1161        fi
1162        case "${COMP_WORDS[COMP_CWORD-1]}" in
1163        -s|--strategy)
1164                __gitcomp "$(__git_merge_strategies)"
1165                return
1166        esac
1167        case "$cur" in
1168        --strategy=*)
1169                __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
1170                return
1171                ;;
1172        --*)
1173                __gitcomp "--onto --merge --strategy --interactive"
1174                return
1175        esac
1176        __gitcomp "$(__git_refs)"
1177}
1178
1179_git_send_email ()
1180{
1181        local cur="${COMP_WORDS[COMP_CWORD]}"
1182        case "$cur" in
1183        --*)
1184                __gitcomp "--bcc --cc --cc-cmd --chain-reply-to --compose
1185                        --dry-run --envelope-sender --from --identity
1186                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1187                        --no-suppress-from --no-thread --quiet
1188                        --signed-off-by-cc --smtp-pass --smtp-server
1189                        --smtp-server-port --smtp-ssl --smtp-user --subject
1190                        --suppress-cc --suppress-from --thread --to
1191                        --validate --no-validate"
1192                return
1193                ;;
1194        esac
1195        COMPREPLY=()
1196}
1197
1198_git_config ()
1199{
1200        local cur="${COMP_WORDS[COMP_CWORD]}"
1201        local prv="${COMP_WORDS[COMP_CWORD-1]}"
1202        case "$prv" in
1203        branch.*.remote)
1204                __gitcomp "$(__git_remotes)"
1205                return
1206                ;;
1207        branch.*.merge)
1208                __gitcomp "$(__git_refs)"
1209                return
1210                ;;
1211        remote.*.fetch)
1212                local remote="${prv#remote.}"
1213                remote="${remote%.fetch}"
1214                __gitcomp "$(__git_refs_remotes "$remote")"
1215                return
1216                ;;
1217        remote.*.push)
1218                local remote="${prv#remote.}"
1219                remote="${remote%.push}"
1220                __gitcomp "$(git --git-dir="$(__gitdir)" \
1221                        for-each-ref --format='%(refname):%(refname)' \
1222                        refs/heads)"
1223                return
1224                ;;
1225        pull.twohead|pull.octopus)
1226                __gitcomp "$(__git_merge_strategies)"
1227                return
1228                ;;
1229        color.branch|color.diff|color.interactive|color.status|color.ui)
1230                __gitcomp "always never auto"
1231                return
1232                ;;
1233        color.pager)
1234                __gitcomp "false true"
1235                return
1236                ;;
1237        color.*.*)
1238                __gitcomp "
1239                        normal black red green yellow blue magenta cyan white
1240                        bold dim ul blink reverse
1241                        "
1242                return
1243                ;;
1244        *.*)
1245                COMPREPLY=()
1246                return
1247                ;;
1248        esac
1249        case "$cur" in
1250        --*)
1251                __gitcomp "
1252                        --global --system --file=
1253                        --list --replace-all
1254                        --get --get-all --get-regexp
1255                        --add --unset --unset-all
1256                        --remove-section --rename-section
1257                        "
1258                return
1259                ;;
1260        branch.*.*)
1261                local pfx="${cur%.*}."
1262                cur="${cur##*.}"
1263                __gitcomp "remote merge mergeoptions" "$pfx" "$cur"
1264                return
1265                ;;
1266        branch.*)
1267                local pfx="${cur%.*}."
1268                cur="${cur#*.}"
1269                __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
1270                return
1271                ;;
1272        remote.*.*)
1273                local pfx="${cur%.*}."
1274                cur="${cur##*.}"
1275                __gitcomp "
1276                        url proxy fetch push mirror skipDefaultUpdate
1277                        receivepack uploadpack tagopt
1278                        " "$pfx" "$cur"
1279                return
1280                ;;
1281        remote.*)
1282                local pfx="${cur%.*}."
1283                cur="${cur#*.}"
1284                __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
1285                return
1286                ;;
1287        esac
1288        __gitcomp "
1289                apply.whitespace
1290                branch.autosetupmerge
1291                branch.autosetuprebase
1292                clean.requireForce
1293                color.branch
1294                color.branch.current
1295                color.branch.local
1296                color.branch.plain
1297                color.branch.remote
1298                color.diff
1299                color.diff.commit
1300                color.diff.frag
1301                color.diff.meta
1302                color.diff.new
1303                color.diff.old
1304                color.diff.plain
1305                color.diff.whitespace
1306                color.interactive
1307                color.interactive.header
1308                color.interactive.help
1309                color.interactive.prompt
1310                color.pager
1311                color.status
1312                color.status.added
1313                color.status.changed
1314                color.status.header
1315                color.status.nobranch
1316                color.status.untracked
1317                color.status.updated
1318                color.ui
1319                commit.template
1320                core.autocrlf
1321                core.bare
1322                core.compression
1323                core.deltaBaseCacheLimit
1324                core.editor
1325                core.excludesfile
1326                core.fileMode
1327                core.fsyncobjectfiles
1328                core.gitProxy
1329                core.ignoreCygwinFSTricks
1330                core.ignoreStat
1331                core.logAllRefUpdates
1332                core.loosecompression
1333                core.packedGitLimit
1334                core.packedGitWindowSize
1335                core.pager
1336                core.preferSymlinkRefs
1337                core.preloadindex
1338                core.quotepath
1339                core.repositoryFormatVersion
1340                core.safecrlf
1341                core.sharedRepository
1342                core.symlinks
1343                core.trustctime
1344                core.warnAmbiguousRefs
1345                core.whitespace
1346                core.worktree
1347                diff.autorefreshindex
1348                diff.external
1349                diff.mnemonicprefix
1350                diff.renameLimit
1351                diff.renameLimit.
1352                diff.renames
1353                fetch.unpackLimit
1354                format.headers
1355                format.numbered
1356                format.pretty
1357                format.suffix
1358                gc.aggressiveWindow
1359                gc.auto
1360                gc.autopacklimit
1361                gc.packrefs
1362                gc.pruneexpire
1363                gc.reflogexpire
1364                gc.reflogexpireunreachable
1365                gc.rerereresolved
1366                gc.rerereunresolved
1367                gitcvs.allbinary
1368                gitcvs.dbTableNamePrefix
1369                gitcvs.dbdriver
1370                gitcvs.dbname
1371                gitcvs.dbpass
1372                gitcvs.dbuser
1373                gitcvs.enabled
1374                gitcvs.logfile
1375                gitcvs.usecrlfattr
1376                gui.blamehistoryctx
1377                gui.commitmsgwidth
1378                gui.copyblamethreshold
1379                gui.diffcontext
1380                gui.encoding
1381                gui.fastcopyblame
1382                gui.matchtrackingbranch
1383                gui.newbranchtemplate
1384                gui.pruneduringfetch
1385                gui.spellingdictionary
1386                gui.trustmtime
1387                help.autocorrect
1388                help.browser
1389                help.format
1390                http.lowSpeedLimit
1391                http.lowSpeedTime
1392                http.maxRequests
1393                http.noEPSV
1394                http.proxy
1395                http.sslCAInfo
1396                http.sslCAPath
1397                http.sslCert
1398                http.sslKey
1399                http.sslVerify
1400                i18n.commitEncoding
1401                i18n.logOutputEncoding
1402                instaweb.browser
1403                instaweb.httpd
1404                instaweb.local
1405                instaweb.modulepath
1406                instaweb.port
1407                log.date
1408                log.showroot
1409                man.viewer
1410                merge.conflictstyle
1411                merge.log
1412                merge.renameLimit
1413                merge.stat
1414                merge.tool
1415                merge.verbosity
1416                mergetool.keepBackup
1417                pack.compression
1418                pack.deltaCacheLimit
1419                pack.deltaCacheSize
1420                pack.depth
1421                pack.indexVersion
1422                pack.packSizeLimit
1423                pack.threads
1424                pack.window
1425                pack.windowMemory
1426                pull.octopus
1427                pull.twohead
1428                receive.denyCurrentBranch
1429                receive.denyDeletes
1430                receive.denyNonFastForwards
1431                receive.fsckObjects
1432                receive.unpackLimit
1433                repack.usedeltabaseoffset
1434                rerere.autoupdate
1435                rerere.enabled
1436                showbranch.default
1437                status.relativePaths
1438                status.showUntrackedFiles
1439                tar.umask
1440                transfer.unpackLimit
1441                user.email
1442                user.name
1443                user.signingkey
1444                web.browser
1445                branch. remote.
1446        "
1447}
1448
1449_git_remote ()
1450{
1451        local subcommands="add rename rm show prune update"
1452        local subcommand="$(__git_find_subcommand "$subcommands")"
1453        if [ -z "$subcommand" ]; then
1454                __gitcomp "$subcommands"
1455                return
1456        fi
1457
1458        case "$subcommand" in
1459        rename|rm|show|prune)
1460                __gitcomp "$(__git_remotes)"
1461                ;;
1462        update)
1463                local i c='' IFS=$'\n'
1464                for i in $(git --git-dir="$(__gitdir)" config --list); do
1465                        case "$i" in
1466                        remotes.*)
1467                                i="${i#remotes.}"
1468                                c="$c ${i/=*/}"
1469                                ;;
1470                        esac
1471                done
1472                __gitcomp "$c"
1473                ;;
1474        *)
1475                COMPREPLY=()
1476                ;;
1477        esac
1478}
1479
1480_git_reset ()
1481{
1482        __git_has_doubledash && return
1483
1484        local cur="${COMP_WORDS[COMP_CWORD]}"
1485        case "$cur" in
1486        --*)
1487                __gitcomp "--merge --mixed --hard --soft"
1488                return
1489                ;;
1490        esac
1491        __gitcomp "$(__git_refs)"
1492}
1493
1494_git_revert ()
1495{
1496        local cur="${COMP_WORDS[COMP_CWORD]}"
1497        case "$cur" in
1498        --*)
1499                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
1500                return
1501                ;;
1502        esac
1503        __gitcomp "$(__git_refs)"
1504}
1505
1506_git_rm ()
1507{
1508        __git_has_doubledash && return
1509
1510        local cur="${COMP_WORDS[COMP_CWORD]}"
1511        case "$cur" in
1512        --*)
1513                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
1514                return
1515                ;;
1516        esac
1517        COMPREPLY=()
1518}
1519
1520_git_shortlog ()
1521{
1522        __git_has_doubledash && return
1523
1524        local cur="${COMP_WORDS[COMP_CWORD]}"
1525        case "$cur" in
1526        --*)
1527                __gitcomp "
1528                        $__git_log_common_options
1529                        $__git_log_shortlog_options
1530                        --numbered --summary
1531                        "
1532                return
1533                ;;
1534        esac
1535        __git_complete_revlist
1536}
1537
1538_git_show ()
1539{
1540        __git_has_doubledash && return
1541
1542        local cur="${COMP_WORDS[COMP_CWORD]}"
1543        case "$cur" in
1544        --pretty=*)
1545                __gitcomp "$__git_log_pretty_formats
1546                        " "" "${cur##--pretty=}"
1547                return
1548                ;;
1549        --format=*)
1550                __gitcomp "$__git_log_pretty_formats
1551                        " "" "${cur##--format=}"
1552                return
1553                ;;
1554        --*)
1555                __gitcomp "--pretty= --format=
1556                        $__git_diff_common_options
1557                        "
1558                return
1559                ;;
1560        esac
1561        __git_complete_file
1562}
1563
1564_git_show_branch ()
1565{
1566        local cur="${COMP_WORDS[COMP_CWORD]}"
1567        case "$cur" in
1568        --*)
1569                __gitcomp "
1570                        --all --remotes --topo-order --current --more=
1571                        --list --independent --merge-base --no-name
1572                        --sha1-name --topics --reflog
1573                        "
1574                return
1575                ;;
1576        esac
1577        __git_complete_revlist
1578}
1579
1580_git_stash ()
1581{
1582        local subcommands='save list show apply clear drop pop create branch'
1583        local subcommand="$(__git_find_subcommand "$subcommands")"
1584        if [ -z "$subcommand" ]; then
1585                __gitcomp "$subcommands"
1586        else
1587                local cur="${COMP_WORDS[COMP_CWORD]}"
1588                case "$subcommand,$cur" in
1589                save,--*)
1590                        __gitcomp "--keep-index"
1591                        ;;
1592                apply,--*)
1593                        __gitcomp "--index"
1594                        ;;
1595                show,--*|drop,--*|pop,--*|branch,--*)
1596                        COMPREPLY=()
1597                        ;;
1598                show,*|apply,*|drop,*|pop,*|branch,*)
1599                        __gitcomp "$(git --git-dir="$(__gitdir)" stash list \
1600                                        | sed -n -e 's/:.*//p')"
1601                        ;;
1602                *)
1603                        COMPREPLY=()
1604                        ;;
1605                esac
1606        fi
1607}
1608
1609_git_submodule ()
1610{
1611        __git_has_doubledash && return
1612
1613        local subcommands="add status init update summary foreach sync"
1614        if [ -z "$(__git_find_subcommand "$subcommands")" ]; then
1615                local cur="${COMP_WORDS[COMP_CWORD]}"
1616                case "$cur" in
1617                --*)
1618                        __gitcomp "--quiet --cached"
1619                        ;;
1620                *)
1621                        __gitcomp "$subcommands"
1622                        ;;
1623                esac
1624                return
1625        fi
1626}
1627
1628_git_svn ()
1629{
1630        local subcommands="
1631                init fetch clone rebase dcommit log find-rev
1632                set-tree commit-diff info create-ignore propget
1633                proplist show-ignore show-externals branch tag blame
1634                migrate
1635                "
1636        local subcommand="$(__git_find_subcommand "$subcommands")"
1637        if [ -z "$subcommand" ]; then
1638                __gitcomp "$subcommands"
1639        else
1640                local remote_opts="--username= --config-dir= --no-auth-cache"
1641                local fc_opts="
1642                        --follow-parent --authors-file= --repack=
1643                        --no-metadata --use-svm-props --use-svnsync-props
1644                        --log-window-size= --no-checkout --quiet
1645                        --repack-flags --use-log-author --localtime
1646                        --ignore-paths= $remote_opts
1647                        "
1648                local init_opts="
1649                        --template= --shared= --trunk= --tags=
1650                        --branches= --stdlayout --minimize-url
1651                        --no-metadata --use-svm-props --use-svnsync-props
1652                        --rewrite-root= --prefix= --use-log-author
1653                        --add-author-from $remote_opts
1654                        "
1655                local cmt_opts="
1656                        --edit --rmdir --find-copies-harder --copy-similarity=
1657                        "
1658
1659                local cur="${COMP_WORDS[COMP_CWORD]}"
1660                case "$subcommand,$cur" in
1661                fetch,--*)
1662                        __gitcomp "--revision= --fetch-all $fc_opts"
1663                        ;;
1664                clone,--*)
1665                        __gitcomp "--revision= $fc_opts $init_opts"
1666                        ;;
1667                init,--*)
1668                        __gitcomp "$init_opts"
1669                        ;;
1670                dcommit,--*)
1671                        __gitcomp "
1672                                --merge --strategy= --verbose --dry-run
1673                                --fetch-all --no-rebase --commit-url
1674                                --revision $cmt_opts $fc_opts
1675                                "
1676                        ;;
1677                set-tree,--*)
1678                        __gitcomp "--stdin $cmt_opts $fc_opts"
1679                        ;;
1680                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
1681                show-externals,--*)
1682                        __gitcomp "--revision="
1683                        ;;
1684                log,--*)
1685                        __gitcomp "
1686                                --limit= --revision= --verbose --incremental
1687                                --oneline --show-commit --non-recursive
1688                                --authors-file= --color
1689                                "
1690                        ;;
1691                rebase,--*)
1692                        __gitcomp "
1693                                --merge --verbose --strategy= --local
1694                                --fetch-all --dry-run $fc_opts
1695                                "
1696                        ;;
1697                commit-diff,--*)
1698                        __gitcomp "--message= --file= --revision= $cmt_opts"
1699                        ;;
1700                info,--*)
1701                        __gitcomp "--url"
1702                        ;;
1703                branch,--*)
1704                        __gitcomp "--dry-run --message --tag"
1705                        ;;
1706                tag,--*)
1707                        __gitcomp "--dry-run --message"
1708                        ;;
1709                blame,--*)
1710                        __gitcomp "--git-format"
1711                        ;;
1712                migrate,--*)
1713                        __gitcomp "
1714                                --config-dir= --ignore-paths= --minimize
1715                                --no-auth-cache --username=
1716                                "
1717                        ;;
1718                *)
1719                        COMPREPLY=()
1720                        ;;
1721                esac
1722        fi
1723}
1724
1725_git_tag ()
1726{
1727        local i c=1 f=0
1728        while [ $c -lt $COMP_CWORD ]; do
1729                i="${COMP_WORDS[c]}"
1730                case "$i" in
1731                -d|-v)
1732                        __gitcomp "$(__git_tags)"
1733                        return
1734                        ;;
1735                -f)
1736                        f=1
1737                        ;;
1738                esac
1739                c=$((++c))
1740        done
1741
1742        case "${COMP_WORDS[COMP_CWORD-1]}" in
1743        -m|-F)
1744                COMPREPLY=()
1745                ;;
1746        -*|tag)
1747                if [ $f = 1 ]; then
1748                        __gitcomp "$(__git_tags)"
1749                else
1750                        COMPREPLY=()
1751                fi
1752                ;;
1753        *)
1754                __gitcomp "$(__git_refs)"
1755                ;;
1756        esac
1757}
1758
1759_git ()
1760{
1761        local i c=1 command __git_dir
1762
1763        while [ $c -lt $COMP_CWORD ]; do
1764                i="${COMP_WORDS[c]}"
1765                case "$i" in
1766                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
1767                --bare)      __git_dir="." ;;
1768                --version|-p|--paginate) ;;
1769                --help) command="help"; break ;;
1770                *) command="$i"; break ;;
1771                esac
1772                c=$((++c))
1773        done
1774
1775        if [ -z "$command" ]; then
1776                case "${COMP_WORDS[COMP_CWORD]}" in
1777                --*)   __gitcomp "
1778                        --paginate
1779                        --no-pager
1780                        --git-dir=
1781                        --bare
1782                        --version
1783                        --exec-path
1784                        --work-tree=
1785                        --help
1786                        "
1787                        ;;
1788                *)     __gitcomp "$(__git_porcelain_commands) $(__git_aliases)" ;;
1789                esac
1790                return
1791        fi
1792
1793        local expansion=$(__git_aliased_command "$command")
1794        [ "$expansion" ] && command="$expansion"
1795
1796        case "$command" in
1797        am)          _git_am ;;
1798        add)         _git_add ;;
1799        apply)       _git_apply ;;
1800        archive)     _git_archive ;;
1801        bisect)      _git_bisect ;;
1802        bundle)      _git_bundle ;;
1803        branch)      _git_branch ;;
1804        checkout)    _git_checkout ;;
1805        cherry)      _git_cherry ;;
1806        cherry-pick) _git_cherry_pick ;;
1807        clean)       _git_clean ;;
1808        clone)       _git_clone ;;
1809        commit)      _git_commit ;;
1810        config)      _git_config ;;
1811        describe)    _git_describe ;;
1812        diff)        _git_diff ;;
1813        fetch)       _git_fetch ;;
1814        format-patch) _git_format_patch ;;
1815        gc)          _git_gc ;;
1816        grep)        _git_grep ;;
1817        help)        _git_help ;;
1818        init)        _git_init ;;
1819        log)         _git_log ;;
1820        ls-files)    _git_ls_files ;;
1821        ls-remote)   _git_ls_remote ;;
1822        ls-tree)     _git_ls_tree ;;
1823        merge)       _git_merge;;
1824        mergetool)   _git_mergetool;;
1825        merge-base)  _git_merge_base ;;
1826        mv)          _git_mv ;;
1827        name-rev)    _git_name_rev ;;
1828        pull)        _git_pull ;;
1829        push)        _git_push ;;
1830        rebase)      _git_rebase ;;
1831        remote)      _git_remote ;;
1832        reset)       _git_reset ;;
1833        revert)      _git_revert ;;
1834        rm)          _git_rm ;;
1835        send-email)  _git_send_email ;;
1836        shortlog)    _git_shortlog ;;
1837        show)        _git_show ;;
1838        show-branch) _git_show_branch ;;
1839        stash)       _git_stash ;;
1840        stage)       _git_add ;;
1841        submodule)   _git_submodule ;;
1842        svn)         _git_svn ;;
1843        tag)         _git_tag ;;
1844        whatchanged) _git_log ;;
1845        *)           COMPREPLY=() ;;
1846        esac
1847}
1848
1849_gitk ()
1850{
1851        __git_has_doubledash && return
1852
1853        local cur="${COMP_WORDS[COMP_CWORD]}"
1854        local g="$(git rev-parse --git-dir 2>/dev/null)"
1855        local merge=""
1856        if [ -f $g/MERGE_HEAD ]; then
1857                merge="--merge"
1858        fi
1859        case "$cur" in
1860        --*)
1861                __gitcomp "
1862                        $__git_log_common_options
1863                        $__git_log_gitk_options
1864                        $merge
1865                        "
1866                return
1867                ;;
1868        esac
1869        __git_complete_revlist
1870}
1871
1872complete -o bashdefault -o default -o nospace -F _git git 2>/dev/null \
1873        || complete -o default -o nospace -F _git git
1874complete -o bashdefault -o default -o nospace -F _gitk gitk 2>/dev/null \
1875        || complete -o default -o nospace -F _gitk gitk
1876
1877# The following are necessary only for Cygwin, and only are needed
1878# when the user has tab-completed the executable name and consequently
1879# included the '.exe' suffix.
1880#
1881if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
1882complete -o bashdefault -o default -o nospace -F _git git.exe 2>/dev/null \
1883        || complete -o default -o nospace -F _git git.exe
1884fi