contrib / completion / git-completion.bashon commit completion: add option '--recurse-submodules' to 'git clone' (5f072e0)
   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                column)           : internal helper;;
 667                commit-tree)      : plumbing;;
 668                count-objects)    : infrequent;;
 669                credential)       : credentials;;
 670                credential-*)     : credentials helper;;
 671                cvsexportcommit)  : export;;
 672                cvsimport)        : import;;
 673                cvsserver)        : daemon;;
 674                daemon)           : daemon;;
 675                diff-files)       : plumbing;;
 676                diff-index)       : plumbing;;
 677                diff-tree)        : plumbing;;
 678                fast-import)      : import;;
 679                fast-export)      : export;;
 680                fsck-objects)     : plumbing;;
 681                fetch-pack)       : plumbing;;
 682                fmt-merge-msg)    : plumbing;;
 683                for-each-ref)     : plumbing;;
 684                hash-object)      : plumbing;;
 685                http-*)           : transport;;
 686                index-pack)       : plumbing;;
 687                init-db)          : deprecated;;
 688                local-fetch)      : plumbing;;
 689                ls-files)         : plumbing;;
 690                ls-remote)        : plumbing;;
 691                ls-tree)          : plumbing;;
 692                mailinfo)         : plumbing;;
 693                mailsplit)        : plumbing;;
 694                merge-*)          : plumbing;;
 695                mktree)           : plumbing;;
 696                mktag)            : plumbing;;
 697                pack-objects)     : plumbing;;
 698                pack-redundant)   : plumbing;;
 699                pack-refs)        : plumbing;;
 700                parse-remote)     : plumbing;;
 701                patch-id)         : plumbing;;
 702                prune)            : plumbing;;
 703                prune-packed)     : plumbing;;
 704                quiltimport)      : import;;
 705                read-tree)        : plumbing;;
 706                receive-pack)     : plumbing;;
 707                remote-*)         : transport;;
 708                rerere)           : plumbing;;
 709                rev-list)         : plumbing;;
 710                rev-parse)        : plumbing;;
 711                runstatus)        : plumbing;;
 712                sh-setup)         : internal;;
 713                shell)            : daemon;;
 714                show-ref)         : plumbing;;
 715                send-pack)        : plumbing;;
 716                show-index)       : plumbing;;
 717                ssh-*)            : transport;;
 718                stripspace)       : plumbing;;
 719                symbolic-ref)     : plumbing;;
 720                unpack-file)      : plumbing;;
 721                unpack-objects)   : plumbing;;
 722                update-index)     : plumbing;;
 723                update-ref)       : plumbing;;
 724                update-server-info) : daemon;;
 725                upload-archive)   : plumbing;;
 726                upload-pack)      : plumbing;;
 727                write-tree)       : plumbing;;
 728                var)              : infrequent;;
 729                verify-pack)      : infrequent;;
 730                verify-tag)       : plumbing;;
 731                *) echo $i;;
 732                esac
 733        done
 734}
 735
 736__git_porcelain_commands=
 737__git_compute_porcelain_commands ()
 738{
 739        test -n "$__git_porcelain_commands" ||
 740        __git_porcelain_commands=$(__git_list_porcelain_commands)
 741}
 742
 743# Lists all set config variables starting with the given section prefix,
 744# with the prefix removed.
 745__git_get_config_variables ()
 746{
 747        local section="$1" i IFS=$'\n'
 748        for i in $(git --git-dir="$(__gitdir)" config --name-only --get-regexp "^$section\..*" 2>/dev/null); do
 749                echo "${i#$section.}"
 750        done
 751}
 752
 753__git_pretty_aliases ()
 754{
 755        __git_get_config_variables "pretty"
 756}
 757
 758__git_aliases ()
 759{
 760        __git_get_config_variables "alias"
 761}
 762
 763# __git_aliased_command requires 1 argument
 764__git_aliased_command ()
 765{
 766        local word cmdline=$(git --git-dir="$(__gitdir)" \
 767                config --get "alias.$1")
 768        for word in $cmdline; do
 769                case "$word" in
 770                \!gitk|gitk)
 771                        echo "gitk"
 772                        return
 773                        ;;
 774                \!*)    : shell command alias ;;
 775                -*)     : option ;;
 776                *=*)    : setting env ;;
 777                git)    : git itself ;;
 778                \(\))   : skip parens of shell function definition ;;
 779                {)      : skip start of shell helper function ;;
 780                :)      : skip null command ;;
 781                \'*)    : skip opening quote after sh -c ;;
 782                *)
 783                        echo "$word"
 784                        return
 785                esac
 786        done
 787}
 788
 789# __git_find_on_cmdline requires 1 argument
 790__git_find_on_cmdline ()
 791{
 792        local word subcommand c=1
 793        while [ $c -lt $cword ]; do
 794                word="${words[c]}"
 795                for subcommand in $1; do
 796                        if [ "$subcommand" = "$word" ]; then
 797                                echo "$subcommand"
 798                                return
 799                        fi
 800                done
 801                ((c++))
 802        done
 803}
 804
 805__git_has_doubledash ()
 806{
 807        local c=1
 808        while [ $c -lt $cword ]; do
 809                if [ "--" = "${words[c]}" ]; then
 810                        return 0
 811                fi
 812                ((c++))
 813        done
 814        return 1
 815}
 816
 817# Try to count non option arguments passed on the command line for the
 818# specified git command.
 819# When options are used, it is necessary to use the special -- option to
 820# tell the implementation were non option arguments begin.
 821# XXX this can not be improved, since options can appear everywhere, as
 822# an example:
 823#       git mv x -n y
 824#
 825# __git_count_arguments requires 1 argument: the git command executed.
 826__git_count_arguments ()
 827{
 828        local word i c=0
 829
 830        # Skip "git" (first argument)
 831        for ((i=1; i < ${#words[@]}; i++)); do
 832                word="${words[i]}"
 833
 834                case "$word" in
 835                        --)
 836                                # Good; we can assume that the following are only non
 837                                # option arguments.
 838                                ((c = 0))
 839                                ;;
 840                        "$1")
 841                                # Skip the specified git command and discard git
 842                                # main options
 843                                ((c = 0))
 844                                ;;
 845                        ?*)
 846                                ((c++))
 847                                ;;
 848                esac
 849        done
 850
 851        printf "%d" $c
 852}
 853
 854__git_whitespacelist="nowarn warn error error-all fix"
 855
 856_git_am ()
 857{
 858        local dir="$(__gitdir)"
 859        if [ -d "$dir"/rebase-apply ]; then
 860                __gitcomp "--skip --continue --resolved --abort"
 861                return
 862        fi
 863        case "$cur" in
 864        --whitespace=*)
 865                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 866                return
 867                ;;
 868        --*)
 869                __gitcomp "
 870                        --3way --committer-date-is-author-date --ignore-date
 871                        --ignore-whitespace --ignore-space-change
 872                        --interactive --keep --no-utf8 --signoff --utf8
 873                        --whitespace= --scissors
 874                        "
 875                return
 876        esac
 877}
 878
 879_git_apply ()
 880{
 881        case "$cur" in
 882        --whitespace=*)
 883                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 884                return
 885                ;;
 886        --*)
 887                __gitcomp "
 888                        --stat --numstat --summary --check --index
 889                        --cached --index-info --reverse --reject --unidiff-zero
 890                        --apply --no-add --exclude=
 891                        --ignore-whitespace --ignore-space-change
 892                        --whitespace= --inaccurate-eof --verbose
 893                        "
 894                return
 895        esac
 896}
 897
 898_git_add ()
 899{
 900        case "$cur" in
 901        --*)
 902                __gitcomp "
 903                        --interactive --refresh --patch --update --dry-run
 904                        --ignore-errors --intent-to-add
 905                        "
 906                return
 907        esac
 908
 909        # XXX should we check for --update and --all options ?
 910        __git_complete_index_file "--others --modified --directory --no-empty-directory"
 911}
 912
 913_git_archive ()
 914{
 915        case "$cur" in
 916        --format=*)
 917                __gitcomp "$(git archive --list)" "" "${cur##--format=}"
 918                return
 919                ;;
 920        --remote=*)
 921                __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
 922                return
 923                ;;
 924        --*)
 925                __gitcomp "
 926                        --format= --list --verbose
 927                        --prefix= --remote= --exec=
 928                        "
 929                return
 930                ;;
 931        esac
 932        __git_complete_file
 933}
 934
 935_git_bisect ()
 936{
 937        __git_has_doubledash && return
 938
 939        local subcommands="start bad good skip reset visualize replay log run"
 940        local subcommand="$(__git_find_on_cmdline "$subcommands")"
 941        if [ -z "$subcommand" ]; then
 942                if [ -f "$(__gitdir)"/BISECT_START ]; then
 943                        __gitcomp "$subcommands"
 944                else
 945                        __gitcomp "replay start"
 946                fi
 947                return
 948        fi
 949
 950        case "$subcommand" in
 951        bad|good|reset|skip|start)
 952                __gitcomp_nl "$(__git_refs)"
 953                ;;
 954        *)
 955                ;;
 956        esac
 957}
 958
 959_git_branch ()
 960{
 961        local i c=1 only_local_ref="n" has_r="n"
 962
 963        while [ $c -lt $cword ]; do
 964                i="${words[c]}"
 965                case "$i" in
 966                -d|-m)  only_local_ref="y" ;;
 967                -r)     has_r="y" ;;
 968                esac
 969                ((c++))
 970        done
 971
 972        case "$cur" in
 973        --set-upstream-to=*)
 974                __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}"
 975                ;;
 976        --*)
 977                __gitcomp "
 978                        --color --no-color --verbose --abbrev= --no-abbrev
 979                        --track --no-track --contains --merged --no-merged
 980                        --set-upstream-to= --edit-description --list
 981                        --unset-upstream
 982                        "
 983                ;;
 984        *)
 985                if [ $only_local_ref = "y" -a $has_r = "n" ]; then
 986                        __gitcomp_nl "$(__git_heads)"
 987                else
 988                        __gitcomp_nl "$(__git_refs)"
 989                fi
 990                ;;
 991        esac
 992}
 993
 994_git_bundle ()
 995{
 996        local cmd="${words[2]}"
 997        case "$cword" in
 998        2)
 999                __gitcomp "create list-heads verify unbundle"
