Merge branch 'ds/completion-silence-in-tree-path-probe' into maint
authorJunio C Hamano <gitster@pobox.com>
Mon, 28 Jan 2013 19:12:47 +0000 (11:12 -0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 28 Jan 2013 19:12:47 +0000 (11:12 -0800)
* ds/completion-silence-in-tree-path-probe:
git-completion.bash: silence "not a valid object" errors

1  2 
contrib/completion/git-completion.bash
index a4c48e179eb778077462a812b491e762e284486c,6312e3d8eb83e0f793ce11d40c75a35cb6fe1914..14dd5e7ca272350b3fa13d6fc8da3ccb46e12227
mode 100644,100755..100644
  #    1) Copy this file to somewhere (e.g. ~/.git-completion.sh).
  #    2) Add the following line to your .bashrc/.zshrc:
  #        source ~/.git-completion.sh
 -#
 -#    3) Consider changing your PS1 to also show the current branch:
 -#         Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ '
 -#         ZSH:  PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ '
 -#
 -#       The argument to __git_ps1 will be displayed only if you
 -#       are currently in a git repository.  The %s token will be
 -#       the name of the current branch.
 -#
 -#       In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty
 -#       value, unstaged (*) and staged (+) changes will be shown next
 -#       to the branch name.  You can configure this per-repository
 -#       with the bash.showDirtyState variable, which defaults to true
 -#       once GIT_PS1_SHOWDIRTYSTATE is enabled.
 -#
 -#       You can also see if currently something is stashed, by setting
 -#       GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
 -#       then a '$' will be shown next to the branch name.
 -#
 -#       If you would like to see if there're untracked files, then you can
 -#       set GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're
 -#       untracked files, then a '%' will be shown next to the branch name.
 -#
 -#       If you would like to see the difference between HEAD and its
 -#       upstream, set GIT_PS1_SHOWUPSTREAM="auto".  A "<" indicates
 -#       you are behind, ">" indicates you are ahead, and "<>"
 -#       indicates you have diverged.  You can further control
 -#       behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated
 -#       list of values:
 -#           verbose       show number of commits ahead/behind (+/-) upstream
 -#           legacy        don't use the '--count' option available in recent
 -#                         versions of git-rev-list
 -#           git           always compare HEAD to @{upstream}
 -#           svn           always compare HEAD to your SVN upstream
 -#       By default, __git_ps1 will compare HEAD to your SVN upstream
 -#       if it can find one, or @{upstream} otherwise.  Once you have
 -#       set GIT_PS1_SHOWUPSTREAM, you can override it on a
 -#       per-repository basis by setting the bash.showUpstream config
 -#       variable.
 -#
 -
 -if [[ -n ${ZSH_VERSION-} ]]; then
 -      autoload -U +X bashcompinit && bashcompinit
 -fi
 +#    3) Consider changing your PS1 to also show the current branch,
 +#       see git-prompt.sh for details.
  
  case "$COMP_WORDBREAKS" in
  *:*) : great ;;
