git.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Ramkumar Ramachandra <artagnon@gmail.com>
To: "Git Mailing List" <git@vger.kernel.org>
Cc: Sverre Rabbelier <srabbelier@gmail.com>,
	Jonathan Nieder <jrnieder@gmail.com>,
	David Michael Barr <david.barr@cordelta.com>
Subject: [WIP PATCH] Add a skeleton RA SVN client
Date: Wed,  2 Jun 2010 15:08:36 +0200	[thread overview]
Message-ID: <1275484116-32520-2-git-send-email-artagnon@gmail.com> (raw)
In-Reply-To: <1275484116-32520-1-git-send-email-artagnon@gmail.com>

The SVN client uses the RA API to connect to a remote server and
replay revisions. In future, it will dump the data in every revision
to stdout in dumpfile format (hopefully) without resorting to the FS
API and svn_repos_dump_fs2.

Signed-off-by: Ramkumar Ramachandra <artagnon@gmail.com>
---
 Makefile       |    2 +
 svnclient_ra.c |  113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 115 insertions(+), 0 deletions(-)
 create mode 100644 Makefile
 create mode 100644 svnclient_ra.c

diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..480c526
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,2 @@
+svnclient_ra: svnclient_ra.c
+	cc -Wall -Werror -ggdb -O1 -o $@ -lsvn_client-1 svnclient_ra.c -I/usr/include/subversion-1 -I/usr/include/apr-1.0
diff --git a/svnclient_ra.c b/svnclient_ra.c
new file mode 100644
index 0000000..4113cb8
--- /dev/null
+++ b/svnclient_ra.c
@@ -0,0 +1,113 @@
+#include "svn_pools.h"
+#include "svn_cmdline.h"
+#include "svn_client.h"
+#include "svn_ra.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+static apr_pool_t *pool = NULL;
+static svn_client_ctx_t *ctx = NULL;
+static svn_ra_session_t *session = NULL;
+
+static svn_error_t *replay_start(svn_revnum_t revision,
+                                 void *replay_baton,
+                                 const svn_delta_editor_t **editor,
+                                 void **edit_baton,
+                                 apr_hash_t *rev_props,
+                                 apr_pool_t *pool)
+{
+	/* TODO: Dump the data in revision to stdout in dumpfile
+	 * format so it can be parsed by the exporter
+	 */
+	return SVN_NO_ERROR;
+}
+static svn_error_t *replay_end(svn_revnum_t revision,
+                               void *replay_baton,
+                               const svn_delta_editor_t *editor,
+                               void *edit_baton,
+                               apr_hash_t *rev_props,
+                               apr_pool_t *pool)
+{
+	SVN_ERR(editor->close_edit(edit_baton, pool));
+	return SVN_NO_ERROR;
+}
+
+svn_error_t *build_auth_baton()
+{
+	svn_auth_provider_object_t *provider;
+	apr_array_header_t *providers
+		= apr_array_make (pool, 4, sizeof (svn_auth_provider_object_t *));
+
+	svn_auth_get_simple_prompt_provider (&provider,
+	                                     NULL,
+	                                     NULL,
+	                                     2,
+	                                     pool);
+	APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+
+	svn_auth_get_username_prompt_provider (&provider,
+	                                       NULL,
+	                                       NULL,
+	                                       2,
+	                                       pool);
+	APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+
+	svn_auth_open (&ctx->auth_baton, providers, pool);
+	return SVN_NO_ERROR;
+}
+
+svn_error_t *populate_context()
+{
+	SVN_ERR(svn_config_get_config(&(ctx->config), NULL, pool));
+	return SVN_NO_ERROR;
+}
+
+svn_error_t *open_connection(const char *url)
+{
+	SVN_ERR(svn_config_ensure (NULL, pool));
+	SVN_ERR(svn_client_create_context (&ctx, pool));
+	SVN_ERR(svn_ra_initialize(pool));
+
+#if defined(WIN32) || defined(__CYGWIN__)
+	if (getenv("SVN_ASP_DOT_NET_HACK"))
+		SVN_ERR(svn_wc_set_adm_dir("_svn", pool));
+#endif
+	
+	SVN_ERR(populate_context());
+	SVN_ERR(build_auth_baton());
+	SVN_ERR(svn_client_open_ra_session(&session, url, ctx, pool));
+	return SVN_NO_ERROR;
+}
+
+svn_error_t *replay_range(svn_revnum_t start_revision, svn_revnum_t end_revision)
+{
+	svn_revnum_t latest_revision;
+	SVN_ERR(svn_ra_get_latest_revnum(session, &latest_revision, pool));
+	printf("%ld\n", latest_revision);
+	SVN_ERR(svn_ra_replay_range(session, start_revision, end_revision,
+	                            0, TRUE, replay_start, replay_end, NULL, pool));
+	return SVN_NO_ERROR;
+}
+
+void close_connection()
+{
+	svn_pool_destroy(pool);
+}
+
+int main()
+{
+	const char url[] = "http://svn.apache.org/repos/asf/subversion/trunk";
+	svn_revnum_t start_revision = 0, end_revision = 5;
+	if (svn_cmdline_init ("svnclient_ra", stderr) != EXIT_SUCCESS)
+		return EXIT_FAILURE;
+	pool = svn_pool_create(NULL);
+
+	if(open_connection(url) != SVN_NO_ERROR)
+		return 1;
+	if(replay_range(start_revision, end_revision) != SVN_NO_ERROR)
+		return 1;
+
+	close_connection();
+	return 0;
+}
-- 
1.7.1

  reply	other threads:[~2010-06-02 13:07 UTC|newest]

Thread overview: 3+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-06-02 13:08 [WIP PATCH] The SVN RA client, finally Ramkumar Ramachandra
2010-06-02 13:08 ` Ramkumar Ramachandra [this message]
  -- strict thread matches above, loose matches on Subject: below --
2010-06-14 16:19 [GSoC update] git-remote-svn: Week 7 Ramkumar Ramachandra
2010-06-14 16:19 ` [WIP PATCH] Add a skeleton RA SVN client Ramkumar Ramachandra

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=1275484116-32520-2-git-send-email-artagnon@gmail.com \
    --to=artagnon@gmail.com \
    --cc=david.barr@cordelta.com \
    --cc=git@vger.kernel.org \
    --cc=jrnieder@gmail.com \
    --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 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).