From: Karthik Nayak Date: Fri, 7 Jun 2024 13:32:59 +0000 (+0200) Subject: refs: specify error for regular refs with `old_target` X-Git-Tag: v2.46.0-rc0~44^2~5 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=aa6e99f1226fe46f1649f48d020011e19556e8e1;p=thirdparty%2Fgit.git refs: specify error for regular refs with `old_target` When a reference update tries to update a symref, but the ref in question is actually a regular ref, we raise an error. However the error raised in this situation is: verifying symref target: '': reference is missing but expected which is very generic and doesn't indicate the mismatch of types. Let's make this error more specific: cannot lock ref '': expected symref with target '': but is a regular ref so that users have a clearer understanding. Signed-off-by: Karthik Nayak Signed-off-by: Junio C Hamano --- diff --git a/refs/files-backend.c b/refs/files-backend.c index ef760869ca..d6f37963bc 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -2490,14 +2490,16 @@ static int lock_ref_for_update(struct files_ref_store *refs, /* * Even if the ref is a regular ref, if `old_target` is set, we - * check the referent value. Ideally `old_target` should only - * be set for symrefs, but we're strict about its usage. + * fail with an error. */ if (update->old_target) { - if (ref_update_check_old_target(referent.buf, update, err)) { - ret = TRANSACTION_GENERIC_ERROR; - goto out; - } + strbuf_addf(err, _("cannot lock ref '%s': " + "expected symref with target '%s': " + "but is a regular ref"), + ref_update_original_update_refname(update), + update->old_target); + ret = TRANSACTION_GENERIC_ERROR; + goto out; } else if (check_old_oid(update, &lock->old_oid, err)) { ret = TRANSACTION_GENERIC_ERROR; goto out; diff --git a/refs/reftable-backend.c b/refs/reftable-backend.c index 019b99181d..16f4ced7b6 100644 --- a/refs/reftable-backend.c +++ b/refs/reftable-backend.c @@ -931,6 +931,16 @@ static int reftable_be_transaction_prepare(struct ref_store *ref_store, * backend returns, which keeps our tests happy. */ if (u->old_target) { + if (!(u->type & REF_ISSYMREF)) { + strbuf_addf(err, _("cannot lock ref '%s': " + "expected symref with target '%s': " + "but is a regular ref"), + ref_update_original_update_refname(u), + u->old_target); + ret = -1; + goto done; + } + if (ref_update_check_old_target(referent.buf, u, err)) { ret = -1; goto done;