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