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