Why is it bad to rewind a branch that has already been pushed out?
[gitweb.git] / contrib / completion / git-completion.bash
index 382c8177a3fc98636d3ca2928021a21660bcddc8..466cc32f4ce4254453f2083e5a0619827971410f 100755 (executable)
@@ -64,14 +64,19 @@ __git_ps1 ()
 __gitcomp ()
 {
        local all c s=$'\n' IFS=' '$'\t'$'\n'
+       local cur="${COMP_WORDS[COMP_CWORD]}"
+       if [ $# -gt 2 ]; then
+               cur="$3"
+       fi
        for c in $1; do
-               case "$c" in
-               --*=*) all="$all$c$s" ;;
-               *)     all="$all$c $s" ;;
+               case "$c$4" in
+               --*=*) all="$all$c$4$s" ;;
+               *.)    all="$all$c$4$s" ;;
+               *)     all="$all$c$4 $s" ;;
                esac
        done
        IFS=$s
-       COMPREPLY=($(compgen -W "$all" -- "${COMP_WORDS[COMP_CWORD]}"))
+       COMPREPLY=($(compgen -P "$2" -W "$all" -- "$cur"))
        return
 }
 
@@ -214,7 +219,7 @@ __git_complete_file ()
                        -- "$cur"))
                ;;
        *)
-               COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+               __gitcomp "$(__git_refs)"
                ;;
        esac
 }
@@ -226,15 +231,18 @@ __git_complete_revlist ()
        *...*)
                pfx="${cur%...*}..."
                cur="${cur#*...}"
-               COMPREPLY=($(compgen -P "$pfx" -W "$(__git_refs)" -- "$cur"))
+               __gitcomp "$(__git_refs)" "$pfx" "$cur"
                ;;
        *..*)
                pfx="${cur%..*}.."
                cur="${cur#*..}"
-               COMPREPLY=($(compgen -P "$pfx" -W "$(__git_refs)" -- "$cur"))
+               __gitcomp "$(__git_refs)" "$pfx" "$cur"
+               ;;
+       *.)
+               __gitcomp "$cur."
                ;;
        *)
-               COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+               __gitcomp "$(__git_refs)"
                ;;
        esac
 }
