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