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