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

[PATCH v4 07/12] Add support for "import" helper command

From
Sverre Rabbelier <srabbelier@gmail.com>
Date
Nov 18, 2009, 01:42 UTC
Message-ID
<1258508552-20752-8-git-send-email-srabbelier@gmail.com>
In-Reply-To
<1258508552-20752-7-git-send-email-srabbelier@gmail.com>
From: Daniel Barkalow <barkalow@iabervon.org>

This command, supported if the "import" capability is advertized, allows a helper to support fetching by outputting a git-fast-import stream.

If both "fetch" and "import" are advertized, git itself will use "fetch" (although other users may use "import" in this case).

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
Signed-off-by: Sverre Rabbelier <srabbelier@gmail.com>
---
	Unchanged.
 Documentation/git-remote-helpers.txt |   10 ++++++
 transport-helper.c                   |   52 ++++++++++++++++++++++++++++++++++
 2 files changed, 62 insertions(+), 0 deletions(-)
diff --git a/Documentation/git-remote-helpers.txt b/Documentation/git-remote-helpers.txt
index 173ee23..e9aa67e 100644
--- a/Documentation/git-remote-helpers.txt
+++ b/Documentation/git-remote-helpers.txt
@@ -43,6 +43,13 @@ Commands are given by the caller on the helper's standard input, one per line.
 +
 Supported if the helper has the "fetch" capability.
 
+'import' <name>::
+	Produces a fast-import stream which imports the current value
+	of the named ref. It may additionally import other refs as
+	needed to construct the history efficiently.
++
+Supported if the helper has the "import" capability.
+
 If a fatal error occurs, the program writes the error message to
 stderr and exits. The caller should expect that a suitable error
 message has been printed if the child closes the connection without
@@ -57,6 +64,9 @@ CAPABILITIES
 'fetch'::
 	This helper supports the 'fetch' command.
 
+'import'::
+	This helper supports the 'import' command.
+
 REF LIST ATTRIBUTES
 -------------------
 
diff --git a/transport-helper.c b/transport-helper.c
index 53d8f08..82caaae 100644
--- a/transport-helper.c
+++ b/transport-helper.c
@@ -11,6 +11,7 @@ struct helper_data
 	const char *name;
 	struct child_process *helper;
 	unsigned fetch : 1;
+	unsigned import : 1;
 };
 
 static struct child_process *get_helper(struct transport *transport)
@@ -48,6 +49,8 @@ static struct child_process *get_helper(struct transport *transport)
 			break;
 		if (!strcmp(buf.buf, "fetch"))
 			data->fetch = 1;
+		if (!strcmp(buf.buf, "import"))
+			data->import = 1;
 	}
 	return data->helper;
 }
@@ -98,6 +101,52 @@ static int fetch_with_fetch(struct transport *transport,
 	return 0;
 }
 
+static int get_importer(struct transport *transport, struct child_process *fastimport)
+{
+	struct child_process *helper = get_helper(transport);
+	memset(fastimport, 0, sizeof(*fastimport));
+	fastimport->in = helper->out;
+	fastimport->argv = xcalloc(5, sizeof(*fastimport->argv));
+	fastimport->argv[0] = "fast-import";
+	fastimport->argv[1] = "--quiet";
+
+	fastimport->git_cmd = 1;
+	return start_command(fastimport);
+}
+
+static int fetch_with_import(struct transport *transport,
+			     int nr_heads, struct ref **to_fetch)
+{
+	struct child_process fastimport;
+	struct child_process *helper = get_helper(transport);
+	int i;
+	struct ref *posn;
+	struct strbuf buf = STRBUF_INIT;
+
+	if (get_importer(transport, &fastimport))
+		die("Couldn't run fast-import");
+
+	for (i = 0; i < nr_heads; i++) {
+		posn = to_fetch[i];
+		if (posn->status & REF_STATUS_UPTODATE)
+			continue;
+
+		strbuf_addf(&buf, "import %s\n", posn->name);
+		write_in_full(helper->in, buf.buf, buf.len);
+		strbuf_reset(&buf);
+	}
+	disconnect_helper(transport);
+	finish_command(&fastimport);
+
+	for (i = 0; i < nr_heads; i++) {
+		posn = to_fetch[i];
+		if (posn->status & REF_STATUS_UPTODATE)
+			continue;
+		read_ref(posn->name, posn->old_sha1);
+	}
+	return 0;
+}
+
 static int fetch(struct transport *transport,
 		 int nr_heads, struct ref **to_fetch)
 {
@@ -115,6 +164,9 @@ static int fetch(struct transport *transport,
 	if (data->fetch)
 		return fetch_with_fetch(transport, nr_heads, to_fetch);
 
+	if (data->import)
+		return fetch_with_import(transport, nr_heads, to_fetch);
+
 	return -1;
 }
 
-- 
1.6.5.3.164.g07b0c
Previous: Sverre RabbelierNext: Sverre Rabbelier
Message 8 of 13 in “Reroll of the remote-vcs-helper series”
  1. 00/12 Reroll of the remote-vcs-helper seriesSverre Rabbelier, Nov 18, 2009
  2. 01/12 Fix memory leak in helper method for disconnectSverre Rabbelier, Nov 18, 2009
  3. 02/12 Allow programs to not depend on remotes having urlsSverre Rabbelier, Nov 18, 2009
  4. 03/12 Use a function to determine whether a remote is validSverre Rabbelier, Nov 18, 2009
  5. 04/12 Allow fetch to modify refsSverre Rabbelier, Nov 18, 2009
  6. 05/12 Add a config option for remotes to specify a foreign vcsSverre Rabbelier, Nov 18, 2009
  7. 06/12 Allow specifying the remote helper in the urlSverre Rabbelier, Nov 18, 2009
  8. 07/12 Add support for "import" helper commandSverre Rabbelier, Nov 18, 2009
  9. 08/12 Allow helper to map private ref names into normal namesSverre Rabbelier, Nov 18, 2009
  10. 09/12 Fix various memory leaks in transport-helper.cSverre Rabbelier, Nov 18, 2009
  11. 10/12 Allow helpers to report in "list" command that the ref is unchangedSverre Rabbelier, Nov 18, 2009
  12. 11/12 Basic build infrastructure for Python scriptsSverre Rabbelier, Nov 18, 2009
  13. 12/12 Add Python support library for remote helpersSverre Rabbelier, Nov 18, 2009

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.