Merge branch 'maint' of git://repo.or.cz/git-gui into maint
[gitweb.git] / contrib / completion / git-completion.bash
index 48ba3f8e81e7899d2b4cb764704e83dcb58a0e1a..cad842af4548f24041aba785f1629081e586e7c5 100755 (executable)
@@ -114,6 +114,27 @@ __git_heads ()
        done
 }
 
+__git_tags ()
+{
+       local cmd i is_hash=y dir="$(__gitdir "$1")"
+       if [ -d "$dir" ]; then
+               for i in $(git --git-dir="$dir" \
+                       for-each-ref --format='%(refname)' \
+                       refs/tags ); do
+                       echo "${i#refs/tags/}"
+               done
+               return
+       fi
+       for i in $(git-ls-remote "$1" 2>/dev/null); do
+               case "$is_hash,$i" in
+               y,*) is_hash=n ;;
+               n,*^{}) is_hash=y ;;
+               n,refs/tags/*) is_hash=y; echo "${i#refs/tags/}" ;;
+               n,*) is_hash=y; echo "$i" ;;
+               esac
+       done
+}
+
 __git_refs ()
 {
        local cmd i is_hash=y dir="$(__gitdir "$1")"
@@ -419,7 +440,7 @@ _git_add ()
        local cur="${COMP_WORDS[COMP_CWORD]}"
        case "$cur" in
        --*)
-               __gitcomp "--interactive"
+               __gitcomp "--interactive --refresh"
                return
        esac
        COMPREPLY=()
@@ -459,6 +480,35 @@ _git_branch ()
        __gitcomp "$(__git_refs)"
 }
 
+_git_bundle ()
+{
+       local mycword="$COMP_CWORD"
+       case "${COMP_WORDS[0]}" in
+       git)
+               local cmd="${COMP_WORDS[2]}"
+               mycword="$((mycword-1))"
+               ;;
+       git-bundle*)
+               local cmd="${COMP_WORDS[1]}"
+               ;;
+       esac
+       case "$mycword" in
+       1)
+               __gitcomp "create list-heads verify unbundle"
+               ;;
+       2)
+               # looking for a file
+               ;;
+       *)
+               case "$cmd" in
+                       create)
+                               __git_complete_revlist
+                       ;;
+               esac
+               ;;
+       esac
+}
+
 _git_checkout ()
 {
        __gitcomp "$(__git_refs)"
@@ -496,6 +546,11 @@ _git_commit ()
        COMPREPLY=()
 }
 
+_git_describe ()
+{
+       __gitcomp "$(__git_refs)"
+}
+
 _git_diff ()
 {
        __git_complete_file
@@ -544,6 +599,7 @@ _git_format_patch ()
                        --stdout --attach --thread
                        --output-directory
                        --numbered --start-number
+                       --numbered-files
                        --keep-subject
                        --signoff
                        --in-reply-to=
@@ -561,7 +617,7 @@ _git_gc ()
        local cur="${COMP_WORDS[COMP_CWORD]}"
        case "$cur" in
        --*)
-               __gitcomp "--prune"
+               __gitcomp "--prune --aggressive"
                return
                ;;
        esac
@@ -588,18 +644,25 @@ _git_log ()
                        " "" "${cur##--pretty=}"
                return
                ;;
+       --date=*)
+               __gitcomp "
+                       relative iso8601 rfc2822 short local default
+               " "" "${cur##--date=}"
+               return
+               ;;
        --*)
                __gitcomp "
                        --max-count= --max-age= --since= --after=
                        --min-age= --before= --until=
-                       --root --topo-order --date-order
-                       --no-merges
+                       --root --topo-order --date-order --reverse
+                       --no-merges --follow
                        --abbrev-commit --abbrev=
-                       --relative-date
+                       --relative-date --date=
                        --author= --committer= --grep=
                        --all-match
-                       --pretty= --name-status --name-only
+                       --pretty= --name-status --name-only --raw
                        --not --all
+                       --left-right --cherry-pick
                        "
                return
                ;;
@@ -682,8 +745,11 @@ _git_push ()
                        esac
                        __gitcomp "$(__git_refs "$remote")" "" "${cur#*:}"
                        ;;
+               +*)
+                       __gitcomp "$(__git_refs)" + "${cur#+}"
+                       ;;
                *)
-                       __gitcomp "$(__git_refs2)"
+                       __gitcomp "$(__git_refs)"
                        ;;
                esac
                ;;
@@ -764,9 +830,11 @@ _git_config ()
        case "$cur" in
        --*)
                __gitcomp "
-                       --global --list --replace-all
+                       --global --system --file=
+                       --list --replace-all
                        --get --get-all --get-regexp
                        --add --unset --unset-all
+                       --remove-section --rename-section
                        "
                return
                ;;
@@ -785,7 +853,10 @@ _git_config ()
        remote.*.*)
                local pfx="${cur%.*}."
                cur="${cur##*.}"
-               __gitcomp "url fetch push" "$pfx" "$cur"
+               __gitcomp "
+                       url fetch push skipDefaultUpdate
+                       receivepack uploadpack tagopt
+                       " "$pfx" "$cur"
                return
                ;;
        remote.*)
@@ -802,6 +873,7 @@ _git_config ()
                core.ignoreStat
                core.preferSymlinkRefs
                core.logAllRefUpdates
+               core.loosecompression
                core.repositoryFormatVersion
                core.sharedRepository
                core.warnAmbiguousRefs
@@ -833,8 +905,12 @@ _git_config ()
                diff.renames
                fetch.unpackLimit
                format.headers
+               format.subjectprefix
                gitcvs.enabled
                gitcvs.logfile
+               gitcvs.allbinary
+               gitcvs.dbname gitcvs.dbdriver gitcvs.dbuser gitcvs.dvpass
+               gc.packrefs
                gc.reflogexpire
                gc.reflogexpireunreachable
                gc.rerereresolved
@@ -851,9 +927,15 @@ _git_config ()
                i18n.commitEncoding
                i18n.logOutputEncoding
                log.showroot
+               merge.tool
                merge.summary
                merge.verbosity
                pack.window
+               pack.depth
+               pack.windowMemory
+               pack.compression
+               pack.deltaCacheSize
+               pack.deltaCacheLimit
                pull.octopus
                pull.twohead
                repack.useDeltaBaseOffset
@@ -877,13 +959,13 @@ _git_remote ()
        while [ $c -lt $COMP_CWORD ]; do
                i="${COMP_WORDS[c]}"
                case "$i" in
-               add|show|prune) command="$i"; break ;;
+               add|show|prune|update) command="$i"; break ;;
                esac
                c=$((++c))
        done
 
        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
-               __gitcomp "add show prune"
+               __gitcomp "add show prune update"
                return
        fi
 
@@ -891,6 +973,18 @@ _git_remote ()
        show|prune)
                __gitcomp "$(__git_remotes)"
                ;;
+       update)
+               local i c='' IFS=$'\n'
+               for i in $(git --git-dir="$(__gitdir)" config --list); do
+                       case "$i" in
+                       remotes.*)
+                               i="${i#remotes.}"
+                               c="$c ${i/=*/}"
+                               ;;
+                       esac
+               done
+               __gitcomp "$c"
+               ;;
        *)
                COMPREPLY=()
                ;;
@@ -947,6 +1041,70 @@ _git_show ()
        __git_complete_file
 }
 
+_git_stash ()
+{
+       __gitcomp 'list show apply clear'
+}
+
+_git_submodule ()
+{
+       local i c=1 command
+       while [ $c -lt $COMP_CWORD ]; do
+               i="${COMP_WORDS[c]}"
+               case "$i" in
+               add|status|init|update) command="$i"; break ;;
+               esac
+               c=$((++c))
+       done
+
+       if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
+               local cur="${COMP_WORDS[COMP_CWORD]}"
+               case "$cur" in
+               --*)
+                       __gitcomp "--quiet --cached"
+                       ;;
+               *)
+                       __gitcomp "add status init update"
+                       ;;
+               esac
+               return
+       fi
+}
+
+_git_tag ()
+{
+       local i c=1 f=0
+       while [ $c -lt $COMP_CWORD ]; do
+               i="${COMP_WORDS[c]}"
+               case "$i" in
+               -d|-v)
+                       __gitcomp "$(__git_tags)"
+                       return
+                       ;;
+               -f)
+                       f=1
+                       ;;
+               esac
+               c=$((++c))
+       done
+
+       case "${COMP_WORDS[COMP_CWORD-1]}" in
+       -m|-F)
+               COMPREPLY=()
+               ;;
+       -*|tag|git-tag)
+               if [ $f = 1 ]; then
+                       __gitcomp "$(__git_tags)"
+               else
+                       COMPREPLY=()
+               fi
+               ;;
+       *)
+               __gitcomp "$(__git_refs)"
+               ;;
+       esac
+}
+
 _git ()
 {
        local i c=1 command __git_dir
@@ -965,7 +1123,14 @@ _git ()
        if [ $c -eq $COMP_CWORD -a -z "$command" ]; then
                case "${COMP_WORDS[COMP_CWORD]}" in
                --*=*) COMPREPLY=() ;;
