contrib / completion / git-completion.bashon commit Merge branch 'jk/reflog-date' (0d32799)
   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# Echo the value of an option set on the command line or config
 807#
 808# $1: short option name
 809# $2: long option name including =
 810# $3: list of possible values
 811# $4: config string (optional)
 812#
 813# example:
 814# result="$(__git_get_option_value "-d" "--do-something=" \
 815#     "yes no" "core.doSomething")"
 816#
 817# result is then either empty (no option set) or "yes" or "no"
 818#
 819# __git_get_option_value requires 3 arguments
 820__git_get_option_value ()
 821{
 822        local c short_opt long_opt val
 823        local result= values config_key word
 824
 825        short_opt="$1"
 826        long_opt="$2"
 827        values="$3"
 828        config_key="$4"
 829
 830        ((c = $cword - 1))
 831        while [ $c -ge 0 ]; do
 832                word="${words[c]}"
 833                for val in $values; do
 834                        if [ "$short_opt$val" = "$word" ] ||
 835                           [ "$long_opt$val"  = "$word" ]; then
 836                                result="$val"
 837                                break 2
 838                        fi
 839                done
 840                ((c--))
 841        done
 842
 843        if [ -n "$config_key" ] && [ -z "$result" ]; then
 844                result="$(git --git-dir="$(__gitdir)" config "$config_key")"
 845        fi
 846
 847        echo "$result"
 848}
 849
 850__git_has_doubledash ()
 851{
 852        local c=1
 853        while [ $c -lt $cword ]; do
 854                if [ "--" = "${words[c]}" ]; then
 855                        return 0
 856                fi
 857                ((c++))
 858        done
 859        return 1
 860}
 861
 862# Try to count non option arguments passed on the command line for the
 863# specified git command.
 864# When options are used, it is necessary to use the special -- option to
 865# tell the implementation were non option arguments begin.
 866# XXX this can not be improved, since options can appear everywhere, as
 867# an example:
 868#       git mv x -n y
 869#
 870# __git_count_arguments requires 1 argument: the git command executed.
 871__git_count_arguments ()
 872{
 873        local word i c=0
 874
 875        # Skip "git" (first argument)
 876        for ((i=1; i < ${#words[@]}; i++)); do
 877                word="${words[i]}"
 878
 879                case "$word" in
 880                        --)
 881                                # Good; we can assume that the following are only non
 882                                # option arguments.
 883                                ((c = 0))
 884                                ;;
 885                        "$1")
 886                                # Skip the specified git command and discard git
 887                                # main options
 888                                ((c = 0))
 889                                ;;
 890                        ?*)
 891                                ((c++))
 892                                ;;
 893                esac
 894        done
 895
 896        printf "%d" $c
 897}
 898
 899__git_whitespacelist="nowarn warn error error-all fix"
 900
 901_git_am ()
 902{
 903        local dir="$(__gitdir)"
 904        if [ -d "$dir"/rebase-apply ]; then
 905                __gitcomp "--skip --continue --resolved --abort"
 906                return
 907        fi
 908        case "$cur" in
 909        --whitespace=*)
 910                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 911                return
 912                ;;
 913        --*)
 914                __gitcomp "
 915                        --3way --committer-date-is-author-date --ignore-date
 916                        --ignore-whitespace --ignore-space-change
 917                        --interactive --keep --no-utf8 --signoff --utf8
 918                        --whitespace= --scissors
 919                        "
 920                return
 921        esac
 922}
 923
 924_git_apply ()
 925{
 926        case "$cur" in
 927        --whitespace=*)
 928                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
 929                return
 930                ;;
 931        --*)
 932                __gitcomp "
 933                        --stat --numstat --summary --check --index
 934                        --cached --index-info --reverse --reject --unidiff-zero
 935                        --apply --no-add --exclude=
 936                        --ignore-whitespace --ignore-space-change
 937                        --whitespace= --inaccurate-eof --verbose
 938                        "
 939                return
 940        esac
 941}
 942
 943_git_add ()
 944{
 945        case "$cur" in
 946        --*)
 947                __gitcomp "
 948                        --interactive --refresh --patch --update --dry-run
 949                        --ignore-errors --intent-to-add
 950                        "
 951                return
 952        esac
 953
 954        # XXX should we check for --update and --all options ?
 955        __git_complete_index_file "--others --modified --directory --no-empty-directory"
 956}
 957
 958_git_archive ()
 959{
 960        case "$cur" in
 961        --format=*)
 962                __gitcomp "$(git archive --list)" "" "${cur##--format=}"
 963                return
 964                ;;
 965        --remote=*)
 966                __gitcomp_nl "$(__git_remotes)" "" "${cur##--remote=}"
 967                return
 968                ;;
 969        --*)
 970                __gitcomp "
 971                        --format= --list --verbose
 972                        --prefix= --remote= --exec=
 973                        "
 974                return
 975                ;;
 976        esac
 977        __git_complete_file
 978}
 979
 980_git_bisect ()
 981{
 982        __git_has_doubledash && return
 983
 984        local subcommands="start bad good skip reset visualize replay log run"
 985        local subcommand="$(__git_find_on_cmdline "$subcommands")"
 986        if [ -z "$subcommand" ]; then
 987                if [ -f "$(__gitdir)"/BISECT_START ]; then
 988                        __gitcomp "$subcommands"
 989                else
 990                        __gitcomp "replay start"
 991                fi
 992                return
 993        fi
 994
 995        case "$subcommand" in
 996        bad|good|reset|skip|start)
 997                __gitcomp_nl "$(__git_refs)"
 998                ;;
 999        *)