@@ -348,22 +356,19 @@ _git_am ()
 {
        local cur="${COMP_WORDS[COMP_CWORD]}"
        if [ -d .dotest ]; then
-               COMPREPLY=($(compgen -W "
-                       --skip --resolved
-                       " -- "$cur"))
+               __gitcomp "--skip --resolved"
                return
        fi
        case "$cur" in
        --whitespace=*)
-               COMPREPLY=($(compgen -W "$__git_whitespacelist" \
-                       -- "${cur##--whitespace=}"))
+               __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
                return
                ;;
        --*)
-               COMPREPLY=($(compgen -W "
+               __gitcomp "
                        --signoff --utf8 --binary --3way --interactive
                        --whitespace=
-                       " -- "$cur"))
+                       "
                return
        esac
        COMPREPLY=()
@@ -374,17 +379,16 @@ _git_apply ()
        local cur="${COMP_WORDS[COMP_CWORD]}"
        case "$cur" in
        --whitespace=*)
-               COMPREPLY=($(compgen -W "$__git_whitespacelist" \
-                       -- "${cur##--whitespace=}"))
+               __gitcomp "$__git_whitespacelist" "" "${cur##--whitespace=}"
                return
                ;;
        --*)
-               COMPREPLY=($(compgen -W "
+               __gitcomp "
                        --stat --numstat --summary --check --index
                        --cached --index-info --reverse --reject --unidiff-zero
                        --apply --no-add --exclude=
                        --whitespace= --inaccurate-eof --verbose
-                       " -- "$cur"))
+                       "
                return
        esac
        COMPREPLY=()
@@ -395,9 +399,7 @@ _git_add ()
        local cur="${COMP_WORDS[COMP_CWORD]}"
        case "$cur" in
        --*)
-               COMPREPLY=($(compgen -W "
-                       --interactive
-                       " -- "$cur"))
+               __gitcomp "--interactive"
                return
        esac
        COMPREPLY=()
@@ -405,14 +407,12 @@ _git_add ()
 
 _git_branch ()
 {
-       local cur="${COMP_WORDS[COMP_CWORD]}"
-       COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+       __gitcomp "$(__git_refs)"
 }
 
 _git_checkout ()
 {
-       local cur="${COMP_WORDS[COMP_CWORD]}"
-       COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+       __gitcomp "$(__git_refs)"
 }
 
 _git_cherry_pick ()
@@ -420,12 +420,10 @@ _git_cherry_pick ()
        local cur="${COMP_WORDS[COMP_CWORD]}"
        case "$cur" in
        --*)
-               COMPREPLY=($(compgen -W "
-                       --edit --no-commit
-                       " -- "$cur"))
+               __gitcomp "--edit --no-commit"
                ;;
        *)
-               COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+               __gitcomp "$(__git_refs)"
                ;;
        esac
 }
@@ -435,10 +433,10 @@ _git_commit ()
        local cur="${COMP_WORDS[COMP_CWORD]}"
        case "$cur" in
        --*)
-               COMPREPLY=($(compgen -W "
+               __gitcomp "
                        --all --author= --signoff --verify --no-verify
                        --edit --amend --include --only
-                       " -- "$cur"))
+                       "
                return
        esac
        COMPREPLY=()
@@ -451,8 +449,7 @@ _git_diff ()
 
 _git_diff_tree ()
 {
-       local cur="${COMP_WORDS[COMP_CWORD]}"
-       COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+       __gitcomp "$(__git_refs)"
 }
 
 _git_fetch ()
@@ -461,16 +458,15 @@ _git_fetch ()
 
        case "${COMP_WORDS[0]},$COMP_CWORD" in
        git-fetch*,1)
-               COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
+               __gitcomp "$(__git_remotes)"
                ;;
        git,2)
-               COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
+               __gitcomp "$(__git_remotes)"
                ;;
        *)
                case "$cur" in
                *:*)
-                       cur="${cur#*:}"
-                       COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+                       __gitcomp "$(__git_refs)" "" "${cur#*:}"
                        ;;
                *)
                        local remote
@@ -478,7 +474,7 @@ _git_fetch ()
                        git-fetch) remote="${COMP_WORDS[1]}" ;;
                        git)       remote="${COMP_WORDS[2]}" ;;
                        esac
-                       COMPREPLY=($(compgen -W "$(__git_refs2 "$remote")" -- "$cur"))
+                       __gitcomp "$(__git_refs2 "$remote")"
                        ;;
                esac
                ;;
@@ -490,7 +486,7 @@ _git_format_patch ()
        local cur="${COMP_WORDS[COMP_CWORD]}"
        case "$cur" in
        --*)
