summaryrefslogtreecommitdiff
path: root/refs.c
diff options
context:
space:
mode:
Diffstat (limited to 'refs.c')
-rw-r--r--refs.c30
1 files changed, 18 insertions, 12 deletions
diff --git a/refs.c b/refs.c
index c93f847fd7..2e9a6697e0 100644
--- a/refs.c
+++ b/refs.c
@@ -3104,20 +3104,22 @@ static int write_ref_sha1(struct ref_lock *lock,
}
int create_symref(const char *ref_target, const char *refs_heads_master,
- const char *logmsg)
+ const char *logmsg, struct strbuf *err)
{
const char *lockpath;
char ref[1000];
int fd, len, written;
char *git_HEAD = git_pathdup("%s", ref_target);
unsigned char old_sha1[20], new_sha1[20];
- struct strbuf err = STRBUF_INIT;
if (logmsg && read_ref(ref_target, old_sha1))
hashclr(old_sha1);
- if (safe_create_leading_directories(git_HEAD) < 0)
- return error("unable to create directory for %s", git_HEAD);
+ if (safe_create_leading_directories(git_HEAD) < 0) {
+ strbuf_addf(err, "unable to create directory for %s.",
+ git_HEAD);
+ return -1;
+ }
#ifndef NO_SYMLINK_HEAD
if (prefer_symlink_refs) {
@@ -3130,26 +3132,29 @@ int create_symref(const char *ref_target, const char *refs_heads_master,
len = snprintf(ref, sizeof(ref), "ref: %s\n", refs_heads_master);
if (sizeof(ref) <= len) {
- error("refname too long: %s", refs_heads_master);
+ strbuf_addf(err, "refname too long: %s", refs_heads_master);
goto error_free_return;
}
lockpath = mkpath("%s.lock", git_HEAD);
fd = open(lockpath, O_CREAT | O_EXCL | O_WRONLY, 0666);
if (fd < 0) {
- error("Unable to open %s for writing", lockpath);
+ strbuf_addf(err, "Unable to open %s for writing. %s", lockpath,
+ strerror(errno));
goto error_free_return;
}
written = write_in_full(fd, ref, len);
if (close(fd) != 0 || written != len) {
- error("Unable to write to %s", lockpath);
+ strbuf_addf(err, "Unable to write to %s. %s", lockpath,
+ strerror(errno));
goto error_unlink_return;
}
if (rename(lockpath, git_HEAD) < 0) {
- error("Unable to create %s", git_HEAD);
+ strbuf_addf(err, "Unable to create %s. %s", git_HEAD,
+ strerror(errno));
goto error_unlink_return;
}
if (adjust_shared_perm(git_HEAD)) {
- error("Unable to fix permissions on %s", lockpath);
+ strbuf_addf(err, "Unable to fix permissions on %s", lockpath);
error_unlink_return:
unlink_or_warn(lockpath);
error_free_return:
@@ -3161,10 +3166,11 @@ int create_symref(const char *ref_target, const char *refs_heads_master,
done:
#endif
if (logmsg && !read_ref(refs_heads_master, new_sha1) &&
- log_ref_write(ref_target, old_sha1, new_sha1, logmsg, &err))
- error("%s", err.buf);
+ log_ref_write(ref_target, old_sha1, new_sha1, logmsg, err)) {
+ error("%s", err->buf);
+ strbuf_release(err);
+ }
- strbuf_release(&err);
free(git_HEAD);
return 0;
}