git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
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

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