-               COMPREPLY=($(compgen -W "
+               __gitcomp "
                        --stdout --attach --thread
                        --output-directory
                        --numbered --start-number
@@ -498,7 +494,8 @@ _git_format_patch ()
                        --signoff
                        --in-reply-to=
                        --full-index --binary
-                       " -- "$cur"))
+                       --not --all
+                       "
                return
                ;;
        esac
@@ -507,8 +504,7 @@ _git_format_patch ()
 
 _git_ls_remote ()
 {
-       local cur="${COMP_WORDS[COMP_CWORD]}"
-       COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
+       __gitcomp "$(__git_remotes)"
 }
 
 _git_ls_tree ()
@@ -521,13 +517,13 @@ _git_log ()
        local cur="${COMP_WORDS[COMP_CWORD]}"
        case "$cur" in
        --pretty=*)
-               COMPREPLY=($(compgen -W "
+               __gitcomp "
                        oneline short medium full fuller email raw
-                       " -- "${cur##--pretty=}"))
+                       " "" "${cur##--pretty=}"
                return
                ;;
        --*)
-               COMPREPLY=($(compgen -W "
+               __gitcomp "
                        --max-count= --max-age= --since= --after=
                        --min-age= --before= --until=
                        --root --not --topo-order --date-order
@@ -537,7 +533,8 @@ _git_log ()
                        --author= --committer= --grep=
                        --all-match
                        --pretty= --name-status --name-only
-                       " -- "$cur"))
+                       --not --all
+                       "
                return
                ;;
        esac
@@ -549,34 +546,31 @@ _git_merge ()
        local cur="${COMP_WORDS[COMP_CWORD]}"
        case "${COMP_WORDS[COMP_CWORD-1]}" in
        -s|--strategy)
-               COMPREPLY=($(compgen -W "$(__git_merge_strategies)" -- "$cur"))
+               __gitcomp "$(__git_merge_strategies)"
                return
        esac
        case "$cur" in
        --strategy=*)
-               COMPREPLY=($(compgen -W "$(__git_merge_strategies)" \
-                       -- "${cur##--strategy=}"))
+               __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
                return
                ;;
        --*)
-               COMPREPLY=($(compgen -W "
+               __gitcomp "
                        --no-commit --no-summary --squash --strategy
-                       " -- "$cur"))
+                       "
                return
        esac
-       COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+       __gitcomp "$(__git_refs)"
 }
 
 _git_merge_base ()
 {
-       local cur="${COMP_WORDS[COMP_CWORD]}"
-       COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+       __gitcomp "$(__git_refs)"
 }
 
 _git_name_rev ()
 {
-       local cur="${COMP_WORDS[COMP_CWORD]}"
-       COMPREPLY=($(compgen -W "--tags --all --stdin" -- "$cur"))
+       __gitcomp "--tags --all --stdin"
 }
 
 _git_pull ()
@@ -585,10 +579,10 @@ _git_pull ()
 
        case "${COMP_WORDS[0]},$COMP_CWORD" in
        git-pull*,1)
-               COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
+               __gitcomp "$(__git_remotes)"
                ;;
        git,2)
-               COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
+               __gitcomp "$(__git_remotes)"
                ;;
        *)
                local remote
@@ -596,7 +590,7 @@ _git_pull ()
                git-pull)  remote="${COMP_WORDS[1]}" ;;
                git)       remote="${COMP_WORDS[2]}" ;;
                esac
-               COMPREPLY=($(compgen -W "$(__git_refs "$remote")" -- "$cur"))
+               __gitcomp "$(__git_refs "$remote")"
                ;;
        esac
 }
@@ -607,10 +601,10 @@ _git_push ()
 
        case "${COMP_WORDS[0]},$COMP_CWORD" in
        git-push*,1)
-               COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
+               __gitcomp "$(__git_remotes)"
                ;;
        git,2)
-               COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
+               __gitcomp "$(__git_remotes)"
                ;;
        *)
                case "$cur" in
@@ -620,11 +614,10 @@ _git_push ()
                        git-push)  remote="${COMP_WORDS[1]}" ;;
                        git)       remote="${COMP_WORDS[2]}" ;;
                        esac
-                       cur="${cur#*:}"
-                       COMPREPLY=($(compgen -W "$(__git_refs "$remote")" -- "$cur"))
+                       __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
                        ;;
                *)
-                       COMPREPLY=($(compgen -W "$(__git_refs2)" -- "$cur"))
+                       __gitcomp "$(__git_refs2)"
                        ;;
                esac
                ;;
