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