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