@@@ -32,14 -74,9 +32,14 @@@ esa
  # returns location of .git repo
  __gitdir ()
  {
 +      # Note: this function is duplicated in git-prompt.sh
 +      # When updating it, make sure you update the other one to match.
        if [ -z "${1-}" ]; then
                if [ -n "${__git_dir-}" ]; then
                        echo "$__git_dir"
 +              elif [ -n "${GIT_DIR-}" ]; then
 +                      test -d "${GIT_DIR-}" || return 1
 +                      echo "$GIT_DIR"
                elif [ -d .git ]; then
                        echo .git
                else
        fi
  }
  
 -# stores the divergence from upstream in $p
 -# used by GIT_PS1_SHOWUPSTREAM
 -__git_ps1_show_upstream ()
 -{
 -      local key value
 -      local svn_remote svn_url_pattern count n
 -      local upstream=git legacy="" verbose=""
 -
 -      svn_remote=()
 -      # get some config options from git-config
 -      local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')"
 -      while read -r key value; do
 -              case "$key" in
 -              bash.showupstream)
 -                      GIT_PS1_SHOWUPSTREAM="$value"
 -                      if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
 -                              p=""
 -                              return
 -                      fi
 -                      ;;
 -              svn-remote.*.url)
 -                      svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
 -                      svn_url_pattern+="\\|$value"
 -                      upstream=svn+git # default upstream is SVN if available, else git
 -                      ;;
 -              esac
 -      done <<< "$output"
 -
 -      # parse configuration values
 -      for option in ${GIT_PS1_SHOWUPSTREAM}; do
 -              case "$option" in
 -              git|svn) upstream="$option" ;;
 -              verbose) verbose=1 ;;
 -              legacy)  legacy=1  ;;
 -              esac
 -      done
 -
 -      # Find our upstream
 -      case "$upstream" in
 -      git)    upstream="@{upstream}" ;;
 -      svn*)
 -              # get the upstream from the "git-svn-id: ..." in a commit message
 -              # (git-svn uses essentially the same procedure internally)
 -              local svn_upstream=($(git log --first-parent -1 \
 -                                      --grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null))
 -              if [[ 0 -ne ${#svn_upstream[@]} ]]; then
 -                      svn_upstream=${svn_upstream[ ${#svn_upstream[@]} - 2 ]}
 -                      svn_upstream=${svn_upstream%@*}
 -                      local n_stop="${#svn_remote[@]}"
 -                      for ((n=1; n <= n_stop; n++)); do
 -                              svn_upstream=${svn_upstream#${svn_remote[$n]}}
 -                      done
 -
 -                      if [[ -z "$svn_upstream" ]]; then
 -                              # default branch name for checkouts with no layout:
 -                              upstream=${GIT_SVN_ID:-git-svn}
 -                      else
 -                              upstream=${svn_upstream#/}
 -                      fi
 -              elif [[ "svn+git" = "$upstream" ]]; then
 -                      upstream="@{upstream}"
 -              fi
 -              ;;
 -      esac
 -
 -      # Find how many commits we are ahead/behind our upstream
 -      if [[ -z "$legacy" ]]; then
 -              count="$(git rev-list --count --left-right \
 -                              "$upstream"...HEAD 2>/dev/null)"
 -      else
 -              # produce equivalent output to --count for older versions of git
 -              local commits
 -              if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
 -              then
 -                      local commit behind=0 ahead=0
 -                      for commit in $commits
 -                      do
 -                              case "$commit" in
 -                              "<"*) ((behind++)) ;;
 -                              *)    ((ahead++))  ;;
 -                              esac
 -                      done
 -                      count="$behind  $ahead"
 -              else
 -                      count=""
 -              fi
 -      fi
 -
 -      # calculate the result
 -      if [[ -z "$verbose" ]]; then
 -              case "$count" in
 -              "") # no upstream
 -                      p="" ;;
 -              "0      0") # equal to upstream
 -                      p="=" ;;
 -              "0      "*) # ahead of upstream
 -                      p=">" ;;
 -              *"      0") # behind upstream
 -                      p="<" ;;
 -              *)          # diverged from upstream
 -                      p="<>" ;;
 -              esac
 -      else
 -              case "$count" in
 -              "") # no upstream
 -                      p="" ;;
 -              "0      0") # equal to upstream
 -                      p=" u=" ;;
 -              "0      "*) # ahead of upstream
 -                      p=" u+${count#0 }" ;;
 -              *"      0") # behind upstream
 -                      p=" u-${count%  0}" ;;
 -              *)          # diverged from upstream
 -                      p=" u+${count#* }-${count%      *}" ;;
 -              esac
 -      fi
 -
 -}
 -
 -
 -# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
 -# returns text to add to bash PS1 prompt (includes branch name)
 -__git_ps1 ()
 -{
 -      local g="$(__gitdir)"
 -      if [ -n "$g" ]; then
 -              local r=""
 -              local b=""
 -              if [ -f "$g/rebase-merge/interactive" ]; then
 -                      r="|REBASE-i"
 -                      b="$(cat "$g/rebase-merge/head-name")"
 -              elif [ -d "$g/rebase-merge" ]; then
 -                      r="|REBASE-m"
 -                      b="$(cat "$g/rebase-merge/head-name")"
 -              else
 -                      if [ -d "$g/rebase-apply" ]; then
 -                              if [ -f "$g/rebase-apply/rebasing" ]; then
 -                                      r="|REBASE"
 -                              elif [ -f "$g/rebase-apply/applying" ]; then
 -                                      r="|AM"
 -                              else
 -                                      r="|AM/REBASE"
 -                              fi
 -                      elif [ -f "$g/MERGE_HEAD" ]; then
 -                              r="|MERGING"
 -                      elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
 -                              r="|CHERRY-PICKING"
 -                      elif [ -f "$g/BISECT_LOG" ]; then
 -                              r="|BISECTING"
 -                      fi
 -
 -                      b="$(git symbolic-ref HEAD 2>/dev/null)" || {
 -
 -                              b="$(
 -                              case "${GIT_PS1_DESCRIBE_STYLE-}" in
 -                              (contains)
 -                                      git describe --contains HEAD ;;
 -                              (branch)
 -                                      git describe --contains --all HEAD ;;
 -                              (describe)
 -                                      git describe HEAD ;;
 -                              (* | default)
 -                                      git describe --tags --exact-match HEAD ;;
 -                              esac 2>/dev/null)" ||
 -
 -                              b="$(cut -c1-7 "$g/HEAD" 2>/dev/null)..." ||
 -                              b="unknown"
 -                              b="($b)"
 -                      }
 -              fi
 -
 -              local w=""
 -              local i=""
 -              local s=""
 -              local u=""
 -              local c=""
 -              local p=""
 -
 -              if [ "true" = "$(git rev-parse --is-inside-git-dir 2>/dev/null)" ]; then
 -                      if [ "true" = "$(git rev-parse --is-bare-repository 2>/dev/null)" ]; then
 -                              c="BARE:"
 -                      else
 -                              b="GIT_DIR!"
 -                      fi
 -              elif [ "true" = "$(git rev-parse --is-inside-work-tree 2>/dev/null)" ]; then
 -                      if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ]; then
 -                              if [ "$(git config --bool bash.showDirtyState)" != "false" ]; then
 -                                      git diff --no-ext-diff --quiet --exit-code || w="*"
 -                                      if git rev-parse --quiet --verify HEAD >/dev/null; then
 -                                              git diff-index --cached --quiet HEAD -- || i="+"
 -                                      else
 -                                              i="#"
 -                                      fi
 -                              fi
 -                      fi
 -                      if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ]; then
 -                              git rev-parse --verify refs/stash >/dev/null 2>&1 && s="$"
 -                      fi
 -
 -                      if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ]; then
 -                              if [ -n "$(git ls-files --others --exclude-standard)" ]; then
 -                                      u="%"
 -                              fi
 -                      fi
 -
 -                      if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
 -                              __git_ps1_show_upstream
 -                      fi
 -              fi
 -
 -              local f="$w$i$s$u"
 -              printf -- "${1:- (%s)}" "$c${b##refs/heads/}${f:+ $f}$r$p"
 -      fi
 -}
 -
  __gitcomp_1 ()
  {
        local c IFS=$' \t\n'
@@@ -165,6 -417,7 +165,6 @@@ __git_reassemble_comp_words_by_ref(
  }
  
  if ! type _get_comp_words_by_ref >/dev/null 2>&1; then
 -if [[ -z ${ZSH_VERSION:+set} ]]; then
  _get_comp_words_by_ref ()
  {
        local exclude cur_ words_ cword_
                shift
        done
  }
 -else
 -_get_comp_words_by_ref ()
 -{
 -      while [ $# -gt 0 ]; do
 -              case "$1" in
 -              cur)
 -                      cur=${COMP_WORDS[COMP_CWORD]}
 -                      ;;
 -              prev)
 -                      prev=${COMP_WORDS[COMP_CWORD-1]}
 -                      ;;
 -              words)
 -                      words=("${COMP_WORDS[@]}")
 -                      ;;
 -              cword)
 -                      cword=$COMP_CWORD
 -                      ;;
 -              -n)
 -                      # assume COMP_WORDBREAKS is already set sanely
 -                      shift
 -                      ;;
 -              esac
 -              shift
 -      done
 -}
 -fi
  fi
  
  # Generates completion reply with compgen, appending a space to possible
@@@ -290,7 -569,7 +290,7 @@@ __git_refs (
                                if [[ "$ref" == "$cur"* ]]; then
                                        echo "$ref"
                                fi
 -                      done | uniq -u
 +                      done | sort | uniq -u
                fi
                return
        fi
@@@ -397,7 -676,7 +397,7 @@@ __git_complete_revlist_file (
                *)   pfx="$ref:$pfx" ;;
                esac
  
-               __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" \
+               __gitcomp_nl "$(git --git-dir="$(__gitdir)" ls-tree "$ls" 2>/dev/null \
                                | sed '/^100... blob /{
                                           s,^.*        ,,
                                           s,$, ,
@@@ -554,7 -833,7 +554,7 @@@ __git_list_porcelain_commands (
  {
        local i IFS=" "$'\n'
        __git_compute_all_commands
 -      for i in "help" $__git_all_commands
 +      for i in $__git_all_commands
        do
                case $i in
                *--*)             : helper pattern;;
@@@ -844,15 -1123,11 +844,15 @@@ _git_branch (
        done
  
        case "$cur" in
 +      --set-upstream-to=*)
 +              __gitcomp "$(__git_refs)" "" "${cur##--set-upstream-to=}"
 +              ;;
        --*)
                __gitcomp "
                        --color --no-color --verbose --abbrev= --no-abbrev
                        --track --no-track --contains --merged --no-merged
 -                      --set-upstream --edit-description --list
 +                      --set-upstream-to= --edit-description --list
 +                      --unset-upstream
                        "
                ;;
        *)
@@@ -958,8 -1233,6 +958,8 @@@ _git_clone (
                        --upload-pack
                        --template=
                        --depth
 +                      --single-branch
 +                      --branch
                        "
                return
                ;;
@@@ -971,13 -1244,6 +971,13 @@@ _git_commit (
  {
        __git_has_doubledash && return
  
 +      case "$prev" in
 +      -c|-C)
 +              __gitcomp_nl "$(__git_refs)" "" "${cur}"
 +              return
 +              ;;
 +      esac
 +
        case "$cur" in
        --cleanup=*)
                __gitcomp "default strip verbatim whitespace
        --*)
                __gitcomp "
                        --all --author= --signoff --verify --no-verify
 -                      --edit --amend --include --only --interactive
 +                      --edit --no-edit
 +                      --amend --include --only --interactive
                        --dry-run --reuse-message= --reedit-message=
                        --reset-author --file= --message= --template=
                        --cleanup= --untracked-files --untracked-files=
@@@ -1054,7 -1319,7 +1054,7 @@@ _git_diff (
  }
  
  __git_mergetools_common="diffuse ecmerge emerge kdiff3 meld opendiff
 -                      tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3
 +                      tkdiff vimdiff gvimdiff xxdiff araxis p4merge bc3 codecompare
  "
  
  _git_difftool ()
@@@ -1094,14 -1359,6 +1094,14 @@@ _git_fetch (
        __git_complete_remote_or_refspec
  }
  
 +__git_format_patch_options="
 +      --stdout --attach --no-attach --thread --thread= --output-directory
 +      --numbered --start-number --numbered-files --keep-subject --signoff
 +      --signature --no-signature --in-reply-to= --cc= --full-index --binary
 +      --not --all --cover-letter --no-prefix --src-prefix= --dst-prefix=
 +      --inline --suffix= --ignore-if-in-upstream --subject-prefix=
 +"
 +
  _git_format_patch ()
  {
        case "$cur" in
                return
                ;;
        --*)
 -              __gitcomp "
 -                      --stdout --attach --no-attach --thread --thread=
 -                      --output-directory
 -                      --numbered --start-number
 -                      --numbered-files
 -                      --keep-subject
 -                      --signoff --signature --no-signature
 -                      --in-reply-to= --cc=
 -                      --full-index --binary
 -                      --not --all
 -                      --cover-letter
 -                      --no-prefix --src-prefix= --dst-prefix=
 -                      --inline --suffix= --ignore-if-in-upstream
 -                      --subject-prefix=
 -                      "
 +              __gitcomp "$__git_format_patch_options"
                return
                ;;
        esac
@@@ -1526,12 -1797,6 +1526,12 @@@ _git_send_email (
                __gitcomp "ssl tls" "" "${cur##--smtp-encryption=}"
                return
                ;;
 +      --thread=*)
 +              __gitcomp "
 +                      deep shallow
 +                      " "" "${cur##--thread=}"
 +              return
 +              ;;
        --*)
                __gitcomp "--annotate --bcc --cc --cc-cmd --chain-reply-to
                        --compose --confirm= --dry-run --envelope-sender
                        --signed-off-by-cc --smtp-pass --smtp-server
                        --smtp-server-port --smtp-encryption= --smtp-user
                        --subject --suppress-cc= --suppress-from --thread --to
 -                      --validate --no-validate"
 +                      --validate --no-validate
 +                      $__git_format_patch_options"
                return
                ;;
        esac
 -      COMPREPLY=()
 +      __git_complete_revlist
  }
  
  _git_stage ()
