From: Trieu Huynh <vikingtc4@gmail.com>
To: git@vger.kernel.org
Cc: Trieu Huynh <vikingtc4@gmail.com>
Subject: [GSoC PATCH] promisor-remote: fix promisor.quiet to use the correct repository
Date: Tue, 7 Apr 2026 03:30:41 +0900 [thread overview]
Message-ID: <20260406183041.783800-1-vikingtc4@gmail.com> (raw)
fetch_objects() reads the promisor.quiet configuration from
the_repository instead of the repo parameter it receives.
This means that when git lazy-fetches objects for a non-main
repository, eg. a submodule that is itself a partial clone opened
via repo_submodule_init(). The submodule's own promisor.quiet
setting is ignored and the superproject's setting is used instead.
Fix by replacing the_repository with repo in the repo_config_get_bool()
call. The practical trigger is git grep --recurse-submodules on a
superproject where the submodule is a partial clone.
Add a test where promisor.quiet is set only in a partial-clone
submodule; a lazy fetch triggered by "git grep --recurse-submodules"
must honor that setting.
Signed-off-by: Trieu Huynh <vikingtc4@gmail.com>
---
nit: This cleanup was explicitly noted as needed in 5d215a7b3e
("promisor-remote: make promisor_remote_reinit() not depend on
the_repository", 2024-10-17), where Patrick Steinhardt wrote:
"Those sites should eventually be cleaned up in a later patch series."
promisor-remote.c | 2 +-
t/t0410-partial-clone.sh | 45 +++++++++++++++++++++++++++++++++++++++-
2 files changed, 45 insertions(+), 2 deletions(-)
diff --git a/promisor-remote.c b/promisor-remote.c
index 96fa215b06..225260b05f 100644
--- a/promisor-remote.c
+++ b/promisor-remote.c
@@ -46,7 +46,7 @@ static int fetch_objects(struct repository *repo,
"fetch", remote_name, "--no-tags",
"--no-write-fetch-head", "--recurse-submodules=no",
"--filter=blob:none", "--stdin", NULL);
- if (!repo_config_get_bool(the_repository, "promisor.quiet", &quiet) && quiet)
+ if (!repo_config_get_bool(repo, "promisor.quiet", &quiet) && quiet)
strvec_push(&child.args, "--quiet");
if (start_command(&child))
die(_("promisor-remote: unable to fork off fetch subprocess"));
diff --git a/t/t0410-partial-clone.sh b/t/t0410-partial-clone.sh
index 52e19728a3..dff442da20 100755
--- a/t/t0410-partial-clone.sh
+++ b/t/t0410-partial-clone.sh
@@ -717,7 +717,29 @@ test_expect_success 'setup for promisor.quiet tests' '
git -C server rm foo.t &&
git -C server commit -m remove &&
git -C server config uploadpack.allowanysha1inwant 1 &&
- git -C server config uploadpack.allowfilter 1
+ git -C server config uploadpack.allowfilter 1 &&
+
+ # Setup for submodule repo test: superproject whose submodule is a
+ # partial clone, so that promisor.quiet is read via a non-main repo.
+ rm -rf sub-pc-src sub-pc-srv.bare super-src super-work &&
+ git init sub-pc-src &&
+ test_commit -C sub-pc-src initial file.txt "hello" &&
+
+ git clone --bare sub-pc-src sub-pc-srv.bare &&
+ git -C sub-pc-srv.bare config uploadpack.allowfilter 1 &&
+ git -C sub-pc-srv.bare config uploadpack.allowanysha1inwant 1 &&
+
+ git init super-src &&
+ git -C super-src -c protocol.file.allow=always \
+ submodule add "file://$(pwd)/sub-pc-srv.bare" sub &&
+ git -C super-src commit -m "add submodule" &&
+
+ git -c protocol.file.allow=always clone super-src super-work &&
+ git -C super-work -c protocol.file.allow=always \
+ submodule update --init --filter=blob:none sub &&
+
+ # Allow file:// in the submodule so that lazy-fetch subprocesses work.
+ git -C super-work/sub config protocol.file.allow always
'
test_expect_success TTY 'promisor.quiet=false shows progress messages' '
@@ -752,6 +774,27 @@ test_expect_success TTY 'promisor.quiet=unconfigured shows progress messages' '
grep "Receiving objects" err
'
+test_expect_success 'promisor.quiet from submodule repo is honored' '
+ rm -f pc-quiet-trace &&
+
+ # Set promisor.quiet only in the submodule, not the superproject.
+ git -C super-work/sub config promisor.quiet true &&
+
+ # Push a new commit+blob to the server; the blob stays missing in the
+ # partial-clone submodule until a lazy fetch is triggered.
+ test_commit -C sub-pc-src updated new-file.txt "world" &&
+ git -C sub-pc-src push "$(pwd)/sub-pc-srv.bare" HEAD:master &&
+ git -C super-work/sub -c protocol.file.allow=always fetch origin &&
+ git -C super-work/sub reset --mixed origin/master &&
+
+ # grep descends into the submodule and triggers a lazy fetch for the
+ # missing blob; verify the fetch subprocess carries --quiet.
+ GIT_TRACE2_EVENT="$(pwd)/pc-quiet-trace" \
+ git -C super-work grep --cached --recurse-submodules "world" \
+ 2>/dev/null &&
+ grep negotiationAlgorithm pc-quiet-trace | grep -e --quiet
+'
+
. "$TEST_DIRECTORY"/lib-httpd.sh
start_httpd
--
2.43.0
next reply other threads:[~2026-04-06 18:30 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-04-06 18:30 Trieu Huynh [this message]
2026-04-08 17:48 ` [GSoC PATCH] promisor-remote: fix promisor.quiet to use the correct repository Tian Yuchen
2026-04-08 18:23 ` Junio C Hamano
2026-04-09 4:34 ` Tian Yuchen
2026-04-13 18:22 ` Trieu Huynh
2026-04-15 17:39 ` Junio C Hamano
2026-04-15 18:03 ` Tian Yuchen
2026-04-08 17:53 ` Tian Yuchen
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=20260406183041.783800-1-vikingtc4@gmail.com \
--to=vikingtc4@gmail.com \
--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