]> git.ipfire.org Git - thirdparty/git.git/commitdiff
fetch: utilize rejected ref error details
authorKarthik Nayak <karthik.188@gmail.com>
Fri, 16 Jan 2026 21:27:10 +0000 (22:27 +0100)
committerJunio C Hamano <gitster@pobox.com>
Fri, 16 Jan 2026 22:06:44 +0000 (14:06 -0800)
In 0e358de64a (fetch: use batched reference updates, 2025-05-19),
git-fetch(1) switched to using batched reference updates. This also
introduced a regression wherein instead of providing detailed error
messages for failed referenced updates, the users were provided generic
error messages based on the error type.

Similar to the previous commit, switch to using detailed error messages
if present for failed reference updates to fix this regression.

Reported-by: Elijah Newren <newren@gmail.com>
Co-authored-by: Jeff King <peff@peff.net>
Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/fetch.c
t/t5510-fetch.sh

index d427adea614eedbf0f99cb89509f0e0d23d1ef27..49495be0b693fb010c17f548fb23af29f5ea6617 100644 (file)
@@ -1649,7 +1649,7 @@ static void ref_transaction_rejection_handler(const char *refname,
                                              const char *old_target UNUSED,
                                              const char *new_target UNUSED,
                                              enum ref_transaction_error err,
-                                             const char *details UNUSED,
+                                             const char *details,
                                              void *cb_data)
 {
        struct ref_rejection_data *data = cb_data;
@@ -1674,9 +1674,11 @@ static void ref_transaction_rejection_handler(const char *refname,
                        "branches"), data->remote_name);
                data->conflict_msg_shown = true;
        } else {
-               const char *reason = ref_transaction_error_msg(err);
-
-               error(_("fetching ref %s failed: %s"), refname, reason);
+               if (details)
+                       error("%s", details);
+               else
+                       error(_("fetching ref %s failed: %s"),
+                             refname, ref_transaction_error_msg(err));
        }
 
        *data->retcode = 1;
index ce1c23684ece388a41ebae44696b1a22ba47626b..c69afb5a609343c0b5357cad6056ce7ffacd261b 100755 (executable)
@@ -1516,7 +1516,7 @@ test_expect_success REFFILES 'existing reference lock in 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 &&
+               test_grep -e "error: cannot lock ref ${SQ}refs/heads/foo${SQ}: Unable to create" -e "refs/heads/foo.lock${SQ}: File exists." err &&
                git rev-parse refs/heads/main >expect &&
                git rev-parse refs/heads/branch >actual &&
                test_cmp expect actual
@@ -1530,7 +1530,7 @@ test_expect_success CASE_INSENSITIVE_FS,REFFILES 'F/D conflict on case insensiti
                cd case_insensitive &&
                git remote add origin -- ../case_sensitive_fd &&
                test_must_fail git fetch -f origin "refs/heads/*:refs/heads/*" 2>err &&
-               test_grep "failed: refname conflict" err &&
+               test_grep "cannot process ${SQ}refs/remotes/origin/foo${SQ} and ${SQ}refs/remotes/origin/foo/bar${SQ} at the same time" err &&
                git rev-parse refs/heads/main >expect &&
                git rev-parse refs/heads/foo/bar >actual &&
                test_cmp expect actual
@@ -1544,7 +1544,7 @@ test_expect_success CASE_INSENSITIVE_FS,REFFILES 'D/F conflict on case insensiti
                cd case_insensitive &&
                git remote add origin -- ../case_sensitive_df &&
                test_must_fail git fetch -f origin "refs/heads/*:refs/heads/*" 2>err &&
-               test_grep "failed: refname conflict" err &&
+               test_grep "cannot lock ref ${SQ}refs/remotes/origin/foo${SQ}: there is a non-empty directory ${SQ}./refs/remotes/origin/foo${SQ} blocking reference ${SQ}refs/remotes/origin/foo${SQ}" err &&
                git rev-parse refs/heads/main >expect &&
                git rev-parse refs/heads/Foo/bar >actual &&
                test_cmp expect actual
@@ -1658,7 +1658,7 @@ test_expect_success REFFILES "FETCH_HEAD is updated even if ref updates fail" '
                git remote add origin ../base &&
                >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 &&
+               test_grep -e "error: cannot lock ref ${SQ}refs/heads/foo${SQ}: Unable to create" -e "refs/heads/foo.lock${SQ}: File exists." err &&
                test_grep "branch ${SQ}branch${SQ} of ../base" FETCH_HEAD &&
                test_grep "branch ${SQ}foo${SQ} of ../base" FETCH_HEAD
        )