[PATCH 21/25] serve: advertise 'features' when config exists
- From
Derrick Stolee via GitGitGadget <gitgitgadget@gmail.com>
- Date
- Feb 23, 2022, 18:30 UTC
- Message-ID
- <a6779c713afc19bfaf0ffa10bf97346b9b4e96fb.1645641063.git.gitgitgadget@gmail.com>
- In-Reply-To
- <pull.1160.git.1645641063.gitgitgadget@gmail.com>
From: Derrick Stolee <derrickstolee@github.com>
The 'features' capability allows a server to recommend some Git features at a high level. Previous changes implemented the capability so servers understand it, but it was never advertised.
Now, allow it to be advertised, but only when the capability will actually _do_ something. That is, advertise if and only if a config value exists with the prefix "serve.". This avoids unnecessary round trips for an empty result.
Signed-off-by: Derrick Stolee <derrickstolee@github.com> --- serve.c | 18 +++++++++++++++--- t/t5701-git-serve.sh | 9 +++++++++ 2 files changed, 24 insertions(+), 3 deletions(-)
diff --git a/serve.c b/serve.c index a1c853dda1f..7dcabb68147 100644 --- a/serve.c +++ b/serve.c @@ -18,12 +18,24 @@ static int always_advertise(struct repository *r, return 1; } -static int never_advertise(struct repository *r, - struct strbuf *value) +static int key_serve_prefix(const char *key, const char *value, void *data) { + int *signal = data; + if (!strncmp(key, "serve.", 6)) { + *signal = 1; + return 1; + } return 0; } +static int has_serve_config(struct repository *r, + struct strbuf *value) +{ + int signal = 0; + repo_config(r, key_serve_prefix, &signal); + return signal; +} + static int agent_advertise(struct repository *r, struct strbuf *value) { @@ -144,7 +156,7 @@ static struct protocol_capability capabilities[] = { }, { .name = "features", - .advertise = never_advertise, + .advertise = has_serve_config, .command = cap_features, }, }; diff --git a/t/t5701-git-serve.sh b/t/t5701-git-serve.sh index 1896f671cb3..6ef721c3f97 100755 --- a/t/t5701-git-serve.sh +++ b/t/t5701-git-serve.sh @@ -30,6 +30,15 @@ test_expect_success 'test capability advertisement' ' test_cmp expect actual ' +test_expect_success 'test capability advertisement' ' + test_when_finished git config --unset serve.bundleuri && + git config serve.bundleuri "file://$(pwd)" && + GIT_TEST_SIDEBAND_ALL=0 test-tool serve-v2 \ + --advertise-capabilities >out && + test-tool pkt-line unpack <out >actual && + grep features actual +' + test_expect_success 'stateless-rpc flag does not list capabilities' ' # Empty request test-tool pkt-line pack >in <<-EOF &&
-- gitgitgadget