aboutsummaryrefslogtreecommitdiff
path: root/refs
diff options
context:
space:
mode:
Diffstat (limited to 'refs')
-rw-r--r--refs/files-backend.c41
1 files changed, 20 insertions, 21 deletions
diff --git a/refs/files-backend.c b/refs/files-backend.c
index c648b5e85..d6f912363 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -2811,58 +2811,57 @@ static int commit_ref_update(struct ref_lock *lock,
return 0;
}
-int create_symref(const char *ref_target, const char *refs_heads_master,
- const char *logmsg)
+int create_symref(const char *refname, const char *target, const char *logmsg)
{
char *lockpath = NULL;
- char ref[1000];
+ char buf[1000];
int fd, len, written;
- char *git_HEAD = git_pathdup("%s", ref_target);
+ char *ref_path = git_pathdup("%s", refname);
unsigned char old_sha1[20], new_sha1[20];
struct strbuf err = STRBUF_INIT;
- if (logmsg && read_ref(ref_target, old_sha1))
+ if (logmsg && read_ref(refname, 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(ref_path) < 0)
+ return error("unable to create directory for %s", ref_path);
#ifndef NO_SYMLINK_HEAD
if (prefer_symlink_refs) {
- unlink(git_HEAD);
- if (!symlink(refs_heads_master, git_HEAD))
+ unlink(ref_path);
+ if (!symlink(target, ref_path))
goto done;
fprintf(stderr, "no symlink - falling back to symbolic ref\n");
}
#endif
- len = snprintf(ref, sizeof(ref), "ref: %s\n", refs_heads_master);
- if (sizeof(ref) <= len) {
- error("refname too long: %s", refs_heads_master);
+ len = snprintf(buf, sizeof(buf), "ref: %s\n", target);
+ if (sizeof(buf) <= len) {
+ error("refname too long: %s", target);
goto error_free_return;
}
- lockpath = mkpathdup("%s.lock", git_HEAD);
+ lockpath = mkpathdup("%s.lock", ref_path);
fd = open(lockpath, O_CREAT | O_EXCL | O_WRONLY, 0666);
if (fd < 0) {
error("Unable to open %s for writing", lockpath);
goto error_free_return;
}
- written = write_in_full(fd, ref, len);
+ written = write_in_full(fd, buf, len);
if (close(fd) != 0 || written != len) {
error("Unable to write to %s", lockpath);
goto error_unlink_return;
}
- if (rename(lockpath, git_HEAD) < 0) {
- error("Unable to create %s", git_HEAD);
+ if (rename(lockpath, ref_path) < 0) {
+ error("Unable to create %s", ref_path);
goto error_unlink_return;
}
- if (adjust_shared_perm(git_HEAD)) {
+ if (adjust_shared_perm(ref_path)) {
error("Unable to fix permissions on %s", lockpath);
error_unlink_return:
unlink_or_warn(lockpath);
error_free_return:
free(lockpath);
- free(git_HEAD);
+ free(ref_path);
return -1;
}
free(lockpath);
@@ -2870,13 +2869,13 @@ int create_symref(const char *ref_target, const char *refs_heads_master,
#ifndef NO_SYMLINK_HEAD
done:
#endif
- if (logmsg && !read_ref(refs_heads_master, new_sha1) &&
- log_ref_write(ref_target, old_sha1, new_sha1, logmsg, 0, &err)) {
+ if (logmsg && !read_ref(target, new_sha1) &&
+ log_ref_write(refname, old_sha1, new_sha1, logmsg, 0, &err)) {
error("%s", err.buf);
strbuf_release(&err);
}
- free(git_HEAD);
+ free(ref_path);
return 0;
}