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