bundle-uri: serve bundle.* keys from config

Implement the "bundle-uri" protocol v2 capability by populating the
key=value packet lines from the local Git config. The list of bundles is
provided from the keys beginning with "bundle.".

In the future, we may want to filter this list to be more specific to
the exact known keys that the server intends to share, but for
flexibility at the moment we will assume that the config values are
well-formed.

Signed-off-by: Derrick Stolee <derrickstolee@github.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Derrick Stolee 2022-12-22 15:14:13 +00:00 committed by Junio C Hamano
parent 70b9c10373
commit 738dc7d4a5
2 changed files with 47 additions and 1 deletions

View File

@ -581,6 +581,16 @@ cached:
return advertise_bundle_uri; return advertise_bundle_uri;
} }
static int config_to_packet_line(const char *key, const char *value, void *data)
{
struct packet_reader *writer = data;
if (!strncmp(key, "bundle.", 7))
packet_write_fmt(writer->fd, "%s=%s", key, value);
return 0;
}
int bundle_uri_command(struct repository *r, int bundle_uri_command(struct repository *r,
struct packet_reader *request) struct packet_reader *request)
{ {
@ -592,7 +602,11 @@ int bundle_uri_command(struct repository *r,
if (request->status != PACKET_READ_FLUSH) if (request->status != PACKET_READ_FLUSH)
die(_("bundle-uri: expected flush after arguments")); die(_("bundle-uri: expected flush after arguments"));
/* TODO: Implement the communication */ /*
* Read all "bundle.*" config lines to the client as key=value
* packet lines.
*/
git_config(config_to_packet_line, &writer);
packet_writer_flush(&writer); packet_writer_flush(&writer);

View File

@ -136,6 +136,8 @@ test_expect_success "test bundle-uri with $BUNDLE_URI_PROTOCOL:// using protocol
[bundle] [bundle]
version = 1 version = 1
mode = all mode = all
[bundle "only"]
uri = $BUNDLE_URI_BUNDLE_URI_ESCAPED
EOF EOF
test-tool bundle-uri \ test-tool bundle-uri \
@ -157,6 +159,36 @@ test_expect_success "test bundle-uri with $BUNDLE_URI_PROTOCOL:// using protocol
[bundle] [bundle]
version = 1 version = 1
mode = all mode = all
[bundle "only"]
uri = $BUNDLE_URI_BUNDLE_URI_ESCAPED
EOF
test-tool bundle-uri \
ls-remote \
"$BUNDLE_URI_REPO_URI" \
>actual &&
test_cmp_config_output expect actual
'
test_expect_success "test bundle-uri with $BUNDLE_URI_PROTOCOL:// using protocol v2 with list" '
test_config -C "$BUNDLE_URI_PARENT" \
bundle.bundle1.uri "$BUNDLE_URI_BUNDLE_URI_ESCAPED-1.bdl" &&
test_config -C "$BUNDLE_URI_PARENT" \
bundle.bundle2.uri "$BUNDLE_URI_BUNDLE_URI_ESCAPED-2.bdl" &&
test_config -C "$BUNDLE_URI_PARENT" \
bundle.bundle3.uri "$BUNDLE_URI_BUNDLE_URI_ESCAPED-3.bdl" &&
# All data about bundle URIs
cat >expect <<-EOF &&
[bundle]
version = 1
mode = all
[bundle "bundle1"]
uri = $BUNDLE_URI_BUNDLE_URI_ESCAPED-1.bdl
[bundle "bundle2"]
uri = $BUNDLE_URI_BUNDLE_URI_ESCAPED-2.bdl
[bundle "bundle3"]
uri = $BUNDLE_URI_BUNDLE_URI_ESCAPED-3.bdl
EOF EOF
test-tool bundle-uri \ test-tool bundle-uri \