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