contrib / completion / git-completion.bashon commit completion: complete --cherry-mark for git log (d3bfbf9)
   1# bash/zsh completion support for core Git.
   2#
   3# Copyright (C) 2006,2007 Shawn O. Pearce <spearce@spearce.org>
   4# Conceptually based on gitcompletion (http://gitweb.hawaga.org.uk/).
   5# Distributed under the GNU General Public License, version 2.0.
   6#
   7# The contained completion routines provide support for completing:
   8#
   9#    *) local and remote branch names
  10#    *) local and remote tag names
  11#    *) .git/remotes file names
  12#    *) git 'subcommands'
  13#    *) tree paths within 'ref:path/to/file' expressions
  14#    *) file paths within current working directory and index
  15#    *) common --long-options
  16#
  17# To use these routines:
  18#
  19#    1) Copy this file to somewhere (e.g. ~/.git-completion.bash).
  20#    2) Add the following line to your .bashrc/.zshrc:
  21#        source ~/.git-completion.bash
  22#    3) Consider changing your PS1 to also show the current branch,
  23#       see git-prompt.sh for details.
  24#
  25# If you use complex aliases of form '!f() { ... }; f', you can use the null
  26# command ':' as the first command in the function body to declare the desired
  27# completion style.  For example '!f() { : git commit ; ... }; f' will
  28# tell the completion to use commit completion.  This also works with aliases
  29# of form "!sh -c '...'".  For example, "!sh -c ': git commit ; ... '".
  30
  31case "$COMP_WORDBREAKS" in
  32*:*) : great ;;
  33*)   COMP_WORDBREAKS="$COMP_WORDBREAKS:"
  34esac
  35
  36# __gitdir accepts 0 or 1 arguments (i.e., location)
  37# returns location of .git repo
  38__gitdir ()
  39{
  40        if [ -z "${1-}" ]; then
  41                if [ -n "${__git_dir-}" ]; then
  42                        echo "$__git_dir"
  43                elif [ -n "${GIT_DIR-}" ]; then
  44                        test -d "${GIT_DIR-}" || return 1
  45                        echo "$GIT_DIR"
  46                elif [ -d .git ]; then
  47                        echo .git
  48                else
  49                        git rev-parse --git-dir 2>/dev/null
  50                fi
  51        elif [ -d "$1/.git" ]; then
  52                echo "$1/.git"
  53        else
  54                echo "$1"
  55        fi
  56}
  57
  58# The following function is based on code from:
  59#
  60#   bash_completion - programmable completion functions for bash 3.2+
  61#
  62#   Copyright © 2006-2008, Ian Macdonald <ian@caliban.org>
  63#             © 2009-2010, Bash Completion Maintainers
  64#                     <bash-completion-devel@lists.alioth.debian.org>
  65#
  66#   This program is free software; you can redistribute it and/or modify
  67#   it under the terms of the GNU General Public License as published by
  68#   the Free Software Foundation; either version 2, or (at your option)
  69#   any later version.
  70#
  71#   This program is distributed in the hope that it will be useful,
  72#   but WITHOUT ANY WARRANTY; without even the implied warranty of
  73#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  74#   GNU General Public License for more details.
  75#
  76#   You should have received a copy of the GNU General Public License
  77#   along with this program; if not, write to the Free Software Foundation,
  78#   Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  79#
  80#   The latest version of this software can be obtained here:
  81#
  82#   http://bash-completion.alioth.debian.org/
  83#
  84#   RELEASE: 2.x
  85
  86# This function can be used to access a tokenized list of words
  87# on the command line:
  88#
  89#       __git_reassemble_comp_words_by_ref '=:'
  90#       if test "${words_[cword_-1]}" = -w
  91#       then
  92#               ...
  93#       fi
  94#
  95# The argument should be a collection of characters from the list of
  96# word completion separators (COMP_WORDBREAKS) to treat as ordinary
  97# characters.
  98#
  99# This is roughly equivalent to going back in time and setting
 100# COMP_WORDBREAKS to exclude those characters.  The intent is to
 101# make option types like --date=<type> and <rev>:<path> easy to
 102# recognize by treating each shell word as a single token.
 103#
 104# It is best not to set COMP_WORDBREAKS directly because the value is
 105# shared with other completion scripts.  By the time the completion
 106# function gets called, COMP_WORDS has already been populated so local
 107# changes to COMP_WORDBREAKS have no effect.
 108#
 109# Output: words_, cword_, cur_.
 110
 111__git_reassemble_comp_words_by_ref()
 112{
 113        local exclude i j first
 114        # Which word separators to exclude?
 115        exclude="${1//[^$COMP_WORDBREAKS]}"
 116        cword_=$COMP_CWORD
 117        if [ -z "$exclude" ]; then
 118                words_=("${COMP_WORDS[@]}")
 119                return
 120        fi
 121        # List of word completion separators has shrunk;
 122        # re-assemble words to complete.
 123        for ((i=0, j=0; i < ${#COMP_WORDS[@]}; i++, j++)); do
 124                # Append each nonempty word consisting of just
 125                # word separator characters to the current word.
 126                first=t
 127                while
 128                        [ $i -gt 0 ] &&
 129                        [ -n "${COMP_WORDS[$i]}" ] &&
 130                        # word consists of excluded word separators
 131                        [ "${COMP_WORDS[$i]//[^$exclude]}" = "${COMP_WORDS[$i]}" ]
 132                do
 133                        # Attach to the previous token,
 134                        # unless the previous token is the command name.
 135                        if [ $j -ge 2 ] && [ -n "$first" ]; then
 136                                ((j--))
 137                        fi
 138                        first=
 139                        words_[$j]=${words_[j]}${COMP_WORDS[i]}
 140                        if [ $i = $COMP_CWORD ]; then
 141                                cword_=$j
 142                        fi
 143                        if (($i < ${#COMP_WORDS[@]} - 1)); then
 144                                ((i++))
 145                        else
 146                                # Done.
 147                                return
 148                        fi
 149                done
 150                words_[$j]=${words_[j]}${COMP_WORDS[i]}
 151                if [ $i = $COMP_CWORD ]; then
 152                        cword_=$j
 153                fi
 154        done
 155}
 156
 157if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
 158_get_comp_words_by_ref ()
 159{
 160        local exclude cur_ words_ cword_
 161        if [ "$1" = "-n" ]; then
 162                exclude=$2
 163                shift 2
 164        fi
 165        __git_reassemble_comp_words_by_ref "$exclude"
 166        cur_=${words_[cword_]}
 167        while [ $# -gt 0 ]; do
 168                case "$1" in
 169                cur)
 170                        cur=$cur_
 171                        ;;
 172                prev)
 173                        prev=${words_[$cword_-1]}
 174                        ;;
 175                words)
 176                        words=("${words_[@]}")
 177                        ;;
 178                cword)
 179                        cword=$cword_
 180                        ;;
 181                esac
 182                shift
 183        done
 184}
 185fi
 186
 187__gitcompappend ()
 188{
 189        local x i=${#COMPREPLY[@]}
 190        for x in $1; do
 191                if [[ "$x" == "$3"* ]]; then
 192                        COMPREPLY[i++]="$2$x$4"
 193                fi
 194        done
 195}
 196
 197__gitcompadd ()
 198{
 199        COMPREPLY=()
 200        __gitcompappend "$@"
 201}
 202
 203# Generates completion reply, appending a space to possible completion words,
 204# if necessary.
 205# It accepts 1 to 4 arguments:
 206# 1: List of possible completion words.
 207# 2: A prefix to be added to each possible completion word (optional).
 208# 3: Generate possible completion matches for this word (optional).
 209# 4: A suffix to be appended to each possible completion word (optional).
 210__gitcomp ()
 211{
 212        local cur_="${3-$cur}"
 213
 214        case "$cur_" in
 215        --*=)
 216                ;;
 217        *)
 218                local c i=0 IFS=$' \t\n'
 219                for c in $1; do
 220                        c="$c${4-}"
 221                        if [[ $c == "$cur_"* ]]; then
 222                                case $c in
 223                                --*=*|*.) ;;
 224                                *) c="$c " ;;
 225                                esac
 226                                COMPREPLY[i++]="${2-}$c"
 227                        fi
 228                done
 229                ;;
 230        esac
 231}
 232
 233# Variation of __gitcomp_nl () that appends to the existing list of
 234# completion candidates, COMPREPLY.
 235__gitcomp_nl_append ()
 236{
 237        local IFS=$'\n'
 238        __gitcompappend "$1" "${2-}" "${3-$cur}" "${4- }"
 239}
 240
 241# Generates completion reply from newline-separated possible completion words
 242# by appending a space to all of them.
 243# It accepts 1 to 4 arguments:
 244# 1: List of possible completion words, separated by a single newline.
 245# 2: A prefix to be added to each possible completion word (optional).
 246# 3: Generate possible completion matches for this word (optional).
 247# 4: A suffix to be appended to each possible completion word instead of
 248#    the default space (optional).  If specified but empty, nothing is
 249#    appended.
 250__gitcomp_nl ()
 251{
 252        COMPREPLY=()
 253        __gitcomp_nl_append "$@"
 254}
 255
 256# Generates completion reply with compgen from newline-separated possible
 257# completion filenames.
 258# It accepts 1 to 3 arguments:
 259# 1: List of possible completion filenames, separated by a single newline.
 260# 2: A directory prefix to be added to each possible completion filename
 261#    (optional).
 262# 3: Generate possible completion matches for this word (optional).
 263__gitcomp_file ()
 264{
 265        local IFS=$'\n'
 266
 267        # XXX does not work when the directory prefix contains a tilde,
 268        # since tilde expansion is not applied.
 269        # This means that COMPREPLY will be empty and Bash default
 270        # completion will be used.
 271        __gitcompadd "$1" "${2-}" "${3-$cur}" ""
 272
 273        # use a hack to enable file mode in bash < 4
 274        compopt -o filenames +o nospace 2>/dev/null ||
 275        compgen -f /non-existing-dir/ > /dev/null
 276}
 277
 278# Execute 'git ls-files', unless the --committable option is specified, in
 279# which case it runs 'git diff-index' to find out the files that can be
 280# committed.  It return paths relative to the directory specified in the first
 281# argument, and using the options specified in the second argument.
 282__git_ls_files_helper ()
 283{
 284        if [ "$2" == "--committable" ]; then
 285                git -C "$1" diff-index --name-only --relative HEAD
 286        else
 287                # NOTE: $2 is not quoted in order to support multiple options
 288                git -C "$1" ls-files --exclude-standard $2
 289        fi 2>/dev/null
 290}
 291
 292
 293# __git_index_files accepts 1 or 2 arguments:
 294# 1: Options to pass to ls-files (required).
 295# 2: A directory path (optional).
 296#    If provided, only files within the specified directory are listed.
 297#    Sub directories are never recursed.  Path must have a trailing
 298#    slash.
 299__git_index_files ()
 300{
 301        local dir="$(__gitdir)" root="${2-.}" file
 302
 303        if [ -d "$dir" ]; then
 304                __git_ls_files_helper "$root" "$1" |
 305                while read -r file; do
 306                        case "$file" in
 307                        ?*/*) echo "${file%%/*}" ;;
 308                        *) echo "$file" ;;
 309                        esac
 310                done | sort | uniq
 311        fi
 312}
 313
 314__git_heads ()
 315{
 316        local dir="$(__gitdir)"
 317        if [ -d "$dir" ]; then
 318                git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
 319                        refs/heads
 320                return
 321        fi
 322}
 323
 324__git_tags ()
 325{
 326        local dir="$(__gitdir)"
 327        if [ -d "$dir" ]; then
 328                git --git-dir="$dir" for-each-ref --format='%(refname:short)' \
 329                        refs/tags
 330                return
 331        fi
 332}
 333
 334# __git_refs accepts 0, 1 (to pass to __gitdir), or 2 arguments
 335# presence of 2nd argument means use the guess heuristic employed
 336# by checkout for tracking branches
 337__git_refs ()
 338{
 339        local i hash dir="$(__gitdir "${1-}")" track="${2-}"
 340        local format refs
 341        if [ -d "$dir" ]; then
 342                case "$cur" in
 343                refs|refs/*)
 344                        format="refname"
 345                        refs="${cur%/*}"
 346                        track=""
 347                        ;;
 348                *)
 349                        for i in HEAD FETCH_HEAD ORIG_HEAD MERGE_HEAD; do
 350                                if [ -e "$dir/$i" ]; then echo $i; fi
 351                        done
 352                        format="refname:short"
 353                        refs="refs/tags refs/heads refs/remotes"
 354                        ;;
 355                esac
 356                git --git-dir="$dir" for-each-ref --format="%($format)" \
 357                        $refs
 358                if [ -n "$track" ]; then
 359                        # employ the heuristic used by git checkout
 360                        # Try to find a remote branch that matches the completion word
 361                        # but only output if the branch name is unique
 362                        local ref entry
 363                        git --git-dir="$dir" for-each-ref --shell --format="ref=%(refname:short)" \
 364                                "refs/remotes/" | \
 365                        while read -r entry; do
 366                                eval "$entry"
 367                                ref="${ref#*/}"
 368                                if [[ "$ref" == "$cur"* ]]; then
 369                                        echo "$ref"
 370                                fi
 371                        done | sort | uniq -u
 372                fi
 373                return
 374        fi
 375        case "$cur" in
 376        refs|refs/*)
 377                git ls-remote "$dir" "$cur*" 2>/dev/null | \
 378                while read -r hash i; do
 379                        case "$i" in
 380                        *^{}) ;;
 381                        *) echo "$i" ;;
 382                        esac
 383                done
 384                ;;
 385        *)
 386                echo "HEAD"
 387                git for-each-ref --format="%(refname:short)" -- \
 388                        "refs/remotes/$dir/" 2>/dev/null | sed -e "s#^$dir/##"
 389                ;;
 390        esac
 391}
 392
 393# __git_refs2 requires 1 argument (to pass to __git_refs)
 394__git_refs2 ()
 395{
 396        local i
 397        for i in $(__git_refs "$1"); do
 398                echo "$i:$i"
 399        done
 400}
 401
 402# __git_refs_remotes requires 1 argument (to pass to ls-remote)
 403__git_refs_remotes ()
 404{
 405        local i hash
 406        git ls-remote "$1" 'refs/heads/*' 2>/dev/null | \
 407        while read -r hash i; do
 408                echo "$i:refs/remotes/$1/${i#refs/heads/}"
 409        done
 410}
 411
 412__git_remotes ()
 413{
 414        local d="$(__gitdir)"
 415        test -d "$d/remotes" && ls -1 "$d/remotes"
 416        git --git-dir="$d" remote
 417}
 418
 419__git_list_merge_strategies ()
 420{
 421        git merge -s help 2>&1 |
 422        sed -n -e '/[Aa]vailable strategies are: /,/^$/{
 423                s/\.$//
 424                s/.*://
 425                s/^[    ]*//
 426                s/[     ]*$//
 427                p
 428        }'
 429}
 430
 431__git_merge_strategies=
 432# 'git merge -s help' (and thus detection of the merge strategy
 433# list) fails, unfortunately, if run outside of any git working
 434# tree.  __git_merge_strategies is set to the empty string in
 435# that case, and the detection will be repeated the next time it
 436# is needed.
 437__git_compute_merge_strategies ()
 438{
 439        test -n "$__git_merge_strategies" ||
 440        __git_merge_strategies=$(__git_list_merge_strategies)
 441}
 442
 443__git_complete_revlist_file ()
 444{
 445        local pfx ls ref cur_="$cur"
 446        case "$cur_" in
 447        *..?*:*)
 448                return
 449                ;;
 450        ?*:*)
 451                ref="${cur_%%:*}"
 452                cur_="${cur_#*:}"
 453                case "$cur_" in
 454                ?*/*)
 455                        pfx="${cur_%/*}"
 456                        cur_="${cur_##*/}"
 457                        ls="$ref:$pfx"
 458                        pfx="$pfx/"
 459                        ;;
 460                *)
 461                        ls="$ref"
 462                        ;;
 463                esac
 464
 465                case "$COMP_WORDBREAKS" in
 466                *:*) : great ;;
 467                *)   pfx="$ref:$pfx" ;;
 468                esac
 469
 470                __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
 471                                | sed '/^100... blob /{
 472                                           s,^.*        ,,
 473                                           s,$, ,
 474                                       }
 475                                       /^120000 blob /{
 476                                           s,^.*        ,,
 477                                           s,$, ,
 478                                       }
 479                                       /^040000 tree /{
 480                                           s,^.*        ,,
 481                                           s,$,/,
 482                                       }
 483                                       s/^.*    //')" \
 484                        "$pfx" "$cur_" ""
 485                ;;
 486        *...*)
 487                pfx="${cur_%...*}..."
 488                cur_="${cur_#*...}"
 489                __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 490                ;;
 491        *..*)
 492                pfx="${cur_%..*}.."
 493                cur_="${cur_#*..}"
 494                __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 495                ;;
 496        *)
 497                __gitcomp_nl "$(__git_refs)"
 498                ;;
 499        esac
 500}
 501
 502
 503# __git_complete_index_file requires 1 argument:
 504# 1: the options to pass to ls-file
 505#
 506# The exception is --committable, which finds the files appropriate commit.
 507__git_complete_index_file ()
 508{
 509        local pfx="" cur_="$cur"
 510
 511        case "$cur_" in
 512        ?*/*)
 513                pfx="${cur_%/*}"
 514                cur_="${cur_##*/}"
 515                pfx="${pfx}/"
 516                ;;
 517        esac
 518
 519        __gitcomp_file "$(__git_index_files "$1" ${pfx:+"$pfx"})" "$pfx" "$cur_"
 520}
 521
 522__git_complete_file ()
 523{
 524        __git_complete_revlist_file
 525}
 526
 527__git_complete_revlist ()
 528{
 529        __git_complete_revlist_file
 530}
 531
 532__git_complete_remote_or_refspec ()
 533{
 534        local cur_="$cur" cmd="${words[1]}"
 535        local i c=2 remote="" pfx="" lhs=1 no_complete_refspec=0
 536        if [ "$cmd" = "remote" ]; then
 537                ((c++))
 538        fi
 539        while [ $c -lt $cword ]; do
 540                i="${words[c]}"
 541                case "$i" in
 542                --mirror) [ "$cmd" = "push" ] && no_complete_refspec=1 ;;
 543                --all)
 544                        case "$cmd" in
 545                        push) no_complete_refspec=1 ;;
 546                        fetch)
 547                                return
 548                                ;;
 549                        *) ;;
 550                        esac
 551                        ;;
 552                -*) ;;
 553                *) remote="$i"; break ;;
 554                esac
 555                ((c++))
 556        done
 557        if [ -z "$remote" ]; then
 558                __gitcomp_nl "$(__git_remotes)"
 559                return
 560        fi
 561        if [ $no_complete_refspec = 1 ]; then
 562                return
 563        fi
 564        [ "$remote" = "." ] && remote=
 565        case "$cur_" in
 566        *:*)
 567                case "$COMP_WORDBREAKS" in
 568                *:*) : great ;;
 569                *)   pfx="${cur_%%:*}:" ;;
 570                esac
 571                cur_="${cur_#*:}"
 572                lhs=0
 573                ;;
 574        +*)
 575                pfx="+"
 576                cur_="${cur_#+}"
 577                ;;
 578        esac
 579        case "$cmd" in
 580        fetch)
 581                if [ $lhs = 1 ]; then
 582                        __gitcomp_nl "$(__git_refs2 "$remote")" "$pfx" "$cur_"
 583                else
 584                        __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 585                fi
 586                ;;
 587        pull|remote)
 588                if [ $lhs = 1 ]; then
 589                        __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
 590                else
 591                        __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 592                fi
 593                ;;
 594        push)
 595                if [ $lhs = 1 ]; then
 596                        __gitcomp_nl "$(__git_refs)" "$pfx" "$cur_"
 597                else
 598                        __gitcomp_nl "$(__git_refs "$remote")" "$pfx" "$cur_"
 599                fi
 600                ;;
 601        esac
 602}
 603
 604__git_complete_strategy ()
 605{
 606        __git_compute_merge_strategies
 607        case "$prev" in
 608        -s|--strategy)
 609                __gitcomp "$__git_merge_strategies"
 610                return 0
 611        esac
 612        case "$cur" in
 613        --strategy=*)
 614                __gitcomp "$__git_merge_strategies" "" "${cur##--strategy=}"
 615                return 0
 616                ;;
 617        esac
 618        return 1
 619}
 620
 621__git_commands () {
 622        if test -n "${GIT_TESTING_COMMAND_COMPLETION:-}"
 623        then
 624                printf "%s" "${GIT_TESTING_COMMAND_COMPLETION}"
 625        else
 626                git help -a|egrep '^  [a-zA-Z0-9]'
 627        fi
 628}
 629
 630__git_list_all_commands ()
 631{
 632        local i IFS=" "$'\n'
 633        for i in $(__git_commands)
 634        do
 635                case $i in
 636                *--*)             : helper pattern;;
 637                *) echo $i;;
 638                esac
 639        done
 640}
 641
 642__git_all_commands=
 643__git_compute_all_commands ()
 644{
 645        test -n "$__git_all_commands" ||
 646        __git_all_commands=$(__git_list_all_commands)
 647}
 648
 649__git_list_porcelain_commands ()
 650{
 651        local i IFS=" "$'\n'
 652        __git_compute_all_commands
 653        for i in $__git_all_commands
 654        do
 655                case $i in
 656                *--*)             : helper pattern;;
 657                applymbox)        : ask gittus;;
 658                applypatch)       : ask gittus;;
 659                archimport)       : import;;
 660                cat-file)         : plumbing;;
 661                check-attr)       : plumbing;;
 662                check-ignore)     : plumbing;;
 663                check-mailmap)    : plumbing;;
 664                check-ref-format) : plumbing;;
 665                checkout-index)   : plumbing;;
 666                commit-tree)      : plumbing;;
 667                count-objects)    : infrequent;;
 668                credential-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_nl "$(__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_nl "$(__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 scissors 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 --invert-grep
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 "full short no" "" "${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-mark
1466                        --cherry-pick
1467                        --graph
1468                        --decorate --decorate=
1469                        --walk-reflogs
1470                        --parents --children
1471                        $merge
1472                        $__git_diff_common_options
1473                        --pickaxe-all --pickaxe-regex
1474                        "
1475                return
1476                ;;
1477        esac
1478        __git_complete_revlist
1479}
1480
1481# Common merge options shared by git-merge(1) and git-pull(1).
1482__git_merge_options="
1483        --no-commit --no-stat --log --no-log --squash --strategy
1484        --commit --stat --no-squash --ff --no-ff --ff-only --edit --no-edit
1485        --verify-signatures --no-verify-signatures --gpg-sign
1486        --quiet --verbose --progress --no-progress
1487"
1488
1489_git_merge ()
1490{
1491        __git_complete_strategy && return
1492
1493        case "$cur" in
1494        --*)
1495                __gitcomp "$__git_merge_options
1496                        --rerere-autoupdate --no-rerere-autoupdate --abort"
1497                return
1498        esac
1499        __gitcomp_nl "$(__git_refs)"
1500}
1501
1502_git_mergetool ()
1503{
1504        case "$cur" in
1505        --tool=*)
1506                __gitcomp "$__git_mergetools_common tortoisemerge" "" "${cur##--tool=}"
1507                return
1508                ;;
1509        --*)
1510                __gitcomp "--tool="
1511                return
1512                ;;
1513        esac
1514}
1515
1516_git_merge_base ()
1517{
1518        case "$cur" in
1519        --*)
1520                __gitcomp "--octopus --independent --is-ancestor --fork-point"
1521                return
1522                ;;
1523        esac
1524        __gitcomp_nl "$(__git_refs)"
1525}
1526
1527_git_mv ()
1528{
1529        case "$cur" in
1530        --*)
1531                __gitcomp "--dry-run"
1532                return
1533                ;;
1534        esac
1535
1536        if [ $(__git_count_arguments "mv") -gt 0 ]; then
1537                # We need to show both cached and untracked files (including
1538                # empty directories) since this may not be the last argument.
1539                __git_complete_index_file "--cached --others --directory"
1540        else
1541                __git_complete_index_file "--cached"
1542        fi
1543}
1544
1545_git_name_rev ()
1546{
1547        __gitcomp "--tags --all --stdin"
1548}
1549
1550_git_notes ()
1551{
1552        local subcommands='add append copy edit list prune remove show'
1553        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1554
1555        case "$subcommand,$cur" in
1556        ,--*)
1557                __gitcomp '--ref'
1558                ;;
1559        ,*)
1560                case "$prev" in
1561                --ref)
1562                        __gitcomp_nl "$(__git_refs)"
1563                        ;;
1564                *)
1565                        __gitcomp "$subcommands --ref"
1566                        ;;
1567                esac
1568                ;;
1569        add,--reuse-message=*|append,--reuse-message=*|\
1570        add,--reedit-message=*|append,--reedit-message=*)
1571                __gitcomp_nl "$(__git_refs)" "" "${cur#*=}"
1572                ;;
1573        add,--*|append,--*)
1574                __gitcomp '--file= --message= --reedit-message=
1575                                --reuse-message='
1576                ;;
1577        copy,--*)
1578                __gitcomp '--stdin'
1579                ;;
1580        prune,--*)
1581                __gitcomp '--dry-run --verbose'
1582                ;;
1583        prune,*)
1584                ;;
1585        *)
1586                case "$prev" in
1587                -m|-F)
1588                        ;;
1589                *)
1590                        __gitcomp_nl "$(__git_refs)"
1591                        ;;
1592                esac
1593                ;;
1594        esac
1595}
1596
1597_git_pull ()
1598{
1599        __git_complete_strategy && return
1600
1601        case "$cur" in
1602        --recurse-submodules=*)
1603                __gitcomp "$__git_fetch_recurse_submodules" "" "${cur##--recurse-submodules=}"
1604                return
1605                ;;
1606        --*)
1607                __gitcomp "
1608                        --rebase --no-rebase
1609                        $__git_merge_options
1610                        $__git_fetch_options
1611                "
1612                return
1613                ;;
1614        esac
1615        __git_complete_remote_or_refspec
1616}
1617
1618__git_push_recurse_submodules="check on-demand"
1619
1620__git_complete_force_with_lease ()
1621{
1622        local cur_=$1
1623
1624        case "$cur_" in
1625        --*=)
1626                ;;
1627        *:*)
1628                __gitcomp_nl "$(__git_refs)" "" "${cur_#*:}"
1629                ;;
1630        *)
1631                __gitcomp_nl "$(__git_refs)" "" "$cur_"
1632                ;;
1633        esac
1634}
1635
1636_git_push ()
1637{
1638        case "$prev" in
1639        --repo)
1640                __gitcomp_nl "$(__git_remotes)"
1641                return
1642                ;;
1643        --recurse-submodules)
1644                __gitcomp "$__git_push_recurse_submodules"
1645                return
1646                ;;
1647        esac
1648        case "$cur" in
1649        --repo=*)
1650                __gitcomp_nl "$(__git_remotes)" "" "${cur##--repo=}"
1651                return
1652                ;;
1653        --recurse-submodules=*)
1654                __gitcomp "$__git_push_recurse_submodules" "" "${cur##--recurse-submodules=}"
1655                return
1656                ;;
1657        --force-with-lease=*)
1658                __git_complete_force_with_lease "${cur##--force-with-lease=}"
1659                return
1660                ;;
1661        --*)
1662                __gitcomp "
1663                        --all --mirror --tags --dry-run --force --verbose
1664                        --quiet --prune --delete --follow-tags
1665                        --receive-pack= --repo= --set-upstream
1666                        --force-with-lease --force-with-lease= --recurse-submodules=
1667                "
1668                return
1669                ;;
1670        esac
1671        __git_complete_remote_or_refspec
1672}
1673
1674_git_rebase ()
1675{
1676        local dir="$(__gitdir)"
1677        if [ -d "$dir"/rebase-apply ] || [ -d "$dir"/rebase-merge ]; then
1678                __gitcomp "--continue --skip --abort"
1679                return
1680        fi
1681        __git_complete_strategy && return
1682        case "$cur" in
1683        --whitespace=*)
1684                __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
1685                return
1686                ;;
1687        --*)
1688                __gitcomp "
1689                        --onto --merge --strategy --interactive
1690                        --preserve-merges --stat --no-stat
1691                        --committer-date-is-author-date --ignore-date
1692                        --ignore-whitespace --whitespace=
1693                        --autosquash --fork-point --no-fork-point
1694                        --autostash
1695                        "
1696
1697                return
1698        esac
1699        __gitcomp_nl "$(__git_refs)"
1700}
1701
1702_git_reflog ()
1703{
1704        local subcommands="show delete expire"
1705        local subcommand="$(__git_find_on_cmdline "$subcommands")"
1706
1707        if [ -z "$subcommand" ]; then
1708                __gitcomp "$subcommands"
1709        else
1710                __gitcomp_nl "$(__git_refs)"
1711        fi
1712}
1713
1714__git_send_email_confirm_options="always never auto cc compose"
1715__git_send_email_suppresscc_options="author self cc bodycc sob cccmd body all"
1716
1717_git_send_email ()
1718{
1719        case "$cur" in
1720        --confirm=*)
1721                __gitcomp "
1722                        $__git_send_email_confirm_options
1723                        " "" "${cur##--confirm=}"
1724                return
1725                ;;
1726        --suppress-cc=*)
1727                __gitcomp "
1728                        $__git_send_email_suppresscc_options
1729                        " "" "${cur##--suppress-cc=}"
1730
1731                return
1732                ;;
1733        --smtp-encryption=*)
1734                __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
1735                return
1736                ;;
1737        --thread=*)
1738                __gitcomp "
1739                        deep shallow
1740                        " "" "${cur##--thread=}"
1741                return
1742                ;;
1743        --*)
1744                __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
1745                        --compose --confirm= --dry-run --envelope-sender
1746                        --from --identity
1747                        --in-reply-to --no-chain-reply-to --no-signed-off-by-cc
1748                        --no-suppress-from --no-thread --quiet
1749                        --signed-off-by-cc --smtp-pass --smtp-server
1750                        --smtp-server-port --smtp-encryption= --smtp-user
1751                        --subject --suppress-cc= --suppress-from --thread --to
1752                        --validate --no-validate
1753                        $__git_format_patch_options"
1754                return
1755                ;;
1756        esac
1757        __git_complete_revlist
1758}
1759
1760_git_stage ()
1761{
1762        _git_add
1763}
1764
1765__git_config_get_set_variables ()
1766{
1767        local prevword word config_file= c=$cword
1768        while [ $c -gt 1 ]; do
1769                word="${words[c]}"
1770                case "$word" in
1771                --system|--global|--local|--file=*)
1772                        config_file="$word"
1773                        break
1774                        ;;
1775                -f|--file)
1776                        config_file="$word $prevword"
1777                        break
1778                        ;;
1779                esac
1780                prevword=$word
1781                c=$((--c))
1782        done
1783
1784        git --git-dir="$(__gitdir)" config $config_file --list 2>/dev/null |
1785        while read -r line
1786        do
1787                case "$line" in
1788                *.*=*)
1789                        echo "${line/=*/}"
1790                        ;;
1791                esac
1792        done
1793}
1794
1795_git_config ()
1796{
1797        case "$prev" in
1798        branch.*.remote|branch.*.pushremote)
1799                __gitcomp_nl "$(__git_remotes)"
1800                return
1801                ;;
1802        branch.*.merge)
1803                __gitcomp_nl "$(__git_refs)"
1804                return
1805                ;;
1806        branch.*.rebase)
1807                __gitcomp "false true"
1808                return
1809                ;;
1810        remote.pushdefault)
1811                __gitcomp_nl "$(__git_remotes)"
1812                return
1813                ;;
1814        remote.*.fetch)
1815                local remote="${prev#remote.}"
1816                remote="${remote%.fetch}"
1817                if [ -z "$cur" ]; then
1818                        __gitcomp_nl "refs/heads/" "" "" ""
1819                        return
1820                fi
1821                __gitcomp_nl "$(__git_refs_remotes "$remote")"
1822                return
1823                ;;
1824        remote.*.push)
1825                local remote="${prev#remote.}"
1826                remote="${remote%.push}"
1827                __gitcomp_nl "$(git --git-dir="$(__gitdir)" \
1828                        for-each-ref --format='%(refname):%(refname)' \
1829                        refs/heads)"
1830                return
1831                ;;
1832        pull.twohead|pull.octopus)
1833                __git_compute_merge_strategies
1834                __gitcomp "$__git_merge_strategies"
1835                return
1836                ;;
1837        color.branch|color.diff|color.interactive|\
1838        color.showbranch|color.status|color.ui)
1839                __gitcomp "always never auto"
1840                return
1841                ;;
1842        color.pager)
1843                __gitcomp "false true"
1844                return
1845                ;;
1846        color.*.*)
1847                __gitcomp "
1848                        normal black red green yellow blue magenta cyan white
1849                        bold dim ul blink reverse
1850                        "
1851                return
1852                ;;
1853        diff.submodule)
1854                __gitcomp "log short"
1855                return
1856                ;;
1857        help.format)
1858                __gitcomp "man info web html"
1859                return
1860                ;;
1861        log.date)
1862                __gitcomp "$__git_log_date_formats"
1863                return
1864                ;;
1865        sendemail.aliasesfiletype)
1866                __gitcomp "mutt mailrc pine elm gnus"
1867                return
1868                ;;
1869        sendemail.confirm)
1870                __gitcomp "$__git_send_email_confirm_options"
1871                return
1872                ;;
1873        sendemail.suppresscc)
1874                __gitcomp "$__git_send_email_suppresscc_options"
1875                return
1876                ;;
1877        sendemail.transferencoding)
1878                __gitcomp "7bit 8bit quoted-printable base64"
1879                return
1880                ;;
1881        --get|--get-all|--unset|--unset-all)
1882                __gitcomp_nl "$(__git_config_get_set_variables)"
1883                return
1884                ;;
1885        *.*)
1886                return
1887                ;;
1888        esac
1889        case "$cur" in
1890        --*)
1891                __gitcomp "
1892                        --system --global --local --file=
1893                        --list --replace-all
1894                        --get --get-all --get-regexp
1895                        --add --unset --unset-all
1896                        --remove-section --rename-section
1897                        "
1898                return
1899                ;;
1900        branch.*.*)
1901                local pfx="${cur%.*}." cur_="${cur##*.}"
1902                __gitcomp "remote pushremote merge mergeoptions rebase" "$pfx" "$cur_"
1903                return
1904                ;;
1905        branch.*)
1906                local pfx="${cur%.*}." cur_="${cur#*.}"
1907                __gitcomp_nl "$(__git_heads)" "$pfx" "$cur_" "."
1908                __gitcomp_nl_append $'autosetupmerge\nautosetuprebase\n' "$pfx" "$cur_"
1909                return
1910                ;;
1911        guitool.*.*)
1912                local pfx="${cur%.*}." cur_="${cur##*.}"
1913                __gitcomp "
1914                        argprompt cmd confirm needsfile noconsole norescan
1915                        prompt revprompt revunmerged title
1916                        " "$pfx" "$cur_"
1917                return
1918                ;;
1919        difftool.*.*)
1920                local pfx="${cur%.*}." cur_="${cur##*.}"
1921                __gitcomp "cmd path" "$pfx" "$cur_"
1922                return
1923                ;;
1924        man.*.*)
1925                local pfx="${cur%.*}." cur_="${cur##*.}"
1926                __gitcomp "cmd path" "$pfx" "$cur_"
1927                return
1928                ;;
1929        mergetool.*.*)
1930                local pfx="${cur%.*}." cur_="${cur##*.}"
1931                __gitcomp "cmd path trustExitCode" "$pfx" "$cur_"
1932                return
1933                ;;
1934        pager.*)
1935                local pfx="${cur%.*}." cur_="${cur#*.}"
1936                __git_compute_all_commands
1937                __gitcomp_nl "$__git_all_commands" "$pfx" "$cur_"
1938                return
1939                ;;
1940        remote.*.*)
1941                local pfx="${cur%.*}." cur_="${cur##*.}"
1942                __gitcomp "
1943                        url proxy fetch push mirror skipDefaultUpdate
1944                        receivepack uploadpack tagopt pushurl
1945                        " "$pfx" "$cur_"
1946                return
1947                ;;
1948        remote.*)
1949                local pfx="${cur%.*}." cur_="${cur#*.}"
1950                __gitcomp_nl "$(__git_remotes)" "$pfx" "$cur_" "."
1951                __gitcomp_nl_append "pushdefault" "$pfx" "$cur_"
1952                return
1953                ;;
1954        url.*.*)
1955                local pfx="${cur%.*}." cur_="${cur##*.}"
1956                __gitcomp "insteadOf pushInsteadOf" "$pfx" "$cur_"
1957                return
1958                ;;
1959        esac
1960        __gitcomp "
1961                add.ignoreErrors
1962                advice.commitBeforeMerge
1963                advice.detachedHead
1964                advice.implicitIdentity
1965                advice.pushNonFastForward
1966                advice.resolveConflict
1967                advice.statusHints
1968                alias.
1969                am.keepcr
1970                apply.ignorewhitespace
1971                apply.whitespace
1972                branch.autosetupmerge
1973                branch.autosetuprebase
1974                browser.
1975                clean.requireForce
1976                color.branch
1977                color.branch.current
1978                color.branch.local
1979                color.branch.plain
1980                color.branch.remote
1981                color.decorate.HEAD
1982                color.decorate.branch
1983                color.decorate.remoteBranch
1984                color.decorate.stash
1985                color.decorate.tag
1986                color.diff
1987                color.diff.commit
1988                color.diff.frag
1989                color.diff.func
1990                color.diff.meta
1991                color.diff.new
1992                color.diff.old
1993                color.diff.plain
1994                color.diff.whitespace
1995                color.grep
1996                color.grep.context
1997                color.grep.filename
1998                color.grep.function
1999                color.grep.linenumber
2000                color.grep.match
2001                color.grep.selected
2002                color.grep.separator
2003                color.interactive
2004                color.interactive.error
2005                color.interactive.header
2006                color.interactive.help
2007                color.interactive.prompt
2008                color.pager
2009                color.showbranch
2010                color.status
2011                color.status.added
2012                color.status.changed
2013                color.status.header
2014                color.status.nobranch
2015                color.status.unmerged
2016                color.status.untracked
2017                color.status.updated
2018                color.ui
2019                commit.status
2020                commit.template
2021                core.abbrev
2022                core.askpass
2023                core.attributesfile
2024                core.autocrlf
2025                core.bare
2026                core.bigFileThreshold
2027                core.compression
2028                core.createObject
2029                core.deltaBaseCacheLimit
2030                core.editor
2031                core.eol
2032                core.excludesfile
2033                core.fileMode
2034                core.fsyncobjectfiles
2035                core.gitProxy
2036                core.ignoreStat
2037                core.ignorecase
2038                core.logAllRefUpdates
2039                core.loosecompression
2040                core.notesRef
2041                core.packedGitLimit
2042                core.packedGitWindowSize
2043                core.pager
2044                core.preferSymlinkRefs
2045                core.preloadindex
2046                core.quotepath
2047                core.repositoryFormatVersion
2048                core.safecrlf
2049                core.sharedRepository
2050                core.sparseCheckout
2051                core.symlinks
2052                core.trustctime
2053                core.warnAmbiguousRefs
2054                core.whitespace
2055                core.worktree
2056                diff.autorefreshindex
2057                diff.external
2058                diff.ignoreSubmodules
2059                diff.mnemonicprefix
2060                diff.noprefix
2061                diff.renameLimit
2062                diff.renames
2063                diff.statGraphWidth
2064                diff.submodule
2065                diff.suppressBlankEmpty
2066                diff.tool
2067                diff.wordRegex
2068                diff.algorithm
2069                difftool.
2070                difftool.prompt
2071                fetch.recurseSubmodules
2072                fetch.unpackLimit
2073                format.attach
2074                format.cc
2075                format.coverLetter
2076                format.headers
2077                format.numbered
2078                format.pretty
2079                format.signature
2080                format.signoff
2081                format.subjectprefix
2082                format.suffix
2083                format.thread
2084                format.to
2085                gc.
2086                gc.aggressiveWindow
2087                gc.auto
2088                gc.autopacklimit
2089                gc.packrefs
2090                gc.pruneexpire
2091                gc.reflogexpire
2092                gc.reflogexpireunreachable
2093                gc.rerereresolved
2094                gc.rerereunresolved
2095                gitcvs.allbinary
2096                gitcvs.commitmsgannotation
2097                gitcvs.dbTableNamePrefix
2098                gitcvs.dbdriver
2099                gitcvs.dbname
2100                gitcvs.dbpass
2101                gitcvs.dbuser
2102                gitcvs.enabled
2103                gitcvs.logfile
2104                gitcvs.usecrlfattr
2105                guitool.
2106                gui.blamehistoryctx
2107                gui.commitmsgwidth
2108                gui.copyblamethreshold
2109                gui.diffcontext
2110                gui.encoding
2111                gui.fastcopyblame
2112                gui.matchtrackingbranch
2113                gui.newbranchtemplate
2114                gui.pruneduringfetch
2115                gui.spellingdictionary
2116                gui.trustmtime
2117                help.autocorrect
2118                help.browser
2119                help.format
2120                http.lowSpeedLimit
2121                http.lowSpeedTime
2122                http.maxRequests
2123                http.minSessions
2124                http.noEPSV
2125                http.postBuffer
2126                http.proxy
2127                http.sslCAInfo
2128                http.sslCAPath
2129                http.sslCert
2130                http.sslCertPasswordProtected
2131                http.sslKey
2132                http.sslVerify
2133                http.useragent
2134                i18n.commitEncoding
2135                i18n.logOutputEncoding
2136                imap.authMethod
2137                imap.folder
2138                imap.host
2139                imap.pass
2140                imap.port
2141                imap.preformattedHTML
2142                imap.sslverify
2143                imap.tunnel
2144                imap.user
2145                init.templatedir
2146                instaweb.browser
2147                instaweb.httpd
2148                instaweb.local
2149                instaweb.modulepath
2150                instaweb.port
2151                interactive.singlekey
2152                log.date
2153                log.decorate
2154                log.showroot
2155                mailmap.file
2156                man.
2157                man.viewer
2158                merge.
2159                merge.conflictstyle
2160                merge.log
2161                merge.renameLimit
2162                merge.renormalize
2163                merge.stat
2164                merge.tool
2165                merge.verbosity
2166                mergetool.
2167                mergetool.keepBackup
2168                mergetool.keepTemporaries
2169                mergetool.prompt
2170                notes.displayRef
2171                notes.rewrite.
2172                notes.rewrite.amend
2173                notes.rewrite.rebase
2174                notes.rewriteMode
2175                notes.rewriteRef
2176                pack.compression
2177                pack.deltaCacheLimit
2178                pack.deltaCacheSize
2179                pack.depth
2180                pack.indexVersion
2181                pack.packSizeLimit
2182                pack.threads
2183                pack.window
2184                pack.windowMemory
2185                pager.
2186                pretty.
2187                pull.octopus
2188                pull.twohead
2189                push.default
2190                push.followTags
2191                rebase.autosquash
2192                rebase.stat
2193                receive.autogc
2194                receive.denyCurrentBranch
2195                receive.denyDeleteCurrent
2196                receive.denyDeletes
2197                receive.denyNonFastForwards
2198                receive.fsckObjects
2199                receive.unpackLimit
2200                receive.updateserverinfo
2201                remote.pushdefault
2202                remotes.
2203                repack.usedeltabaseoffset
2204                rerere.autoupdate
2205                rerere.enabled
2206                sendemail.
2207                sendemail.aliasesfile
2208                sendemail.aliasfiletype
2209                sendemail.bcc
2210                sendemail.cc
2211                sendemail.cccmd
2212                sendemail.chainreplyto
2213                sendemail.confirm
2214                sendemail.envelopesender
2215                sendemail.from
2216                sendemail.identity
2217                sendemail.multiedit
2218                sendemail.signedoffbycc
2219                sendemail.smtpdomain
2220                sendemail.smtpencryption
2221                sendemail.smtppass
2222                sendemail.smtpserver
2223                sendemail.smtpserveroption
2224                sendemail.smtpserverport
2225                sendemail.smtpuser
2226                sendemail.suppresscc
2227                sendemail.suppressfrom
2228                sendemail.thread
2229                sendemail.to
2230                sendemail.validate
2231                showbranch.default
2232                status.relativePaths
2233                status.showUntrackedFiles
2234                status.submodulesummary
2235                submodule.
2236                tar.umask
2237                transfer.unpackLimit
2238                url.
2239                user.email
2240                user.name
2241                user.signingkey
2242                web.browser
2243                branch. remote.
2244        "
2245}
2246
2247_git_remote ()
2248{
2249        local subcommands="add rename remove set-head set-branches set-url show prune update"
2250        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2251        if [ -z "$subcommand" ]; then
2252                __gitcomp "$subcommands"
2253                return
2254        fi
2255
2256        case "$subcommand" in
2257        rename|remove|set-url|show|prune)
2258                __gitcomp_nl "$(__git_remotes)"
2259                ;;
2260        set-head|set-branches)
2261                __git_complete_remote_or_refspec
2262                ;;
2263        update)
2264                local i c='' IFS=$'\n'
2265                for i in $(git --git-dir="$(__gitdir)" config --get-regexp "remotes\..*" 2>/dev/null); do
2266                        i="${i#remotes.}"
2267                        c="$c ${i/ */}"
2268                done
2269                __gitcomp "$c"
2270                ;;
2271        *)
2272                ;;
2273        esac
2274}
2275
2276_git_replace ()
2277{
2278        __gitcomp_nl "$(__git_refs)"
2279}
2280
2281_git_reset ()
2282{
2283        __git_has_doubledash && return
2284
2285        case "$cur" in
2286        --*)
2287                __gitcomp "--merge --mixed --hard --soft --patch"
2288                return
2289                ;;
2290        esac
2291        __gitcomp_nl "$(__git_refs)"
2292}
2293
2294_git_revert ()
2295{
2296        case "$cur" in
2297        --*)
2298                __gitcomp "--edit --mainline --no-edit --no-commit --signoff"
2299                return
2300                ;;
2301        esac
2302        __gitcomp_nl "$(__git_refs)"
2303}
2304
2305_git_rm ()
2306{
2307        case "$cur" in
2308        --*)
2309                __gitcomp "--cached --dry-run --ignore-unmatch --quiet"
2310                return
2311                ;;
2312        esac
2313
2314        __git_complete_index_file "--cached"
2315}
2316
2317_git_shortlog ()
2318{
2319        __git_has_doubledash && return
2320
2321        case "$cur" in
2322        --*)
2323                __gitcomp "
2324                        $__git_log_common_options
2325                        $__git_log_shortlog_options
2326                        --numbered --summary
2327                        "
2328                return
2329                ;;
2330        esac
2331        __git_complete_revlist
2332}
2333
2334_git_show ()
2335{
2336        __git_has_doubledash && return
2337
2338        case "$cur" in
2339        --pretty=*|--format=*)
2340                __gitcomp "$__git_log_pretty_formats $(__git_pretty_aliases)
2341                        " "" "${cur#*=}"
2342                return
2343                ;;
2344        --diff-algorithm=*)
2345                __gitcomp "$__git_diff_algorithms" "" "${cur##--diff-algorithm=}"
2346                return
2347                ;;
2348        --*)
2349                __gitcomp "--pretty= --format= --abbrev-commit --oneline
2350                        --show-signature
2351                        $__git_diff_common_options
2352                        "
2353                return
2354                ;;
2355        esac
2356        __git_complete_revlist_file
2357}
2358
2359_git_show_branch ()
2360{
2361        case "$cur" in
2362        --*)
2363                __gitcomp "
2364                        --all --remotes --topo-order --current --more=
2365                        --list --independent --merge-base --no-name
2366                        --color --no-color
2367                        --sha1-name --sparse --topics --reflog
2368                        "
2369                return
2370                ;;
2371        esac
2372        __git_complete_revlist
2373}
2374
2375_git_stash ()
2376{
2377        local save_opts='--keep-index --no-keep-index --quiet --patch'
2378        local subcommands='save list show apply clear drop pop create branch'
2379        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2380        if [ -z "$subcommand" ]; then
2381                case "$cur" in
2382                --*)
2383                        __gitcomp "$save_opts"
2384                        ;;
2385                *)
2386                        if [ -z "$(__git_find_on_cmdline "$save_opts")" ]; then
2387                                __gitcomp "$subcommands"
2388                        fi
2389                        ;;
2390                esac
2391        else
2392                case "$subcommand,$cur" in
2393                save,--*)
2394                        __gitcomp "$save_opts"
2395                        ;;
2396                apply,--*|pop,--*)
2397                        __gitcomp "--index --quiet"
2398                        ;;
2399                show,--*|drop,--*|branch,--*)
2400                        ;;
2401                show,*|apply,*|drop,*|pop,*|branch,*)
2402                        __gitcomp_nl "$(git --git-dir="$(__gitdir)" stash list \
2403                                        | sed -n -e 's/:.*//p')"
2404                        ;;
2405                *)
2406                        ;;
2407                esac
2408        fi
2409}
2410
2411_git_submodule ()
2412{
2413        __git_has_doubledash && return
2414
2415        local subcommands="add status init deinit update summary foreach sync"
2416        if [ -z "$(__git_find_on_cmdline "$subcommands")" ]; then
2417                case "$cur" in
2418                --*)
2419                        __gitcomp "--quiet --cached"
2420                        ;;
2421                *)
2422                        __gitcomp "$subcommands"
2423                        ;;
2424                esac
2425                return
2426        fi
2427}
2428
2429_git_svn ()
2430{
2431        local subcommands="
2432                init fetch clone rebase dcommit log find-rev
2433                set-tree commit-diff info create-ignore propget
2434                proplist show-ignore show-externals branch tag blame
2435                migrate mkdirs reset gc
2436                "
2437        local subcommand="$(__git_find_on_cmdline "$subcommands")"
2438        if [ -z "$subcommand" ]; then
2439                __gitcomp "$subcommands"
2440        else
2441                local remote_opts="--username= --config-dir= --no-auth-cache"
2442                local fc_opts="
2443                        --follow-parent --authors-file= --repack=
2444                        --no-metadata --use-svm-props --use-svnsync-props
2445                        --log-window-size= --no-checkout --quiet
2446                        --repack-flags --use-log-author --localtime
2447                        --ignore-paths= --include-paths= $remote_opts
2448                        "
2449                local init_opts="
2450                        --template= --shared= --trunk= --tags=
2451                        --branches= --stdlayout --minimize-url
2452                        --no-metadata --use-svm-props --use-svnsync-props
2453                        --rewrite-root= --prefix= --use-log-author
2454                        --add-author-from $remote_opts
2455                        "
2456                local cmt_opts="
2457                        --edit --rmdir --find-copies-harder --copy-similarity=
2458                        "
2459
2460                case "$subcommand,$cur" in
2461                fetch,--*)
2462                        __gitcomp "--revision= --fetch-all $fc_opts"
2463                        ;;
2464                clone,--*)
2465                        __gitcomp "--revision= $fc_opts $init_opts"
2466                        ;;
2467                init,--*)
2468                        __gitcomp "$init_opts"
2469                        ;;
2470                dcommit,--*)
2471                        __gitcomp "
2472                                --merge --strategy= --verbose --dry-run
2473                                --fetch-all --no-rebase --commit-url
2474                                --revision --interactive $cmt_opts $fc_opts
2475                                "
2476                        ;;
2477                set-tree,--*)
2478                        __gitcomp "--stdin $cmt_opts $fc_opts"
2479                        ;;
2480                create-ignore,--*|propget,--*|proplist,--*|show-ignore,--*|\
2481                show-externals,--*|mkdirs,--*)
2482                        __gitcomp "--revision="
2483                        ;;
2484                log,--*)
2485                        __gitcomp "
2486                                --limit= --revision= --verbose --incremental
2487                                --oneline --show-commit --non-recursive
2488                                --authors-file= --color
2489                                "
2490                        ;;
2491                rebase,--*)
2492                        __gitcomp "
2493                                --merge --verbose --strategy= --local
2494                                --fetch-all --dry-run $fc_opts
2495                                "
2496                        ;;
2497                commit-diff,--*)
2498                        __gitcomp "--message= --file= --revision= $cmt_opts"
2499                        ;;
2500                info,--*)
2501                        __gitcomp "--url"
2502                        ;;
2503                branch,--*)
2504                        __gitcomp "--dry-run --message --tag"
2505                        ;;
2506                tag,--*)
2507                        __gitcomp "--dry-run --message"
2508                        ;;
2509                blame,--*)
2510                        __gitcomp "--git-format"
2511                        ;;
2512                migrate,--*)
2513                        __gitcomp "
2514                                --config-dir= --ignore-paths= --minimize
2515                                --no-auth-cache --username=
2516                                "
2517                        ;;
2518                reset,--*)
2519                        __gitcomp "--revision= --parent"
2520                        ;;
2521                *)
2522                        ;;
2523                esac
2524        fi
2525}
2526
2527_git_tag ()
2528{
2529        local i c=1 f=0
2530        while [ $c -lt $cword ]; do
2531                i="${words[c]}"
2532                case "$i" in
2533                -d|-v)
2534                        __gitcomp_nl "$(__git_tags)"
2535                        return
2536                        ;;
2537                -f)
2538                        f=1
2539                        ;;
2540                esac
2541                ((c++))
2542        done
2543
2544        case "$prev" in
2545        -m|-F)
2546                ;;
2547        -*|tag)
2548                if [ $f = 1 ]; then
2549                        __gitcomp_nl "$(__git_tags)"
2550                fi
2551                ;;
2552        *)
2553                __gitcomp_nl "$(__git_refs)"
2554                ;;
2555        esac
2556
2557        case "$cur" in
2558        --*)
2559                __gitcomp "
2560                        --list --delete --verify --annotate --message --file
2561                        --sign --cleanup --local-user --force --column --sort
2562                        --contains --points-at
2563                        "
2564                ;;
2565        esac
2566}
2567
2568_git_whatchanged ()
2569{
2570        _git_log
2571}
2572
2573__git_main ()
2574{
2575        local i c=1 command __git_dir
2576
2577        while [ $c -lt $cword ]; do
2578                i="${words[c]}"
2579                case "$i" in
2580                --git-dir=*) __git_dir="${i#--git-dir=}" ;;
2581                --git-dir)   ((c++)) ; __git_dir="${words[c]}" ;;
2582                --bare)      __git_dir="." ;;
2583                --help) command="help"; break ;;
2584                -c|--work-tree|--namespace) ((c++)) ;;
2585                -*) ;;
2586                *) command="$i"; break ;;
2587                esac
2588                ((c++))
2589        done
2590
2591        if [ -z "$command" ]; then
2592                case "$cur" in
2593                --*)   __gitcomp "
2594                        --paginate
2595                        --no-pager
2596                        --git-dir=
2597                        --bare
2598                        --version
2599                        --exec-path
2600                        --exec-path=
2601                        --html-path
2602                        --man-path
2603                        --info-path
2604                        --work-tree=
2605                        --namespace=
2606                        --no-replace-objects
2607                        --help
2608                        "
2609                        ;;
2610                *)     __git_compute_porcelain_commands
2611                       __gitcomp "$__git_porcelain_commands $(__git_aliases)" ;;
2612                esac
2613                return
2614        fi
2615
2616        local completion_func="_git_${command//-/_}"
2617        declare -f $completion_func >/dev/null && $completion_func && return
2618
2619        local expansion=$(__git_aliased_command "$command")
2620        if [ -n "$expansion" ]; then
2621                words[1]=$expansion
2622                completion_func="_git_${expansion//-/_}"
2623                declare -f $completion_func >/dev/null && $completion_func
2624        fi
2625}
2626
2627__gitk_main ()
2628{
2629        __git_has_doubledash && return
2630
2631        local g="$(__gitdir)"
2632        local merge=""
2633        if [ -f "$g/MERGE_HEAD" ]; then
2634                merge="--merge"
2635        fi
2636        case "$cur" in
2637        --*)
2638                __gitcomp "
2639                        $__git_log_common_options
2640                        $__git_log_gitk_options
2641                        $merge
2642                        "
2643                return
2644                ;;
2645        esac
2646        __git_complete_revlist
2647}
2648
2649if [[ -n ${ZSH_VERSION-} ]]; then
2650        echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
2651
2652        autoload -U +X compinit && compinit
2653
2654        __gitcomp ()
2655        {
2656                emulate -L zsh
2657
2658                local cur_="${3-$cur}"
2659
2660                case "$cur_" in
2661                --*=)
2662                        ;;
2663                *)
2664                        local c IFS=$' \t\n'
2665                        local -a array
2666                        for c in ${=1}; do
2667                                c="$c${4-}"
2668                                case $c in
2669                                --*=*|*.) ;;
2670                                *) c="$c " ;;
2671                                esac
2672                                array[${#array[@]}+1]="$c"
2673                        done
2674                        compset -P '*[=:]'
2675                        compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
2676                        ;;
2677                esac
2678        }
2679
2680        __gitcomp_nl ()
2681        {
2682                emulate -L zsh
2683
2684                local IFS=$'\n'
2685                compset -P '*[=:]'
2686                compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
2687        }
2688
2689        __gitcomp_file ()
2690        {
2691                emulate -L zsh
2692
2693                local IFS=$'\n'
2694                compset -P '*[=:]'
2695                compadd -Q -p "${2-}" -f -- ${=1} && _ret=0
2696        }
2697
2698        _git ()
2699        {
2700                local _ret=1 cur cword prev
2701                cur=${words[CURRENT]}
2702                prev=${words[CURRENT-1]}
2703                let cword=CURRENT-1
2704                emulate ksh -c __${service}_main
2705                let _ret && _default && _ret=0
2706                return _ret
2707        }
2708
2709        compdef _git git gitk
2710        return
2711fi
2712
2713__git_func_wrap ()
2714{
2715        local cur words cword prev
2716        _get_comp_words_by_ref -n =: cur words cword prev
2717        $1
2718}
2719
2720# Setup completion for certain functions defined above by setting common
2721# variables and workarounds.
2722# This is NOT a public function; use at your own risk.
2723__git_complete ()
2724{
2725        local wrapper="__git_wrap${2}"
2726        eval "$wrapper () { __git_func_wrap $2 ; }"
2727        complete -o bashdefault -o default -o nospace -F $wrapper $1 2>/dev/null \
2728                || complete -o default -o nospace -F $wrapper $1
2729}
2730
2731# wrapper for backwards compatibility
2732_git ()
2733{
2734        __git_wrap__git_main
2735}
2736
2737# wrapper for backwards compatibility
2738_gitk ()
2739{
2740        __git_wrap__gitk_main
2741}
2742
2743__git_complete git __git_main
2744__git_complete gitk __gitk_main
2745
2746# The following are necessary only for Cygwin, and only are needed
2747# when the user has tab-completed the executable name and consequently
2748# included the '.exe' suffix.
2749#
2750if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
2751__git_complete git.exe __git_main
2752fi