static int init_function (svn_client_ctx_t **ctx, apr_pool_t **pool, lua_State *L) { apr_allocator_t *allocator; svn_auth_baton_t *ab; svn_config_t *cfg; svn_error_t *err; if (svn_cmdline_init("svn", stderr) != EXIT_SUCCESS) { return send_error (L, "Error initializing svn\n"); } if (apr_allocator_create(&allocator)) { return send_error (L, "Error creating allocator\n"); } apr_allocator_max_free_set(allocator, SVN_ALLOCATOR_RECOMMENDED_MAX_FREE); *pool = svn_pool_create_ex(NULL, allocator); apr_allocator_owner_set(allocator, *pool); err = svn_ra_initialize(*pool); IF_ERROR_RETURN (err, *pool, L); err = svn_client_create_context (ctx, *pool); IF_ERROR_RETURN (err, *pool, L); err = svn_config_get_config(&((*ctx)->config), NULL, *pool); IF_ERROR_RETURN (err, *pool, L); cfg = apr_hash_get((*ctx)->config, SVN_CONFIG_CATEGORY_CONFIG, APR_HASH_KEY_STRING); err = svn_cmdline_setup_auth_baton(&ab, FALSE, NULL, NULL, NULL, FALSE, cfg, (*ctx)->cancel_func, (*ctx)->cancel_baton, *pool); IF_ERROR_RETURN (err, *pool, L); (*ctx)->auth_baton = ab; return 0; }
nsvn_t* nsvn_base_setup_auth (nsvn_t *instance, const char *username, const char *password, int non_interactive, int no_auth_cache) { if (!instance) return NULL; instance->err = svn_cmdline_setup_auth_baton( &instance->ctx->auth_baton, non_interactive, username, password, instance->config_dir, no_auth_cache, instance->cfg, instance->ctx->cancel_func, instance->ctx->cancel_baton, instance->pool); if (instance->err) instance->ctx->auth_baton = NULL; return instance; }
/* Opens a session */ char session_open(session_t *session) { svn_error_t *err; svn_client_ctx_t *ctx; svn_config_t *config; svn_auth_baton_t *auth_baton; const char *root; const char *config_dir = NULL; /* Make sure the URL is properly encoded */ session->encoded_url = svn_path_uri_encode(svn_path_canonicalize(session->url, session->pool), session->pool); /* Do neccessary SVN library initialization */ if ((err = svn_fs_initialize(session->pool))) { utils_handle_error(err, stderr, FALSE, "ERROR: "); svn_error_clear(err); return 1; } if ((err = svn_ra_initialize(session->pool))) { utils_handle_error(err, stderr, FALSE, "ERROR: "); svn_error_clear(err); return 1; } if ((err = svn_config_ensure(NULL, session->pool))) { utils_handle_error(err, stderr, FALSE, "ERROR: "); svn_error_clear(err); return 1; } /* Setup the client context */ if ((err = svn_client_create_context(&ctx, session->pool))) { utils_handle_error(err, stderr, FALSE, "ERROR: "); svn_error_clear(err); return 1; } if ((err = svn_config_get_config(&(ctx->config), NULL, session->pool))) { utils_handle_error(err, stderr, FALSE, "ERROR: "); svn_error_clear(err); return 1; } if (session->config_dir != NULL) { const char *path; if ((err = svn_utf_cstring_to_utf8(&path, session->config_dir, session->pool))) { utils_handle_error(err, stderr, FALSE, "ERROR: "); svn_error_clear(err); return 1; } config_dir = svn_path_canonicalize(path, session->pool); } /* Setup auth baton */ config = apr_hash_get(ctx->config, SVN_CONFIG_CATEGORY_CONFIG, APR_HASH_KEY_STRING); if ((err = svn_cmdline_setup_auth_baton(&auth_baton, (session->flags & SF_NON_INTERACTIVE), session->username, session->password, config_dir, (session->flags & SF_NO_AUTH_CACHE), config, NULL, NULL, session->pool))) { utils_handle_error(err, stderr, FALSE, "ERROR: "); svn_error_clear(err); return 1; } ctx->auth_baton = auth_baton; /* Setup the RA session */ if ((err = svn_client_open_ra_session(&(session->ra), session->encoded_url, ctx, session->pool))) { utils_handle_error(err, stderr, FALSE, "ERROR: "); svn_error_clear(err); return 1; } /* Determine the root (and the prefix) of the URL */ if ((err = svn_ra_get_repos_root(session->ra, &root, session->pool))) { utils_handle_error(err, stderr, FALSE, "ERROR: "); svn_error_clear(err); return 1; } session->root = root; if (!strcmp(session->encoded_url, root)) { session->prefix = apr_pstrdup(session->pool, ""); } else { session->prefix = apr_pstrdup(session->pool, session->encoded_url + strlen(root) + 1); } session->prefix = session_obfuscate(session, session->pool, session->prefix); return 0; }