git/list[1] front-page[2] threads[3] people[4] search[5] about
 

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

From
Junio C Hamano <gitster@pobox.com>
Date
Mar 13, 2019, 04:09 UTC
Message-ID
<xmqqtvg7e7pn.fsf@gitster-ct.c.googlers.com>
In-Reply-To
<20190312132959.11764-3-chriscool@tuxfamily.org>
Christian Couder <christian.couder@gmail.com> 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".

Show 7 quoted lines
> +{
> +	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.

Show 17 quoted lines
> 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 @@
> +#ifndef PROMISOR_REMOTE_H
> +#define PROMISOR_REMOTE_H
> +
> +/*
> + * 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 FLEXPTR_ALLOC_STR().

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 later?

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).

Thanks.
Previous: Christian CouderNext: Junio C Hamano
Message 7 of 22 in “Many promisor remotes”
  1. 00/11 Many promisor remotesChristian Couder, Mar 12, 2019
  2. 01/11 fetch-object: make functions return an error codeChristian Couder, Mar 12, 2019
  3. 03/11 promisor-remote: implement promisor_remote_get_direct()Christian Couder, Mar 12, 2019
  4. Junio C HamanoMar 13, 2019
  5. Christian CouderApr 1, 2019
  6. 02/11 Add initial support for many promisor remotesChristian Couder, Mar 12, 2019
  7. Junio C HamanoMar 13, 2019
  8. Junio C HamanoMar 13, 2019
  9. Christian CouderApr 1, 2019
  10. 04/11 promisor-remote: add promisor_remote_reinit()Christian Couder, Mar 12, 2019
  11. Junio C HamanoMar 13, 2019
  12. Christian CouderApr 1, 2019
  13. 05/11 promisor-remote: use repository_format_partial_cloneChristian Couder, Mar 12, 2019
  14. Junio C HamanoMar 13, 2019
  15. Christian CouderApr 1, 2019
  16. Junio C HamanoApr 1, 2019
  17. 07/11 promisor-remote: parse remote.*.partialclonefilterChristian Couder, Mar 12, 2019
  18. 08/11 builtin/fetch: remove unique promisor remote limitationChristian Couder, Mar 12, 2019
  19. 06/11 Use promisor_remote_get_direct() and has_promisor_remote()Christian Couder, Mar 12, 2019
  20. 09/11 t0410: test fetching from many promisor remotesChristian Couder, Mar 12, 2019
  21. 10/11 partial-clone: add multiple remotes in the docChristian Couder, Mar 12, 2019
  22. 11/11 remote: add promisor and partial clone config to the docChristian Couder, Mar 12, 2019

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.