@@@ -2016,7 -2280,7 +2016,7 @@@ _git_config (
  
  _git_remote ()
  {
 -      local subcommands="add rename rm set-head set-branches set-url show prune update"
 +      local subcommands="add rename remove set-head set-branches set-url show prune update"
        local subcommand="$(__git_find_on_cmdline "$subcommands")"
        if [ -z "$subcommand" ]; then
                __gitcomp "$subcommands"
        fi
  
        case "$subcommand" in
 -      rename|rm|set-url|show|prune)
 +      rename|remove|set-url|show|prune)
                __gitcomp_nl "$(__git_remotes)"
                ;;
        set-head|set-branches)
@@@ -2408,71 -2672,20 +2408,71 @@@ __gitk_main (
        __git_complete_revlist
  }
  
 -__git_func_wrap ()
 -{
 -      if [[ -n ${ZSH_VERSION-} ]]; then
 -              emulate -L bash
 -              setopt KSH_TYPESET
 +if [[ -n ${ZSH_VERSION-} ]]; then
 +      echo "WARNING: this script is deprecated, please see git-completion.zsh" 1>&2
  
 -              # workaround zsh's bug that leaves 'words' as a special
 -              # variable in versions < 4.3.12
 -              typeset -h words
 +      autoload -U +X compinit && compinit
  
 -              # workaround zsh's bug that quotes spaces in the COMPREPLY
 -              # array if IFS doesn't contain spaces.
 -              typeset -h IFS
 -      fi
 +      __gitcomp ()
 +      {
 +              emulate -L zsh
 +
 +              local cur_="${3-$cur}"
 +
 +              case "$cur_" in
 +              --*=)
 +                      ;;
 +              *)
 +                      local c IFS=$' \t\n'
 +                      local -a array
 +                      for c in ${=1}; do
 +                              c="$c${4-}"
 +                              case $c in
 +                              --*=*|*.) ;;
 +                              *) c="$c " ;;
 +                              esac
 +                              array+=("$c")
 +                      done
 +                      compset -P '*[=:]'
 +                      compadd -Q -S '' -p "${2-}" -a -- array && _ret=0
 +                      ;;
 +              esac
 +      }
 +
 +      __gitcomp_nl ()
 +      {
 +              emulate -L zsh
 +
 +              local IFS=$'\n'
 +              compset -P '*[=:]'
 +              compadd -Q -S "${4- }" -p "${2-}" -- ${=1} && _ret=0
 +      }
 +
 +      __git_zsh_helper ()
 +      {
 +              emulate -L ksh
 +              local cur cword prev
 +              cur=${words[CURRENT-1]}
 +              prev=${words[CURRENT-2]}
 +              let cword=CURRENT-1
 +              __${service}_main
 +      }
 +
 +      _git ()
 +      {
 +              emulate -L zsh
 +              local _ret=1
 +              __git_zsh_helper
 +              let _ret && _default -S '' && _ret=0
 +              return _ret
 +      }
 +
 +      compdef _git git gitk
 +      return
 +fi
 +
 +__git_func_wrap ()
 +{
        local cur words cword prev
        _get_comp_words_by_ref -n =: cur words cword prev
        $1