refs/files: use correct error type when lock exists

When fetching references into a repository, if a lock for a particular
reference exists, then `lock_raw_ref()` throws:

    - REF_TRANSACTION_ERROR_CASE_CONFLICT: when there is a conflict
    because the transaction contains conflicting references while being
    on a case-insensitive filesystem.

    - REF_TRANSACTION_ERROR_GENERIC: for all other errors.

The latter causes the entire set of batched updates to fail, even in
case sensitive filessystems.

Instead, return a 'REF_TRANSACTION_ERROR_CREATE_EXISTS' error. This
allows batched updates to reject the individual update which conflicts
with the existing file, while updating the rest of the references.

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
2025-09-17 17:25:12 +02:00
committed by Junio C Hamano
parent 3c07063231
commit 9b62a67bdb
2 changed files with 44 additions and 3 deletions

View File

@@ -1546,6 +1546,32 @@ test_expect_success CASE_INSENSITIVE_FS,REFFILES 'existing references in a case
)
'
test_expect_success REFFILES 'existing reference lock in repo' '
test_when_finished rm -rf base repo &&
(
git init --ref-format=reftable base &&
cd base &&
echo >file update &&
git add . &&
git commit -m "updated" &&
git branch -M main &&
git update-ref refs/heads/foo @ &&
git update-ref refs/heads/branch @ &&
cd .. &&
git init --ref-format=files --bare repo &&
cd repo &&
git remote add origin ../base &&
touch refs/heads/foo.lock &&
test_must_fail git fetch -f origin "refs/heads/*:refs/heads/*" 2>err &&
test_grep "error: fetching ref refs/heads/foo failed: reference already exists" err &&
git rev-parse refs/heads/main >expect &&
git rev-parse refs/heads/branch >actual &&
test_cmp expect actual
)
'
. "$TEST_DIRECTORY"/lib-httpd.sh
start_httpd