Web lists-archives.com

Re: [PATCH v3 02/11] Add initial support for many promisor remotes

Christian Couder <christian.couder@xxxxxxxxx> writes:

> +struct promisor_remote *promisor_remote_new(const char *remote_name)
> +{

Shouldn't this be static?  The config callback that calls this
function is inside this file.

> +	struct promisor_remote *o;
> +
> +	o = xcalloc(1, sizeof(*o));
> +	o->remote_name = xstrdup(remote_name);

A comment on this later...

> +static struct promisor_remote *promisor_remote_look_up(const char *remote_name,
> +						       struct promisor_remote **previous)

In our codebase, this operation is far more often called "lookup",
one word, according to "git grep -e look_up \*.h".

> +{
> +	struct promisor_remote *o, *p;
> +
> +	for (p = NULL, o = promisors; o; p = o, o = o->next)
> +		if (o->remote_name && !strcmp(o->remote_name, remote_name)) {
> +			if (previous)
> +				*previous = p;

I think the "previous" thing is for the callers to learn what
pointer points at the found entry, allowing e.g. an element to be
inserted just before the found element.  If so, would it make more
sense to use the more familiar pattern to use

	*previous = &promisors;

here?  That would remove the need to switch on NULL-ness of previous
in the caller.

> diff --git a/promisor-remote.h b/promisor-remote.h
> new file mode 100644
> index 0000000000..bfbf7c0f21
> --- /dev/null
> +++ b/promisor-remote.h
> @@ -0,0 +1,17 @@
> +
> +/*
> + * Promisor remote linked list
> + * Its information come from remote.XXX config entries.
> + */
> +struct promisor_remote {
> +	const char *remote_name;
> +	struct promisor_remote *next;
> +};

Would it make the management of storage easier to make it

	struct promisor_remote {
		struct promisor_remote *next;
		const char name[FLEX_ARRAY];

that will allow allocation with

	struct promisor_remote *r;
	FLEX_ALLOC_STR(r, name, remote_name);

Or if the remote_name field must be a pointer, perhaps use

What is the rule for these promisor names?  If these entries were on
the configuration file, then:

	[remote "origin"]
		url = ...
		promisor = frotz
		promisor = nitfol

	[remote "mirror"}
		url = ...
		promisor = frotz
		promisor = Frotz
		promisor = nit fol

would the two "frotz" for the two remotes refer to the same thing,
or are "promisor" values scoped to each remote?

Can the name of promisor be any string?  If they end up getting used
as part of a path on the filesystem, we'd need to worry about case
sensitivity and UTF-8 normalization issues as well.

In a large enough project where multi-promisor makes sense, what is
the expected number of promisors a repository would define?  10s?
1000s?  Would a linked list still make sense when deployed in the
real world, or would we be forced to move to something like hashmap

You do not have to have the answers to all these questions, and even
the ones with concrete answers, you do not necessarily have to act
on them right now (e.g. you may anticipate the eventual need to move
to hashmap, but prototyping with linked list is perfectly fine;
being aware of the possibility alone would force us to be careful to
make sure that the implementation detail does not leak through too
much and confined within _lookup(), _find(), etc. functions, and
that awareness is good enough at this point).