Author: julianfoad
Date: Thu Jan 12 11:17:53 2012
New Revision: 1230491
URL: http://svn.apache.org/viewvc?rev=1230491&view=rev
Log:
Change some more private mergeinfo functions not to take a path relative
to the RA session but instead a URL and an RA session that is parented
anywhere in the correct repository. This fits better with the general style
of libsvn_client, simplifying usage in many cases (not that there are many
calls to these particular functions).
* subversion/libsvn_client/mergeinfo.h
(svn_client__get_repos_mergeinfo,
svn_client__get_repos_mergeinfo_catalog): Same.
* subversion/libsvn_client/copy.c
(calculate_target_mergeinfo): Pass the URL instead of a relative path to
svn_client__get_repos_mergeinfo(), and don't bother reparenting around
that call.
* subversion/libsvn_client/mergeinfo.c
(svn_client__get_repos_mergeinfo,
svn_client__get_repos_mergeinfo_catalog): As described above.
(svn_client__get_wc_or_repos_mergeinfo_catalog): Pass the URL instead of a
relative path to svn_client__get_repos_mergeinfo_catalog(), and don't
bother reparenting around that call.
(get_mergeinfo): Pass the URL instead of a relative path to
svn_client__get_repos_mergeinfo_catalog().
Modified:
subversion/trunk/subversion/libsvn_client/copy.c
subversion/trunk/subversion/libsvn_client/mergeinfo.c
subversion/trunk/subversion/libsvn_client/mergeinfo.h
Modified: subversion/trunk/subversion/libsvn_client/copy.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/copy.c?rev=1230491&r1=1230490&r2=1230491&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/copy.c (original)
+++ subversion/trunk/subversion/libsvn_client/copy.c Thu Jan 12 11:17:53 2012
@@ -113,19 +113,11 @@ calculate_target_mergeinfo(svn_ra_sessio
if (! locally_added)
{
- /* Fetch any existing (explicit) mergeinfo. We'll temporarily
- reparent to the target URL here, just to keep the code simple.
- We could, as an alternative, first see if the target URL was a
- child of the session URL and use the relative "remainder",
- falling back to this reparenting as necessary. */
- const char *old_session_url;
- SVN_ERR(svn_client__ensure_ra_session_url(&old_session_url,
- ra_session, src_url, pool));
+ /* Fetch any existing (explicit) mergeinfo. */
SVN_ERR(svn_client__get_repos_mergeinfo(&src_mergeinfo, ra_session,
- "", src_revnum,
+ src_url, src_revnum,
svn_mergeinfo_inherited,
TRUE, pool));
- SVN_ERR(svn_ra_reparent(ra_session, old_session_url, pool));
}
*target_mergeinfo = src_mergeinfo;
Modified: subversion/trunk/subversion/libsvn_client/mergeinfo.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/mergeinfo.c?rev=1230491&r1=1230490&r2=1230491&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/mergeinfo.c (original)
+++ subversion/trunk/subversion/libsvn_client/mergeinfo.c Thu Jan 12 11:17:53
2012
@@ -464,7 +464,7 @@ svn_client__get_wc_mergeinfo_catalog(svn
svn_error_t *
svn_client__get_repos_mergeinfo(svn_mergeinfo_t *target_mergeinfo,
svn_ra_session_t *ra_session,
- const char *rel_path,
+ const char *url,
svn_revnum_t rev,
svn_mergeinfo_inheritance_t inherit,
svn_boolean_t squelch_incapable,
@@ -476,7 +476,7 @@ svn_client__get_repos_mergeinfo(svn_merg
SVN_ERR(svn_client__get_repos_mergeinfo_catalog(&tgt_mergeinfo_cat,
ra_session,
- rel_path, rev, inherit,
+ url, rev, inherit,
squelch_incapable, FALSE,
pool, pool));
@@ -496,7 +496,7 @@ svn_client__get_repos_mergeinfo(svn_merg
svn_error_t *
svn_client__get_repos_mergeinfo_catalog(svn_mergeinfo_catalog_t *mergeinfo_cat,
svn_ra_session_t *ra_session,
- const char *rel_path,
+ const char *url,
svn_revnum_t rev,
svn_mergeinfo_inheritance_t inherit,
svn_boolean_t squelch_incapable,
@@ -507,13 +507,18 @@ svn_client__get_repos_mergeinfo_catalog(
svn_error_t *err;
svn_mergeinfo_t repos_mergeinfo_cat;
apr_array_header_t *rel_paths = apr_array_make(scratch_pool, 1,
- sizeof(rel_path));
+ sizeof(const char *));
+ const char *old_session_url;
- APR_ARRAY_PUSH(rel_paths, const char *) = rel_path;
+ APR_ARRAY_PUSH(rel_paths, const char *) = "";
/* Fetch the mergeinfo. */
+ SVN_ERR(svn_client__ensure_ra_session_url(&old_session_url,
+ ra_session, url, scratch_pool));
err = svn_ra_get_mergeinfo(ra_session, &repos_mergeinfo_cat, rel_paths,
rev, inherit, include_descendants, result_pool);
+ err = svn_error_compose_create(
+ err, svn_ra_reparent(ra_session, old_session_url, scratch_pool));
if (err)
{
if (squelch_incapable && err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE)
@@ -533,11 +538,9 @@ svn_client__get_repos_mergeinfo_catalog(
else
{
const char *session_relpath;
- const char *session_url;
- SVN_ERR(svn_ra_get_session_url(ra_session, &session_url, scratch_pool));
SVN_ERR(svn_ra_get_path_relative_to_root(ra_session, &session_relpath,
- session_url, scratch_pool));
+ url, scratch_pool));
if (session_relpath[0] == '\0')
*mergeinfo_cat = repos_mergeinfo_cat;
@@ -682,16 +685,9 @@ svn_client__get_wc_or_repos_mergeinfo_ca
if (!apr_hash_get(original_props, SVN_PROP_MERGEINFO,
APR_HASH_KEY_STRING))
{
- const char *session_url = NULL;
apr_pool_t *sesspool = NULL;
- if (ra_session)
- {
- SVN_ERR(svn_client__ensure_ra_session_url(&session_url,
- ra_session,
- url, result_pool));
- }
- else
+ if (! ra_session)
{
sesspool = svn_pool_create(scratch_pool);
SVN_ERR(svn_client__open_ra_session_internal(
@@ -701,7 +697,7 @@ svn_client__get_wc_or_repos_mergeinfo_ca
SVN_ERR(svn_client__get_repos_mergeinfo_catalog(
&target_mergeinfo_cat_repos, ra_session,
- "", target_rev, inherit,
+ url, target_rev, inherit,
TRUE, include_descendants,
result_pool, scratch_pool));
@@ -723,11 +719,6 @@ svn_client__get_wc_or_repos_mergeinfo_ca
{
svn_pool_destroy(sesspool);
}
- else if (session_url)
- {
- SVN_ERR(svn_ra_reparent(ra_session, session_url,
- result_pool));
- }
}
}
}
@@ -1109,7 +1100,7 @@ get_mergeinfo(svn_mergeinfo_catalog_t *m
{
rev = peg_rev;
SVN_ERR(svn_client__get_repos_mergeinfo_catalog(
- mergeinfo_catalog, ra_session, "", rev, svn_mergeinfo_inherited,
+ mergeinfo_catalog, ra_session, url, rev, svn_mergeinfo_inherited,
FALSE, include_descendants,
result_pool, scratch_pool));
}
Modified: subversion/trunk/subversion/libsvn_client/mergeinfo.h
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/mergeinfo.h?rev=1230491&r1=1230490&r2=1230491&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/mergeinfo.h (original)
+++ subversion/trunk/subversion/libsvn_client/mergeinfo.h Thu Jan 12 11:17:53
2012
@@ -170,37 +170,40 @@ svn_client__get_wc_mergeinfo_catalog(svn
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* Obtain any mergeinfo for repository filesystem path REL_PATH
- (relative to RA_SESSION's session URL) from the repository, and set
+/* Obtain any mergeinfo for URL from the repository, and set
it in *TARGET_MERGEINFO.
INHERIT indicates whether explicit, explicit or inherited, or only
- inherited mergeinfo for REL_PATH is obtained.
+ inherited mergeinfo for URL is obtained.
- If REL_PATH does not exist at REV, SVN_ERR_FS_NOT_FOUND or
+ If URL does not exist at REV, SVN_ERR_FS_NOT_FOUND or
SVN_ERR_RA_DAV_REQUEST_FAILED is returned and *TARGET_MERGEINFO
is untouched.
- If there is no mergeinfo available for REL_PATH, or if the server
+ If there is no mergeinfo available for URL, or if the server
doesn't support a mergeinfo capability and SQUELCH_INCAPABLE is
TRUE, set *TARGET_MERGEINFO to NULL. If the server doesn't support
a mergeinfo capability and SQUELCH_INCAPABLE is FALSE, return an
- SVN_ERR_UNSUPPORTED_FEATURE error. */
+ SVN_ERR_UNSUPPORTED_FEATURE error.
+
+ RA_SESSION is an open RA session to the repository in which URL lives;
+ it may be temporarily reparented by this function.
+*/
svn_error_t *
svn_client__get_repos_mergeinfo(svn_mergeinfo_t *target_mergeinfo,
svn_ra_session_t *ra_session,
- const char *rel_path,
+ const char *url,
svn_revnum_t rev,
svn_mergeinfo_inheritance_t inherit,
svn_boolean_t squelch_incapable,
apr_pool_t *pool);
/* If INCLUDE_DESCENDANTS is FALSE, behave exactly like
- svn_client__get_repos_mergeinfo() except the mergeinfo for REL_PATH
+ svn_client__get_repos_mergeinfo() except the mergeinfo for URL
is put in the mergeinfo catalog MERGEINFO_CAT, with the key being
- the repository root-relative path of REL_PATH.
+ the repository root-relative path of URL.
- If INCLUDE_DESCENDANTS is true, then any subtrees under REL_PATH
+ If INCLUDE_DESCENDANTS is true, then any subtrees under URL
with explicit mergeinfo are also included in MERGEINFO_CAT. The
keys for the subtree mergeinfo are the repository root-relative
paths of the subtrees. If no mergeinfo is found, then
@@ -208,7 +211,7 @@ svn_client__get_repos_mergeinfo(svn_merg
svn_error_t *
svn_client__get_repos_mergeinfo_catalog(svn_mergeinfo_catalog_t *mergeinfo_cat,
svn_ra_session_t *ra_session,
- const char *rel_path,
+ const char *url,
svn_revnum_t rev,
svn_mergeinfo_inheritance_t inherit,
svn_boolean_t squelch_incapable,