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