{"thread":{"id":"23980","subject":"[WIP PATCH] Add a skeleton RA SVN client","startedAt":"2010-06-02T13:08:35Z","lastAt":"2010-06-02T13:08:36Z","messageCount":2,"participants":["Ramkumar Ramachandra"],"isPatch":true,"patchVersion":1,"patchTotal":null},"messages":[{"id":"142817","messageId":"1275484116-32520-1-git-send-email-artagnon@gmail.com","threadId":"23980","inReplyTo":null,"subject":"[WIP PATCH] The SVN RA client, finally","fromName":"Ramkumar Ramachandra","fromEmail":"artagnon@gmail.com","sentAt":"2010-06-02T13:08:35Z","receivedAt":"2010-06-02T13:08:35Z","isPatch":true,"sender":{"key":"r@artagnon.com","avatar":"https://avatars.githubusercontent.com/u/37226?v=4"},"body":"The skeleton SVN RA client currently looks like a stripped-down\nversion of svnsync. It was admittedly very time-consuming and\nfrustrating to get this far: Hopefully, the actual dumping won't take\ntoo much longer. I've also provided a small Makefile to build and test\nthis.\n\nNote that I'm developing this on my fork of svn_dump_fast_export, not\non my fork of git.git.\n\n-- Ram\n\nRamkumar Ramachandra (1):\n  Add a skeleton RA SVN client\n\n Makefile       |    2 +\n svnclient_ra.c |  113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 115 insertions(+), 0 deletions(-)\n create mode 100644 Makefile\n create mode 100644 svnclient_ra.c\n"},{"id":"142816","messageId":"1275484116-32520-2-git-send-email-artagnon@gmail.com","threadId":"23980","inReplyTo":"1275484116-32520-1-git-send-email-artagnon@gmail.com","subject":"[WIP PATCH] Add a skeleton RA SVN client","fromName":"Ramkumar Ramachandra","fromEmail":"artagnon@gmail.com","sentAt":"2010-06-02T13:08:36Z","receivedAt":"2010-06-02T13:08:36Z","isPatch":true,"sender":{"key":"r@artagnon.com","avatar":"https://avatars.githubusercontent.com/u/37226?v=4"},"body":"The SVN client uses the RA API to connect to a remote server and\nreplay revisions. In future, it will dump the data in every revision\nto stdout in dumpfile format (hopefully) without resorting to the FS\nAPI and svn_repos_dump_fs2.\n\nSigned-off-by: Ramkumar Ramachandra <artagnon@gmail.com>\n---\n Makefile       |    2 +\n svnclient_ra.c |  113 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n 2 files changed, 115 insertions(+), 0 deletions(-)\n create mode 100644 Makefile\n create mode 100644 svnclient_ra.c\n\ndiff --git a/Makefile b/Makefile\nnew file mode 100644\nindex 0000000..480c526\n--- /dev/null\n+++ b/Makefile\n@@ -0,0 +1,2 @@\n+svnclient_ra: svnclient_ra.c\n+\tcc -Wall -Werror -ggdb -O1 -o $@ -lsvn_client-1 svnclient_ra.c -I/usr/include/subversion-1 -I/usr/include/apr-1.0\ndiff --git a/svnclient_ra.c b/svnclient_ra.c\nnew file mode 100644\nindex 0000000..4113cb8\n--- /dev/null\n+++ b/svnclient_ra.c\n@@ -0,0 +1,113 @@\n+#include \"svn_pools.h\"\n+#include \"svn_cmdline.h\"\n+#include \"svn_client.h\"\n+#include \"svn_ra.h\"\n+\n+#include <stdio.h>\n+#include <stdlib.h>\n+\n+static apr_pool_t *pool = NULL;\n+static svn_client_ctx_t *ctx = NULL;\n+static svn_ra_session_t *session = NULL;\n+\n+static svn_error_t *replay_start(svn_revnum_t revision,\n+                                 void *replay_baton,\n+                                 const svn_delta_editor_t **editor,\n+                                 void **edit_baton,\n+                                 apr_hash_t *rev_props,\n+                                 apr_pool_t *pool)\n+{\n+\t/* TODO: Dump the data in revision to stdout in dumpfile\n+\t * format so it can be parsed by the exporter\n+\t */\n+\treturn SVN_NO_ERROR;\n+}\n+static svn_error_t *replay_end(svn_revnum_t revision,\n+                               void *replay_baton,\n+                               const svn_delta_editor_t *editor,\n+                               void *edit_baton,\n+                               apr_hash_t *rev_props,\n+                               apr_pool_t *pool)\n+{\n+\tSVN_ERR(editor->close_edit(edit_baton, pool));\n+\treturn SVN_NO_ERROR;\n+}\n+\n+svn_error_t *build_auth_baton()\n+{\n+\tsvn_auth_provider_object_t *provider;\n+\tapr_array_header_t *providers\n+\t\t= apr_array_make (pool, 4, sizeof (svn_auth_provider_object_t *));\n+\n+\tsvn_auth_get_simple_prompt_provider (&provider,\n+\t                                     NULL,\n+\t                                     NULL,\n+\t                                     2,\n+\t                                     pool);\n+\tAPR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;\n+\n+\tsvn_auth_get_username_prompt_provider (&provider,\n+\t                                       NULL,\n+\t                                       NULL,\n+\t                                       2,\n+\t                                       pool);\n+\tAPR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;\n+\n+\tsvn_auth_open (&ctx->auth_baton, providers, pool);\n+\treturn SVN_NO_ERROR;\n+}\n+\n+svn_error_t *populate_context()\n+{\n+\tSVN_ERR(svn_config_get_config(&(ctx->config), NULL, pool));\n+\treturn SVN_NO_ERROR;\n+}\n+\n+svn_error_t *open_connection(const char *url)\n+{\n+\tSVN_ERR(svn_config_ensure (NULL, pool));\n+\tSVN_ERR(svn_client_create_context (&ctx, pool));\n+\tSVN_ERR(svn_ra_initialize(pool));\n+\n+#if defined(WIN32) || defined(__CYGWIN__)\n+\tif (getenv(\"SVN_ASP_DOT_NET_HACK\"))\n+\t\tSVN_ERR(svn_wc_set_adm_dir(\"_svn\", pool));\n+#endif\n+\t\n+\tSVN_ERR(populate_context());\n+\tSVN_ERR(build_auth_baton());\n+\tSVN_ERR(svn_client_open_ra_session(&session, url, ctx, pool));\n+\treturn SVN_NO_ERROR;\n+}\n+\n+svn_error_t *replay_range(svn_revnum_t start_revision, svn_revnum_t end_revision)\n+{\n+\tsvn_revnum_t latest_revision;\n+\tSVN_ERR(svn_ra_get_latest_revnum(session, &latest_revision, pool));\n+\tprintf(\"%ld\\n\", latest_revision);\n+\tSVN_ERR(svn_ra_replay_range(session, start_revision, end_revision,\n+\t                            0, TRUE, replay_start, replay_end, NULL, pool));\n+\treturn SVN_NO_ERROR;\n+}\n+\n+void close_connection()\n+{\n+\tsvn_pool_destroy(pool);\n+}\n+\n+int main()\n+{\n+\tconst char url[] = \"http://svn.apache.org/repos/asf/subversion/trunk\";\n+\tsvn_revnum_t start_revision = 0, end_revision = 5;\n+\tif (svn_cmdline_init (\"svnclient_ra\", stderr) != EXIT_SUCCESS)\n+\t\treturn EXIT_FAILURE;\n+\tpool = svn_pool_create(NULL);\n+\n+\tif(open_connection(url) != SVN_NO_ERROR)\n+\t\treturn 1;\n+\tif(replay_range(start_revision, end_revision) != SVN_NO_ERROR)\n+\t\treturn 1;\n+\n+\tclose_connection();\n+\treturn 0;\n+}\n-- \n1.7.1\n"}]}