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

5 messages from 2009-08-05 to 2009-08-05. Participants: Daniel Barkalow, Johannes Schindelin.
Thread: https://gitlist.dev/t/20392

## Daniel Barkalow, 2009-08-05 05:02

Subject: [PATCH 08/13] Add support for "import" helper command
Message-ID: <alpine.LNX.2.00.0908050055550.2147@iabervon.org>
URL: https://gitlist.dev/e/alpine.LNX.2.00.0908050055550.2147%40iabervon.org

```
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(-)

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, 2009-08-05 20:56

Subject: Re: [PATCH 08/13] Add support for "import" helper command
Message-ID: <alpine.DEB.1.00.0908052254570.8306@pacific.mpi-cbg.de>
URL: https://gitlist.dev/e/alpine.DEB.1.00.0908052254570.8306%40pacific.mpi-cbg.de
In-Reply-To: <alpine.LNX.2.00.0908050055550.2147@iabervon.org>

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

> 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, 2009-08-05 21:17

Subject: Re: [PATCH 08/13] Add support for "import" helper command
Message-ID: <alpine.LNX.2.00.0908051708060.2147@iabervon.org>
URL: https://gitlist.dev/e/alpine.LNX.2.00.0908051708060.2147%40iabervon.org
In-Reply-To: <alpine.DEB.1.00.0908052254570.8306@pacific.mpi-cbg.de>

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

	-Daniel
*This .sig left intentionally blank*

```

## Johannes Schindelin, 2009-08-05 21:23

Subject: Re: [PATCH 08/13] Add support for "import" helper command
Message-ID: <alpine.DEB.1.00.0908052321580.8306@pacific.mpi-cbg.de>
URL: https://gitlist.dev/e/alpine.DEB.1.00.0908052321580.8306%40pacific.mpi-cbg.de
In-Reply-To: <alpine.LNX.2.00.0908051708060.2147@iabervon.org>

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

Ciao,
Dscho

```

## Daniel Barkalow, 2009-08-05 21:50

Subject: Re: [PATCH 08/13] Add support for "import" helper command
Message-ID: <alpine.LNX.2.00.0908051747020.2147@iabervon.org>
URL: https://gitlist.dev/e/alpine.LNX.2.00.0908051747020.2147%40iabervon.org
In-Reply-To: <alpine.DEB.1.00.0908052321580.8306@pacific.mpi-cbg.de>

```
On Wed, 5 Aug 2009, Johannes Schindelin wrote:

> 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*

```
