You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ju...@apache.org on 2012/03/27 14:23:33 UTC
svn commit: r1305820 - /subversion/trunk/subversion/libsvn_client/merge.c
Author: julianfoad
Date: Tue Mar 27 12:23:32 2012
New Revision: 1305820
URL: http://svn.apache.org/viewvc?rev=1305820&view=rev
Log:
Change repo_location_t to hold the repository root URL and UUID directly
rather than in a sub-structure, for simplicity.
* subversion/libsvn_client/merge.c
(url_uuid_t): Remove.
(repo_location_t): Replace 'repo' with 'repos_root_url' and 'repos_uuid'.
(merge_source_t, merge_target_t): Update comments.
(is_same_repos, check_same_repos): Take repo_location_t parameters rather
than url_uuid_t.
(...everywhere...): Track the changes.
Modified:
subversion/trunk/subversion/libsvn_client/merge.c
Modified: subversion/trunk/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/merge.c?rev=1305820&r1=1305819&r2=1305820&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/merge.c (original)
+++ subversion/trunk/subversion/libsvn_client/merge.c Tue Mar 27 12:23:32 2012
@@ -158,17 +158,11 @@
/*** Repos-Diff Editor Callbacks ***/
-/* Repository root and UUID for a repository. */
-typedef struct url_uuid_t
-{
- const char *url;
- const char *uuid;
-} url_uuid_t;
-
/* A location in a repository. */
typedef struct repo_location_t
{
- url_uuid_t *repo;
+ const char *repos_root_url;
+ const char *repos_uuid;
svn_revnum_t rev;
const char *url;
} repo_location_t;
@@ -177,11 +171,11 @@ typedef struct repo_location_t
typedef struct merge_source_t
{
/* "left" side URL and revision (inclusive iff youngest) */
- /* The "repo" field is not currently initialized or used. */
+ /* The "repos_*" fields are not currently initialized or used. */
const repo_location_t *loc1;
/* "right" side URL and revision (inclusive iff youngest) */
- /* The "repo" field is not currently initialized or used. */
+ /* The "repos_*" fields are not currently initialized or used. */
const repo_location_t *loc2;
} merge_source_t;
@@ -196,8 +190,8 @@ typedef struct merge_target_t
svn_node_kind_t kind;
/* The repository location of the base node of the target WC. If the node
- * is locally added, then URL & REV are NULL & SVN_INVALID_REVNUM. REPO
- * is always valid. */
+ * is locally added, then URL & REV are NULL & SVN_INVALID_REVNUM.
+ * REPOS_ROOT_URL and REPOS_UUID are always valid. */
repo_location_t loc;
} merge_target_t;
@@ -329,26 +323,27 @@ typedef struct merge_cmd_baton_t {
/*** Utilities ***/
/* Return a new repo_location_t structure, allocated in RESULT_POOL,
- * initialized with deep copies of REPO, REV and URL. */
+ * initialized with deep copies of REPOS_ROOT_URL, REPOS_UUID, REV and URL. */
static repo_location_t *
-repo_location_create(const url_uuid_t *repo,
+repo_location_create(const char *repos_root_url,
+ const char *repos_uuid,
svn_revnum_t rev,
const char *url,
apr_pool_t *result_pool)
{
repo_location_t *loc = apr_palloc(result_pool, sizeof(*loc));
- /* ### This 'if' is because 'repo' currently can be null, at least in a
+ /* ### This 'if' is because 'repos_*' currently can be null, at least in a
* repo_location_t inside a merge_source_t. */
- if (repo)
+ if (repos_root_url && repos_uuid)
{
- loc->repo = apr_palloc(result_pool, sizeof(*loc->repo));
- loc->repo->url = apr_pstrdup(result_pool, repo->url);
- loc->repo->uuid = apr_pstrdup(result_pool, repo->uuid);
+ loc->repos_root_url = apr_pstrdup(result_pool, repos_root_url);
+ loc->repos_uuid = apr_pstrdup(result_pool, repos_uuid);
}
else
{
- loc->repo = NULL;
+ loc->repos_root_url = NULL;
+ loc->repos_uuid = NULL;
}
loc->rev = rev;
loc->url = apr_pstrdup(result_pool, url);
@@ -360,25 +355,8 @@ static repo_location_t *
repo_location_dup(const repo_location_t *loc,
apr_pool_t *result_pool)
{
- /* Allocate memory for the struct and its sub-struct together. */
- repo_location_t *loc2 = apr_palloc(result_pool,
- sizeof(*loc2) + sizeof(*loc2->repo));
-
- /* ### This 'if' is because 'repo' currently can be null, at least in a
- * repo_location_t inside a merge_source_t. */
- if (loc->repo)
- {
- loc2->repo = (void *)((char *)loc2 + sizeof(*loc2));
- loc2->repo->url = apr_pstrdup(result_pool, loc->repo->url);
- loc2->repo->uuid = apr_pstrdup(result_pool, loc->repo->uuid);
- }
- else
- {
- loc2->repo = NULL;
- }
- loc2->rev = loc->rev;
- loc2->url = apr_pstrdup(result_pool, loc->url);
- return loc2;
+ return repo_location_create(loc->repos_root_url, loc->repos_uuid,
+ loc->rev, loc->url, result_pool);
}
/* Return a new merge_source_t structure, allocated in RESULT_POOL,
@@ -420,7 +398,8 @@ repos_location(repo_location_t **op_loc_
apr_pool_t *scratch_pool)
{
*op_loc_p = apr_palloc(result_pool, sizeof(**op_loc_p));
- (*op_loc_p)->repo = peg_loc->repo;
+ (*op_loc_p)->repos_root_url = peg_loc->repos_root_url;
+ (*op_loc_p)->repos_uuid = peg_loc->repos_uuid;
(*op_loc_p)->rev = op_revnum;
SVN_ERR(svn_client__repos_location(&(*op_loc_p)->url, ra_session,
peg_loc->url, peg_loc->rev,
@@ -452,7 +431,8 @@ get_youngest_common_ancestor(repo_locati
loc1->url, loc1->rev, loc2->url, loc2->rev,
ctx, result_pool));
if (url)
- *ancestor_p = repo_location_create(loc1->repo, rev, url, result_pool);
+ *ancestor_p = repo_location_create(loc1->repos_root_url, loc1->repos_uuid,
+ rev, url, result_pool);
else
*ancestor_p = NULL;
return SVN_NO_ERROR;
@@ -466,45 +446,45 @@ check_repos_match(merge_cmd_baton_t *mer
const char *url,
apr_pool_t *scratch_pool)
{
- if (!svn_uri__is_ancestor(merge_b->target->loc.repo->url, url))
+ if (!svn_uri__is_ancestor(merge_b->target->loc.repos_root_url, url))
return svn_error_createf(
SVN_ERR_UNSUPPORTED_FEATURE, NULL,
_("Url '%s' of '%s' is not in repository '%s'"),
url, svn_dirent_local_style(local_abspath, scratch_pool),
- merge_b->target->loc.repo->url);
+ merge_b->target->loc.repos_root_url);
return SVN_NO_ERROR;
}
-/* Return TRUE iff the repository identified by REPOS_ROOT1 is the same as
- * that identified by REPOS_ROOT2. If STRICT_URLS is true, the URLs must
+/* Return TRUE iff the repository of LOCATION1 is the same as
+ * that of LOCATION2. If STRICT_URLS is true, the URLs must
* match (and the UUIDs, just to be sure), otherwise just the UUIDs must
* match and the URLs can differ (a common case is http versus https). */
static svn_boolean_t
-is_same_repos(const url_uuid_t *repos_root1,
- const url_uuid_t *repos_root2,
+is_same_repos(const repo_location_t *location1,
+ const repo_location_t *location2,
svn_boolean_t strict_urls)
{
if (strict_urls)
- return (strcmp(repos_root1->url, repos_root2->url) == 0
- && strcmp(repos_root1->uuid, repos_root2->uuid) == 0);
+ return (strcmp(location1->repos_root_url, location2->repos_root_url) == 0
+ && strcmp(location1->repos_uuid, location2->repos_uuid) == 0);
else
- return (strcmp(repos_root1->uuid, repos_root2->uuid) == 0);
+ return (strcmp(location1->repos_uuid, location2->repos_uuid) == 0);
}
-/* If the repository identified by REPOS_ROOT1 is not the same as that
- * identified by REPOS_ROOT2, throw a SVN_ERR_CLIENT_UNRELATED_RESOURCES
+/* If the repository identified of LOCATION1 is not the same as that
+ * of LOCATION2, throw a SVN_ERR_CLIENT_UNRELATED_RESOURCES
* error mentioning PATH1 and PATH2. For STRICT_URLS, see is_same_repos().
*/
static svn_error_t *
-check_same_repos(const url_uuid_t *repos_root1,
+check_same_repos(const repo_location_t *location1,
const char *path1,
- const url_uuid_t *repos_root2,
+ const repo_location_t *location2,
const char *path2,
svn_boolean_t strict_urls,
apr_pool_t *scratch_pool)
{
- if (! is_same_repos(repos_root1, repos_root2, strict_urls))
+ if (! is_same_repos(location1, location2, strict_urls))
return svn_error_createf(SVN_ERR_CLIENT_UNRELATED_RESOURCES, NULL,
_("'%s' must be from the same repository as "
"'%s'"), path1, path2);
@@ -7904,7 +7884,7 @@ record_mergeinfo_for_dir_merge(svn_merge
svn_mergeinfo_t subtree_history_as_mergeinfo;
apr_array_header_t *child_merge_src_rangelist;
const char *subtree_mergeinfo_url =
- svn_path_url_add_component2(merge_b->target->loc.repo->url,
+ svn_path_url_add_component2(merge_b->target->loc.repos_root_url,
child_merge_src_fspath + 1,
iterpool);
@@ -8103,7 +8083,7 @@ record_mergeinfo_for_added_subtrees(
take the intersection of the naive mergeinfo with
MERGEINFO_PATH/rel_added_path's history. */
added_path_mergeinfo_url =
- svn_path_url_add_component2(merge_b->target->loc.repo->url,
+ svn_path_url_add_component2(merge_b->target->loc.repos_root_url,
added_path_mergeinfo_fspath + 1,
iterpool);
SVN_ERR(svn_client__get_history_as_mergeinfo(
@@ -8435,12 +8415,12 @@ remove_noop_subtree_ranges(const merge_s
SVN_ERR(svn_client__path_relative_to_root(
&(log_gap_baton.target_fspath), merge_b->ctx->wc_ctx,
merge_b->target->abspath,
- merge_b->target->loc.repo->url, TRUE, NULL,
+ merge_b->target->loc.repos_root_url, TRUE, NULL,
result_pool, scratch_pool));
SVN_ERR(svn_client__path_relative_to_root(
&(log_gap_baton.source_fspath), merge_b->ctx->wc_ctx,
source->loc2->url,
- merge_b->target->loc.repo->url, TRUE, NULL,
+ merge_b->target->loc.repos_root_url, TRUE, NULL,
result_pool, scratch_pool));
log_gap_baton.merged_ranges = apr_array_make(scratch_pool, 0,
sizeof(svn_revnum_t *));
@@ -9423,9 +9403,8 @@ open_target_wc(merge_target_t **target_p
SVN_ERR(svn_wc_read_kind(&target->kind, ctx->wc_ctx, wc_abspath, FALSE,
scratch_pool));
- target->loc.repo = apr_palloc(result_pool, sizeof(*target->loc.repo));
- SVN_ERR(svn_client__wc_node_get_origin(&target->loc.repo->url,
- &target->loc.repo->uuid,
+ SVN_ERR(svn_client__wc_node_get_origin(&target->loc.repos_root_url,
+ &target->loc.repos_uuid,
&target->loc.rev, &target->loc.url,
wc_abspath, ctx,
result_pool, scratch_pool));
@@ -9458,10 +9437,9 @@ open_source_session(repo_location_t **lo
&ra_session, &location->rev, &location->url,
path_or_url, NULL, peg_revision, peg_revision,
ctx, result_pool));
- location->repo = apr_palloc(result_pool, sizeof(*location->repo));
- SVN_ERR(svn_ra_get_repos_root2(ra_session, &location->repo->url,
+ SVN_ERR(svn_ra_get_repos_root2(ra_session, &location->repos_root_url,
result_pool));
- SVN_ERR(svn_ra_get_uuid2(ra_session, &location->repo->uuid, result_pool));
+ SVN_ERR(svn_ra_get_uuid2(ra_session, &location->repos_uuid, result_pool));
*location_p = location;
*ra_session_p = ra_session;
@@ -9523,13 +9501,12 @@ merge_locked(const char *source1,
* as we are only carrying around a single source-repos-root from now
* on, and URL calculations will go wrong if they differ.
* Alternatively, teach the code to cope with differing root URLs. */
- SVN_ERR(check_same_repos(source1_loc->repo, source1_loc->url,
- source2_loc->repo, source2_loc->url,
+ SVN_ERR(check_same_repos(source1_loc, source1_loc->url,
+ source2_loc, source2_loc->url,
FALSE /* strict_urls */, scratch_pool));
/* Do our working copy and sources come from the same repository? */
- same_repos = is_same_repos(target->loc.repo, source1_loc->repo,
- TRUE /* strict_urls */);
+ same_repos = is_same_repos(&target->loc, source1_loc, TRUE /* strict_urls */);
/* Unless we're ignoring ancestry, see if the two sources are related. */
if (! ignore_ancestry)
@@ -9983,10 +9960,10 @@ find_unsynced_ranges(const repo_location
if (potentially_unmerged_ranges)
{
const char *source_repos_rel_path
- = svn_uri_skip_ancestor(source_loc->repo->url, source_loc->url,
+ = svn_uri_skip_ancestor(source_loc->repos_root_url, source_loc->url,
scratch_pool);
const char *target_repos_rel_path
- = svn_uri_skip_ancestor(target_loc->repo->url, target_loc->url,
+ = svn_uri_skip_ancestor(target_loc->repos_root_url, target_loc->url,
scratch_pool);
svn_revnum_t oldest_rev =
(APR_ARRAY_IDX(potentially_unmerged_ranges,
@@ -10445,7 +10422,7 @@ calculate_left_hand_side(repo_location_t
NULL, FALSE,
NULL, scratch_pool,
iterpool));
- url = svn_path_url_add_component2(target->loc.repo->url,
+ url = svn_path_url_add_component2(target->loc.repos_root_url,
path_rel_to_root, iterpool);
SVN_ERR(svn_client__get_history_as_mergeinfo(&target_history_as_mergeinfo,
NULL /* has_rev_zero_hist */,
@@ -10488,7 +10465,7 @@ calculate_left_hand_side(repo_location_t
svn_mergeinfo_inherited,
TRUE, iterpool));
- source_repos_rel_path = svn_uri_skip_ancestor(source_loc->repo->url,
+ source_repos_rel_path = svn_uri_skip_ancestor(source_loc->repos_root_url,
source_loc->url, scratch_pool);
if (mergeinfo_catalog)
SVN_ERR(svn_mergeinfo__add_prefix_to_catalog(&mergeinfo_catalog,
@@ -10583,8 +10560,8 @@ find_reintegrate_merge(merge_source_t **
/* ### Bogus/obsolete comment? */
/* Can't reintegrate to or from the root of the repository. */
- if (strcmp(source_loc->url, source_loc->repo->url) == 0
- || strcmp(target->loc.url, target->loc.repo->url) == 0)
+ if (strcmp(source_loc->url, source_loc->repos_root_url) == 0
+ || strcmp(target->loc.url, target->loc.repos_root_url) == 0)
return svn_error_createf(SVN_ERR_CLIENT_NOT_READY_TO_MERGE, NULL,
_("Neither the reintegrate source nor target "
"can be the root of the repository"));
@@ -10737,12 +10714,12 @@ open_reintegrate_source_and_target(svn_r
source_path_or_url, source_peg_revision,
ctx, result_pool, scratch_pool));
- /* source_loc->repo and target->loc.repo are required to be the same,
+ /* source_loc and target->loc are required to be in the same repository,
as mergeinfo doesn't come into play for cross-repository merging. */
- SVN_ERR(check_same_repos(source_loc->repo,
+ SVN_ERR(check_same_repos(source_loc,
svn_dirent_local_style(source_path_or_url,
scratch_pool),
- target->loc.repo,
+ &target->loc,
svn_dirent_local_style(target->abspath,
scratch_pool),
TRUE /* strict_urls */, scratch_pool));
@@ -10932,8 +10909,7 @@ merge_peg_locked(const char *source_path
scratch_pool, scratch_pool));
/* Check for same_repos. */
- same_repos = is_same_repos(target->loc.repo, source_loc->repo,
- TRUE /* strict_urls */);
+ same_repos = is_same_repos(&target->loc, source_loc, TRUE /* strict_urls */);
/* We're done with our little RA session. */
svn_pool_destroy(sesspool);
@@ -11119,8 +11095,9 @@ find_base_on_source(repo_location_t **ba
r = APR_ARRAY_IDX(merge_target->remaining_ranges, 0, svn_merge_range_t *);
/* ### WRONG: need historical URL instead of s_t->source->url. */
- *base_p = repo_location_create(s_t->source->repo, r->start, s_t->source->url,
- result_pool);
+ *base_p = repo_location_create(s_t->source->repos_root_url,
+ s_t->source->repos_uuid,
+ r->start, s_t->source->url, result_pool);
return SVN_NO_ERROR;
}
@@ -11261,8 +11238,8 @@ svn_client__find_symmetric_merge(svn_cli
ctx, result_pool, result_pool, scratch_pool));
/* Check source is in same repos as target. */
- SVN_ERR(check_same_repos(s_t->source->repo, source_path_or_url,
- s_t->target->loc.repo, target_wcpath,
+ SVN_ERR(check_same_repos(s_t->source, source_path_or_url,
+ &s_t->target->loc, target_wcpath,
TRUE /* strict_urls */, scratch_pool));
SVN_ERR(find_symmetric_merge(&merge->yca, &merge->base, &merge->mid, s_t,