From 279afd2a514160754eeba8e5db84600486f70761 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20Mart=C3=ADn=20Nieto?= Date: Tue, 31 Jan 2012 17:21:49 +0100 Subject: [PATCH] refspec: a ref name includes the refs/ prefix git_refspec_transform_r assumed that the reference name passed would be only a branch or tag name. This is not the case, and we need to take into consideration what's in the refspec's source to know how much of the prefix to ignore. --- src/refspec.c | 2 +- tests-clar/network/remotes.c | 10 ++++++++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/src/refspec.c b/src/refspec.c index 7694be525..48265bcde 100644 --- a/src/refspec.c +++ b/src/refspec.c @@ -107,7 +107,7 @@ int git_refspec_transform_r(git_buf *out, const git_refspec *spec, const char *n return GIT_SUCCESS; git_buf_truncate(out, out->size - 1); /* remove trailing '*' */ - git_buf_puts(out, name); + git_buf_puts(out, name + strlen(spec->src) - 1); return git_buf_lasterror(out); } diff --git a/tests-clar/network/remotes.c b/tests-clar/network/remotes.c index 2abaccb07..a0a940fc9 100644 --- a/tests-clar/network/remotes.c +++ b/tests-clar/network/remotes.c @@ -1,4 +1,6 @@ #include "clar_libgit2.h" +#include "buffer.h" +#include "refspec.h" static git_remote *_remote; static git_repository *_repo; @@ -48,3 +50,11 @@ void test_network_remotes__transform(void) cl_git_pass(git_refspec_transform(ref, sizeof(ref), _refspec, "refs/heads/master")); cl_assert(!strcmp(ref, "refs/remotes/test/master")); } + +void test_network_remotes__transform_r(void) +{ + git_buf buf = GIT_BUF_INIT; + + cl_git_pass(git_refspec_transform_r(&buf, _refspec, "refs/heads/master")); + cl_assert(!strcmp(git_buf_cstr(&buf), "refs/remotes/test/master")); +}