contrib / completion / git-completion.bashon commit t9902: protect test from stray build artifacts (5047822)
   1#!bash
   2#
   3# bash/zsh 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) Add the following line to your .bashrc/.zshrc:
  22#        source ~/.git-completion.sh
  23#    3) Consider changing your PS1 to also show the current branch,
  24#       see git-prompt.sh for details.
  25
  26case "$COMP_WORDBREAKS" in
  27*:*) : great ;;
  28*)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
  29esac
  30
  31# __gitdir accepts 0 or 1 arguments (i.e., location)
  32# returns location of .git repo
  33__gitdir ()
  34{
  35        # Note: this function is duplicated in git-prompt.sh
  36        # When updating it, make sure you update the other one to match.
  37        if [ -z "${1-}" ]; then
  38                if [ -n "${__git_dir-}" ]; then
  39                        echo "$__git_dir"
  40                elif [ -n "${GIT_DIR-}" ]; then
  41                        test -d "${GIT_DIR-}" || return 1
  42                        echo "$GIT_DIR"
  43                elif [ -d .git ]; then
  44                        echo .git
  45                else
  46                        git rev-parse --git-dir 2>/dev/null
  47                fi
  48        elif [ -d "$1/.git" ]; then
  49                echo "$1/.git"
  50        else
  51                echo "$1"
  52        fi
  53}
  54
  55__gitcomp_1 ()
  56{
  57        local c IFS=$' \t\n'
  58        for c in $1; do
  59                c="$c$2"
  60                case $c in
  61                --*=*|*.) ;;
  62                *) c="$c " ;;
  63                esac
  64                printf '%s\n' "$c"
  65        done
  66}
  67
  68# The following function is based on code from:
  69#
  70#   bash_completion - programmable completion functions for bash 3.2+
  71#
  72#   Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
  73#             © 2009-2010, Bash Completion Maintainers
  74#                     <bash-completion-devel@lists.alioth.debian.org>
  75#
  76#   This program is free software; you can redistribute it and/or modify
  77#   it under the terms of the GNU General Public License as published by
  78#   the Free Software Foundation; either version 2, or (at your option)
  79#   any later version.
  80#
  81#   This program is distributed in the hope that it will be useful,
  82#   but WITHOUT ANY WARRANTY; without even the implied warranty of
  83#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  84#   GNU General Public License for more details.
  85#
  86#   You should have received a copy of the GNU General Public License
  87#   along with this program; if not, write to the Free Software Foundation,
  88#   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  89#
  90#   The latest version of this software can be obtained here:
  91#
  92#   http://bash-completion.alioth.debian.org/
  93#
  94#   RELEASE: 2.x
  95
  96# This function can be used to access a tokenized list of words
  97# on the command line:
  98#
  99#       __git_reassemble_comp_words_by_ref '=:'
 100#       if test "${words_[cword_-1]}" = -w
 101#       then
 102#               ...
 103#       fi
 104#
 105# The argument should be a collection of characters from the list of
 106# word completion separators (COMP_WORDBREAKS) to treat as ordinary
 107# characters.
 108#
 109# This is roughly equivalent to going back in time and setting
 110# COMP_WORDBREAKS to exclude those characters.  The intent is to
 111# make option types like --date=<type> and <rev>:<path> easy to
 112# recognize by treating each shell word as a single token.
 113#
 114# It is best not to set COMP_WORDBREAKS directly because the value is
 115# shared with other completion scripts.  By the time the completion
 116# function gets called, COMP_WORDS has already been populated so local
 117# changes to COMP_WORDBREAKS have no effect.
 118#
 119# Output: words_, cword_, cur_.
 120
 121__git_reassemble_comp_words_by_ref()
 122{
 123        local exclude i j first
 124        # Which word separators to exclude?
 125        exclude="${1//[^$COMP_WORDBREAKS]}"
 126        cword_=$COMP_CWORD
 127        if [ -z "$exclude" ]; then
 128                words_=("${COMP_WORDS[@]}")
 129                return
 130        fi
 131        # List of word completion separators has shrunk;
 132        # re-assemble words to complete.
 133        for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
 134                # Append each nonempty word consisting of just
 135                # word separator characters to the current word.
 136                first=t
 137                while
 138                        [ $i -gt 0 ] &&
 139                        [ -n "${COMP_WORDS[$i]}" ] &&
 140                        # word consists of excluded word separators
 141                        [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
 142                do
 143                        # Attach to the previous token,
 144                        # unless the previous token is the command name.
 145                        if [ $j -ge 2 ] && [ -n "$first" ]; then
 146                                ((j--))
 147                        fi
 148                        first=
 149                        words_[$j]=${words_[j]}${COMP_WORDS[i]}
 150                        if [ $i = $COMP_CWORD ]; then
 151                                cword_=$j
 152                        fi
 153                        if (($i < ${#COMP_WORDS[@]} - 1)); then
 154                                ((i++))
 155                        else
 156                                # Done.
 157                                return
 158                        fi
 159                done
 160                words_[$j]=${words_[j]}${COMP_WORDS[i]}
 161                if [ $i = $COMP_CWORD ]; then
 162                        cword_=$j
 163                fi
 164        done
 165}
 166
 167if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
 168_get_comp_words_by_ref ()
 169{
 170        local exclude cur_ words_ cword_
 171        if [ "$1" = "-n" ]; then
 172                exclude=$2
 173                shift 2
 174        fi
 175        __git_reassemble_comp_words_by_ref "$exclude"
 176        cur_=${words_[cword_]}
 177        while [ $# -gt 0 ]; do
 178                case "$1" in
 179                cur)
 180                        cur=$cur_
 181                        ;;
 182                prev)
 183                        prev=${words_[$cword_-1]}
 184                        ;;
 185                words)
 186                        words=("${words_[@]}")
 187                        ;;
 188                cword)
 189                        cword=$cword_
 190                        ;;
 191                esac
 192                shift
 193        done
 194}
 195fi
 196
 197# Generates completion reply with compgen, appending a space to possible
 198# completion words, if necessary.
 199# It accepts 1 to 4 arguments:
 200# 1: List of possible completion words.
 201# 2: A prefix to be added to each possible completion word (optional).
 202# 3: Generate possible completion matches for this word (optional).
 203# 4: A suffix to be appended to each possible completion word (optional).
 204__gitcomp ()
 205{
 206        local cur_="${3-$cur}"
 207
 208        case "$cur_" in
 209        --*=)
 210                COMPREPLY=()
 211                ;;
 212        *)
 213                local IFS=$'\n'
 214                COMPREPLY=($(compgen -P "${2-}" \
 215                        -W "$(__gitcomp_1 "${1-}" "${4-}")" \
 216                        -- "$cur_"))
 217                ;;
 218        esac
 219}
 220
 221# Generates completion reply with compgen from newline-separated possible
 222# completion words by appending a space to all of them.
 223# It accepts 1 to 4 arguments:
 224# 1: List of possible completion words, separated by a single newline.
 225# 2: A prefix to be added to each possible completion word (optional).
 226# 3: Generate possible completion matches for this word (optional).
 227# 4: A suffix to be appended to each possible completion word instead of
 228#    the default space (optional).  If specified but empty, nothing is
 229#    appended.
 230__gitcomp_nl ()
 231{
 232        local IFS=$'\n'
 233        COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
 234}
 235
 236__git_heads ()
 237{
 238        local dir="$(__gitdir)"
 239        if [ -d "$dir" ]; then
 240                git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
 241                        refs/heads
 242                return
 243        fi
 244}
 245
 246__git_tags ()
 247{
 248        local dir="$(__gitdir)"
 249        if [ -d "$dir" ]; then
 250                git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
 251                        refs/tags
 252                return
 253        fi
 254}
 255
 256# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
 257# presence of 2nd argument means use the guess heuristic employed
 258# by checkout for tracking branches
 259__git_refs ()
 260{
 261        local i hash dir="$(__gitdir "${1-}")" track="${2-}"
 262        local format refs
 263        if [ -d "$dir" ]; then
 264                case "$cur" in
 265                refs|refs/*)
 266                        format="refname"
 267                        refs="${cur%/*}"
 268                        track=""
 269                        ;;
 270                *)
 271                        for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
 272                                if [ -e "$dir/$i" ]; then echo $i; fi
 273                        done
 274                        format="refname:short"
 275                        refs="refs/tags refs/heads refs/remotes"
 276                        ;;
 277                esac
 278                git --git-dir="$dir" for-each-ref --format="%($format)" \
 279                        $refs
 280                if [ -n "$track" ]; then
 281                        # employ the heuristic used by git checkout
 282                        # Try to find a remote branch that matches the completion word
 283                        # but only output if the branch name is unique
 284                        local ref entry
 285                        git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
 286                                "refs/remotes/" | \
 287                        while read -r entry; do
 288                                eval "$entry"
 289                                ref="${ref#*/}"
 290                                if [[ "$ref" == "$cur"* ]]; then
 291                                        echo "$ref"
 292                                fi
 293                        done | sort | uniq -u
 294                fi
 295                return
 296        fi
 297        case "$cur" in
 298        refs|refs/*)
 299                git ls-remote "$dir" "$cur*" 2>/dev/null | \
 300                while read -r hash i; do
 301                        case "$i" in
 302                        *^{}) ;;
 303                        *) echo "$i" ;;
 304                        esac
 305                done
 306                ;;
 307        *)
 308                git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \
 309                while read -r hash i; do
 310                        case "$i" in
 311                        *^{}) ;;
 312                        refs/*) echo "${i#refs/*/}" ;;
 313                        *) echo "$i" ;;
 314                        esac
 315                done
 316                ;;
 317        esac
 318}
 319
 320# __git_refs2 requires 1 argument (to pass to __git_refs)
 321__git_refs2 ()
 322{
 323        local i
 324        for i in $(__git_refs "$1"); do
 325                echo "$i:$i"
 326        done
 327}
 328
 329# __git_refs_remotes requires 1 argument (to pass to ls-remote)
 330__git_refs_remotes ()
 331{
 332        local i hash
 333        git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
 334        while read -r hash i; do
 335                echo "$i:refs/remotes/$1/${i#refs/heads/}"
 336        done
 337}
 338
 339__git_remotes ()
 340{
 341        local i IFS=$'\n' d="$(__gitdir)"
 342        test -d "$d/remotes" && ls -1 "$d/remotes"
 343        for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
 344                i="${i#remote.}"
 345                echo "${i/.url*/}"
 346        done
 347}
 348
 349__git_list_merge_strategies ()
 350{
 351        git merge -s help 2>&1 |
 352        sed -n -e '/[Aa]vailable strategies are: /,/^$/{
 353                s/\.$//
 354                s/.*://
 355                s/^[    ]*//
 356                s/[     ]*$//
 357                p
 358        }'
 359}
 360
 361__git_merge_strategies=
 362# 'git merge -s help' (and thus detection of the merge strategy
 363# list) fails, unfortunately, if run outside of any git working
 364# tree.  __git_merge_strategies is set to the empty string in
 365# that case, and the detection will be repeated the next time it
 366# is needed.
 367__git_compute_merge_strategies ()
 368{
 369        test -n "$__git_merge_strategies" ||
 370        __git_merge_strategies=$(__git_list_merge_strategies)
 371}
 372
 373__git_complete_revlist_file ()
 374{
 375        local pfx ls ref cur_="$cur"
 376        case "$cur_" in
 377        *..?*:*)
 378                return
 379                ;;
 380        ?*:*)
 381                ref="${cur_%%:*}"
 382                cur_="${cur_#*:}"
 383                case "$cur_" in
 384                ?*/*)
 385                        pfx="${cur_%/*}"
 386                        cur_="${cur_##*/}"
 387                        ls="$ref:$pfx"
 388                        pfx="$pfx/"
 389                        ;;
 390                *)
 391                        ls="$ref"
 392                        ;;
 393                esac
 394
 395                case "$COMP_WORDBREAKS" in
 396                *:*) : great ;;
 397                *)   pfx="$ref:$pfx" ;;
 398                esac
 399
 400                __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
 401                                | sed '/^100... blob /{
 402                                           s,^.*        ,,
 403                                           s,$, ,
 404                                       }
 405                                       /^120000 blob /{
 406                                           s,^.*        ,,
 407                                           s,$, ,
 408                                       }
 409                                       /^040000 tree /{
 410                                           s,^.*        ,,
 411                                           s,$,/,
 412                                       }
 413                                       s/^.*    //')" \
 414                        "$pfx" "$cur_" ""
 415                ;;
 416        *...*)
 417                pfx="${cur_%...*}..."
 418                cur_="${cur_#*...}"
 419                __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 420                ;;
 421        *..*)
 422                pfx="${cur_%..*}.."
 423                cur_="${cur_#*..}"
 424                __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 425                ;;
 426        *)
 427                __gitcomp_nl "$(__git_refs)"
 428                ;;
 429        esac
 430}
 431
 432
 433__git_complete_file ()
 434{
 435        __git_complete_revlist_file
 436}
 437
 438__git_complete_revlist ()
 439{
 440        __git_complete_revlist_file
 441}
 442
 443__git_complete_remote_or_refspec ()
 444{
 445        local cur_="$cur" cmd="${words[1]}"
 446        local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
 447        if [ "$cmd" = "remote" ]; then
 448                ((c++))
 449        fi
 450        while [ $c -lt $cword ]; do
 451                i="${words[c]}"
 452                case "$i" in
 453                --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
 454                --all)
 455                        case "$cmd" in
 456                        push) no_complete_refspec=1 ;;
 457                        fetch)
 458                                COMPREPLY=()
 459                                return
 460                                ;;
 461                        *) ;;
 462                        esac
 463                        ;;
 464                -*) ;;
 465                *) remote="$i"; break ;;
 466                esac
 467                ((c++))
 468        done
 469        if [ -z "$remote" ]; then
 470                __gitcomp_nl "$(__git_remotes)"
 471                return
 472        fi
 473        if [ $no_complete_refspec = 1 ]; then
 474                COMPREPLY=()
 475                return
 476        fi
 477        [ "$remote" = "." ] && remote=
 478        case "$cur_" in
 479        *:*)
 480                case "$COMP_WORDBREAKS" in
 481                *:*) : great ;;
 482                *)   pfx="${cur_%%:*}:" ;;
 483                esac
 484                cur_="${cur_#*:}"
 485                lhs=0
 486                ;;
 487        +*)
 488                pfx="+"
 489                cur_="${cur_#+}"
 490                ;;
 491        esac
 492        case "$cmd" in
 493        fetch)
 494                if [ $lhs = 1 ]; then
 495                        __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
 496                else
 497                        __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 498                fi
 499                ;;
 500        pull|remote)
 501                if [ $lhs = 1 ]; then
 502                        __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
 503                else
 504                        __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 505                fi
 506                ;;
 507        push)
 508                if [ $lhs = 1 ]; then
 509                        __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 510                else
 511                        __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
 512                fi
 513                ;;
 514        esac
 515}
 516
 517__git_complete_strategy ()
 518{
 519        __git_compute_merge_strategies
 520        case "$prev" in
 521        -s|--strategy)
 522                __gitcomp "$__git_merge_strategies"
 523                return 0
 524        esac
 525        case "$cur" in
 526        --strategy=*)
 527                __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
 528                return 0
 529                ;;
 530        esac
 531        return 1
 532}
 533
 534__git_commands () {
 535        if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
 536        then
 537                printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
 538        else
 539                git help -a|egrep '^  [a-zA-Z0-9]'
 540        fi
 541}
 542
 543__git_list_all_commands ()
 544{
 545        local i IFS=" "$'\n'
 546        for i in $(__git_commands)
 547        do
 548                case $i in
 549                *--*)             : helper pattern;;
 550                *) echo $i;;
 551                esac
 552        done
 553}
 554
 555__git_all_commands=
 556__git_compute_all_commands ()
 557{
 558        test -n "$__git_all_commands" ||
 559        __git_all_commands=$(__git_list_all_commands)
 560}
 561
 562__git_list_porcelain_commands ()
 563{
 564        local i IFS=" "$'\n'
 565        __git_compute_all_commands
 566        for i in $__git_all_commands
 567        do
 568                case $i in
 569                *--*)             : helper pattern;;
 570                applymbox)        : ask gittus;;
 571                applypatch)       : ask gittus;;
 572                archimport)       : import;;
 573                cat-file)         : plumbing;;
 574                check-attr)       : plumbing;;
 575                check-ref-format) : plumbing;;
 576                checkout-index)   : plumbing;;
 577                commit-tree)      : plumbing;;
 578                count-objects)    : infrequent;;
 579                credential-cache) : credentials helper;;
 580                credential-store) : credentials helper;;
 581                cvsexportcommit)  : export;;
 582                cvsimport)        : import;;
 583                cvsserver)        : daemon;;
 584                daemon)           : daemon;;
 585                diff-files)       : plumbing;;
 586                diff-index)       : plumbing;;
 587                diff-tree)        : plumbing;;
 588                fast-import)      : import;;
 589                fast-export)      : export;;
 590                fsck-objects)     : plumbing;;
 591                fetch-pack)       : plumbing;;
 592                fmt-merge-msg)    : plumbing;;
 593                for-each-ref)     : plumbing;;
 594                hash-object)      : plumbing;;
 595                http-*)           : transport;;
 596                index-pack)       : plumbing;;
 597                init-db)          : deprecated;;
 598                local-fetch)      : plumbing;;
 599                lost-found)       : infrequent;;
 600                ls-files)         : plumbing;;
 601                ls-remote)        : plumbing;;
 602                ls-tree)          : plumbing;;
 603                mailinfo)         : plumbing;;
 604                mailsplit)        : plumbing;;
 605                merge-*)          : plumbing;;
 606                mktree)           : plumbing;;
 607                mktag)            : plumbing;;
 608                pack-objects)     : plumbing;;
 609                pack-redundant)   : plumbing;;
 610                pack-refs)        : plumbing;;
 611                parse-remote)     : plumbing;;
 612                patch-id)         : plumbing;;
 613                peek-remote)      : plumbing;;
 614                prune)            : plumbing;;
 615                prune-packed)     : plumbing;;
 616                quiltimport)      : import;;
 617                read-tree)        : plumbing;;
 618                receive-pack)     : plumbing;;
 619                remote-*)         : transport;;
 620                repo-config)      : deprecated;;
 621                rerere)           : plumbing;;
 622                rev-list)         : plumbing;;
 623                rev-parse)        : plumbing;;
 624                runstatus)        : plumbing;;
 625                sh-setup)         : internal;;
 626                shell)            : daemon;;
 627                show-ref)         : plumbing;;
 628                send-pack)        : plumbing;;
 629                show-index)       : plumbing;;
 630                ssh-*)            : transport;;
 631                stripspace)       : plumbing;;
 632                symbolic-ref)     : plumbing;;
 633                tar-tree)         : deprecated;;
 634                unpack-file)      : plumbing;;
 635                unpack-objects)   : plumbing;;
 636                update-index)     : plumbing;;
 637                update-ref)       : plumbing;;
 638                update-server-info) : daemon;;
 639                upload-archive)   : plumbing;;
 640                upload-pack)      : plumbing;;
 641                write-tree)       : plumbing;;
 642                var)              : infrequent;;
 643                verify-pack)      : infrequent;;
 644                verify-tag)       : plumbing;;
 645                *) echo $i;;
 646                esac
 647        done
 648}
 649
 650__git_porcelain_commands=
 651__git_compute_porcelain_commands ()
 652{
 653        __git_compute_all_commands
 654        test -n "$__git_porcelain_commands" ||
 655        __git_porcelain_commands=$(__git_list_porcelain_commands)
 656}
 657
 658__git_pretty_aliases ()
 659{
 660        local i IFS=$'\n'
 661        for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
 662                case "$i" in
 663                pretty.*)
 664                        i="${i#pretty.}"
 665                        echo "${i/ */}"
 666                        ;;
 667                esac
 668        done
 669}
 670
 671__git_aliases ()
 672{
 673        local i IFS=$'\n'
 674        for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
 675                case "$i" in
 676                alias.*)
 677                        i="${i#alias.}"
 678                        echo "${i/ */}"
 679                        ;;
 680                esac
 681        done
 682}
 683
 684# __git_aliased_command requires 1 argument
 685__git_aliased_command ()
 686{
 687        local word cmdline=$(git --git-dir="$(__gitdir)" \
 688                config --get "alias.$1")
 689        for word in $cmdline; do
 690                case "$word" in
 691                \!gitk|gitk)
 692                        echo "gitk"
 693                        return
 694                        ;;
 695                \!*)    : shell command alias ;;
 696                -*)     : option ;;
 697                *=*)    : setting env ;;
 698                git)    : git itself ;;
 699                *)
 700                        echo "$word"
 701                        return
 702                esac
 703        done
 704}
 705
 706# __git_find_on_cmdline requires 1 argument
 707__git_find_on_cmdline ()
 708{
 709        local word subcommand c=1
 710        while [ $c -lt $cword ]; do
 711                word="${words[c]}"
 712                for subcommand in $1; do
 713                        if [ "$subcommand" = "$word" ]; then
 714                                echo "$subcommand"
 715                                return
 716                        fi
 717                done
 718                ((c++))
 719        done
 720}
 721
 722__git_has_doubledash ()
 723{
 724        local c=1
 725        while [ $c -lt $cword ]; do
 726                if [ "--" = "${words[c]}" ]; then
 727                        return 0
 728                fi
 729                ((c++))
 730        done
 731        return 1
 732}
 733
 734__git_whitespacelist="nowarn warn error error-all fix"
 735
 736_git_am ()
 737{
 738        local dir="$(__gitdir)"
 739        if [ -d "$dir"/rebase-apply ]; then
 740                __gitcomp "--skip --continue --resolved --abort"
 741                return
 742        fi
 743        case "$cur" in
 744        --whitespace=*)
 745                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 746                return
 747                ;;
 748        --*)
 749                __gitcomp "
 750                        --3way --committer-date-is-author-date --ignore-date
 751                        --ignore-whitespace --ignore-space-change
 752                        --interactive --keep --no-utf8 --signoff --utf8
 753                        --whitespace= --scissors
 754                        "
 755                return
 756        esac
 757        COMPREPLY=()
 758}
 759
 760_git_apply ()
 761{
 762        case "$cur" in
 763        --whitespace=*)
 764                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 765                return
 766                ;;
 767        --*)
 768                __gitcomp "
 769                        --stat --numstat --summary --check --index
 770                        --cached --index-info --reverse --reject --unidiff-zero
 771                        --apply --no-add --exclude=
 772                        --ignore-whitespace --ignore-space-change
 773                        --whitespace= --inaccurate-eof --verbose
 774                        "
 775                return
 776        esac
 777        COMPREPLY=()
 778}
 779
 780_git_add ()
 781{
 782        __git_has_doubledash && return
 783
 784        case "$cur" in
 785        --*)
 786                __gitcomp "
 787                        --interactive --refresh --patch --update --dry-run
 788                        --ignore-errors --intent-to-add
 789                        "
 790                return
 791        esac
 792        COMPREPLY=()
 793}
 794
 795_git_archive ()
 796{
 797        case "$cur" in
 798        --format=*)
 799                __gitcomp "$(git archive --list)" "" "${cur##--format=}"
 800                return
 801                ;;
 802        --remote=*)
 803                __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
 804                return
 805                ;;
 806        --*)
 807                __gitcomp "
 808                        --format= --list --verbose
 809                        --prefix= --remote= --exec=
 810                        "
 811                return
 812                ;;
 813        esac
 814        __git_complete_file
 815}
 816
 817_git_bisect ()
 818{
 819        __git_has_doubledash && return
 820
 821        local subcommands="start bad good skip reset visualize replay log run"
 822        local subcommand="$(__git_find_on_cmdline "$subcommands")"
 823        if [ -z "$subcommand" ]; then
 824                if [ -f "$(__gitdir)"/BISECT_START ]; then
 825                        __gitcomp "$subcommands"
 826                else
 827                        __gitcomp "replay start"
 828                fi
 829                return
 830        fi
 831
 832        case "$subcommand" in
 833        bad|good|reset|skip|start)
 834                __gitcomp_nl "$(__git_refs)"
 835                ;;
 836        *)
 837                COMPREPLY=()
 838                ;;
 839        esac
 840}
 841
 842_git_branch ()
 843{
 844        local i c=1 only_local_ref="n" has_r="n"
 845
 846        while [ $c -lt $cword ]; do
 847                i="${words[c]}"
 848                case "$i" in
 849                -d|-m)  only_local_ref="y" ;;
 850                -r)     has_r="y" ;;
 851                esac
 852                ((c++))
 853        done
 854
 855        case "$cur" in
 856        --set-upstream-to=*)
 857                __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}"
 858                ;;
 859        --*)
 860                __gitcomp "
 861                        --color --no-color --verbose --abbrev= --no-abbrev
 862                        --track --no-track --contains --merged --no-merged
 863                        --set-upstream-to= --edit-description --list
 864                        --unset-upstream
 865                        "
 866                ;;
 867        *)
 868                if [ $only_local_ref = "y" -a $has_r = "n" ]; then
 869                        __gitcomp_nl "$(__git_heads)"
 870                else
 871                        __gitcomp_nl "$(__git_refs)"
 872                fi
 873                ;;
 874        esac
 875}
 876
 877_git_bundle ()
 878{
 879        local cmd="${words[2]}"
 880        case "$cword" in
 881        2)
 882                __gitcomp "create list-heads verify unbundle"
 883                ;;
 884        3)
 885                # looking for a file
 886                ;;
 887        *)
 888                case "$cmd" in
 889                        create)
 890                                __git_complete_revlist
 891                        ;;
 892                esac
 893                ;;
 894        esac
 895}
 896
 897_git_checkout ()
 898{
 899        __git_has_doubledash && return
 900
 901        case "$cur" in
 902        --conflict=*)
 903                __gitcomp "diff3 merge" "" "${cur##--conflict=}"
 904                ;;
 905        --*)
 906                __gitcomp "
 907                        --quiet --ours --theirs --track --no-track --merge
 908                        --conflict= --orphan --patch
 909                        "
 910                ;;
 911        *)
 912                # check if --track, --no-track, or --no-guess was specified
 913                # if so, disable DWIM mode
 914                local flags="--track --no-track --no-guess" track=1
 915                if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
 916                        track=''
 917                fi
 918                __gitcomp_nl "$(__git_refs '' $track)"
 919                ;;
 920        esac
 921}
 922
 923_git_cherry ()
 924{
 925        __gitcomp "$(__git_refs)"
 926}
 927
 928_git_cherry_pick ()
 929{
 930        case "$cur" in
 931        --*)
 932                __gitcomp "--edit --no-commit"
 933                ;;
 934        *)
 935                __gitcomp_nl "$(__git_refs)"
 936                ;;
 937        esac
 938}
 939
 940_git_clean ()
 941{
 942        __git_has_doubledash && return
 943
 944        case "$cur" in
 945        --*)
 946                __gitcomp "--dry-run --quiet"
 947                return
 948                ;;
 949        esac
 950        COMPREPLY=()
 951}
 952
 953_git_clone ()
 954{
 955        case "$cur" in
 956        --*)
 957                __gitcomp "
 958                        --local
 959                        --no-hardlinks
 960                        --shared
 961                        --reference
 962                        --quiet
 963                        --no-checkout
 964                        --bare
 965                        --mirror
 966                        --origin
 967                        --upload-pack
 968                        --template=
 969                        --depth
 970                        --single-branch
 971                        --branch
 972                        "
 973                return
 974                ;;
 975        esac
 976        COMPREPLY=()
 977}
 978
 979_git_commit ()
 980{
 981        __git_has_doubledash && return
 982
 983        case "$prev" in
 984        -c|-C)
 985                __gitcomp_nl "$(__git_refs)" "" "${cur}"
 986                return
 987                ;;
 988        esac
 989
 990        case "$cur" in
 991        --cleanup=*)
 992                __gitcomp "default strip verbatim whitespace
 993                        " "" "${cur##--cleanup=}"
 994                return
 995                ;;
 996        --reuse-message=*|--reedit-message=*|\
 997        --fixup=*|--squash=*)
 998                __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
 999                return
