threads / patch / 20392

patch, 13 partsAdd support for "import" helper command

Subject: [PATCH 08/13] Add support for "import" helper command

## tl;dr

5 messages between Aug 5, 2009 and Aug 5, 2009. Diffs are folded; open one to read it.

replies: 4people: 2as markdown or json

Daniel Barkalow· Aug 5, 2009, 05:02 UTC · lore

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

Signed-off-by: Daniel Barkalow <barkalow@iabervon.org>
---
 Documentation/git-remote-helpers.txt |   10 ++++++
 transport-helper.c                   |   51 ++++++++++++++++++++++++++++++++++
 2 files changed, 61 insertions(+), 0 deletions(-)
Show changes to 2 files +61 −0

Documentation/git-remote-helpers.txt, transport-helper.c

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 dccf400..6eee0da 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)
@@ -47,6 +48,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;
 }
@@ -89,6 +92,51 @@ static int fetch_with_fetch(struct transport *transport,
 	return 0;
 }
 
+static int get_importer(struct transport *transport, struct child_process *fastimport)
+{
+	struct helper_data *data = transport->data;
+	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;
+
+	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;
+		write_in_full(helper->in, "import ", 7);
+		write_in_full(helper->in, posn->name, strlen(posn->name));
+		write_in_full(helper->in, "\n", 1);
+	}
+	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)
 {
@@ -106,6 +154,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.4.rc3.27.g95032.dirty
Johannes Schindelin· Aug 5, 2009, 20:56 UTC · re: Daniel Barkalow · lore

Re: [PATCH 08/13] Add support for "import" helper command

Hi,
On Wed, 5 Aug 2009, Daniel Barkalow wrote:
> This command, supported if the "import" capability is advertized,
> allows a helper to support fetching by outputting a git-fast-import
> stream.
  If both the "import" and the "fetch" capability are advertised, the 
  "import" capability is ignored.
Show 14 quoted lines
> 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.
                                                      , but ignored if the 
+helper offers the "fetch" capability.

Ciao, Dscho

-- Sent from my EeePC

Daniel Barkalow· Aug 5, 2009, 21:17 UTC · re: Johannes Schindelin · lore

Re: [PATCH 08/13] Add support for "import" helper command

On Wed, 5 Aug 2009, Johannes Schindelin wrote:
Show 10 quoted lines
> Hi,
> 
> On Wed, 5 Aug 2009, Daniel Barkalow wrote:
> 
> > This command, supported if the "import" capability is advertized,
> > allows a helper to support fetching by outputting a git-fast-import
> > stream.
> 
>   If both the "import" and the "fetch" capability are advertised, the 
>   "import" capability is ignored.

The transport code notices that both are supported; it just doesn't use the less convenient one. It would be wrong for helpers to advertize both and depend on only "fetch" being used. (For example, there's no reason that hg couldn't use one of these helpers and use the "import" capability despite the "fetch" capability also being advertized, because "import" produces results which are portable across local vcses.)

	-Daniel
*This .sig left intentionally blank*
Johannes Schindelin· Aug 5, 2009, 21:23 UTC · re: Daniel Barkalow · lore

Re: [PATCH 08/13] Add support for "import" helper command

Hi,
On Wed, 5 Aug 2009, Daniel Barkalow wrote:
Show 19 quoted lines
> On Wed, 5 Aug 2009, Johannes Schindelin wrote:
> 
> > Hi,
> > 
> > On Wed, 5 Aug 2009, Daniel Barkalow wrote:
> > 
> > > This command, supported if the "import" capability is advertized,
> > > allows a helper to support fetching by outputting a git-fast-import
> > > stream.
> > 
> >   If both the "import" and the "fetch" capability are advertised, the 
> >   "import" capability is ignored.
> 
> The transport code notices that both are supported; it just doesn't use 
> the less convenient one. It would be wrong for helpers to advertize both 
> and depend on only "fetch" being used. (For example, there's no reason 
> that hg couldn't use one of these helpers and use the "import" capability 
> despite the "fetch" capability also being advertized, because "import" 
> produces results which are portable across local vcses.)

My point was not to criticize the decision. My point was to criticize the absence of the comment from both commit message and documentation.

Ciao, Dscho

Daniel Barkalow· Aug 5, 2009, 21:50 UTC · re: Johannes Schindelin · lore

Re: [PATCH 08/13] Add support for "import" helper command

On Wed, 5 Aug 2009, Johannes Schindelin wrote:
Show 26 quoted lines
> Hi,
> 
> On Wed, 5 Aug 2009, Daniel Barkalow wrote:
> 
> > On Wed, 5 Aug 2009, Johannes Schindelin wrote:
> > 
> > > Hi,
> > > 
> > > On Wed, 5 Aug 2009, Daniel Barkalow wrote:
> > > 
> > > > This command, supported if the "import" capability is advertized,
> > > > allows a helper to support fetching by outputting a git-fast-import
> > > > stream.
> > > 
> > >   If both the "import" and the "fetch" capability are advertised, the 
> > >   "import" capability is ignored.
> > 
> > The transport code notices that both are supported; it just doesn't use 
> > the less convenient one. It would be wrong for helpers to advertize both 
> > and depend on only "fetch" being used. (For example, there's no reason 
> > that hg couldn't use one of these helpers and use the "import" capability 
> > despite the "fetch" capability also being advertized, because "import" 
> > produces results which are portable across local vcses.)
> 
> My point was not to criticize the decision.  My point was to criticize the 
> absence of the comment from both commit message and documentation.

But it would be wrong for that documentation to say that "import" is ignored if "fetch" is available, because it's not necessarily true. I'll make the commit message say that git will prefer "fetch".

	-Daniel
*This .sig left intentionally blank*

← back to recent threads