Merge branch 'tg/maint-zsh-svn-remote-prompt'
authorJunio C Hamano <gitster@pobox.com>
Wed, 5 Jun 2013 21:56:41 +0000 (14:56 -0700)
committerJunio C Hamano <gitster@pobox.com>
Wed, 5 Jun 2013 21:56:41 +0000 (14:56 -0700)
zsh prompt script that borrowed from bash prompt script did not
work due to slight differences in array variable notation between
these two shells.

* tg/maint-zsh-svn-remote-prompt:
prompt: fix show upstream with svn and zsh

1  2 
contrib/completion/git-prompt.sh
index 92f2770769799a8b9695788d95a521bb39a47dba,d3de80f60b3a2d42e0e684ca73443c4d36f6cc3f..9f4e6a368cf590ccfc9e469ad8820e2af93c3568
@@@ -20,8 -20,7 +20,8 @@@
  #        <post>, which are strings you would put in $PS1 before
  #        and after the status string generated by the git-prompt
  #        machinery.  e.g.
 -#           PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "'
 +#        Bash: PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "'
 +#        ZSH:  precmd () { __git_ps1 "%n" ":%~$ " "|%s" }
  #        will show username, at-sign, host, colon, cwd, then
  #        various status string, followed by dollar and SP, as
  #        your prompt.
@@@ -125,7 -124,7 +125,7 @@@ __git_ps1_show_upstream (
                        fi
                        ;;
                svn-remote.*.url)