1000                ;;
1001        3)
1002                # looking for a file
1003                ;;
1004        *)
1005                case "$cmd" in
1006                        create)
1007                                __git_complete_revlist
1008                        ;;
1009                esac
1010                ;;
1011        esac
1012}
1013
1014_git_checkout ()
1015{
1016        __git_has_doubledash && return
1017
1018        case "$cur" in
1019        --conflict=*)
1020                __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1021                ;;
1022        --*)
1023                __gitcomp "
1024                        --quiet --ours --theirs --track --no-track --merge
1025                        --conflict= --orphan --patch
1026                        "
1027                ;;
1028        *)
1029                # check if --track, --no-track, or --no-guess was specified
1030                # if so, disable DWIM mode
1031                local flags="--track --no-track --no-guess" track=1
1032                if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1033                        track=''
1034                fi
1035                __gitcomp_nl "$(__git_refs '' $track)"
1036                ;;
1037        esac
1038}
1039
1040_git_cherry ()
1041{
1042        __gitcomp_nl "$(__git_refs)"
1043}
1044
1045_git_cherry_pick ()
1046{
1047        local dir="$(__gitdir)"
1048        if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1049                __gitcomp "--continue --quit --abort"
1050                return
1051        fi
1052        case "$cur" in
1053        --*)
1054                __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1055                ;;
1056        *)
1057                __gitcomp_nl "$(__git_refs)"
1058                ;;
1059        esac
1060}
1061
1062_git_clean ()
1063{
1064        case "$cur" in
1065        --*)
1066                __gitcomp "--dry-run --quiet"
1067                return
1068                ;;
1069        esac
1070
1071        # XXX should we check for -x option ?
1072        __git_complete_index_file "--others --directory"
1073}
1074
1075_git_clone ()
1076{
1077        case "$cur" in
1078        --*)
1079                __gitcomp "
1080                        --local
1081                        --no-hardlinks
1082                        --shared
1083                        --reference
1084                        --quiet
1085                        --no-checkout
1086                        --bare
1087                        --mirror
1088                        --origin
1089                        --upload-pack
1090                        --template=
1091                        --depth
1092                        --single-branch
1093                        --branch
1094                        --recurse-submodules
1095                        "
1096                return
1097                ;;
1098        esac
1099}
1100
1101_git_commit ()
1102{
1103        case "$prev" in
1104        -c|-C)
1105                __gitcomp_nl "$(__git_refs)" "" "${cur}"
1106                return
1107                ;;
1108        esac
1109
1110        case "$cur" in
1111        --cleanup=*)
1112                __gitcomp "default scissors strip verbatim whitespace
1113                        " "" "${cur##--cleanup=}"
1114                return
1115                ;;
1116        --reuse-message=*|--reedit-message=*|\
1117        --fixup=*|--squash=*)
1118                __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1119                return
1120                ;;
1121        --untracked-files=*)
1122                __gitcomp "all no normal" "" "${cur##--untracked-files=}"
1123                return
1124                ;;
1125        --*)
1126                __gitcomp "
1127                        --all --author= --signoff --verify --no-verify
1128                        --edit --no-edit
1129                        --amend --include --only --interactive
1130                        --dry-run --reuse-message= --reedit-message=
1131                        --reset-author --file= --message= --template=
1132                        --cleanup= --untracked-files --untracked-files=
1133                        --verbose --quiet --fixup= --squash=
1134                        "
1135                return
1136        esac
1137
1138        if git rev-parse --verify --quiet HEAD >/dev/null; then
1139                __git_complete_index_file "--committable"
1140        else
1141                # This is the first commit
1142                __git_complete_index_file "--cached"
1143        fi
1144}
1145
1146_git_describe ()
1147{
1148        case "$cur" in
1149        --*)
1150                __gitcomp "
1151                        --all --tags --contains --abbrev= --candidates=
1152                        --exact-match --debug --long --match --always
1153                        "
1154                return
1155        esac
1156        __gitcomp_nl "$(__git_refs)"
1157}
1158
1159__git_diff_algorithms="myers minimal patience histogram"
1160
1161__git_diff_common_options="--stat --numstat --shortstat --summary
1162                        --patch-with-stat --name-only --name-status --color
1163                        --no-color --color-words --no-renames --check
1164                        --full-index --binary --abbrev --diff-filter=
1165                        --find-copies-harder
1166                        --text --ignore-space-at-eol --ignore-space-change
1167                        --ignore-all-space --ignore-blank-lines --exit-code
1168                        --quiet --ext-diff --no-ext-diff
1169                        --no-prefix --src-prefix= --dst-prefix=
1170                        --inter-hunk-context=
1171                        --patience --histogram --minimal
1172                        --raw --word-diff
1173                        --dirstat --dirstat= --dirstat-by-file
1174                        --dirstat-by-file= --cumulative
1175                        --diff-algorithm=
1176"
1177
1178_git_diff ()
1179{
1180        __git_has_doubledash && return
1181
1182        case "$cur" in
1183        --diff-algorithm=*)
1184                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1185                return
1186                ;;
1187        --*)
1188                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1189                        --base --ours --theirs --no-index
1190                        $__git_diff_common_options
1191                        "
1192                return
1193                ;;
1194        esac
1195        __git_complete_revlist_file
1196}
1197
1198__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1199                        tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
1200"
1201
1202_git_difftool ()
1203{
1204        __git_has_doubledash && return
1205
1206        case "$cur" in
1207        --tool=*)
1208                __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1209                return
1210                ;;
1211        --*)
1212                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1213                        --base --ours --theirs
1214                        --no-renames --diff-filter= --find-copies-harder
1215                        --relative --ignore-submodules
1216                        --tool="
1217                return
1218                ;;
1219        esac
1220        __git_complete_revlist_file
1221}
1222
1223__git_fetch_recurse_submodules="yes on-demand no"
1224
1225__git_fetch_options="
1226        --quiet --verbose --append --upload-pack --force --keep --depth=
1227        --tags --no-tags --all --prune --dry-run --recurse-submodules=
1228"
1229
1230_git_fetch ()
1231{
1232        case "$cur" in
1233        --recurse-submodules=*)
1234                __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1235                return
1236                ;;
1237        --*)
1238                __gitcomp "$__git_fetch_options"
1239                return
1240                ;;
1241        esac
1242        __git_complete_remote_or_refspec
1243}
1244
1245__git_format_patch_options="
1246        --stdout --attach --no-attach --thread --thread= --no-thread
1247        --numbered --start-number --numbered-files --keep-subject --signoff
1248        --signature --no-signature --in-reply-to= --cc= --full-index --binary
1249        --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1250        --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1251        --output-directory --reroll-count --to= --quiet --notes
1252"
1253
1254_git_format_patch ()
1255{
1256        case "$cur" in
1257        --thread=*)
1258                __gitcomp "
1259                        deep shallow
1260                        " "" "${cur##--thread=}"
1261                return
1262                ;;
1263        --*)
1264                __gitcomp "$__git_format_patch_options"
1265                return
1266                ;;
1267        esac
1268        __git_complete_revlist
1269}
1270
1271_git_fsck ()
1272{
1273        case "$cur" in
1274        --*)
1275                __gitcomp "
1276                        --tags --root --unreachable --cache --no-reflogs --full
1277                        --strict --verbose --lost-found
1278                        "
1279                return
1280                ;;
1281        esac
1282}
1283
1284_git_gc ()
1285{
1286        case "$cur" in
1287        --*)
1288                __gitcomp "--prune --aggressive"
1289                return
1290                ;;
1291        esac
1292}
1293
1294_git_gitk ()
1295{
1296        _gitk
1297}
1298
1299__git_match_ctag() {
1300        awk "/^${1//\//\\/}/ { print \$1 }" "$2"
1301}
1302
1303_git_grep ()
1304{
1305        __git_has_doubledash && return
1306
1307        case "$cur" in
1308        --*)
1309                __gitcomp "
1310                        --cached
1311                        --text --ignore-case --word-regexp --invert-match
1312                        --full-name --line-number
1313                        --extended-regexp --basic-regexp --fixed-strings
1314                        --perl-regexp
1315                        --files-with-matches --name-only
1316                        --files-without-match
1317                        --max-depth
1318                        --count
1319                        --and --or --not --all-match
1320                        "
1321                return
1322                ;;
1323        esac
1324
1325        case "$cword,$prev" in
1326        2,*|*,-*)
1327                if test -r tags; then
1328                        __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1329                        return
1330                fi
1331                ;;
1332        esac
1333
1334        __gitcomp_nl "$(__git_refs)"
1335}
1336
1337_git_help ()
1338{
1339        case "$cur" in
1340        --*)
1341                __gitcomp "--all --info --man --web"
1342                return
1343                ;;
1344        esac
1345        __git_compute_all_commands
1346        __gitcomp "$__git_all_commands $(__git_aliases)
1347                attributes cli core-tutorial cvs-migration
1348                diffcore gitk glossary hooks ignore modules
1349                namespaces repository-layout tutorial tutorial-2
1350                workflows
1351                "
1352}
1353
1354_git_init ()
1355{
1356        case "$cur" in
1357        --shared=*)
1358                __gitcomp "
1359                        false true umask group all world everybody
1360                        " "" "${cur##--shared=}"
1361                return
1362                ;;
1363        --*)
1364                __gitcomp "--quiet --bare --template= --shared --shared="
1365                return
1366                ;;
1367        esac
1368}
1369
1370_git_ls_files ()
1371{
1372        case "$cur" in
1373        --*)
1374                __gitcomp "--cached --deleted --modified --others --ignored
1375                        --stage --directory --no-empty-directory --unmerged
1376                        --killed --exclude= --exclude-from=
1377                        --exclude-per-directory= --exclude-standard
1378                        --error-unmatch --with-tree= --full-name
1379                        --abbrev --ignored --exclude-per-directory
1380                        "
1381                return
1382                ;;
1383        esac
1384
1385        # XXX ignore options like --modified and always suggest all cached
1386        # files.
1387        __git_complete_index_file "--cached"
1388}
1389
1390_git_ls_remote ()
1391{
1392        __gitcomp_nl "$(__git_remotes)"
1393}
1394
1395_git_ls_tree ()
1396{
1397        __git_complete_file
1398}
1399
1400# Options that go well for log, shortlog and gitk
1401__git_log_common_options="
1402        --not --all
1403        --branches --tags --remotes
1404        --first-parent --merges --no-merges
1405        --max-count=
1406        --max-age= --since= --after=
1407        --min-age= --until= --before=
1408        --min-parents= --max-parents=
1409        --no-min-parents --no-max-parents
1410"
1411# Options that go well for log and gitk (not shortlog)
1412__git_log_gitk_options="
1413        --dense --sparse --full-history
1414        --simplify-merges --simplify-by-decoration
1415        --left-right --notes --no-notes
1416"
1417# Options that go well for log and shortlog (not gitk)
1418__git_log_shortlog_options="
1419        --author= --committer= --grep=
1420        --all-match --invert-grep
1421"
1422
1423__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1424__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1425
1426_git_log ()
1427{
1428        __git_has_doubledash && return
1429
1430        local g="$(git rev-parse --git-dir 2>/dev/null)"
1431        local merge=""
1432        if [ -f "$g/MERGE_HEAD" ]; then
1433                merge="--merge"
1434        fi
1435        case "$cur" in
1436        --pretty=*|--format=*)
1437                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1438                        " "" "${cur#*=}"
1439                return
1440                ;;
1441        --date=*)
1442                __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1443                return
1444                ;;
1445        --decorate=*)
1446                __gitcomp "full short no" "" "${cur##--decorate=}"
1447                return
1448                ;;
1449        --*)
1450                __gitcomp "
1451                        $__git_log_common_options
1452                        $__git_log_shortlog_options
1453                        $__git_log_gitk_options
1454                        --root --topo-order --date-order --reverse
1455                        --follow --full-diff
1456                        --abbrev-commit --abbrev=
1457                        --relative-date --date=
1458                        --pretty= --format= --oneline
1459                        --show-signature
1460                        --cherry-pick
1461                        --graph
1462                        --decorate --decorate=
1463                        --walk-reflogs
1464                        --parents --children
1465                        $merge
1466                        $__git_diff_common_options
1467                        --pickaxe-all --pickaxe-regex
1468                        "
1469                return
1470                ;;
1471        esac
1472        __git_complete_revlist
1473}
1474
1475# Common merge options shared by git-merge(1) and git-pull(1).
1476__git_merge_options="
1477        --no-commit --no-stat --log --no-log --squash --strategy
1478        --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1479        --verify-signatures --no-verify-signatures --gpg-sign
1480        --quiet --verbose --progress --no-progress
1481"
1482
1483_git_merge ()
1484{
1485        __git_complete_strategy && return
1486
1487        case "$cur" in
1488        --*)
1489                __gitcomp "$__git_merge_options
1490                        --rerere-autoupdate --no-rerere-autoupdate --abort"
1491                return
1492        esac
1493        __gitcomp_nl "$(__git_refs)"
1494}
1495
1496_git_mergetool ()
1497{
1498        case "$cur" in
1499        --tool=*)
1500                __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1501                return
1502                ;;
1503        --*)
1504                __gitcomp "--tool="
1505                return
1506                ;;
1507        esac
1508}
1509
1510_git_merge_base ()
1511{
1512        case "$cur" in
1513        --*)
1514                __gitcomp "--octopus --independent --is-ancestor --fork-point"
1515                return
1516                ;;
1517        esac
1518        __gitcomp_nl "$(__git_refs)"
1519}
1520
1521_git_mv ()
1522{
1523        case "$cur" in
1524        --*)
1525                __gitcomp "--dry-run"
1526                return
1527                ;;
1528        esac
1529
1530        if [ $(__git_count_arguments "mv") -gt 0 ]; then
1531                # We need to show both cached and untracked files (including
1532                # empty directories) since this may not be the last argument.
1533                __git_complete_index_file "--cached --others --directory"
1534        else
1535                __git_complete_index_file "--cached"
1536        fi
1537}
1538
1539_git_name_rev ()
1540{
1541        __gitcomp "--tags --all --stdin"
1542}
1543
1544_git_notes ()
1545{
1546        local subcommands='add append copy edit list prune remove show'
1547        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1548
1549        case "$subcommand,$cur" in
1550        ,--*)
1551                __gitcomp '--ref'
1552                ;;
1553        ,*)
1554                case "$prev" in
1555                --ref)
1556                        __gitcomp_nl "$(__git_refs)"
1557                        ;;
1558                *)
1559                        __gitcomp "$subcommands --ref"
1560                        ;;
1561                esac
1562                ;;
1563        add,--reuse-message=*|append,--reuse-message=*|\
1564        add,--reedit-message=*|append,--reedit-message=*)
1565                __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1566                ;;
1567        add,--*|append,--*)
1568                __gitcomp '--file= --message= --reedit-message=
1569                                --reuse-message='
1570                ;;
1571        copy,--*)
1572                __gitcomp '--stdin'
1573                ;;
1574        prune,--*)
1575                __gitcomp '--dry-run --verbose'
1576                ;;
1577        prune,*)
1578                ;;
1579        *)
1580                case "$prev" in
1581                -m|-F)
1582                        ;;
1583                *)
1584                        __gitcomp_nl "$(__git_refs)"
1585                        ;;
1586                esac
1587                ;;
1588        esac
1589}
1590
1591_git_pull ()
1592{
1593        __git_complete_strategy && return
1594
1595        case "$cur" in
1596        --recurse-submodules=*)
1597                __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1598                return
1599                ;;
1600        --*)
1601                __gitcomp "
1602                        --rebase --no-rebase
1603                        $__git_merge_options
1604                        $__git_fetch_options
1605                "
1606                return
1607                ;;
1608        esac
1609        __git_complete_remote_or_refspec
1610}
1611
1612__git_push_recurse_submodules="check on-demand"
1613
1614__git_complete_force_with_lease ()
1615{
1616        local cur_=$1
1617
1618        case "$cur_" in
1619        --*=)
1620                ;;
1621        *:*)
1622                __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
1623                ;;
1624        *)
1625                __gitcomp_nl "$(__git_refs)" "" "$cur_"
1626                ;;
1627        esac
1628}
1629
1630_git_push ()
1631{
1632        case "$prev" in
1633        --repo)
1634                __gitcomp_nl "$(__git_remotes)"
1635                return
1636                ;;
1637        --recurse-submodules)
1638                __gitcomp "$__git_push_recurse_submodules"
1639                return
1640                ;;
1641        esac
1642        case "$cur" in
1643        --repo=*)
1644                __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1645                return
1646                ;;
1647        --recurse-submodules=*)
1648                __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1649                return
1650                ;;
1651        --force-with-lease=*)
1652                __git_complete_force_with_lease "${cur##--force-with-lease=}"
1653                return
1654                ;;
1655        --*)
1656                __gitcomp "
1657                        --all --mirror --tags --dry-run --force --verbose
1658                        --quiet --prune --delete --follow-tags
1659                        --receive-pack= --repo= --set-upstream
1660                        --force-with-lease --force-with-lease= --recurse-submodules=
1661                "
1662                return
1663                ;;
1664        esac
1665        __git_complete_remote_or_refspec
1666}
1667
1668_git_rebase ()
1669{
1670        local dir="$(__gitdir)"
1671        if [ -f "$dir"/rebase-merge/interactive ]; then
1672                __gitcomp "--continue --skip --abort --edit-todo"
1673                return
1674        elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1675                __gitcomp "--continue --skip --abort"
1676                return
1677        fi
1678        __git_complete_strategy && return
1679        case "$cur" in
1680        --whitespace=*)
1681                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1682                return
1683                ;;
1684        --*)
1685                __gitcomp "
1686                        --onto --merge --strategy --interactive
1687                        --preserve-merges --stat --no-stat
1688                        --committer-date-is-author-date --ignore-date
1689                        --ignore-whitespace --whitespace=
1690                        --autosquash --fork-point --no-fork-point
1691                        --autostash
1692                        "
1693
1694                return
1695        esac
1696        __gitcomp_nl "$(__git_refs)"
1697}
1698
1699_git_reflog ()
1700{
1701        local subcommands="show delete expire"
1702        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1703
1704        if [ -z "$subcommand" ]; then
1705                __gitcomp "$subcommands"
1706        else
1707                __gitcomp_nl "$(__git_refs)"
1708        fi
1709}
1710
1711__git_send_email_confirm_options="always never auto cc compose"
1712__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1713
1714_git_send_email ()
1715{
1716        case "$cur" in
1717        --confirm=*)
1718                __gitcomp "
1719                        $__git_send_email_confirm_options
1720                        " "" "${cur##--confirm=}"
1721                return
1722                ;;
1723        --suppress-cc=*)
1724                __gitcomp "
1725                        $__git_send_email_suppresscc_options
1726                        " "" "${cur##--suppress-cc=}"
1727
1728                return
1729                ;;
1730        --smtp-encryption=*)
1731                __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1732                return
1733                ;;
1734        --thread=*)
1735                __gitcomp "
1736                        deep shallow
1737                        " "" "${cur##--thread=}"
1738                return
1739                ;;
1740        --*)
1741                __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1742                        --compose --confirm= --dry-run --envelope-sender
1743                        --from --identity
1744                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1745                        --no-suppress-from --no-thread --quiet
1746                        --signed-off-by-cc --smtp-pass --smtp-server
1747                        --smtp-server-port --smtp-encryption= --smtp-user
1748                        --subject --suppress-cc= --suppress-from --thread --to
1749                        --validate --no-validate
1750                        $__git_format_patch_options"
1751                return
1752                ;;
1753        esac
1754        __git_complete_revlist
1755}
1756
1757_git_stage ()
1758{
1759        _git_add
1760}
1761
1762__git_config_get_set_variables ()
1763{
1764        local prevword word config_file= c=$cword
1765        while [ $c -gt 1 ]; do
1766                word="${words[c]}"
1767                case "$word" in
1768                --system|--global|--local|--file=*)
1769                        config_file="$word"
1770                        break
1771                        ;;
1772                -f|--file)
1773                        config_file="$word $prevword"
1774                        break
1775                        ;;
1776                esac
1777                prevword=$word
1778                c=$((--c))
1779        done
1780
1781        git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
1782}
1783
1784_git_config ()
1785{
1786        case "$prev" in
1787        branch.*.remote|branch.*.pushremote)
1788                __gitcomp_nl "$(__git_remotes)"
1789                return
1790                ;;
1791        branch.*.merge)
1792                __gitcomp_nl "$(__git_refs)"
1793                return
1794                ;;
1795        branch.*.rebase)
1796                __gitcomp "false true"
1797                return
1798                ;;
1799        remote.pushdefault)
1800                __gitcomp_nl "$(__git_remotes)"
1801                return
1802                ;;
1803        remote.*.fetch)
1804                local remote="${prev#remote.}"
1805                remote="${remote%.fetch}"
1806                if [ -z "$cur" ]; then
1807                        __gitcomp_nl "refs/heads/" "" "" ""
1808                        return
1809                fi
1810                __gitcomp_nl "$(__git_refs_remotes "$remote")"
1811                return
1812                ;;
1813        remote.*.push)
1814                local remote="${prev#remote.}"
1815                remote="${remote%.push}"
1816                __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1817                        for-each-ref --format='%(refname):%(refname)' \
1818                        refs/heads)"
1819                return
1820                ;;
1821        pull.twohead|pull.octopus)
1822                __git_compute_merge_strategies
1823                __gitcomp "$__git_merge_strategies"
1824                return
1825                ;;
1826        color.branch|color.diff|color.interactive|\
1827        color.showbranch|color.status|color.ui)
1828                __gitcomp "always never auto"
1829                return
1830                ;;
1831        color.pager)
1832                __gitcomp "false true"
1833                return
1834                ;;
1835        color.*.*)
1836                __gitcomp "
1837                        normal black red green yellow blue magenta cyan white
1838                        bold dim ul blink reverse
1839                        "
1840                return
1841                ;;
1842        diff.submodule)
1843                __gitcomp "log short"
1844                return
1845                ;;
1846        help.format)
1847                __gitcomp "man info web html"
1848                return
1849                ;;
1850        log.date)
1851                __gitcomp "$__git_log_date_formats"
1852                return
1853                ;;
1854        sendemail.aliasesfiletype)
1855                __gitcomp "mutt mailrc pine elm gnus"
1856                return
1857                ;;
1858        sendemail.confirm)
1859                __gitcomp "$__git_send_email_confirm_options"
1860                return
1861                ;;
1862        sendemail.suppresscc)
1863                __gitcomp "$__git_send_email_suppresscc_options"
1864                return
1865                ;;
1866        sendemail.transferencoding)
1867                __gitcomp "7bit 8bit quoted-printable base64"
1868                return
1869                ;;
1870        --get|--get-all|--unset|--unset-all)
1871                __gitcomp_nl "$(__git_config_get_set_variables)"
1872                return
1873                ;;
1874        *.*)
1875                return
1876                ;;
1877        esac
1878        case "$cur" in
1879        --*)
1880                __gitcomp "
1881                        --system --global --local --file=
1882                        --list --replace-all
1883                        --get --get-all --get-regexp
1884                        --add --unset --unset-all
1885                        --remove-section --rename-section
1886                        --name-only
1887                        "
1888                return
1889                ;;
1890        branch.*.*)
1891                local pfx="${cur%.*}." cur_="${cur##*.}"
1892                __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
1893                return
1894                ;;
1895        branch.*)
1896                local pfx="${cur%.*}." cur_="${cur#*.}"
1897                __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1898                __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
1899                return
1900                ;;
1901        guitool.*.*)
1902                local pfx="${cur%.*}." cur_="${cur##*.}"
1903                __gitcomp "
1904                        argprompt cmd confirm needsfile noconsole norescan
1905                        prompt revprompt revunmerged title
1906                        " "$pfx" "$cur_"
1907                return
1908                ;;
1909        difftool.*.*)
1910                local pfx="${cur%.*}." cur_="${cur##*.}"
1911                __gitcomp "cmd path" "$pfx" "$cur_"
1912                return
1913                ;;
1914        man.*.*)
1915                local pfx="${cur%.*}." cur_="${cur##*.}"
1916                __gitcomp "cmd path" "$pfx" "$cur_"
1917                return
1918                ;;
1919        mergetool.*.*)
1920                local pfx="${cur%.*}." cur_="${cur##*.}"
1921                __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1922                return
1923                ;;
1924        pager.*)
1925                local pfx="${cur%.*}." cur_="${cur#*.}"
1926                __git_compute_all_commands
1927                __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1928                return
1929                ;;
1930        remote.*.*)
1931                local pfx="${cur%.*}." cur_="${cur##*.}"
1932                __gitcomp "
1933                        url proxy fetch push mirror skipDefaultUpdate
1934                        receivepack uploadpack tagopt pushurl
1935                        " "$pfx" "$cur_"
1936                return
1937                ;;
1938        remote.*)
1939                local pfx="${cur%.*}." cur_="${cur#*.}"
1940                __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1941                __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
1942                return
1943                ;;
1944        url.*.*)
1945                local pfx="${cur%.*}." cur_="${cur##*.}"
1946                __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1947                return
1948                ;;
1949        esac
1950        __gitcomp "
1951                add.ignoreErrors
1952                advice.commitBeforeMerge
1953                advice.detachedHead
1954                advice.implicitIdentity
1955                advice.pushNonFastForward
1956                advice.resolveConflict
1957                advice.statusHints
1958                alias.
1959                am.keepcr
1960                apply.ignorewhitespace
1961                apply.whitespace
1962                branch.autosetupmerge
1963                branch.autosetuprebase
1964                browser.
1965                clean.requireForce
1966                color.branch
1967                color.branch.current
1968                color.branch.local
1969                color.branch.plain
1970                color.branch.remote
1971                color.decorate.HEAD
1972                color.decorate.branch
1973                color.decorate.remoteBranch
1974                color.decorate.stash
1975                color.decorate.tag
1976                color.diff
1977                color.diff.commit
1978                color.diff.frag
1979                color.diff.func
1980                color.diff.meta
1981                color.diff.new
1982                color.diff.old
1983                color.diff.plain
1984                color.diff.whitespace
1985                color.grep
1986                color.grep.context
1987                color.grep.filename
1988                color.grep.function
1989                color.grep.linenumber
1990                color.grep.match
1991                color.grep.selected
1992                color.grep.separator
1993                color.interactive
1994                color.interactive.error
1995                color.interactive.header
1996                color.interactive.help
1997                color.interactive.prompt
1998                color.pager
1999                color.showbranch
2000                color.status
2001                color.status.added
2002                color.status.changed
2003                color.status.header
2004                color.status.nobranch
2005                color.status.unmerged
2006                color.status.untracked
2007                color.status.updated
2008                color.ui
2009                commit.status
2010                commit.template
2011                core.abbrev
2012                core.askpass
2013                core.attributesfile
2014                core.autocrlf
2015                core.bare
2016                core.bigFileThreshold
2017                core.compression
2018                core.createObject
2019                core.deltaBaseCacheLimit
2020                core.editor
2021                core.eol
2022                core.excludesfile
2023                core.fileMode
2024                core.fsyncobjectfiles
2025                core.gitProxy
2026                core.ignoreStat
2027                core.ignorecase
2028                core.logAllRefUpdates
2029                core.loosecompression
2030                core.notesRef
2031                core.packedGitLimit
2032                core.packedGitWindowSize
2033                core.pager
2034                core.preferSymlinkRefs
2035                core.preloadindex
2036                core.quotepath
2037                core.repositoryFormatVersion
2038                core.safecrlf
2039                core.sharedRepository
2040                core.sparseCheckout
2041                core.symlinks
2042                core.trustctime
2043                core.warnAmbiguousRefs
2044                core.whitespace
2045                core.worktree
2046                diff.autorefreshindex
2047                diff.external
2048                diff.ignoreSubmodules
2049                diff.mnemonicprefix
2050                diff.noprefix
2051                diff.renameLimit
2052                diff.renames
2053                diff.statGraphWidth
2054                diff.submodule
2055                diff.suppressBlankEmpty
2056                diff.tool
2057                diff.wordRegex
2058                diff.algorithm
2059                difftool.
2060                difftool.prompt
2061                fetch.recurseSubmodules
2062                fetch.unpackLimit
2063                format.attach
2064                format.cc
2065                format.coverLetter
2066                format.headers
2067                format.numbered
2068                format.pretty
2069                format.signature
2070                format.signoff
2071                format.subjectprefix
2072                format.suffix
2073                format.thread
2074                format.to
2075                gc.
2076                gc.aggressiveWindow
2077                gc.auto
2078                gc.autopacklimit
2079                gc.packrefs
2080                gc.pruneexpire
2081                gc.reflogexpire
2082                gc.reflogexpireunreachable
2083                gc.rerereresolved
2084                gc.rerereunresolved
2085                gitcvs.allbinary
2086                gitcvs.commitmsgannotation
2087                gitcvs.dbTableNamePrefix
2088                gitcvs.dbdriver
2089                gitcvs.dbname
2090                gitcvs.dbpass
2091                gitcvs.dbuser
2092                gitcvs.enabled
2093                gitcvs.logfile
2094                gitcvs.usecrlfattr
2095                guitool.
2096                gui.blamehistoryctx
2097                gui.commitmsgwidth
2098                gui.copyblamethreshold
2099                gui.diffcontext
2100                gui.encoding
2101                gui.fastcopyblame
2102                gui.matchtrackingbranch
2103                gui.newbranchtemplate
2104                gui.pruneduringfetch
2105                gui.spellingdictionary
2106                gui.trustmtime
2107                help.autocorrect
2108                help.browser
2109                help.format
2110                http.lowSpeedLimit
2111                http.lowSpeedTime
2112                http.maxRequests
2113                http.minSessions
2114                http.noEPSV
2115                http.postBuffer
2116                http.proxy
2117                http.sslCipherList
2118                http.sslVersion
2119                http.sslCAInfo
2120                http.sslCAPath
2121                http.sslCert
2122                http.sslCertPasswordProtected
2123                http.sslKey
2124                http.sslVerify
2125                http.useragent
2126                i18n.commitEncoding
2127                i18n.logOutputEncoding
2128                imap.authMethod
2129                imap.folder
2130                imap.host
2131                imap.pass
2132                imap.port
2133                imap.preformattedHTML
2134                imap.sslverify
2135                imap.tunnel
2136                imap.user
2137                init.templatedir
2138                instaweb.browser
2139                instaweb.httpd
2140                instaweb.local
2141                instaweb.modulepath
2142                instaweb.port
2143                interactive.singlekey
2144                log.date
2145                log.decorate
2146                log.showroot
2147                mailmap.file
2148                man.
2149                man.viewer
2150                merge.
2151                merge.conflictstyle
2152                merge.log
2153                merge.renameLimit
2154                merge.renormalize
2155                merge.stat
2156                merge.tool
2157                merge.verbosity
2158                mergetool.
2159                mergetool.keepBackup
2160                mergetool.keepTemporaries
2161                mergetool.prompt
2162                notes.displayRef
2163                notes.rewrite.
2164                notes.rewrite.amend
2165                notes.rewrite.rebase
2166                notes.rewriteMode
2167                notes.rewriteRef
2168                pack.compression
2169                pack.deltaCacheLimit
2170                pack.deltaCacheSize
2171                pack.depth
2172                pack.indexVersion
2173                pack.packSizeLimit
2174                pack.threads
2175                pack.window
2176                pack.windowMemory
2177                pager.
2178                pretty.
2179                pull.octopus
2180                pull.twohead
2181                push.default
2182                push.followTags
2183                rebase.autosquash
2184                rebase.stat
2185                receive.autogc
2186                receive.denyCurrentBranch
2187                receive.denyDeleteCurrent
2188                receive.denyDeletes
2189                receive.denyNonFastForwards
2190                receive.fsckObjects
2191                receive.unpackLimit
2192                receive.updateserverinfo
2193                remote.pushdefault
2194                remotes.
2195                repack.usedeltabaseoffset
2196                rerere.autoupdate
2197                rerere.enabled
2198                sendemail.
2199                sendemail.aliasesfile
2200                sendemail.aliasfiletype
2201                sendemail.bcc
2202                sendemail.cc
2203                sendemail.cccmd
2204                sendemail.chainreplyto
2205                sendemail.confirm
2206                sendemail.envelopesender
2207                sendemail.from
2208                sendemail.identity
2209                sendemail.multiedit
2210                sendemail.signedoffbycc
2211                sendemail.smtpdomain
2212                sendemail.smtpencryption
2213                sendemail.smtppass
2214                sendemail.smtpserver
2215                sendemail.smtpserveroption
2216                sendemail.smtpserverport
2217                sendemail.smtpuser
2218                sendemail.suppresscc
2219                sendemail.suppressfrom
2220                sendemail.thread
2221                sendemail.to
2222                sendemail.validate
2223                showbranch.default
2224                status.relativePaths
2225                status.showUntrackedFiles
2226                status.submodulesummary
2227                submodule.
2228                tar.umask
2229                transfer.unpackLimit
2230                url.
2231                user.email
2232                user.name
2233                user.signingkey
2234                web.browser
2235                branch. remote.
2236        "
2237}
2238
2239_git_remote ()
2240{
2241        local subcommands="add rename remove set-head set-branches set-url show prune update"
2242        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2243        if [ -z "$subcommand" ]; then
2244                __gitcomp "$subcommands"
2245                return
2246        fi
2247
2248        case "$subcommand" in
2249        rename|remove|set-url|show|prune)
2250                __gitcomp_nl "$(__git_remotes)"
2251                ;;
2252        set-head|set-branches)
2253                __git_complete_remote_or_refspec
2254                ;;
2255        update)
2256                __gitcomp "$(__git_get_config_variables "remotes")"
2257                ;;
2258        *)
2259                ;;
2260        esac
2261}
2262
2263_git_replace ()
2264{
2265        __gitcomp_nl "$(__git_refs)"
2266}
2267
2268_git_reset ()
2269{
2270        __git_has_doubledash && return
2271
2272        case "$cur" in
2273        --*)
2274                __gitcomp "--merge --mixed --hard --soft --patch"
2275                return
2276                ;;
2277        esac
2278        __gitcomp_nl "$(__git_refs)"
2279}
2280
2281_git_revert ()
2282{
2283        local dir="$(__gitdir)"
2284        if [ -f "$dir"/REVERT_HEAD ]; then
2285                __gitcomp "--continue --quit --abort"
2286                return
2287        fi
2288        case "$cur" in
2289        --*)
2290                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2291                return
2292                ;;
2293        esac
2294        __gitcomp_nl "$(__git_refs)"
2295}
2296
2297_git_rm ()
2298{
2299        case "$cur" in
2300        --*)
2301                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2302                return
2303                ;;
2304        esac
2305
2306        __git_complete_index_file "--cached"
2307}
2308
2309_git_shortlog ()
2310{
2311        __git_has_doubledash && return
2312
2313        case "$cur" in
2314        --*)
2315                __gitcomp "
2316                        $__git_log_common_options
2317                        $__git_log_shortlog_options
2318                        --numbered --summary
2319                        "
2320                return
2321                ;;
2322        esac
2323        __git_complete_revlist
2324}
2325
2326_git_show ()
2327{
2328        __git_has_doubledash && return
2329
2330        case "$cur" in
2331        --pretty=*|--format=*)
2332                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2333                        " "" "${cur#*=}"
2334                return
2335                ;;
2336        --diff-algorithm=*)
2337                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2338                return
2339                ;;
2340        --*)
2341                __gitcomp "--pretty= --format= --abbrev-commit --oneline
2342                        --show-signature
2343                        $__git_diff_common_options
2344                        "
2345                return
2346                ;;
2347        esac
2348        __git_complete_revlist_file
2349}
2350
2351_git_show_branch ()
2352{
2353        case "$cur" in
2354        --*)
2355                __gitcomp "
2356                        --all --remotes --topo-order --current --more=
2357                        --list --independent --merge-base --no-name
2358                        --color --no-color
2359                        --sha1-name --sparse --topics --reflog
2360                        "
2361                return
2362                ;;
2363        esac
2364        __git_complete_revlist
2365}
2366
2367_git_stash ()
2368{
2369        local save_opts='--keep-index --no-keep-index --quiet --patch'
2370        local subcommands='save list show apply clear drop pop create branch'
2371        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2372        if [ -z "$subcommand" ]; then
2373                case "$cur" in
2374                --*)
2375                        __gitcomp "$save_opts"
2376                        ;;
2377                *)
2378                        if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2379                                __gitcomp "$subcommands"
2380                        fi
2381                        ;;
2382                esac
2383        else
2384                case "$subcommand,$cur" in
2385                save,--*)
2386                        __gitcomp "$save_opts"
2387                        ;;
2388                apply,--*|pop,--*)
2389                        __gitcomp "--index --quiet"
2390                        ;;
2391                show,--*|drop,--*|branch,--*)
2392                        ;;
2393                show,*|apply,*|drop,*|pop,*|branch,*)
2394                        __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2395                                        | sed -n -e 's/:.*//p')"
2396                        ;;
2397                *)
2398                        ;;
2399                esac
2400        fi
2401}
2402
2403_git_submodule ()
2404{
2405        __git_has_doubledash && return
2406
2407        local subcommands="add status init deinit update summary foreach sync"
2408        if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2409                case "$cur" in
2410                --*)
2411                        __gitcomp "--quiet --cached"
2412                        ;;
2413                *)
2414                        __gitcomp "$subcommands"
2415                        ;;
2416                esac
2417                return
2418        fi
2419}
2420
2421_git_svn ()
2422{
2423        local subcommands="
2424                init fetch clone rebase dcommit log find-rev
2425                set-tree commit-diff info create-ignore propget
2426                proplist show-ignore show-externals branch tag blame
2427                migrate mkdirs reset gc
2428                "
2429        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2430        if [ -z "$subcommand" ]; then
2431                __gitcomp "$subcommands"
2432        else
2433                local remote_opts="--username= --config-dir= --no-auth-cache"
2434                local fc_opts="
2435                        --follow-parent --authors-file= --repack=
2436                        --no-metadata --use-svm-props --use-svnsync-props
2437                        --log-window-size= --no-checkout --quiet
2438                        --repack-flags --use-log-author --localtime
2439                        --ignore-paths= --include-paths= $remote_opts
2440                        "
2441                local init_opts="
2442                        --template= --shared= --trunk= --tags=
2443                        --branches= --stdlayout --minimize-url
2444                        --no-metadata --use-svm-props --use-svnsync-props
2445                        --rewrite-root= --prefix= --use-log-author
2446                        --add-author-from $remote_opts
2447                        "
2448                local cmt_opts="
2449                        --edit --rmdir --find-copies-harder --copy-similarity=
2450                        "
2451
2452                case "$subcommand,$cur" in
2453                fetch,--*)
2454                        __gitcomp "--revision= --fetch-all $fc_opts"
2455                        ;;
2456                clone,--*)
2457                        __gitcomp "--revision= $fc_opts $init_opts"
2458                        ;;
2459                init,--*)
2460                        __gitcomp "$init_opts"
2461                        ;;
2462                dcommit,--*)
2463                        __gitcomp "
2464                                --merge --strategy= --verbose --dry-run
2465                                --fetch-all --no-rebase --commit-url
2466                                --revision --interactive $cmt_opts $fc_opts
2467                                "
2468                        ;;
2469                set-tree,--*)
2470                        __gitcomp "--stdin $cmt_opts $fc_opts"
2471                        ;;
2472                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2473                show-externals,--*|mkdirs,--*)
2474                        __gitcomp "--revision="
2475                        ;;
2476                log,--*)
2477                        __gitcomp "
2478                                --limit= --revision= --verbose --incremental
2479                                --oneline --show-commit --non-recursive
2480                                --authors-file= --color
2481                                "
2482                        ;;
2483                rebase,--*)
2484                        __gitcomp "
2485                                --merge --verbose --strategy= --local
2486                                --fetch-all --dry-run $fc_opts
2487                                "
2488                        ;;
2489                commit-diff,--*)
2490                        __gitcomp "--message= --file= --revision= $cmt_opts"
2491                        ;;
2492                info,--*)
2493                        __gitcomp "--url"
2494                        ;;
2495                branch,--*)
2496                        __gitcomp "--dry-run --message --tag"
2497                        ;;
2498                tag,--*)
2499                        __gitcomp "--dry-run --message"
2500                        ;;
2501                blame,--*)
2502                        __gitcomp "--git-format"
2503                        ;;
2504                migrate,--*)
2505                        __gitcomp "
2506                                --config-dir= --ignore-paths= --minimize
2507                                --no-auth-cache --username=
2508                                "
2509                        ;;
2510                reset,--*)
2511                        __gitcomp "--revision= --parent"
2512                        ;;
2513                *)
2514                        ;;
2515                esac
2516        fi
2517}
2518
2519_git_tag ()
2520{
2521        local i c=1 f=0
2522        while [ $c -lt $cword ]; do
2523                i="${words[c]}"
2524                case "$i" in
2525                -d|-v)
2526                        __gitcomp_nl "$(__git_tags)"
2527                        return
2528                        ;;
2529                -f)
2530                        f=1
2531                        ;;
2532                esac
2533                ((c++))
2534        done
2535
2536        case "$prev" in
2537        -m|-F)
2538                ;;
2539        -*|tag)
2540                if [ $f = 1 ]; then
2541                        __gitcomp_nl "$(__git_tags)"
2542                fi
2543                ;;
2544        *)
2545                __gitcomp_nl "$(__git_refs)"
2546                ;;
2547        esac
2548
2549        case "$cur" in
2550        --*)
2551                __gitcomp "
2552                        --list --delete --verify --annotate --message --file
2553                        --sign --cleanup --local-user --force --column --sort
2554                        --contains --points-at
2555                        "
2556                ;;
2557        esac
2558}
2559
2560_git_whatchanged ()
2561{
2562        _git_log
2563}
2564
2565__git_main ()
2566{
2567        local i c=1 command __git_dir
2568
2569        while [ $c -lt $cword ]; do
2570                i="${words[c]}"
2571                case "$i" in
2572                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2573                --git-dir)   ((c++)) ; __git_dir="${words[c]}" ;;
2574                --bare)      __git_dir="." ;;
2575                --help) command="help"; break ;;
2576                -c|--work-tree|--namespace) ((c++)) ;;
2577                -*) ;;
2578                *) command="$i"; break ;;
2579                esac
2580                ((c++))
2581        done
2582
2583        if [ -z "$command" ]; then
2584                case "$cur" in
2585                --*)   __gitcomp "
2586                        --paginate
2587                        --no-pager
2588                        --git-dir=
2589                        --bare
2590                        --version
2591                        --exec-path
2592                        --exec-path=
2593                        --html-path
2594                        --man-path
2595                        --info-path
2596                        --work-tree=
2597                        --namespace=
2598                        --no-replace-objects
2599                        --help
2600                        "
2601                        ;;
2602                *)     __git_compute_porcelain_commands
2603                       __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2604                esac
2605                return
2606        fi
2607
2608        local completion_func="_git_${command//-/_}"
2609        declare -f $completion_func >/dev/null && $completion_func && return
2610
2611        local expansion=$(__git_aliased_command "$command")
2612        if [ -n "$expansion" ]; then
2613                words[1]=$expansion
2614                completion_func="_git_${expansion//-/_}"
2615                declare -f $completion_func >/dev/null && $completion_func
2616        fi
2617}
2618
2619__gitk_main ()
2620{
2621        __git_has_doubledash && return
2622
2623        local g="$(__gitdir)"
2624        local merge=""
2625        if [ -f "$g/MERGE_HEAD" ]; then
2626                merge="--merge"
2627        fi
2628        case "$cur" in
2629        --*)
2630                __gitcomp "
2631                        $__git_log_common_options
2632                        $__git_log_gitk_options
2633                        $merge
2634                        "
2635                return
2636                ;;
2637        esac
2638        __git_complete_revlist
2639}
2640
2641if [[ -n ${ZSH_VERSION-} ]]; then
2642        echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2643
2644        autoload -U +X compinit && compinit
2645
2646        __gitcomp ()
2647        {
2648                emulate -L zsh
2649
2650                local cur_="${3-$cur}"
2651
2652                case "$cur_" in
2653                --*=)
2654                        ;;
2655                *)
2656                        local c IFS=$' \t\n'
2657                        local -a array
2658                        for c in ${=1}; do
2659                                c="$c${4-}"
2660                                case $c in
2661                                --*=*|*.) ;;
2662                                *) c="$c " ;;
2663                                esac
2664                                array[${#array[@]}+1]="$c"
2665                        done
2666                        compset -P '*[=:]'
2667                        compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2668                        ;;
2669                esac
2670        }
2671
2672        __gitcomp_nl ()
2673        {
2674                emulate -L zsh
2675
2676                local IFS=$'\n'
2677                compset -P '*[=:]'
2678                compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2679        }
2680
2681        __gitcomp_file ()
2682        {
2683                emulate -L zsh
2684
2685                local IFS=$'\n'
2686                compset -P '*[=:]'
2687                compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2688        }
2689
2690        _git ()
2691        {
2692                local _ret=1 cur cword prev
2693                cur=${words[CURRENT]}
2694                prev=${words[CURRENT-1]}
2695                let cword=CURRENT-1
2696                emulate ksh -c __${service}_main
2697                let _ret && _default && _ret=0
2698                return _ret
2699        }
2700
2701        compdef _git git gitk
2702        return
2703fi
2704
2705__git_func_wrap ()
2706{
2707        local cur words cword prev
2708        _get_comp_words_by_ref -n =: cur words cword prev
2709        $1
2710}
2711
2712# Setup completion for certain functions defined above by setting common
2713# variables and workarounds.
2714# This is NOT a public function; use at your own risk.
2715__git_complete ()
2716{
2717        local wrapper="__git_wrap${2}"
2718        eval "$wrapper () { __git_func_wrap $2 ; }"
2719        complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2720                || complete -o default -o nospace -F $wrapper $1
2721}
2722
2723# wrapper for backwards compatibility
2724_git ()
2725{
2726        __git_wrap__git_main
2727}
2728
2729# wrapper for backwards compatibility
2730_gitk ()
2731{
2732        __git_wrap__gitk_main
2733}
2734
2735__git_complete git __git_main
2736__git_complete gitk __gitk_main
2737
2738# The following are necessary only for Cygwin, and only are needed
2739# when the user has tab-completed the executable name and consequently
2740# included the '.exe' suffix.
2741#
2742if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2743__git_complete git.exe __git_main
2744fi