From: Johan Herland <johan@herland.net>
To: git@vger.kernel.org
Cc: Johan Herland <johan@herland.net>,
barkalow@iabervon.org, gitster@pobox.com
Subject: [RFC 08/11] Teach foreign transport code to perform the "capabilities" command
Date: Mon, 27 Jul 2009 03:04:16 +0200 [thread overview]
Message-ID: <1248656659-21415-9-git-send-email-johan@herland.net> (raw)
In-Reply-To: <1248656659-21415-1-git-send-email-johan@herland.net>
The features reported by the vcs helper are stored in the foreign_data struct
which is expanded for this purpose.
In the process, we also change the capabilities command slightly to expect
one feature per line (instead of all features on a single line). This enables
us to add features in the future that take one or more arguments. To terminate
the list of features, a blank line is output at the end.
Signed-off-by: Johan Herland <johan@herland.net>
---
Documentation/git-vcs.txt | 8 ++--
transport-foreign.c | 83 ++++++++++++++++++++++++++++++++++-----------
2 files changed, 67 insertions(+), 24 deletions(-)
diff --git a/Documentation/git-vcs.txt b/Documentation/git-vcs.txt
index febe415..85656d4 100644
--- a/Documentation/git-vcs.txt
+++ b/Documentation/git-vcs.txt
@@ -33,10 +33,10 @@ The output of each command must be produced on the helper's standard output.
The helper's standard error stream can be used for status/progress messages.
'capabilities'::
- Outputs a single line with a list of feature names separated
- by spaces. Each of these indicates a supported feature of the
- helper, and the caller will only attempt operations that are
- supported.
+ Outputs a list of feature names, one per line. Each of these
+ indicates a supported feature of the helper, and the caller
+ will only attempt operations that are supported.
+ The output list shall be terminated with a blank line.
'list'::
Outputs the names of refs, one per line. These may be
diff --git a/transport-foreign.c b/transport-foreign.c
index 29aad77..be0a587 100644
--- a/transport-foreign.c
+++ b/transport-foreign.c
@@ -8,38 +8,81 @@
struct foreign_data
{
- struct child_process *importer;
+ struct child_process importer;
+
+ /* capabilities */
+ unsigned export:1;
+ unsigned export_branch:1;
+ unsigned export_merges:1;
};
+static void get_foreign_capabilities(struct foreign_data *fdata)
+{
+ struct strbuf buf;
+ FILE *file;
+
+ write(fdata->importer.in, "capabilities\n", 13);
+
+ strbuf_init(&buf, 0);
+ file = fdopen(fdata->importer.out, "r");
+ while (1) {
+ char *eon;
+ if (strbuf_getline(&buf, file, '\n') == EOF)
+ break;
+
+ if (!*buf.buf)
+ break;
+
+ eon = strchr(buf.buf, ' ');
+ if (eon)
+ *eon = '\0';
+
+ /* parse features */
+ if (!strcmp(buf.buf, "export"))
+ fdata->export = 1;
+ else if (!strcmp(buf.buf, "export-branch"))
+ fdata->export_branch = 1;
+ else if (!strcmp(buf.buf, "export-merges"))
+ fdata->export_merges = 1;
+ else
+ die("Invalid feature '%s'", buf.buf);
+
+ strbuf_reset(&buf);
+ }
+
+ strbuf_release(&buf);
+}
+
static struct child_process *get_importer(struct transport *transport)
{
- struct child_process *importer = transport->data;
- if (!importer) {
+ struct foreign_data *fdata = (struct foreign_data *) transport->data;
+ if (!fdata) {
struct strbuf buf;
- importer = xcalloc(1, sizeof(*importer));
- importer->in = -1;
- importer->out = -1;
- importer->err = 0;
- importer->argv = xcalloc(3, sizeof(*importer->argv));
+ fdata = xcalloc(1, sizeof(*fdata));
+ fdata->importer.in = -1;
+ fdata->importer.out = -1;
+ fdata->importer.err = 0;
+ fdata->importer.argv = xcalloc(3, sizeof(*fdata->importer.argv));
strbuf_init(&buf, 80);
strbuf_addf(&buf, "vcs-%s", transport->remote->foreign_vcs);
- importer->argv[0] = buf.buf;
- importer->argv[1] = transport->remote->name;
- importer->git_cmd = 1;
- start_command(importer);
- transport->data = importer;
+ fdata->importer.argv[0] = buf.buf;
+ fdata->importer.argv[1] = transport->remote->name;
+ fdata->importer.git_cmd = 1;
+ start_command(&fdata->importer);
+ get_foreign_capabilities(fdata);
+ transport->data = fdata;
}
- return importer;
+ return &fdata->importer;
}
static int disconnect_foreign(struct transport *transport)
{
- struct child_process *importer = transport->data;
- if (importer) {
- write(importer->in, "\n", 1);
- close(importer->in);
- finish_command(importer);
- free(importer);
+ struct foreign_data *fdata = (struct foreign_data *) transport->data;
+ if (fdata) {
+ write(fdata->importer.in, "\n", 1);
+ close(fdata->importer.in);
+ finish_command(&fdata->importer);
+ free(fdata);
transport->data = NULL;
}
return 0;
--
1.6.4.rc3.138.ga6b98.dirty
next prev parent reply other threads:[~2009-07-27 1:06 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-07-27 1:04 [RFC 00/11] Foreign VCS helper program for CVS repositories Johan Herland
2009-07-27 1:04 ` [RFC 01/11] Add specification of git-vcs-* helper programs Johan Herland
2009-07-27 1:04 ` [RFC 02/11] Use a function to determine whether a remote is valid Johan Herland
2009-07-27 1:04 ` [RFC 03/11] Allow programs to not depend on remotes having urls Johan Herland
2009-07-27 18:55 ` Junio C Hamano
2009-07-27 19:33 ` Daniel Barkalow
2009-07-29 8:57 ` Alex Riesen
2009-07-30 0:24 ` Johan Herland
2009-07-27 1:04 ` [RFC 04/11] Add a transport implementation using git-vcs-* helpers Johan Herland
2009-07-27 1:04 ` [RFC 05/11] Refactor path name parsing into new function: get_path_str() Johan Herland
2009-07-27 1:04 ` [RFC 06/11] Add support for mark references as path names Johan Herland
2009-07-27 14:12 ` Shawn O. Pearce
2009-07-27 18:26 ` Johan Herland
2009-07-27 18:35 ` Shawn O. Pearce
2009-07-28 1:43 ` [RFC 06/11 v2] fast-import: Add support for importing commit notes Johan Herland
2009-07-29 2:18 ` Junio C Hamano
2009-07-29 2:41 ` Johan Herland
2009-07-29 14:26 ` Shawn O. Pearce
2009-07-29 16:20 ` Junio C Hamano
2009-07-30 0:29 ` Johan Herland
2009-07-30 2:35 ` Junio C Hamano
2009-07-29 18:56 ` Junio C Hamano
2009-07-29 23:08 ` Johan Herland
2009-07-27 1:04 ` [RFC 07/11] Preliminary clarifications to git-vcs documentation Johan Herland
2009-07-27 1:04 ` Johan Herland [this message]
2009-07-27 1:04 ` [RFC 09/11] Introduce a 'marks <filename>' feature to the foreign transport code Johan Herland
2009-07-27 1:04 ` [RFC 11/11] Add simple test cases of git-vcs-cvs functionality Johan Herland
2009-07-27 17:27 ` [RFC 00/11] Foreign VCS helper program for CVS repositories Daniel Barkalow
2009-07-27 18:11 ` Johan Herland
2009-07-27 18:58 ` Daniel Barkalow
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1248656659-21415-9-git-send-email-johan@herland.net \
--to=johan@herland.net \
--cc=barkalow@iabervon.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).