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