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