From: Phillip Wood <phillip.wood123@gmail.com>
To: Karthik Nayak <karthik.188@gmail.com>, git@vger.kernel.org
Cc: ps@pks.im, jltobler@gmail.com, phillip.wood123@gmail.com
Subject: Re: [PATCH v2 7/7] update-ref: add --allow-partial flag for stdin mode
Date: Tue, 25 Feb 2025 14:59:14 +0000 [thread overview]
Message-ID: <ceda422e-8c8e-4a1d-aaab-9a7a2fc009dd@gmail.com> (raw)
In-Reply-To: <20250225-245-partially-atomic-ref-updates-v2-7-cfa3236895d7@gmail.com>
Hi Karthik
On 25/02/2025 09:29, Karthik Nayak wrote:
> When updating multiple references through stdin, Git's update-ref
> command normally aborts the entire transaction if any single update
> fails. While this atomic behavior prevents partial updates by default,
> there are cases where applying successful updates while reporting
> failures is desirable.
>
> Add a new `--allow-partial` flag that allows the transaction to continue
> even when individual reference updates fail. This flag can only be used
> in `--stdin` mode and builds upon the partial transaction support added
> to the refs subsystem.
As '--stdin' allows a single instance of "git update-ref" to create more
than one transaction perhaps we should instead allow the caller to
specify which transactions they want to allow to fail by passing an
argument to "start", similar to how we support "no-deref" with "update"
> following format:
>
> rejected SP (<old-oid> | <old-target>) SP (<new-oid> | <new-target>) SP <rejection-reason> LF
>
> or with `-z`:
>
> rejected NUL (<old-oid> | <old-target>) NUL (<new-oid> | <new-target>) NUL <rejection-reason> NUL
What's the reason for the different output with '-z'? In the list of
options '-z' is documented as only applying to the input stream. Looking
at the code the existing messages generated by report_ok() are all
printed to stdout with a LF terminator.
> +static void print_rejected_refs(const char *refname,
> + const struct object_id *old_oid,
> + const struct object_id *new_oid,
> + const char *old_target,
> + const char *new_target,
> + enum transaction_error err,
> + void *cb_data UNUSED)
> +{
> + struct strbuf sb = STRBUF_INIT;
> + char space = ' ';
> + const char *reason = "";
> +
> + switch (err) {
> + case TRANSACTION_NAME_CONFLICT:
> + reason = _("refname conflict");
> + break;
> + case TRANSACTION_CREATE_EXISTS:
> + reason = _("reference already exists");
> + break;
> + case TRANSACTION_NONEXISTENT_REF:
> + reason = _("reference does not exist");
> + break;
> + case TRANSACTION_INCORRECT_OLD_VALUE:
> + reason = _("incorrect old value provided");
> + break;
> + case TRANSACTION_INVALID_NEW_VALUE:
> + reason = _("invalid new value provided");
> + break;
> + case TRANSACTION_EXPECTED_SYMREF:
> + reason = _("expected symref but found regular ref");
> + break;
> + default:
> + reason = _("unkown failure");
> + }
I agree with Patrick that these messages should not be translated.
> + if (!line_termination)
> + space = line_termination;
> +
> + strbuf_addf(&sb, "rejected%c%s%c%s%c%c%s%c%s%c", space,
> + refname, space, new_oid ? oid_to_hex(new_oid) : new_target,
> + space, space, old_oid ? oid_to_hex(old_oid) : old_target,
> + space, reason, line_termination);
> +
> + fwrite(sb.buf, sb.len, 1, stdout);
> + strbuf_release(&sb);
> + fflush(stdout);
There is no need to flush after each line, we'll flush all the error
messages when we call report_ok() in parse_cmd_commit() or when the
program exits. The caller has no way to know how many error messages
there are to read so flushing each one individually does not help the
reader avoid deadlocks.
> +}
> +
> static void parse_cmd_commit(struct ref_transaction *transaction,
> const char *next, const char *end UNUSED)
> {
> @@ -573,6 +622,10 @@ static void parse_cmd_commit(struct ref_transaction *transaction,
> die("commit: extra input: %s", next);
> if (ref_transaction_commit(transaction, &error))
> die("commit: %s", error.buf);
> +
> + ref_transaction_for_each_rejected_update(transaction,
> + print_rejected_refs, NULL);
> +
> report_ok("commit");
This is good, the caller knows to stop reading when they see "commit: ok"
Best Wishes
Phillip
> ref_transaction_free(transaction);
> }
> @@ -609,7 +662,7 @@ static const struct parse_cmd {
> { "commit", parse_cmd_commit, 0, UPDATE_REFS_CLOSED },
> };
>
> -static void update_refs_stdin(void)
> +static void update_refs_stdin(unsigned int flags)
> {
> struct strbuf input = STRBUF_INIT, err = STRBUF_INIT;
> enum update_refs_state state = UPDATE_REFS_OPEN;
> @@ -617,7 +670,7 @@ static void update_refs_stdin(void)
> int i, j;
>
> transaction = ref_store_transaction_begin(get_main_ref_store(the_repository),
> - 0, &err);
> + flags, &err);
> if (!transaction)
> die("%s", err.buf);
>
> @@ -685,7 +738,7 @@ static void update_refs_stdin(void)
> */
> state = cmd->state;
> transaction = ref_store_transaction_begin(get_main_ref_store(the_repository),
> - 0, &err);
> + flags, &err);
> if (!transaction)
> die("%s", err.buf);
>
> @@ -701,6 +754,8 @@ static void update_refs_stdin(void)
> /* Commit by default if no transaction was requested. */
> if (ref_transaction_commit(transaction, &err))
> die("%s", err.buf);
> + ref_transaction_for_each_rejected_update(transaction,
> + print_rejected_refs, NULL);
> ref_transaction_free(transaction);
> break;
> case UPDATE_REFS_STARTED:
> @@ -726,7 +781,9 @@ int cmd_update_ref(int argc,
> const char *refname, *oldval;
> struct object_id oid, oldoid;
> int delete = 0, no_deref = 0, read_stdin = 0, end_null = 0;
> - int create_reflog = 0;
> + int create_reflog = 0, allow_partial = 0;
> + unsigned int flags = 0;
> +
> struct option options[] = {
> OPT_STRING( 'm', NULL, &msg, N_("reason"), N_("reason of the update")),
> OPT_BOOL('d', NULL, &delete, N_("delete the reference")),
> @@ -735,6 +792,8 @@ int cmd_update_ref(int argc,
> OPT_BOOL('z', NULL, &end_null, N_("stdin has NUL-terminated arguments")),
> OPT_BOOL( 0 , "stdin", &read_stdin, N_("read updates from stdin")),
> OPT_BOOL( 0 , "create-reflog", &create_reflog, N_("create a reflog")),
> + OPT_BIT('0', "allow-partial", &flags, N_("allow partial transactions"),
> + REF_TRANSACTION_ALLOW_PARTIAL),
> OPT_END(),
> };
>
> @@ -756,9 +815,10 @@ int cmd_update_ref(int argc,
> usage_with_options(git_update_ref_usage, options);
> if (end_null)
> line_termination = '\0';
> - update_refs_stdin();
> + update_refs_stdin(flags);
> return 0;
> - }
> + } else if (allow_partial)
> + die("--allow-partial can only be used with --stdin");
>
> if (end_null)
> usage_with_options(git_update_ref_usage, options);
> diff --git a/t/t1400-update-ref.sh b/t/t1400-update-ref.sh
> index 29045aad43..fb9442982e 100755
> --- a/t/t1400-update-ref.sh
> +++ b/t/t1400-update-ref.sh
> @@ -2066,6 +2066,222 @@ do
> grep "$(git rev-parse $a) $(git rev-parse $a)" actual
> '
>
> + test_expect_success "stdin $type allow-partial" '
> + git init repo &&
> + test_when_finished "rm -fr repo" &&
> + (
> + cd repo &&
> + test_commit commit &&
> + head=$(git rev-parse HEAD) &&
> +
> + format_command $type "update refs/heads/ref1" "$head" "$Z" >stdin &&
> + format_command $type "update refs/heads/ref2" "$head" "$Z" >>stdin &&
> + git update-ref $type --stdin --allow-partial <stdin &&
> + echo $head >expect &&
> + git rev-parse refs/heads/ref1 >actual &&
> + test_cmp expect actual &&
> + git rev-parse refs/heads/ref2 >actual &&
> + test_cmp expect actual
> + )
> + '
> +
> + test_expect_success "stdin $type allow-partial with invalid new_oid" '
> + git init repo &&
> + test_when_finished "rm -fr repo" &&
> + (
> + cd repo &&
> + test_commit one &&
> + old_head=$(git rev-parse HEAD) &&
> + test_commit two &&
> + head=$(git rev-parse HEAD) &&
> + git update-ref refs/heads/ref1 $head &&
> + git update-ref refs/heads/ref2 $head &&
> +
> + format_command $type "update refs/heads/ref1" "$old_head" "$head" >stdin &&
> + format_command $type "update refs/heads/ref2" "$(test_oid 001)" "$head" >>stdin &&
> + git update-ref $type --stdin --allow-partial <stdin >stdout &&
> + echo $old_head >expect &&
> + git rev-parse refs/heads/ref1 >actual &&
> + test_cmp expect actual &&
> + echo $head >expect &&
> + git rev-parse refs/heads/ref2 >actual &&
> + test_cmp expect actual &&
> + test_grep -q "invalid new value provided" stdout
> + )
> + '
> +
> + test_expect_success "stdin $type allow-partial with non-commit new_oid" '
> + git init repo &&
> + test_when_finished "rm -fr repo" &&
> + (
> + cd repo &&
> + test_commit one &&
> + old_head=$(git rev-parse HEAD) &&
> + test_commit two &&
> + head=$(git rev-parse HEAD) &&
> + head_tree=$(git rev-parse HEAD^{tree}) &&
> + git update-ref refs/heads/ref1 $head &&
> + git update-ref refs/heads/ref2 $head &&
> +
> + format_command $type "update refs/heads/ref1" "$old_head" "$head" >stdin &&
> + format_command $type "update refs/heads/ref2" "$head_tree" "$head" >>stdin &&
> + git update-ref $type --stdin --allow-partial <stdin >stdout &&
> + echo $old_head >expect &&
> + git rev-parse refs/heads/ref1 >actual &&
> + test_cmp expect actual &&
> + echo $head >expect &&
> + git rev-parse refs/heads/ref2 >actual &&
> + test_cmp expect actual &&
> + test_grep -q "invalid new value provided" stdout
> + )
> + '
> +
> + test_expect_success "stdin $type allow-partial with non-existent ref" '
> + git init repo &&
> + test_when_finished "rm -fr repo" &&
> + (
> + cd repo &&
> + test_commit one &&
> + old_head=$(git rev-parse HEAD) &&
> + test_commit two &&
> + head=$(git rev-parse HEAD) &&
> + git update-ref refs/heads/ref1 $head &&
> +
> + format_command $type "update refs/heads/ref1" "$old_head" "$head" >stdin &&
> + format_command $type "update refs/heads/ref2" "$old_head" "$head" >>stdin &&
> + git update-ref $type --stdin --allow-partial <stdin >stdout &&
> + echo $old_head >expect &&
> + git rev-parse refs/heads/ref1 >actual &&
> + test_cmp expect actual &&
> + test_must_fail git rev-parse refs/heads/ref2 &&
> + test_grep -q "reference does not exist" stdout
> + )
> + '
> +
> + test_expect_success "stdin $type allow-partial with dangling symref" '
> + git init repo &&
> + test_when_finished "rm -fr repo" &&
> + (
> + cd repo &&
> + test_commit one &&
> + old_head=$(git rev-parse HEAD) &&
> + test_commit two &&
> + head=$(git rev-parse HEAD) &&
> + git update-ref refs/heads/ref1 $head &&
> + git symbolic-ref refs/heads/ref2 refs/heads/nonexistent &&
> +
> + format_command $type "update refs/heads/ref1" "$old_head" "$head" >stdin &&
> + format_command $type "update refs/heads/ref2" "$old_head" "$head" >>stdin &&
> + git update-ref $type --no-deref --stdin --allow-partial <stdin >stdout &&
> + echo $old_head >expect &&
> + git rev-parse refs/heads/ref1 >actual &&
> + test_cmp expect actual &&
> + echo $head >expect &&
> + test_must_fail git rev-parse refs/heads/ref2 &&
> + test_grep -q "reference does not exist" stdout
> + )
> + '
> +
> + test_expect_success "stdin $type allow-partial with regular ref as symref" '
> + git init repo &&
> + test_when_finished "rm -fr repo" &&
> + (
> + cd repo &&
> + test_commit one &&
> + old_head=$(git rev-parse HEAD) &&
> + test_commit two &&
> + head=$(git rev-parse HEAD) &&
> + git update-ref refs/heads/ref1 $head &&
> + git update-ref refs/heads/ref2 $head &&
> +
> + format_command $type "update refs/heads/ref1" "$old_head" "$head" >stdin &&
> + format_command $type "symref-update refs/heads/ref2" "$old_head" "ref" "refs/heads/nonexistent" >>stdin &&
> + git update-ref $type --no-deref --stdin --allow-partial <stdin >stdout &&
> + echo $old_head >expect &&
> + git rev-parse refs/heads/ref1 >actual &&
> + test_cmp expect actual &&
> + echo $head >expect &&
> + echo $head >expect &&
> + git rev-parse refs/heads/ref2 >actual &&
> + test_cmp expect actual &&
> + test_grep -q "expected symref but found regular ref" stdout
> + )
> + '
> +
> + test_expect_success "stdin $type allow-partial with invalid old_oid" '
> + git init repo &&
> + test_when_finished "rm -fr repo" &&
> + (
> + cd repo &&
> + test_commit one &&
> + old_head=$(git rev-parse HEAD) &&
> + test_commit two &&
> + head=$(git rev-parse HEAD) &&
> + git update-ref refs/heads/ref1 $head &&
> + git update-ref refs/heads/ref2 $head &&
> +
> + format_command $type "update refs/heads/ref1" "$old_head" "$head" >stdin &&
> + format_command $type "update refs/heads/ref2" "$old_head" "$Z" >>stdin &&
> + git update-ref $type --stdin --allow-partial <stdin >stdout &&
> + echo $old_head >expect &&
> + git rev-parse refs/heads/ref1 >actual &&
> + test_cmp expect actual &&
> + echo $head >expect &&
> + git rev-parse refs/heads/ref2 >actual &&
> + test_cmp expect actual &&
> + test_grep -q "reference already exists" stdout
> + )
> + '
> +
> + test_expect_success "stdin $type allow-partial with incorrect old oid" '
> + git init repo &&
> + test_when_finished "rm -fr repo" &&
> + (
> + cd repo &&
> + test_commit one &&
> + old_head=$(git rev-parse HEAD) &&
> + test_commit two &&
> + head=$(git rev-parse HEAD) &&
> + git update-ref refs/heads/ref1 $head &&
> + git update-ref refs/heads/ref2 $head &&
> +
> + format_command $type "update refs/heads/ref1" "$old_head" "$head" >stdin &&
> + format_command $type "update refs/heads/ref2" "$head" "$old_head" >>stdin &&
> + git update-ref $type --stdin --allow-partial <stdin >stdout &&
> + echo $old_head >expect &&
> + git rev-parse refs/heads/ref1 >actual &&
> + test_cmp expect actual &&
> + echo $head >expect &&
> + git rev-parse refs/heads/ref2 >actual &&
> + test_cmp expect actual &&
> + test_grep -q "incorrect old value provided" stdout
> + )
> + '
> +
> + # F/D conflicts on the files backend are resolved on an individual
> + # update level since refs are stored as files. On the reftable backend
> + # this check is batched to optimize for performance, so failures cannot
> + # be isolated to a single update.
> + test_expect_success REFFILES "stdin $type allow-partial refname conflict" '
> + git init repo &&
> + test_when_finished "rm -fr repo" &&
> + (
> + cd repo &&
> + test_commit one &&
> + old_head=$(git rev-parse HEAD) &&
> + test_commit two &&
> + head=$(git rev-parse HEAD) &&
> + git update-ref refs/heads/ref/foo $head &&
> +
> + format_command $type "update refs/heads/ref/foo" "$old_head" "$head" >stdin &&
> + format_command $type "update refs/heads/ref" "$old_head" "" >>stdin &&
> + git update-ref $type --stdin --allow-partial <stdin >stdout &&
> + echo $old_head >expect &&
> + git rev-parse refs/heads/ref/foo >actual &&
> + test_cmp expect actual &&
> + test_grep -q "refname conflict" stdout
> + )
> + '
> done
>
> test_expect_success 'update-ref should also create reflog for HEAD' '
>
next prev parent reply other threads:[~2025-02-25 14:59 UTC|newest]
Thread overview: 147+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-02-07 7:34 [PATCH 0/6] refs: introduce support for partial reference transactions Karthik Nayak
2025-02-07 7:34 ` [PATCH 1/6] refs/files: remove duplicate check in `split_symref_update()` Karthik Nayak
2025-02-07 16:12 ` Patrick Steinhardt
2025-02-11 6:35 ` Karthik Nayak
2025-02-07 7:34 ` [PATCH 2/6] refs: move duplicate refname update check to generic layer Karthik Nayak
2025-02-07 16:12 ` Patrick Steinhardt
2025-02-11 10:33 ` Karthik Nayak
2025-02-07 7:34 ` [PATCH 3/6] refs/files: remove duplicate duplicates check Karthik Nayak
2025-02-07 16:12 ` Patrick Steinhardt
2025-02-07 7:34 ` [PATCH 4/6] refs/reftable: extract code from the transaction preparation Karthik Nayak
2025-02-07 7:34 ` [PATCH 5/6] refs: implement partial reference transaction support Karthik Nayak
2025-02-07 16:12 ` Patrick Steinhardt
2025-02-21 10:33 ` Karthik Nayak
2025-02-07 7:34 ` [PATCH 6/6] update-ref: add --allow-partial flag for stdin mode Karthik Nayak
2025-02-07 16:12 ` Patrick Steinhardt
2025-02-21 11:45 ` Karthik Nayak
2025-02-11 17:03 ` [PATCH 0/6] refs: introduce support for partial reference transactions Phillip Wood
2025-02-11 17:40 ` Phillip Wood
2025-02-12 12:36 ` Karthik Nayak
2025-02-12 12:34 ` Karthik Nayak
2025-02-19 14:34 ` Phillip Wood
2025-02-19 15:10 ` Patrick Steinhardt
2025-02-21 11:50 ` Karthik Nayak
2025-02-25 9:29 ` [PATCH v2 0/7] " Karthik Nayak
2025-02-25 9:29 ` [PATCH v2 1/7] refs/files: remove redundant check in split_symref_update() Karthik Nayak
2025-02-25 9:29 ` [PATCH v2 2/7] refs: move duplicate refname update check to generic layer Karthik Nayak
2025-02-25 9:29 ` [PATCH v2 3/7] refs/files: remove duplicate duplicates check Karthik Nayak
2025-02-25 9:29 ` [PATCH v2 4/7] refs/reftable: extract code from the transaction preparation Karthik Nayak
2025-02-25 9:29 ` [PATCH v2 5/7] refs: introduce enum-based transaction error types Karthik Nayak
2025-02-25 11:08 ` Patrick Steinhardt
2025-03-03 20:12 ` Karthik Nayak
2025-02-25 9:29 ` [PATCH v2 6/7] refs: implement partial reference transaction support Karthik Nayak
2025-02-25 11:07 ` Patrick Steinhardt
2025-03-03 20:17 ` Karthik Nayak
2025-02-25 14:57 ` Phillip Wood
2025-03-03 20:21 ` Karthik Nayak
2025-03-04 10:31 ` Phillip Wood
2025-03-05 14:20 ` Karthik Nayak
2025-02-25 9:29 ` [PATCH v2 7/7] update-ref: add --allow-partial flag for stdin mode Karthik Nayak
2025-02-25 11:08 ` Patrick Steinhardt
2025-03-03 20:22 ` Karthik Nayak
2025-02-25 14:59 ` Phillip Wood [this message]
2025-03-03 20:34 ` Karthik Nayak
2025-03-05 17:38 ` [PATCH v3 0/8] refs: introduce support for partial reference transactions Karthik Nayak
2025-03-05 17:38 ` [PATCH v3 1/8] refs/files: remove redundant check in split_symref_update() Karthik Nayak
2025-03-05 21:20 ` Junio C Hamano
2025-03-06 9:13 ` Karthik Nayak
2025-03-05 17:38 ` [PATCH v3 2/8] refs: move duplicate refname update check to generic layer Karthik Nayak
2025-03-05 21:56 ` Junio C Hamano
2025-03-06 9:46 ` Karthik Nayak
2025-03-05 17:38 ` [PATCH v3 3/8] refs/files: remove duplicate duplicates check Karthik Nayak
2025-03-05 17:38 ` [PATCH v3 4/8] refs/reftable: extract code from the transaction preparation Karthik Nayak
2025-03-05 17:39 ` [PATCH v3 5/8] refs: introduce enum-based transaction error types Karthik Nayak
2025-03-05 17:39 ` [PATCH v3 6/8] refs: implement partial reference transaction support Karthik Nayak
2025-03-07 19:50 ` Jeff King
2025-03-07 20:46 ` Junio C Hamano
2025-03-07 20:48 ` Junio C Hamano
2025-03-07 21:05 ` Karthik Nayak
2025-03-07 22:54 ` [PATCH] config.mak.dev: enable -Wunreachable-code Jeff King
2025-03-07 23:28 ` Junio C Hamano
2025-03-08 3:23 ` Jeff King
2025-03-10 15:40 ` Junio C Hamano
2025-03-10 16:04 ` Jeff King
2025-03-10 18:50 ` Junio C Hamano
2025-03-14 16:10 ` Jeff King
2025-03-14 16:13 ` Jeff King
2025-03-14 17:27 ` Junio C Hamano
2025-03-14 17:40 ` Junio C Hamano
2025-03-14 17:43 ` Patrick Steinhardt
2025-03-14 18:53 ` Jeff King
2025-03-14 19:50 ` Junio C Hamano
2025-03-14 17:15 ` Junio C Hamano
2025-06-03 21:29 ` Mike Hommey
2025-06-03 22:07 ` Junio C Hamano
2025-06-03 22:37 ` Mike Hommey
2025-06-03 23:08 ` Mike Hommey
2025-03-14 21:09 ` [PATCH v2 0/3] -Wunreachable-code Junio C Hamano
2025-03-14 21:09 ` [PATCH v2 1/3] config.mak.dev: enable -Wunreachable-code Junio C Hamano
2025-03-14 21:09 ` [PATCH v2 2/3] run-command: use errno to check for sigfillset() error Junio C Hamano
2025-03-17 21:30 ` Taylor Blau
2025-03-17 23:12 ` Junio C Hamano
2025-03-18 0:36 ` Junio C Hamano
2025-03-14 21:09 ` [PATCH v2 3/3] git-compat-util: add NOT_A_CONST macro and use it in atfork_prepare() Junio C Hamano
2025-03-14 22:29 ` Junio C Hamano
2025-03-17 18:00 ` Jeff King
2025-03-17 23:53 ` [PATCH v3 0/3] -Wunreachable-code Junio C Hamano
2025-03-17 23:53 ` [PATCH v3 1/3] run-command: use errno to check for sigfillset() error Junio C Hamano
2025-03-17 23:53 ` [PATCH v3 2/3] git-compat-util: add NOT_CONSTANT macro and use it in atfork_prepare() Junio C Hamano
2025-03-18 0:20 ` Jeff King
2025-03-18 0:28 ` Junio C Hamano
2025-03-18 22:04 ` Calvin Wan
2025-03-18 22:26 ` Calvin Wan
2025-03-18 23:55 ` Junio C Hamano
2025-03-17 23:53 ` [PATCH v3 3/3] config.mak.dev: enable -Wunreachable-code Junio C Hamano
2025-03-18 0:18 ` [PATCH v3 0/3] -Wunreachable-code Jeff King
2025-03-07 21:02 ` [PATCH v3 6/8] refs: implement partial reference transaction support Karthik Nayak
2025-03-07 19:57 ` Jeff King
2025-03-07 21:07 ` Karthik Nayak
2025-03-05 17:39 ` [PATCH v3 7/8] refs: support partial update rejections during F/D checks Karthik Nayak
2025-03-05 17:39 ` [PATCH v3 8/8] update-ref: add --allow-partial flag for stdin mode Karthik Nayak
2025-03-05 19:28 ` [PATCH v3 0/8] refs: introduce support for partial reference transactions Junio C Hamano
2025-03-06 9:06 ` Karthik Nayak
2025-03-20 11:43 ` [PATCH v4 0/8] refs: introduce support for batched reference updates Karthik Nayak
2025-03-20 11:43 ` [PATCH v4 1/8] refs/files: remove redundant check in split_symref_update() Karthik Nayak
2025-03-20 11:43 ` [PATCH v4 2/8] refs: move duplicate refname update check to generic layer Karthik Nayak
2025-03-20 11:43 ` [PATCH v4 3/8] refs/files: remove duplicate duplicates check Karthik Nayak
2025-03-20 11:43 ` [PATCH v4 4/8] refs/reftable: extract code from the transaction preparation Karthik Nayak
2025-03-20 11:44 ` [PATCH v4 5/8] refs: introduce enum-based transaction error types Karthik Nayak
2025-03-20 20:26 ` Patrick Steinhardt
2025-03-24 14:50 ` Karthik Nayak
2025-03-25 12:31 ` Patrick Steinhardt
2025-03-20 11:44 ` [PATCH v4 6/8] refs: implement batch reference update support Karthik Nayak
2025-03-20 20:26 ` Patrick Steinhardt
2025-03-24 14:54 ` Karthik Nayak
2025-03-20 11:44 ` [PATCH v4 7/8] refs: support rejection in batch updates during F/D checks Karthik Nayak
2025-03-24 13:08 ` Patrick Steinhardt
2025-03-24 17:48 ` Karthik Nayak
2025-03-25 12:31 ` Patrick Steinhardt
2025-03-20 11:44 ` [PATCH v4 8/8] update-ref: add --batch-updates flag for stdin mode Karthik Nayak
2025-03-24 13:08 ` Patrick Steinhardt
2025-03-24 17:51 ` Karthik Nayak
2025-03-27 11:13 ` [PATCH v5 0/8] refs: introduce support for batched reference updates Karthik Nayak
2025-03-27 11:13 ` [PATCH v5 1/8] refs/files: remove redundant check in split_symref_update() Karthik Nayak
2025-03-27 11:13 ` [PATCH v5 2/8] refs: move duplicate refname update check to generic layer Karthik Nayak
2025-03-27 11:13 ` [PATCH v5 3/8] refs/files: remove duplicate duplicates check Karthik Nayak
2025-03-27 11:13 ` [PATCH v5 4/8] refs/reftable: extract code from the transaction preparation Karthik Nayak
2025-03-27 11:13 ` [PATCH v5 5/8] refs: introduce enum-based transaction error types Karthik Nayak
2025-03-27 11:13 ` [PATCH v5 6/8] refs: implement batch reference update support Karthik Nayak
2025-03-27 11:13 ` [PATCH v5 7/8] refs: support rejection in batch updates during F/D checks Karthik Nayak
2025-03-27 11:13 ` [PATCH v5 8/8] update-ref: add --batch-updates flag for stdin mode Karthik Nayak
2025-03-28 13:00 ` Jean-Noël AVILA
2025-03-29 16:36 ` Junio C Hamano
2025-03-29 18:18 ` Karthik Nayak
2025-03-28 9:24 ` [PATCH v5 0/8] refs: introduce support for batched reference updates Patrick Steinhardt
2025-04-08 8:51 ` [PATCH v6 " Karthik Nayak
2025-04-08 8:51 ` [PATCH v6 1/8] refs/files: remove redundant check in split_symref_update() Karthik Nayak
2025-04-08 8:51 ` [PATCH v6 2/8] refs: move duplicate refname update check to generic layer Karthik Nayak
2025-04-08 8:51 ` [PATCH v6 3/8] refs/files: remove duplicate duplicates check Karthik Nayak
2025-04-08 8:51 ` [PATCH v6 4/8] refs/reftable: extract code from the transaction preparation Karthik Nayak
2025-04-08 8:51 ` [PATCH v6 5/8] refs: introduce enum-based transaction error types Karthik Nayak
2025-04-08 8:51 ` [PATCH v6 6/8] refs: implement batch reference update support Karthik Nayak
2025-04-08 8:51 ` [PATCH v6 7/8] refs: support rejection in batch updates during F/D checks Karthik Nayak
2025-04-08 8:51 ` [PATCH v6 8/8] update-ref: add --batch-updates flag for stdin mode Karthik Nayak
2025-04-08 15:02 ` Junio C Hamano
2025-04-08 15:26 ` Karthik Nayak
2025-04-08 17:37 ` Junio C Hamano
2025-04-10 11:23 ` 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=ceda422e-8c8e-4a1d-aaab-9a7a2fc009dd@gmail.com \
--to=phillip.wood123@gmail.com \
--cc=git@vger.kernel.org \
--cc=jltobler@gmail.com \
--cc=karthik.188@gmail.com \
--cc=phillip.wood@dunelm.org.uk \
--cc=ps@pks.im \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).