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