From: Junio C Hamano <gitster@pobox.com>
To: Phillip Wood <phillip.wood123@gmail.com>
Cc: Karthik Nayak <karthik.188@gmail.com>,
git@vger.kernel.org, Jeff King <peff@peff.net>,
newren@gmail.com
Subject: Re: [PATCH v3 6/6] fetch: delay user information post committing of transaction
Date: Wed, 21 Jan 2026 10:43:51 -0800 [thread overview]
Message-ID: <xmqqldhqu7q0.fsf@gitster.g> (raw)
In-Reply-To: <67808128-5f41-4ae5-b224-a76048cd82c8@gmail.com> (Phillip Wood's message of "Wed, 21 Jan 2026 16:21:20 +0000")
Phillip Wood <phillip.wood123@gmail.com> writes:
>> +struct ref_update_display_info {
>> + bool failed;
>> + char success_code;
>> + char fail_code;
>> + const char *summary;
>> + const char *fail_detail;
>> + const char *success_detail;
>> + const char *ref;
>> + const char *remote;
>> + struct object_id old_oid;
>> + struct object_id new_oid;
>> +};
>
> I was expecting that we'd pass around a struct like
>
> struct ref_update_display_info_array {
> size_t alloc, nr;
> ref_update_display_info *info;
> };
>
> rather than passing a pointer, count pair as separate parameters. That
> would also allow us to use ALLOC_GROW() rather than reallocating the
> array each time we append to it which is rather inefficient.
>
> Thanks
Indeed. That sounds like a sensible way to keep track of them.
>
> Phillip
>
>> +static struct ref_update_display_info *ref_update_display_info_append(
>> + struct ref_update_display_info **list,
>> + size_t *count,
>> + char success_code,
>> + char fail_code,
>> + const char *summary,
>> + const char *success_detail,
>> + const char *fail_detail,
>> + const char *ref,
>> + const char *remote,
>> + const struct object_id *old_oid,
>> + const struct object_id *new_oid)
>> +{
>> + struct ref_update_display_info *info;
>> + size_t index = *count;
>> +
>> + (*count)++;
>> + REALLOC_ARRAY(*list, *count);
>> +
>> + info = &(*list)[index];
>> +
>> + info->failed = false;
>> + info->success_code = success_code;
>> + info->fail_code = fail_code;
>> + info->summary = xstrdup(summary);
>> + info->success_detail = xstrdup_or_null(success_detail);
>> + info->fail_detail = xstrdup_or_null(fail_detail);
>> + info->remote = xstrdup(remote);
>> + info->ref = xstrdup(ref);
>> +
>> + oidcpy(&info->old_oid, old_oid);
>> + oidcpy(&info->new_oid, new_oid);
>> +
>> + return info;
>> +}
>> +
>> +static void ref_update_display_info_set_failed(struct ref_update_display_info *info)
>> +{
>> + info->failed = true;
>> +}
>> +
>> +static void ref_update_display_info_free(struct ref_update_display_info *info)
>> +{
>> + free((char *)info->summary);
>> + free((char *)info->success_detail);
>> + free((char *)info->fail_detail);
>> + free((char *)info->remote);
>> + free((char *)info->ref);
>> +}
>> +
>> +static void ref_update_display_info_display(struct ref_update_display_info *info,
>> + struct display_state *display_state,
>> + int summary_width)
>> +{
>> + display_ref_update(display_state,
>> + info->failed ? info->fail_code : info->success_code,
>> + info->summary,
>> + info->failed ? info->fail_detail : info->success_detail,
>> + info->remote, info->ref, &info->old_oid,
>> + &info->new_oid, summary_width);
>> +}
>> +
>> static int update_local_ref(struct ref *ref,
>> struct ref_transaction *transaction,
>> - struct display_state *display_state,
>> const struct ref *remote_ref,
>> - int summary_width,
>> - const struct fetch_config *config)
>> + const struct fetch_config *config,
>> + struct ref_update_display_info **display_list,
>> + size_t *display_count)
>> {
>> struct commit *current = NULL, *updated;
>> int fast_forward = 0;
>> @@ -877,41 +952,56 @@ static int update_local_ref(struct ref *ref,
>>
>> if (oideq(&ref->old_oid, &ref->new_oid)) {
>> if (verbosity > 0)
>> - display_ref_update(display_state, '=', _("[up to date]"), NULL,
>> - remote_ref->name, ref->name,
>> - &ref->old_oid, &ref->new_oid, summary_width);
>> + ref_update_display_info_append(display_list, display_count,
>> + '=', '=', _("[up to date]"),
>> + NULL, NULL, ref->name,
>> + remote_ref->name, &ref->old_oid,
>> + &ref->new_oid);
>> return 0;
>> }
>>
>> if (!update_head_ok &&
>> !is_null_oid(&ref->old_oid) &&
>> branch_checked_out(ref->name)) {
>> + struct ref_update_display_info *info;
>> /*
>> * If this is the head, and it's not okay to update
>> * the head, and the old value of the head isn't empty...
>> */
>> - display_ref_update(display_state, '!', _("[rejected]"),
>> - _("can't fetch into checked-out branch"),
>> - remote_ref->name, ref->name,
>> - &ref->old_oid, &ref->new_oid, summary_width);
>> + info = ref_update_display_info_append(display_list, display_count,
>> + '!', '!', _("[rejected]"),
>> + NULL, _("can't fetch into checked-out branch"),
>> + ref->name, remote_ref->name,
>> + &ref->old_oid, &ref->new_oid);
>> + ref_update_display_info_set_failed(info);
>> return 1;
>> }
>>
>> if (!is_null_oid(&ref->old_oid) &&
>> starts_with(ref->name, "refs/tags/")) {
>> + struct ref_update_display_info *info;
>> +
>> if (force || ref->force) {
>> int r;
>> +
>> r = s_update_ref("updating tag", ref, transaction, 0);
>> - display_ref_update(display_state, r ? '!' : 't', _("[tag update]"),
>> - r ? _("unable to update local ref") : NULL,
>> - remote_ref->name, ref->name,
>> - &ref->old_oid, &ref->new_oid, summary_width);
>> +
>> + info = ref_update_display_info_append(display_list, display_count,
>> + 't', '!', _("[tag update]"), NULL,
>> + _("unable to update local ref"),
>> + ref->name, remote_ref->name,
>> + &ref->old_oid, &ref->new_oid);
>> + if (r)
>> + ref_update_display_info_set_failed(info);
>> +
>> return r;
>> } else {
>> - display_ref_update(display_state, '!', _("[rejected]"),
>> - _("would clobber existing tag"),
>> - remote_ref->name, ref->name,
>> - &ref->old_oid, &ref->new_oid, summary_width);
>> + info = ref_update_display_info_append(display_list, display_count,
>> + '!', '!', _("[rejected]"), NULL,
>> + _("would clobber existing tag"),
>> + ref->name, remote_ref->name,
>> + &ref->old_oid, &ref->new_oid);
>> + ref_update_display_info_set_failed(info);
>> return 1;
>> }
>> }
>> @@ -921,6 +1011,7 @@ static int update_local_ref(struct ref *ref,
>> updated = lookup_commit_reference_gently(the_repository,
>> &ref->new_oid, 1);
>> if (!current || !updated) {
>> + struct ref_update_display_info *info;
>> const char *msg;
>> const char *what;
>> int r;
>> @@ -941,10 +1032,15 @@ static int update_local_ref(struct ref *ref,
>> }
>>
>> r = s_update_ref(msg, ref, transaction, 0);
>> - display_ref_update(display_state, r ? '!' : '*', what,
>> - r ? _("unable to update local ref") : NULL,
>> - remote_ref->name, ref->name,
>> - &ref->old_oid, &ref->new_oid, summary_width);
>> +
>> + info = ref_update_display_info_append(display_list, display_count,
>> + '*', '!', what, NULL,
>> + _("unable to update local ref"),
>> + ref->name, remote_ref->name,
>> + &ref->old_oid, &ref->new_oid);
>> + if (r)
>> + ref_update_display_info_set_failed(info);
>> +
>> return r;
>> }
>>
>> @@ -960,6 +1056,7 @@ static int update_local_ref(struct ref *ref,
>> }
>>
>> if (fast_forward) {
>> + struct ref_update_display_info *info;
>> struct strbuf quickref = STRBUF_INIT;
>> int r;
>>
>> @@ -967,29 +1064,46 @@ static int update_local_ref(struct ref *ref,
>> strbuf_addstr(&quickref, "..");
>> strbuf_add_unique_abbrev(&quickref, &ref->new_oid, DEFAULT_ABBREV);
>> r = s_update_ref("fast-forward", ref, transaction, 1);
>> - display_ref_update(display_state, r ? '!' : ' ', quickref.buf,
>> - r ? _("unable to update local ref") : NULL,
>> - remote_ref->name, ref->name,
>> - &ref->old_oid, &ref->new_oid, summary_width);
>> +
>> + info = ref_update_display_info_append(display_list, display_count,
>> + ' ', '!', quickref.buf, NULL,
>> + _("unable to update local ref"),
>> + ref->name, remote_ref->name,
>> + &ref->old_oid, &ref->new_oid);
>> + if (r)
>> + ref_update_display_info_set_failed(info);
>> +
>> strbuf_release(&quickref);
>> return r;
>> } else if (force || ref->force) {
>> + struct ref_update_display_info *info;
>> struct strbuf quickref = STRBUF_INIT;
>> int r;
>> +
>> strbuf_add_unique_abbrev(&quickref, ¤t->object.oid, DEFAULT_ABBREV);
>> strbuf_addstr(&quickref, "...");
>> strbuf_add_unique_abbrev(&quickref, &ref->new_oid, DEFAULT_ABBREV);
>> r = s_update_ref("forced-update", ref, transaction, 1);
>> - display_ref_update(display_state, r ? '!' : '+', quickref.buf,
>> - r ? _("unable to update local ref") : _("forced update"),
>> - remote_ref->name, ref->name,
>> - &ref->old_oid, &ref->new_oid, summary_width);
>> +
>> + info = ref_update_display_info_append(display_list, display_count,
>> + '+', '!', quickref.buf, _("forced update"),
>> + _("unable to update local ref"),
>> + ref->name, remote_ref->name,
>> + &ref->old_oid, &ref->new_oid);
>> +
>> + if (r)
>> + ref_update_display_info_set_failed(info);
>> +
>> strbuf_release(&quickref);
>> return r;
>> } else {
>> - display_ref_update(display_state, '!', _("[rejected]"), _("non-fast-forward"),
>> - remote_ref->name, ref->name,
>> - &ref->old_oid, &ref->new_oid, summary_width);
>> + struct ref_update_display_info *info;
>> + info = ref_update_display_info_append(display_list, display_count,
>> + '!', '!', _("[rejected]"), NULL,
>> + _("non-fast-forward"),
>> + ref->name, remote_ref->name,
>> + &ref->old_oid, &ref->new_oid);
>> + ref_update_display_info_set_failed(info);
>> return 1;
>> }
>> }
>> @@ -1103,17 +1217,15 @@ static int store_updated_refs(struct display_state *display_state,
>> int connectivity_checked,
>> struct ref_transaction *transaction, struct ref *ref_map,
>> struct fetch_head *fetch_head,
>> - const struct fetch_config *config)
>> + const struct fetch_config *config,
>> + struct ref_update_display_info **display_list,
>> + size_t *display_count)
>> {
>> int rc = 0;
>> struct strbuf note = STRBUF_INIT;
>> const char *what, *kind;
>> struct ref *rm;
>> int want_status;
>> - int summary_width = 0;
>> -
>> - if (verbosity >= 0)
>> - summary_width = transport_summary_width(ref_map);
>>
>> if (!connectivity_checked) {
>> struct check_connected_options opt = CHECK_CONNECTED_INIT;
>> @@ -1218,8 +1330,9 @@ static int store_updated_refs(struct display_state *display_state,
>> display_state->url_len);
>>
>> if (ref) {
>> - rc |= update_local_ref(ref, transaction, display_state,
>> - rm, summary_width, config);
>> + rc |= update_local_ref(ref, transaction, rm,
>> + config, display_list,
>> + display_count);
>> free(ref);
>> } else if (write_fetch_head || dry_run) {
>> /*
>> @@ -1227,12 +1340,11 @@ static int store_updated_refs(struct display_state *display_state,
>> * would be written to FETCH_HEAD, if --dry-run
>> * is set).
>> */
>> - display_ref_update(display_state, '*',
>> - *kind ? kind : "branch", NULL,
>> - rm->name,
>> - "FETCH_HEAD",
>> - &rm->new_oid, &rm->old_oid,
>> - summary_width);
>> +
>> + ref_update_display_info_append(display_list, display_count,
>> + '*', '*', *kind ? kind : "branch",
>> + NULL, NULL, "FETCH_HEAD", rm->name,
>> + &rm->new_oid, &rm->old_oid);
>> }
>> }
>> }
>> @@ -1300,7 +1412,9 @@ static int fetch_and_consume_refs(struct display_state *display_state,
>> struct ref_transaction *transaction,
>> struct ref *ref_map,
>> struct fetch_head *fetch_head,
>> - const struct fetch_config *config)
>> + const struct fetch_config *config,
>> + struct ref_update_display_info **display_list,
>> + size_t *display_count)
>> {
>> int connectivity_checked = 1;
>> int ret;
>> @@ -1322,7 +1436,8 @@ static int fetch_and_consume_refs(struct display_state *display_state,
>>
>> trace2_region_enter("fetch", "consume_refs", the_repository);
>> ret = store_updated_refs(display_state, connectivity_checked,
>> - transaction, ref_map, fetch_head, config);
>> + transaction, ref_map, fetch_head, config,
>> + display_list, display_count);
>> trace2_region_leave("fetch", "consume_refs", the_repository);
>>
>> out:
>> @@ -1493,7 +1608,9 @@ static int backfill_tags(struct display_state *display_state,
>> struct ref_transaction *transaction,
>> struct ref *ref_map,
>> struct fetch_head *fetch_head,
>> - const struct fetch_config *config)
>> + const struct fetch_config *config,
>> + struct ref_update_display_info **display_list,
>> + size_t *display_count)
>> {
>> int retcode, cannot_reuse;
>>
>> @@ -1515,7 +1632,7 @@ static int backfill_tags(struct display_state *display_state,
>> transport_set_option(transport, TRANS_OPT_DEPTH, "0");
>> transport_set_option(transport, TRANS_OPT_DEEPEN_RELATIVE, NULL);
>> retcode = fetch_and_consume_refs(display_state, transport, transaction, ref_map,
>> - fetch_head, config);
>> + fetch_head, config, display_list, display_count);
>>
>> if (gsecondary) {
>> transport_disconnect(gsecondary);
>> @@ -1641,6 +1758,7 @@ struct ref_rejection_data {
>> bool conflict_msg_shown;
>> bool case_sensitive_msg_shown;
>> const char *remote_name;
>> + struct strmap *rejected_refs;
>> };
>>
>> static void ref_transaction_rejection_handler(const char *refname,
>> @@ -1681,6 +1799,7 @@ static void ref_transaction_rejection_handler(const char *refname,
>> refname, ref_transaction_error_msg(err));
>> }
>>
>> + strmap_put(data->rejected_refs, refname, NULL);
>> *data->retcode = 1;
>> }
>>
>> @@ -1690,6 +1809,7 @@ static void ref_transaction_rejection_handler(const char *refname,
>> */
>> static int commit_ref_transaction(struct ref_transaction **transaction,
>> bool is_atomic, const char *remote_name,
>> + struct strmap *rejected_refs,
>> struct strbuf *err)
>> {
>> int retcode = ref_transaction_commit(*transaction, err);
>> @@ -1701,6 +1821,7 @@ static int commit_ref_transaction(struct ref_transaction **transaction,
>> .conflict_msg_shown = 0,
>> .remote_name = remote_name,
>> .retcode = &retcode,
>> + .rejected_refs = rejected_refs,
>> };
>>
>> ref_transaction_for_each_rejected_update(*transaction,
>> @@ -1729,6 +1850,10 @@ static int do_fetch(struct transport *transport,
>> struct fetch_head fetch_head = { 0 };
>> struct strbuf err = STRBUF_INIT;
>> int do_set_head = 0;
>> + struct ref_update_display_info *display_list = NULL;
>> + struct strmap rejected_refs = STRMAP_INIT;
>> + size_t display_count = 0;
>> + int summary_width = 0;
>>
>> if (tags == TAGS_DEFAULT) {
>> if (transport->remote->fetch_tags == 2)
>> @@ -1853,7 +1978,7 @@ static int do_fetch(struct transport *transport,
>> }
>>
>> if (fetch_and_consume_refs(&display_state, transport, transaction, ref_map,
>> - &fetch_head, config)) {
>> + &fetch_head, config, &display_list, &display_count)) {
>> retcode = 1;
>> goto cleanup;
>> }
>> @@ -1876,7 +2001,7 @@ static int do_fetch(struct transport *transport,
>> * the transaction and don't commit anything.
>> */
>> if (backfill_tags(&display_state, transport, transaction, tags_ref_map,
>> - &fetch_head, config))
>> + &fetch_head, config, &display_list, &display_count))
>> retcode = 1;
>> }
>>
>> @@ -1886,8 +2011,12 @@ static int do_fetch(struct transport *transport,
>> if (retcode)
>> goto cleanup;
>>
>> + if (verbosity >= 0)
>> + summary_width = transport_summary_width(ref_map);
>> +
>> retcode = commit_ref_transaction(&transaction, atomic_fetch,
>> - transport->remote->name, &err);
>> + transport->remote->name,
>> + &rejected_refs, &err);
>> /*
>> * With '--atomic', bail out if the transaction fails. Without '--atomic',
>> * continue to fetch head and perform other post-fetch operations.
>> @@ -1965,7 +2094,17 @@ static int do_fetch(struct transport *transport,
>> */
>> if (retcode && !atomic_fetch && transaction)
>> commit_ref_transaction(&transaction, false,
>> - transport->remote->name, &err);
>> + transport->remote->name,
>> + &rejected_refs, &err);
>> +
>> + for (size_t i = 0; i < display_count; i++) {
>> + struct ref_update_display_info *info = &display_list[i];
>> +
>> + if (!info->failed && strmap_contains(&rejected_refs, info->ref))
>> + ref_update_display_info_set_failed(info);
>> + ref_update_display_info_display(info, &display_state, summary_width);
>> + ref_update_display_info_free(info);
>> + }
>>
>> if (retcode) {
>> if (err.len) {
>> @@ -1980,6 +2119,9 @@ static int do_fetch(struct transport *transport,
>>
>> if (transaction)
>> ref_transaction_free(transaction);
>> +
>> + free(display_list);
>> + strmap_clear(&rejected_refs, 0);
>> display_state_release(&display_state);
>> close_fetch_head(&fetch_head);
>> strbuf_release(&err);
>> diff --git a/t/t5516-fetch-push.sh b/t/t5516-fetch-push.sh
>> index 45595991c8..29e2f17608 100755
>> --- a/t/t5516-fetch-push.sh
>> +++ b/t/t5516-fetch-push.sh
>> @@ -1893,6 +1893,7 @@ test_expect_success 'pushing non-commit objects should report error' '
>>
>> tagsha=$(git rev-parse test^{tag}) &&
>> test_must_fail git push ../dest "$tagsha:refs/heads/branch" 2>err &&
>> + test_grep "! \[remote rejected\] $tagsha -> branch (invalid new value provided)" err &&
>> test_grep "trying to write non-commit object $tagsha to branch ${SQ}refs/heads/branch${SQ}" err
>> )
>> '
>>
next prev parent reply other threads:[~2026-01-21 18:43 UTC|newest]
Thread overview: 68+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-01-14 15:40 [PATCH 0/6] refs: provide detailed error messages when using batched update Karthik Nayak
2026-01-14 15:40 ` [PATCH 1/6] refs: remove unused header Karthik Nayak
2026-01-14 17:08 ` Junio C Hamano
2026-01-15 9:50 ` Karthik Nayak
2026-01-14 15:40 ` [PATCH 2/6] refs: attach rejection details to updates Karthik Nayak
2026-01-14 17:43 ` Jeff King
2026-01-15 10:02 ` Karthik Nayak
2026-01-15 20:29 ` Jeff King
2026-01-16 17:56 ` Karthik Nayak
2026-01-14 15:40 ` [PATCH 3/6] refs: add rejection detail to the callback function Karthik Nayak
2026-01-14 17:44 ` Jeff King
2026-01-15 10:10 ` Karthik Nayak
2026-01-14 15:40 ` [PATCH 4/6] update-ref: utilize rejected error details if available Karthik Nayak
2026-01-14 17:27 ` Junio C Hamano
2026-01-14 17:55 ` Jeff King
2026-01-15 11:08 ` Karthik Nayak
2026-01-14 15:40 ` [PATCH 5/6] fetch: utilize rejected ref error details Karthik Nayak
2026-01-14 17:33 ` Junio C Hamano
2026-01-15 10:54 ` Karthik Nayak
2026-01-14 18:00 ` Jeff King
2026-01-15 15:20 ` Karthik Nayak
2026-01-14 15:40 ` [PATCH 6/6] receive-pack: " Karthik Nayak
2026-01-14 18:03 ` Jeff King
2026-01-15 15:21 ` Karthik Nayak
2026-01-14 16:45 ` [PATCH 0/6] refs: provide detailed error messages when using batched update Junio C Hamano
2026-01-16 21:27 ` [PATCH v2 0/7] " Karthik Nayak
2026-01-16 21:27 ` [PATCH v2 1/7] refs: drop unnecessary header includes Karthik Nayak
2026-01-18 12:07 ` SZEDER Gábor
2026-01-19 8:53 ` Karthik Nayak
2026-01-16 21:27 ` [PATCH v2 2/7] refs: skip to next ref when current ref is rejected Karthik Nayak
2026-01-16 21:27 ` [PATCH v2 3/7] refs: add rejection detail to the callback function Karthik Nayak
2026-01-16 21:27 ` [PATCH v2 4/7] update-ref: utilize rejected error details if available Karthik Nayak
2026-01-16 21:27 ` [PATCH v2 5/7] fetch: utilize rejected ref error details Karthik Nayak
2026-01-16 21:27 ` [PATCH v2 6/7] receive-pack: " Karthik Nayak
2026-01-16 21:27 ` [PATCH v2 7/7] fetch: delay user information post committing of transaction Karthik Nayak
2026-01-17 13:56 ` Phillip Wood
2026-01-19 16:11 ` Karthik Nayak
2026-01-20 9:59 ` [PATCH v3 0/6] refs: provide detailed error messages when using batched update Karthik Nayak
2026-01-20 9:59 ` [PATCH v3 1/6] refs: skip to next ref when current ref is rejected Karthik Nayak
2026-01-20 9:59 ` [PATCH v3 2/6] refs: add rejection detail to the callback function Karthik Nayak
2026-01-20 9:59 ` [PATCH v3 3/6] update-ref: utilize rejected error details if available Karthik Nayak
2026-01-20 9:59 ` [PATCH v3 4/6] fetch: utilize rejected ref error details Karthik Nayak
2026-01-20 9:59 ` [PATCH v3 5/6] receive-pack: " Karthik Nayak
2026-01-20 9:59 ` [PATCH v3 6/6] fetch: delay user information post committing of transaction Karthik Nayak
2026-01-21 16:21 ` Phillip Wood
2026-01-21 18:43 ` Junio C Hamano [this message]
2026-01-22 9:05 ` Karthik Nayak
2026-01-21 18:12 ` [PATCH v3 0/6] refs: provide detailed error messages when using batched update Junio C Hamano
2026-01-22 12:04 ` [PATCH v4 " Karthik Nayak
2026-01-22 12:04 ` [PATCH v4 1/6] refs: skip to next ref when current ref is rejected Karthik Nayak
2026-01-22 12:04 ` [PATCH v4 2/6] refs: add rejection detail to the callback function Karthik Nayak
2026-01-22 12:04 ` [PATCH v4 3/6] update-ref: utilize rejected error details if available Karthik Nayak
2026-01-22 12:04 ` [PATCH v4 4/6] fetch: utilize rejected ref error details Karthik Nayak
2026-01-22 12:04 ` [PATCH v4 5/6] receive-pack: " Karthik Nayak
2026-01-22 12:05 ` [PATCH v4 6/6] fetch: delay user information post committing of transaction Karthik Nayak
2026-01-22 20:10 ` Junio C Hamano
2026-01-23 14:49 ` Karthik Nayak
2026-01-23 17:57 ` Junio C Hamano
2026-01-25 18:47 ` Karthik Nayak
2026-01-23 14:41 ` Phillip Wood
2026-01-23 14:50 ` Karthik Nayak
2026-01-25 22:52 ` [PATCH v5 0/6] refs: provide detailed error messages when using batched update Karthik Nayak
2026-01-25 22:52 ` [PATCH v5 1/6] refs: skip to next ref when current ref is rejected Karthik Nayak
2026-01-25 22:52 ` [PATCH v5 2/6] refs: add rejection detail to the callback function Karthik Nayak
2026-01-25 22:52 ` [PATCH v5 3/6] update-ref: utilize rejected error details if available Karthik Nayak
2026-01-25 22:52 ` [PATCH v5 4/6] fetch: utilize rejected ref error details Karthik Nayak
2026-01-25 22:52 ` [PATCH v5 5/6] receive-pack: " Karthik Nayak
2026-01-25 22:52 ` [PATCH v5 6/6] fetch: delay user information post committing of transaction Karthik Nayak
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqldhqu7q0.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=git@vger.kernel.org \
--cc=karthik.188@gmail.com \
--cc=newren@gmail.com \
--cc=peff@peff.net \
--cc=phillip.wood123@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.