refs: introduce the ref_transaction_update_reflog function

Introduce a new function `ref_transaction_update_reflog`, for clients to
add a reflog update to a transaction. While the existing function
`ref_transaction_update` also allows clients to add a reflog entry, this
function does a few things more, It:
  - Enforces that only a reflog entry is added and does not update the
  ref itself.
  - Allows the users to also provide the committer information. This
  means clients can add reflog entries with custom committer
  information.

The `transaction_refname_valid()` function also modifies the error
message selectively based on the type of the update. This change also
affects reflog updates which go through `ref_transaction_update()`.

A follow up commit will utilize this function to add reflog support to
`git refs migrate`.

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-12-16 17:44:31 +01:00
committed by Junio C Hamano
parent 4483be36f4
commit 84675fa271
3 changed files with 65 additions and 12 deletions

View File

@ -3080,10 +3080,12 @@ static int files_transaction_finish_initial(struct files_ref_store *refs,
}
/*
* packed-refs don't support symbolic refs and root refs, so we
* have to queue these references via the loose transaction.
* packed-refs don't support symbolic refs, root refs and reflogs,
* so we have to queue these references via the loose transaction.
*/
if (update->new_target || is_root_ref(update->refname)) {
if (update->new_target ||
is_root_ref(update->refname) ||
(update->flags & REF_LOG_ONLY)) {
if (!loose_transaction) {
loose_transaction = ref_store_transaction_begin(&refs->base, 0, err);
if (!loose_transaction) {
@ -3092,11 +3094,17 @@ static int files_transaction_finish_initial(struct files_ref_store *refs,
}
}
ref_transaction_add_update(loose_transaction, update->refname,
update->flags & ~REF_HAVE_OLD,
update->new_target ? NULL : &update->new_oid, NULL,
update->new_target, NULL, update->committer_info,
NULL);
if (update->flags & REF_LOG_ONLY)
ref_transaction_add_update(loose_transaction, update->refname,
update->flags, &update->new_oid,
&update->old_oid, NULL, NULL,
update->committer_info, update->msg);
else
ref_transaction_add_update(loose_transaction, update->refname,
update->flags & ~REF_HAVE_OLD,
update->new_target ? NULL : &update->new_oid, NULL,
update->new_target, NULL, update->committer_info,
NULL);
} else {
ref_transaction_add_update(packed_transaction, update->refname,
update->flags & ~REF_HAVE_OLD,