@@ -635,29 +628,24 @@ _git_rebase ()
 {
        local cur="${COMP_WORDS[COMP_CWORD]}"
        if [ -d .dotest ]; then
-               COMPREPLY=($(compgen -W "
-                       --continue --skip --abort
-                       " -- "$cur"))
+               __gitcomp "--continue --skip --abort"
                return
        fi
        case "${COMP_WORDS[COMP_CWORD-1]}" in
        -s|--strategy)
-               COMPREPLY=($(compgen -W "$(__git_merge_strategies)" -- "$cur"))
+               __gitcomp "$(__git_merge_strategies)"
                return
        esac
        case "$cur" in
        --strategy=*)
-               COMPREPLY=($(compgen -W "$(__git_merge_strategies)" \
-                       -- "${cur##--strategy=}"))
+               __gitcomp "$(__git_merge_strategies)" "" "${cur##--strategy=}"
                return
                ;;
        --*)
-               COMPREPLY=($(compgen -W "
-                       --onto --merge --strategy
-                       " -- "$cur"))
+               __gitcomp "--onto --merge --strategy"
                return
        esac
-       COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+       __gitcomp "$(__git_refs)"
 }
 
 _git_config ()
@@ -666,26 +654,40 @@ _git_config ()
        local prv="${COMP_WORDS[COMP_CWORD-1]}"
        case "$prv" in
        branch.*.remote)
-               COMPREPLY=($(compgen -W "$(__git_remotes)" -- "$cur"))
+               __gitcomp "$(__git_remotes)"
                return
                ;;
        branch.*.merge)
-               COMPREPLY=($(compgen -W "$(__git_refs)" -- "$cur"))
+               __gitcomp "$(__git_refs)"
                return
                ;;
        remote.*.fetch)
                local remote="${prv#remote.}"
                remote="${remote%.fetch}"
-               COMPREPLY=($(compgen -W "$(__git_refs_remotes "$remote")" \
-                       -- "$cur"))
+               __gitcomp "$(__git_refs_remotes "$remote")"
                return
                ;;
        remote.*.push)
                local remote="${prv#remote.}"
                remote="${remote%.push}"
-               COMPREPLY=($(compgen -W "$(git --git-dir="$(__gitdir)" \
+               __gitcomp "$(git --git-dir="$(__gitdir)" \
                        for-each-ref --format='%(refname):%(refname)' \
-                       refs/heads)" -- "$cur"))
+                       refs/heads)"
+               return
+               ;;
+       pull.twohead|pull.octopus)
+               __gitcomp "$(__git_merge_strategies)"
+               return
+               ;;
+       color.branch|color.diff|color.status)
+               __gitcomp "always never auto"
+               return
+               ;;
+       color.*.*)
+               __gitcomp "
+                       black red green yellow blue magenta cyan white
+                       bold dim ul blink reverse
+                       "
                return
                ;;
        *.*)
@@ -695,41 +697,39 @@ _git_config ()
        esac
        case "$cur" in
        --*)
-               COMPREPLY=($(compgen -W "
+               __gitcomp "
                        --global --list --replace-all
                        --get --get-all --get-regexp
                        --unset --unset-all
-                       " -- "$cur"))
+                       "
                return
                ;;
        branch.*.*)
                local pfx="${cur%.*}."
                cur="${cur##*.}"
-               COMPREPLY=($(compgen -P "$pfx" -W "remote merge" -- "$cur"))
+               __gitcomp "remote merge" "$pfx" "$cur"
                return
                ;;
        branch.*)
                local pfx="${cur%.*}."
                cur="${cur#*.}"
-               COMPREPLY=($(compgen -P "$pfx" -S . \
-                       -W "$(__git_heads)" -- "$cur"))
+               __gitcomp "$(__git_heads)" "$pfx" "$cur" "."
                return
                ;;
        remote.*.*)
                local pfx="${cur%.*}."
                cur="${cur##*.}"
-               COMPREPLY=($(compgen -P "$pfx" -W "url fetch push" -- "$cur"))
+               __gitcomp "url fetch push" "$pfx" "$cur"
                return
                ;;
        remote.*)
                local pfx="${cur%.*}."
                cur="${cur#*.}"
