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