Commit e7e0e20f by Carlos Martín Nieto

Simplify loose ref writing

There is no need to store the format outselves, as the library
provides git_filebuf_printf which takes care of the formatting itself.

Also get rid of an use of strcat + strcpy which is always a nice
thing.

Signed-off-by: Carlos Martín Nieto <cmn@elego.de>
parent d144c569
...@@ -357,8 +357,7 @@ static int loose_write(git_reference *ref) ...@@ -357,8 +357,7 @@ static int loose_write(git_reference *ref)
{ {
git_filebuf file; git_filebuf file;
char ref_path[GIT_PATH_MAX]; char ref_path[GIT_PATH_MAX];
int error, contents_size; int error;
char *ref_contents = NULL;
struct stat st; struct stat st;
assert((ref->type & GIT_REF_PACKED) == 0); assert((ref->type & GIT_REF_PACKED) == 0);
...@@ -370,50 +369,33 @@ static int loose_write(git_reference *ref) ...@@ -370,50 +369,33 @@ static int loose_write(git_reference *ref)
if (ref->type & GIT_REF_OID) { if (ref->type & GIT_REF_OID) {
reference_oid *ref_oid = (reference_oid *)ref; reference_oid *ref_oid = (reference_oid *)ref;
char oid[GIT_OID_HEXSZ + 1];
contents_size = GIT_OID_HEXSZ + 1; memset(oid, 0x0, sizeof(oid));
ref_contents = git__malloc(contents_size);
if (ref_contents == NULL) {
error = GIT_ENOMEM;
goto unlock;
}
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 */ } else if (ref->type & GIT_REF_SYMBOLIC) { /* GIT_REF_SYMBOLIC */
reference_symbolic *ref_sym = (reference_symbolic *)ref; reference_symbolic *ref_sym = (reference_symbolic *)ref;
contents_size = strlen(GIT_SYMREF) + strlen(ref_sym->target) + 1; error = git_filebuf_printf(&file, GIT_SYMREF "%s\n", ref_sym->target);
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);
} else { } else {
error = git__throw(GIT_EOBJCORRUPTED, "Failed to write reference. Invalid reference type"); error = git__throw(GIT_EOBJCORRUPTED, "Failed to write reference. Invalid reference type");
goto unlock; 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); error = git_filebuf_commit(&file);
if (gitfo_stat(ref_path, &st) == GIT_SUCCESS) if (gitfo_stat(ref_path, &st) == GIT_SUCCESS)
ref->mtime = st.st_mtime; ref->mtime = st.st_mtime;
free(ref_contents);
return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to write loose reference"); return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to write loose reference");
unlock: unlock:
git_filebuf_cleanup(&file); git_filebuf_cleanup(&file);
free(ref_contents);
return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to write loose reference"); return error == GIT_SUCCESS ? GIT_SUCCESS : git__rethrow(error, "Failed to write loose reference");
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment