contrib / completion / git-completion.bashon commit Merge branch 'nd/diff-quiet-stat-dirty' (1e74545)
   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_options="
1225        --quiet --verbose --append --upload-pack --force --keep --depth=
1226        --tags --no-tags --all --prune --dry-run
1227"
1228
1229_git_fetch ()
1230{
1231        case "$cur" in
1232        --*)
1233                __gitcomp "$__git_fetch_options"
1234                return
1235                ;;
1236        esac
1237        __git_complete_remote_or_refspec
1238}
1239
1240__git_format_patch_options="
1241        --stdout --attach --no-attach --thread --thread= --no-thread
1242        --numbered --start-number --numbered-files --keep-subject --signoff
1243        --signature --no-signature --in-reply-to= --cc= --full-index --binary
1244        --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1245        --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1246        --output-directory --reroll-count --to= --quiet --notes
1247"
1248
1249_git_format_patch ()
1250{
1251        case "$cur" in
1252        --thread=*)
1253                __gitcomp "
1254                        deep shallow
1255                        " "" "${cur##--thread=}"
1256                return
1257                ;;
1258        --*)
1259                __gitcomp "$__git_format_patch_options"
1260                return
1261                ;;
1262        esac
1263        __git_complete_revlist
1264}
1265
1266_git_fsck ()
1267{
1268        case "$cur" in
1269        --*)
1270                __gitcomp "
1271                        --tags --root --unreachable --cache --no-reflogs --full
1272                        --strict --verbose --lost-found
1273                        "
1274                return
1275                ;;
1276        esac
1277}
1278
1279_git_gc ()
1280{
1281        case "$cur" in
1282        --*)
1283                __gitcomp "--prune --aggressive"
1284                return
1285                ;;
1286        esac
1287}
1288
1289_git_gitk ()
1290{
1291        _gitk
1292}
1293
1294__git_match_ctag() {
1295        awk "/^${1////\\/}/ { print \$1 }" "$2"
1296}
1297
1298_git_grep ()
1299{
1300        __git_has_doubledash && return
1301
1302        case "$cur" in
1303        --*)
1304                __gitcomp "
1305                        --cached
1306                        --text --ignore-case --word-regexp --invert-match
1307                        --full-name --line-number
1308                        --extended-regexp --basic-regexp --fixed-strings
1309                        --perl-regexp
1310                        --files-with-matches --name-only
1311                        --files-without-match
1312                        --max-depth
1313                        --count
1314                        --and --or --not --all-match
1315                        "
1316                return
1317                ;;
1318        esac
1319
1320        case "$cword,$prev" in
1321        2,*|*,-*)
1322                if test -r tags; then
1323                        __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1324                        return
1325                fi
1326                ;;
1327        esac
1328
1329        __gitcomp_nl "$(__git_refs)"
1330}
1331
1332_git_help ()
1333{
1334        case "$cur" in
1335        --*)
1336                __gitcomp "--all --info --man --web"
1337                return
1338                ;;
1339        esac
1340        __git_compute_all_commands
1341        __gitcomp "$__git_all_commands $(__git_aliases)
1342                attributes cli core-tutorial cvs-migration
1343                diffcore gitk glossary hooks ignore modules
1344                namespaces repository-layout tutorial tutorial-2
1345                workflows
1346                "
1347}
1348
1349_git_init ()
1350{
1351        case "$cur" in
1352        --shared=*)
1353                __gitcomp "
1354                        false true umask group all world everybody
1355                        " "" "${cur##--shared=}"
1356                return
1357                ;;
1358        --*)
1359                __gitcomp "--quiet --bare --template= --shared --shared="
1360                return
1361                ;;
1362        esac
1363}
1364
1365_git_ls_files ()
1366{
1367        case "$cur" in
1368        --*)
1369                __gitcomp "--cached --deleted --modified --others --ignored
1370                        --stage --directory --no-empty-directory --unmerged
1371                        --killed --exclude= --exclude-from=
1372                        --exclude-per-directory= --exclude-standard
1373                        --error-unmatch --with-tree= --full-name
1374                        --abbrev --ignored --exclude-per-directory
1375                        "
1376                return
1377                ;;
1378        esac
1379
1380        # XXX ignore options like --modified and always suggest all cached
1381        # files.
1382        __git_complete_index_file "--cached"
1383}
1384
1385_git_ls_remote ()
1386{
1387        __gitcomp_nl "$(__git_remotes)"
1388}
1389
1390_git_ls_tree ()
1391{
1392        __git_complete_file
1393}
1394
1395# Options that go well for log, shortlog and gitk
1396__git_log_common_options="
1397        --not --all
1398        --branches --tags --remotes
1399        --first-parent --merges --no-merges
1400        --max-count=
1401        --max-age= --since= --after=
1402        --min-age= --until= --before=
1403        --min-parents= --max-parents=
1404        --no-min-parents --no-max-parents
1405"
1406# Options that go well for log and gitk (not shortlog)
1407__git_log_gitk_options="
1408        --dense --sparse --full-history
1409        --simplify-merges --simplify-by-decoration
1410        --left-right --notes --no-notes
1411"
1412# Options that go well for log and shortlog (not gitk)
1413__git_log_shortlog_options="
1414        --author= --committer= --grep=
1415        --all-match
1416"
1417
1418__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1419__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1420
1421_git_log ()
1422{
1423        __git_has_doubledash && return
1424
1425        local g="$(git rev-parse --git-dir 2>/dev/null)"
1426        local merge=""
1427        if [ -f "$g/MERGE_HEAD" ]; then
1428                merge="--merge"
1429        fi
1430        case "$cur" in
1431        --pretty=*|--format=*)
1432                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1433                        " "" "${cur#*=}"
1434                return
1435                ;;
1436        --date=*)
1437                __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1438                return
1439                ;;
1440        --decorate=*)
1441                __gitcomp "long short" "" "${cur##--decorate=}"
1442                return
1443                ;;
1444        --*)
1445                __gitcomp "
1446                        $__git_log_common_options
1447                        $__git_log_shortlog_options
1448                        $__git_log_gitk_options
1449                        --root --topo-order --date-order --reverse
1450                        --follow --full-diff
1451                        --abbrev-commit --abbrev=
1452                        --relative-date --date=
1453                        --pretty= --format= --oneline
1454                        --cherry-pick
1455                        --graph
1456                        --decorate --decorate=
1457                        --walk-reflogs
1458                        --parents --children
1459                        $merge
1460                        $__git_diff_common_options
1461                        --pickaxe-all --pickaxe-regex
1462                        "
1463                return
1464                ;;
1465        esac
1466        __git_complete_revlist
1467}
1468
1469__git_merge_options="
1470        --no-commit --no-stat --log --no-log --squash --strategy
1471        --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1472"
1473
1474_git_merge ()
1475{
1476        __git_complete_strategy && return
1477
1478        case "$cur" in
1479        --*)
1480                __gitcomp "$__git_merge_options"
1481                return
1482        esac
1483        __gitcomp_nl "$(__git_refs)"
1484}
1485
1486_git_mergetool ()
1487{
1488        case "$cur" in
1489        --tool=*)
1490                __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1491                return
1492                ;;
1493        --*)
1494                __gitcomp "--tool="
1495                return
1496                ;;
1497        esac
1498}
1499
1500_git_merge_base ()
1501{
1502        case "$cur" in
1503        --*)
1504                __gitcomp "--octopus --independent --is-ancestor --fork-point"
1505                return
1506                ;;
1507        esac
1508        __gitcomp_nl "$(__git_refs)"
1509}
1510
1511_git_mv ()
1512{
1513        case "$cur" in
1514        --*)
1515                __gitcomp "--dry-run"
1516                return
1517                ;;
1518        esac
1519
1520        if [ $(__git_count_arguments "mv") -gt 0 ]; then
1521                # We need to show both cached and untracked files (including
1522                # empty directories) since this may not be the last argument.
1523                __git_complete_index_file "--cached --others --directory"
1524        else
1525                __git_complete_index_file "--cached"
1526        fi
1527}
1528
1529_git_name_rev ()
1530{
1531        __gitcomp "--tags --all --stdin"
1532}
1533
1534_git_notes ()
1535{
1536        local subcommands='add append copy edit list prune remove show'
1537        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1538
1539        case "$subcommand,$cur" in
1540        ,--*)
1541                __gitcomp '--ref'
1542                ;;
1543        ,*)
1544                case "$prev" in
1545                --ref)
1546                        __gitcomp_nl "$(__git_refs)"
1547                        ;;
1548                *)
1549                        __gitcomp "$subcommands --ref"
1550                        ;;
1551                esac
1552                ;;
1553        add,--reuse-message=*|append,--reuse-message=*|\
1554        add,--reedit-message=*|append,--reedit-message=*)
1555                __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1556                ;;
1557        add,--*|append,--*)
1558                __gitcomp '--file= --message= --reedit-message=
1559                                --reuse-message='
1560                ;;
1561        copy,--*)
1562                __gitcomp '--stdin'
1563                ;;
1564        prune,--*)
1565                __gitcomp '--dry-run --verbose'
1566                ;;
1567        prune,*)
1568                ;;
1569        *)
1570                case "$prev" in
1571                -m|-F)
1572                        ;;
1573                *)
1574                        __gitcomp_nl "$(__git_refs)"
1575                        ;;
1576                esac
1577                ;;
1578        esac
1579}
1580
1581_git_pull ()
1582{
1583        __git_complete_strategy && return
1584
1585        case "$cur" in
1586        --*)
1587                __gitcomp "
1588                        --rebase --no-rebase
1589                        $__git_merge_options
1590                        $__git_fetch_options
1591                "
1592                return
1593                ;;
1594        esac
1595        __git_complete_remote_or_refspec
1596}
1597
1598_git_push ()
1599{
1600        case "$prev" in
1601        --repo)
1602                __gitcomp_nl "$(__git_remotes)"
1603                return
1604        esac
1605        case "$cur" in
1606        --repo=*)
1607                __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1608                return
1609                ;;
1610        --*)
1611                __gitcomp "
1612                        --all --mirror --tags --dry-run --force --verbose
1613                        --receive-pack= --repo= --set-upstream
1614                "
1615                return
1616                ;;
1617        esac
1618        __git_complete_remote_or_refspec
1619}
1620
1621_git_rebase ()
1622{
1623        local dir="$(__gitdir)"
1624        if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1625                __gitcomp "--continue --skip --abort"
1626                return
1627        fi
1628        __git_complete_strategy && return
1629        case "$cur" in
1630        --whitespace=*)
1631                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1632                return
1633                ;;
1634        --*)
1635                __gitcomp "
1636                        --onto --merge --strategy --interactive
1637                        --preserve-merges --stat --no-stat
1638                        --committer-date-is-author-date --ignore-date
1639                        --ignore-whitespace --whitespace=
1640                        --autosquash --fork-point --no-fork-point
1641                        "
1642
1643                return
1644        esac
1645        __gitcomp_nl "$(__git_refs)"
1646}
1647
1648_git_reflog ()
1649{
1650        local subcommands="show delete expire"
1651        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1652
1653        if [ -z "$subcommand" ]; then
1654                __gitcomp "$subcommands"
1655        else
1656                __gitcomp_nl "$(__git_refs)"
1657        fi
1658}
1659
1660__git_send_email_confirm_options="always never auto cc compose"
1661__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1662
1663_git_send_email ()
1664{
1665        case "$cur" in
1666        --confirm=*)
1667                __gitcomp "
1668                        $__git_send_email_confirm_options
1669                        " "" "${cur##--confirm=}"
1670                return
1671                ;;
1672        --suppress-cc=*)
1673                __gitcomp "
1674                        $__git_send_email_suppresscc_options
1675                        " "" "${cur##--suppress-cc=}"
1676
1677                return
1678                ;;
1679        --smtp-encryption=*)
1680                __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1681                return
1682                ;;
1683        --thread=*)
1684                __gitcomp "
1685                        deep shallow
1686                        " "" "${cur##--thread=}"
1687                return
1688                ;;
1689        --*)
1690                __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1691                        --compose --confirm= --dry-run --envelope-sender
1692                        --from --identity
1693                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1694                        --no-suppress-from --no-thread --quiet
1695                        --signed-off-by-cc --smtp-pass --smtp-server
1696                        --smtp-server-port --smtp-encryption= --smtp-user
1697                        --subject --suppress-cc= --suppress-from --thread --to
1698                        --validate --no-validate
1699                        $__git_format_patch_options"
1700                return
1701                ;;
1702        esac
1703        __git_complete_revlist
1704}
1705
1706_git_stage ()
1707{
1708        _git_add
1709}
1710
1711__git_config_get_set_variables ()
1712{
1713        local prevword word config_file= c=$cword
1714        while [ $c -gt 1 ]; do
1715                word="${words[c]}"
1716                case "$word" in
1717                --system|--global|--local|--file=*)
1718                        config_file="$word"
1719                        break
1720                        ;;
1721                -f|--file)
1722                        config_file="$word $prevword"
1723                        break
1724                        ;;
1725                esac
1726                prevword=$word
1727                c=$((--c))
1728        done
1729
1730        git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1731        while read -r line
1732        do
1733                case "$line" in
1734                *.*=*)
1735                        echo "${line/=*/}"
1736                        ;;
1737                esac
1738        done
1739}
1740
1741_git_config ()
1742{
1743        case "$prev" in
1744        branch.*.remote|branch.*.pushremote)
1745                __gitcomp_nl "$(__git_remotes)"
1746                return
1747                ;;
1748        branch.*.merge)
1749                __gitcomp_nl "$(__git_refs)"
1750                return
1751                ;;
1752        branch.*.rebase)
1753                __gitcomp "false true"
1754                return
1755                ;;
1756        remote.pushdefault)
1757                __gitcomp_nl "$(__git_remotes)"
1758                return
1759                ;;
1760        remote.*.fetch)
1761                local remote="${prev#remote.}"
1762                remote="${remote%.fetch}"
1763                if [ -z "$cur" ]; then
1764                        __gitcomp_nl "refs/heads/" "" "" ""
1765                        return
1766                fi
1767                __gitcomp_nl "$(__git_refs_remotes "$remote")"
1768                return
1769                ;;
1770        remote.*.push)
1771                local remote="${prev#remote.}"
1772                remote="${remote%.push}"
1773                __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1774                        for-each-ref --format='%(refname):%(refname)' \
1775                        refs/heads)"
1776                return
1777                ;;
1778        pull.twohead|pull.octopus)
1779                __git_compute_merge_strategies
1780                __gitcomp "$__git_merge_strategies"
1781                return
1782                ;;
1783        color.branch|color.diff|color.interactive|\
1784        color.showbranch|color.status|color.ui)
1785                __gitcomp "always never auto"
1786                return
1787                ;;
1788        color.pager)
1789                __gitcomp "false true"
1790                return
1791                ;;
1792        color.*.*)
1793                __gitcomp "
1794                        normal black red green yellow blue magenta cyan white
1795                        bold dim ul blink reverse
1796                        "
1797                return
1798                ;;
1799        diff.submodule)
1800                __gitcomp "log short"
1801                return
1802                ;;
1803        help.format)
1804                __gitcomp "man info web html"
1805                return
1806                ;;
1807        log.date)
1808                __gitcomp "$__git_log_date_formats"
1809                return
1810                ;;
1811        sendemail.aliasesfiletype)
1812                __gitcomp "mutt mailrc pine elm gnus"
1813                return
1814                ;;
1815        sendemail.confirm)
1816                __gitcomp "$__git_send_email_confirm_options"
1817                return
1818                ;;
1819        sendemail.suppresscc)
1820                __gitcomp "$__git_send_email_suppresscc_options"
1821                return
1822                ;;
1823        --get|--get-all|--unset|--unset-all)
1824                __gitcomp_nl "$(__git_config_get_set_variables)"
1825                return
1826                ;;
1827        *.*)
1828                return
1829                ;;
1830        esac
1831        case "$cur" in
1832        --*)
1833                __gitcomp "
1834                        --system --global --local --file=
1835                        --list --replace-all
1836                        --get --get-all --get-regexp
1837                        --add --unset --unset-all
1838                        --remove-section --rename-section
1839                        "
1840                return
1841                ;;
1842        branch.*.*)
1843                local pfx="${cur%.*}." cur_="${cur##*.}"
1844                __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
1845                return
1846                ;;
1847        branch.*)
1848                local pfx="${cur%.*}." cur_="${cur#*.}"
1849                __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1850                __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
1851                return
1852                ;;
1853        guitool.*.*)
1854                local pfx="${cur%.*}." cur_="${cur##*.}"
1855                __gitcomp "
1856                        argprompt cmd confirm needsfile noconsole norescan
1857                        prompt revprompt revunmerged title
1858                        " "$pfx" "$cur_"
1859                return
1860                ;;
1861        difftool.*.*)
1862                local pfx="${cur%.*}." cur_="${cur##*.}"
1863                __gitcomp "cmd path" "$pfx" "$cur_"
1864                return
1865                ;;
1866        man.*.*)
1867                local pfx="${cur%.*}." cur_="${cur##*.}"
1868                __gitcomp "cmd path" "$pfx" "$cur_"
1869                return
1870                ;;
1871        mergetool.*.*)
1872                local pfx="${cur%.*}." cur_="${cur##*.}"
1873                __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1874                return
1875                ;;
1876        pager.*)
1877                local pfx="${cur%.*}." cur_="${cur#*.}"
1878                __git_compute_all_commands
1879                __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1880                return
1881                ;;
1882        remote.*.*)
1883                local pfx="${cur%.*}." cur_="${cur##*.}"
1884                __gitcomp "
1885                        url proxy fetch push mirror skipDefaultUpdate
1886                        receivepack uploadpack tagopt pushurl
1887                        " "$pfx" "$cur_"
1888                return
1889                ;;
1890        remote.*)
1891                local pfx="${cur%.*}." cur_="${cur#*.}"
1892                __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1893                __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
1894                return
1895                ;;
1896        url.*.*)
1897                local pfx="${cur%.*}." cur_="${cur##*.}"
1898                __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1899                return
1900                ;;
1901        esac
1902        __gitcomp "
1903                add.ignoreErrors
1904                advice.commitBeforeMerge
1905                advice.detachedHead
1906                advice.implicitIdentity
1907                advice.pushNonFastForward
1908                advice.resolveConflict
1909                advice.statusHints
1910                alias.
1911                am.keepcr
1912                apply.ignorewhitespace
1913                apply.whitespace
1914                branch.autosetupmerge
1915                branch.autosetuprebase
1916                browser.
1917                clean.requireForce
1918                color.branch
1919                color.branch.current
1920                color.branch.local
1921                color.branch.plain
1922                color.branch.remote
1923                color.decorate.HEAD
1924                color.decorate.branch
1925                color.decorate.remoteBranch
1926                color.decorate.stash
1927                color.decorate.tag
1928                color.diff
1929                color.diff.commit
1930                color.diff.frag
1931                color.diff.func
1932                color.diff.meta
1933                color.diff.new
1934                color.diff.old
1935                color.diff.plain
1936                color.diff.whitespace
1937                color.grep
1938                color.grep.context
1939                color.grep.filename
1940                color.grep.function
1941                color.grep.linenumber
1942                color.grep.match
1943                color.grep.selected
1944                color.grep.separator
1945                color.interactive
1946                color.interactive.error
1947                color.interactive.header
1948                color.interactive.help
1949                color.interactive.prompt
1950                color.pager
1951                color.showbranch
1952                color.status
1953                color.status.added
1954                color.status.changed
1955                color.status.header
1956                color.status.nobranch
1957                color.status.untracked
1958                color.status.updated
1959                color.ui
1960                commit.status
1961                commit.template
1962                core.abbrev
1963                core.askpass
1964                core.attributesfile
1965                core.autocrlf
1966                core.bare
1967                core.bigFileThreshold
1968                core.compression
1969                core.createObject
1970                core.deltaBaseCacheLimit
1971                core.editor
1972                core.eol
1973                core.excludesfile
1974                core.fileMode
1975                core.fsyncobjectfiles
1976                core.gitProxy
1977                core.ignoreStat
1978                core.ignorecase
1979                core.logAllRefUpdates
1980                core.loosecompression
1981                core.notesRef
1982                core.packedGitLimit
1983                core.packedGitWindowSize
1984                core.pager
1985                core.preferSymlinkRefs
1986                core.preloadindex
1987                core.quotepath
1988                core.repositoryFormatVersion
1989                core.safecrlf
1990                core.sharedRepository
1991                core.sparseCheckout
1992                core.symlinks
1993                core.trustctime
1994                core.warnAmbiguousRefs
1995                core.whitespace
1996                core.worktree
1997                diff.autorefreshindex
1998                diff.external
1999                diff.ignoreSubmodules
2000                diff.mnemonicprefix
2001                diff.noprefix
2002                diff.renameLimit
2003                diff.renames
2004                diff.statGraphWidth
2005                diff.submodule
2006                diff.suppressBlankEmpty
2007                diff.tool
2008                diff.wordRegex
2009                diff.algorithm
2010                difftool.
2011                difftool.prompt
2012                fetch.recurseSubmodules
2013                fetch.unpackLimit
2014                format.attach
2015                format.cc
2016                format.coverLetter
2017                format.headers
2018                format.numbered
2019                format.pretty
2020                format.signature
2021                format.signoff
2022                format.subjectprefix
2023                format.suffix
2024                format.thread
2025                format.to
2026                gc.
2027                gc.aggressiveWindow
2028                gc.auto
2029                gc.autopacklimit
2030                gc.packrefs
2031                gc.pruneexpire
2032                gc.reflogexpire
2033                gc.reflogexpireunreachable
2034                gc.rerereresolved
2035                gc.rerereunresolved
2036                gitcvs.allbinary
2037                gitcvs.commitmsgannotation
2038                gitcvs.dbTableNamePrefix
2039                gitcvs.dbdriver
2040                gitcvs.dbname
2041                gitcvs.dbpass
2042                gitcvs.dbuser
2043                gitcvs.enabled
2044                gitcvs.logfile
2045                gitcvs.usecrlfattr
2046                guitool.
2047                gui.blamehistoryctx
2048                gui.commitmsgwidth
2049                gui.copyblamethreshold
2050                gui.diffcontext
2051                gui.encoding
2052                gui.fastcopyblame
2053                gui.matchtrackingbranch
2054                gui.newbranchtemplate
2055                gui.pruneduringfetch
2056                gui.spellingdictionary
2057                gui.trustmtime
2058                help.autocorrect
2059                help.browser
2060                help.format
2061                http.lowSpeedLimit
2062                http.lowSpeedTime
2063                http.maxRequests
2064                http.minSessions
2065                http.noEPSV
2066                http.postBuffer
2067                http.proxy
2068                http.sslCAInfo
2069                http.sslCAPath
2070                http.sslCert
2071                http.sslCertPasswordProtected
2072                http.sslKey
2073                http.sslVerify
2074                http.useragent
2075                i18n.commitEncoding
2076                i18n.logOutputEncoding
2077                imap.authMethod
2078                imap.folder
2079                imap.host
2080                imap.pass
2081                imap.port
2082                imap.preformattedHTML
2083                imap.sslverify
2084                imap.tunnel
2085                imap.user
2086                init.templatedir
2087                instaweb.browser
2088                instaweb.httpd
2089                instaweb.local
2090                instaweb.modulepath
2091                instaweb.port
2092                interactive.singlekey
2093                log.date
2094                log.decorate
2095                log.showroot
2096                mailmap.file
2097                man.
2098                man.viewer
2099                merge.
2100                merge.conflictstyle
2101                merge.log
2102                merge.renameLimit
2103                merge.renormalize
2104                merge.stat
2105                merge.tool
2106                merge.verbosity
2107                mergetool.
2108                mergetool.keepBackup
2109                mergetool.keepTemporaries
2110                mergetool.prompt
2111                notes.displayRef
2112                notes.rewrite.
2113                notes.rewrite.amend
2114                notes.rewrite.rebase
2115                notes.rewriteMode
2116                notes.rewriteRef
2117                pack.compression
2118                pack.deltaCacheLimit
2119                pack.deltaCacheSize
2120                pack.depth
2121                pack.indexVersion
2122                pack.packSizeLimit
2123                pack.threads
2124                pack.window
2125                pack.windowMemory
2126                pager.
2127                pretty.
2128                pull.octopus
2129                pull.twohead
2130                push.default
2131                rebase.autosquash
2132                rebase.stat
2133                receive.autogc
2134                receive.denyCurrentBranch
2135                receive.denyDeleteCurrent
2136                receive.denyDeletes
2137                receive.denyNonFastForwards
2138                receive.fsckObjects
2139                receive.unpackLimit
2140                receive.updateserverinfo
2141                remote.pushdefault
2142                remotes.
2143                repack.usedeltabaseoffset
2144                rerere.autoupdate
2145                rerere.enabled
2146                sendemail.
2147                sendemail.aliasesfile
2148                sendemail.aliasfiletype
2149                sendemail.bcc
2150                sendemail.cc
2151                sendemail.cccmd
2152                sendemail.chainreplyto
2153                sendemail.confirm
2154                sendemail.envelopesender
2155                sendemail.from
2156                sendemail.identity
2157                sendemail.multiedit
2158                sendemail.signedoffbycc
2159                sendemail.smtpdomain
2160                sendemail.smtpencryption
2161                sendemail.smtppass
2162                sendemail.smtpserver
2163                sendemail.smtpserveroption
2164                sendemail.smtpserverport
2165                sendemail.smtpuser
2166                sendemail.suppresscc
2167                sendemail.suppressfrom
2168                sendemail.thread
2169                sendemail.to
2170                sendemail.validate
2171                showbranch.default
2172                status.relativePaths
2173                status.showUntrackedFiles
2174                status.submodulesummary
2175                submodule.
2176                tar.umask
2177                transfer.unpackLimit
2178                url.
2179                user.email
2180                user.name
2181                user.signingkey
2182                web.browser
2183                branch. remote.
2184        "
2185}
2186
2187_git_remote ()
2188{
2189        local subcommands="add rename remove set-head set-branches set-url show prune update"
2190        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2191        if [ -z "$subcommand" ]; then
2192                __gitcomp "$subcommands"
2193                return
2194        fi
2195
2196        case "$subcommand" in
2197        rename|remove|set-url|show|prune)
2198                __gitcomp_nl "$(__git_remotes)"
2199                ;;
2200        set-head|set-branches)
2201                __git_complete_remote_or_refspec
2202                ;;
2203        update)
2204                local i c='' IFS=$'\n'
2205                for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2206                        i="${i#remotes.}"
2207                        c="$c ${i/ */}"
2208                done
2209                __gitcomp "$c"
2210                ;;
2211        *)
2212                ;;
2213        esac
2214}
2215
2216_git_replace ()
2217{
2218        __gitcomp_nl "$(__git_refs)"
2219}
2220
2221_git_reset ()
2222{
2223        __git_has_doubledash && return
2224
2225        case "$cur" in
2226        --*)
2227                __gitcomp "--merge --mixed --hard --soft --patch"
2228                return
2229                ;;
2230        esac
2231        __gitcomp_nl "$(__git_refs)"
2232}
2233
2234_git_revert ()
2235{
2236        case "$cur" in
2237        --*)
2238                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2239                return
2240                ;;
2241        esac
2242        __gitcomp_nl "$(__git_refs)"
2243}
2244
2245_git_rm ()
2246{
2247        case "$cur" in
2248        --*)
2249                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2250                return
2251                ;;
2252        esac
2253
2254        __git_complete_index_file "--cached"
2255}
2256
2257_git_shortlog ()
2258{
2259        __git_has_doubledash && return
2260
2261        case "$cur" in
2262        --*)
2263                __gitcomp "
2264                        $__git_log_common_options
2265                        $__git_log_shortlog_options
2266                        --numbered --summary
2267                        "
2268                return
2269                ;;
2270        esac
2271        __git_complete_revlist
2272}
2273
2274_git_show ()
2275{
2276        __git_has_doubledash && return
2277
2278        case "$cur" in
2279        --pretty=*|--format=*)
2280                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2281                        " "" "${cur#*=}"
2282                return
2283                ;;
2284        --diff-algorithm=*)
2285                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2286                return
2287                ;;
2288        --*)
2289                __gitcomp "--pretty= --format= --abbrev-commit --oneline
2290                        $__git_diff_common_options
2291                        "
2292                return
2293                ;;
2294        esac
2295        __git_complete_revlist_file
2296}
2297
2298_git_show_branch ()
2299{
2300        case "$cur" in
2301        --*)
2302                __gitcomp "
2303                        --all --remotes --topo-order --current --more=
2304                        --list --independent --merge-base --no-name
2305                        --color --no-color
2306                        --sha1-name --sparse --topics --reflog
2307                        "
2308                return
2309                ;;
2310        esac
2311        __git_complete_revlist
2312}
2313
2314_git_stash ()
2315{
2316        local save_opts='--keep-index --no-keep-index --quiet --patch'
2317        local subcommands='save list show apply clear drop pop create branch'
2318        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2319        if [ -z "$subcommand" ]; then
2320                case "$cur" in
2321                --*)
2322                        __gitcomp "$save_opts"
2323                        ;;
2324                *)
2325                        if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2326                                __gitcomp "$subcommands"
2327                        fi
2328                        ;;
2329                esac
2330        else
2331                case "$subcommand,$cur" in
2332                save,--*)
2333                        __gitcomp "$save_opts"
2334                        ;;
2335                apply,--*|pop,--*)
2336                        __gitcomp "--index --quiet"
2337                        ;;
2338                show,--*|drop,--*|branch,--*)
2339                        ;;
2340                show,*|apply,*|drop,*|pop,*|branch,*)
2341                        __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2342                                        | sed -n -e 's/:.*//p')"
2343                        ;;
2344                *)
2345                        ;;
2346                esac
2347        fi
2348}
2349
2350_git_submodule ()
2351{
2352        __git_has_doubledash && return
2353
2354        local subcommands="add status init deinit update summary foreach sync"
2355        if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2356                case "$cur" in
2357                --*)
2358                        __gitcomp "--quiet --cached"
2359                        ;;
2360                *)
2361                        __gitcomp "$subcommands"
2362                        ;;
2363                esac
2364                return
2365        fi
2366}
2367
2368_git_svn ()
2369{
2370        local subcommands="
2371                init fetch clone rebase dcommit log find-rev
2372                set-tree commit-diff info create-ignore propget
2373                proplist show-ignore show-externals branch tag blame
2374                migrate mkdirs reset gc
2375                "
2376        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2377        if [ -z "$subcommand" ]; then
2378                __gitcomp "$subcommands"
2379        else
2380                local remote_opts="--username= --config-dir= --no-auth-cache"
2381                local fc_opts="
2382                        --follow-parent --authors-file= --repack=
2383                        --no-metadata --use-svm-props --use-svnsync-props
2384                        --log-window-size= --no-checkout --quiet
2385                        --repack-flags --use-log-author --localtime
2386                        --ignore-paths= --include-paths= $remote_opts
2387                        "
2388                local init_opts="
2389                        --template= --shared= --trunk= --tags=
2390                        --branches= --stdlayout --minimize-url
2391                        --no-metadata --use-svm-props --use-svnsync-props
2392                        --rewrite-root= --prefix= --use-log-author
2393                        --add-author-from $remote_opts
2394                        "
2395                local cmt_opts="
2396                        --edit --rmdir --find-copies-harder --copy-similarity=
2397                        "
2398
2399                case "$subcommand,$cur" in
2400                fetch,--*)
2401                        __gitcomp "--revision= --fetch-all $fc_opts"
2402                        ;;
2403                clone,--*)
2404                        __gitcomp "--revision= $fc_opts $init_opts"
2405                        ;;
2406                init,--*)
2407                        __gitcomp "$init_opts"
2408                        ;;
2409                dcommit,--*)
2410                        __gitcomp "
2411                                --merge --strategy= --verbose --dry-run
2412                                --fetch-all --no-rebase --commit-url
2413                                --revision --interactive $cmt_opts $fc_opts
2414                                "
2415                        ;;
2416                set-tree,--*)
2417                        __gitcomp "--stdin $cmt_opts $fc_opts"
2418                        ;;
2419                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2420                show-externals,--*|mkdirs,--*)
2421                        __gitcomp "--revision="
2422                        ;;
2423                log,--*)
2424                        __gitcomp "
2425                                --limit= --revision= --verbose --incremental
2426                                --oneline --show-commit --non-recursive
2427                                --authors-file= --color
2428                                "
2429                        ;;
2430                rebase,--*)
2431                        __gitcomp "
2432                                --merge --verbose --strategy= --local
2433                                --fetch-all --dry-run $fc_opts
2434                                "
2435                        ;;
2436                commit-diff,--*)
2437                        __gitcomp "--message= --file= --revision= $cmt_opts"
2438                        ;;
2439                info,--*)
2440                        __gitcomp "--url"
2441                        ;;
2442                branch,--*)
2443                        __gitcomp "--dry-run --message --tag"
2444                        ;;
2445                tag,--*)
2446                        __gitcomp "--dry-run --message"
2447                        ;;
2448                blame,--*)
2449                        __gitcomp "--git-format"
2450                        ;;
2451                migrate,--*)
2452                        __gitcomp "
2453                                --config-dir= --ignore-paths= --minimize
2454                                --no-auth-cache --username=
2455                                "
2456                        ;;
2457                reset,--*)
2458                        __gitcomp "--revision= --parent"
2459                        ;;
2460                *)
2461                        ;;
2462                esac
2463        fi
2464}
2465
2466_git_tag ()
2467{
2468        local i c=1 f=0
2469        while [ $c -lt $cword ]; do
2470                i="${words[c]}"
2471                case "$i" in
2472                -d|-v)
2473                        __gitcomp_nl "$(__git_tags)"
2474                        return
2475                        ;;
2476                -f)
2477                        f=1
2478                        ;;
2479                esac
2480                ((c++))
2481        done
2482
2483        case "$prev" in
2484        -m|-F)
2485                ;;
2486        -*|tag)
2487                if [ $f = 1 ]; then
2488                        __gitcomp_nl "$(__git_tags)"
2489                fi
2490                ;;
2491        *)
2492                __gitcomp_nl "$(__git_refs)"
2493                ;;
2494        esac
2495}
2496
2497_git_whatchanged ()
2498{
2499        _git_log
2500}
2501
2502__git_main ()
2503{
2504        local i c=1 command __git_dir
2505
2506        while [ $c -lt $cword ]; do
2507                i="${words[c]}"
2508                case "$i" in
2509                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2510                --git-dir)   ((c++)) ; __git_dir="${words[c]}" ;;
2511                --bare)      __git_dir="." ;;
2512                --help) command="help"; break ;;
2513                -c|--work-tree|--namespace) ((c++)) ;;
2514                -*) ;;
2515                *) command="$i"; break ;;
2516                esac
2517                ((c++))
2518        done
2519
2520        if [ -z "$command" ]; then
2521                case "$cur" in
2522                --*)   __gitcomp "
2523                        --paginate
2524                        --no-pager
2525                        --git-dir=
2526                        --bare
2527                        --version
2528                        --exec-path
2529                        --exec-path=
2530                        --html-path
2531                        --man-path
2532                        --info-path
2533                        --work-tree=
2534                        --namespace=
2535                        --no-replace-objects
2536                        --help
2537                        "
2538                        ;;
2539                *)     __git_compute_porcelain_commands
2540                       __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2541                esac
2542                return
2543        fi
2544
2545        local completion_func="_git_${command//-/_}"
2546        declare -f $completion_func >/dev/null && $completion_func && return
2547
2548        local expansion=$(__git_aliased_command "$command")
2549        if [ -n "$expansion" ]; then
2550                completion_func="_git_${expansion//-/_}"
2551                declare -f $completion_func >/dev/null && $completion_func
2552        fi
2553}
2554
2555__gitk_main ()
2556{
2557        __git_has_doubledash && return
2558
2559        local g="$(__gitdir)"
2560        local merge=""
2561        if [ -f "$g/MERGE_HEAD" ]; then
2562                merge="--merge"
2563        fi
2564        case "$cur" in
2565        --*)
2566                __gitcomp "
2567                        $__git_log_common_options
2568                        $__git_log_gitk_options
2569                        $merge
2570                        "
2571                return
2572                ;;
2573        esac
2574        __git_complete_revlist
2575}
2576
2577if [[ -n ${ZSH_VERSION-} ]]; then
2578        echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2579
2580        autoload -U +X compinit && compinit
2581
2582        __gitcomp ()
2583        {
2584                emulate -L zsh
2585
2586                local cur_="${3-$cur}"
2587
2588                case "$cur_" in
2589                --*=)
2590                        ;;
2591                *)
2592                        local c IFS=$' \t\n'
2593                        local -a array
2594                        for c in ${=1}; do
2595                                c="$c${4-}"
2596                                case $c in
2597                                --*=*|*.) ;;
2598                                *) c="$c " ;;
2599                                esac
2600                                array[${#array[@]}+1]="$c"
2601                        done
2602                        compset -P '*[=:]'
2603                        compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2604                        ;;
2605                esac
2606        }
2607
2608        __gitcomp_nl ()
2609        {
2610                emulate -L zsh
2611
2612                local IFS=$'\n'
2613                compset -P '*[=:]'
2614                compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2615        }
2616
2617        __gitcomp_file ()
2618        {
2619                emulate -L zsh
2620
2621                local IFS=$'\n'
2622                compset -P '*[=:]'
2623                compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2624        }
2625
2626        _git ()
2627        {
2628                local _ret=1 cur cword prev
2629                cur=${words[CURRENT]}
2630                prev=${words[CURRENT-1]}
2631                let cword=CURRENT-1
2632                emulate ksh -c __${service}_main
2633                let _ret && _default && _ret=0
2634                return _ret
2635        }
2636
2637        compdef _git git gitk
2638        return
2639fi
2640
2641__git_func_wrap ()
2642{
2643        local cur words cword prev
2644        _get_comp_words_by_ref -n =: cur words cword prev
2645        $1
2646}
2647
2648# Setup completion for certain functions defined above by setting common
2649# variables and workarounds.
2650# This is NOT a public function; use at your own risk.
2651__git_complete ()
2652{
2653        local wrapper="__git_wrap${2}"
2654        eval "$wrapper () { __git_func_wrap $2 ; }"
2655        complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2656                || complete -o default -o nospace -F $wrapper $1
2657}
2658
2659# wrapper for backwards compatibility
2660_git ()
2661{
2662        __git_wrap__git_main
2663}
2664
2665# wrapper for backwards compatibility
2666_gitk ()
2667{
2668        __git_wrap__gitk_main
2669}
2670
2671__git_complete git __git_main
2672__git_complete gitk __gitk_main
2673
2674# The following are necessary only for Cygwin, and only are needed
2675# when the user has tab-completed the executable name and consequently
2676# included the '.exe' suffix.
2677#
2678if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2679__git_complete git.exe __git_main
2680fi