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