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