refspec: introduce git_refspec_transform_l()
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
diff --git a/src/refspec.c b/src/refspec.c
index cd3a528..b1790b3 100644
--- a/src/refspec.c
+++ b/src/refspec.c
@@ -194,20 +194,20 @@ int git_refspec_transform(char *out, size_t outlen, const git_refspec *spec, con
return 0;
}
-int git_refspec_transform_r(git_buf *out, const git_refspec *spec, const char *name)
+static int refspec_transform(git_buf *out, const char *from, const char *to, const char *name)
{
- if (git_buf_sets(out, spec->dst) < 0)
+ if (git_buf_sets(out, to) < 0)
return -1;
/*
- * No '*' at the end means that it's mapped to one specific local
+ * No '*' at the end means that it's mapped to one specific
* branch, so no actual transformation is needed.
*/
if (git_buf_len(out) > 0 && out->ptr[git_buf_len(out) - 1] != '*')
return 0;
git_buf_truncate(out, git_buf_len(out) - 1); /* remove trailing '*' */
- git_buf_puts(out, name + strlen(spec->src) - 1);
+ git_buf_puts(out, name + strlen(from) - 1);
if (git_buf_oom(out))
return -1;
@@ -215,3 +215,13 @@ int git_refspec_transform_r(git_buf *out, const git_refspec *spec, const char *n
return 0;
}
+int git_refspec_transform_r(git_buf *out, const git_refspec *spec, const char *name)
+{
+ return refspec_transform(out, spec->src, spec->dst, name);
+}
+
+int git_refspec_transform_l(git_buf *out, const git_refspec *spec, const char *name)
+{
+ return refspec_transform(out, spec->dst, spec->src, name);
+}
+
diff --git a/src/refspec.h b/src/refspec.h
index a5df458..6e0596a 100644
--- a/src/refspec.h
+++ b/src/refspec.h
@@ -40,4 +40,15 @@ void git_refspec__free(git_refspec *refspec);
*/
int git_refspec_transform_r(git_buf *out, const git_refspec *spec, const char *name);
+/**
+ * Transform a reference from its target following the refspec's rules,
+ * and writes the results into a git_buf.
+ *
+ * @param out where to store the source name
+ * @param spec the refspec
+ * @param name the name of the reference to transform
+ * @return 0 or error if buffer allocation fails
+ */
+int git_refspec_transform_l(git_buf *out, const git_refspec *spec, const char *name);
+
#endif