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

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

From
Sverre Rabbelier <srabbelier@gmail.com>
Date
Nov 6, 2009, 22:52 UTC
Message-ID
<1257547966-14603-8-git-send-email-srabbelier@gmail.com>
In-Reply-To
<1257547966-14603-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.2.158.g6dacb
Previous: Sverre RabbelierNext: Sverre Rabbelier
Message 8 of 22 in “Reroll of the remote-vcs-helper series”
  1. 00/12 Reroll of the remote-vcs-helper seriesSverre Rabbelier, Nov 6, 2009
  2. 01/12 Fix memory leak in helper method for disconnectSverre Rabbelier, Nov 6, 2009
  3. 02/12 Allow programs to not depend on remotes having urlsSverre Rabbelier, Nov 6, 2009
  4. 03/12 Use a function to determine whether a remote is validSverre Rabbelier, Nov 6, 2009
  5. 04/12 Allow fetch to modify refsSverre Rabbelier, Nov 6, 2009
  6. 05/12 Add a config option for remotes to specify a foreign vcsSverre Rabbelier, Nov 6, 2009
  7. 06/12 Allow specifying the remote helper in the urlSverre Rabbelier, Nov 6, 2009
  8. 07/12 Add support for "import" helper commandSverre Rabbelier, Nov 6, 2009
  9. 08/12 Allow helper to map private ref names into normal namesSverre Rabbelier, Nov 6, 2009
  10. 09/12 Allow helpers to report in "list" command that the ref is unchangedSverre Rabbelier, Nov 6, 2009
  11. 10/12 Allow helpers to request the path to the .git directorySverre Rabbelier, Nov 6, 2009
  12. 11/12 Basic build infrastructure for Python scriptsSverre Rabbelier, Nov 6, 2009
  13. 12/12 Add Python support library for remote helpersSverre Rabbelier, Nov 6, 2009
  14. Andrzej K. HaczewskiNov 6, 2009
  15. Sverre RabbelierNov 6, 2009
  16. Johannes SchindelinNov 7, 2009
  17. Daniel BarkalowNov 6, 2009
  18. Sverre RabbelierNov 6, 2009
  19. Sverre RabbelierNov 9, 2009
  20. Junio C HamanoNov 9, 2009
  21. Sverre RabbelierNov 9, 2009
  22. Junio C HamanoNov 9, 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.