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