-               --*)   __gitcomp "--git-dir= --bare --version --exec-path" ;;
+               --*)   __gitcomp "
+                       --no-pager
+                       --git-dir=
+                       --bare
+                       --version
+                       --exec-path
+                       "
+                       ;;
                *)     __gitcomp "$(__git_commands) $(__git_aliases)" ;;
                esac
                return
@@ -979,12 +1144,14 @@ _git ()
        add)         _git_add ;;
        apply)       _git_apply ;;
        bisect)      _git_bisect ;;
+       bundle)      _git_bundle ;;
        branch)      _git_branch ;;
        checkout)    _git_checkout ;;
        cherry)      _git_cherry ;;
        cherry-pick) _git_cherry_pick ;;
        commit)      _git_commit ;;
        config)      _git_config ;;
+       describe)    _git_describe ;;
        diff)        _git_diff ;;
        fetch)       _git_fetch ;;
        format-patch) _git_format_patch ;;
@@ -1003,6 +1170,9 @@ _git ()
        shortlog)    _git_shortlog ;;
        show)        _git_show ;;
        show-branch) _git_log ;;
+       stash)       _git_stash ;;
+       submodule)   _git_submodule ;;
+       tag)         _git_tag ;;
        whatchanged) _git_log ;;
        *)           COMPREPLY=() ;;
        esac
@@ -1026,10 +1196,12 @@ 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_bisect git-bisect
 complete -o default -o nospace -F _git_branch git-branch
+complete -o default -o nospace -F _git_bundle git-bundle
 complete -o default -o nospace -F _git_checkout git-checkout
 complete -o default -o nospace -F _git_cherry git-cherry
 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_describe git-describe
 complete -o default -o nospace -F _git_diff git-diff
 complete -o default -o nospace -F _git_fetch git-fetch
 complete -o default -o nospace -F _git_format_patch git-format-patch
@@ -1048,7 +1220,10 @@ complete -o default -o nospace -F _git_remote git-remote
 complete -o default -o nospace -F _git_reset git-reset
 complete -o default -o nospace -F _git_shortlog git-shortlog
 complete -o default -o nospace -F _git_show git-show
+complete -o default -o nospace -F _git_stash git-stash
+complete -o default -o nospace -F _git_submodule git-submodule
 complete -o default -o nospace -F _git_log git-show-branch
+complete -o default -o nospace -F _git_tag git-tag
 complete -o default -o nospace -F _git_log git-whatchanged
 
 # The following are necessary only for Cygwin, and only are needed
@@ -1060,7 +1235,9 @@ 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 -o nospace -F _git_branch git-branch.exe
+complete -o default -o nospace -F _git_bundle git-bundle.exe
 complete -o default -o nospace -F _git_cherry git-cherry.exe
+complete -o default -o nospace -F _git_describe git-describe.exe
 complete -o default -o nospace -F _git_diff git-diff.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
@@ -1072,5 +1249,6 @@ complete -o default -o nospace -F _git_config git-config
 complete -o default -o nospace -F _git_shortlog git-shortlog.exe
 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_tag git-tag.exe
 complete -o default -o nospace -F _git_log git-whatchanged.exe
 fi