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