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