aboutsummaryrefslogtreecommitdiff
path: root/builtin
diff options
context:
space:
mode:
authorKarthik Nayak <karthik.188@gmail.com>2026-01-25 23:52:40 +0100
committerJunio C Hamano <gitster@pobox.com>2026-01-25 22:27:34 -0800
commit2ea49f21e39de63481a6faf93e82a4b35f0e0ca2 (patch)
treeb70ba133d4407c2079e107fe3279a2db9f9b2601 /builtin
parent274f4355527275515a2c7c5f5a1214cf57b06338 (diff)
downloadgit-2ea49f21e39de63481a6faf93e82a4b35f0e0ca2.tar.xz
receive-pack: utilize rejected ref error details
In 9d2962a7c4 (receive-pack: use batched reference updates, 2025-05-19), git-receive-pack(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. Now that the updates also contain detailed error message, propagate those to the client via 'rp_error'. The detailed error messages can be very verbose, for e.g. in the files backend, when trying to write a non-commit object to a branch, you would see: ! [remote rejected] 3eaec9ccf3a53f168362a6b3fdeb73426fb9813d -> branch (cannot update ref 'refs/heads/branch': trying to write non-commit object 3eaec9ccf3a53f168362a6b3fdeb73426fb9813d to branch 'refs/heads/branch') Here the refname is repeated multiple times due to how error messages are propagated and filled over the code stack. This potentially can be cleaned up in a future commit. Reported-by: Elijah Newren <newren@gmail.com> Co-authored-by: Jeff King <peff@peff.net> Signed-off-by: Jeff King <peff@peff.net> Signed-off-by: Karthik Nayak <karthik.188@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'builtin')
-rw-r--r--builtin/receive-pack.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/builtin/receive-pack.c b/builtin/receive-pack.c
index 94d3e73cee..70e04b3efb 100644
--- a/builtin/receive-pack.c
+++ b/builtin/receive-pack.c
@@ -1813,11 +1813,14 @@ 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 strmap *failed_refs = cb_data;
+ if (details)
+ rp_error("%s", details);
+
strmap_put(failed_refs, refname, (char *)ref_transaction_error_msg(err));
}
@@ -1884,6 +1887,7 @@ static void execute_commands_non_atomic(struct command *commands,
}
ref_transaction_for_each_rejected_update(transaction,
+
ref_transaction_rejection_handler,
&failed_refs);
@@ -1895,7 +1899,7 @@ static void execute_commands_non_atomic(struct command *commands,
if (reported_error)
cmd->error_string = reported_error;
else if (strmap_contains(&failed_refs, cmd->ref_name))
- cmd->error_string = strmap_get(&failed_refs, cmd->ref_name);
+ cmd->error_string = cmd->error_string_owned = xstrdup(strmap_get(&failed_refs, cmd->ref_name));
}
cleanup: