[PATCH] completion: resolve svn remote upstream refs
From: Yves Blusseau <hidden>
Date: 2016-06-15 22:54:24
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 <redacted> --- 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