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