-               COMPREPLY=($(compgen -P "$pfx" -S . \
-                       -W "$(__git_remotes)" -- "$cur"))
+               __gitcomp "$(__git_remotes)" "$pfx" "$cur" "."
                return
                ;;
        esac
-       COMPREPLY=($(compgen -W "
+       __gitcomp "
                apply.whitespace
                core.fileMode
                core.gitProxy
@@ -741,47 +741,79 @@ _git_config ()
                core.warnAmbiguousRefs
                core.compression
                core.legacyHeaders
-               i18n.commitEncoding
-               i18n.logOutputEncoding
-               diff.color
+               core.packedGitWindowSize
+               core.packedGitLimit
+               color.branch
+               color.branch.current
+               color.branch.local
+               color.branch.remote
+               color.branch.plain
                color.diff
-               diff.renameLimit
-               diff.renames
-               pager.color
+               color.diff.plain
+               color.diff.meta
+               color.diff.frag
+               color.diff.old
+               color.diff.new
+               color.diff.commit
+               color.diff.whitespace
                color.pager
-               status.color
                color.status
-               log.showroot
-               show.difftree
-               showbranch.default
-               whatchanged.difftree
+               color.status.header
+               color.status.added
+               color.status.changed
+               color.status.untracked
+               diff.renameLimit
+               diff.renames
+               fetch.unpackLimit
+               format.headers
+               gitcvs.enabled
+               gitcvs.logfile
+               gc.reflogexpire
+               gc.reflogexpireunreachable
+               gc.rerereresolved
+               gc.rerereunresolved
                http.sslVerify
                http.sslCert
                http.sslKey
                http.sslCAInfo
                http.sslCAPath
                http.maxRequests
-               http.lowSpeedLimit http.lowSpeedTime
+               http.lowSpeedLimit
+               http.lowSpeedTime
                http.noEPSV
+               i18n.commitEncoding
+               i18n.logOutputEncoding
+               log.showroot
+               merge.summary
+               merge.verbosity
                pack.window
+               pull.octopus
+               pull.twohead
                repack.useDeltaBaseOffset
-               pull.octopus pull.twohead
-               merge.summary
+               show.difftree
+               showbranch.default
+               tar.umask
+               transfer.unpackLimit
                receive.unpackLimit
                receive.denyNonFastForwards
-               user.name user.email
-               tar.umask
-               gitcvs.enabled
-               gitcvs.logfile
+               user.name
+               user.email
+               user.signingkey
+               whatchanged.difftree
                branch. remote.
-       " -- "$cur"))
+       "
 }
 
 _git_reset ()
 {
        local cur="${COMP_WORDS[COMP_CWORD]}"
-       local opt="--mixed --hard --soft"
-       COMPREPLY=($(compgen -W "$opt $(__git_refs)" -- "$cur"))
+       case "$cur" in
+       --*)
+               __gitcomp "--mixed --hard --soft"
+               return
+               ;;
+       esac
+       __gitcomp "$(__git_refs)"
 }
 
 _git_show ()
@@ -789,13 +821,13 @@ _git_show ()
        local cur="${COMP_WORDS[COMP_CWORD]}"
        case "$cur" in
        --pretty=*)
