aboutsummaryrefslogtreecommitdiffstats
path: root/refs
diff options
context:
space:
mode:
authorPatrick Steinhardt <ps@pks.im>2024-04-08 14:23:56 +0200
committerJunio C Hamano <gitster@pobox.com>2024-04-08 16:59:01 -0700
commit455d61b6d22b41176194483f82c9caa531661bec (patch)
tree1a8c5edc0b2d3dd09117adb81e62bc13b932b36b /refs
parentf57cc987a937bef3f6c8e4911cf98e0f51eee1e2 (diff)
downloadgit-455d61b6d22b41176194483f82c9caa531661bec.tar.gz
refs/reftable: perform explicit D/F check when writing symrefs
We already perform explicit D/F checks in all reftable callbacks which write refs, except when writing symrefs. For one this leads to an error message which isn't perfectly actionable because we only tell the user that there was a D/F conflict, but not which refs conflicted with each other. But second, once all ref updating callbacks explicitly check for D/F conflicts, we can disable the D/F checks in the reftable library itself and thus avoid some duplicated efforts. Refactor the code that writes symref tables to explicitly call into `refs_verify_refname_available()` when writing symrefs. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'refs')
-rw-r--r--refs/reftable-backend.c20
1 files changed, 17 insertions, 3 deletions
diff --git a/refs/reftable-backend.c b/refs/reftable-backend.c
index 0358da14db..8a54b0d8b2 100644
--- a/refs/reftable-backend.c
+++ b/refs/reftable-backend.c
@@ -1217,6 +1217,7 @@ out:
struct write_create_symref_arg {
struct reftable_ref_store *refs;
struct reftable_stack *stack;
+ struct strbuf *err;
const char *refname;
const char *target;
const char *logmsg;
@@ -1239,6 +1240,11 @@ static int write_create_symref_table(struct reftable_writer *writer, void *cb_da
reftable_writer_set_limits(writer, ts, ts);
+ ret = refs_verify_refname_available(&create->refs->base, create->refname,
+ NULL, NULL, create->err);
+ if (ret < 0)
+ return ret;
+
ret = reftable_writer_add_ref(writer, &ref);
if (ret)
return ret;
@@ -1280,12 +1286,14 @@ static int reftable_be_create_symref(struct ref_store *ref_store,
struct reftable_ref_store *refs =
reftable_be_downcast(ref_store, REF_STORE_WRITE, "create_symref");
struct reftable_stack *stack = stack_for(refs, refname, &refname);
+ struct strbuf err = STRBUF_INIT;
struct write_create_symref_arg arg = {
.refs = refs,
.stack = stack,
.refname = refname,
.target = target,
.logmsg = logmsg,
+ .err = &err,
};
int ret;
@@ -1301,9 +1309,15 @@ static int reftable_be_create_symref(struct ref_store *ref_store,
done:
assert(ret != REFTABLE_API_ERROR);
- if (ret)
- error("unable to write symref for %s: %s", refname,
- reftable_error_str(ret));
+ if (ret) {
+ if (err.len)
+ error("%s", err.buf);
+ else
+ error("unable to write symref for %s: %s", refname,
+ reftable_error_str(ret));
+ }
+
+ strbuf_release(&err);
return ret;
}