Re: [PATCH v3 2/5] promisor-remote: allow a server to advertise more fields
- From
Patrick Steinhardt <ps@pks.im>
- Date
- May 27, 2025, 07:51 UTC
- Message-ID
- <aDVu6O9MUicmd8y4@pks.im>
- In-Reply-To
- <20250519141259.3061550-3-christian.couder@gmail.com>
On Mon, May 19, 2025 at 04:12:56PM +0200, Christian Couder wrote:
Show 25 quoted lines
> diff --git a/Documentation/config/promisor.adoc b/Documentation/config/promisor.adoc > index 2638b01f83..71311b70c8 100644 > --- a/Documentation/config/promisor.adoc > +++ b/Documentation/config/promisor.adoc > @@ -9,6 +9,24 @@ promisor.advertise:: > "false", which means the "promisor-remote" capability is not > advertised. > > +promisor.sendFields:: > + A comma or space separated list of additional remote related > + fields that a server will send while advertising its promisor > + remotes using the "promisor-remote" capability, see > + linkgit:gitprotocol-v2[5]. Currently, only the > + "partialCloneFilter" and "token" fields are supported. The > + "partialCloneFilter" field contains the partial clone filter > + used for the remote, and the "token" field contains an > + authentication token for the remote. > ++ > +When a field is part of this list and a corresponding > +"remote.foo.<field>" config variable is set on the server to a > +non-empty value, then the field and its value will be sent when > +advertising the promisor remote "foo". This list has no effect unless > +the "promisor.advertise" config variable is set to "true", and the > +"name" and "url" fields are always advertised regardless of this > +setting.
I think this documentation should be clarified to explicitly talk about "field names". In v2 I misread these paragraphs to mean that the admin is expected to configure name-value pairs because you say "fields" here, and that term is specified elsewhere to be such a pair.
Show 10 quoted lines
> diff --git a/promisor-remote.c b/promisor-remote.c > index 94e87f2f48..cde4079d8c 100644 > --- a/promisor-remote.c > +++ b/promisor-remote.c > @@ -314,6 +314,73 @@ static int allow_unsanitized(char ch) > return ch > 32 && ch < 127; > } > > +static const char promisor_field_filter[] = "partialCloneFilter"; > +static const char promisor_field_token[] = "token";
Curious. Why aren't these declared as mere string constants (static const char *)? It might be a bit more idiomatic to have these as all-uppercase defines to make it obvious that those aren't a local variable.
#define PROMISOR_FIELD_FILTER "partialCloneFilter"
#define PROMISOR_FIELD_TOKEN "token"Show 9 quoted lines
> @@ -326,6 +393,8 @@ struct promisor_info {
> struct promisor_info *next;
> const char *name;
> const char *url;
> + const char *filter;
> + const char *token;
> };
>
> static void promisor_info_list_free(struct promisor_info *p)Yup, this now follows my suggestion.
Show 21 quoted lines
> @@ -336,12 +405,45 @@ static void promisor_info_list_free(struct promisor_info *p)
> next = p->next;
> free((char *)p->name);
> free((char *)p->url);
> + free((char *)p->filter);
> + free((char *)p->token);
> free(p);
> }
> }
>
> -/* Prepare a 'struct promisor_info' linked list with config information. */
> -static struct promisor_info *promisor_config_info_list(struct repository *repo)
> +static void set_one_field(struct promisor_info *p,
> + const char *field, const char *value)
> +{
> + if (!strcasecmp(field, promisor_field_filter))
> + p->filter = xstrdup(value);
> + else if (!strcasecmp(field, promisor_field_token))
> + p->token = xstrdup(value);
> + else
> + BUG("Invalid field '%s'", field);s/Invalid/invalid/
Patrick