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