contrib / completion / git-completion.bashon commit config: Introduce diff.algorithm variable (07ab4de)
   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_list_all_commands ()
 535{
 536        local i IFS=" "$'\n'
 537        for i in $(git help -a|egrep '^  [a-zA-Z0-9]')
 538        do
 539                case $i in
 540                *--*)             : helper pattern;;
 541                *) echo $i;;
 542                esac
 543        done
 544}
 545
 546__git_all_commands=
 547__git_compute_all_commands ()
 548{
 549        test -n "$__git_all_commands" ||
 550        __git_all_commands=$(__git_list_all_commands)
 551}
 552
 553__git_list_porcelain_commands ()
 554{
 555        local i IFS=" "$'\n'
 556        __git_compute_all_commands
 557        for i in $__git_all_commands
 558        do
 559                case $i in
 560                *--*)             : helper pattern;;
 561                applymbox)        : ask gittus;;
 562                applypatch)       : ask gittus;;
 563                archimport)       : import;;
 564                cat-file)         : plumbing;;
 565                check-attr)       : plumbing;;
 566                check-ref-format) : plumbing;;
 567                checkout-index)   : plumbing;;
 568                commit-tree)      : plumbing;;
 569                count-objects)    : infrequent;;
 570                credential-cache) : credentials helper;;
 571                credential-store) : credentials helper;;
 572                cvsexportcommit)  : export;;
 573                cvsimport)        : import;;
 574                cvsserver)        : daemon;;
 575                daemon)           : daemon;;
 576                diff-files)       : plumbing;;
 577                diff-index)       : plumbing;;
 578                diff-tree)        : plumbing;;
 579                fast-import)      : import;;
 580                fast-export)      : export;;
 581                fsck-objects)     : plumbing;;
 582                fetch-pack)       : plumbing;;
 583                fmt-merge-msg)    : plumbing;;
 584                for-each-ref)     : plumbing;;
 585                hash-object)      : plumbing;;
 586                http-*)           : transport;;
 587                index-pack)       : plumbing;;
 588                init-db)          : deprecated;;
 589                local-fetch)      : plumbing;;
 590                lost-found)       : infrequent;;
 591                ls-files)         : plumbing;;
 592                ls-remote)        : plumbing;;
 593                ls-tree)          : plumbing;;
 594                mailinfo)         : plumbing;;
 595                mailsplit)        : plumbing;;
 596                merge-*)          : plumbing;;
 597                mktree)           : plumbing;;
 598                mktag)            : plumbing;;
 599                pack-objects)     : plumbing;;
 600                pack-redundant)   : plumbing;;
 601                pack-refs)        : plumbing;;
 602                parse-remote)     : plumbing;;
 603                patch-id)         : plumbing;;
 604                peek-remote)      : plumbing;;
 605                prune)            : plumbing;;
 606                prune-packed)     : plumbing;;
 607                quiltimport)      : import;;
 608                read-tree)        : plumbing;;
 609                receive-pack)     : plumbing;;
 610                remote-*)         : transport;;
 611                repo-config)      : deprecated;;
 612                rerere)           : plumbing;;
 613                rev-list)         : plumbing;;
 614                rev-parse)        : plumbing;;
 615                runstatus)        : plumbing;;
 616                sh-setup)         : internal;;
 617                shell)            : daemon;;
 618                show-ref)         : plumbing;;
 619                send-pack)        : plumbing;;
 620                show-index)       : plumbing;;
 621                ssh-*)            : transport;;
 622                stripspace)       : plumbing;;
 623                symbolic-ref)     : plumbing;;
 624                tar-tree)         : deprecated;;
 625                unpack-file)      : plumbing;;
 626                unpack-objects)   : plumbing;;
 627                update-index)     : plumbing;;
 628                update-ref)       : plumbing;;
 629                update-server-info) : daemon;;
 630                upload-archive)   : plumbing;;
 631                upload-pack)      : plumbing;;
 632                write-tree)       : plumbing;;
 633                var)              : infrequent;;
 634                verify-pack)      : infrequent;;
 635                verify-tag)       : plumbing;;
 636                *) echo $i;;
 637                esac
 638        done
 639}
 640
 641__git_porcelain_commands=
 642__git_compute_porcelain_commands ()
 643{
 644        __git_compute_all_commands
 645        test -n "$__git_porcelain_commands" ||
 646        __git_porcelain_commands=$(__git_list_porcelain_commands)
 647}
 648
 649__git_pretty_aliases ()
 650{
 651        local i IFS=$'\n'
 652        for i in $(git --git-dir="$(__gitdir)" config --get-regexp "pretty\..*" 2>/dev/null); do
 653                case "$i" in
 654                pretty.*)
 655                        i="${i#pretty.}"
 656                        echo "${i/ */}"
 657                        ;;
 658                esac
 659        done
 660}
 661
 662__git_aliases ()
 663{
 664        local i IFS=$'\n'
 665        for i in $(git --git-dir="$(__gitdir)" config --get-regexp "alias\..*" 2>/dev/null); do
 666                case "$i" in
 667                alias.*)
 668                        i="${i#alias.}"
 669                        echo "${i/ */}"
 670                        ;;
 671                esac
 672        done
 673}
 674
 675# __git_aliased_command requires 1 argument
 676__git_aliased_command ()
 677{
 678        local word cmdline=$(git --git-dir="$(__gitdir)" \
 679                config --get "alias.$1")
 680        for word in $cmdline; do
 681                case "$word" in
 682                \!gitk|gitk)
 683                        echo "gitk"
 684                        return
 685                        ;;
 686                \!*)    : shell command alias ;;
 687                -*)     : option ;;
 688                *=*)    : setting env ;;
 689                git)    : git itself ;;
 690                *)
 691                        echo "$word"
 692                        return
 693                esac
 694        done
 695}
 696
 697# __git_find_on_cmdline requires 1 argument
 698__git_find_on_cmdline ()
 699{
 700        local word subcommand c=1
 701        while [ $c -lt $cword ]; do
 702                word="${words[c]}"
 703                for subcommand in $1; do
 704                        if [ "$subcommand" = "$word" ]; then
 705                                echo "$subcommand"
 706                                return
 707                        fi
 708                done
 709                ((c++))
 710        done
 711}
 712
 713__git_has_doubledash ()
 714{
 715        local c=1
 716        while [ $c -lt $cword ]; do
 717                if [ "--" = "${words[c]}" ]; then
 718                        return 0
 719                fi
 720                ((c++))
 721        done
 722        return 1
 723}
 724
 725__git_whitespacelist="nowarn warn error error-all fix"
 726
 727_git_am ()
 728{
 729        local dir="$(__gitdir)"
 730        if [ -d "$dir"/rebase-apply ]; then
 731                __gitcomp "--skip --continue --resolved --abort"
 732                return
 733        fi
 734        case "$cur" in
 735        --whitespace=*)
 736                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 737                return
 738                ;;
 739        --*)
 740                __gitcomp "
 741                        --3way --committer-date-is-author-date --ignore-date
 742                        --ignore-whitespace --ignore-space-change
 743                        --interactive --keep --no-utf8 --signoff --utf8
 744                        --whitespace= --scissors
 745                        "
 746                return
 747        esac
 748        COMPREPLY=()
 749}
 750
 751_git_apply ()
 752{
 753        case "$cur" in
 754        --whitespace=*)
 755                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 756                return
 757                ;;
 758        --*)
 759                __gitcomp "
 760                        --stat --numstat --summary --check --index
 761                        --cached --index-info --reverse --reject --unidiff-zero
 762                        --apply --no-add --exclude=
 763                        --ignore-whitespace --ignore-space-change
 764                        --whitespace= --inaccurate-eof --verbose
 765                        "
 766                return
 767        esac
 768        COMPREPLY=()
 769}
 770
 771_git_add ()
 772{
 773        __git_has_doubledash && return
 774
 775        case "$cur" in
 776        --*)
 777                __gitcomp "
 778                        --interactive --refresh --patch --update --dry-run
 779                        --ignore-errors --intent-to-add
 780                        "
 781                return
 782        esac
 783        COMPREPLY=()
 784}
 785
 786_git_archive ()
 787{
 788        case "$cur" in
 789        --format=*)
 790                __gitcomp "$(git archive --list)" "" "${cur##--format=}"
 791                return
 792                ;;
 793        --remote=*)
 794                __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
 795                return
 796                ;;
 797        --*)
 798                __gitcomp "
 799                        --format= --list --verbose
 800                        --prefix= --remote= --exec=
 801                        "
 802                return
 803                ;;
 804        esac
 805        __git_complete_file
 806}
 807
 808_git_bisect ()
 809{
 810        __git_has_doubledash && return
 811
 812        local subcommands="start bad good skip reset visualize replay log run"
 813        local subcommand="$(__git_find_on_cmdline "$subcommands")"
 814        if [ -z "$subcommand" ]; then
 815                if [ -f "$(__gitdir)"/BISECT_START ]; then
 816                        __gitcomp "$subcommands"
 817                else
 818                        __gitcomp "replay start"
 819                fi
 820                return
 821        fi
 822
 823        case "$subcommand" in
 824        bad|good|reset|skip|start)
 825                __gitcomp_nl "$(__git_refs)"
 826                ;;
 827        *)
 828                COMPREPLY=()
 829                ;;
 830        esac
 831}
 832
 833_git_branch ()
 834{
 835        local i c=1 only_local_ref="n" has_r="n"
 836
 837        while [ $c -lt $cword ]; do
 838                i="${words[c]}"
 839                case "$i" in
 840                -d|-m)  only_local_ref="y" ;;
 841                -r)     has_r="y" ;;
 842                esac
 843                ((c++))
 844        done
 845
 846        case "$cur" in
 847        --set-upstream-to=*)
 848                __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}"
 849                ;;
 850        --*)
 851                __gitcomp "
 852                        --color --no-color --verbose --abbrev= --no-abbrev
 853                        --track --no-track --contains --merged --no-merged
 854                        --set-upstream-to= --edit-description --list
 855                        --unset-upstream
 856                        "
 857                ;;
 858        *)
 859                if [ $only_local_ref = "y" -a $has_r = "n" ]; then
 860                        __gitcomp_nl "$(__git_heads)"
 861                else
 862                        __gitcomp_nl "$(__git_refs)"
 863                fi
 864                ;;
 865        esac
 866}
 867
 868_git_bundle ()
 869{
 870        local cmd="${words[2]}"
 871        case "$cword" in
 872        2)
 873                __gitcomp "create list-heads verify unbundle"
 874                ;;
 875        3)
 876                # looking for a file
 877                ;;
 878        *)
 879                case "$cmd" in
 880                        create)
 881                                __git_complete_revlist
 882                        ;;
 883                esac
 884                ;;
 885        esac
 886}
 887
 888_git_checkout ()
 889{
 890        __git_has_doubledash && return
 891
 892        case "$cur" in
 893        --conflict=*)
 894                __gitcomp "diff3 merge" "" "${cur##--conflict=}"
 895                ;;
 896        --*)
 897                __gitcomp "
 898                        --quiet --ours --theirs --track --no-track --merge
 899                        --conflict= --orphan --patch
 900                        "
 901                ;;
 902        *)
 903                # check if --track, --no-track, or --no-guess was specified
 904                # if so, disable DWIM mode
 905                local flags="--track --no-track --no-guess" track=1
 906                if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
 907                        track=''
 908                fi
 909                __gitcomp_nl "$(__git_refs '' $track)"
 910                ;;
 911        esac
 912}
 913
 914_git_cherry ()
 915{
 916        __gitcomp "$(__git_refs)"
 917}
 918
 919_git_cherry_pick ()
 920{
 921        case "$cur" in
 922        --*)
 923                __gitcomp "--edit --no-commit"
 924                ;;
 925        *)
 926                __gitcomp_nl "$(__git_refs)"
 927                ;;
 928        esac
 929}
 930
 931_git_clean ()
 932{
 933        __git_has_doubledash && return
 934
 935        case "$cur" in
 936        --*)
 937                __gitcomp "--dry-run --quiet"
 938                return
 939                ;;
 940        esac
 941        COMPREPLY=()
 942}
 943
 944_git_clone ()
 945{
 946        case "$cur" in
 947        --*)
 948                __gitcomp "
 949                        --local
 950                        --no-hardlinks
 951                        --shared
 952                        --reference
 953                        --quiet
 954                        --no-checkout
 955                        --bare
 956                        --mirror
 957                        --origin
 958                        --upload-pack
 959                        --template=
 960                        --depth
 961                        --single-branch
 962                        --branch
 963                        "
 964                return
 965                ;;
 966        esac
 967        COMPREPLY=()
 968}
 969
 970_git_commit ()
 971{
 972        __git_has_doubledash && return
 973
 974        case "$prev" in
 975        -c|-C)
 976                __gitcomp_nl "$(__git_refs)" "" "${cur}"
 977                return
 978                ;;
 979        esac
 980
 981        case "$cur" in
 982        --cleanup=*)
 983                __gitcomp "default strip verbatim whitespace
 984                        " "" "${cur##--cleanup=}"
 985                return
 986                ;;
 987        --reuse-message=*|--reedit-message=*|\
 988        --fixup=*|--squash=*)
 989                __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
 990                return
 991                ;;
 992        --untracked-files=*)
 993                __gitcomp "all no normal" "" "${cur##--untracked-files=}"
 994                return
 995                ;;
 996        --*)
 997                __gitcomp "
 998                        --all --author= --signoff --verify --no-verify
 999                        --edit --no-edit
