From: Karthik Nayak <karthik.188@gmail•com>
To: git@vger•kernel.org
Cc: Karthik Nayak <karthik.188@gmail•com>,
jltobler@gmail•com, ps@pks•im, gitster@pobox•com,
David Bohman <debohman@gmail•com>
Subject: [PATCH v5 0/2] fetch: fix non-conflicting tags not being committed
Date: Thu, 13 Nov 2025 14:38:35 +0100 [thread overview]
Message-ID: <20251113-fix-tags-not-fetching-v5-0-371ea7ec638d@gmail.com> (raw)
In-Reply-To: <20251103-fix-tags-not-fetching-v1-1-e63caeb6c113@gmail.com>
This fixes the bug reported by David Bohman [1].
The 'git-fetch(1)' uses batched updates to perform reference updates
when not using 'atomic' transactions. One scenario which was missed
here, was fetching tags. When fetching conflicting tags, the
`fetch_and_consume_refs()` function returns '1', which skipped
committing the transaction and directly jumped to the cleanup section.
This mean that no updates were applied. This also extends to backfilling
tags.
The first commit, extracts out common code for committing a reference
transaction and handling rejected updates. The second commit ensures
any failures would also commit pending updates.
[1]: id:CAB9xhmPcHnB2+i6WeA3doAinv7RAeGs04+n0fHLGToJq=UKUNw@mail•gmail.com
Signed-off-by: Karthik Nayak <karthik.188@gmail•com>
---
Changes in v5:
- In the previous version, I assumed that the `prune_refs()` function
also triggers committing of batched updates. However this was
incorrect as the transaction for batched updates, is only created
after the call to `prune_refs()`. This makes sense, since we want to
isolate deletions from the rest of the ref updates, to avoid
conflicts. I've amended the commit message accordingly.
- I noticed I missed cleanup of the repos created in the test, which
I've now done.
- Link to v4: https://patch.msgid.link/20251111-fix-tags-not-fetching-v4-0-185d836ec62a@gmail.com
Changes in v4:
- Cleanup the code in the first commit to make it simpler to read.
- In the second commit, we were specifically checking for `retcode > 0`
for committing the transaction. This is a bit confusing since that
begs the questions why not `retcode < 0`. There is no real reason
there, so I've change the code to simple do `if (retcode && ...)`.
I've also added more information about the flows which would commit
the transaction in the commit message.
- Link to v3: https://patch.msgid.link/20251108-fix-tags-not-fetching-v3-0-a12ab6c4daef@gmail.com
Changes in v3:
- Split the patch into two commits. One for extracting out existing code
into a new commit and the other to perform the fix.
- Add back error handling when commit via the normal flow.
- Instead of calling the commit function at every failure, make it part
of the cleanup code.
- Link to v2: https://patch.msgid.link/20251106-fix-tags-not-fetching-v2-1-610cb4b0e7c8@gmail.com
Changes in v2:
- Add a comment to explain the purpose of `commit_ref_transaction()` and
how it works.
- Also extend the same logic towards backfilling tags. While I was able
to add a test for the happy path, I couldn't figure out how to test
when `backfill_tags()` tags would fail.
Tangentially, this flow seems to only be triggered when using the now
deprecated 'branches/' remote format.
- Remove unneeded subshells from the tests.
- Link to v1: https://patch.msgid.link/20251103-fix-tags-not-fetching-v1-1-e63caeb6c113@gmail.com
---
builtin/fetch.c | 67 ++++++++++++++++++++++++++++++++++----------------------
t/t5510-fetch.sh | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 103 insertions(+), 26 deletions(-)
Karthik Nayak (2):
fetch: extract out reference committing logic
fetch: fix non-conflicting tags not being committed
Range-diff versus v4:
1: ba560e030b = 1: cc187b053f fetch: extract out reference committing logic
2: 0403971a5b ! 2: 27497a1b9d fetch: fix non-conflicting tags not being committed
@@ Commit message
The cleanup section is reached with `retcode` set in several scenarios:
- - `truncate_fetch_head()` and `open_fetch_head()` both set `retcode`
- before the transaction is created, so no commit is attempted.
-
- - `prune_refs()` sets `retcode` after creating the transaction, so
- the commit will now proceed. Before batched updates, `prune_refs()`
- created its own transaction internally with all-or-nothing
- semantics. This was done since all deletions were made without an
- old OID, which meant they were assumed to never fail. This change
- allows partial deletions to succeed, consistent with how other
- reference updates behave during fetch.
+ - `truncate_fetch_head()`, `open_fetch_head()` and `prune_refs()` set
+ `retcode` before the transaction is created, so no commit is
+ attempted.
- `fetch_and_consume_refs()` and `backfill_tags()` are the primary
cases this fix targets, both setting a positive `retcode` to
@@ t/t5510-fetch.sh: test_expect_success REFFILES 'D/F conflict on case sensitive f
+'
+
+test_expect_success "backfill tags when providing a refspec" '
++ test_when_finished rm -rf source target &&
++
+ git init source &&
+ git -C source commit --allow-empty --message common &&
+ git clone file://"$(pwd)"/source target &&
+ (
+ cd source &&
-+ git commit --allow-empty --message history &&
-+ git tag history &&
-+ git commit --allow-empty --message fetch-me &&
-+ git tag fetch-me
++ test_commit history &&
++ test_commit fetch-me
+ ) &&
+
+ # The "history" tag is backfilled eventhough we requested
base-commit: a99f379adf116d53eb11957af5bab5214915f91d
change-id: 20251103-fix-tags-not-fetching-0f1621a474d4
Thanks
- Karthik
next prev parent reply other threads:[~2025-11-13 13:38 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-11-03 13:49 [PATCH] fetch: fix non-conflicting tags not being committed Karthik Nayak
2025-11-03 17:53 ` Eric Sunshine
2025-11-03 21:22 ` Karthik Nayak
2025-11-03 20:52 ` Justin Tobler
2025-11-06 8:39 ` [PATCH v2] " Karthik Nayak
2025-11-06 11:50 ` Patrick Steinhardt
2025-11-06 18:56 ` Junio C Hamano
2025-11-07 13:15 ` Karthik Nayak
2025-11-07 14:07 ` Patrick Steinhardt
2025-11-07 15:13 ` Karthik Nayak
2025-11-06 22:10 ` Justin Tobler
2025-11-07 14:01 ` Karthik Nayak
2025-11-08 21:34 ` [PATCH v3 0/2] " Karthik Nayak
2025-11-08 21:34 ` [PATCH v3 1/2] fetch: extract out reference committing logic Karthik Nayak
2025-11-10 7:34 ` Patrick Steinhardt
2025-11-10 13:11 ` Karthik Nayak
2025-11-08 21:34 ` [PATCH v3 2/2] fetch: fix non-conflicting tags not being committed Karthik Nayak
2025-11-10 7:34 ` Patrick Steinhardt
2025-11-10 13:23 ` Karthik Nayak
2025-11-11 13:27 ` [PATCH v4 0/2] " Karthik Nayak
2025-11-11 13:27 ` [PATCH v4 1/2] fetch: extract out reference committing logic Karthik Nayak
2025-11-11 13:27 ` [PATCH v4 2/2] fetch: fix non-conflicting tags not being committed Karthik Nayak
2025-11-12 6:16 ` Patrick Steinhardt
2025-11-12 8:52 ` Karthik Nayak
2025-11-12 16:34 ` Junio C Hamano
2025-11-13 13:38 ` Karthik Nayak [this message]
2025-11-13 13:38 ` [PATCH v5 1/2] fetch: extract out reference committing logic Karthik Nayak
2025-11-13 13:38 ` [PATCH v5 2/2] fetch: fix non-conflicting tags not being committed Karthik Nayak
2025-11-13 21:23 ` Junio C Hamano
2025-11-15 22:16 ` Karthik Nayak
2025-11-17 0:02 ` Junio C Hamano
2025-11-17 15:38 ` Karthik Nayak
2025-11-18 11:27 ` [PATCH v6 0/3] " Karthik Nayak
2025-11-18 11:27 ` [PATCH v6 1/3] fetch: extract out reference committing logic Karthik Nayak
2025-11-18 11:27 ` [PATCH v6 2/3] fetch: fix non-conflicting tags not being committed Karthik Nayak
2025-11-18 11:27 ` [PATCH v6 3/3] fetch: fix failed batched updates skipping operations Karthik Nayak
2025-11-18 18:03 ` Junio C Hamano
2025-11-19 8:59 ` Karthik Nayak
2025-11-19 21:46 ` [PATCH v7 0/3] fetch: fix non-conflicting tags not being committed Karthik Nayak
2025-11-19 21:46 ` [PATCH v7 1/3] fetch: extract out reference committing logic Karthik Nayak
2025-11-19 21:46 ` [PATCH v7 2/3] fetch: fix non-conflicting tags not being committed Karthik Nayak
2025-11-19 21:46 ` [PATCH v7 3/3] fetch: fix failed batched updates skipping operations Karthik Nayak
2025-11-19 22:20 ` Eric Sunshine
2025-11-19 23:08 ` Junio C Hamano
2025-11-21 11:00 ` Karthik Nayak
2025-11-21 11:13 ` [PATCH v8 0/3] fetch: fix non-conflicting tags not being committed Karthik Nayak
2025-11-21 11:13 ` [PATCH v8 1/3] fetch: extract out reference committing logic Karthik Nayak
2025-11-21 11:13 ` [PATCH v8 2/3] fetch: fix non-conflicting tags not being committed Karthik Nayak
2025-12-01 12:58 ` Patrick Steinhardt
2025-12-02 22:26 ` Karthik Nayak
2025-11-21 11:13 ` [PATCH v8 3/3] fetch: fix failed batched updates skipping operations Karthik Nayak
2025-12-01 12:58 ` Patrick Steinhardt
2025-12-02 22:35 ` Karthik Nayak
2025-11-21 19:58 ` [PATCH v8 0/3] fetch: fix non-conflicting tags not being committed Junio C Hamano
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=20251113-fix-tags-not-fetching-v5-0-371ea7ec638d@gmail.com \
--to=karthik.188@gmail$(echo .)com \
--cc=debohman@gmail$(echo .)com \
--cc=git@vger$(echo .)kernel.org \
--cc=gitster@pobox$(echo .)com \
--cc=jltobler@gmail$(echo .)com \
--cc=ps@pks$(echo .)im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
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