-               COMPREPLY=($(compgen -W "
+               __gitcomp "
                        oneline short medium full fuller email raw
-                       " -- "${cur##--pretty=}"))
+                       " "" "${cur##--pretty=}"
                return
                ;;
        --*)
-               COMPREPLY=($(compgen -W "--pretty=" -- "$cur"))
+               __gitcomp "--pretty="
                return
                ;;
        esac
@@ -862,32 +894,38 @@ _git ()
 _gitk ()
 {
        local cur="${COMP_WORDS[COMP_CWORD]}"
-       COMPREPLY=($(compgen -W "--all $(__git_refs)" -- "$cur"))
+       case "$cur" in
+       --*)
+               __gitcomp "--not --all"
+               return
+               ;;
+       esac
+       __git_complete_revlist
 }
 
 complete -o default -o nospace -F _git git
-complete -o default            -F _gitk gitk
-complete -o default            -F _git_am git-am
-complete -o default            -F _git_apply git-apply
-complete -o default            -F _git_branch git-branch
-complete -o default            -F _git_checkout git-checkout
-complete -o default            -F _git_cherry_pick git-cherry-pick
-complete -o default            -F _git_commit git-commit
+complete -o default -o nospace -F _gitk gitk
+complete -o default -o nospace -F _git_am git-am
+complete -o default -o nospace -F _git_apply git-apply
+complete -o default -o nospace -F _git_branch git-branch
+complete -o default -o nospace -F _git_checkout git-checkout
+complete -o default -o nospace -F _git_cherry_pick git-cherry-pick
+complete -o default -o nospace -F _git_commit git-commit
 complete -o default -o nospace -F _git_diff git-diff
-complete -o default            -F _git_diff_tree git-diff-tree
+complete -o default -o nospace -F _git_diff_tree git-diff-tree
 complete -o default -o nospace -F _git_fetch git-fetch
 complete -o default -o nospace -F _git_format_patch git-format-patch
 complete -o default -o nospace -F _git_log git-log
-complete -o default            -F _git_ls_remote git-ls-remote
+complete -o default -o nospace -F _git_ls_remote git-ls-remote
 complete -o default -o nospace -F _git_ls_tree git-ls-tree
-complete -o default            -F _git_merge git-merge
-complete -o default            -F _git_merge_base git-merge-base
-complete -o default            -F _git_name_rev git-name-rev
+complete -o default -o nospace -F _git_merge git-merge
+complete -o default -o nospace -F _git_merge_base git-merge-base
+complete -o default -o nospace -F _git_name_rev git-name-rev
 complete -o default -o nospace -F _git_pull git-pull
 complete -o default -o nospace -F _git_push git-push
-complete -o default            -F _git_rebase git-rebase
-complete -o default            -F _git_config git-config
-complete -o default            -F _git_reset git-reset
+complete -o default -o nospace -F _git_rebase git-rebase
+complete -o default -o nospace -F _git_config git-config
+complete -o default -o nospace -F _git_reset git-reset
 complete -o default -o nospace -F _git_show git-show
 complete -o default -o nospace -F _git_log git-show-branch
 complete -o default -o nospace -F _git_log git-whatchanged
@@ -897,19 +935,19 @@ complete -o default -o nospace -F _git_log git-whatchanged
 # included the '.exe' suffix.
 #
 if [ Cygwin = "$(uname -o 2>/dev/null)" ]; then
-complete -o default            -F _git_add git-add.exe
-complete -o default            -F _git_apply git-apply.exe
+complete -o default -o nospace -F _git_add git-add.exe
+complete -o default -o nospace -F _git_apply git-apply.exe
 complete -o default -o nospace -F _git git.exe
-complete -o default            -F _git_branch git-branch.exe
+complete -o default -o nospace -F _git_branch git-branch.exe
 complete -o default -o nospace -F _git_diff git-diff.exe
 complete -o default -o nospace -F _git_diff_tree git-diff-tree.exe
 complete -o default -o nospace -F _git_format_patch git-format-patch.exe
 complete -o default -o nospace -F _git_log git-log.exe
 complete -o default -o nospace -F _git_ls_tree git-ls-tree.exe
-complete -o default            -F _git_merge_base git-merge-base.exe
-complete -o default            -F _git_name_rev git-name-rev.exe
+complete -o default -o nospace -F _git_merge_base git-merge-base.exe
+complete -o default -o nospace -F _git_name_rev git-name-rev.exe
 complete -o default -o nospace -F _git_push git-push.exe
-complete -o default            -F _git_config git-config
+complete -o default -o nospace -F _git_config git-config
 complete -o default -o nospace -F _git_show git-show.exe
 complete -o default -o nospace -F _git_log git-show-branch.exe
 complete -o default -o nospace -F _git_log git-whatchanged.exe