1000                ;;
1001        esac
1002}
1003
1004_git_branch ()
1005{
1006        local i c=1 only_local_ref="n" has_r="n"
1007
1008        while [ $c -lt $cword ]; do
1009                i="${words[c]}"
1010                case "$i" in
1011                -d|-m)  only_local_ref="y" ;;
1012                -r)     has_r="y" ;;
1013                esac
1014                ((c++))
1015        done
1016
1017        case "$cur" in
1018        --set-upstream-to=*)
1019                __gitcomp_nl "$(__git_refs)" "" "${cur##--set-upstream-to=}"
1020                ;;
1021        --*)
1022                __gitcomp "
1023                        --color --no-color --verbose --abbrev= --no-abbrev
1024                        --track --no-track --contains --merged --no-merged
1025                        --set-upstream-to= --edit-description --list
1026                        --unset-upstream
1027                        "
1028                ;;
1029        *)
1030                if [ $only_local_ref = "y" -a $has_r = "n" ]; then
1031                        __gitcomp_nl "$(__git_heads)"
1032                else
1033                        __gitcomp_nl "$(__git_refs)"
1034                fi
1035                ;;
1036        esac
1037}
1038
1039_git_bundle ()
1040{
1041        local cmd="${words[2]}"
1042        case "$cword" in
1043        2)
1044                __gitcomp "create list-heads verify unbundle"
1045                ;;
1046        3)
1047                # looking for a file
1048                ;;
1049        *)
1050                case "$cmd" in
1051                        create)
1052                                __git_complete_revlist
1053                        ;;
1054                esac
1055                ;;
1056        esac
1057}
1058
1059_git_checkout ()
1060{
1061        __git_has_doubledash && return
1062
1063        case "$cur" in
1064        --conflict=*)
1065                __gitcomp "diff3 merge" "" "${cur##--conflict=}"
1066                ;;
1067        --*)
1068                __gitcomp "
1069                        --quiet --ours --theirs --track --no-track --merge
1070                        --conflict= --orphan --patch
1071                        "
1072                ;;
1073        *)
1074                # check if --track, --no-track, or --no-guess was specified
1075                # if so, disable DWIM mode
1076                local flags="--track --no-track --no-guess" track=1
1077                if [ -n "$(__git_find_on_cmdline "$flags")" ]; then
1078                        track=''
1079                fi
1080                __gitcomp_nl "$(__git_refs '' $track)"
1081                ;;
1082        esac
1083}
1084
1085_git_cherry ()
1086{
1087        __gitcomp_nl "$(__git_refs)"
1088}
1089
1090_git_cherry_pick ()
1091{
1092        local dir="$(__gitdir)"
1093        if [ -f "$dir"/CHERRY_PICK_HEAD ]; then
1094                __gitcomp "--continue --quit --abort"
1095                return
1096        fi
1097        case "$cur" in
1098        --*)
1099                __gitcomp "--edit --no-commit --signoff --strategy= --mainline"
1100                ;;
1101        *)
1102                __gitcomp_nl "$(__git_refs)"
1103                ;;
1104        esac
1105}
1106
1107_git_clean ()
1108{
1109        case "$cur" in
1110        --*)
1111                __gitcomp "--dry-run --quiet"
1112                return
1113                ;;
1114        esac
1115
1116        # XXX should we check for -x option ?
1117        __git_complete_index_file "--others --directory"
1118}
1119
1120_git_clone ()
1121{
1122        case "$cur" in
1123        --*)
1124                __gitcomp "
1125                        --local
1126                        --no-hardlinks
1127                        --shared
1128                        --reference
1129                        --quiet
1130                        --no-checkout
1131                        --bare
1132                        --mirror
1133                        --origin
1134                        --upload-pack
1135                        --template=
1136                        --depth
1137                        --single-branch
1138                        --branch
1139                        --recurse-submodules
1140                        "
1141                return
1142                ;;
1143        esac
1144}
1145
1146__git_untracked_file_modes="all no normal"
1147
1148_git_commit ()
1149{
1150        case "$prev" in
1151        -c|-C)
1152                __gitcomp_nl "$(__git_refs)" "" "${cur}"
1153                return
1154                ;;
1155        esac
1156
1157        case "$cur" in
1158        --cleanup=*)
1159                __gitcomp "default scissors strip verbatim whitespace
1160                        " "" "${cur##--cleanup=}"
1161                return
1162                ;;
1163        --reuse-message=*|--reedit-message=*|\
1164        --fixup=*|--squash=*)
1165                __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1166                return
1167                ;;
1168        --untracked-files=*)
1169                __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1170                return
1171                ;;
1172        --*)
1173                __gitcomp "
1174                        --all --author= --signoff --verify --no-verify
1175                        --edit --no-edit
1176                        --amend --include --only --interactive
1177                        --dry-run --reuse-message= --reedit-message=
1178                        --reset-author --file= --message= --template=
1179                        --cleanup= --untracked-files --untracked-files=
1180                        --verbose --quiet --fixup= --squash=
1181                        "
1182                return
1183        esac
1184
1185        if git rev-parse --verify --quiet HEAD >/dev/null; then
1186                __git_complete_index_file "--committable"
1187        else
1188                # This is the first commit
1189                __git_complete_index_file "--cached"
1190        fi
1191}
1192
1193_git_describe ()
1194{
1195        case "$cur" in
1196        --*)
1197                __gitcomp "
1198                        --all --tags --contains --abbrev= --candidates=
1199                        --exact-match --debug --long --match --always
1200                        "
1201                return
1202        esac
1203        __gitcomp_nl "$(__git_refs)"
1204}
1205
1206__git_diff_algorithms="myers minimal patience histogram"
1207
1208__git_diff_common_options="--stat --numstat --shortstat --summary
1209                        --patch-with-stat --name-only --name-status --color
1210                        --no-color --color-words --no-renames --check
1211                        --full-index --binary --abbrev --diff-filter=
1212                        --find-copies-harder
1213                        --text --ignore-space-at-eol --ignore-space-change
1214                        --ignore-all-space --ignore-blank-lines --exit-code
1215                        --quiet --ext-diff --no-ext-diff
1216                        --no-prefix --src-prefix= --dst-prefix=
1217                        --inter-hunk-context=
1218                        --patience --histogram --minimal
1219                        --raw --word-diff --word-diff-regex=
1220                        --dirstat --dirstat= --dirstat-by-file
1221                        --dirstat-by-file= --cumulative
1222                        --diff-algorithm=
1223"
1224
1225_git_diff ()
1226{
1227        __git_has_doubledash && return
1228
1229        case "$cur" in
1230        --diff-algorithm=*)
1231                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
1232                return
1233                ;;
1234        --*)
1235                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1236                        --base --ours --theirs --no-index
1237                        $__git_diff_common_options
1238                        "
1239                return
1240                ;;
1241        esac
1242        __git_complete_revlist_file
1243}
1244
1245__git_mergetools_common="diffuse diffmerge ecmerge emerge kdiff3 meld opendiff
1246                        tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc codecompare
1247"
1248
1249_git_difftool ()
1250{
1251        __git_has_doubledash && return
1252
1253        case "$cur" in
1254        --tool=*)
1255                __gitcomp "$__git_mergetools_common kompare" "" "${cur##--tool=}"
1256                return
1257                ;;
1258        --*)
1259                __gitcomp "--cached --staged --pickaxe-all --pickaxe-regex
1260                        --base --ours --theirs
1261                        --no-renames --diff-filter= --find-copies-harder
1262                        --relative --ignore-submodules
1263                        --tool="
1264                return
1265                ;;
1266        esac
1267        __git_complete_revlist_file
1268}
1269
1270__git_fetch_recurse_submodules="yes on-demand no"
1271
1272__git_fetch_options="
1273        --quiet --verbose --append --upload-pack --force --keep --depth=
1274        --tags --no-tags --all --prune --dry-run --recurse-submodules=
1275"
1276
1277_git_fetch ()
1278{
1279        case "$cur" in
1280        --recurse-submodules=*)
1281                __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1282                return
1283                ;;
1284        --*)
1285                __gitcomp "$__git_fetch_options"
1286                return
1287                ;;
1288        esac
1289        __git_complete_remote_or_refspec
1290}
1291
1292__git_format_patch_options="
1293        --stdout --attach --no-attach --thread --thread= --no-thread
1294        --numbered --start-number --numbered-files --keep-subject --signoff
1295        --signature --no-signature --in-reply-to= --cc= --full-index --binary
1296        --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
1297        --inline --suffix= --ignore-if-in-upstream --subject-prefix=
1298        --output-directory --reroll-count --to= --quiet --notes
1299"
1300
1301_git_format_patch ()
1302{
1303        case "$cur" in
1304        --thread=*)
1305                __gitcomp "
1306                        deep shallow
1307                        " "" "${cur##--thread=}"
1308                return
1309                ;;
1310        --*)
1311                __gitcomp "$__git_format_patch_options"
1312                return
1313                ;;
1314        esac
1315        __git_complete_revlist
1316}
1317
1318_git_fsck ()
1319{
1320        case "$cur" in
1321        --*)
1322                __gitcomp "
1323                        --tags --root --unreachable --cache --no-reflogs --full
1324                        --strict --verbose --lost-found
1325                        "
1326                return
1327                ;;
1328        esac
1329}
1330
1331_git_gc ()
1332{
1333        case "$cur" in
1334        --*)
1335                __gitcomp "--prune --aggressive"
1336                return
1337                ;;
1338        esac
1339}
1340
1341_git_gitk ()
1342{
1343        _gitk
1344}
1345
1346__git_match_ctag() {
1347        awk "/^${1//\//\\/}/ { print \$1 }" "$2"
1348}
1349
1350_git_grep ()
1351{
1352        __git_has_doubledash && return
1353
1354        case "$cur" in
1355        --*)
1356                __gitcomp "
1357                        --cached
1358                        --text --ignore-case --word-regexp --invert-match
1359                        --full-name --line-number
1360                        --extended-regexp --basic-regexp --fixed-strings
1361                        --perl-regexp
1362                        --threads
1363                        --files-with-matches --name-only
1364                        --files-without-match
1365                        --max-depth
1366                        --count
1367                        --and --or --not --all-match
1368                        "
1369                return
1370                ;;
1371        esac
1372
1373        case "$cword,$prev" in
1374        2,*|*,-*)
1375                if test -r tags; then
1376                        __gitcomp_nl "$(__git_match_ctag "$cur" tags)"
1377                        return
1378                fi
1379                ;;
1380        esac
1381
1382        __gitcomp_nl "$(__git_refs)"
1383}
1384
1385_git_help ()
1386{
1387        case "$cur" in
1388        --*)
1389                __gitcomp "--all --guides --info --man --web"
1390                return
1391                ;;
1392        esac
1393        __git_compute_all_commands
1394        __gitcomp "$__git_all_commands $(__git_aliases)
1395                attributes cli core-tutorial cvs-migration
1396                diffcore everyday gitk glossary hooks ignore modules
1397                namespaces repository-layout revisions tutorial tutorial-2
1398                workflows
1399                "
1400}
1401
1402_git_init ()
1403{
1404        case "$cur" in
1405        --shared=*)
1406                __gitcomp "
1407                        false true umask group all world everybody
1408                        " "" "${cur##--shared=}"
1409                return
1410                ;;
1411        --*)
1412                __gitcomp "--quiet --bare --template= --shared --shared="
1413                return
1414                ;;
1415        esac
1416}
1417
1418_git_ls_files ()
1419{
1420        case "$cur" in
1421        --*)
1422                __gitcomp "--cached --deleted --modified --others --ignored
1423                        --stage --directory --no-empty-directory --unmerged
1424                        --killed --exclude= --exclude-from=
1425                        --exclude-per-directory= --exclude-standard
1426                        --error-unmatch --with-tree= --full-name
1427                        --abbrev --ignored --exclude-per-directory
1428                        "
1429                return
1430                ;;
1431        esac
1432
1433        # XXX ignore options like --modified and always suggest all cached
1434        # files.
1435        __git_complete_index_file "--cached"
1436}
1437
1438_git_ls_remote ()
1439{
1440        __gitcomp_nl "$(__git_remotes)"
1441}
1442
1443_git_ls_tree ()
1444{
1445        __git_complete_file
1446}
1447
1448# Options that go well for log, shortlog and gitk
1449__git_log_common_options="
1450        --not --all
1451        --branches --tags --remotes
1452        --first-parent --merges --no-merges
1453        --max-count=
1454        --max-age= --since= --after=
1455        --min-age= --until= --before=
1456        --min-parents= --max-parents=
1457        --no-min-parents --no-max-parents
1458"
1459# Options that go well for log and gitk (not shortlog)
1460__git_log_gitk_options="
1461        --dense --sparse --full-history
1462        --simplify-merges --simplify-by-decoration
1463        --left-right --notes --no-notes
1464"
1465# Options that go well for log and shortlog (not gitk)
1466__git_log_shortlog_options="
1467        --author= --committer= --grep=
1468        --all-match --invert-grep
1469"
1470
1471__git_log_pretty_formats="oneline short medium full fuller email raw format:"
1472__git_log_date_formats="relative iso8601 rfc2822 short local default raw"
1473
1474_git_log ()
1475{
1476        __git_has_doubledash && return
1477
1478        local g="$(git rev-parse --git-dir 2>/dev/null)"
1479        local merge=""
1480        if [ -f "$g/MERGE_HEAD" ]; then
1481                merge="--merge"
1482        fi
1483        case "$cur" in
1484        --pretty=*|--format=*)
1485                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
1486                        " "" "${cur#*=}"
1487                return
1488                ;;
1489        --date=*)
1490                __gitcomp "$__git_log_date_formats" "" "${cur##--date=}"
1491                return
1492                ;;
1493        --decorate=*)
1494                __gitcomp "full short no" "" "${cur##--decorate=}"
1495                return
1496                ;;
1497        --*)
1498                __gitcomp "
1499                        $__git_log_common_options
1500                        $__git_log_shortlog_options
1501                        $__git_log_gitk_options
1502                        --root --topo-order --date-order --reverse
1503                        --follow --full-diff
1504                        --abbrev-commit --abbrev=
1505                        --relative-date --date=
1506                        --pretty= --format= --oneline
1507                        --show-signature
1508                        --cherry-mark
1509                        --cherry-pick
1510                        --graph
1511                        --decorate --decorate=
1512                        --walk-reflogs
1513                        --parents --children
1514                        $merge
1515                        $__git_diff_common_options
1516                        --pickaxe-all --pickaxe-regex
1517                        "
1518                return
1519                ;;
1520        esac
1521        __git_complete_revlist
1522}
1523
1524# Common merge options shared by git-merge(1) and git-pull(1).
1525__git_merge_options="
1526        --no-commit --no-stat --log --no-log --squash --strategy
1527        --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1528        --verify-signatures --no-verify-signatures --gpg-sign
1529        --quiet --verbose --progress --no-progress
1530"
1531
1532_git_merge ()
1533{
1534        __git_complete_strategy && return
1535
1536        case "$cur" in
1537        --*)
1538                __gitcomp "$__git_merge_options
1539                        --rerere-autoupdate --no-rerere-autoupdate --abort"
1540                return
1541        esac
1542        __gitcomp_nl "$(__git_refs)"
1543}
1544
1545_git_mergetool ()
1546{
1547        case "$cur" in
1548        --tool=*)
1549                __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1550                return
1551                ;;
1552        --*)
1553                __gitcomp "--tool="
1554                return
1555                ;;
1556        esac
1557}
1558
1559_git_merge_base ()
1560{
1561        case "$cur" in
1562        --*)
1563                __gitcomp "--octopus --independent --is-ancestor --fork-point"
1564                return
1565                ;;
1566        esac
1567        __gitcomp_nl "$(__git_refs)"
1568}
1569
1570_git_mv ()
1571{
1572        case "$cur" in
1573        --*)
1574                __gitcomp "--dry-run"
1575                return
1576                ;;
1577        esac
1578
1579        if [ $(__git_count_arguments "mv") -gt 0 ]; then
1580                # We need to show both cached and untracked files (including
1581                # empty directories) since this may not be the last argument.
1582                __git_complete_index_file "--cached --others --directory"
1583        else
1584                __git_complete_index_file "--cached"
1585        fi
1586}
1587
1588_git_name_rev ()
1589{
1590        __gitcomp "--tags --all --stdin"
1591}
1592
1593_git_notes ()
1594{
1595        local subcommands='add append copy edit list prune remove show'
1596        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1597
1598        case "$subcommand,$cur" in
1599        ,--*)
1600                __gitcomp '--ref'
1601                ;;
1602        ,*)
1603                case "$prev" in
1604                --ref)
1605                        __gitcomp_nl "$(__git_refs)"
1606                        ;;
1607                *)
1608                        __gitcomp "$subcommands --ref"
1609                        ;;
1610                esac
1611                ;;
1612        add,--reuse-message=*|append,--reuse-message=*|\
1613        add,--reedit-message=*|append,--reedit-message=*)
1614                __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1615                ;;
1616        add,--*|append,--*)
1617                __gitcomp '--file= --message= --reedit-message=
1618                                --reuse-message='
1619                ;;
1620        copy,--*)
1621                __gitcomp '--stdin'
1622                ;;
1623        prune,--*)
1624                __gitcomp '--dry-run --verbose'
1625                ;;
1626        prune,*)
1627                ;;
1628        *)
1629                case "$prev" in
1630                -m|-F)
1631                        ;;
1632                *)
1633                        __gitcomp_nl "$(__git_refs)"
1634                        ;;
1635                esac
1636                ;;
1637        esac
1638}
1639
1640_git_pull ()
1641{
1642        __git_complete_strategy && return
1643
1644        case "$cur" in
1645        --recurse-submodules=*)
1646                __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1647                return
1648                ;;
1649        --*)
1650                __gitcomp "
1651                        --rebase --no-rebase
1652                        $__git_merge_options
1653                        $__git_fetch_options
1654                "
1655                return
1656                ;;
1657        esac
1658        __git_complete_remote_or_refspec
1659}
1660
1661__git_push_recurse_submodules="check on-demand"
1662
1663__git_complete_force_with_lease ()
1664{
1665        local cur_=$1
1666
1667        case "$cur_" in
1668        --*=)
1669                ;;
1670        *:*)
1671                __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
1672                ;;
1673        *)
1674                __gitcomp_nl "$(__git_refs)" "" "$cur_"
1675                ;;
1676        esac
1677}
1678
1679_git_push ()
1680{
1681        case "$prev" in
1682        --repo)
1683                __gitcomp_nl "$(__git_remotes)"
1684                return
1685                ;;
1686        --recurse-submodules)
1687                __gitcomp "$__git_push_recurse_submodules"
1688                return
1689                ;;
1690        esac
1691        case "$cur" in
1692        --repo=*)
1693                __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1694                return
1695                ;;
1696        --recurse-submodules=*)
1697                __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1698                return
1699                ;;
1700        --force-with-lease=*)
1701                __git_complete_force_with_lease "${cur##--force-with-lease=}"
1702                return
1703                ;;
1704        --*)
1705                __gitcomp "
1706                        --all --mirror --tags --dry-run --force --verbose
1707                        --quiet --prune --delete --follow-tags
1708                        --receive-pack= --repo= --set-upstream
1709                        --force-with-lease --force-with-lease= --recurse-submodules=
1710                "
1711                return
1712                ;;
1713        esac
1714        __git_complete_remote_or_refspec
1715}
1716
1717_git_rebase ()
1718{
1719        local dir="$(__gitdir)"
1720        if [ -f "$dir"/rebase-merge/interactive ]; then
1721                __gitcomp "--continue --skip --abort --edit-todo"
1722                return
1723        elif [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1724                __gitcomp "--continue --skip --abort"
1725                return
1726        fi
1727        __git_complete_strategy && return
1728        case "$cur" in
1729        --whitespace=*)
1730                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1731                return
1732                ;;
1733        --*)
1734                __gitcomp "
1735                        --onto --merge --strategy --interactive
1736                        --preserve-merges --stat --no-stat
1737                        --committer-date-is-author-date --ignore-date
1738                        --ignore-whitespace --whitespace=
1739                        --autosquash --no-autosquash
1740                        --fork-point --no-fork-point
1741                        --autostash --no-autostash
1742                        --verify --no-verify
1743                        --keep-empty --root --force-rebase --no-ff
1744                        --exec
1745                        "
1746
1747                return
1748        esac
1749        __gitcomp_nl "$(__git_refs)"
1750}
1751
1752_git_reflog ()
1753{
1754        local subcommands="show delete expire"
1755        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1756
1757        if [ -z "$subcommand" ]; then
1758                __gitcomp "$subcommands"
1759        else
1760                __gitcomp_nl "$(__git_refs)"
1761        fi
1762}
1763
1764__git_send_email_confirm_options="always never auto cc compose"
1765__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1766
1767_git_send_email ()
1768{
1769        case "$prev" in
1770        --to|--cc|--bcc|--from)
1771                __gitcomp "
1772                $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1773                "
1774                return
1775                ;;
1776        esac
1777
1778        case "$cur" in
1779        --confirm=*)
1780                __gitcomp "
1781                        $__git_send_email_confirm_options
1782                        " "" "${cur##--confirm=}"
1783                return
1784                ;;
1785        --suppress-cc=*)
1786                __gitcomp "
1787                        $__git_send_email_suppresscc_options
1788                        " "" "${cur##--suppress-cc=}"
1789
1790                return
1791                ;;
1792        --smtp-encryption=*)
1793                __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1794                return
1795                ;;
1796        --thread=*)
1797                __gitcomp "
1798                        deep shallow
1799                        " "" "${cur##--thread=}"
1800                return
1801                ;;
1802        --to=*|--cc=*|--bcc=*|--from=*)
1803                __gitcomp "
1804                $(git --git-dir="$(__gitdir)" send-email --dump-aliases 2>/dev/null)
1805                " "" "${cur#--*=}"
1806                return
1807                ;;
1808        --*)
1809                __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1810                        --compose --confirm= --dry-run --envelope-sender
1811                        --from --identity
1812                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1813                        --no-suppress-from --no-thread --quiet
1814                        --signed-off-by-cc --smtp-pass --smtp-server
1815                        --smtp-server-port --smtp-encryption= --smtp-user
1816                        --subject --suppress-cc= --suppress-from --thread --to
1817                        --validate --no-validate
1818                        $__git_format_patch_options"
1819                return
1820                ;;
1821        esac
1822        __git_complete_revlist
1823}
1824
1825_git_stage ()
1826{
1827        _git_add
1828}
1829
1830_git_status ()
1831{
1832        local complete_opt
1833        local untracked_state
1834
1835        case "$cur" in
1836        --ignore-submodules=*)
1837                __gitcomp "none untracked dirty all" "" "${cur##--ignore-submodules=}"
1838                return
1839                ;;
1840        --untracked-files=*)
1841                __gitcomp "$__git_untracked_file_modes" "" "${cur##--untracked-files=}"
1842                return
1843                ;;
1844        --column=*)
1845                __gitcomp "
1846                        always never auto column row plain dense nodense
1847                        " "" "${cur##--column=}"
1848                return
1849                ;;
1850        --*)
1851                __gitcomp "
1852                        --short --branch --porcelain --long --verbose
1853                        --untracked-files= --ignore-submodules= --ignored
1854                        --column= --no-column
1855                        "
1856                return
1857                ;;
1858        esac
1859
1860        untracked_state="$(__git_get_option_value "-u" "--untracked-files=" \
1861                "$__git_untracked_file_modes" "status.showUntrackedFiles")"
1862
1863        case "$untracked_state" in
1864        no)
1865                # --ignored option does not matter
1866                complete_opt=
1867                ;;
1868        all|normal|*)
1869                complete_opt="--cached --directory --no-empty-directory --others"
1870
1871                if [ -n "$(__git_find_on_cmdline "--ignored")" ]; then
1872                        complete_opt="$complete_opt --ignored --exclude=*"
1873                fi
1874                ;;
1875        esac
1876
1877        __git_complete_index_file "$complete_opt"
1878}
1879
1880__git_config_get_set_variables ()
1881{
1882        local prevword word config_file= c=$cword
1883        while [ $c -gt 1 ]; do
1884                word="${words[c]}"
1885                case "$word" in
1886                --system|--global|--local|--file=*)
1887                        config_file="$word"
1888                        break
1889                        ;;
1890                -f|--file)
1891                        config_file="$word $prevword"
1892                        break
1893                        ;;
1894                esac
1895                prevword=$word
1896                c=$((--c))
1897        done
1898
1899        git --git-dir="$(__gitdir)" config $config_file --name-only --list 2>/dev/null
1900}
1901
1902_git_config ()
1903{
1904        case "$prev" in
1905        branch.*.remote|branch.*.pushremote)
1906                __gitcomp_nl "$(__git_remotes)"
1907                return
1908                ;;
1909        branch.*.merge)
1910                __gitcomp_nl "$(__git_refs)"
1911                return
1912                ;;
1913        branch.*.rebase)
1914                __gitcomp "false true preserve interactive"
1915                return
1916                ;;
1917        remote.pushdefault)
1918                __gitcomp_nl "$(__git_remotes)"
1919                return
1920                ;;
1921        remote.*.fetch)
1922                local remote="${prev#remote.}"
1923                remote="${remote%.fetch}"
1924                if [ -z "$cur" ]; then
1925                        __gitcomp_nl "refs/heads/" "" "" ""
1926                        return
1927                fi
1928                __gitcomp_nl "$(__git_refs_remotes "$remote")"
1929                return
1930                ;;
1931        remote.*.push)
1932                local remote="${prev#remote.}"
1933                remote="${remote%.push}"
1934                __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1935                        for-each-ref --format='%(refname):%(refname)' \
1936                        refs/heads)"
1937                return
1938                ;;
1939        pull.twohead|pull.octopus)
1940                __git_compute_merge_strategies
1941                __gitcomp "$__git_merge_strategies"
1942                return
1943                ;;
1944        color.branch|color.diff|color.interactive|\
1945        color.showbranch|color.status|color.ui)
1946                __gitcomp "always never auto"
1947                return
1948                ;;
1949        color.pager)
1950                __gitcomp "false true"
1951                return
1952                ;;
1953        color.*.*)
1954                __gitcomp "
1955                        normal black red green yellow blue magenta cyan white
1956                        bold dim ul blink reverse
1957                        "
1958                return
1959                ;;
1960        diff.submodule)
1961                __gitcomp "log short"
1962                return
1963                ;;
1964        help.format)
1965                __gitcomp "man info web html"
1966                return
1967                ;;
1968        log.date)
1969                __gitcomp "$__git_log_date_formats"
1970                return
1971                ;;
1972        sendemail.aliasesfiletype)
1973                __gitcomp "mutt mailrc pine elm gnus"
1974                return
1975                ;;
1976        sendemail.confirm)
1977                __gitcomp "$__git_send_email_confirm_options"
1978                return
1979                ;;
1980        sendemail.suppresscc)
1981                __gitcomp "$__git_send_email_suppresscc_options"
1982                return
1983                ;;
1984        sendemail.transferencoding)
1985                __gitcomp "7bit 8bit quoted-printable base64"
1986                return
1987                ;;
1988        --get|--get-all|--unset|--unset-all)
1989                __gitcomp_nl "$(__git_config_get_set_variables)"
1990                return
1991                ;;
1992        *.*)
1993                return
1994                ;;
1995        esac
1996        case "$cur" in
1997        --*)
1998                __gitcomp "
1999                        --system --global --local --file=
2000                        --list --replace-all
2001                        --get --get-all --get-regexp
2002                        --add --unset --unset-all
2003                        --remove-section --rename-section
2004                        --name-only
2005                        "
2006                return
2007                ;;
2008        branch.*.*)
2009                local pfx="${cur%.*}." cur_="${cur##*.}"
2010                __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
2011                return
2012                ;;
2013        branch.*)
2014                local pfx="${cur%.*}." cur_="${cur#*.}"
2015                __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
2016                __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
2017                return
2018                ;;
2019        guitool.*.*)
2020                local pfx="${cur%.*}." cur_="${cur##*.}"
2021                __gitcomp "
2022                        argprompt cmd confirm needsfile noconsole norescan
2023                        prompt revprompt revunmerged title
2024                        " "$pfx" "$cur_"
2025                return
2026                ;;
2027        difftool.*.*)
2028                local pfx="${cur%.*}." cur_="${cur##*.}"
2029                __gitcomp "cmd path" "$pfx" "$cur_"
2030                return
2031                ;;
2032        man.*.*)
2033                local pfx="${cur%.*}." cur_="${cur##*.}"
2034                __gitcomp "cmd path" "$pfx" "$cur_"
2035                return
2036                ;;
2037        mergetool.*.*)
2038                local pfx="${cur%.*}." cur_="${cur##*.}"
2039                __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
2040                return
2041                ;;
2042        pager.*)
2043                local pfx="${cur%.*}." cur_="${cur#*.}"
2044                __git_compute_all_commands
2045                __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
2046                return
2047                ;;
2048        remote.*.*)
2049                local pfx="${cur%.*}." cur_="${cur##*.}"
2050                __gitcomp "
2051                        url proxy fetch push mirror skipDefaultUpdate
2052                        receivepack uploadpack tagopt pushurl
2053                        " "$pfx" "$cur_"
2054                return
2055                ;;
2056        remote.*)
2057                local pfx="${cur%.*}." cur_="${cur#*.}"
2058                __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
2059                __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
2060                return
2061                ;;
2062        url.*.*)
2063                local pfx="${cur%.*}." cur_="${cur##*.}"
2064                __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
2065                return
2066                ;;
2067        esac
2068        __gitcomp "
2069                add.ignoreErrors
2070                advice.commitBeforeMerge
2071                advice.detachedHead
2072                advice.implicitIdentity
2073                advice.pushNonFastForward
2074                advice.resolveConflict
2075                advice.statusHints
2076                alias.
2077                am.keepcr
2078                apply.ignorewhitespace
2079                apply.whitespace
2080                branch.autosetupmerge
2081                branch.autosetuprebase
2082                browser.
2083                clean.requireForce
2084                color.branch
2085                color.branch.current
2086                color.branch.local
2087                color.branch.plain
2088                color.branch.remote
2089                color.decorate.HEAD
2090                color.decorate.branch
2091                color.decorate.remoteBranch
2092                color.decorate.stash
2093                color.decorate.tag
2094                color.diff
2095                color.diff.commit
2096                color.diff.frag
2097                color.diff.func
2098                color.diff.meta
2099                color.diff.new
2100                color.diff.old
2101                color.diff.plain
2102                color.diff.whitespace
2103                color.grep
2104                color.grep.context
2105                color.grep.filename
2106                color.grep.function
2107                color.grep.linenumber
2108                color.grep.match
2109                color.grep.selected
2110                color.grep.separator
2111                color.interactive
2112                color.interactive.error
2113                color.interactive.header
2114                color.interactive.help
2115                color.interactive.prompt
2116                color.pager
2117                color.showbranch
2118                color.status
2119                color.status.added
2120                color.status.changed
2121                color.status.header
2122                color.status.nobranch
2123                color.status.unmerged
2124                color.status.untracked
2125                color.status.updated
2126                color.ui
2127                commit.status
2128                commit.template
2129                core.abbrev
2130                core.askpass
2131                core.attributesfile
2132                core.autocrlf
2133                core.bare
2134                core.bigFileThreshold
2135                core.compression
2136                core.createObject
2137                core.deltaBaseCacheLimit
2138                core.editor
2139                core.eol
2140                core.excludesfile
2141                core.fileMode
2142                core.fsyncobjectfiles
2143                core.gitProxy
2144                core.ignoreStat
2145                core.ignorecase
2146                core.logAllRefUpdates
2147                core.loosecompression
2148                core.notesRef
2149                core.packedGitLimit
2150                core.packedGitWindowSize
2151                core.pager
2152                core.preferSymlinkRefs
2153                core.preloadindex
2154                core.quotepath
2155                core.repositoryFormatVersion
2156                core.safecrlf
2157                core.sharedRepository
2158                core.sparseCheckout
2159                core.symlinks
2160                core.trustctime
2161                core.untrackedCache
2162                core.warnAmbiguousRefs
2163                core.whitespace
2164                core.worktree
2165                diff.autorefreshindex
2166                diff.external
2167                diff.ignoreSubmodules
2168                diff.mnemonicprefix
2169                diff.noprefix
2170                diff.renameLimit
2171                diff.renames
2172                diff.statGraphWidth
2173                diff.submodule
2174                diff.suppressBlankEmpty
2175                diff.tool
2176                diff.wordRegex
2177                diff.algorithm
2178                difftool.
2179                difftool.prompt
2180                fetch.recurseSubmodules
2181                fetch.unpackLimit
2182                format.attach
2183                format.cc
2184                format.coverLetter
2185                format.headers
2186                format.numbered
2187                format.pretty
2188                format.signature
2189                format.signoff
2190                format.subjectprefix
2191                format.suffix
2192                format.thread
2193                format.to
2194                gc.
2195                gc.aggressiveWindow
2196                gc.auto
2197                gc.autopacklimit
2198                gc.packrefs
2199                gc.pruneexpire
2200                gc.reflogexpire
2201                gc.reflogexpireunreachable
2202                gc.rerereresolved
2203                gc.rerereunresolved
2204                gitcvs.allbinary
2205                gitcvs.commitmsgannotation
2206                gitcvs.dbTableNamePrefix
2207                gitcvs.dbdriver
2208                gitcvs.dbname
2209                gitcvs.dbpass
2210                gitcvs.dbuser
2211                gitcvs.enabled
2212                gitcvs.logfile
2213                gitcvs.usecrlfattr
2214                guitool.
2215                gui.blamehistoryctx
2216                gui.commitmsgwidth
2217                gui.copyblamethreshold
2218                gui.diffcontext
2219                gui.encoding
2220                gui.fastcopyblame
2221                gui.matchtrackingbranch
2222                gui.newbranchtemplate
2223                gui.pruneduringfetch
2224                gui.spellingdictionary
2225                gui.trustmtime
2226                help.autocorrect
2227                help.browser
2228                help.format
2229                http.lowSpeedLimit
2230                http.lowSpeedTime
2231                http.maxRequests
2232                http.minSessions
2233                http.noEPSV
2234                http.postBuffer
2235                http.proxy
2236                http.sslCipherList
2237                http.sslVersion
2238                http.sslCAInfo
2239                http.sslCAPath
2240                http.sslCert
2241                http.sslCertPasswordProtected
2242                http.sslKey
2243                http.sslVerify
2244                http.useragent
2245                i18n.commitEncoding
2246                i18n.logOutputEncoding
2247                imap.authMethod
2248                imap.folder
2249                imap.host
2250                imap.pass
2251                imap.port
2252                imap.preformattedHTML
2253                imap.sslverify
2254                imap.tunnel
2255                imap.user
2256                init.templatedir
2257                instaweb.browser
2258                instaweb.httpd
2259                instaweb.local
2260                instaweb.modulepath
2261                instaweb.port
2262                interactive.singlekey
2263                log.date
2264                log.decorate
2265                log.showroot
2266                mailmap.file
2267                man.
2268                man.viewer
2269                merge.
2270                merge.conflictstyle
2271                merge.log
2272                merge.renameLimit
2273                merge.renormalize
2274                merge.stat
2275                merge.tool
2276                merge.verbosity
2277                mergetool.
2278                mergetool.keepBackup
2279                mergetool.keepTemporaries
2280                mergetool.prompt
2281                notes.displayRef
2282                notes.rewrite.
2283                notes.rewrite.amend
2284                notes.rewrite.rebase
2285                notes.rewriteMode
2286                notes.rewriteRef
2287                pack.compression
2288                pack.deltaCacheLimit
2289                pack.deltaCacheSize
2290                pack.depth
2291                pack.indexVersion
2292                pack.packSizeLimit
2293                pack.threads
2294                pack.window
2295                pack.windowMemory
2296                pager.
2297                pretty.
2298                pull.octopus
2299                pull.twohead
2300                push.default
2301                push.followTags
2302                rebase.autosquash
2303                rebase.stat
2304                receive.autogc
2305                receive.denyCurrentBranch
2306                receive.denyDeleteCurrent
2307                receive.denyDeletes
2308                receive.denyNonFastForwards
2309                receive.fsckObjects
2310                receive.unpackLimit
2311                receive.updateserverinfo
2312                remote.pushdefault
2313                remotes.
2314                repack.usedeltabaseoffset
2315                rerere.autoupdate
2316                rerere.enabled
2317                sendemail.
2318                sendemail.aliasesfile
2319                sendemail.aliasfiletype
2320                sendemail.bcc
2321                sendemail.cc
2322                sendemail.cccmd
2323                sendemail.chainreplyto
2324                sendemail.confirm
2325                sendemail.envelopesender
2326                sendemail.from
2327                sendemail.identity
2328                sendemail.multiedit
2329                sendemail.signedoffbycc
2330                sendemail.smtpdomain
2331                sendemail.smtpencryption
2332                sendemail.smtppass
2333                sendemail.smtpserver
2334                sendemail.smtpserveroption
2335                sendemail.smtpserverport
2336                sendemail.smtpuser
2337                sendemail.suppresscc
2338                sendemail.suppressfrom
2339                sendemail.thread
2340                sendemail.to
2341                sendemail.validate
2342                showbranch.default
2343                status.relativePaths
2344                status.showUntrackedFiles
2345                status.submodulesummary
2346                submodule.
2347                tar.umask
2348                transfer.unpackLimit
2349                url.
2350                user.email
2351                user.name
2352                user.signingkey
2353                web.browser
2354                branch. remote.
2355        "
2356}
2357
2358_git_remote ()
2359{
2360        local subcommands="add rename remove set-head set-branches set-url show prune update"
2361        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2362        if [ -z "$subcommand" ]; then
2363                __gitcomp "$subcommands"
2364                return
2365        fi
2366
2367        case "$subcommand" in
2368        rename|remove|set-url|show|prune)
2369                __gitcomp_nl "$(__git_remotes)"
2370                ;;
2371        set-head|set-branches)
2372                __git_complete_remote_or_refspec
2373                ;;
2374        update)
2375                __gitcomp "$(__git_get_config_variables "remotes")"
2376                ;;
2377        *)
2378                ;;
2379        esac
2380}
2381
2382_git_replace ()
2383{
2384        __gitcomp_nl "$(__git_refs)"
2385}
2386
2387_git_reset ()
2388{
2389        __git_has_doubledash && return
2390
2391        case "$cur" in
2392        --*)
2393                __gitcomp "--merge --mixed --hard --soft --patch"
2394                return
2395                ;;
2396        esac
2397        __gitcomp_nl "$(__git_refs)"
2398}
2399
2400_git_revert ()
2401{
2402        local dir="$(__gitdir)"
2403        if [ -f "$dir"/REVERT_HEAD ]; then
2404                __gitcomp "--continue --quit --abort"
2405                return
2406        fi
2407        case "$cur" in
2408        --*)
2409                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2410                return
2411                ;;
2412        esac
2413        __gitcomp_nl "$(__git_refs)"
2414}
2415
2416_git_rm ()
2417{
2418        case "$cur" in
2419        --*)
2420                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2421                return
2422                ;;
2423        esac
2424
2425        __git_complete_index_file "--cached"
2426}
2427
2428_git_shortlog ()
2429{
2430        __git_has_doubledash && return
2431
2432        case "$cur" in
2433        --*)
2434                __gitcomp "
2435                        $__git_log_common_options
2436                        $__git_log_shortlog_options
2437                        --numbered --summary
2438                        "
2439                return
2440                ;;
2441        esac
2442        __git_complete_revlist
2443}
2444
2445_git_show ()
2446{
2447        __git_has_doubledash && return
2448
2449        case "$cur" in
2450        --pretty=*|--format=*)
2451                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2452                        " "" "${cur#*=}"
2453                return
2454                ;;
2455        --diff-algorithm=*)
2456                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2457                return
2458                ;;
2459        --*)
2460                __gitcomp "--pretty= --format= --abbrev-commit --oneline
2461                        --show-signature
2462                        $__git_diff_common_options
2463                        "
2464                return
2465                ;;
2466        esac
2467        __git_complete_revlist_file
2468}
2469
2470_git_show_branch ()
2471{
2472        case "$cur" in
2473        --*)
2474                __gitcomp "
2475                        --all --remotes --topo-order --date-order --current --more=
2476                        --list --independent --merge-base --no-name
2477                        --color --no-color
2478                        --sha1-name --sparse --topics --reflog
2479                        "
2480                return
2481                ;;
2482        esac
2483        __git_complete_revlist
2484}
2485
2486_git_stash ()
2487{
2488        local save_opts='--all --keep-index --no-keep-index --quiet --patch --include-untracked'
2489        local subcommands='save list show apply clear drop pop create branch'
2490        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2491        if [ -z "$subcommand" ]; then
2492                case "$cur" in
2493                --*)
2494                        __gitcomp "$save_opts"
2495                        ;;
2496                *)
2497                        if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2498                                __gitcomp "$subcommands"
2499                        fi
2500                        ;;
2501                esac
2502        else
2503                case "$subcommand,$cur" in
2504                save,--*)
2505                        __gitcomp "$save_opts"
2506                        ;;
2507                apply,--*|pop,--*)
2508                        __gitcomp "--index --quiet"
2509                        ;;
2510                drop,--*)
2511                        __gitcomp "--quiet"
2512                        ;;
2513                show,--*|branch,--*)
2514                        ;;
2515                branch,*)
2516                        if [ $cword -eq 3 ]; then
2517                                __gitcomp_nl "$(__git_refs)";
2518                        else
2519                                __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2520                                                | sed -n -e 's/:.*//p')"
2521                        fi
2522                        ;;
2523                show,*|apply,*|drop,*|pop,*)
2524                        __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2525                                        | sed -n -e 's/:.*//p')"
2526                        ;;
2527                *)
2528                        ;;
2529                esac
2530        fi
2531}
2532
2533_git_submodule ()
2534{
2535        __git_has_doubledash && return
2536
2537        local subcommands="add status init deinit update summary foreach sync"
2538        if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2539                case "$cur" in
2540                --*)
2541                        __gitcomp "--quiet --cached"
2542                        ;;
2543                *)
2544                        __gitcomp "$subcommands"
2545                        ;;
2546                esac
2547                return
2548        fi
2549}
2550
2551_git_svn ()
2552{
2553        local subcommands="
2554                init fetch clone rebase dcommit log find-rev
2555                set-tree commit-diff info create-ignore propget
2556                proplist show-ignore show-externals branch tag blame
2557                migrate mkdirs reset gc
2558                "
2559        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2560        if [ -z "$subcommand" ]; then
2561                __gitcomp "$subcommands"
2562        else
2563                local remote_opts="--username= --config-dir= --no-auth-cache"
2564                local fc_opts="
2565                        --follow-parent --authors-file= --repack=
2566                        --no-metadata --use-svm-props --use-svnsync-props
2567                        --log-window-size= --no-checkout --quiet
2568                        --repack-flags --use-log-author --localtime
2569                        --ignore-paths= --include-paths= $remote_opts
2570                        "
2571                local init_opts="
2572                        --template= --shared= --trunk= --tags=
2573                        --branches= --stdlayout --minimize-url
2574                        --no-metadata --use-svm-props --use-svnsync-props
2575                        --rewrite-root= --prefix= --use-log-author
2576                        --add-author-from $remote_opts
2577                        "
2578                local cmt_opts="
2579                        --edit --rmdir --find-copies-harder --copy-similarity=
2580                        "
2581
2582                case "$subcommand,$cur" in
2583                fetch,--*)
2584                        __gitcomp "--revision= --fetch-all $fc_opts"
2585                        ;;
2586                clone,--*)
2587                        __gitcomp "--revision= $fc_opts $init_opts"
2588                        ;;
2589                init,--*)
2590                        __gitcomp "$init_opts"
2591                        ;;
2592                dcommit,--*)
2593                        __gitcomp "
2594                                --merge --strategy= --verbose --dry-run
2595                                --fetch-all --no-rebase --commit-url
2596                                --revision --interactive $cmt_opts $fc_opts
2597                                "
2598                        ;;
2599                set-tree,--*)
2600                        __gitcomp "--stdin $cmt_opts $fc_opts"
2601                        ;;
2602                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2603                show-externals,--*|mkdirs,--*)
2604                        __gitcomp "--revision="
2605                        ;;
2606                log,--*)
2607                        __gitcomp "
2608                                --limit= --revision= --verbose --incremental
2609                                --oneline --show-commit --non-recursive
2610                                --authors-file= --color
2611                                "
2612                        ;;
2613                rebase,--*)
2614                        __gitcomp "
2615                                --merge --verbose --strategy= --local
2616                                --fetch-all --dry-run $fc_opts
2617                                "
2618                        ;;
2619                commit-diff,--*)
2620                        __gitcomp "--message= --file= --revision= $cmt_opts"
2621                        ;;
2622                info,--*)
2623                        __gitcomp "--url"
2624                        ;;
2625                branch,--*)
2626                        __gitcomp "--dry-run --message --tag"
2627                        ;;
2628                tag,--*)
2629                        __gitcomp "--dry-run --message"
2630                        ;;
2631                blame,--*)
2632                        __gitcomp "--git-format"
2633                        ;;
2634                migrate,--*)
2635                        __gitcomp "
2636                                --config-dir= --ignore-paths= --minimize
2637                                --no-auth-cache --username=
2638                                "
2639                        ;;
2640                reset,--*)
2641                        __gitcomp "--revision= --parent"
2642                        ;;
2643                *)
2644                        ;;
2645                esac
2646        fi
2647}
2648
2649_git_tag ()
2650{
2651        local i c=1 f=0
2652        while [ $c -lt $cword ]; do
2653                i="${words[c]}"
2654                case "$i" in
2655                -d|-v)
2656                        __gitcomp_nl "$(__git_tags)"
2657                        return
2658                        ;;
2659                -f)
2660                        f=1
2661                        ;;
2662                esac
2663                ((c++))
2664        done
2665
2666        case "$prev" in
2667        -m|-F)
2668                ;;
2669        -*|tag)
2670                if [ $f = 1 ]; then
2671                        __gitcomp_nl "$(__git_tags)"
2672                fi
2673                ;;
2674        *)
2675                __gitcomp_nl "$(__git_refs)"
2676                ;;
2677        esac
2678
2679        case "$cur" in
2680        --*)
2681                __gitcomp "
2682                        --list --delete --verify --annotate --message --file
2683                        --sign --cleanup --local-user --force --column --sort
2684                        --contains --points-at
2685                        "
2686                ;;
2687        esac
2688}
2689
2690_git_whatchanged ()
2691{
2692        _git_log
2693}
2694
2695_git_worktree ()
2696{
2697        local subcommands="add list lock prune unlock"
2698        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2699        if [ -z "$subcommand" ]; then
2700                __gitcomp "$subcommands"
2701        else
2702                case "$subcommand,$cur" in
2703                add,--*)
2704                        __gitcomp "--detach"
2705                        ;;
2706                list,--*)
2707                        __gitcomp "--porcelain"
2708                        ;;
2709                lock,--*)
2710                        __gitcomp "--reason"
2711                        ;;
2712                prune,--*)
2713                        __gitcomp "--dry-run --expire --verbose"
2714                        ;;
2715                *)
2716                        ;;
2717                esac
2718        fi
2719}
2720
2721__git_main ()
2722{
2723        local i c=1 command __git_dir
2724
2725        while [ $c -lt $cword ]; do
2726                i="${words[c]}"
2727                case "$i" in
2728                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2729                --git-dir)   ((c++)) ; __git_dir="${words[c]}" ;;
2730                --bare)      __git_dir="." ;;
2731                --help) command="help"; break ;;
2732                -c|--work-tree|--namespace) ((c++)) ;;
2733                -*) ;;
2734                *) command="$i"; break ;;
2735                esac
2736                ((c++))
2737        done
2738
2739        if [ -z "$command" ]; then
2740                case "$cur" in
2741                --*)   __gitcomp "
2742                        --paginate
2743                        --no-pager
2744                        --git-dir=
2745                        --bare
2746                        --version
2747                        --exec-path
2748                        --exec-path=
2749                        --html-path
2750                        --man-path
2751                        --info-path
2752                        --work-tree=
2753                        --namespace=
2754                        --no-replace-objects
2755                        --help
2756                        "
2757                        ;;
2758                *)     __git_compute_porcelain_commands
2759                       __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2760                esac
2761                return
2762        fi
2763
2764        local completion_func="_git_${command//-/_}"
2765        declare -f $completion_func >/dev/null && $completion_func && return
2766
2767        local expansion=$(__git_aliased_command "$command")
2768        if [ -n "$expansion" ]; then
2769                words[1]=$expansion
2770                completion_func="_git_${expansion//-/_}"
2771                declare -f $completion_func >/dev/null && $completion_func
2772        fi
2773}
2774
2775__gitk_main ()
2776{
2777        __git_has_doubledash && return
2778
2779        local g="$(__gitdir)"
2780        local merge=""
2781        if [ -f "$g/MERGE_HEAD" ]; then
2782                merge="--merge"
2783        fi
2784        case "$cur" in
2785        --*)
2786                __gitcomp "
2787                        $__git_log_common_options
2788                        $__git_log_gitk_options
2789                        $merge
2790                        "
2791                return
2792                ;;
2793        esac
2794        __git_complete_revlist
2795}
2796
2797if [[ -n ${ZSH_VERSION-} ]]; then
2798        echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2799
2800        autoload -U +X compinit && compinit
2801
2802        __gitcomp ()
2803        {
2804                emulate -L zsh
2805
2806                local cur_="${3-$cur}"
2807
2808                case "$cur_" in
2809                --*=)
2810                        ;;
2811                *)
2812                        local c IFS=$' \t\n'
2813                        local -a array
2814                        for c in ${=1}; do
2815                                c="$c${4-}"
2816                                case $c in
2817                                --*=*|*.) ;;
2818                                *) c="$c " ;;
2819                                esac
2820                                array[${#array[@]}+1]="$c"
2821                        done
2822                        compset -P '*[=:]'
2823                        compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2824                        ;;
2825                esac
2826        }
2827
2828        __gitcomp_nl ()
2829        {
2830                emulate -L zsh
2831
2832                local IFS=$'\n'
2833                compset -P '*[=:]'
2834                compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2835        }
2836
2837        __gitcomp_file ()
2838        {
2839                emulate -L zsh
2840
2841                local IFS=$'\n'
2842                compset -P '*[=:]'
2843                compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2844        }
2845
2846        _git ()
2847        {
2848                local _ret=1 cur cword prev
2849                cur=${words[CURRENT]}
2850                prev=${words[CURRENT-1]}
2851                let cword=CURRENT-1
2852                emulate ksh -c __${service}_main
2853                let _ret && _default && _ret=0
2854                return _ret
2855        }
2856
2857        compdef _git git gitk
2858        return
2859fi
2860
2861__git_func_wrap ()
2862{
2863        local cur words cword prev
2864        _get_comp_words_by_ref -n =: cur words cword prev
2865        $1
2866}
2867
2868# Setup completion for certain functions defined above by setting common
2869# variables and workarounds.
2870# This is NOT a public function; use at your own risk.
2871__git_complete ()
2872{
2873        local wrapper="__git_wrap${2}"
2874        eval "$wrapper () { __git_func_wrap $2 ; }"
2875        complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2876                || complete -o default -o nospace -F $wrapper $1
2877}
2878
2879# wrapper for backwards compatibility
2880_git ()
2881{
2882        __git_wrap__git_main
2883}
2884
2885# wrapper for backwards compatibility
2886_gitk ()
2887{
2888        __git_wrap__gitk_main
2889}
2890
2891__git_complete git __git_main
2892__git_complete gitk __gitk_main
2893
2894# The following are necessary only for Cygwin, and only are needed
2895# when the user has tab-completed the executable name and consequently
2896# included the '.exe' suffix.
2897#
2898if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2899__git_complete git.exe __git_main
2900fi