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