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: '<ref>': reference is missing but expected <old-target>

which is very generic and doesn't indicate the mismatch of types. Let's
make this error more specific:

  cannot lock ref '<ref>': expected symref with target '<old-target>': but is a regular ref

so that users have a clearer understanding.

Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Karthik Nayak
2024-06-07 15:32:59 +02:00
committed by Junio C Hamano
parent aba381c090
commit aa6e99f122
2 changed files with 18 additions and 6 deletions

View File

@ -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;