-                       svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
+                       svn_remote[$((${#svn_remote[@]} + 1))]="$value"
                        svn_url_pattern+="\\|$value"
                        upstream=svn+git # default upstream is SVN if available, else git
                        ;;
        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 \
+               local -a svn_upstream
+               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[${#svn_upstream[@]} - 2]}
                        svn_upstream=${svn_upstream%@*}
                        local n_stop="${#svn_remote[@]}"
                        for ((n=1; n <= n_stop; n++)); do
  
  }
  
 +# Helper function that is meant to be called from __git_ps1.  It
 +# builds up a gitstring injecting color codes into the appropriate
 +# places.
 +__git_ps1_colorize_gitstring ()
 +{
 +      if [[ -n ${ZSH_VERSION-} ]]; then
 +              local c_red='%F{red}'
 +              local c_green='%F{green}'
 +              local c_lblue='%F{blue}'
 +              local c_clear='%f'
 +              local bad_color=$c_red
 +              local ok_color=$c_green
 +              local branch_color="$c_clear"
 +              local flags_color="$c_lblue"
 +              local branchstring="$c${b##refs/heads/}"
 +
 +              if [ $detached = no ]; then
 +                      branch_color="$ok_color"
 +              else
 +                      branch_color="$bad_color"
 +              fi
 +
 +              gitstring="$branch_color$branchstring$c_clear"
 +
 +              if [ -n "$w$i$s$u$r$p" ]; then
 +                      gitstring="$gitstring$z"
 +              fi
 +              if [ "$w" = "*" ]; then
 +                      gitstring="$gitstring$bad_color$w"
 +              fi
 +              if [ -n "$i" ]; then
 +                      gitstring="$gitstring$ok_color$i"
 +              fi
 +              if [ -n "$s" ]; then
 +                      gitstring="$gitstring$flags_color$s"
 +              fi
 +              if [ -n "$u" ]; then
 +                      gitstring="$gitstring$bad_color$u"
 +              fi
 +              gitstring="$gitstring$c_clear$r$p"
 +              return
 +      fi
 +      local c_red='\e[31m'
 +      local c_green='\e[32m'
 +      local c_lblue='\e[1;34m'
 +      local c_clear='\e[0m'
 +      local bad_color=$c_red
 +      local ok_color=$c_green
 +      local branch_color="$c_clear"
 +      local flags_color="$c_lblue"
 +      local branchstring="$c${b##refs/heads/}"
 +
 +      if [ $detached = no ]; then
 +              branch_color="$ok_color"
 +      else
 +              branch_color="$bad_color"
 +      fi
 +
 +      # Setting gitstring directly with \[ and \] around colors
 +      # is necessary to prevent wrapping issues!
 +      gitstring="\[$branch_color\]$branchstring\[$c_clear\]"
 +
 +      if [ -n "$w$i$s$u$r$p" ]; then
 +              gitstring="$gitstring$z"
 +      fi
 +      if [ "$w" = "*" ]; then
 +              gitstring="$gitstring\[$bad_color\]$w"
 +      fi
 +      if [ -n "$i" ]; then
 +              gitstring="$gitstring\[$ok_color\]$i"
 +      fi
 +      if [ -n "$s" ]; then
 +              gitstring="$gitstring\[$flags_color\]$s"
 +      fi
 +      if [ -n "$u" ]; then
 +              gitstring="$gitstring\[$bad_color\]$u"
 +      fi
 +      gitstring="$gitstring\[$c_clear\]$r$p"
 +}
  
  # __git_ps1 accepts 0 or 1 arguments (i.e., format string)
  # when called from PS1 using command substitution
@@@ -343,21 -264,14 +344,21 @@@ __git_ps1 (
        else
                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"
 +              local step=""
 +              local total=""
 +              if [ -d "$g/rebase-merge" ]; then
                        b="$(cat "$g/rebase-merge/head-name")"
 +                      step=$(cat "$g/rebase-merge/msgnum")
 +                      total=$(cat "$g/rebase-merge/end")
 +                      if [ -f "$g/rebase-merge/interactive" ]; then
 +                              r="|REBASE-i"
 +                      else
 +                              r="|REBASE-m"
 +                      fi
                else
                        if [ -d "$g/rebase-apply" ]; then
 +                              step=$(cat "$g/rebase-apply/next")
 +                              total=$(cat "$g/rebase-apply/last")
                                if [ -f "$g/rebase-apply/rebasing" ]; then
                                        r="|REBASE"
                                elif [ -f "$g/rebase-apply/applying" ]; then
                        }
                fi
  
 +              if [ -n "$step" ] && [ -n "$total" ]; then
 +                      r="$r $step/$total"
 +              fi
 +
                local w=""
                local i=""
                local s=""
                        fi
                fi
  
 +              local z="${GIT_PS1_STATESEPARATOR-" "}"
                local f="$w$i$s$u"
                if [ $pcmode = yes ]; then
                        local gitstring=
                        if [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
 -                              local c_red='\e[31m'
 -                              local c_green='\e[32m'
 -                              local c_lblue='\e[1;34m'
 -                              local c_clear='\e[0m'
 -                              local bad_color=$c_red
 -                              local ok_color=$c_green
 -                              local branch_color="$c_clear"
 -                              local flags_color="$c_lblue"
 -                              local branchstring="$c${b##refs/heads/}"
 -
 -                              if [ $detached = no ]; then
 -                                      branch_color="$ok_color"
 -                              else
 -                                      branch_color="$bad_color"
 -                              fi
 -
 -                              # Setting gitstring directly with \[ and \] around colors
 -                              # is necessary to prevent wrapping issues!
 -                              gitstring="\[$branch_color\]$branchstring\[$c_clear\]"
 -
 -                              if [ -n "$w$i$s$u$r$p" ]; then
 -                                      gitstring="$gitstring "
 -                              fi
 -                              if [ "$w" = "*" ]; then
 -                                      gitstring="$gitstring\[$bad_color\]$w"
 -                              fi
 -                              if [ -n "$i" ]; then
 -                                      gitstring="$gitstring\[$ok_color\]$i"
 -                              fi
 -                              if [ -n "$s" ]; then
 -                                      gitstring="$gitstring\[$flags_color\]$s"
 -                              fi
 -                              if [ -n "$u" ]; then
 -                                      gitstring="$gitstring\[$bad_color\]$u"
 -                              fi
 -                              gitstring="$gitstring\[$c_clear\]$r$p"
 +                              __git_ps1_colorize_gitstring
                        else
 -                              gitstring="$c${b##refs/heads/}${f:+ $f}$r$p"
 +                              gitstring="$c${b##refs/heads/}${f:+$z$f}$r$p"
                        fi
                        gitstring=$(printf -- "$printf_format" "$gitstring")
                        PS1="$ps1pc_start$gitstring$ps1pc_end"
                else
                        # NO color option unless in PROMPT_COMMAND mode
 -                      printf -- "$printf_format" "$c${b##refs/heads/}${f:+ $f}$r$p"
 +                      printf -- "$printf_format" "$c${b##refs/heads/}${f:+$z$f}$r$p"
                fi
        fi
  }