From: Jon Simons <jon@jonsimons.org>
To: git@vger.kernel.org
Cc: Jon Simons <jon@jonsimons.org>
Subject: [PATCH 03/15] t5510: document fetch with "./"-prefixed branch.<name>.merge
Date: Fri, 9 Oct 2026 15:29:41 -0400 [thread overview]
Message-ID: <20261009192953.81794-4-jon@jonsimons.org> (raw)
In-Reply-To: <20261009192953.81794-1-jon@jonsimons.org>
refname_match() formats each candidate through mkpath(), which strips
a leading "./", so a branch.<name>.merge value of "./refs/heads/main"
matches "refs/heads/main" in both places that fetch compares them:
- branch_merge_matches() when marking fetched refs for merge
in FETCH_HEAD
- find_ref_by_name_abbrev() when the merge source is not covered by the
fetch refspec and is looked up amongst the remote advertised refs
Only a hand-edited config reaches these paths: clone, branch
--set-upstream-to, fetch --set-upstream, and push -u write only names
that have passed check_refname_format(), which rejects a leading "./".
Add two fetch tests asserting that such a "./"-prefixed value does not
match for these cases. Both are test_expect_failure because the name
matches today:
- The default fetch refspec should not match "./refs/heads/main"
with fetched "refs/heads/main" and mark the ref for merge.
- A protocol v0 fetch with refspec that omits "refs/heads/main"
should not match "./refs/heads/main" against the remote
advertised "refs/heads/main".
An upcoming commit stops using mkpath() in refname_match(), at which
point the tests are toggled to test_expect_success.
Signed-off-by: Jon Simons <jon@jonsimons.org>
---
t/t5510-fetch.sh | 44 ++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/t/t5510-fetch.sh b/t/t5510-fetch.sh
index 300bd5396d..0303784b1f 100755
--- a/t/t5510-fetch.sh
+++ b/t/t5510-fetch.sh
@@ -1074,6 +1074,50 @@ test_expect_success 'LHS of refspec follows ref disambiguation rules' '
)
'
+test_expect_failure 'fetch with "./"-prefixed branch.<name>.merge does not mark any ref for merge' '
+ mkdir dotslash-merge-default-refspec &&
+ (
+ cd dotslash-merge-default-refspec &&
+ git init -b main server &&
+ test_commit -C server one &&
+ git -C server branch other &&
+ test_commit -C server two &&
+
+ # The bogus ./refs/heads/main should not match the remote refs/heads/main.
+ git clone server client &&
+ git -C client config branch.main.merge ./refs/heads/main &&
+ git -C client fetch &&
+ {
+ echo "$(git -C server rev-parse main) not-for-merge" &&
+ echo "$(git -C server rev-parse other) not-for-merge"
+ } >expect &&
+ cut -f -2 client/.git/FETCH_HEAD >actual &&
+ test_cmp expect actual
+ )
+'
+
+test_expect_failure 'fetch protocol v0 with "./"-prefixed branch.<name>.merge does not match any remote ref' '
+ mkdir dotslash-merge-fetch-protocol-v0 &&
+ (
+ cd dotslash-merge-fetch-protocol-v0 &&
+ git init -b main server &&
+ test_commit -C server one &&
+ git -C server branch other &&
+ test_commit -C server two &&
+
+ # Omit refs/heads/main from the fetch refspec so that the merge
+ # source is instead looked up among the refs the remote advertised.
+ git clone server client-v0 &&
+ git -C client-v0 config remote.origin.fetch \
+ +refs/heads/other:refs/remotes/origin/other &&
+ git -C client-v0 config branch.main.merge ./refs/heads/main &&
+ git -C client-v0 -c protocol.version=0 fetch &&
+ echo "$(git -C server rev-parse other) not-for-merge" >expect &&
+ cut -f -2 client-v0/.git/FETCH_HEAD >actual &&
+ test_cmp expect actual
+ )
+'
+
test_expect_success 'fetch.writeCommitGraph' '
git clone three write &&
(
--
2.55.0
next prev parent reply other threads:[~2026-10-09 19:30 UTC|newest]
Thread overview: 18+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-09 19:29 [PATCH 00/15] push: speed up client-side refspec matching Jon Simons
2026-10-09 19:29 ` [PATCH 01/15] remote: validate --force-with-lease <refname> argument Jon Simons
2026-10-09 19:29 ` [PATCH 02/15] t5516: demonstrate push with "./"-prefixed source Jon Simons
2026-10-09 19:29 ` Jon Simons [this message]
2026-10-09 19:29 ` [PATCH 04/15] t/perf: add explicit delete refspec matching test Jon Simons
2026-10-09 19:29 ` [PATCH 05/15] refs: stop using mkpath() in refname_match() Jon Simons
2026-10-09 19:29 ` [PATCH 06/15] remote: use strmap for check_push_refs() Jon Simons
2026-10-09 19:29 ` [PATCH 07/15] t5516: test pushing two refspecs creating the same new branch Jon Simons
2026-10-09 19:29 ` [PATCH 08/15] t5408, t5410: test duplicate updates without relying on the client Jon Simons
2026-10-09 19:29 ` [PATCH 09/15] t5408: check refspec order with distinct destinations Jon Simons
2026-10-09 19:29 ` [PATCH 10/15] t5408: expect client-side error for duplicate destinations Jon Simons
2026-10-09 19:29 ` [PATCH 11/15] remote: reject duplicate destinations on an empty remote Jon Simons
2026-10-09 19:29 ` [PATCH 12/15] remote: use strmap for match_explicit_refs() Jon Simons
2026-10-09 19:29 ` [PATCH 13/15] t/perf: measure --force-with-lease in p5516 Jon Simons
2026-10-09 19:29 ` [PATCH 14/15] remote: restructure apply_push_cas() loops Jon Simons
2026-10-09 19:29 ` [PATCH 15/15] remote: use strmap for apply_push_cas() Jon Simons
2026-10-09 20:18 ` [PATCH 00/15] push: speed up client-side refspec matching Kristoffer Haugsbakk
2026-10-11 2:35 ` Jon Simons
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=20261009192953.81794-4-jon@jonsimons.org \
--to=jon@jonsimons.org \
--cc=git@vger.kernel.org \
/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