1000                        --amend --include --only --interactive
1001                        --dry-run --reuse-message= --reedit-message=
1002                        --reset-author --file= --message= --template=
1003                        --cleanup= --untracked-files --untracked-files=
1004                        --verbose --quiet --fixup= --squash=
1005                        "
1006                return
1007        esac
1008        COMPREPLY=()
1009}
1010
1011_git_describe ()
1012{
1013        case "$cur" in
1014        --*)
1015                __gitcomp "
1016                        --all --tags --contains --abbrev= --candidates=
1017                        --exact-match --debug --long --match --always
1018                        "
1019                return
1020        esac
1021        __gitcomp_nl "$(__git_refs)"
1022}
1023
1024__git_diff_common_options="--stat --numstat --shortstat --summary
1025                        --patch-with-stat --name-only --name-status --color
1026                        --no-color --color-words --no-renames --check
1027                        --full-index --binary --abbrev --diff-filter=
1028                        --find-copies-harder
1029                        --text --ignore-space-at-eol --ignore-space-change
1030                        --ignore-all-space --exit-code --quiet --ext-diff
1031                        --no-ext-diff
1032                        --no-prefix --src-prefix= --dst-prefix=
1033                        --inter-hunk-context=
1034                        --patience --histogram --minimal
1035                        --raw
1036                        --dirstat --dirstat= --dirstat-by-file
1037                        --dirstat-by-file= --cumulative
1038"
1039
1040_git_diff ()
1041{
1042        __git_has_doubledash && return
1043
1044        case "$cur" in
1045        --*)
1046                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1047                        --base --ours --theirs --no-index
1048                        $__git_diff_common_options
1049                        "
1050                return
1051                ;;
1052        esac
1053        __git_complete_revlist_file
1054}
1055
1056__git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
1057                        tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
1058"
1059
1060_git_difftool ()
1061{
1062        __git_has_doubledash && return
1063
1064        case "$cur" in
1065        --tool=*)
1066                __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1067                return
1068                ;;
1069        --*)
1070                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1071                        --base --ours --theirs
1072                        --no-renames --diff-filter= --find-copies-harder
1073                        --relative --ignore-submodules
1074                        --tool="
1075                return
1076                ;;
1077        esac
1078        __git_complete_file
1079}
1080
1081__git_fetch_options="
1082        --quiet --verbose --append --upload-pack --force --keep --depth=
1083        --tags --no-tags --all --prune --dry-run
1084"
1085
1086_git_fetch ()
1087{
1088        case "$cur" in
1089        --*)
1090                __gitcomp "$__git_fetch_options"
1091                return
1092                ;;
1093        esac
1094        __git_complete_remote_or_refspec
1095}
1096
1097__git_format_patch_options="
1098        --stdout --attach --no-attach --thread --thread= --output-directory
1099        --numbered --start-number --numbered-files --keep-subject --signoff
1100        --signature --no-signature --in-reply-to= --cc= --full-index --binary
1101        --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1102        --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1103"
1104
1105_git_format_patch ()
1106{
1107        case "$cur" in
1108        --thread=*)
1109                __gitcomp "
1110                        deep shallow
1111                        " "" "${cur##--thread=}"
1112                return
1113                ;;
1114        --*)
1115                __gitcomp "$__git_format_patch_options"
1116                return
1117                ;;
1118        esac
1119        __git_complete_revlist
1120}
1121
1122_git_fsck ()
1123{
1124        case "$cur" in
1125        --*)
1126                __gitcomp "
1127                        --tags --root --unreachable --cache --no-reflogs --full
1128                        --strict --verbose --lost-found
1129                        "
1130                return
1131                ;;
1132        esac
1133        COMPREPLY=()
1134}
1135
1136_git_gc ()
1137{
1138        case "$cur" in
1139        --*)
1140                __gitcomp "--prune --aggressive"
1141                return
1142                ;;
1143        esac
1144        COMPREPLY=()
1145}
1146
1147_git_gitk ()
1148{
1149        _gitk
1150}
1151
1152__git_match_ctag() {
1153        awk "/^${1////\\/}/ { print \$1 }" "$2"
1154}
1155
1156_git_grep ()
1157{
1158        __git_has_doubledash && return
1159
1160        case "$cur" in
1161        --*)
1162                __gitcomp "
1163                        --cached
1164                        --text --ignore-case --word-regexp --invert-match
1165                        --full-name --line-number
1166                        --extended-regexp --basic-regexp --fixed-strings
1167                        --perl-regexp
1168                        --files-with-matches --name-only
1169                        --files-without-match
1170                        --max-depth
1171                        --count
1172                        --and --or --not --all-match
1173                        "
1174                return
1175                ;;
1176        esac
1177
1178        case "$cword,$prev" in
1179        2,*|*,-*)
1180                if test -r tags; then
1181                        __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1182                        return
1183                fi
1184                ;;
1185        esac
1186
1187        __gitcomp_nl "$(__git_refs)"
1188}
1189
1190_git_help ()
1191{
1192        case "$cur" in
1193        --*)
1194                __gitcomp "--all --info --man --web"
1195                return
1196                ;;
1197        esac
1198        __git_compute_all_commands
1199        __gitcomp "$__git_all_commands $(__git_aliases)
1200                attributes cli core-tutorial cvs-migration
1201                diffcore gitk glossary hooks ignore modules
1202                namespaces repository-layout tutorial tutorial-2
1203                workflows
1204                "
1205}
1206
1207_git_init ()
1208{
1209        case "$cur" in
1210        --shared=*)
1211                __gitcomp "
1212                        false true umask group all world everybody
1213                        " "" "${cur##--shared=}"
1214                return
1215                ;;
1216        --*)
1217                __gitcomp "--quiet --bare --template= --shared --shared="
1218                return
1219                ;;
1220        esac
1221        COMPREPLY=()
1222}
1223
1224_git_ls_files ()
1225{
1226        __git_has_doubledash && return
1227
1228        case "$cur" in
1229        --*)
1230                __gitcomp "--cached --deleted --modified --others --ignored
1231                        --stage --directory --no-empty-directory --unmerged
1232                        --killed --exclude= --exclude-from=
1233                        --exclude-per-directory= --exclude-standard
1234                        --error-unmatch --with-tree= --full-name
1235                        --abbrev --ignored --exclude-per-directory
1236                        "
1237                return
1238                ;;
1239        esac
1240        COMPREPLY=()
1241}
1242
1243_git_ls_remote ()
1244{
1245        __gitcomp_nl "$(__git_remotes)"
1246}
1247
1248_git_ls_tree ()
1249{
1250        __git_complete_file
1251}
1252
1253# Options that go well for log, shortlog and gitk
1254__git_log_common_options="
1255        --not --all
1256        --branches --tags --remotes
1257        --first-parent --merges --no-merges
1258        --max-count=
1259        --max-age= --since= --after=
1260        --min-age= --until= --before=
1261        --min-parents= --max-parents=
1262        --no-min-parents --no-max-parents
1263"
1264# Options that go well for log and gitk (not shortlog)
1265__git_log_gitk_options="
1266        --dense --sparse --full-history
1267        --simplify-merges --simplify-by-decoration
1268        --left-right --notes --no-notes
1269"
1270# Options that go well for log and shortlog (not gitk)
1271__git_log_shortlog_options="
1272        --author= --committer= --grep=
1273        --all-match
1274"
1275
1276__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1277__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1278
1279_git_log ()
1280{
1281        __git_has_doubledash && return
1282
1283        local g="$(git rev-parse --git-dir 2>/dev/null)"
1284        local merge=""
1285        if [ -f "$g/MERGE_HEAD" ]; then
1286                merge="--merge"
1287        fi
1288        case "$cur" in
1289        --pretty=*|--format=*)
1290                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1291                        " "" "${cur#*=}"
1292                return
1293                ;;
1294        --date=*)
1295                __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1296                return
1297                ;;
1298        --decorate=*)
1299                __gitcomp "long short" "" "${cur##--decorate=}"
1300                return
1301                ;;
1302        --*)
1303                __gitcomp "
1304                        $__git_log_common_options
1305                        $__git_log_shortlog_options
1306                        $__git_log_gitk_options
1307                        --root --topo-order --date-order --reverse
1308                        --follow --full-diff
1309                        --abbrev-commit --abbrev=
1310                        --relative-date --date=
1311                        --pretty= --format= --oneline
1312                        --cherry-pick
1313                        --graph
1314                        --decorate --decorate=
1315                        --walk-reflogs
1316                        --parents --children
1317                        $merge
1318                        $__git_diff_common_options
1319                        --pickaxe-all --pickaxe-regex
1320                        "
1321                return
1322                ;;
1323        esac
1324        __git_complete_revlist
1325}
1326
1327__git_merge_options="
1328        --no-commit --no-stat --log --no-log --squash --strategy
1329        --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1330"
1331
1332_git_merge ()
1333{
1334        __git_complete_strategy && return
1335
1336        case "$cur" in
1337        --*)
1338                __gitcomp "$__git_merge_options"
1339                return
1340        esac
1341        __gitcomp_nl "$(__git_refs)"
1342}
1343
1344_git_mergetool ()
1345{
1346        case "$cur" in
1347        --tool=*)
1348                __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1349                return
1350                ;;
1351        --*)
1352                __gitcomp "--tool="
1353                return
1354                ;;
1355        esac
1356        COMPREPLY=()
1357}
1358
1359_git_merge_base ()
1360{
1361        __gitcomp_nl "$(__git_refs)"
1362}
1363
1364_git_mv ()
1365{
1366        case "$cur" in
1367        --*)
1368                __gitcomp "--dry-run"
1369                return
1370                ;;
1371        esac
1372        COMPREPLY=()
1373}
1374
1375_git_name_rev ()
1376{
1377        __gitcomp "--tags --all --stdin"
1378}
1379
1380_git_notes ()
1381{
1382        local subcommands='add append copy edit list prune remove show'
1383        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1384
1385        case "$subcommand,$cur" in
1386        ,--*)
1387                __gitcomp '--ref'
1388                ;;
1389        ,*)
1390                case "$prev" in
1391                --ref)
1392                        __gitcomp_nl "$(__git_refs)"
1393                        ;;
1394                *)
1395                        __gitcomp "$subcommands --ref"
1396                        ;;
1397                esac
1398                ;;
1399        add,--reuse-message=*|append,--reuse-message=*|\
1400        add,--reedit-message=*|append,--reedit-message=*)
1401                __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1402                ;;
1403        add,--*|append,--*)
1404                __gitcomp '--file= --message= --reedit-message=
1405                                --reuse-message='
1406                ;;
1407        copy,--*)
1408                __gitcomp '--stdin'
1409                ;;
1410        prune,--*)
1411                __gitcomp '--dry-run --verbose'
1412                ;;
1413        prune,*)
1414                ;;
1415        *)
1416                case "$prev" in
1417                -m|-F)
1418                        ;;
1419                *)
1420                        __gitcomp_nl "$(__git_refs)"
1421                        ;;
1422                esac
1423                ;;
1424        esac
1425}
1426
1427_git_pull ()
1428{
1429        __git_complete_strategy && return
1430
1431        case "$cur" in
1432        --*)
1433                __gitcomp "
1434                        --rebase --no-rebase
1435                        $__git_merge_options
1436                        $__git_fetch_options
1437                "
1438                return
1439                ;;
1440        esac
1441        __git_complete_remote_or_refspec
1442}
1443
1444_git_push ()
1445{
1446        case "$prev" in
1447        --repo)
1448                __gitcomp_nl "$(__git_remotes)"
1449                return
1450        esac
1451        case "$cur" in
1452        --repo=*)
1453                __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1454                return
1455                ;;
1456        --*)
1457                __gitcomp "
1458                        --all --mirror --tags --dry-run --force --verbose
1459                        --receive-pack= --repo= --set-upstream
1460                "
1461                return
1462                ;;
1463        esac
1464        __git_complete_remote_or_refspec
1465}
1466
1467_git_rebase ()
1468{
1469        local dir="$(__gitdir)"
1470        if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1471                __gitcomp "--continue --skip --abort"
1472                return
1473        fi
1474        __git_complete_strategy && return
1475        case "$cur" in
1476        --whitespace=*)
1477                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1478                return
1479                ;;
1480        --*)
1481                __gitcomp "
1482                        --onto --merge --strategy --interactive
1483                        --preserve-merges --stat --no-stat
1484                        --committer-date-is-author-date --ignore-date
1485                        --ignore-whitespace --whitespace=
1486                        --autosquash
1487                        "
1488
1489                return
1490        esac
1491        __gitcomp_nl "$(__git_refs)"
1492}
1493
1494_git_reflog ()
1495{
1496        local subcommands="show delete expire"
1497        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1498
1499        if [ -z "$subcommand" ]; then
1500                __gitcomp "$subcommands"
1501        else
1502                __gitcomp_nl "$(__git_refs)"
1503        fi
1504}
1505
1506__git_send_email_confirm_options="always never auto cc compose"
1507__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1508
1509_git_send_email ()
1510{
1511        case "$cur" in
1512        --confirm=*)
1513                __gitcomp "
1514                        $__git_send_email_confirm_options
1515                        " "" "${cur##--confirm=}"
1516                return
1517                ;;
1518        --suppress-cc=*)
1519                __gitcomp "
1520                        $__git_send_email_suppresscc_options
1521                        " "" "${cur##--suppress-cc=}"
1522
1523                return
1524                ;;
1525        --smtp-encryption=*)
1526                __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1527                return
1528                ;;
1529        --thread=*)
1530                __gitcomp "
1531                        deep shallow
1532                        " "" "${cur##--thread=}"
1533                return
1534                ;;
1535        --*)
1536                __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1537                        --compose --confirm= --dry-run --envelope-sender
1538                        --from --identity
1539                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1540                        --no-suppress-from --no-thread --quiet
1541                        --signed-off-by-cc --smtp-pass --smtp-server
1542                        --smtp-server-port --smtp-encryption= --smtp-user
1543                        --subject --suppress-cc= --suppress-from --thread --to
1544                        --validate --no-validate
1545                        $__git_format_patch_options"
1546                return
1547                ;;
1548        esac
1549        __git_complete_revlist
1550}
1551
1552_git_stage ()
1553{
1554        _git_add
1555}
1556
1557__git_config_get_set_variables ()
1558{
1559        local prevword word config_file= c=$cword
1560        while [ $c -gt 1 ]; do
1561                word="${words[c]}"
1562                case "$word" in
1563                --global|--system|--file=*)
1564                        config_file="$word"
1565                        break
1566                        ;;
1567                -f|--file)
1568                        config_file="$word $prevword"
1569                        break
1570                        ;;
1571                esac
1572                prevword=$word
1573                c=$((--c))
1574        done
1575
1576        git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1577        while read -r line
1578        do
1579                case "$line" in
1580                *.*=*)
1581                        echo "${line/=*/}"
1582                        ;;
1583                esac
1584        done
1585}
1586
1587_git_config ()
1588{
1589        case "$prev" in
1590        branch.*.remote)
1591                __gitcomp_nl "$(__git_remotes)"
1592                return
1593                ;;
1594        branch.*.merge)
1595                __gitcomp_nl "$(__git_refs)"
1596                return
1597                ;;
1598        remote.*.fetch)
1599                local remote="${prev#remote.}"
1600                remote="${remote%.fetch}"
1601                if [ -z "$cur" ]; then
1602                        COMPREPLY=("refs/heads/")
1603                        return
1604                fi
1605                __gitcomp_nl "$(__git_refs_remotes "$remote")"
1606                return
1607                ;;
1608        remote.*.push)
1609                local remote="${prev#remote.}"
1610                remote="${remote%.push}"
1611                __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1612                        for-each-ref --format='%(refname):%(refname)' \
1613                        refs/heads)"
1614                return
1615                ;;
1616        pull.twohead|pull.octopus)
1617                __git_compute_merge_strategies
1618                __gitcomp "$__git_merge_strategies"
1619                return
1620                ;;
1621        color.branch|color.diff|color.interactive|\
1622        color.showbranch|color.status|color.ui)
1623                __gitcomp "always never auto"
1624                return
1625                ;;
1626        color.pager)
1627                __gitcomp "false true"
1628                return
1629                ;;
1630        color.*.*)
1631                __gitcomp "
1632                        normal black red green yellow blue magenta cyan white
1633                        bold dim ul blink reverse
1634                        "
1635                return
1636                ;;
1637        help.format)
1638                __gitcomp "man info web html"
1639                return
1640                ;;
1641        log.date)
1642                __gitcomp "$__git_log_date_formats"
1643                return
1644                ;;
1645        sendemail.aliasesfiletype)
1646                __gitcomp "mutt mailrc pine elm gnus"
1647                return
1648                ;;
1649        sendemail.confirm)
1650                __gitcomp "$__git_send_email_confirm_options"
1651                return
1652                ;;
1653        sendemail.suppresscc)
1654                __gitcomp "$__git_send_email_suppresscc_options"
1655                return
1656                ;;
1657        --get|--get-all|--unset|--unset-all)
1658                __gitcomp_nl "$(__git_config_get_set_variables)"
1659                return
1660                ;;
1661        *.*)
1662                COMPREPLY=()
1663                return
1664                ;;
1665        esac
1666        case "$cur" in
1667        --*)
1668                __gitcomp "
1669                        --global --system --file=
1670                        --list --replace-all
1671                        --get --get-all --get-regexp
1672                        --add --unset --unset-all
1673                        --remove-section --rename-section
1674                        "
1675                return
1676                ;;
1677        branch.*.*)
1678                local pfx="${cur%.*}." cur_="${cur##*.}"
1679                __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
1680                return
1681                ;;
1682        branch.*)
1683                local pfx="${cur%.*}." cur_="${cur#*.}"
1684                __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1685                return
1686                ;;
1687        guitool.*.*)
1688                local pfx="${cur%.*}." cur_="${cur##*.}"
1689                __gitcomp "
1690                        argprompt cmd confirm needsfile noconsole norescan
1691                        prompt revprompt revunmerged title
1692                        " "$pfx" "$cur_"
1693                return
1694                ;;
1695        difftool.*.*)
1696                local pfx="${cur%.*}." cur_="${cur##*.}"
1697                __gitcomp "cmd path" "$pfx" "$cur_"
1698                return
1699                ;;
1700        man.*.*)
1701                local pfx="${cur%.*}." cur_="${cur##*.}"
1702                __gitcomp "cmd path" "$pfx" "$cur_"
1703                return
1704                ;;
1705        mergetool.*.*)
1706                local pfx="${cur%.*}." cur_="${cur##*.}"
1707                __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1708                return
1709                ;;
1710        pager.*)
1711                local pfx="${cur%.*}." cur_="${cur#*.}"
1712                __git_compute_all_commands
1713                __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1714                return
1715                ;;
1716        remote.*.*)
1717                local pfx="${cur%.*}." cur_="${cur##*.}"
1718                __gitcomp "
1719                        url proxy fetch push mirror skipDefaultUpdate
1720                        receivepack uploadpack tagopt pushurl
1721                        " "$pfx" "$cur_"
1722                return
1723                ;;
1724        remote.*)
1725                local pfx="${cur%.*}." cur_="${cur#*.}"
1726                __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1727                return
1728                ;;
1729        url.*.*)
1730                local pfx="${cur%.*}." cur_="${cur##*.}"
1731                __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1732                return
1733                ;;
1734        esac
1735        __gitcomp "
1736                add.ignoreErrors
1737                advice.commitBeforeMerge
1738                advice.detachedHead
1739                advice.implicitIdentity
1740                advice.pushNonFastForward
1741                advice.resolveConflict
1742                advice.statusHints
1743                alias.
1744                am.keepcr
1745                apply.ignorewhitespace
1746                apply.whitespace
1747                branch.autosetupmerge
1748                branch.autosetuprebase
1749                browser.
1750                clean.requireForce
1751                color.branch
1752                color.branch.current
1753                color.branch.local
1754                color.branch.plain
1755                color.branch.remote
1756                color.decorate.HEAD
1757                color.decorate.branch
1758                color.decorate.remoteBranch
1759                color.decorate.stash
1760                color.decorate.tag
1761                color.diff
1762                color.diff.commit
1763                color.diff.frag
1764                color.diff.func
1765                color.diff.meta
1766                color.diff.new
1767                color.diff.old
1768                color.diff.plain
1769                color.diff.whitespace
1770                color.grep
1771                color.grep.context
1772                color.grep.filename
1773                color.grep.function
1774                color.grep.linenumber
1775                color.grep.match
1776                color.grep.selected
1777                color.grep.separator
1778                color.interactive
1779                color.interactive.error
1780                color.interactive.header
1781                color.interactive.help
1782                color.interactive.prompt
1783                color.pager
1784                color.showbranch
1785                color.status
1786                color.status.added
1787                color.status.changed
1788                color.status.header
1789                color.status.nobranch
1790                color.status.untracked
1791                color.status.updated
1792                color.ui
1793                commit.status
1794                commit.template
1795                core.abbrev
1796                core.askpass
1797                core.attributesfile
1798                core.autocrlf
1799                core.bare
1800                core.bigFileThreshold
1801                core.compression
1802                core.createObject
1803                core.deltaBaseCacheLimit
1804                core.editor
1805                core.eol
1806                core.excludesfile
1807                core.fileMode
1808                core.fsyncobjectfiles
1809                core.gitProxy
1810                core.ignoreCygwinFSTricks
1811                core.ignoreStat
1812                core.ignorecase
1813                core.logAllRefUpdates
1814                core.loosecompression
1815                core.notesRef
1816                core.packedGitLimit
1817                core.packedGitWindowSize
1818                core.pager
1819                core.preferSymlinkRefs
1820                core.preloadindex
1821                core.quotepath
1822                core.repositoryFormatVersion
1823                core.safecrlf
1824                core.sharedRepository
1825                core.sparseCheckout
1826                core.symlinks
1827                core.trustctime
1828                core.warnAmbiguousRefs
1829                core.whitespace
1830                core.worktree
1831                diff.autorefreshindex
1832                diff.statGraphWidth
1833                diff.external
1834                diff.ignoreSubmodules
1835                diff.mnemonicprefix
1836                diff.noprefix
1837                diff.renameLimit
1838                diff.renames
1839                diff.suppressBlankEmpty
1840                diff.tool
1841                diff.wordRegex
1842                diff.algorithm
1843                difftool.
1844                difftool.prompt
1845                fetch.recurseSubmodules
1846                fetch.unpackLimit
1847                format.attach
1848                format.cc
1849                format.headers
1850                format.numbered
1851                format.pretty
1852                format.signature
1853                format.signoff
1854                format.subjectprefix
1855                format.suffix
1856                format.thread
1857                format.to
1858                gc.
1859                gc.aggressiveWindow
1860                gc.auto
1861                gc.autopacklimit
1862                gc.packrefs
1863                gc.pruneexpire
1864                gc.reflogexpire
1865                gc.reflogexpireunreachable
1866                gc.rerereresolved
1867                gc.rerereunresolved
1868                gitcvs.allbinary
1869                gitcvs.commitmsgannotation
1870                gitcvs.dbTableNamePrefix
1871                gitcvs.dbdriver
1872                gitcvs.dbname
1873                gitcvs.dbpass
1874                gitcvs.dbuser
1875                gitcvs.enabled
1876                gitcvs.logfile
1877                gitcvs.usecrlfattr
1878                guitool.
1879                gui.blamehistoryctx
1880                gui.commitmsgwidth
1881                gui.copyblamethreshold
1882                gui.diffcontext
1883                gui.encoding
1884                gui.fastcopyblame
1885                gui.matchtrackingbranch
1886                gui.newbranchtemplate
1887                gui.pruneduringfetch
1888                gui.spellingdictionary
1889                gui.trustmtime
1890                help.autocorrect
1891                help.browser
1892                help.format
1893                http.lowSpeedLimit
1894                http.lowSpeedTime
1895                http.maxRequests
1896                http.minSessions
1897                http.noEPSV
1898                http.postBuffer
1899                http.proxy
1900                http.sslCAInfo
1901                http.sslCAPath
1902                http.sslCert
1903                http.sslCertPasswordProtected
1904                http.sslKey
1905                http.sslVerify
1906                http.useragent
1907                i18n.commitEncoding
1908                i18n.logOutputEncoding
1909                imap.authMethod
1910                imap.folder
1911                imap.host
1912                imap.pass
1913                imap.port
1914                imap.preformattedHTML
1915                imap.sslverify
1916                imap.tunnel
1917                imap.user
1918                init.templatedir
1919                instaweb.browser
1920                instaweb.httpd
1921                instaweb.local
1922                instaweb.modulepath
1923                instaweb.port
1924                interactive.singlekey
1925                log.date
1926                log.decorate
1927                log.showroot
1928                mailmap.file
1929                man.
1930                man.viewer
1931                merge.
1932                merge.conflictstyle
1933                merge.log
1934                merge.renameLimit
1935                merge.renormalize
1936                merge.stat
1937                merge.tool
1938                merge.verbosity
1939                mergetool.
1940                mergetool.keepBackup
1941                mergetool.keepTemporaries
1942                mergetool.prompt
1943                notes.displayRef
1944                notes.rewrite.
1945                notes.rewrite.amend
1946                notes.rewrite.rebase
1947                notes.rewriteMode
1948                notes.rewriteRef
1949                pack.compression
1950                pack.deltaCacheLimit
1951                pack.deltaCacheSize
1952                pack.depth
1953                pack.indexVersion
1954                pack.packSizeLimit
1955                pack.threads
1956                pack.window
1957                pack.windowMemory
1958                pager.
1959                pretty.
1960                pull.octopus
1961                pull.twohead
1962                push.default
1963                rebase.autosquash
1964                rebase.stat
1965                receive.autogc
1966                receive.denyCurrentBranch
1967                receive.denyDeleteCurrent
1968                receive.denyDeletes
1969                receive.denyNonFastForwards
1970                receive.fsckObjects
1971                receive.unpackLimit
1972                receive.updateserverinfo
1973                remotes.
1974                repack.usedeltabaseoffset
1975                rerere.autoupdate
1976                rerere.enabled
1977                sendemail.
1978                sendemail.aliasesfile
1979                sendemail.aliasfiletype
1980                sendemail.bcc
1981                sendemail.cc
1982                sendemail.cccmd
1983                sendemail.chainreplyto
1984                sendemail.confirm
1985                sendemail.envelopesender
1986                sendemail.from
1987                sendemail.identity
1988                sendemail.multiedit
1989                sendemail.signedoffbycc
1990                sendemail.smtpdomain
1991                sendemail.smtpencryption
1992                sendemail.smtppass
1993                sendemail.smtpserver
1994                sendemail.smtpserveroption
1995                sendemail.smtpserverport
1996                sendemail.smtpuser
1997                sendemail.suppresscc
1998                sendemail.suppressfrom
1999                sendemail.thread
2000                sendemail.to
2001                sendemail.validate
2002                showbranch.default
2003                status.relativePaths
2004                status.showUntrackedFiles
2005                status.submodulesummary
2006                submodule.
2007                tar.umask
2008                transfer.unpackLimit
2009                url.
2010                user.email
2011                user.name
2012                user.signingkey
2013                web.browser
2014                branch. remote.
2015        "
2016}
2017
2018_git_remote ()
2019{
2020        local subcommands="add rename remove set-head set-branches set-url show prune update"
2021        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2022        if [ -z "$subcommand" ]; then
2023                __gitcomp "$subcommands"
2024                return
2025        fi
2026
2027        case "$subcommand" in
2028        rename|remove|set-url|show|prune)
2029                __gitcomp_nl "$(__git_remotes)"
2030                ;;
2031        set-head|set-branches)
2032                __git_complete_remote_or_refspec
2033                ;;
2034        update)
2035                local i c='' IFS=$'\n'
2036                for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2037                        i="${i#remotes.}"
2038                        c="$c ${i/ */}"
2039                done
2040                __gitcomp "$c"
2041                ;;
2042        *)
2043                COMPREPLY=()
2044                ;;
2045        esac
2046}
2047
2048_git_replace ()
2049{
2050        __gitcomp_nl "$(__git_refs)"
2051}
2052
2053_git_reset ()
2054{
2055        __git_has_doubledash && return
2056
2057        case "$cur" in
2058        --*)
2059                __gitcomp "--merge --mixed --hard --soft --patch"
2060                return
2061                ;;
2062        esac
2063        __gitcomp_nl "$(__git_refs)"
2064}
2065
2066_git_revert ()
2067{
2068        case "$cur" in
2069        --*)
2070                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2071                return
2072                ;;
2073        esac
2074        __gitcomp_nl "$(__git_refs)"
2075}
2076
2077_git_rm ()
2078{
2079        __git_has_doubledash && return
2080
2081        case "$cur" in
2082        --*)
2083                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2084                return
2085                ;;
2086        esac
2087        COMPREPLY=()
2088}
2089
2090_git_shortlog ()
2091{
2092        __git_has_doubledash && return
2093
2094        case "$cur" in
2095        --*)
2096                __gitcomp "
2097                        $__git_log_common_options
2098                        $__git_log_shortlog_options
2099                        --numbered --summary
2100                        "
2101                return
2102                ;;
2103        esac
2104        __git_complete_revlist
2105}
2106
2107_git_show ()
2108{
2109        __git_has_doubledash && return
2110
2111        case "$cur" in
2112        --pretty=*|--format=*)
2113                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2114                        " "" "${cur#*=}"
2115                return
2116                ;;
2117        --*)
2118                __gitcomp "--pretty= --format= --abbrev-commit --oneline
2119                        $__git_diff_common_options
2120                        "
2121                return
2122                ;;
2123        esac
2124        __git_complete_file
2125}
2126
2127_git_show_branch ()
2128{
2129        case "$cur" in
2130        --*)
2131                __gitcomp "
2132                        --all --remotes --topo-order --current --more=
2133                        --list --independent --merge-base --no-name
2134                        --color --no-color
2135                        --sha1-name --sparse --topics --reflog
2136                        "
2137                return
2138                ;;
2139        esac
2140        __git_complete_revlist
2141}
2142
2143_git_stash ()
2144{
2145        local save_opts='--keep-index --no-keep-index --quiet --patch'
2146        local subcommands='save list show apply clear drop pop create branch'
2147        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2148        if [ -z "$subcommand" ]; then
2149                case "$cur" in
2150                --*)
2151                        __gitcomp "$save_opts"
2152                        ;;
2153                *)
2154                        if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2155                                __gitcomp "$subcommands"
2156                        else
2157                                COMPREPLY=()
2158                        fi
2159                        ;;
2160                esac
2161        else
2162                case "$subcommand,$cur" in
2163                save,--*)
2164                        __gitcomp "$save_opts"
2165                        ;;
2166                apply,--*|pop,--*)
2167                        __gitcomp "--index --quiet"
2168                        ;;
2169                show,--*|drop,--*|branch,--*)
2170                        COMPREPLY=()
2171                        ;;
2172                show,*|apply,*|drop,*|pop,*|branch,*)
2173                        __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2174                                        | sed -n -e 's/:.*//p')"
2175                        ;;
2176                *)
2177                        COMPREPLY=()
2178                        ;;
2179                esac
2180        fi
2181}
2182
2183_git_submodule ()
2184{
2185        __git_has_doubledash && return
2186
2187        local subcommands="add status init update summary foreach sync"
2188        if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2189                case "$cur" in
2190                --*)
2191                        __gitcomp "--quiet --cached"
2192                        ;;
2193                *)
2194                        __gitcomp "$subcommands"
2195                        ;;
2196                esac
2197                return
2198        fi
2199}
2200
2201_git_svn ()
2202{
2203        local subcommands="
2204                init fetch clone rebase dcommit log find-rev
2205                set-tree commit-diff info create-ignore propget
2206                proplist show-ignore show-externals branch tag blame
2207                migrate mkdirs reset gc
2208                "
2209        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2210        if [ -z "$subcommand" ]; then
2211                __gitcomp "$subcommands"
2212        else
2213                local remote_opts="--username= --config-dir= --no-auth-cache"
2214                local fc_opts="
2215                        --follow-parent --authors-file= --repack=
2216                        --no-metadata --use-svm-props --use-svnsync-props
2217                        --log-window-size= --no-checkout --quiet
2218                        --repack-flags --use-log-author --localtime
2219                        --ignore-paths= $remote_opts
2220                        "
2221                local init_opts="
2222                        --template= --shared= --trunk= --tags=
2223                        --branches= --stdlayout --minimize-url
2224                        --no-metadata --use-svm-props --use-svnsync-props
2225                        --rewrite-root= --prefix= --use-log-author
2226                        --add-author-from $remote_opts
2227                        "
2228                local cmt_opts="
2229                        --edit --rmdir --find-copies-harder --copy-similarity=
2230                        "
2231
2232                case "$subcommand,$cur" in
2233                fetch,--*)
2234                        __gitcomp "--revision= --fetch-all $fc_opts"
2235                        ;;
2236                clone,--*)
2237                        __gitcomp "--revision= $fc_opts $init_opts"
2238                        ;;
2239                init,--*)
2240                        __gitcomp "$init_opts"
2241                        ;;
2242                dcommit,--*)
2243                        __gitcomp "
2244                                --merge --strategy= --verbose --dry-run
2245                                --fetch-all --no-rebase --commit-url
2246                                --revision --interactive $cmt_opts $fc_opts
2247                                "
2248                        ;;
2249                set-tree,--*)
2250                        __gitcomp "--stdin $cmt_opts $fc_opts"
2251                        ;;
2252                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2253                show-externals,--*|mkdirs,--*)
2254                        __gitcomp "--revision="
2255                        ;;
2256                log,--*)
2257                        __gitcomp "
2258                                --limit= --revision= --verbose --incremental
2259                                --oneline --show-commit --non-recursive
2260                                --authors-file= --color
2261                                "
2262                        ;;
2263                rebase,--*)
2264                        __gitcomp "
2265                                --merge --verbose --strategy= --local
2266                                --fetch-all --dry-run $fc_opts
2267                                "
2268                        ;;
2269                commit-diff,--*)
2270                        __gitcomp "--message= --file= --revision= $cmt_opts"
2271                        ;;
2272                info,--*)
2273                        __gitcomp "--url"
2274                        ;;
2275                branch,--*)
2276                        __gitcomp "--dry-run --message --tag"
2277                        ;;
2278                tag,--*)
2279                        __gitcomp "--dry-run --message"
2280                        ;;
2281                blame,--*)
2282                        __gitcomp "--git-format"
2283                        ;;
2284                migrate,--*)
2285                        __gitcomp "
2286                                --config-dir= --ignore-paths= --minimize
2287                                --no-auth-cache --username=
2288                                "
2289                        ;;
2290                reset,--*)
2291                        __gitcomp "--revision= --parent"
2292                        ;;
2293                *)
2294                        COMPREPLY=()
2295                        ;;
2296                esac
2297        fi
2298}
2299
2300_git_tag ()
2301{
2302        local i c=1 f=0
2303        while [ $c -lt $cword ]; do
2304                i="${words[c]}"
2305                case "$i" in
2306                -d|-v)
2307                        __gitcomp_nl "$(__git_tags)"
2308                        return
2309                        ;;
2310                -f)
2311                        f=1
2312                        ;;
2313                esac
2314                ((c++))
2315        done
2316
2317        case "$prev" in
2318        -m|-F)
2319                COMPREPLY=()
2320                ;;
2321        -*|tag)
2322                if [ $f = 1 ]; then
2323                        __gitcomp_nl "$(__git_tags)"
2324                else
2325                        COMPREPLY=()
2326                fi
2327                ;;
2328        *)
2329                __gitcomp_nl "$(__git_refs)"
2330                ;;
2331        esac
2332}
2333
2334_git_whatchanged ()
2335{
2336        _git_log
2337}
2338
2339__git_main ()
2340{
2341        local i c=1 command __git_dir
2342
2343        while [ $c -lt $cword ]; do
2344                i="${words[c]}"
2345                case "$i" in
2346                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2347                --bare)      __git_dir="." ;;
2348                --help) command="help"; break ;;
2349                -c) c=$((++c)) ;;
2350                -*) ;;
2351                *) command="$i"; break ;;
2352                esac
2353                ((c++))
2354        done
2355
2356        if [ -z "$command" ]; then
2357                case "$cur" in
2358                --*)   __gitcomp "
2359                        --paginate
2360                        --no-pager
2361                        --git-dir=
2362                        --bare
2363                        --version
2364                        --exec-path
2365                        --exec-path=
2366                        --html-path
2367                        --info-path
2368                        --work-tree=
2369                        --namespace=
2370                        --no-replace-objects
2371                        --help
2372                        "
2373                        ;;
2374                *)     __git_compute_porcelain_commands
2375                       __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2376                esac
2377                return
2378        fi
2379
2380        local completion_func="_git_${command//-/_}"
2381        declare -f $completion_func >/dev/null && $completion_func && return
2382
2383        local expansion=$(__git_aliased_command "$command")
2384        if [ -n "$expansion" ]; then
2385                completion_func="_git_${expansion//-/_}"
2386                declare -f $completion_func >/dev/null && $completion_func
2387        fi
2388}
2389
2390__gitk_main ()
2391{
2392        __git_has_doubledash && return
2393
2394        local g="$(__gitdir)"
2395        local merge=""
2396        if [ -f "$g/MERGE_HEAD" ]; then
2397                merge="--merge"
2398        fi
2399        case "$cur" in
2400        --*)
2401                __gitcomp "
2402                        $__git_log_common_options
2403                        $__git_log_gitk_options
2404                        $merge
2405                        "
2406                return
2407                ;;
2408        esac
2409        __git_complete_revlist
2410}
2411
2412if [[ -n ${ZSH_VERSION-} ]]; then
2413        echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2414
2415        autoload -U +X compinit && compinit
2416
2417        __gitcomp ()
2418        {
2419                emulate -L zsh
2420
2421                local cur_="${3-$cur}"
2422
2423                case "$cur_" in
2424                --*=)
2425                        ;;
2426                *)
2427                        local c IFS=$' \t\n'
2428                        local -a array
2429                        for c in ${=1}; do
2430                                c="$c${4-}"
2431                                case $c in
2432                                --*=*|*.) ;;
2433                                *) c="$c " ;;
2434                                esac
2435                                array+=("$c")
2436                        done
2437                        compset -P '*[=:]'
2438                        compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2439                        ;;
2440                esac
2441        }
2442
2443        __gitcomp_nl ()
2444        {
2445                emulate -L zsh
2446
2447                local IFS=$'\n'
2448                compset -P '*[=:]'
2449                compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2450        }
2451
2452        __git_zsh_helper ()
2453        {
2454                emulate -L ksh
2455                local cur cword prev
2456                cur=${words[CURRENT-1]}
2457                prev=${words[CURRENT-2]}
2458                let cword=CURRENT-1
2459                __${service}_main
2460        }
2461
2462        _git ()
2463        {
2464                emulate -L zsh
2465                local _ret=1
2466                __git_zsh_helper
2467                let _ret && _default -S '' && _ret=0
2468                return _ret
2469        }
2470
2471        compdef _git git gitk
2472        return
2473fi
2474
2475__git_func_wrap ()
2476{
2477        local cur words cword prev
2478        _get_comp_words_by_ref -n =: cur words cword prev
2479        $1
2480}
2481
2482# Setup completion for certain functions defined above by setting common
2483# variables and workarounds.
2484# This is NOT a public function; use at your own risk.
2485__git_complete ()
2486{
2487        local wrapper="__git_wrap${2}"
2488        eval "$wrapper () { __git_func_wrap $2 ; }"
2489        complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2490                || complete -o default -o nospace -F $wrapper $1
2491}
2492
2493# wrapper for backwards compatibility
2494_git ()
2495{
2496        __git_wrap__git_main
2497}
2498
2499# wrapper for backwards compatibility
2500_gitk ()
2501{
2502        __git_wrap__gitk_main
2503}
2504
2505__git_complete git __git_main
2506__git_complete gitk __gitk_main
2507
2508# The following are necessary only for Cygwin, and only are needed
2509# when the user has tab-completed the executable name and consequently
2510# included the '.exe' suffix.
2511#
2512if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2513__git_complete git.exe __git_main
2514fi