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