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@xxxxxxxxx> --- 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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html