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

[PATCH v1 02/11] Add initial remote odb support

From
Christian Couder <christian.couder@gmail.com>
Date
Jun 23, 2018, 12:18 UTC
Message-ID
<20180623121846.19750-3-chriscool@tuxfamily.org>
In-Reply-To
<20180623121846.19750-1-chriscool@tuxfamily.org>

The remote-odb.{c,h} files will contain the functions that are called by the rest of Git mostly from "sha1-file.c" to access the objects managed by the remote odbs.

The odb-helper.{c,h} files will contain the functions to actually implement communication with either the internal functions or the external scripts or processes that will manage and provide remote git objects.

For now only infrastructure to create helpers from the config and to check if there are remote odbs and odb helpers is implemented.

We expect that there will not be a lot of helpers, so it is ok to use a simple linked list to manage them.

Helped-by: Jeff King <peff@peff.net>
Signed-off-by: Christian Couder <chriscool@tuxfamily.org>
---
 Makefile     |  2 ++
 odb-helper.c | 16 ++++++++++++
 odb-helper.h | 19 ++++++++++++++
 remote-odb.c | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 remote-odb.h |  7 +++++
 5 files changed, 116 insertions(+)
 create mode 100644 odb-helper.c
 create mode 100644 odb-helper.h
 create mode 100644 remote-odb.c
 create mode 100644 remote-odb.h
diff --git a/Makefile b/Makefile
index e4b503d259..8465e3ccd4 100644
--- a/Makefile
+++ b/Makefile
@@ -896,6 +896,8 @@ LIB_OBJS += notes-cache.o
 LIB_OBJS += notes-merge.o
 LIB_OBJS += notes-utils.o
 LIB_OBJS += object.o
+LIB_OBJS += odb-helper.o
+LIB_OBJS += remote-odb.o
 LIB_OBJS += oidmap.o
 LIB_OBJS += oidset.o
 LIB_OBJS += packfile.o
diff --git a/odb-helper.c b/odb-helper.c
new file mode 100644
index 0000000000..b4d403ffa9
--- /dev/null
+++ b/odb-helper.c
@@ -0,0 +1,16 @@
+#include "cache.h"
+#include "object.h"
+#include "argv-array.h"
+#include "odb-helper.h"
+#include "run-command.h"
+#include "sha1-lookup.h"
+
+struct odb_helper *odb_helper_new(const char *name, int namelen)
+{
+	struct odb_helper *o;
+
+	o = xcalloc(1, sizeof(*o));
+	o->name = xmemdupz(name, namelen);
+
+	return o;
+}
diff --git a/odb-helper.h b/odb-helper.h
new file mode 100644
index 0000000000..4b792a3896
--- /dev/null
+++ b/odb-helper.h
@@ -0,0 +1,19 @@
+#ifndef ODB_HELPER_H
+#define ODB_HELPER_H
+
+/*
+ * An odb helper is a way to access a remote odb.
+ *
+ * Information in its fields comes from the config file [odb "NAME"]
+ * entries.
+ */
+struct odb_helper {
+	const char *name;                 /* odb.<NAME>.* */
+	const char *remote;               /* odb.<NAME>.promisorRemote */
+
+	struct odb_helper *next;
+};
+
+extern struct odb_helper *odb_helper_new(const char *name, int namelen);
+
+#endif /* ODB_HELPER_H */
diff --git a/remote-odb.c b/remote-odb.c
new file mode 100644
index 0000000000..1dc165eaf6
--- /dev/null
+++ b/remote-odb.c
@@ -0,0 +1,72 @@
+#include "cache.h"
+#include "remote-odb.h"
+#include "odb-helper.h"
+#include "config.h"
+
+static struct odb_helper *helpers;
+static struct odb_helper **helpers_tail = &helpers;
+
+static struct odb_helper *find_or_create_helper(const char *name, int len)
+{
+	struct odb_helper *o;
+
+	for (o = helpers; o; o = o->next)
+		if (!strncmp(o->name, name, len) && !o->name[len])
+			return o;
+
+	o = odb_helper_new(name, len);
+	*helpers_tail = o;
+	helpers_tail = &o->next;
+
+	return o;
+}
+
+static int remote_odb_config(const char *var, const char *value, void *data)
+{
+	struct odb_helper *o;
+	const char *name;
+	int namelen;
+	const char *subkey;
+
+	if (parse_config_key(var, "odb", &name, &namelen, &subkey) < 0)
+		return 0;
+
+	o = find_or_create_helper(name, namelen);
+
+	if (!strcmp(subkey, "promisorremote"))
+		return git_config_string(&o->remote, var, value);
+
+	return 0;
+}
+
+static void remote_odb_init(void)
+{
+	static int initialized;
+
+	if (initialized)
+		return;
+	initialized = 1;
+
+	git_config(remote_odb_config, NULL);
+}
+
+struct odb_helper *find_odb_helper(const char *remote)
+{
+	struct odb_helper *o;
+
+	remote_odb_init();
+
+	if (!remote)
+		return helpers;
+
+	for (o = helpers; o; o = o->next)
+		if (!strcmp(o->remote, remote))
+			return o;
+
+	return NULL;
+}
+
+int has_remote_odb(void)
+{
+	return !!find_odb_helper(NULL);
+}
diff --git a/remote-odb.h b/remote-odb.h
new file mode 100644
index 0000000000..4c7b13695f
--- /dev/null
+++ b/remote-odb.h
@@ -0,0 +1,7 @@
+#ifndef REMOTE_ODB_H
+#define REMOTE_ODB_H
+
+extern struct odb_helper *find_odb_helper(const char *remote);
+extern int has_remote_odb(void);
+
+#endif /* REMOTE_ODB_H */
-- 
2.17.0.762.g886f54ea46
Previous: Christian CouderNext: Christian Couder
Message 2 of 15 in “Introducing remote ODBs”
  1. 0/9 Introducing remote ODBsChristian Couder, Jun 23, 2018
  2. 02/11 Add initial remote odb supportChristian Couder, Jun 23, 2018
  3. 04/11 remote-odb: implement remote_odb_get_many_direct()Christian Couder, Jun 23, 2018
  4. 07/11 Use odb.origin.partialclonefilter instead of core.partialclonefilterChristian Couder, Jun 23, 2018
  5. 06/11 Use remote_odb_get_direct() and has_remote_odb()Christian Couder, Jun 23, 2018
  6. 05/11 remote-odb: add remote_odb_reinit()Christian Couder, Jun 23, 2018
  7. 03/11 remote-odb: implement remote_odb_get_direct()Christian Couder, Jun 23, 2018
  8. 08/11 t0410: test fetching from many promisor remotesChristian Couder, Jun 23, 2018
  9. 09/11 Documentation/config: add odb.<name>.promisorRemoteChristian Couder, Jun 23, 2018
  10. 01/11 fetch-object: make functions return an error codeChristian Couder, Jun 23, 2018
  11. Christian CouderJun 23, 2018
  12. Junio C HamanoJun 25, 2018
  13. Eric SunshineJun 26, 2018
  14. Christian CouderJun 28, 2018
  15. Christian CouderJun 28, 2018

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.