Merge pull request #263 from carlosmn/refs-writing Simplify loose ref writing
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 64 65 66 67 68 69 70 71 72
diff --git a/src/refs.c b/src/refs.c
index e74eca2..1b2154b 100644
--- a/src/refs.c
+++ b/src/refs.c
@@ -357,8 +357,7 @@ static int loose_write(git_reference *ref)
{
git_filebuf file;
char ref_path[GIT_PATH_MAX];
- int error, contents_size;
- char *ref_contents = NULL;
+ int error;
struct stat st;
assert((ref->type & GIT_REF_PACKED) == 0);
@@ -370,50 +369,33 @@ static int loose_write(git_reference *ref)
if (ref->type & GIT_REF_OID) {
reference_oid *ref_oid = (reference_oid *)ref;
+ char oid[GIT_OID_HEXSZ + 1];
- contents_size = GIT_OID_HEXSZ + 1;
- ref_contents = git__malloc(contents_size);
- if (ref_contents == NULL) {
- error = GIT_ENOMEM;
- goto unlock;
- }
+ memset(oid, 0x0, sizeof(oid));
- git_oid_fmt(ref_contents, &ref_oid->oid);
+ git_oid_fmt(oid, &ref_oid->oid);
+ error = git_filebuf_printf(&file, "%s\n", oid);
+ if (error < GIT_SUCCESS)
+ goto unlock;
} else if (ref->type & GIT_REF_SYMBOLIC) { /* GIT_REF_SYMBOLIC */
reference_symbolic *ref_sym = (reference_symbolic *)ref;
- contents_size = strlen(GIT_SYMREF) + strlen(ref_sym->target) + 1;
- ref_contents = git__malloc(contents_size);
- if (ref_contents == NULL) {
- error = GIT_ENOMEM;
- goto unlock;
- }
-
- strcpy(ref_contents, GIT_SYMREF);
- strcat(ref_contents, ref_sym->target);
+ error = git_filebuf_printf(&file, GIT_SYMREF "%s\n", ref_sym->target);
} else {
error = git__throw(GIT_EOBJCORRUPTED, "Failed to write reference. Invalid reference type");
goto unlock;
}
- /* TODO: win32 carriage return when writing references in Windows? */
- ref_contents[contents_size - 1] = '\n';
-
- if ((error = git_filebuf_write(&file, ref_contents, contents_size)) < GIT_SUCCESS)
- goto unlock;
-
error = git_filebuf_commit(&file);
if (gitfo_stat(ref_path, &st) == GIT_SUCCESS)
ref->mtime = st.st_mtime;
- free(ref_contents);
return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to write loose reference");
unlock:
git_filebuf_cleanup(&file);
- free(ref_contents);
return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to write loose reference");
}