diff options
author | Ilari Liusvaara <ilari.liusvaara@elisanet.fi> | 2009-12-09 17:26:31 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2009-12-09 12:40:42 -0800 |
commit | 61b075bd3e69cbdc9010a7f817b2017455dd36a7 (patch) | |
tree | f43a08f883021e92b35e72c2a30eab1cfb9a7298 /transport-helper.c | |
parent | aa5af9749f53f7e44bef36c5c40918295430fb03 (diff) | |
download | git-61b075bd3e69cbdc9010a7f817b2017455dd36a7.tar.gz |
Support taking over transports
Add support for taking over transports that turn out to be smart.
Signed-off-by: Ilari Liusvaara <ilari.liusvaara@elisanet.fi>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
Diffstat (limited to 'transport-helper.c')
-rw-r--r-- | transport-helper.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/transport-helper.c b/transport-helper.c index 271af345e4..97eed6cbf6 100644 --- a/transport-helper.c +++ b/transport-helper.c @@ -22,6 +22,10 @@ struct helper_data /* These go from remote name (as in "list") to private name */ struct refspec *refspecs; int refspec_nr; + /* Transport options for fetch-pack/send-pack (should one of + * those be invoked). + */ + struct git_transport_options transport_options; }; static void sendline(struct helper_data *helper, struct strbuf *buffer) @@ -81,6 +85,7 @@ static struct child_process *get_helper(struct transport *transport) const char **refspecs = NULL; int refspec_nr = 0; int refspec_alloc = 0; + int duped; if (data->helper) return data->helper; @@ -99,9 +104,19 @@ static struct child_process *get_helper(struct transport *transport) die("Unable to run helper: git %s", helper->argv[0]); data->helper = helper; + /* + * Open the output as FILE* so strbuf_getline() can be used. + * Do this with duped fd because fclose() will close the fd, + * and stuff like taking over will require the fd to remain. + * + */ + duped = dup(helper->out); + if (duped < 0) + die_errno("Can't dup helper output fd"); + data->out = xfdopen(duped, "r"); + write_constant(helper->in, "capabilities\n"); - data->out = xfdopen(helper->out, "r"); while (1) { const char *capname; int mandatory = 0; @@ -163,6 +178,7 @@ static int disconnect_helper(struct transport *transport) strbuf_addf(&buf, "\n"); sendline(data, &buf); close(data->helper->in); + close(data->helper->out); fclose(data->out); finish_command(data->helper); free((char *)data->helper->argv[0]); @@ -583,5 +599,6 @@ int transport_helper_init(struct transport *transport, const char *name) transport->fetch = fetch; transport->push_refs = push_refs; transport->disconnect = release_helper; + transport->smart_options = &(data->transport_options); return 0; } |