1000                ;;
1001        --untracked-files=*)
1002                __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1003                return
1004                ;;
1005        --*)
1006                __gitcomp "
1007                        --all --author= --signoff --verify --no-verify
1008                        --edit --no-edit
1009                        --amend --include --only --interactive
1010                        --dry-run --reuse-message= --reedit-message=
1011                        --reset-author --file= --message= --template=
1012                        --cleanup= --untracked-files --untracked-files=
1013                        --verbose --quiet --fixup= --squash=
1014                        "
1015                return
1016        esac
1017        COMPREPLY=()
1018}
1019
1020_git_describe ()
1021{
1022        case "$cur" in
1023        --*)
1024                __gitcomp "
1025                        --all --tags --contains --abbrev= --candidates=
1026                        --exact-match --debug --long --match --always
1027                        "
1028                return
1029        esac
1030        __gitcomp_nl "$(__git_refs)"
1031}
1032
1033__git_diff_common_options="--stat --numstat --shortstat --summary
1034                        --patch-with-stat --name-only --name-status --color
1035                        --no-color --color-words --no-renames --check
1036                        --full-index --binary --abbrev --diff-filter=
1037                        --find-copies-harder
1038                        --text --ignore-space-at-eol --ignore-space-change
1039                        --ignore-all-space --exit-code --quiet --ext-diff
1040                        --no-ext-diff
1041                        --no-prefix --src-prefix= --dst-prefix=
1042                        --inter-hunk-context=
1043                        --patience
1044                        --raw
1045                        --dirstat --dirstat= --dirstat-by-file
1046                        --dirstat-by-file= --cumulative
1047"
1048
1049_git_diff ()
1050{
1051        __git_has_doubledash && return
1052
1053        case "$cur" in
1054        --*)
1055                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1056                        --base --ours --theirs --no-index
1057                        $__git_diff_common_options
1058                        "
1059                return
1060                ;;
1061        esac
1062        __git_complete_revlist_file
1063}
1064
1065__git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1066                        tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1067"
1068
1069_git_difftool ()
1070{
1071        __git_has_doubledash && return
1072
1073        case "$cur" in
1074        --tool=*)
1075                __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1076                return
1077                ;;
1078        --*)
1079                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1080                        --base --ours --theirs
1081                        --no-renames --diff-filter= --find-copies-harder
1082                        --relative --ignore-submodules
1083                        --tool="
1084                return
1085                ;;
1086        esac
1087        __git_complete_file
1088}
1089
1090__git_fetch_options="
1091        --quiet --verbose --append --upload-pack --force --keep --depth=
1092        --tags --no-tags --all --prune --dry-run
1093"
1094
1095_git_fetch ()
1096{
1097        case "$cur" in
1098        --*)
1099                __gitcomp "$__git_fetch_options"
1100                return
1101                ;;
1102        esac
1103        __git_complete_remote_or_refspec
1104}
1105
1106__git_format_patch_options="
1107        --stdout --attach --no-attach --thread --thread= --output-directory
1108        --numbered --start-number --numbered-files --keep-subject --signoff
1109        --signature --no-signature --in-reply-to= --cc= --full-index --binary
1110        --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1111        --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1112"
1113
1114_git_format_patch ()
1115{
1116        case "$cur" in
1117        --thread=*)
1118                __gitcomp "
1119                        deep shallow
1120                        " "" "${cur##--thread=}"
1121                return
1122                ;;
1123        --*)
1124                __gitcomp "$__git_format_patch_options"
1125                return
1126                ;;
1127        esac
1128        __git_complete_revlist
1129}
1130
1131_git_fsck ()
1132{
1133        case "$cur" in
1134        --*)
1135                __gitcomp "
1136                        --tags --root --unreachable --cache --no-reflogs --full
1137                        --strict --verbose --lost-found
1138                        "
1139                return
1140                ;;
1141        esac
1142        COMPREPLY=()
1143}
1144
1145_git_gc ()
1146{
1147        case "$cur" in
1148        --*)
1149                __gitcomp "--prune --aggressive"
1150                return
1151                ;;
1152        esac
1153        COMPREPLY=()
1154}
1155
1156_git_gitk ()
1157{
1158        _gitk
1159}
1160
1161__git_match_ctag() {
1162        awk "/^${1////\\/}/ { print \$1 }" "$2"
1163}
1164
1165_git_grep ()
1166{
1167        __git_has_doubledash && return
1168
1169        case "$cur" in
1170        --*)
1171                __gitcomp "
1172                        --cached
1173                        --text --ignore-case --word-regexp --invert-match
1174                        --full-name --line-number
1175                        --extended-regexp --basic-regexp --fixed-strings
1176                        --perl-regexp
1177                        --files-with-matches --name-only
1178                        --files-without-match
1179                        --max-depth
1180                        --count
1181                        --and --or --not --all-match
1182                        "
1183                return
1184                ;;
1185        esac
1186
1187        case "$cword,$prev" in
1188        2,*|*,-*)
1189                if test -r tags; then
1190                        __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1191                        return
1192                fi
1193                ;;
1194        esac
1195
1196        __gitcomp_nl "$(__git_refs)"
1197}
1198
1199_git_help ()
1200{
1201        case "$cur" in
1202        --*)
1203                __gitcomp "--all --info --man --web"
1204                return
1205                ;;
1206        esac
1207        __git_compute_all_commands
1208        __gitcomp "$__git_all_commands $(__git_aliases)
1209                attributes cli core-tutorial cvs-migration
1210                diffcore gitk glossary hooks ignore modules
1211                namespaces repository-layout tutorial tutorial-2
1212                workflows
1213                "
1214}
1215
1216_git_init ()
1217{
1218        case "$cur" in
1219        --shared=*)
1220                __gitcomp "
1221                        false true umask group all world everybody
1222                        " "" "${cur##--shared=}"
1223                return
1224                ;;
1225        --*)
1226                __gitcomp "--quiet --bare --template= --shared --shared="
1227                return
1228                ;;
1229        esac
1230        COMPREPLY=()
1231}
1232
1233_git_ls_files ()
1234{
1235        __git_has_doubledash && return
1236
1237        case "$cur" in
1238        --*)
1239                __gitcomp "--cached --deleted --modified --others --ignored
1240                        --stage --directory --no-empty-directory --unmerged
1241                        --killed --exclude= --exclude-from=
1242                        --exclude-per-directory= --exclude-standard
1243                        --error-unmatch --with-tree= --full-name
1244                        --abbrev --ignored --exclude-per-directory
1245                        "
1246                return
1247                ;;
1248        esac
1249        COMPREPLY=()
1250}
1251
1252_git_ls_remote ()
1253{
1254        __gitcomp_nl "$(__git_remotes)"
1255}
1256
1257_git_ls_tree ()
1258{
1259        __git_complete_file
1260}
1261
1262# Options that go well for log, shortlog and gitk
1263__git_log_common_options="
1264        --not --all
1265        --branches --tags --remotes
1266        --first-parent --merges --no-merges
1267        --max-count=
1268        --max-age= --since= --after=
1269        --min-age= --until= --before=
1270        --min-parents= --max-parents=
1271        --no-min-parents --no-max-parents
1272"
1273# Options that go well for log and gitk (not shortlog)
1274__git_log_gitk_options="
1275        --dense --sparse --full-history
1276        --simplify-merges --simplify-by-decoration
1277        --left-right --notes --no-notes
1278"
1279# Options that go well for log and shortlog (not gitk)
1280__git_log_shortlog_options="
1281        --author= --committer= --grep=
1282        --all-match
1283"
1284
1285__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1286__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1287
1288_git_log ()
1289{
1290        __git_has_doubledash && return
1291
1292        local g="$(git rev-parse --git-dir 2>/dev/null)"
1293        local merge=""
1294        if [ -f "$g/MERGE_HEAD" ]; then
1295                merge="--merge"
1296        fi
1297        case "$cur" in
1298        --pretty=*|--format=*)
1299                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1300                        " "" "${cur#*=}"
1301                return
1302                ;;
1303        --date=*)
1304                __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1305                return
1306                ;;
1307        --decorate=*)
1308                __gitcomp "long short" "" "${cur##--decorate=}"
1309                return
1310                ;;
1311        --*)
1312                __gitcomp "
1313                        $__git_log_common_options
1314                        $__git_log_shortlog_options
1315                        $__git_log_gitk_options
1316                        --root --topo-order --date-order --reverse
1317                        --follow --full-diff
1318                        --abbrev-commit --abbrev=
1319                        --relative-date --date=
1320                        --pretty= --format= --oneline
1321                        --cherry-pick
1322                        --graph
1323                        --decorate --decorate=
1324                        --walk-reflogs
1325                        --parents --children
1326                        $merge
1327                        $__git_diff_common_options
1328                        --pickaxe-all --pickaxe-regex
1329                        "
1330                return
1331                ;;
1332        esac
1333        __git_complete_revlist
1334}
1335
1336__git_merge_options="
1337        --no-commit --no-stat --log --no-log --squash --strategy
1338        --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1339"
1340
1341_git_merge ()
1342{
1343        __git_complete_strategy && return
1344
1345        case "$cur" in
1346        --*)
1347                __gitcomp "$__git_merge_options"
1348                return
1349        esac
1350        __gitcomp_nl "$(__git_refs)"
1351}
1352
1353_git_mergetool ()
1354{
1355        case "$cur" in
1356        --tool=*)
1357                __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1358                return
1359                ;;
1360        --*)
1361                __gitcomp "--tool="
1362                return
1363                ;;
1364        esac
1365        COMPREPLY=()
1366}
1367
1368_git_merge_base ()
1369{
1370        __gitcomp_nl "$(__git_refs)"
1371}
1372
1373_git_mv ()
1374{
1375        case "$cur" in
1376        --*)
1377                __gitcomp "--dry-run"
1378                return
1379                ;;
1380        esac
1381        COMPREPLY=()
1382}
1383
1384_git_name_rev ()
1385{
1386        __gitcomp "--tags --all --stdin"
1387}
1388
1389_git_notes ()
1390{
1391        local subcommands='add append copy edit list prune remove show'
1392        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1393
1394        case "$subcommand,$cur" in
1395        ,--*)
1396                __gitcomp '--ref'
1397                ;;
1398        ,*)
1399                case "$prev" in
1400                --ref)
1401                        __gitcomp_nl "$(__git_refs)"
1402                        ;;
1403                *)
1404                        __gitcomp "$subcommands --ref"
1405                        ;;
1406                esac
1407                ;;
1408        add,--reuse-message=*|append,--reuse-message=*|\
1409        add,--reedit-message=*|append,--reedit-message=*)
1410                __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1411                ;;
1412        add,--*|append,--*)
1413                __gitcomp '--file= --message= --reedit-message=
1414                                --reuse-message='
1415                ;;
1416        copy,--*)
1417                __gitcomp '--stdin'
1418                ;;
1419        prune,--*)
1420                __gitcomp '--dry-run --verbose'
1421                ;;
1422        prune,*)
1423                ;;
1424        *)
1425                case "$prev" in
1426                -m|-F)
1427                        ;;
1428                *)
1429                        __gitcomp_nl "$(__git_refs)"
1430                        ;;
1431                esac
1432                ;;
1433        esac
1434}
1435
1436_git_pull ()
1437{
1438        __git_complete_strategy && return
1439
1440        case "$cur" in
1441        --*)
1442                __gitcomp "
1443                        --rebase --no-rebase
1444                        $__git_merge_options
1445                        $__git_fetch_options
1446                "
1447                return
1448                ;;
1449        esac
1450        __git_complete_remote_or_refspec
1451}
1452
1453_git_push ()
1454{
1455        case "$prev" in
1456        --repo)
1457                __gitcomp_nl "$(__git_remotes)"
1458                return
1459        esac
1460        case "$cur" in
1461        --repo=*)
1462                __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1463                return
1464                ;;
1465        --*)
1466                __gitcomp "
1467                        --all --mirror --tags --dry-run --force --verbose
1468                        --receive-pack= --repo= --set-upstream
1469                "
1470                return
1471                ;;
1472        esac
1473        __git_complete_remote_or_refspec
1474}
1475
1476_git_rebase ()
1477{
1478        local dir="$(__gitdir)"
1479        if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1480                __gitcomp "--continue --skip --abort"
1481                return
1482        fi
1483        __git_complete_strategy && return
1484        case "$cur" in
1485        --whitespace=*)
1486                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1487                return
1488                ;;
1489        --*)
1490                __gitcomp "
1491                        --onto --merge --strategy --interactive
1492                        --preserve-merges --stat --no-stat
1493                        --committer-date-is-author-date --ignore-date
1494                        --ignore-whitespace --whitespace=
1495                        --autosquash
1496                        "
1497
1498                return
1499        esac
1500        __gitcomp_nl "$(__git_refs)"
1501}
1502
1503_git_reflog ()
1504{
1505        local subcommands="show delete expire"
1506        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1507
1508        if [ -z "$subcommand" ]; then
1509                __gitcomp "$subcommands"
1510        else
1511                __gitcomp_nl "$(__git_refs)"
1512        fi
1513}
1514
1515__git_send_email_confirm_options="always never auto cc compose"
1516__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1517
1518_git_send_email ()
1519{
1520        case "$cur" in
1521        --confirm=*)
1522                __gitcomp "
1523                        $__git_send_email_confirm_options
1524                        " "" "${cur##--confirm=}"
1525                return
1526                ;;
1527        --suppress-cc=*)
1528                __gitcomp "
1529                        $__git_send_email_suppresscc_options
1530                        " "" "${cur##--suppress-cc=}"
1531
1532                return
1533                ;;
1534        --smtp-encryption=*)
1535                __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1536                return
1537                ;;
1538        --thread=*)
1539                __gitcomp "
1540                        deep shallow
1541                        " "" "${cur##--thread=}"
1542                return
1543                ;;
1544        --*)
1545                __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1546                        --compose --confirm= --dry-run --envelope-sender
1547                        --from --identity
1548                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1549                        --no-suppress-from --no-thread --quiet
1550                        --signed-off-by-cc --smtp-pass --smtp-server
1551                        --smtp-server-port --smtp-encryption= --smtp-user
1552                        --subject --suppress-cc= --suppress-from --thread --to
1553                        --validate --no-validate
1554                        $__git_format_patch_options"
1555                return
1556                ;;
1557        esac
1558        __git_complete_revlist
1559}
1560
1561_git_stage ()
1562{
1563        _git_add
1564}
1565
1566__git_config_get_set_variables ()
1567{
1568        local prevword word config_file= c=$cword
1569        while [ $c -gt 1 ]; do
1570                word="${words[c]}"
1571                case "$word" in
1572                --global|--system|--file=*)
1573                        config_file="$word"
1574                        break
1575                        ;;
1576                -f|--file)
1577                        config_file="$word $prevword"
1578                        break
1579                        ;;
1580                esac
1581                prevword=$word
1582                c=$((--c))
1583        done
1584
1585        git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1586        while read -r line
1587        do
1588                case "$line" in
1589                *.*=*)
1590                        echo "${line/=*/}"
1591                        ;;
1592                esac
1593        done
1594}
1595
1596_git_config ()
1597{
1598        case "$prev" in
1599        branch.*.remote)
1600                __gitcomp_nl "$(__git_remotes)"
1601                return
1602                ;;
1603        branch.*.merge)
1604                __gitcomp_nl "$(__git_refs)"
1605                return
1606                ;;
1607        remote.*.fetch)
1608                local remote="${prev#remote.}"
1609                remote="${remote%.fetch}"
1610                if [ -z "$cur" ]; then
1611                        COMPREPLY=("refs/heads/")
1612                        return
1613                fi
1614                __gitcomp_nl "$(__git_refs_remotes "$remote")"
1615                return
1616                ;;
1617        remote.*.push)
1618                local remote="${prev#remote.}"
1619                remote="${remote%.push}"
1620                __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1621                        for-each-ref --format='%(refname):%(refname)' \
1622                        refs/heads)"
1623                return
1624                ;;
1625        pull.twohead|pull.octopus)
1626                __git_compute_merge_strategies
1627                __gitcomp "$__git_merge_strategies"
1628                return
1629                ;;
1630        color.branch|color.diff|color.interactive|\
1631        color.showbranch|color.status|color.ui)
1632                __gitcomp "always never auto"
1633                return
1634                ;;
1635        color.pager)
1636                __gitcomp "false true"
1637                return
1638                ;;
1639        color.*.*)
1640                __gitcomp "
1641                        normal black red green yellow blue magenta cyan white
1642                        bold dim ul blink reverse
1643                        "
1644                return
1645                ;;
1646        help.format)
1647                __gitcomp "man info web html"
1648                return
1649                ;;
1650        log.date)
1651                __gitcomp "$__git_log_date_formats"
1652                return
1653                ;;
1654        sendemail.aliasesfiletype)
1655                __gitcomp "mutt mailrc pine elm gnus"
1656                return
1657                ;;
1658        sendemail.confirm)
1659                __gitcomp "$__git_send_email_confirm_options"
1660                return
1661                ;;
1662        sendemail.suppresscc)
1663                __gitcomp "$__git_send_email_suppresscc_options"
1664                return
1665                ;;
1666        --get|--get-all|--unset|--unset-all)
1667                __gitcomp_nl "$(__git_config_get_set_variables)"
1668                return
1669                ;;
1670        *.*)
1671                COMPREPLY=()
1672                return
1673                ;;
1674        esac
1675        case "$cur" in
1676        --*)
1677                __gitcomp "
1678                        --global --system --file=
1679                        --list --replace-all
1680                        --get --get-all --get-regexp
1681                        --add --unset --unset-all
1682                        --remove-section --rename-section
1683                        "
1684                return
1685                ;;
1686        branch.*.*)
1687                local pfx="${cur%.*}." cur_="${cur##*.}"
1688                __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
1689                return
1690                ;;
1691        branch.*)
1692                local pfx="${cur%.*}." cur_="${cur#*.}"
1693                __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1694                return
1695                ;;
1696        guitool.*.*)
1697                local pfx="${cur%.*}." cur_="${cur##*.}"
1698                __gitcomp "
1699                        argprompt cmd confirm needsfile noconsole norescan
1700                        prompt revprompt revunmerged title
1701                        " "$pfx" "$cur_"
1702                return
1703                ;;
1704        difftool.*.*)
1705                local pfx="${cur%.*}." cur_="${cur##*.}"
1706                __gitcomp "cmd path" "$pfx" "$cur_"
1707                return
1708                ;;
1709        man.*.*)
1710                local pfx="${cur%.*}." cur_="${cur##*.}"
1711                __gitcomp "cmd path" "$pfx" "$cur_"
1712                return
1713                ;;
1714        mergetool.*.*)
1715                local pfx="${cur%.*}." cur_="${cur##*.}"
1716                __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1717                return
1718                ;;
1719        pager.*)
1720                local pfx="${cur%.*}." cur_="${cur#*.}"
1721                __git_compute_all_commands
1722                __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1723                return
1724                ;;
1725        remote.*.*)
1726                local pfx="${cur%.*}." cur_="${cur##*.}"
1727                __gitcomp "
1728                        url proxy fetch push mirror skipDefaultUpdate
1729                        receivepack uploadpack tagopt pushurl
1730                        " "$pfx" "$cur_"
1731                return
1732                ;;
1733        remote.*)
1734                local pfx="${cur%.*}." cur_="${cur#*.}"
1735                __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1736                return
1737                ;;
1738        url.*.*)
1739                local pfx="${cur%.*}." cur_="${cur##*.}"
1740                __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1741                return
1742                ;;
1743        esac
1744        __gitcomp "
1745                add.ignoreErrors
1746                advice.commitBeforeMerge
1747                advice.detachedHead
1748                advice.implicitIdentity
1749                advice.pushNonFastForward
1750                advice.resolveConflict
1751                advice.statusHints
1752                alias.
1753                am.keepcr
1754                apply.ignorewhitespace
1755                apply.whitespace
1756                branch.autosetupmerge
1757                branch.autosetuprebase
1758                browser.
1759                clean.requireForce
1760                color.branch
1761                color.branch.current
1762                color.branch.local
1763                color.branch.plain
1764                color.branch.remote
1765                color.decorate.HEAD
1766                color.decorate.branch
1767                color.decorate.remoteBranch
1768                color.decorate.stash
1769                color.decorate.tag
1770                color.diff
1771                color.diff.commit
1772                color.diff.frag
1773                color.diff.func
1774                color.diff.meta
1775                color.diff.new
1776                color.diff.old
1777                color.diff.plain
1778                color.diff.whitespace
1779                color.grep
1780                color.grep.context
1781                color.grep.filename
1782                color.grep.function
1783                color.grep.linenumber
1784                color.grep.match
1785                color.grep.selected
1786                color.grep.separator
1787                color.interactive
1788                color.interactive.error
1789                color.interactive.header
1790                color.interactive.help
1791                color.interactive.prompt
1792                color.pager
1793                color.showbranch
1794                color.status
1795                color.status.added
1796                color.status.changed
1797                color.status.header
1798                color.status.nobranch
1799                color.status.untracked
1800                color.status.updated
1801                color.ui
1802                commit.status
1803                commit.template
1804                core.abbrev
1805                core.askpass
1806                core.attributesfile
1807                core.autocrlf
1808                core.bare
1809                core.bigFileThreshold
1810                core.compression
1811                core.createObject
1812                core.deltaBaseCacheLimit
1813                core.editor
1814                core.eol
1815                core.excludesfile
1816                core.fileMode
1817                core.fsyncobjectfiles
1818                core.gitProxy
1819                core.ignoreCygwinFSTricks
1820                core.ignoreStat
1821                core.ignorecase
1822                core.logAllRefUpdates
1823                core.loosecompression
1824                core.notesRef
1825                core.packedGitLimit
1826                core.packedGitWindowSize
1827                core.pager
1828                core.preferSymlinkRefs
1829                core.preloadindex
1830                core.quotepath
1831                core.repositoryFormatVersion
1832                core.safecrlf
1833                core.sharedRepository
1834                core.sparseCheckout
1835                core.symlinks
1836                core.trustctime
1837                core.warnAmbiguousRefs
1838                core.whitespace
1839                core.worktree
1840                diff.autorefreshindex
1841                diff.statGraphWidth
1842                diff.external
1843                diff.ignoreSubmodules
1844                diff.mnemonicprefix
1845                diff.noprefix
1846                diff.renameLimit
1847                diff.renames
1848                diff.suppressBlankEmpty
1849                diff.tool
1850                diff.wordRegex
1851                difftool.
1852                difftool.prompt
1853                fetch.recurseSubmodules
1854                fetch.unpackLimit
1855                format.attach
1856                format.cc
1857                format.headers
1858                format.numbered
1859                format.pretty
1860                format.signature
1861                format.signoff
1862                format.subjectprefix
1863                format.suffix
1864                format.thread
1865                format.to
1866                gc.
1867                gc.aggressiveWindow
1868                gc.auto
1869                gc.autopacklimit
1870                gc.packrefs
1871                gc.pruneexpire
1872                gc.reflogexpire
1873                gc.reflogexpireunreachable
1874                gc.rerereresolved
1875                gc.rerereunresolved
1876                gitcvs.allbinary
1877                gitcvs.commitmsgannotation
1878                gitcvs.dbTableNamePrefix
1879                gitcvs.dbdriver
1880                gitcvs.dbname
1881                gitcvs.dbpass
1882                gitcvs.dbuser
1883                gitcvs.enabled
1884                gitcvs.logfile
1885                gitcvs.usecrlfattr
1886                guitool.
1887                gui.blamehistoryctx
1888                gui.commitmsgwidth
1889                gui.copyblamethreshold
1890                gui.diffcontext
1891                gui.encoding
1892                gui.fastcopyblame
1893                gui.matchtrackingbranch
1894                gui.newbranchtemplate
1895                gui.pruneduringfetch
1896                gui.spellingdictionary
1897                gui.trustmtime
1898                help.autocorrect
1899                help.browser
1900                help.format
1901                http.lowSpeedLimit
1902                http.lowSpeedTime
1903                http.maxRequests
1904                http.minSessions
1905                http.noEPSV
1906                http.postBuffer
1907                http.proxy
1908                http.sslCAInfo
1909                http.sslCAPath
1910                http.sslCert
1911                http.sslCertPasswordProtected
1912                http.sslKey
1913                http.sslVerify
1914                http.useragent
1915                i18n.commitEncoding
1916                i18n.logOutputEncoding
1917                imap.authMethod
1918                imap.folder
1919                imap.host
1920                imap.pass
1921                imap.port
1922                imap.preformattedHTML
1923                imap.sslverify
1924                imap.tunnel
1925                imap.user
1926                init.templatedir
1927                instaweb.browser
1928                instaweb.httpd
1929                instaweb.local
1930                instaweb.modulepath
1931                instaweb.port
1932                interactive.singlekey
1933                log.date
1934                log.decorate
1935                log.showroot
1936                mailmap.file
1937                man.
1938                man.viewer
1939                merge.
1940                merge.conflictstyle
1941                merge.log
1942                merge.renameLimit
1943                merge.renormalize
1944                merge.stat
1945                merge.tool
1946                merge.verbosity
1947                mergetool.
1948                mergetool.keepBackup
1949                mergetool.keepTemporaries
1950                mergetool.prompt
1951                notes.displayRef
1952                notes.rewrite.
1953                notes.rewrite.amend
1954                notes.rewrite.rebase
1955                notes.rewriteMode
1956                notes.rewriteRef
1957                pack.compression
1958                pack.deltaCacheLimit
1959                pack.deltaCacheSize
1960                pack.depth
1961                pack.indexVersion
1962                pack.packSizeLimit
1963                pack.threads
1964                pack.window
1965                pack.windowMemory
1966                pager.
1967                pretty.
1968                pull.octopus
1969                pull.twohead
1970                push.default
1971                rebase.autosquash
1972                rebase.stat
1973                receive.autogc
1974                receive.denyCurrentBranch
1975                receive.denyDeleteCurrent
1976                receive.denyDeletes
1977                receive.denyNonFastForwards
1978                receive.fsckObjects
1979                receive.unpackLimit
1980                receive.updateserverinfo
1981                remotes.
1982                repack.usedeltabaseoffset
1983                rerere.autoupdate
1984                rerere.enabled
1985                sendemail.
1986                sendemail.aliasesfile
1987                sendemail.aliasfiletype
1988                sendemail.bcc
1989                sendemail.cc
1990                sendemail.cccmd
1991                sendemail.chainreplyto
1992                sendemail.confirm
1993                sendemail.envelopesender
1994                sendemail.from
1995                sendemail.identity
1996                sendemail.multiedit
1997                sendemail.signedoffbycc
1998                sendemail.smtpdomain
1999                sendemail.smtpencryption
2000                sendemail.smtppass
2001                sendemail.smtpserver
2002                sendemail.smtpserveroption
2003                sendemail.smtpserverport
2004                sendemail.smtpuser
2005                sendemail.suppresscc
2006                sendemail.suppressfrom
2007                sendemail.thread
2008                sendemail.to
2009                sendemail.validate
2010                showbranch.default
2011                status.relativePaths
2012                status.showUntrackedFiles
2013                status.submodulesummary
2014                submodule.
2015                tar.umask
2016                transfer.unpackLimit
2017                url.
2018                user.email
2019                user.name
2020                user.signingkey
2021                web.browser
2022                branch. remote.
2023        "
2024}
2025
2026_git_remote ()
2027{
2028        local subcommands="add rename remove set-head set-branches set-url show prune update"
2029        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2030        if [ -z "$subcommand" ]; then
2031                __gitcomp "$subcommands"
2032                return
2033        fi
2034
2035        case "$subcommand" in
2036        rename|remove|set-url|show|prune)
2037                __gitcomp_nl "$(__git_remotes)"
2038                ;;
2039        set-head|set-branches)
2040                __git_complete_remote_or_refspec
2041                ;;
2042        update)
2043                local i c='' IFS=$'\n'
2044                for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2045                        i="${i#remotes.}"
2046                        c="$c ${i/ */}"
2047                done
2048                __gitcomp "$c"
2049                ;;
2050        *)
2051                COMPREPLY=()
2052                ;;
2053        esac
2054}
2055
2056_git_replace ()
2057{
2058        __gitcomp_nl "$(__git_refs)"
2059}
2060
2061_git_reset ()
2062{
2063        __git_has_doubledash && return
2064
2065        case "$cur" in
2066        --*)
2067                __gitcomp "--merge --mixed --hard --soft --patch"
2068                return
2069                ;;
2070        esac
2071        __gitcomp_nl "$(__git_refs)"
2072}
2073
2074_git_revert ()
2075{
2076        case "$cur" in
2077        --*)
2078                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2079                return
2080                ;;
2081        esac
2082        __gitcomp_nl "$(__git_refs)"
2083}
2084
2085_git_rm ()
2086{
2087        __git_has_doubledash && return
2088
2089        case "$cur" in
2090        --*)
2091                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2092                return
2093                ;;
2094        esac
2095        COMPREPLY=()
2096}
2097
2098_git_shortlog ()
2099{
2100        __git_has_doubledash && return
2101
2102        case "$cur" in
2103        --*)
2104                __gitcomp "
2105                        $__git_log_common_options
2106                        $__git_log_shortlog_options
2107                        --numbered --summary
2108                        "
2109                return
2110                ;;
2111        esac
2112        __git_complete_revlist
2113}
2114
2115_git_show ()
2116{
2117        __git_has_doubledash && return
2118
2119        case "$cur" in
2120        --pretty=*|--format=*)
2121                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2122                        " "" "${cur#*=}"
2123                return
2124                ;;
2125        --*)
2126                __gitcomp "--pretty= --format= --abbrev-commit --oneline
2127                        $__git_diff_common_options
2128                        "
2129                return
2130                ;;
2131        esac
2132        __git_complete_file
2133}
2134
2135_git_show_branch ()
2136{
2137        case "$cur" in
2138        --*)
2139                __gitcomp "
2140                        --all --remotes --topo-order --current --more=
2141                        --list --independent --merge-base --no-name
2142                        --color --no-color
2143                        --sha1-name --sparse --topics --reflog
2144                        "
2145                return
2146                ;;
2147        esac
2148        __git_complete_revlist
2149}
2150
2151_git_stash ()
2152{
2153        local save_opts='--keep-index --no-keep-index --quiet --patch'
2154        local subcommands='save list show apply clear drop pop create branch'
2155        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2156        if [ -z "$subcommand" ]; then
2157                case "$cur" in
2158                --*)
2159                        __gitcomp "$save_opts"
2160                        ;;
2161                *)
2162                        if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2163                                __gitcomp "$subcommands"
2164                        else
2165                                COMPREPLY=()
2166                        fi
2167                        ;;
2168                esac
2169        else
2170                case "$subcommand,$cur" in
2171                save,--*)
2172                        __gitcomp "$save_opts"
2173                        ;;
2174                apply,--*|pop,--*)
2175                        __gitcomp "--index --quiet"
2176                        ;;
2177                show,--*|drop,--*|branch,--*)
2178                        COMPREPLY=()
2179                        ;;
2180                show,*|apply,*|drop,*|pop,*|branch,*)
2181                        __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2182                                        | sed -n -e 's/:.*//p')"
2183                        ;;
2184                *)
2185                        COMPREPLY=()
2186                        ;;
2187                esac
2188        fi
2189}
2190
2191_git_submodule ()
2192{
2193        __git_has_doubledash && return
2194
2195        local subcommands="add status init update summary foreach sync"
2196        if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2197                case "$cur" in
2198                --*)
2199                        __gitcomp "--quiet --cached"
2200                        ;;
2201                *)
2202                        __gitcomp "$subcommands"
2203                        ;;
2204                esac
2205                return
2206        fi
2207}
2208
2209_git_svn ()
2210{
2211        local subcommands="
2212                init fetch clone rebase dcommit log find-rev
2213                set-tree commit-diff info create-ignore propget
2214                proplist show-ignore show-externals branch tag blame
2215                migrate mkdirs reset gc
2216                "
2217        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2218        if [ -z "$subcommand" ]; then
2219                __gitcomp "$subcommands"
2220        else
2221                local remote_opts="--username= --config-dir= --no-auth-cache"
2222                local fc_opts="
2223                        --follow-parent --authors-file= --repack=
2224                        --no-metadata --use-svm-props --use-svnsync-props
2225                        --log-window-size= --no-checkout --quiet
2226                        --repack-flags --use-log-author --localtime
2227                        --ignore-paths= $remote_opts
2228                        "
2229                local init_opts="
2230                        --template= --shared= --trunk= --tags=
2231                        --branches= --stdlayout --minimize-url
2232                        --no-metadata --use-svm-props --use-svnsync-props
2233                        --rewrite-root= --prefix= --use-log-author
2234                        --add-author-from $remote_opts
2235                        "
2236                local cmt_opts="
2237                        --edit --rmdir --find-copies-harder --copy-similarity=
2238                        "
2239
2240                case "$subcommand,$cur" in
2241                fetch,--*)
2242                        __gitcomp "--revision= --fetch-all $fc_opts"
2243                        ;;
2244                clone,--*)
2245                        __gitcomp "--revision= $fc_opts $init_opts"
2246                        ;;
2247                init,--*)
2248                        __gitcomp "$init_opts"
2249                        ;;
2250                dcommit,--*)
2251                        __gitcomp "
2252                                --merge --strategy= --verbose --dry-run
2253                                --fetch-all --no-rebase --commit-url
2254                                --revision --interactive $cmt_opts $fc_opts
2255                                "
2256                        ;;
2257                set-tree,--*)
2258                        __gitcomp "--stdin $cmt_opts $fc_opts"
2259                        ;;
2260                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2261                show-externals,--*|mkdirs,--*)
2262                        __gitcomp "--revision="
2263                        ;;
2264                log,--*)
2265                        __gitcomp "
2266                                --limit= --revision= --verbose --incremental
2267                                --oneline --show-commit --non-recursive
2268                                --authors-file= --color
2269                                "
2270                        ;;
2271                rebase,--*)
2272                        __gitcomp "
2273                                --merge --verbose --strategy= --local
2274                                --fetch-all --dry-run $fc_opts
2275                                "
2276                        ;;
2277                commit-diff,--*)
2278                        __gitcomp "--message= --file= --revision= $cmt_opts"
2279                        ;;
2280                info,--*)
2281                        __gitcomp "--url"
2282                        ;;
2283                branch,--*)
2284                        __gitcomp "--dry-run --message --tag"
2285                        ;;
2286                tag,--*)
2287                        __gitcomp "--dry-run --message"
2288                        ;;
2289                blame,--*)
2290                        __gitcomp "--git-format"
2291                        ;;
2292                migrate,--*)
2293                        __gitcomp "
2294                                --config-dir= --ignore-paths= --minimize
2295                                --no-auth-cache --username=
2296                                "
2297                        ;;
2298                reset,--*)
2299                        __gitcomp "--revision= --parent"
2300                        ;;
2301                *)
2302                        COMPREPLY=()
2303                        ;;
2304                esac
2305        fi
2306}
2307
2308_git_tag ()
2309{
2310        local i c=1 f=0
2311        while [ $c -lt $cword ]; do
2312                i="${words[c]}"
2313                case "$i" in
2314                -d|-v)
2315                        __gitcomp_nl "$(__git_tags)"
2316                        return
2317                        ;;
2318                -f)
2319                        f=1
2320                        ;;
2321                esac
2322                ((c++))
2323        done
2324
2325        case "$prev" in
2326        -m|-F)
2327                COMPREPLY=()
2328                ;;
2329        -*|tag)
2330                if [ $f = 1 ]; then
2331                        __gitcomp_nl "$(__git_tags)"
2332                else
2333                        COMPREPLY=()
2334                fi
2335                ;;
2336        *)
2337                __gitcomp_nl "$(__git_refs)"
2338                ;;
2339        esac
2340}
2341
2342_git_whatchanged ()
2343{
2344        _git_log
2345}
2346
2347__git_main ()
2348{
2349        local i c=1 command __git_dir
2350
2351        while [ $c -lt $cword ]; do
2352                i="${words[c]}"
2353                case "$i" in
2354                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2355                --bare)      __git_dir="." ;;
2356                --help) command="help"; break ;;
2357                -c) c=$((++c)) ;;
2358                -*) ;;
2359                *) command="$i"; break ;;
2360                esac
2361                ((c++))
2362        done
2363
2364        if [ -z "$command" ]; then
2365                case "$cur" in
2366                --*)   __gitcomp "
2367                        --paginate
2368                        --no-pager
2369                        --git-dir=
2370                        --bare
2371                        --version
2372                        --exec-path
2373                        --exec-path=
2374                        --html-path
2375                        --info-path
2376                        --work-tree=
2377                        --namespace=
2378                        --no-replace-objects
2379                        --help
2380                        "
2381                        ;;
2382                *)     __git_compute_porcelain_commands
2383                       __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2384                esac
2385                return
2386        fi
2387
2388        local completion_func="_git_${command//-/_}"
2389        declare -f $completion_func >/dev/null && $completion_func && return
2390
2391        local expansion=$(__git_aliased_command "$command")
2392        if [ -n "$expansion" ]; then
2393                completion_func="_git_${expansion//-/_}"
2394                declare -f $completion_func >/dev/null && $completion_func
2395        fi
2396}
2397
2398__gitk_main ()
2399{
2400        __git_has_doubledash && return
2401
2402        local g="$(__gitdir)"
2403        local merge=""
2404        if [ -f "$g/MERGE_HEAD" ]; then
2405                merge="--merge"
2406        fi
2407        case "$cur" in
2408        --*)
2409                __gitcomp "
2410                        $__git_log_common_options
2411                        $__git_log_gitk_options
2412                        $merge
2413                        "
2414                return
2415                ;;
2416        esac
2417        __git_complete_revlist
2418}
2419
2420if [[ -n ${ZSH_VERSION-} ]]; then
2421        echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2422
2423        autoload -U +X compinit && compinit
2424
2425        __gitcomp ()
2426        {
2427                emulate -L zsh
2428
2429                local cur_="${3-$cur}"
2430
2431                case "$cur_" in
2432                --*=)
2433                        ;;
2434                *)
2435                        local c IFS=$' \t\n'
2436                        local -a array
2437                        for c in ${=1}; do
2438                                c="$c${4-}"
2439                                case $c in
2440                                --*=*|*.) ;;
2441                                *) c="$c " ;;
2442                                esac
2443                                array+=("$c")
2444                        done
2445                        compset -P '*[=:]'
2446                        compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2447                        ;;
2448                esac
2449        }
2450
2451        __gitcomp_nl ()
2452        {
2453                emulate -L zsh
2454
2455                local IFS=$'\n'
2456                compset -P '*[=:]'
2457                compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2458        }
2459
2460        __git_zsh_helper ()
2461        {
2462                emulate -L ksh
2463                local cur cword prev
2464                cur=${words[CURRENT-1]}
2465                prev=${words[CURRENT-2]}
2466                let cword=CURRENT-1
2467                __${service}_main
2468        }
2469
2470        _git ()
2471        {
2472                emulate -L zsh
2473                local _ret=1
2474                __git_zsh_helper
2475                let _ret && _default -S '' && _ret=0
2476                return _ret
2477        }
2478
2479        compdef _git git gitk
2480        return
2481fi
2482
2483__git_func_wrap ()
2484{
2485        local cur words cword prev
2486        _get_comp_words_by_ref -n =: cur words cword prev
2487        $1
2488}
2489
2490# Setup completion for certain functions defined above by setting common
2491# variables and workarounds.
2492# This is NOT a public function; use at your own risk.
2493__git_complete ()
2494{
2495        local wrapper="__git_wrap${2}"
2496        eval "$wrapper () { __git_func_wrap $2 ; }"
2497        complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2498                || complete -o default -o nospace -F $wrapper $1
2499}
2500
2501# wrapper for backwards compatibility
2502_git ()
2503{
2504        __git_wrap__git_main
2505}
2506
2507# wrapper for backwards compatibility
2508_gitk ()
2509{
2510        __git_wrap__gitk_main
2511}
2512
2513__git_complete git __git_main
2514__git_complete gitk __gitk_main
2515
2516# The following are necessary only for Cygwin, and only are needed
2517# when the user has tab-completed the executable name and consequently
2518# included the '.exe' suffix.
2519#
2520if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2521__git_complete git.exe __git_main
2522fi