From: Florian Achleitner <florian.achleitner.2.6.31@gmail.com>
To: git@vger.kernel.org
Cc: David Michael Barr <davidbarr@google.com>,
Sverre Rabbelier <srabbelier@gmail.com>,
Jeff King <peff@peff.net>, Johannes Sixt <j.sixt@viscovery.net>,
jrnieder@gmail.com
Subject: [RFC 1/4 v2] Implement a basic remote helper for svn in C.
Date: Fri, 29 Jun 2012 09:54:51 +0200 [thread overview]
Message-ID: <23122876.7xH9dZiP4M@flobuntu> (raw)
In-Reply-To: <1374057.qfvOg1c6C6@flobuntu>
Experimental implementation.
Inspired by the existing shell script at divanorama/remote-svn-alpha.
It doesn't use marks or notes yet, always imports the full history.
svnrdump is started as a subprocess while svn-fe's functions
are called directly.
Signed-off-by: Florian Achleitner <florian.achleitner.2.6.31@gmail.com>
---
diff: Use fifo instead of pipe: Retrieve the name of the pipe from env and open it
for svndump.
contrib/svn-fe/remote-svn.c | 207 +++++++++++++++++++++++++++++++++++++++++++
1 file changed, 207 insertions(+)
create mode 100644 contrib/svn-fe/remote-svn.c
diff --git a/contrib/svn-fe/remote-svn.c b/contrib/svn-fe/remote-svn.c
new file mode 100644
index 0000000..5ec7fbb
--- /dev/null
+++ b/contrib/svn-fe/remote-svn.c
@@ -0,0 +1,207 @@
+
+#include <stdlib.h>
+#include <string.h>
+#include <stdio.h>
+#include "cache.h"
+#include "remote.h"
+#include "strbuf.h"
+#include "url.h"
+#include "exec_cmd.h"
+#include "run-command.h"
+#include "svndump.h"
+
+static int debug = 0;
+
+static inline void printd(const char* fmt, ...)
+{
+ if(debug) {
+ va_list vargs;
+ va_start(vargs, fmt);
+ fprintf(stderr, "rhsvn debug: ");
+ vfprintf(stderr, fmt, vargs);
+ fprintf(stderr, "\n");
+ va_end(vargs);
+ }
+}
+
+static struct remote* remote;
+static const char* url;
+const char* private_refs = "refs/remote-svn/"; /* + remote->name. */
+const char* remote_ref = "refs/heads/master";
+
+enum cmd_result cmd_capabilities(struct strbuf* line);
+enum cmd_result cmd_import(struct strbuf* line);
+enum cmd_result cmd_list(struct strbuf* line);
+
+enum cmd_result { SUCCESS, NOT_HANDLED, ERROR };
+typedef enum cmd_result (*command)(struct strbuf*);
+
+const command command_list[] = {
+ cmd_capabilities, cmd_import, cmd_list, NULL
+};
+
+enum cmd_result cmd_capabilities(struct strbuf* line)
+{
+ if(strcmp(line->buf, "capabilities"))
+ return NOT_HANDLED;
+
+ printf("import\n");
+ printf("\n");
+ fflush(stdout);
+ return SUCCESS;
+}
+
+enum cmd_result cmd_import(struct strbuf* line)
+{
+ const char* revs = "-r0:HEAD";
+ int code, report_fd;
+ char* back_pipe_env;
+ struct child_process svndump_proc = {
+ .argv = NULL, /* comes later .. */
+ /* we want a pipe to the child's stdout, but stdin, stderr inherited.
+ The user can be asked for e.g. a password */
+ .in = 0, .out = -1, .err = 0,
+ .no_stdin = 0, .no_stdout = 0, .no_stderr = 0,
+ .git_cmd = 0,
+ .silent_exec_failure = 0,
+ .stdout_to_stderr = 0,
+ .use_shell = 0,
+ .clean_on_exit = 0,
+ .preexec_cb = NULL,
+ .env = NULL,
+ .dir = NULL
+ };
+
+ if(prefixcmp(line->buf, "import"))
+ return NOT_HANDLED;
+
+ back_pipe_env = getenv("GIT_REPORT_FIFO");
+ if(!back_pipe_env) {
+ die("Cannot get cat-blob-pipe from environment!");
+ }
+
+ /* opening a fifo for usually reading blocks until a writer has opened it too.
+ * Therefore, we open with RDWR.
+ */
+ report_fd = open(back_pipe_env, O_RDWR);
+ if(report_fd < 0) {
+ die("Unable to open fast-import back-pipe! %s", strerror(errno));
+ }
+
+ printd("Opened fast-import back-pipe %s for reading.", back_pipe_env);
+
+ svndump_proc.argv = xcalloc(5, sizeof(char*));
+ svndump_proc.argv[0] = "svnrdump";
+ svndump_proc.argv[1] = "dump";
+ svndump_proc.argv[2] = url;
+ svndump_proc.argv[3] = revs;
+
+ code = start_command(&svndump_proc);
+ if(code)
+ die("Unable to start %s, code %d", svndump_proc.argv[0], code);
+
+
+
+ svndump_init_fd(svndump_proc.out, report_fd);
+ svndump_read(url);
+ svndump_deinit();
+ svndump_reset();
+
+ close(svndump_proc.out);
+ close(report_fd);
+
+ code = finish_command(&svndump_proc);
+ if(code)
+ warning("Something went wrong with termination of %s, code %d", svndump_proc.argv[0], code);
+ free(svndump_proc.argv);
+
+ printf("done\n");
+ return SUCCESS;
+
+
+
+}
+
+enum cmd_result cmd_list(struct strbuf* line)
+{
+ if(strcmp(line->buf, "list"))
+ return NOT_HANDLED;
+
+ printf("? HEAD\n");
+ printf("? %s\n", remote_ref);
+ printf("\n");
+ fflush(stdout);
+ return SUCCESS;
+}
+
+enum cmd_result do_command(struct strbuf* line)
+{
+ const command* p = command_list;
+ enum cmd_result ret;
+ printd("command line '%s'", line->buf);
+ while(*p) {
+ ret = (*p)(line);
+ if(ret != NOT_HANDLED)
+ return ret;
+ p++;
+ }
+ warning("Unknown command '%s'\n", line->buf);
+ return ret;
+}
+
+int main(int argc, const char **argv)
+{
+ struct strbuf buf = STRBUF_INIT;
+ int nongit;
+
+ if (getenv("GIT_TRANSPORT_HELPER_DEBUG"))
+ debug = 1;
+
+ git_extract_argv0_path(argv[0]);
+ setup_git_directory_gently(&nongit);
+ if (argc < 2) {
+ fprintf(stderr, "Remote needed\n");
+ return 1;
+ }
+
+ remote = remote_get(argv[1]);
+ if (argc == 3) {
+ end_url_with_slash(&buf, argv[2]);
+ } else if (argc == 2) {
+ end_url_with_slash(&buf, remote->url[0]);
+ } else {
+ warning("Excess arguments!");
+ }
+
+ url = strbuf_detach(&buf, NULL);
+
+ printd("remote-svn starting with url %s", url);
+
+ /* build private ref namespace path for this svn remote. */
+ strbuf_init(&buf, 0);
+ strbuf_addstr(&buf, private_refs);
+ strbuf_addstr(&buf, remote->name);
+ strbuf_addch(&buf, '/');
+ private_refs = strbuf_detach(&buf, NULL);
+
+ while(1) {
+ if (strbuf_getline(&buf, stdin, '\n') == EOF) {
+ if (ferror(stdin))
+ fprintf(stderr, "Error reading command stream\n");
+ else
+ fprintf(stderr, "Unexpected end of command stream\n");
+ return 1;
+ }
+ /* an empty line terminates the command stream */
+ if(buf.len == 0)
+ break;
+
+ do_command(&buf);
+ strbuf_reset(&buf);
+ }
+
+ strbuf_release(&buf);
+ free((void*)url);
+ free((void*)private_refs);
+ return 0;
+}
--
1.7.9.5
next prev parent reply other threads:[~2012-06-29 8:01 UTC|newest]
Thread overview: 57+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-06-04 17:20 [RFC 0/4] Florian Achleitner
2012-06-04 17:20 ` [RFC 1/4] Implement a basic remote helper vor svn in C Florian Achleitner
2012-06-04 17:20 ` [RFC 2/4] Integrate remote-svn into svn-fe/Makefile Florian Achleitner
2012-06-04 17:20 ` [RFC 3/4] Add svndump_init_fd to allow reading dumps from arbitrary FDs Florian Achleitner
2012-06-04 17:20 ` [RFC 4/4] Add cat-blob report pipe from fast-import to remote-helper Florian Achleitner
2012-06-05 1:33 ` David Michael Barr
2012-06-05 6:56 ` Jeff King
2012-06-05 7:07 ` David Michael Barr
2012-06-05 8:14 ` Jeff King
2012-06-05 22:16 ` Florian Achleitner
2012-06-06 13:43 ` Jeff King
2012-06-06 21:04 ` Florian Achleitner
2012-06-05 8:51 ` Johannes Sixt
2012-06-05 9:07 ` Jeff King
2012-06-05 22:17 ` Florian Achleitner
2012-06-05 9:09 ` Johannes Sixt
2012-06-05 1:21 ` [RFC 3/4] Add svndump_init_fd to allow reading dumps from arbitrary FDs David Michael Barr
2012-06-29 7:49 ` [RFC 0/4 v2] Florian Achleitner
2012-06-29 7:54 ` Florian Achleitner [this message]
2012-07-02 11:07 ` [RFC 1/4 v2] Implement a basic remote helper for svn in C Jonathan Nieder
2012-07-06 0:30 ` Jonathan Nieder
2012-07-06 10:39 ` Florian Achleitner
2012-07-26 8:31 ` Florian Achleitner
2012-07-26 9:08 ` Jonathan Nieder
2012-07-26 16:16 ` Florian Achleitner
2012-07-28 7:00 ` Jonathan Nieder
2012-07-30 8:12 ` Florian Achleitner
2012-07-30 8:29 ` Jonathan Nieder
2012-07-30 13:55 ` Florian Achleitner
2012-07-30 16:55 ` Jonathan Nieder
2012-07-31 19:31 ` Florian Achleitner
2012-07-31 22:43 ` Jonathan Nieder
2012-08-01 8:25 ` Florian Achleitner
2012-08-01 19:42 ` Jonathan Nieder
2012-08-12 10:06 ` Florian Achleitner
2012-08-12 16:12 ` Jonathan Nieder
2012-08-12 19:39 ` Florian Achleitner
2012-08-12 20:10 ` Jonathan Nieder
2012-08-12 19:36 ` Jonathan Nieder
2012-07-26 17:29 ` Junio C Hamano
2012-07-30 8:12 ` Florian Achleitner
2012-07-26 9:45 ` Steven Michalske
[not found] ` <358E6F1E-8BAD-4F82-B270-0233AB86EF66@gmail.com>
2012-07-26 11:40 ` Jonathan Nieder
2012-07-26 14:28 ` Florian Achleitner
2012-07-26 14:54 ` Jonathan Nieder
2012-07-27 7:23 ` Florian Achleitner
2012-07-28 6:54 ` Jonathan Nieder
2012-06-29 7:58 ` [RFC 2/4 v2] Integrate remote-svn into svn-fe/Makefile Florian Achleitner
2012-06-29 7:59 ` [RFC 3/4 v2] Add svndump_init_fd to allow reading dumps from arbitrary FDs Florian Achleitner
2012-06-29 8:00 ` [RFC 4/4 v2] Add cat-blob report fifo from fast-import to remote-helper Florian Achleitner
2012-07-21 12:45 ` [RFC 4/4 v3] " Florian Achleitner
2012-07-21 14:48 ` Jonathan Nieder
2012-07-21 15:24 ` Florian Achleitner
2012-07-21 15:44 ` Jonathan Nieder
2012-07-22 21:03 ` Florian Achleitner
2012-07-22 21:24 ` Jonathan Nieder
2012-07-21 15:58 ` Jonathan Nieder
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=23122876.7xH9dZiP4M@flobuntu \
--to=florian.achleitner.2.6.31@gmail.com \
--cc=davidbarr@google.com \
--cc=git@vger.kernel.org \
--cc=j.sixt@viscovery.net \
--cc=jrnieder@gmail.com \
--cc=peff@peff.net \
--cc=srabbelier@gmail.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.