#include "ra_local.h"
#include <string.h>
#include "svn_path.h"
#include "svn_dirent_uri.h"
#include "svn_private_config.h"
svn_error_t *
svn_ra_local__split_URL(svn_repos_t **repos,
const char **repos_url,
const char **fs_path,
const char *URL,
apr_pool_t *pool)
{
svn_error_t *err = SVN_NO_ERROR;
const char *repos_dirent;
const char *repos_root_dirent;
svn_stringbuf_t *urlbuf;
apr_size_t root_end;
SVN_ERR(svn_uri_get_dirent_from_file_url(&repos_dirent, URL, pool));
repos_root_dirent = svn_repos_find_root_path(repos_dirent, pool);
if (!repos_root_dirent)
return svn_error_createf(SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED, NULL,
_("Unable to open repository '%s'"), URL);
err = svn_repos_open2(repos, repos_root_dirent, NULL, pool);
if (err)
return svn_error_createf(SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED, err,
_("Unable to open repository '%s'"), URL);
{
apr_array_header_t *caps = apr_array_make(pool, 1, sizeof(const char *));
APR_ARRAY_PUSH(caps, const char *) = SVN_RA_CAPABILITY_MERGEINFO;
SVN_ERR(svn_repos_remember_client_capabilities(*repos, caps));
}
root_end = strlen(repos_root_dirent);
if (! repos_dirent[root_end])
*fs_path = "/";
else if (repos_dirent[root_end] == '/')
*fs_path = &repos_dirent[root_end];
else
{
*fs_path = &repos_dirent[root_end-1];
SVN_ERR_ASSERT((*fs_path)[0] == '/');
}
urlbuf = svn_stringbuf_create(URL, pool);
svn_path_remove_components(urlbuf,
svn_path_component_count(repos_dirent)
- svn_path_component_count(repos_root_dirent));
*repos_url = urlbuf->data;
return SVN_NO_ERROR;
}