This fix is used to return the svn reference of the remote svn upstream
branch when the git repository is a clone of a svn repository that was
created with the --stdlayout and --prefix options of git svn command.

* completion/git-prompt.sh: add function to resolve svn branches
  into git remote refs using paths declared in svn-remote.*.branches
  configurations

Signed-off-by: Yves Blusseau <bluss...@zetam.org>
---
contrib/completion/git-prompt.sh | 48 +++++++++++++++++++++++++++++++++++++++-
 1 file changed, 47 insertions(+), 1 deletion(-)

diff --git a/contrib/completion/git-prompt.sh b/contrib/completion/git-prompt.sh
index 29b1ec9..dafcecc 100644
--- a/contrib/completion/git-prompt.sh
+++ b/contrib/completion/git-prompt.sh
@@ -73,17 +73,57 @@ __gitdir ()
        fi
 }
 +# resolve svn refs
+# The function accepts 2 arguments:
+# 1: An array containing the translation ref(s) (ie branches/*:refs/remotes/svn/*)
+# 2: the ref to be translated (ie. branches/prod)
+# returns the remote refs or original ref if it could not be translated
+__git_resolve_svn_refs ()
+{
+ local idx ref_globs left_part_ref_glob right_part_ref_glob left right value
+
+       local all_ref_globs=("${!1}")
+       local ref="$2"
+
+       for (( idx=0 ; idx < ${#all_ref_globs[@]}; idx++ ));do
+               ref_globs="${all_ref_globs[$idx]}"
+               # get the left part ref glob (before the :refs/)
+               left_part_ref_glob="${ref_globs%%:refs/*}"
+               case $ref in
+                       # check if the ref match the glob
+                       $left_part_ref_glob)
+                               # extract the value that match the pattern
+                               left=${left_part_ref_glob%%\**}
+                               right=${left_part_ref_glob##*\*}
+                               value=${ref#$left}
+                               value=${value%$right}
+                               # get the right part ref glob (after the :)
+                               
right_part_ref_glob="${ref_globs/${left_part_ref_glob}:/}"
+                               # replace the pattern with the value found above
+                               left=${right_part_ref_glob%%\**}
+                               right=${right_part_ref_glob##*\*}
+                               ref=${left}${value}${right}
+                               # remove leading refs/remotes/
+                               ref=${ref/refs\/remotes\//}
+                               break
+                               ;;
+               esac
+       done
+       echo "$ref"
+}
+
 # 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 branches_refs_globs=()
        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 ')" + local output="$(git config -z --get-regexp '^(svn-remote\..*\.(branches|url)|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')"
        while read -r key value; do
                case "$key" in
                bash.showupstream)
@@ -93,6 +133,9 @@ __git_ps1_show_upstream ()
                                return
                        fi
                        ;;
+               svn-remote.*.branches)
+                       branches_refs_globs[${#branches_refs_globs[*]}]="$value"
+                       ;;
                svn-remote.*.url)
                        svn_remote[ $((${#svn_remote[@]} + 1)) ]="$value"
                        svn_url_pattern+="\\|$value"
@@ -132,6 +175,9 @@ __git_ps1_show_upstream ()
                        else
                                upstream=${svn_upstream#/}
                        fi
+                       if [[ ${#branches_refs_globs[@]} -gt 0 ]]; then
+                               upstream=$(__git_resolve_svn_refs branches_refs_globs[@] 
"$upstream")
+                       fi
                elif [[ "svn+git" = "$upstream" ]]; then
                        upstream="@{upstream}"
                fi
--
1.7.12.rc1

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to