contrib / completion / git-completion.bashon commit Merge branch 'sg/complete-help-undup' (09b61b5)
   1#!bash
   2#
   3# bash/zsh completion support for core Git.
   4#
   5# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
   6# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
   7# Distributed under the GNU General Public License, version 2.0.
   8#
   9# The contained completion routines provide support for completing:
  10#
  11#    *) local and remote branch names
  12#    *) local and remote tag names
  13#    *) .git/remotes file names
  14#    *) git 'subcommands'
  15#    *) tree paths within 'ref:path/to/file' expressions
  16#    *) common --long-options
  17#
  18# To use these routines:
  19#
  20#    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
  21#    2) Add the following line to your .bashrc/.zshrc:
  22#        source ~/.git-completion.sh
  23#    3) Consider changing your PS1 to also show the current branch,
  24#       see git-prompt.sh for details.
  25
  26if [[ -n ${ZSH_VERSION-} ]]; then
  27        autoload -U +X bashcompinit && bashcompinit
  28fi
  29
  30case "$COMP_WORDBREAKS" in
  31*:*) : great ;;
  32*)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
  33esac
  34
  35# __gitdir accepts 0 or 1 arguments (i.e., location)
  36# returns location of .git repo
  37__gitdir ()
  38{
  39        # Note: this function is duplicated in git-prompt.sh
  40        # When updating it, make sure you update the other one to match.
  41        if [ -z "${1-}" ]; then
  42                if [ -n "${__git_dir-}" ]; then
  43                        echo "$__git_dir"
  44                elif [ -n "${GIT_DIR-}" ]; then
  45                        test -d "${GIT_DIR-}" || return 1
  46                        echo "$GIT_DIR"
  47                elif [ -d .git ]; then
  48                        echo .git
  49                else
  50                        git rev-parse --git-dir 2>/dev/null
  51                fi
  52        elif [ -d "$1/.git" ]; then
  53                echo "$1/.git"
  54        else
  55                echo "$1"
  56        fi
  57}
  58
  59__gitcomp_1 ()
  60{
  61        local c IFS=$' \t\n'
  62        for c in $1; do
  63                c="$c$2"
  64                case $c in
  65                --*=*|*.) ;;
  66                *) c="$c " ;;
  67                esac
  68                printf '%s\n' "$c"
  69        done
  70}
  71
  72# The following function is based on code from:
  73#
  74#   bash_completion - programmable completion functions for bash 3.2+
  75#
  76#   Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
  77#             © 2009-2010, Bash Completion Maintainers
  78#                     <bash-completion-devel@lists.alioth.debian.org>
  79#
  80#   This program is free software; you can redistribute it and/or modify
  81#   it under the terms of the GNU General Public License as published by
  82#   the Free Software Foundation; either version 2, or (at your option)
  83#   any later version.
  84#
  85#   This program is distributed in the hope that it will be useful,
  86#   but WITHOUT ANY WARRANTY; without even the implied warranty of
  87#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  88#   GNU General Public License for more details.
  89#
  90#   You should have received a copy of the GNU General Public License
  91#   along with this program; if not, write to the Free Software Foundation,
  92#   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  93#
  94#   The latest version of this software can be obtained here:
  95#
  96#   http://bash-completion.alioth.debian.org/
  97#
  98#   RELEASE: 2.x
  99
 100# This function can be used to access a tokenized list of words
 101# on the command line:
 102#
 103#       __git_reassemble_comp_words_by_ref '=:'
 104#       if test "${words_[cword_-1]}" = -w
 105#       then
 106#               ...
 107#       fi
 108#
 109# The argument should be a collection of characters from the list of
 110# word completion separators (COMP_WORDBREAKS) to treat as ordinary
 111# characters.
 112#
 113# This is roughly equivalent to going back in time and setting
 114# COMP_WORDBREAKS to exclude those characters.  The intent is to
 115# make option types like --date=<type> and <rev>:<path> easy to
 116# recognize by treating each shell word as a single token.
 117#
 118# It is best not to set COMP_WORDBREAKS directly because the value is
 119# shared with other completion scripts.  By the time the completion
 120# function gets called, COMP_WORDS has already been populated so local
 121# changes to COMP_WORDBREAKS have no effect.
 122#
 123# Output: words_, cword_, cur_.
 124
 125__git_reassemble_comp_words_by_ref()
 126{
 127        local exclude i j first
 128        # Which word separators to exclude?
 129        exclude="${1//[^$COMP_WORDBREAKS]}"
 130        cword_=$COMP_CWORD
 131        if [ -z "$exclude" ]; then
 132                words_=("${COMP_WORDS[@]}")
 133                return
 134        fi
 135        # List of word completion separators has shrunk;
 136        # re-assemble words to complete.
 137        for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
 138                # Append each nonempty word consisting of just
 139                # word separator characters to the current word.
 140                first=t
 141                while
 142                        [ $i -gt 0 ] &&
 143                        [ -n "${COMP_WORDS[$i]}" ] &&
 144                        # word consists of excluded word separators
 145                        [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
 146                do
 147                        # Attach to the previous token,
 148                        # unless the previous token is the command name.
 149                        if [ $j -ge 2 ] && [ -n "$first" ]; then
 150                                ((j--))
 151                        fi
 152                        first=
 153                        words_[$j]=${words_[j]}${COMP_WORDS[i]}
 154                        if [ $i = $COMP_CWORD ]; then
 155                                cword_=$j
 156                        fi
 157                        if (($i < ${#COMP_WORDS[@]} - 1)); then
 158                                ((i++))
 159                        else
 160                                # Done.
 161                                return
 162                        fi
 163                done
 164                words_[$j]=${words_[j]}${COMP_WORDS[i]}
 165                if [ $i = $COMP_CWORD ]; then
 166                        cword_=$j
 167                fi
 168        done
 169}
 170
 171if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
 172if [[ -z ${ZSH_VERSION:+set} ]]; then
 173_get_comp_words_by_ref ()
 174{
 175        local exclude cur_ words_ cword_
 176        if [ "$1" = "-n" ]; then
 177                exclude=$2
 178                shift 2
 179        fi
 180        __git_reassemble_comp_words_by_ref "$exclude"
 181        cur_=${words_[cword_]}
 182        while [ $# -gt 0 ]; do
 183                case "$1" in
 184                cur)
 185                        cur=$cur_
 186                        ;;
 187                prev)
 188                        prev=${words_[$cword_-1]}
 189                        ;;
 190                words)
 191                        words=("${words_[@]}")
 192                        ;;
 193                cword)
 194                        cword=$cword_
 195                        ;;
 196                esac
 197                shift
 198        done
 199}
 200else
 201_get_comp_words_by_ref ()
 202{
 203        while [ $# -gt 0 ]; do
 204                case "$1" in
 205                cur)
 206                        cur=${COMP_WORDS[COMP_CWORD]}
 207                        ;;
 208                prev)
 209                        prev=${COMP_WORDS[COMP_CWORD-1]}
 210                        ;;
 211                words)
 212                        words=("${COMP_WORDS[@]}")
 213                        ;;
 214                cword)
 215                        cword=$COMP_CWORD
 216                        ;;
 217                -n)
 218                        # assume COMP_WORDBREAKS is already set sanely
 219                        shift
 220                        ;;
 221                esac
 222                shift
 223        done
 224}
 225fi
 226fi
 227
 228# Generates completion reply with compgen, appending a space to possible
 229# completion words, if necessary.
 230# It accepts 1 to 4 arguments:
 231# 1: List of possible completion words.
 232# 2: A prefix to be added to each possible completion word (optional).
 233# 3: Generate possible completion matches for this word (optional).
 234# 4: A suffix to be appended to each possible completion word (optional).
 235__gitcomp ()
 236{
 237        local cur_="${3-$cur}"
 238
 239        case "$cur_" in
 240        --*=)
 241                COMPREPLY=()
 242                ;;
 243        *)
 244                local IFS=$'\n'
 245                COMPREPLY=($(compgen -P "${2-}" \
 246                        -W "$(__gitcomp_1 "${1-}" "${4-}")" \
 247                        -- "$cur_"))
 248                ;;
 249        esac
 250}
 251
 252# Generates completion reply with compgen from newline-separated possible
 253# completion words by appending a space to all of them.
 254# It accepts 1 to 4 arguments:
 255# 1: List of possible completion words, separated by a single newline.
 256# 2: A prefix to be added to each possible completion word (optional).
 257# 3: Generate possible completion matches for this word (optional).
 258# 4: A suffix to be appended to each possible completion word instead of
 259#    the default space (optional).  If specified but empty, nothing is
 260#    appended.
 261__gitcomp_nl ()
 262{
 263        local IFS=$'\n'
 264        COMPREPLY=($(compgen -P "${2-}" -S "${4- }" -W "$1" -- "${3-$cur}"))
 265}
 266
 267__git_heads ()
 268{
 269        local dir="$(__gitdir)"
 270        if [ -d "$dir" ]; then
 271                git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
 272                        refs/heads
 273                return
 274        fi
 275}
 276
 277__git_tags ()
 278{
 279        local dir="$(__gitdir)"
 280        if [ -d "$dir" ]; then
 281                git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
 282                        refs/tags
 283                return
 284        fi
 285}
 286
 287# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
 288# presence of 2nd argument means use the guess heuristic employed
 289# by checkout for tracking branches
 290__git_refs ()
 291{
 292        local i hash dir="$(__gitdir "${1-}")" track="${2-}"
 293        local format refs
 294        if [ -d "$dir" ]; then
 295                case "$cur" in
 296                refs|refs/*)
 297                        format="refname"
 298                        refs="${cur%/*}"
 299                        track=""
 300                        ;;
 301                *)
 302                        for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
 303                                if [ -e "$dir/$i" ]; then echo $i; fi
 304                        done
 305                        format="refname:short"
 306                        refs="refs/tags refs/heads refs/remotes"
 307                        ;;
 308                esac
 309                git --git-dir="$dir" for-each-ref --format="%($format)" \
 310                        $refs
 311                if [ -n "$track" ]; then
 312                        # employ the heuristic used by git checkout
 313                        # Try to find a remote branch that matches the completion word
 314                        # but only output if the branch name is unique
 315                        local ref entry
 316                        git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
 317                                "refs/remotes/" | \
 318                        while read -r entry; do
 319                                eval "$entry"
 320                                ref="${ref#*/}"
 321                                if [[ "$ref" == "$cur"* ]]; then
 322                                        echo "$ref"
 323                                fi
 324                        done | sort | uniq -u
 325                fi
 326                return
 327        fi
 328        case "$cur" in
 329        refs|refs/*)
 330                git ls-remote "$dir" "$cur*" 2>/dev/null | \
 331                while read -r hash i; do
 332                        case "$i" in
 333                        *^{}) ;;
 334                        *) echo "$i" ;;
 335                        esac
 336                done
 337                ;;
 338        *)
 339                git ls-remote "$dir" HEAD ORIG_HEAD 'refs/tags/*' 'refs/heads/*' 'refs/remotes/*' 2>/dev/null | \
 340                while read -r hash i; do
 341                        case "$i" in
 342                        *^{}) ;;
 343                        refs/*) echo "${i#refs/*/}" ;;
 344                        *) echo "$i" ;;
 345                        esac
 346                done
 347                ;;
 348        esac
 349}
 350
 351# __git_refs2 requires 1 argument (to pass to __git_refs)
 352__git_refs2 ()
 353{
 354        local i
 355        for i in $(__git_refs "$1"); do
 356                echo "$i:$i"
 357        done
 358}
 359
 360# __git_refs_remotes requires 1 argument (to pass to ls-remote)
 361__git_refs_remotes ()
 362{
 363        local i hash
 364        git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
 365        while read -r hash i; do
 366                echo "$i:refs/remotes/$1/${i#refs/heads/}"
 367        done
 368}
 369
 370__git_remotes ()
 371{
 372        local i IFS=$'\n' d="$(__gitdir)"
 373        test -d "$d/remotes" && ls -1 "$d/remotes"
 374        for i in $(git --git-dir="$d" config --get-regexp 'remote\..*\.url' 2>/dev/null); do
 375                i="${i#remote.}"
 376                echo "${i/.url*/}"
 377        done
 378}
 379
 380__git_list_merge_strategies ()
 381{
 382        git merge -s help 2>&1 |
 383        sed -n -e '/[Aa]vailable strategies are: /,/^$/{
 384                s/\.$//
 385                s/.*://
 386                s/^[    ]*//
 387                s/[     ]*$//
 388                p
 389        }'
 390}
 391
 392__git_merge_strategies=
 393# 'git merge -s help' (and thus detection of the merge strategy
 394# list) fails, unfortunately, if run outside of any git working
 395# tree.  __git_merge_strategies is set to the empty string in
 396# that case, and the detection will be repeated the next time it
 397# is needed.
 398__git_compute_merge_strategies ()
 399{
 400        test -n "$__git_merge_strategies" ||
 401        __git_merge_strategies=$(__git_list_merge_strategies)
 402}
 403
 404__git_complete_revlist_file ()
 405{
 406        local pfx ls ref cur_="$cur"
 407        case "$cur_" in
 408        *..?*:*)
 409                return
 410                ;;
 411        ?*:*)
 412                ref="${cur_%%:*}"
 413                cur_="${cur_#*:}"
 414                case "$cur_" in
 415                ?*/*)
 416                        pfx="${cur_%/*}"
 417                        cur_="${cur_##*/}"
 418                        ls="$ref:$pfx"
 419                        pfx="$pfx/"
 420                        ;;
 421                *)
 422                        ls="$ref"
 423                        ;;
 424                esac
 425
 426                case "$COMP_WORDBREAKS" in
 427                *:*) : great ;;
 428                *)   pfx="$ref:$pfx" ;;
 429                esac
 430
 431                __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
 432                                | sed '/^100... blob /{
 433                                           s,^.*        ,,
 434                                           s,$, ,
 435                                       }
 436                                       /^120000 blob /{
 437                                           s,^.*        ,,
 438                                           s,$, ,
 439                                       }
 440                                       /^040000 tree /{
 441                                           s,^.*        ,,
 442                                           s,$,/,
 443                                       }
 444                                       s/^.*    //')" \
 445                        "$pfx" "$cur_" ""
 446                ;;
 447        *...*)
 448                pfx="${cur_%...*}..."
 449                cur_="${cur_#*...}"
 450                __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 451                ;;
 452        *..*)
 453                pfx="${cur_%..*}.."
 454                cur_="${cur_#*..}"
 455                __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 456                ;;
 457        *)
 458                __gitcomp_nl "$(__git_refs)"
 459                ;;
 460        esac
 461}
 462
 463
 464__git_complete_file ()
 465{
 466        __git_complete_revlist_file
 467}
 468
 469__git_complete_revlist ()
 470{
 471        __git_complete_revlist_file
 472}
 473
 474__git_complete_remote_or_refspec ()
 475{
 476        local cur_="$cur" cmd="${words[1]}"
 477        local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
 478        if [ "$cmd" = "remote" ]; then
 479                ((c++))
 480        fi
 481        while [ $c -lt $cword ]; do
 482                i="${words[c]}"
 483                case "$i" in
 484                --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
 485                --all)
 486                        case "$cmd" in
 487                        push) no_complete_refspec=1 ;;
 488                        fetch)
 489                                COMPREPLY=()
 490                                return
 491                                ;;
 492                        *) ;;
 493                        esac
 494                        ;;
 495                -*) ;;
 496                *) remote="$i"; break ;;
 497                esac
 498                ((c++))
 499        done
 500        if [ -z "$remote" ]; then
 501                __gitcomp_nl "$(__git_remotes)"
 502                return
 503        fi
 504        if [ $no_complete_refspec = 1 ]; then
 505                COMPREPLY=()
 506                return
 507        fi
 508        [ "$remote" = "." ] && remote=
 509        case "$cur_" in
 510        *:*)
 511                case "$COMP_WORDBREAKS" in
 512                *:*) : great ;;
 513                *)   pfx="${cur_%%:*}:" ;;
 514                esac
 515                cur_="${cur_#*:}"
 516                lhs=0
 517                ;;
 518        +*)
 519                pfx="+"
 520                cur_="${cur_#+}"
 521                ;;
 522        esac
 523        case "$cmd" in
 524        fetch)
 525                if [ $lhs = 1 ]; then
 526                        __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
 527                else
 528                        __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 529                fi
 530                ;;
 531        pull|remote)
 532                if [ $lhs = 1 ]; then
 533                        __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
 534                else
 535                        __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 536                fi
 537                ;;
 538        push)
 539                if [ $lhs = 1 ]; then
 540                        __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 541                else
 542                        __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
 543                fi
 544                ;;
 545        esac
 546}
 547
 548__git_complete_strategy ()
 549{
 550        __git_compute_merge_strategies
 551        case "$prev" in
 552        -s|--strategy)
 553                __gitcomp "$__git_merge_strategies"
 554                return 0
 555        esac
 556        case "$cur" in
 557        --strategy=*)
 558                __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
 559                return 0
 560                ;;
 561        esac
 562        return 1
 563}
 564
 565__git_list_all_commands ()
 566{
 567        local i IFS=" "$'\n'
 568        for i in $(git help -a|egrep '^  [a-zA-Z0-9]')
 569        do
 570                case $i in
 571                *--*)             : helper pattern;;
 572                *) echo $i;;
 573                esac
 574        done
 575}
 576
 577__git_all_commands=
 578__git_compute_all_commands ()
 579{
 580        test -n "$__git_all_commands" ||
 581        __git_all_commands=$(__git_list_all_commands)
 582}
 583
 584__git_list_porcelain_commands ()
 585{
 586        local i IFS=" "$'\n'
 587        __git_compute_all_commands
 588        for i in $__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_options="
1120        --stdout --attach --no-attach --thread --thread= --output-directory
1121        --numbered --start-number --numbered-files --keep-subject --signoff
1122        --signature --no-signature --in-reply-to= --cc= --full-index --binary
1123        --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1124        --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1125"
1126
1127_git_format_patch ()
1128{
1129        case "$cur" in
1130        --thread=*)
1131                __gitcomp "
1132                        deep shallow
1133                        " "" "${cur##--thread=}"
1134                return
1135                ;;
1136        --*)
1137                __gitcomp "$__git_format_patch_options"
1138                return
1139                ;;
1140        esac
1141        __git_complete_revlist
1142}
1143
1144_git_fsck ()
1145{
1146        case "$cur" in
1147        --*)
1148                __gitcomp "
1149                        --tags --root --unreachable --cache --no-reflogs --full
1150                        --strict --verbose --lost-found
1151                        "
1152                return
1153                ;;
1154        esac
1155        COMPREPLY=()
1156}
1157
1158_git_gc ()
1159{
1160        case "$cur" in
1161        --*)
1162                __gitcomp "--prune --aggressive"
1163                return
1164                ;;
1165        esac
1166        COMPREPLY=()
1167}
1168
1169_git_gitk ()
1170{
1171        _gitk
1172}
1173
1174__git_match_ctag() {
1175        awk "/^${1////\\/}/ { print \$1 }" "$2"
1176}
1177
1178_git_grep ()
1179{
1180        __git_has_doubledash && return
1181
1182        case "$cur" in
1183        --*)
1184                __gitcomp "
1185                        --cached
1186                        --text --ignore-case --word-regexp --invert-match
1187                        --full-name --line-number
1188                        --extended-regexp --basic-regexp --fixed-strings
1189                        --perl-regexp
1190                        --files-with-matches --name-only
1191                        --files-without-match
1192                        --max-depth
1193                        --count
1194                        --and --or --not --all-match
1195                        "
1196                return
1197                ;;
1198        esac
1199
1200        case "$cword,$prev" in
1201        2,*|*,-*)
1202                if test -r tags; then
1203                        __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1204                        return
1205                fi
1206                ;;
1207        esac
1208
1209        __gitcomp_nl "$(__git_refs)"
1210}
1211
1212_git_help ()
1213{
1214        case "$cur" in
1215        --*)
1216                __gitcomp "--all --info --man --web"
1217                return
1218                ;;
1219        esac
1220        __git_compute_all_commands
1221        __gitcomp "$__git_all_commands $(__git_aliases)
1222                attributes cli core-tutorial cvs-migration
1223                diffcore gitk glossary hooks ignore modules
1224                namespaces repository-layout tutorial tutorial-2
1225                workflows
1226                "
1227}
1228
1229_git_init ()
1230{
1231        case "$cur" in
1232        --shared=*)
1233                __gitcomp "
1234                        false true umask group all world everybody
1235                        " "" "${cur##--shared=}"
1236                return
1237                ;;
1238        --*)
1239                __gitcomp "--quiet --bare --template= --shared --shared="
1240                return
1241                ;;
1242        esac
1243        COMPREPLY=()
1244}
1245
1246_git_ls_files ()
1247{
1248        __git_has_doubledash && return
1249
1250        case "$cur" in
1251        --*)
1252                __gitcomp "--cached --deleted --modified --others --ignored
1253                        --stage --directory --no-empty-directory --unmerged
1254                        --killed --exclude= --exclude-from=
1255                        --exclude-per-directory= --exclude-standard
1256                        --error-unmatch --with-tree= --full-name
1257                        --abbrev --ignored --exclude-per-directory
1258                        "
1259                return
1260                ;;
1261        esac
1262        COMPREPLY=()
1263}
1264
1265_git_ls_remote ()
1266{
1267        __gitcomp_nl "$(__git_remotes)"
1268}
1269
1270_git_ls_tree ()
1271{
1272        __git_complete_file
1273}
1274
1275# Options that go well for log, shortlog and gitk
1276__git_log_common_options="
1277        --not --all
1278        --branches --tags --remotes
1279        --first-parent --merges --no-merges
1280        --max-count=
1281        --max-age= --since= --after=
1282        --min-age= --until= --before=
1283        --min-parents= --max-parents=
1284        --no-min-parents --no-max-parents
1285"
1286# Options that go well for log and gitk (not shortlog)
1287__git_log_gitk_options="
1288        --dense --sparse --full-history
1289        --simplify-merges --simplify-by-decoration
1290        --left-right --notes --no-notes
1291"
1292# Options that go well for log and shortlog (not gitk)
1293__git_log_shortlog_options="
1294        --author= --committer= --grep=
1295        --all-match
1296"
1297
1298__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1299__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1300
1301_git_log ()
1302{
1303        __git_has_doubledash && return
1304
1305        local g="$(git rev-parse --git-dir 2>/dev/null)"
1306        local merge=""
1307        if [ -f "$g/MERGE_HEAD" ]; then
1308                merge="--merge"
1309        fi
1310        case "$cur" in
1311        --pretty=*|--format=*)
1312                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1313                        " "" "${cur#*=}"
1314                return
1315                ;;
1316        --date=*)
1317                __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1318                return
1319                ;;
1320        --decorate=*)
1321                __gitcomp "long short" "" "${cur##--decorate=}"
1322                return
1323                ;;
1324        --*)
1325                __gitcomp "
1326                        $__git_log_common_options
1327                        $__git_log_shortlog_options
1328                        $__git_log_gitk_options
1329                        --root --topo-order --date-order --reverse
1330                        --follow --full-diff
1331                        --abbrev-commit --abbrev=
1332                        --relative-date --date=
1333                        --pretty= --format= --oneline
1334                        --cherry-pick
1335                        --graph
1336                        --decorate --decorate=
1337                        --walk-reflogs
1338                        --parents --children
1339                        $merge
1340                        $__git_diff_common_options
1341                        --pickaxe-all --pickaxe-regex
1342                        "
1343                return
1344                ;;
1345        esac
1346        __git_complete_revlist
1347}
1348
1349__git_merge_options="
1350        --no-commit --no-stat --log --no-log --squash --strategy
1351        --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1352"
1353
1354_git_merge ()
1355{
1356        __git_complete_strategy && return
1357
1358        case "$cur" in
1359        --*)
1360                __gitcomp "$__git_merge_options"
1361                return
1362        esac
1363        __gitcomp_nl "$(__git_refs)"
1364}
1365
1366_git_mergetool ()
1367{
1368        case "$cur" in
1369        --tool=*)
1370                __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1371                return
1372                ;;
1373        --*)
1374                __gitcomp "--tool="
1375                return
1376                ;;
1377        esac
1378        COMPREPLY=()
1379}
1380
1381_git_merge_base ()
1382{
1383        __gitcomp_nl "$(__git_refs)"
1384}
1385
1386_git_mv ()
1387{
1388        case "$cur" in
1389        --*)
1390                __gitcomp "--dry-run"
1391                return
1392                ;;
1393        esac
1394        COMPREPLY=()
1395}
1396
1397_git_name_rev ()
1398{
1399        __gitcomp "--tags --all --stdin"
1400}
1401
1402_git_notes ()
1403{
1404        local subcommands='add append copy edit list prune remove show'
1405        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1406
1407        case "$subcommand,$cur" in
1408        ,--*)
1409                __gitcomp '--ref'
1410                ;;
1411        ,*)
1412                case "$prev" in
1413                --ref)
1414                        __gitcomp_nl "$(__git_refs)"
1415                        ;;
1416                *)
1417                        __gitcomp "$subcommands --ref"
1418                        ;;
1419                esac
1420                ;;
1421        add,--reuse-message=*|append,--reuse-message=*|\
1422        add,--reedit-message=*|append,--reedit-message=*)
1423                __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1424                ;;
1425        add,--*|append,--*)
1426                __gitcomp '--file= --message= --reedit-message=
1427                                --reuse-message='
1428                ;;
1429        copy,--*)
1430                __gitcomp '--stdin'
1431                ;;
1432        prune,--*)
1433                __gitcomp '--dry-run --verbose'
1434                ;;
1435        prune,*)
1436                ;;
1437        *)
1438                case "$prev" in
1439                -m|-F)
1440                        ;;
1441                *)
1442                        __gitcomp_nl "$(__git_refs)"
1443                        ;;
1444                esac
1445                ;;
1446        esac
1447}
1448
1449_git_pull ()
1450{
1451        __git_complete_strategy && return
1452
1453        case "$cur" in
1454        --*)
1455                __gitcomp "
1456                        --rebase --no-rebase
1457                        $__git_merge_options
1458                        $__git_fetch_options
1459                "
1460                return
1461                ;;
1462        esac
1463        __git_complete_remote_or_refspec
1464}
1465
1466_git_push ()
1467{
1468        case "$prev" in
1469        --repo)
1470                __gitcomp_nl "$(__git_remotes)"
1471                return
1472        esac
1473        case "$cur" in
1474        --repo=*)
1475                __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1476                return
1477                ;;
1478        --*)
1479                __gitcomp "
1480                        --all --mirror --tags --dry-run --force --verbose
1481                        --receive-pack= --repo= --set-upstream
1482                "
1483                return
1484                ;;
1485        esac
1486        __git_complete_remote_or_refspec
1487}
1488
1489_git_rebase ()
1490{
1491        local dir="$(__gitdir)"
1492        if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1493                __gitcomp "--continue --skip --abort"
1494                return
1495        fi
1496        __git_complete_strategy && return
1497        case "$cur" in
1498        --whitespace=*)
1499                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1500                return
1501                ;;
1502        --*)
1503                __gitcomp "
1504                        --onto --merge --strategy --interactive
1505                        --preserve-merges --stat --no-stat
1506                        --committer-date-is-author-date --ignore-date
1507                        --ignore-whitespace --whitespace=
1508                        --autosquash
1509                        "
1510
1511                return
1512        esac
1513        __gitcomp_nl "$(__git_refs)"
1514}
1515
1516_git_reflog ()
1517{
1518        local subcommands="show delete expire"
1519        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1520
1521        if [ -z "$subcommand" ]; then
1522                __gitcomp "$subcommands"
1523        else
1524                __gitcomp_nl "$(__git_refs)"
1525        fi
1526}
1527
1528__git_send_email_confirm_options="always never auto cc compose"
1529__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1530
1531_git_send_email ()
1532{
1533        case "$cur" in
1534        --confirm=*)
1535                __gitcomp "
1536                        $__git_send_email_confirm_options
1537                        " "" "${cur##--confirm=}"
1538                return
1539                ;;
1540        --suppress-cc=*)
1541                __gitcomp "
1542                        $__git_send_email_suppresscc_options
1543                        " "" "${cur##--suppress-cc=}"
1544
1545                return
1546                ;;
1547        --smtp-encryption=*)
1548                __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1549                return
1550                ;;
1551        --thread=*)
1552                __gitcomp "
1553                        deep shallow
1554                        " "" "${cur##--thread=}"
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                        $__git_format_patch_options"
1568                return
1569                ;;
1570        esac
1571        __git_complete_revlist
1572}
1573
1574_git_stage ()
1575{
1576        _git_add
1577}
1578
1579__git_config_get_set_variables ()
1580{
1581        local prevword word config_file= c=$cword
1582        while [ $c -gt 1 ]; do
1583                word="${words[c]}"
1584                case "$word" in
1585                --global|--system|--file=*)
1586                        config_file="$word"
1587                        break
1588                        ;;
1589                -f|--file)
1590                        config_file="$word $prevword"
1591                        break
1592                        ;;
1593                esac
1594                prevword=$word
1595                c=$((--c))
1596        done
1597
1598        git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1599        while read -r line
1600        do
1601                case "$line" in
1602                *.*=*)
1603                        echo "${line/=*/}"
1604                        ;;
1605                esac
1606        done
1607}
1608
1609_git_config ()
1610{
1611        case "$prev" in
1612        branch.*.remote)
1613                __gitcomp_nl "$(__git_remotes)"
1614                return
1615                ;;
1616        branch.*.merge)
1617                __gitcomp_nl "$(__git_refs)"
1618                return
1619                ;;
1620        remote.*.fetch)
1621                local remote="${prev#remote.}"
1622                remote="${remote%.fetch}"
1623                if [ -z "$cur" ]; then
1624                        COMPREPLY=("refs/heads/")
1625                        return
1626                fi
1627                __gitcomp_nl "$(__git_refs_remotes "$remote")"
1628                return
1629                ;;
1630        remote.*.push)
1631                local remote="${prev#remote.}"
1632                remote="${remote%.push}"
1633                __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1634                        for-each-ref --format='%(refname):%(refname)' \
1635                        refs/heads)"
1636                return
1637                ;;
1638        pull.twohead|pull.octopus)
1639                __git_compute_merge_strategies
1640                __gitcomp "$__git_merge_strategies"
1641                return
1642                ;;
1643        color.branch|color.diff|color.interactive|\
1644        color.showbranch|color.status|color.ui)
1645                __gitcomp "always never auto"
1646                return
1647                ;;
1648        color.pager)
1649                __gitcomp "false true"
1650                return
1651                ;;
1652        color.*.*)
1653                __gitcomp "
1654                        normal black red green yellow blue magenta cyan white
1655                        bold dim ul blink reverse
1656                        "
1657                return
1658                ;;
1659        help.format)
1660                __gitcomp "man info web html"
1661                return
1662                ;;
1663        log.date)
1664                __gitcomp "$__git_log_date_formats"
1665                return
1666                ;;
1667        sendemail.aliasesfiletype)
1668                __gitcomp "mutt mailrc pine elm gnus"
1669                return
1670                ;;
1671        sendemail.confirm)
1672                __gitcomp "$__git_send_email_confirm_options"
1673                return
1674                ;;
1675        sendemail.suppresscc)
1676                __gitcomp "$__git_send_email_suppresscc_options"
1677                return
1678                ;;
1679        --get|--get-all|--unset|--unset-all)
1680                __gitcomp_nl "$(__git_config_get_set_variables)"
1681                return
1682                ;;
1683        *.*)
1684                COMPREPLY=()
1685                return
1686                ;;
1687        esac
1688        case "$cur" in
1689        --*)
1690                __gitcomp "
1691                        --global --system --file=
1692                        --list --replace-all
1693                        --get --get-all --get-regexp
1694                        --add --unset --unset-all
1695                        --remove-section --rename-section
1696                        "
1697                return
1698                ;;
1699        branch.*.*)
1700                local pfx="${cur%.*}." cur_="${cur##*.}"
1701                __gitcomp "remote merge mergeoptions rebase" "$pfx" "$cur_"
1702                return
1703                ;;
1704        branch.*)
1705                local pfx="${cur%.*}." cur_="${cur#*.}"
1706                __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1707                return
1708                ;;
1709        guitool.*.*)
1710                local pfx="${cur%.*}." cur_="${cur##*.}"
1711                __gitcomp "
1712                        argprompt cmd confirm needsfile noconsole norescan
1713                        prompt revprompt revunmerged title
1714                        " "$pfx" "$cur_"
1715                return
1716                ;;
1717        difftool.*.*)
1718                local pfx="${cur%.*}." cur_="${cur##*.}"
1719                __gitcomp "cmd path" "$pfx" "$cur_"
1720                return
1721                ;;
1722        man.*.*)
1723                local pfx="${cur%.*}." cur_="${cur##*.}"
1724                __gitcomp "cmd path" "$pfx" "$cur_"
1725                return
1726                ;;
1727        mergetool.*.*)
1728                local pfx="${cur%.*}." cur_="${cur##*.}"
1729                __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1730                return
1731                ;;
1732        pager.*)
1733                local pfx="${cur%.*}." cur_="${cur#*.}"
1734                __git_compute_all_commands
1735                __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1736                return
1737                ;;
1738        remote.*.*)
1739                local pfx="${cur%.*}." cur_="${cur##*.}"
1740                __gitcomp "
1741                        url proxy fetch push mirror skipDefaultUpdate
1742                        receivepack uploadpack tagopt pushurl
1743                        " "$pfx" "$cur_"
1744                return
1745                ;;
1746        remote.*)
1747                local pfx="${cur%.*}." cur_="${cur#*.}"
1748                __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1749                return
1750                ;;
1751        url.*.*)
1752                local pfx="${cur%.*}." cur_="${cur##*.}"
1753                __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1754                return
1755                ;;
1756        esac
1757        __gitcomp "
1758                add.ignoreErrors
1759                advice.commitBeforeMerge
1760                advice.detachedHead
1761                advice.implicitIdentity
1762                advice.pushNonFastForward
1763                advice.resolveConflict
1764                advice.statusHints
1765                alias.
1766                am.keepcr
1767                apply.ignorewhitespace
1768                apply.whitespace
1769                branch.autosetupmerge
1770                branch.autosetuprebase
1771                browser.
1772                clean.requireForce
1773                color.branch
1774                color.branch.current
1775                color.branch.local
1776                color.branch.plain
1777                color.branch.remote
1778                color.decorate.HEAD
1779                color.decorate.branch
1780                color.decorate.remoteBranch
1781                color.decorate.stash
1782                color.decorate.tag
1783                color.diff
1784                color.diff.commit
1785                color.diff.frag
1786                color.diff.func
1787                color.diff.meta
1788                color.diff.new
1789                color.diff.old
1790                color.diff.plain
1791                color.diff.whitespace
1792                color.grep
1793                color.grep.context
1794                color.grep.filename
1795                color.grep.function
1796                color.grep.linenumber
1797                color.grep.match
1798                color.grep.selected
1799                color.grep.separator
1800                color.interactive
1801                color.interactive.error
1802                color.interactive.header
1803                color.interactive.help
1804                color.interactive.prompt
1805                color.pager
1806                color.showbranch
1807                color.status
1808                color.status.added
1809                color.status.changed
1810                color.status.header
1811                color.status.nobranch
1812                color.status.untracked
1813                color.status.updated
1814                color.ui
1815                commit.status
1816                commit.template
1817                core.abbrev
1818                core.askpass
1819                core.attributesfile
1820                core.autocrlf
1821                core.bare
1822                core.bigFileThreshold
1823                core.compression
1824                core.createObject
1825                core.deltaBaseCacheLimit
1826                core.editor
1827                core.eol
1828                core.excludesfile
1829                core.fileMode
1830                core.fsyncobjectfiles
1831                core.gitProxy
1832                core.ignoreCygwinFSTricks
1833                core.ignoreStat
1834                core.ignorecase
1835                core.logAllRefUpdates
1836                core.loosecompression
1837                core.notesRef
1838                core.packedGitLimit
1839                core.packedGitWindowSize
1840                core.pager
1841                core.preferSymlinkRefs
1842                core.preloadindex
1843                core.quotepath
1844                core.repositoryFormatVersion
1845                core.safecrlf
1846                core.sharedRepository
1847                core.sparseCheckout
1848                core.symlinks
1849                core.trustctime
1850                core.warnAmbiguousRefs
1851                core.whitespace
1852                core.worktree
1853                diff.autorefreshindex
1854                diff.statGraphWidth
1855                diff.external
1856                diff.ignoreSubmodules
1857                diff.mnemonicprefix
1858                diff.noprefix
1859                diff.renameLimit
1860                diff.renames
1861                diff.suppressBlankEmpty
1862                diff.tool
1863                diff.wordRegex
1864                difftool.
1865                difftool.prompt
1866                fetch.recurseSubmodules
1867                fetch.unpackLimit
1868                format.attach
1869                format.cc
1870                format.headers
1871                format.numbered
1872                format.pretty
1873                format.signature
1874                format.signoff
1875                format.subjectprefix
1876                format.suffix
1877                format.thread
1878                format.to
1879                gc.
1880                gc.aggressiveWindow
1881                gc.auto
1882                gc.autopacklimit
1883                gc.packrefs
1884                gc.pruneexpire
1885                gc.reflogexpire
1886                gc.reflogexpireunreachable
1887                gc.rerereresolved
1888                gc.rerereunresolved
1889                gitcvs.allbinary
1890                gitcvs.commitmsgannotation
1891                gitcvs.dbTableNamePrefix
1892                gitcvs.dbdriver
1893                gitcvs.dbname
1894                gitcvs.dbpass
1895                gitcvs.dbuser
1896                gitcvs.enabled
1897                gitcvs.logfile
1898                gitcvs.usecrlfattr
1899                guitool.
1900                gui.blamehistoryctx
1901                gui.commitmsgwidth
1902                gui.copyblamethreshold
1903                gui.diffcontext
1904                gui.encoding
1905                gui.fastcopyblame
1906                gui.matchtrackingbranch
1907                gui.newbranchtemplate
1908                gui.pruneduringfetch
1909                gui.spellingdictionary
1910                gui.trustmtime
1911                help.autocorrect
1912                help.browser
1913                help.format
1914                http.lowSpeedLimit
1915                http.lowSpeedTime
1916                http.maxRequests
1917                http.minSessions
1918                http.noEPSV
1919                http.postBuffer
1920                http.proxy
1921                http.sslCAInfo
1922                http.sslCAPath
1923                http.sslCert
1924                http.sslCertPasswordProtected
1925                http.sslKey
1926                http.sslVerify
1927                http.useragent
1928                i18n.commitEncoding
1929                i18n.logOutputEncoding
1930                imap.authMethod
1931                imap.folder
1932                imap.host
1933                imap.pass
1934                imap.port
1935                imap.preformattedHTML
1936                imap.sslverify
1937                imap.tunnel
1938                imap.user
1939                init.templatedir
1940                instaweb.browser
1941                instaweb.httpd
1942                instaweb.local
1943                instaweb.modulepath
1944                instaweb.port
1945                interactive.singlekey
1946                log.date
1947                log.decorate
1948                log.showroot
1949                mailmap.file
1950                man.
1951                man.viewer
1952                merge.
1953                merge.conflictstyle
1954                merge.log
1955                merge.renameLimit
1956                merge.renormalize
1957                merge.stat
1958                merge.tool
1959                merge.verbosity
1960                mergetool.
1961                mergetool.keepBackup
1962                mergetool.keepTemporaries
1963                mergetool.prompt
1964                notes.displayRef
1965                notes.rewrite.
1966                notes.rewrite.amend
1967                notes.rewrite.rebase
1968                notes.rewriteMode
1969                notes.rewriteRef
1970                pack.compression
1971                pack.deltaCacheLimit
1972                pack.deltaCacheSize
1973                pack.depth
1974                pack.indexVersion
1975                pack.packSizeLimit
1976                pack.threads
1977                pack.window
1978                pack.windowMemory
1979                pager.
1980                pretty.
1981                pull.octopus
1982                pull.twohead
1983                push.default
1984                rebase.autosquash
1985                rebase.stat
1986                receive.autogc
1987                receive.denyCurrentBranch
1988                receive.denyDeleteCurrent
1989                receive.denyDeletes
1990                receive.denyNonFastForwards
1991                receive.fsckObjects
1992                receive.unpackLimit
1993                receive.updateserverinfo
1994                remotes.
1995                repack.usedeltabaseoffset
1996                rerere.autoupdate
1997                rerere.enabled
1998                sendemail.
1999                sendemail.aliasesfile
2000                sendemail.aliasfiletype
2001                sendemail.bcc
2002                sendemail.cc
2003                sendemail.cccmd
2004                sendemail.chainreplyto
2005                sendemail.confirm
2006                sendemail.envelopesender
2007                sendemail.from
2008                sendemail.identity
2009                sendemail.multiedit
2010                sendemail.signedoffbycc
2011                sendemail.smtpdomain
2012                sendemail.smtpencryption
2013                sendemail.smtppass
2014                sendemail.smtpserver
2015                sendemail.smtpserveroption
2016                sendemail.smtpserverport
2017                sendemail.smtpuser
2018                sendemail.suppresscc
2019                sendemail.suppressfrom
2020                sendemail.thread
2021                sendemail.to
2022                sendemail.validate
2023                showbranch.default
2024                status.relativePaths
2025                status.showUntrackedFiles
2026                status.submodulesummary
2027                submodule.
2028                tar.umask
2029                transfer.unpackLimit
2030                url.
2031                user.email
2032                user.name
2033                user.signingkey
2034                web.browser
2035                branch. remote.
2036        "
2037}
2038
2039_git_remote ()
2040{
2041        local subcommands="add rename remove set-head set-branches set-url show prune update"
2042        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2043        if [ -z "$subcommand" ]; then
2044                __gitcomp "$subcommands"
2045                return
2046        fi
2047
2048        case "$subcommand" in
2049        rename|remove|set-url|show|prune)
2050                __gitcomp_nl "$(__git_remotes)"
2051                ;;
2052        set-head|set-branches)
2053                __git_complete_remote_or_refspec
2054                ;;
2055        update)
2056                local i c='' IFS=$'\n'
2057                for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2058                        i="${i#remotes.}"
2059                        c="$c ${i/ */}"
2060                done
2061                __gitcomp "$c"
2062                ;;
2063        *)
2064                COMPREPLY=()
2065                ;;
2066        esac
2067}
2068
2069_git_replace ()
2070{
2071        __gitcomp_nl "$(__git_refs)"
2072}
2073
2074_git_reset ()
2075{
2076        __git_has_doubledash && return
2077
2078        case "$cur" in
2079        --*)
2080                __gitcomp "--merge --mixed --hard --soft --patch"
2081                return
2082                ;;
2083        esac
2084        __gitcomp_nl "$(__git_refs)"
2085}
2086
2087_git_revert ()
2088{
2089        case "$cur" in
2090        --*)
2091                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2092                return
2093                ;;
2094        esac
2095        __gitcomp_nl "$(__git_refs)"
2096}
2097
2098_git_rm ()
2099{
2100        __git_has_doubledash && return
2101
2102        case "$cur" in
2103        --*)
2104                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2105                return
2106                ;;
2107        esac
2108        COMPREPLY=()
2109}
2110
2111_git_shortlog ()
2112{
2113        __git_has_doubledash && return
2114
2115        case "$cur" in
2116        --*)
2117                __gitcomp "
2118                        $__git_log_common_options
2119                        $__git_log_shortlog_options
2120                        --numbered --summary
2121                        "
2122                return
2123                ;;
2124        esac
2125        __git_complete_revlist
2126}
2127
2128_git_show ()
2129{
2130        __git_has_doubledash && return
2131
2132        case "$cur" in
2133        --pretty=*|--format=*)
2134                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2135                        " "" "${cur#*=}"
2136                return
2137                ;;
2138        --*)
2139                __gitcomp "--pretty= --format= --abbrev-commit --oneline
2140                        $__git_diff_common_options
2141                        "
2142                return
2143                ;;
2144        esac
2145        __git_complete_file
2146}
2147
2148_git_show_branch ()
2149{
2150        case "$cur" in
2151        --*)
2152                __gitcomp "
2153                        --all --remotes --topo-order --current --more=
2154                        --list --independent --merge-base --no-name
2155                        --color --no-color
2156                        --sha1-name --sparse --topics --reflog
2157                        "
2158                return
2159                ;;
2160        esac
2161        __git_complete_revlist
2162}
2163
2164_git_stash ()
2165{
2166        local save_opts='--keep-index --no-keep-index --quiet --patch'
2167        local subcommands='save list show apply clear drop pop create branch'
2168        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2169        if [ -z "$subcommand" ]; then
2170                case "$cur" in
2171                --*)
2172                        __gitcomp "$save_opts"
2173                        ;;
2174                *)
2175                        if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2176                                __gitcomp "$subcommands"
2177                        else
2178                                COMPREPLY=()
2179                        fi
2180                        ;;
2181                esac
2182        else
2183                case "$subcommand,$cur" in
2184                save,--*)
2185                        __gitcomp "$save_opts"
2186                        ;;
2187                apply,--*|pop,--*)
2188                        __gitcomp "--index --quiet"
2189                        ;;
2190                show,--*|drop,--*|branch,--*)
2191                        COMPREPLY=()
2192                        ;;
2193                show,*|apply,*|drop,*|pop,*|branch,*)
2194                        __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2195                                        | sed -n -e 's/:.*//p')"
2196                        ;;
2197                *)
2198                        COMPREPLY=()
2199                        ;;
2200                esac
2201        fi
2202}
2203
2204_git_submodule ()
2205{
2206        __git_has_doubledash && return
2207
2208        local subcommands="add status init update summary foreach sync"
2209        if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2210                case "$cur" in
2211                --*)
2212                        __gitcomp "--quiet --cached"
2213                        ;;
2214                *)
2215                        __gitcomp "$subcommands"
2216                        ;;
2217                esac
2218                return
2219        fi
2220}
2221
2222_git_svn ()
2223{
2224        local subcommands="
2225                init fetch clone rebase dcommit log find-rev
2226                set-tree commit-diff info create-ignore propget
2227                proplist show-ignore show-externals branch tag blame
2228                migrate mkdirs reset gc
2229                "
2230        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2231        if [ -z "$subcommand" ]; then
2232                __gitcomp "$subcommands"
2233        else
2234                local remote_opts="--username= --config-dir= --no-auth-cache"
2235                local fc_opts="
2236                        --follow-parent --authors-file= --repack=
2237                        --no-metadata --use-svm-props --use-svnsync-props
2238                        --log-window-size= --no-checkout --quiet
2239                        --repack-flags --use-log-author --localtime
2240                        --ignore-paths= $remote_opts
2241                        "
2242                local init_opts="
2243                        --template= --shared= --trunk= --tags=
2244                        --branches= --stdlayout --minimize-url
2245                        --no-metadata --use-svm-props --use-svnsync-props
2246                        --rewrite-root= --prefix= --use-log-author
2247                        --add-author-from $remote_opts
2248                        "
2249                local cmt_opts="
2250                        --edit --rmdir --find-copies-harder --copy-similarity=
2251                        "
2252
2253                case "$subcommand,$cur" in
2254                fetch,--*)
2255                        __gitcomp "--revision= --fetch-all $fc_opts"
2256                        ;;
2257                clone,--*)
2258                        __gitcomp "--revision= $fc_opts $init_opts"
2259                        ;;
2260                init,--*)
2261                        __gitcomp "$init_opts"
2262                        ;;
2263                dcommit,--*)
2264                        __gitcomp "
2265                                --merge --strategy= --verbose --dry-run
2266                                --fetch-all --no-rebase --commit-url
2267                                --revision --interactive $cmt_opts $fc_opts
2268                                "
2269                        ;;
2270                set-tree,--*)
2271                        __gitcomp "--stdin $cmt_opts $fc_opts"
2272                        ;;
2273                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2274                show-externals,--*|mkdirs,--*)
2275                        __gitcomp "--revision="
2276                        ;;
2277                log,--*)
2278                        __gitcomp "
2279                                --limit= --revision= --verbose --incremental
2280                                --oneline --show-commit --non-recursive
2281                                --authors-file= --color
2282                                "
2283                        ;;
2284                rebase,--*)
2285                        __gitcomp "
2286                                --merge --verbose --strategy= --local
2287                                --fetch-all --dry-run $fc_opts
2288                                "
2289                        ;;
2290                commit-diff,--*)
2291                        __gitcomp "--message= --file= --revision= $cmt_opts"
2292                        ;;
2293                info,--*)
2294                        __gitcomp "--url"
2295                        ;;
2296                branch,--*)
2297                        __gitcomp "--dry-run --message --tag"
2298                        ;;
2299                tag,--*)
2300                        __gitcomp "--dry-run --message"
2301                        ;;
2302                blame,--*)
2303                        __gitcomp "--git-format"
2304                        ;;
2305                migrate,--*)
2306                        __gitcomp "
2307                                --config-dir= --ignore-paths= --minimize
2308                                --no-auth-cache --username=
2309                                "
2310                        ;;
2311                reset,--*)
2312                        __gitcomp "--revision= --parent"
2313                        ;;
2314                *)
2315                        COMPREPLY=()
2316                        ;;
2317                esac
2318        fi
2319}
2320
2321_git_tag ()
2322{
2323        local i c=1 f=0
2324        while [ $c -lt $cword ]; do
2325                i="${words[c]}"
2326                case "$i" in
2327                -d|-v)
2328                        __gitcomp_nl "$(__git_tags)"
2329                        return
2330                        ;;
2331                -f)
2332                        f=1
2333                        ;;
2334                esac
2335                ((c++))
2336        done
2337
2338        case "$prev" in
2339        -m|-F)
2340                COMPREPLY=()
2341                ;;
2342        -*|tag)
2343                if [ $f = 1 ]; then
2344                        __gitcomp_nl "$(__git_tags)"
2345                else
2346                        COMPREPLY=()
2347                fi
2348                ;;
2349        *)
2350                __gitcomp_nl "$(__git_refs)"
2351                ;;
2352        esac
2353}
2354
2355_git_whatchanged ()
2356{
2357        _git_log
2358}
2359
2360__git_main ()
2361{
2362        local i c=1 command __git_dir
2363
2364        while [ $c -lt $cword ]; do
2365                i="${words[c]}"
2366                case "$i" in
2367                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2368                --bare)      __git_dir="." ;;
2369                --help) command="help"; break ;;
2370                -c) c=$((++c)) ;;
2371                -*) ;;
2372                *) command="$i"; break ;;
2373                esac
2374                ((c++))
2375        done
2376
2377        if [ -z "$command" ]; then
2378                case "$cur" in
2379                --*)   __gitcomp "
2380                        --paginate
2381                        --no-pager
2382                        --git-dir=
2383                        --bare
2384                        --version
2385                        --exec-path
2386                        --exec-path=
2387                        --html-path
2388                        --info-path
2389                        --work-tree=
2390                        --namespace=
2391                        --no-replace-objects
2392                        --help
2393                        "
2394                        ;;
2395                *)     __git_compute_porcelain_commands
2396                       __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2397                esac
2398                return
2399        fi
2400
2401        local completion_func="_git_${command//-/_}"
2402        declare -f $completion_func >/dev/null && $completion_func && return
2403
2404        local expansion=$(__git_aliased_command "$command")
2405        if [ -n "$expansion" ]; then
2406                completion_func="_git_${expansion//-/_}"
2407                declare -f $completion_func >/dev/null && $completion_func
2408        fi
2409}
2410
2411__gitk_main ()
2412{
2413        __git_has_doubledash && return
2414
2415        local g="$(__gitdir)"
2416        local merge=""
2417        if [ -f "$g/MERGE_HEAD" ]; then
2418                merge="--merge"
2419        fi
2420        case "$cur" in
2421        --*)
2422                __gitcomp "
2423                        $__git_log_common_options
2424                        $__git_log_gitk_options
2425                        $merge
2426                        "
2427                return
2428                ;;
2429        esac
2430        __git_complete_revlist
2431}
2432
2433__git_func_wrap ()
2434{
2435        if [[ -n ${ZSH_VERSION-} ]]; then
2436                emulate -L bash
2437                setopt KSH_TYPESET
2438
2439                # workaround zsh's bug that leaves 'words' as a special
2440                # variable in versions < 4.3.12
2441                typeset -h words
2442
2443                # workaround zsh's bug that quotes spaces in the COMPREPLY
2444                # array if IFS doesn't contain spaces.
2445                typeset -h IFS
2446        fi
2447        local cur words cword prev
2448        _get_comp_words_by_ref -n =: cur words cword prev
2449        $1
2450}
2451
2452# Setup completion for certain functions defined above by setting common
2453# variables and workarounds.
2454# This is NOT a public function; use at your own risk.
2455__git_complete ()
2456{
2457        local wrapper="__git_wrap${2}"
2458        eval "$wrapper () { __git_func_wrap $2 ; }"
2459        complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2460                || complete -o default -o nospace -F $wrapper $1
2461}
2462
2463# wrapper for backwards compatibility
2464_git ()
2465{
2466        __git_wrap__git_main
2467}
2468
2469# wrapper for backwards compatibility
2470_gitk ()
2471{
2472        __git_wrap__gitk_main
2473}
2474
2475__git_complete git __git_main
2476__git_complete gitk __gitk_main
2477
2478# The following are necessary only for Cygwin, and only are needed
2479# when the user has tab-completed the executable name and consequently
2480# included the '.exe' suffix.
2481#
2482if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2483__git_complete git.exe __git_main
2484fi