Re: [RFC 4/4] Add cat-blob report pipe from fast-import to remote-helper.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Mon, Jun 04, 2012 at 07:20:55PM +0200, Florian Achleitner wrote:

> On invocation of a helper a new pipe is opened.
> To close the other end after fork, the prexec_cb feature
> of the run_command api is used.
> If the helper is not used with fast-import later the pipe
> is unused.
> The FD is passed to the remote-helper via it's environment,
> helpers that don't use fast-import can simply ignore it.
> fast-import has an argv for that.

I don't keep up on fast-import development, so I have no clue how useful
this extra pipe is, or whether this patch is a good idea overall. But a
few comments on the transport.c half of things:

> +static int fd_to_close;
> +void close_fd_prexec_cb(void)
> +{
> +	if(debug)
> +		fprintf(stderr, "close_fd_prexec_cb closing %d\n", fd_to_close);
> +	close(fd_to_close);
> +}

Note that preexec_cb does not work at all on Windows, as it assumes a
forking model (rather than a spawn, which leaves no room to execute
arbitrary code in the child). If all you want to do is open an extra
pipe, then probably run-command should be extended to handle this
(though I have no idea how complex that would be for the Windows side of
things, it is at least _possible_, as opposed to preexec_cb, which will
never be possible).

> @@ -376,13 +411,20 @@ static int fetch_with_fetch(struct transport *transport,
>  static int get_importer(struct transport *transport, struct child_process *fastimport)
>  {
>  	struct child_process *helper = get_helper(transport);
> +	struct helper_data *data = transport->data;
> +	struct strbuf buf = STRBUF_INIT;
>  	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";
> +	strbuf_addf(&buf, "--cat-blob-fd=%d", data->fast_import_backchannel_pipe[1]);
> +	fastimport->argv[2] = strbuf_detach(&buf, NULL);

Consider converting this to use argv_array. You can drop the magic
numbers, and "argv_array_pushf" handles the strbuf bits for you
automatically.

And this grossness can go away:

> @@ -441,6 +488,7 @@ static int fetch_with_import(struct transport *transport,
>  
>  	if (finish_command(&fastimport))
>  		die("Error while running fast-import");
> +	free((void*)fastimport.argv[2]);
>  	free(fastimport.argv);
>  	fastimport.argv = NULL;

(you'd instead want to free everything; it would probably make sense to
add an argv_array_free_detached() function to do so).

> @@ -427,6 +469,11 @@ static int fetch_with_import(struct transport *transport,
>  	if (get_importer(transport, &fastimport))
>  		die("Couldn't run fast-import");
>  
> +
> +	/* in the parent process we close both pipe ends. */
> +	close(data->fast_import_backchannel_pipe[0]);
> +	close(data->fast_import_backchannel_pipe[1]);

I'm confused. We close both ends? Who is actually reading and writing to
this pipe, then?

-Peff
--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]