summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRussell Belfer <rb@github.com>2013-08-21 14:10:27 -0700
committerRussell Belfer <rb@github.com>2013-08-21 14:10:27 -0700
commit24c71f14b4dcb696d9d87330322c12fd2c185317 (patch)
tree779a0dcb86c051b5722aa60c784020e4b171fc80 /src
parenta4977169e1e1920ed33f10a77e5dd8706f103f4f (diff)
downloadlibgit2-24c71f14b4dcb696d9d87330322c12fd2c185317.tar.gz
Add internal ref set_name fn instead of realloc
The refdb_fs implementation calls realloc directly on a reference object when it wants to rename it. It is not a public object, so this doesn't mess with the immutability of references, but it does assume certain constraints on the reference representation. This commit wraps that assumption in an isolated API to isolate it.
Diffstat (limited to 'src')
-rw-r--r--src/refs.c11
-rw-r--r--src/refs.h2
2 files changed, 13 insertions, 0 deletions
diff --git a/src/refs.c b/src/refs.c
index c0e460cc3..e59b34aae 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -88,6 +88,17 @@ git_reference *git_reference__alloc(
return ref;
}
+git_reference *git_reference__set_name(
+ git_reference *ref, const char *name)
+{
+ size_t namelen = strlen(name);
+ git_reference *rewrite =
+ git__realloc(ref, sizeof(git_reference) + namelen + 1);
+ if (rewrite != NULL)
+ memcpy(rewrite->name, name, namelen + 1);
+ return rewrite;
+}
+
void git_reference_free(git_reference *reference)
{
if (reference == NULL)
diff --git a/src/refs.h b/src/refs.h
index f487ee3fc..4bb49d02a 100644
--- a/src/refs.h
+++ b/src/refs.h
@@ -61,6 +61,8 @@ struct git_reference {
char name[0];
};
+git_reference *git_reference__set_name(git_reference *ref, const char *name);
+
int git_reference__normalize_name_lax(char *buffer_out, size_t out_size, const char *name);
int git_reference__normalize_name(git_buf *buf, const char *name, unsigned int flags);
int git_reference__update_terminal(git_repository *repo, const char *ref_name, const git_oid *oid);