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 2015/11/09 14:39:13 UTC
svn commit: r1713431 - in /subversion/branches/move-tracking-2/subversion:
include/private/ libsvn_delta/ libsvn_ra/ svnmover/
Author: julianfoad
Date: Mon Nov 9 13:39:13 2015
New Revision: 1713431
URL: http://svn.apache.org/viewvc?rev=1713431&view=rev
Log:
On the 'move-tracking-2' branch: Refactoring in the 'branch state' class:
replace some plain functions with virtual methods.
* subversion/include/private/svn_branch.h,
subversion/libsvn_delta/branch.c
(svn_branch_state_get_elements,
svn_branch_state_get_element): New methods...
(svn_branch_get_element_tree,
svn_branch_get_elements,
svn_branch_get_element): ... replacing these.
(branch_state_create): Add them to the vtable.
(svn_branch_get_path_by_eid,
svn_branch_state_serialize): Update callers.
* subversion/libsvn_delta/branch_private.h
(branch_state_v_get_elements_t,
branch_state_v_get_element_t): New function types.
(svn_branch_state_vtable_t): Add them to the vtable.
* subversion/include/private/svn_branch_nested.h,
subversion/libsvn_delta/branch_nested.c
(svn_branch_find_nested_branch_element_by_relpath,
svn_branch_get_immediate_subbranches,
svn_branch_get_subbranch_at_eid,
svn_branch_get_subtree): Change function signatures to include an error
return.
Update all callers.
* subversion/libsvn_delta/branch_compat.c
subversion/libsvn_delta/branch_repos.c,
subversion/libsvn_ra/ra_loader.c,
subversion/svnmover/merge3.c,
subversion/svnmover/svnmover.c
Update all callers, changing local function signatures to return an error
where necessary.
Modified:
subversion/branches/move-tracking-2/subversion/include/private/svn_branch.h
subversion/branches/move-tracking-2/subversion/include/private/svn_branch_nested.h
subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c
subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_compat.c
subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_nested.c
subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_private.h
subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_repos.c
subversion/branches/move-tracking-2/subversion/libsvn_ra/ra_loader.c
subversion/branches/move-tracking-2/subversion/svnmover/merge3.c
subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c
Modified: subversion/branches/move-tracking-2/subversion/include/private/svn_branch.h
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/include/private/svn_branch.h?rev=1713431&r1=1713430&r2=1713431&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/include/private/svn_branch.h (original)
+++ subversion/branches/move-tracking-2/subversion/include/private/svn_branch.h Mon Nov 9 13:39:13 2015
@@ -488,11 +488,6 @@ svn_branch_rev_bid_dup(const svn_branch_
apr_pool_t *result_pool);
-/* Return the element-tree of BRANCH.
- */
-const svn_element_tree_t *
-svn_branch_get_element_tree(svn_branch_state_t *branch);
-
/* Return the element-tree within BRANCH rooted at EID.
*
* The result is limited by the lifetime of BRANCH. It includes a shallow
@@ -514,20 +509,21 @@ svn_branch_get_element_tree_at_eid(svn_b
#define SVN_BRANCH_SEQUENCE_POINT(branch)
/* Return the mapping of elements in branch BRANCH.
- *
- * The mapping is from pointer-to-eid to
- * pointer-to-svn_branch_el_rev_content_t.
*/
-apr_hash_t *
-svn_branch_get_elements(svn_branch_state_t *branch);
+svn_error_t *
+svn_branch_state_get_elements(svn_branch_state_t *branch,
+ const svn_element_tree_t **element_tree_p,
+ apr_pool_t *result_pool);
/* In BRANCH, get element EID (parent, name, payload).
*
* If element EID is not present, return null.
*/
-svn_element_content_t *
-svn_branch_get_element(const svn_branch_state_t *branch,
- int eid);
+svn_error_t *
+svn_branch_state_get_element(svn_branch_state_t *branch,
+ svn_element_content_t **element_p,
+ int eid,
+ apr_pool_t *result_pool);
/** Specify that the element of @a branch identified by @a eid shall not
* be present.
Modified: subversion/branches/move-tracking-2/subversion/include/private/svn_branch_nested.h
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/include/private/svn_branch_nested.h?rev=1713431&r1=1713430&r2=1713431&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/include/private/svn_branch_nested.h (original)
+++ subversion/branches/move-tracking-2/subversion/include/private/svn_branch_nested.h Mon Nov 9 13:39:13 2015
@@ -93,7 +93,7 @@ svn_branch_get_eid_by_rrpath(svn_branch_
*
* ### TODO: Clarify sequencing requirements.
*/
-void
+svn_error_t *
svn_branch_find_nested_branch_element_by_relpath(
svn_branch_state_t **branch_p,
int *eid_p,
@@ -122,19 +122,21 @@ svn_branch_repos_find_el_rev_by_path_rev
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
-/* Return an array of pointers to the branches that are immediate
+/* Set *SUBBRANCHES_P an array of pointers to the branches that are immediate
* sub-branches of BRANCH.
*/
-apr_array_header_t *
+svn_error_t *
svn_branch_get_immediate_subbranches(svn_branch_state_t *branch,
+ apr_array_header_t **subbranches_p,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool);
/* Return the subbranch rooted at BRANCH:EID, or NULL if that is
* not a subbranch root.
*/
-svn_branch_state_t *
+svn_error_t *
svn_branch_get_subbranch_at_eid(svn_branch_state_t *branch,
+ svn_branch_state_t **subbranch_p,
int eid,
apr_pool_t *scratch_pool);
@@ -173,8 +175,9 @@ svn_branch_subtree_create(apr_hash_t *e_
* It assumes that modifications on a svn_branch_state_t treat element
* map keys and values as immutable -- which they do.
*/
-svn_branch_subtree_t *
+svn_error_t *
svn_branch_get_subtree(svn_branch_state_t *branch,
+ svn_branch_subtree_t **subtree_p,
int eid,
apr_pool_t *result_pool);
Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c?rev=1713431&r1=1713430&r2=1713431&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/branch.c Mon Nov 9 13:39:13 2015
@@ -919,12 +919,6 @@ svn_branch_rev_bid_dup(const svn_branch_
* ========================================================================
*/
-const svn_element_tree_t *
-svn_branch_get_element_tree(svn_branch_state_t *branch)
-{
- return branch->priv->element_tree;
-}
-
/* Validate that ELEMENT is suitable for a mapping of BRANCH:EID.
* ELEMENT->payload may be null.
*/
@@ -956,15 +950,18 @@ branch_validate_element(const svn_branch
}
}
-apr_hash_t *
-svn_branch_get_elements(svn_branch_state_t *branch)
+static svn_error_t *
+branch_state_get_elements(svn_branch_state_t *branch,
+ const svn_element_tree_t **element_tree_p,
+ apr_pool_t *result_pool)
{
- return branch->priv->element_tree->e_map;
+ *element_tree_p = branch->priv->element_tree;
+ return SVN_NO_ERROR;
}
-svn_element_content_t *
-svn_branch_get_element(const svn_branch_state_t *branch,
- int eid)
+static svn_element_content_t *
+branch_get_element(const svn_branch_state_t *branch,
+ int eid)
{
svn_element_content_t *element;
@@ -975,6 +972,16 @@ svn_branch_get_element(const svn_branch_
return element;
}
+static svn_error_t *
+branch_state_get_element(svn_branch_state_t *branch,
+ svn_element_content_t **element_p,
+ int eid,
+ apr_pool_t *result_pool)
+{
+ *element_p = branch_get_element(branch, eid);
+ return SVN_NO_ERROR;
+}
+
/* In BRANCH, set element EID to ELEMENT.
*
* If ELEMENT is null, delete element EID.
@@ -1099,7 +1106,7 @@ svn_branch_get_path_by_eid(const svn_bra
for (; ! IS_BRANCH_ROOT_EID(branch, eid); eid = element->parent_eid)
{
- element = svn_branch_get_element(branch, eid);
+ element = branch_get_element(branch, eid);
if (! element)
return NULL;
path = svn_relpath_join(element->name, path, result_pool);
@@ -1223,6 +1230,28 @@ branch_instantiate_elements(svn_branch_s
*/
svn_error_t *
+svn_branch_state_get_elements(svn_branch_state_t *branch,
+ const svn_element_tree_t **element_tree_p,
+ apr_pool_t *result_pool)
+{
+ SVN_ERR(branch->vtable->get_elements(branch,
+ element_tree_p,
+ result_pool));
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_branch_state_get_element(svn_branch_state_t *branch,
+ svn_element_content_t **element_p,
+ int eid,
+ apr_pool_t *result_pool)
+{
+ SVN_ERR(branch->vtable->get_element(branch,
+ element_p, eid, result_pool));
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
svn_branch_state_alter_one(svn_branch_state_t *branch,
svn_branch_eid_t eid,
svn_branch_eid_t new_parent_eid,
@@ -1304,6 +1333,8 @@ branch_state_create(const char *bid,
{
static const svn_branch_state_vtable_t vtable = {
{0},
+ branch_state_get_elements,
+ branch_state_get_element,
branch_state_alter,
branch_state_copy_one,
branch_state_copy_tree,
@@ -1587,7 +1618,7 @@ svn_branch_state_serialize(svn_stream_t
sort_compare_items_by_eid, scratch_pool))
{
int eid = *(const int *)hi->key;
- svn_element_content_t *element = svn_branch_get_element(branch, eid);
+ svn_element_content_t *element = branch_get_element(branch, eid);
int parent_eid;
const char *name;
Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_compat.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_compat.c?rev=1713431&r1=1713430&r2=1713431&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_compat.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_compat.c Mon Nov 9 13:39:13 2015
@@ -1143,17 +1143,19 @@ payload_resolve(svn_element_payload_t *p
/* Update *PATHS, a hash of (storage_rrpath -> svn_branch_el_rev_id_t),
* creating or filling in entries for all elements in BRANCH.
*/
-static void
+static svn_error_t *
convert_branch_to_paths(apr_hash_t *paths,
svn_branch_state_t *branch,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
apr_hash_index_t *hi;
+ const svn_element_tree_t *elements;
/* assert(branch is at a sequence point); */
- for (hi = apr_hash_first(scratch_pool, svn_branch_get_elements(branch));
+ SVN_ERR(svn_branch_state_get_elements(branch, &elements, scratch_pool));
+ for (hi = apr_hash_first(scratch_pool, elements->e_map);
hi; hi = apr_hash_next(hi))
{
int eid = *(const int *)apr_hash_this_key(hi);
@@ -1181,6 +1183,7 @@ convert_branch_to_paths(apr_hash_t *path
svn_branch_get_id(branch, scratch_pool), eid, rrpath));
}
}
+ return SVN_NO_ERROR;
}
/* Produce a mapping from paths to element ids, covering all elements in
@@ -1190,26 +1193,30 @@ convert_branch_to_paths(apr_hash_t *path
* creating or filling in entries for all elements in all branches at and
* under BRANCH, recursively.
*/
-static void
+static svn_error_t *
convert_branch_to_paths_r(apr_hash_t *paths_union,
svn_branch_state_t *branch,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
+ apr_array_header_t *subbranches;
SVN_ITER_T(svn_branch_state_t) *bi;
/*SVN_DBG(("[%d] branch={b%s e%d at '%s'}", idx,
svn_branch_get_id(branch, scratch_pool), branch->root_eid,
svn_branch_get_root_rrpath(branch, scratch_pool)));*/
- convert_branch_to_paths(paths_union, branch,
- result_pool, scratch_pool);
+ SVN_ERR(convert_branch_to_paths(paths_union, branch,
+ result_pool, scratch_pool));
+ SVN_ERR(svn_branch_get_immediate_subbranches(branch, &subbranches,
+ scratch_pool, scratch_pool));
/* Rercurse into sub-branches */
- for (SVN_ARRAY_ITER(bi, svn_branch_get_immediate_subbranches(
- branch, scratch_pool, scratch_pool), scratch_pool))
+ for (SVN_ARRAY_ITER(bi, subbranches, scratch_pool))
{
- convert_branch_to_paths_r(paths_union, bi->val, result_pool, bi->iterpool);
+ SVN_ERR(convert_branch_to_paths_r(paths_union, bi->val, result_pool,
+ bi->iterpool));
}
+ return SVN_NO_ERROR;
}
/* Return TRUE iff INITIAL_PAYLOAD and FINAL_PAYLOAD are both non-null
@@ -1346,15 +1353,17 @@ drive_changes_r(const char *rrpath,
SVN_ERR_ASSERT(!pred_loc
|| (pred_loc->relpath && SVN_IS_VALID_REVNUM(pred_loc->rev)));
- /* A non-null FINAL address means an element exists there. */
- SVN_ERR_ASSERT(!final_el_rev
- || svn_branch_get_element(final_el_rev->branch,
- final_el_rev->eid));
if (final_el_rev)
{
- final_payload = svn_branch_get_element(final_el_rev->branch,
- final_el_rev->eid)->payload;
+ svn_element_content_t *final_element;
+
+ SVN_ERR(svn_branch_state_get_element(final_el_rev->branch, &final_element,
+ final_el_rev->eid, scratch_pool));
+ /* A non-null FINAL address means an element exists there. */
+ SVN_ERR_ASSERT(final_element);
+
+ final_payload = final_element->payload;
/* Decide whether the state at this path should be a copy (incl. a
copy-child) */
@@ -1592,9 +1601,9 @@ drive_changes(svn_branch_txn_priv_t *eb,
branch_is_new = !base_root_branch;
paths_final = apr_hash_make(scratch_pool);
- convert_branch_to_paths_r(paths_final,
- root_branch,
- scratch_pool, scratch_pool);
+ SVN_ERR(convert_branch_to_paths_r(paths_final,
+ root_branch,
+ scratch_pool, scratch_pool));
current.rev = eb->txn->base_rev;
current.relpath = top_path;
Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_nested.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_nested.c?rev=1713431&r1=1713430&r2=1713431&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_nested.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_nested.c Mon Nov 9 13:39:13 2015
@@ -96,35 +96,44 @@ svn_branch_get_rrpath_by_eid(const svn_b
return rrpath;
}
-svn_branch_state_t *
+svn_error_t *
svn_branch_get_subbranch_at_eid(svn_branch_state_t *branch,
+ svn_branch_state_t **subbranch_p,
int eid,
apr_pool_t *scratch_pool)
{
- svn_element_content_t *element = svn_branch_get_element(branch, eid);
+ svn_element_content_t *element;
+ SVN_ERR(svn_branch_state_get_element(branch, &element, eid, scratch_pool));
if (element && element->payload->is_subbranch_root)
{
const char *branch_id = svn_branch_get_id(branch, scratch_pool);
const char *subbranch_id = svn_branch_id_nest(branch_id, eid,
scratch_pool);
- return svn_branch_txn_get_branch_by_id(branch->txn, subbranch_id,
- scratch_pool);
+ *subbranch_p = svn_branch_txn_get_branch_by_id(branch->txn, subbranch_id,
+ scratch_pool);
+ }
+ else
+ {
+ *subbranch_p = NULL;
}
- return NULL;
+ return SVN_NO_ERROR;
}
-apr_array_header_t *
+svn_error_t *
svn_branch_get_immediate_subbranches(svn_branch_state_t *branch,
+ apr_array_header_t **subbranches_p,
apr_pool_t *result_pool,
apr_pool_t *scratch_pool)
{
svn_array_t *subbranches = svn_array_make(result_pool);
const char *branch_id = svn_branch_get_id(branch, scratch_pool);
+ const svn_element_tree_t *elements;
apr_hash_index_t *hi;
- for (hi = apr_hash_first(scratch_pool, svn_branch_get_elements(branch));
+ SVN_ERR(svn_branch_state_get_elements(branch, &elements, scratch_pool));
+ for (hi = apr_hash_first(scratch_pool, elements->e_map);
hi; hi = apr_hash_next(hi))
{
int eid = svn_int_hash_this_key(hi);
@@ -142,7 +151,8 @@ svn_branch_get_immediate_subbranches(svn
SVN_ARRAY_PUSH(subbranches) = subbranch;
}
}
- return subbranches;
+ *subbranches_p = subbranches;
+ return SVN_NO_ERROR;
}
svn_branch_subtree_t *
@@ -157,12 +167,14 @@ svn_branch_subtree_create(apr_hash_t *e_
return subtree;
}
-svn_branch_subtree_t *
+svn_error_t *
svn_branch_get_subtree(svn_branch_state_t *branch,
+ svn_branch_subtree_t **subtree_p,
int eid,
apr_pool_t *result_pool)
{
svn_branch_subtree_t *new_subtree;
+ apr_array_header_t *subbranches;
SVN_ITER_T(svn_branch_state_t) *bi;
SVN_BRANCH_SEQUENCE_POINT(branch);
@@ -175,8 +187,9 @@ svn_branch_get_subtree(svn_branch_state_
result_pool);
/* Add subbranches */
- for (SVN_ARRAY_ITER(bi, svn_branch_get_immediate_subbranches(
- branch, result_pool, result_pool), result_pool))
+ SVN_ERR(svn_branch_get_immediate_subbranches(branch, &subbranches,
+ result_pool, result_pool));
+ for (SVN_ARRAY_ITER(bi, subbranches, result_pool))
{
svn_branch_state_t *subbranch = bi->val;
const char *outer_bid;
@@ -192,15 +205,17 @@ svn_branch_get_subtree(svn_branch_state_
/* Is it pathwise at or below EID? If so, add it into the subtree. */
if (subbranch_relpath_in_subtree)
{
- svn_branch_subtree_t *this_subtree
- = svn_branch_get_subtree(subbranch, svn_branch_root_eid(subbranch),
- result_pool);
+ svn_branch_subtree_t *this_subtree;
+ SVN_ERR(svn_branch_get_subtree(subbranch, &this_subtree,
+ svn_branch_root_eid(subbranch),
+ result_pool));
svn_int_hash_set(new_subtree->subbranches, outer_eid,
this_subtree);
}
}
- return new_subtree;
+ *subtree_p = new_subtree;
+ return SVN_NO_ERROR;
}
svn_branch_subtree_t *
@@ -278,7 +293,7 @@ svn_branch_instantiate_elements_r(svn_br
* ========================================================================
*/
-void
+svn_error_t *
svn_branch_find_nested_branch_element_by_relpath(
svn_branch_state_t **branch_p,
int *eid_p,
@@ -290,12 +305,13 @@ svn_branch_find_nested_branch_element_by
is also in a sub-branch. */
while (TRUE)
{
+ apr_array_header_t *subbranches;
SVN_ITER_T(svn_branch_state_t) *bi;
svn_boolean_t found = FALSE;
- for (SVN_ARRAY_ITER(bi, svn_branch_get_immediate_subbranches(
- root_branch, scratch_pool, scratch_pool),
- scratch_pool))
+ SVN_ERR(svn_branch_get_immediate_subbranches(root_branch, &subbranches,
+ scratch_pool, scratch_pool));
+ for (SVN_ARRAY_ITER(bi, subbranches, scratch_pool))
{
svn_branch_state_t *subbranch = bi->val;
svn_branch_state_t *outer_branch;
@@ -328,6 +344,7 @@ svn_branch_find_nested_branch_element_by
*branch_p = root_branch;
if (eid_p)
*eid_p = svn_branch_get_eid_by_path(root_branch, relpath, scratch_pool);
+ return SVN_NO_ERROR;
}
svn_error_t *
@@ -346,10 +363,10 @@ svn_branch_repos_find_el_rev_by_path_rev
repos, revnum, branch_id,
scratch_pool));
el_rev->rev = revnum;
- svn_branch_find_nested_branch_element_by_relpath(&el_rev->branch,
- &el_rev->eid,
- branch, relpath,
- scratch_pool);
+ SVN_ERR(svn_branch_find_nested_branch_element_by_relpath(&el_rev->branch,
+ &el_rev->eid,
+ branch, relpath,
+ scratch_pool));
/* Any relpath must at least be within the originally given branch */
SVN_ERR_ASSERT_NO_RETURN(el_rev->branch);
@@ -527,7 +544,8 @@ nested_branch_txn_branch(svn_branch_txn_
elements in NEW_BRANCH.) */
SVN_ERR(branch_in_rev_or_txn(&from_branch, from, txn->priv->wrapped_txn,
scratch_pool));
- from_subtree = svn_branch_get_subtree(from_branch, from->eid, scratch_pool);
+ SVN_ERR(svn_branch_get_subtree(from_branch, &from_subtree, from->eid,
+ scratch_pool));
SVN_ERR(svn_branch_instantiate_elements_r(new_branch, *from_subtree,
scratch_pool));
@@ -585,12 +603,15 @@ nested_branch_txn_sequence_point(svn_bra
svn_branch_get_outer_branch_and_eid(&outer_branch, &outer_eid,
b, scratch_pool);
-
- if (outer_branch
- && ! svn_branch_get_element(outer_branch, outer_eid))
+ if (outer_branch)
{
- SVN_ERR(svn_branch_txn_delete_branch(wrapped_txn, b->bid,
- scratch_pool));
+ svn_element_content_t *element;
+
+ SVN_ERR(svn_branch_state_get_element(outer_branch, &element,
+ outer_eid, scratch_pool));
+ if (! element)
+ SVN_ERR(svn_branch_txn_delete_branch(wrapped_txn, b->bid,
+ scratch_pool));
}
}
return SVN_NO_ERROR;
Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_private.h?rev=1713431&r1=1713430&r2=1713431&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_private.h (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_private.h Mon Nov 9 13:39:13 2015
@@ -147,6 +147,17 @@ struct svn_branch_txn_vtable_t
* See the corresponding public API functions for details.
*/
+typedef svn_error_t *(*branch_state_v_get_elements_t)(
+ svn_branch_state_t *branch,
+ const svn_element_tree_t **element_tree_p,
+ apr_pool_t *result_pool);
+
+typedef svn_error_t *(*branch_state_v_get_element_t)(
+ svn_branch_state_t *branch,
+ svn_element_content_t **element_p,
+ int eid,
+ apr_pool_t *result_pool);
+
typedef svn_error_t *(*branch_state_v_alter_one_t)(
svn_branch_state_t *branch,
svn_branch_eid_t eid,
@@ -189,6 +200,8 @@ struct svn_branch_state_vtable_t
{
svn_vtable_priv_t vpriv;
+ branch_state_v_get_elements_t get_elements;
+ branch_state_v_get_element_t get_element;
branch_state_v_alter_one_t alter_one;
branch_state_v_copy_one_t copy_one;
branch_state_v_copy_tree_t copy_tree;
Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_repos.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_repos.c?rev=1713431&r1=1713430&r2=1713431&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_repos.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/branch_repos.c Mon Nov 9 13:39:13 2015
@@ -110,12 +110,15 @@ svn_branch_repos_find_el_rev_by_id(svn_b
apr_pool_t *scratch_pool)
{
svn_branch_el_rev_id_t *el_rev = apr_palloc(result_pool, sizeof(*el_rev));
+ svn_element_content_t *element;
el_rev->rev = revnum;
SVN_ERR(svn_branch_repos_get_branch_by_id(&el_rev->branch,
repos, revnum, branch_id,
scratch_pool));
- if (svn_branch_get_element(el_rev->branch, eid))
+ SVN_ERR(svn_branch_state_get_element(el_rev->branch, &element,
+ eid, scratch_pool));
+ if (element)
{
el_rev->eid = eid;
}
Modified: subversion/branches/move-tracking-2/subversion/libsvn_ra/ra_loader.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_ra/ra_loader.c?rev=1713431&r1=1713430&r2=1713431&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_ra/ra_loader.c (original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_ra/ra_loader.c Mon Nov 9 13:39:13 2015
@@ -743,15 +743,18 @@ txn_fetch_payloads(svn_branch_txn_t *txn
scratch_pool))
{
svn_branch_state_t *branch = bi->val;
- const svn_element_tree_t *element_tree
- = svn_branch_get_element_tree(branch);
+ const svn_element_tree_t *element_tree;
SVN_ITER_T(svn_element_content_t) *hi;
+ SVN_ERR(svn_branch_state_get_elements(branch, &element_tree,
+ scratch_pool));
for (SVN_HASH_ITER(hi, scratch_pool, element_tree->e_map))
{
int eid = *(const int *)hi->key;
- svn_element_content_t *element = svn_branch_get_element(branch, eid);
+ svn_element_content_t *element;
+ SVN_ERR(svn_branch_state_get_element(branch, &element,
+ eid, scratch_pool));
if (! element->payload->is_subbranch_root)
{
SVN_ERR(svn_payload_fetch(&element->payload,
Modified: subversion/branches/move-tracking-2/subversion/svnmover/merge3.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnmover/merge3.c?rev=1713431&r1=1713430&r2=1713431&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnmover/merge3.c (original)
+++ subversion/branches/move-tracking-2/subversion/svnmover/merge3.c Mon Nov 9 13:39:13 2015
@@ -131,9 +131,10 @@ subbranch_str(svn_branch_state_t *branch
int eid,
apr_pool_t *result_pool)
{
- svn_branch_state_t *subbranch
- = svn_branch_get_subbranch_at_eid(branch, eid, result_pool);
+ svn_branch_state_t *subbranch;
+ svn_error_clear(svn_branch_get_subbranch_at_eid(branch, &subbranch, eid,
+ result_pool));
return branch_str(subbranch, result_pool);
}
@@ -692,16 +693,19 @@ merge_subbranch(svn_branch_txn_t *edit_t
int eid,
apr_pool_t *scratch_pool)
{
- svn_branch_state_t *src_subbranch
- = svn_branch_get_subbranch_at_eid(src->branch, eid, scratch_pool);
- svn_branch_state_t *tgt_subbranch
- = svn_branch_get_subbranch_at_eid(tgt->branch, eid, scratch_pool);
- svn_branch_state_t *yca_subbranch
- = svn_branch_get_subbranch_at_eid(yca->branch, eid, scratch_pool);
+ svn_branch_state_t *src_subbranch;
+ svn_branch_state_t *tgt_subbranch;
+ svn_branch_state_t *yca_subbranch;
svn_branch_el_rev_id_t *subbr_src = NULL;
svn_branch_el_rev_id_t *subbr_tgt = NULL;
svn_branch_el_rev_id_t *subbr_yca = NULL;
+ SVN_ERR(svn_branch_get_subbranch_at_eid(src->branch, &src_subbranch,
+ eid, scratch_pool));
+ SVN_ERR(svn_branch_get_subbranch_at_eid(tgt->branch, &tgt_subbranch,
+ eid, scratch_pool));
+ SVN_ERR(svn_branch_get_subbranch_at_eid(yca->branch, &yca_subbranch,
+ eid, scratch_pool));
if (src_subbranch)
subbr_src = svn_branch_el_rev_id_create(
src_subbranch, svn_branch_root_eid(src_subbranch),
@@ -787,11 +791,13 @@ detect_clashes(apr_hash_t **clashes_p,
apr_pool_t *scratch_pool)
{
apr_hash_t *clashes = apr_hash_make(result_pool);
+ const svn_element_tree_t *elements;
SVN_ITER_T(svn_element_content_t) *pi;
int prev_eid = -1;
svn_element_content_t *prev_element = NULL;
- for (SVN_HASH_ITER_SORTED(pi, svn_branch_get_elements(branch),
+ SVN_ERR(svn_branch_state_get_elements(branch, &elements, scratch_pool));
+ for (SVN_HASH_ITER_SORTED(pi, elements->e_map,
sort_compare_items_by_peid_and_name, scratch_pool))
{
int eid = *(const int *)(pi->key);
@@ -838,8 +844,9 @@ detect_cycles(apr_hash_t **cycles_p,
{
apr_hash_t *cycles = apr_hash_make(result_pool);
SVN_ITER_T(svn_element_content_t) *pi;
- const svn_element_tree_t *elements = svn_branch_get_element_tree(branch);
+ const svn_element_tree_t *elements;
+ SVN_ERR(svn_branch_state_get_elements(branch, &elements, scratch_pool));
for (SVN_HASH_ITER(pi, scratch_pool, elements->e_map))
{
int eid = *(const int *)(pi->key);
@@ -878,8 +885,9 @@ detect_orphans(apr_hash_t **orphans_p,
{
apr_hash_t *orphans = apr_hash_make(result_pool);
SVN_ITER_T(svn_element_content_t) *pi;
- const svn_element_tree_t *elements = svn_branch_get_element_tree(branch);
+ const svn_element_tree_t *elements;
+ SVN_ERR(svn_branch_state_get_elements(branch, &elements, scratch_pool));
for (SVN_HASH_ITER(pi, scratch_pool, elements->e_map))
{
int eid = *(const int *)(pi->key);
@@ -917,6 +925,7 @@ branch_merge_subtree_r(svn_branch_txn_t
apr_hash_t *e_conflicts = apr_hash_make(scratch_pool);
conflict_storage_t *conflict_storage = conflict_storage_create(result_pool);
SVN_ITER_T(svn_element_content_t *) *pi;
+ const svn_element_tree_t *src_elements, *tgt_elements, *yca_elements;
apr_hash_t *all_elements;
const merge_conflict_policy_t policy = { TRUE, TRUE, TRUE, TRUE, TRUE };
apr_pool_t *iterpool = svn_pool_create(scratch_pool);
@@ -942,9 +951,9 @@ branch_merge_subtree_r(svn_branch_txn_t
result := diff1.right
# else no change
*/
- s_src = svn_branch_get_subtree(src->branch, src->eid, scratch_pool);
- s_tgt = svn_branch_get_subtree(tgt->branch, tgt->eid, scratch_pool);
- s_yca = svn_branch_get_subtree(yca->branch, yca->eid, scratch_pool);
+ SVN_ERR(svn_branch_get_subtree(src->branch, &s_src, src->eid, scratch_pool));
+ SVN_ERR(svn_branch_get_subtree(tgt->branch, &s_tgt, tgt->eid, scratch_pool));
+ SVN_ERR(svn_branch_get_subtree(yca->branch, &s_yca, yca->eid, scratch_pool));
SVN_ERR(element_differences(&diff_yca_src,
s_yca->tree, s_src->tree,
scratch_pool, scratch_pool));
@@ -954,11 +963,17 @@ branch_merge_subtree_r(svn_branch_txn_t
s_yca->tree, s_tgt->tree,
scratch_pool, scratch_pool));
+ SVN_ERR(svn_branch_state_get_elements(src->branch, &src_elements,
+ scratch_pool));
+ SVN_ERR(svn_branch_state_get_elements(tgt->branch, &tgt_elements,
+ scratch_pool));
+ SVN_ERR(svn_branch_state_get_elements(yca->branch, &yca_elements,
+ scratch_pool));
all_elements = apr_hash_overlay(scratch_pool,
- svn_branch_get_elements(src->branch),
- svn_branch_get_elements(tgt->branch));
+ src_elements->e_map,
+ tgt_elements->e_map);
all_elements = apr_hash_overlay(scratch_pool,
- svn_branch_get_elements(yca->branch),
+ yca_elements->e_map,
all_elements);
for (SVN_HASH_ITER_SORTED(pi, all_elements,
sort_compare_items_by_eid, scratch_pool))
Modified: subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c
URL: http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c?rev=1713431&r1=1713430&r2=1713431&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c (original)
+++ subversion/branches/move-tracking-2/subversion/svnmover/svnmover.c Mon Nov 9 13:39:13 2015
@@ -401,6 +401,7 @@ txn_is_changed(svn_branch_txn_t *edit_tx
svn_branch_state_t *base_branch
= svn_branch_txn_get_branch_by_id(base_txn, edit_branch->bid,
scratch_pool);
+ const svn_element_tree_t *edit_branch_elements, *base_branch_elements;
apr_hash_t *diff;
if (! base_branch)
@@ -409,9 +410,12 @@ txn_is_changed(svn_branch_txn_t *edit_tx
return SVN_NO_ERROR;
}
+ SVN_ERR(svn_branch_state_get_elements(edit_branch, &edit_branch_elements,
+ scratch_pool));
+ SVN_ERR(svn_branch_state_get_elements(base_branch, &base_branch_elements,
+ scratch_pool));
SVN_ERR(element_differences(&diff,
- svn_branch_get_element_tree(edit_branch),
- svn_branch_get_element_tree(base_branch),
+ edit_branch_elements, base_branch_elements,
scratch_pool, scratch_pool));
if (apr_hash_count(diff))
{
@@ -488,27 +492,31 @@ subtree_replay(svn_branch_state_t *edit_
}
/* */
-static apr_hash_t *
-get_union_of_subbranches(svn_branch_state_t *left_branch,
+static svn_error_t *
+get_union_of_subbranches(apr_hash_t **all_subbranches_p,
+ svn_branch_state_t *left_branch,
svn_branch_state_t *right_branch,
apr_pool_t *result_pool)
{
apr_hash_t *all_subbranches;
+ svn_branch_subtree_t *s_left = NULL;
+ svn_branch_subtree_t *s_right = NULL;
- svn_branch_subtree_t *s_left
- = left_branch ? svn_branch_get_subtree(left_branch,
- svn_branch_root_eid(left_branch),
- result_pool) : NULL;
- svn_branch_subtree_t *s_right
- = right_branch ? svn_branch_get_subtree(right_branch,
- svn_branch_root_eid(right_branch),
- result_pool) : NULL;
+ if (left_branch)
+ SVN_ERR(svn_branch_get_subtree(left_branch, &s_left,
+ svn_branch_root_eid(left_branch),
+ result_pool));
+ if (right_branch)
+ SVN_ERR(svn_branch_get_subtree(right_branch, &s_right,
+ svn_branch_root_eid(right_branch),
+ result_pool));
all_subbranches
= left_branch ? apr_hash_overlay(result_pool,
s_left->subbranches, s_right->subbranches)
: s_right->subbranches;
- return all_subbranches;
+ *all_subbranches_p = all_subbranches;
+ return SVN_NO_ERROR;
}
/* Replay differences between S_LEFT and S_RIGHT into EDITOR:EDIT_BRANCH.
@@ -531,11 +539,15 @@ svn_branch_replay(svn_branch_txn_t *edit
if (right_branch)
{
/* Replay this branch */
- const svn_element_tree_t *s_left
- = left_branch ? svn_branch_get_element_tree(left_branch) : NULL;
- const svn_element_tree_t *s_right
- = right_branch ? svn_branch_get_element_tree(right_branch) : NULL;
+ const svn_element_tree_t *s_left = NULL;
+ const svn_element_tree_t *s_right = NULL;
+ if (left_branch)
+ SVN_ERR(svn_branch_state_get_elements(left_branch, &s_left,
+ scratch_pool));
+ if (right_branch)
+ SVN_ERR(svn_branch_state_get_elements(right_branch, &s_right,
+ scratch_pool));
SVN_ERR(subtree_replay(edit_branch, s_left, s_right,
scratch_pool));
}
@@ -551,22 +563,25 @@ svn_branch_replay(svn_branch_txn_t *edit
explicitly delete its subbranches... do we?) */
if (right_branch)
{
- apr_hash_t *all_subbranches
- = get_union_of_subbranches(left_branch, right_branch, scratch_pool);
+ apr_hash_t *all_subbranches;
apr_hash_index_t *hi;
+ SVN_ERR(get_union_of_subbranches(&all_subbranches,
+ left_branch, right_branch, scratch_pool));
for (hi = apr_hash_first(scratch_pool, all_subbranches);
hi; hi = apr_hash_next(hi))
{
int this_eid = svn_int_hash_this_key(hi);
- svn_branch_state_t *left_subbranch
- = left_branch ? svn_branch_get_subbranch_at_eid(
- left_branch, this_eid, scratch_pool) : NULL;
- svn_branch_state_t *right_subbranch
- = right_branch ? svn_branch_get_subbranch_at_eid(
- right_branch, this_eid, scratch_pool) : NULL;
+ svn_branch_state_t *left_subbranch = NULL;
+ svn_branch_state_t *right_subbranch = NULL;
svn_branch_state_t *edit_subbranch = NULL;
+ if (left_branch)
+ SVN_ERR(svn_branch_get_subbranch_at_eid(
+ left_branch, &left_subbranch, this_eid, scratch_pool));
+ if (right_branch)
+ SVN_ERR(svn_branch_get_subbranch_at_eid(
+ right_branch, &right_subbranch, this_eid, scratch_pool));
/* If the subbranch is to be edited or added, first look up the
corresponding edit subbranch, or, if not found, create one. */
if (right_subbranch)
@@ -943,9 +958,9 @@ find_el_rev_by_rrpath_rev(svn_branch_el_
return svn_error_createf(SVN_ERR_BRANCHING, NULL,
_("Branch %s not found in working state"),
branch_id);
- svn_branch_find_nested_branch_element_by_relpath(
+ SVN_ERR(svn_branch_find_nested_branch_element_by_relpath(
&el_rev->branch, &el_rev->eid,
- branch, relpath, scratch_pool);
+ branch, relpath, scratch_pool));
el_rev->rev = SVN_INVALID_REVNUM;
*el_rev_p = el_rev;
}
@@ -977,9 +992,10 @@ subbranch_str(svn_branch_state_t *branch
int eid,
apr_pool_t *result_pool)
{
- svn_branch_state_t *subbranch
- = svn_branch_get_subbranch_at_eid(branch, eid, result_pool);
+ svn_branch_state_t *subbranch;
+ svn_error_clear(svn_branch_get_subbranch_at_eid(branch, &subbranch,
+ eid, result_pool));
return branch_str(subbranch, result_pool);
}
@@ -1036,10 +1052,12 @@ list_branch_elements(svn_branch_state_t
apr_pool_t *scratch_pool)
{
apr_hash_t *paths_to_eid = apr_hash_make(scratch_pool);
+ const svn_element_tree_t *elements;
apr_hash_index_t *hi;
SVN_ITER_T(int) *pi;
- for (hi = apr_hash_first(scratch_pool, svn_branch_get_elements(branch));
+ SVN_ERR(svn_branch_state_get_elements(branch, &elements, scratch_pool));
+ for (hi = apr_hash_first(scratch_pool, elements->e_map);
hi; hi = apr_hash_next(hi))
{
int eid = svn_int_hash_this_key(hi);
@@ -1097,10 +1115,12 @@ static svn_error_t *
list_branch_elements_by_eid(svn_branch_state_t *branch,
apr_pool_t *scratch_pool)
{
+ const svn_element_tree_t *elements;
SVN_ITER_T(svn_element_content_t) *pi;
svnmover_notify_v("%s", elements_by_eid_header);
- for (SVN_HASH_ITER_SORTED(pi, svn_branch_get_elements(branch),
+ SVN_ERR(svn_branch_state_get_elements(branch, &elements, scratch_pool));
+ for (SVN_HASH_ITER_SORTED(pi, elements->e_map,
sort_compare_items_by_eid, scratch_pool))
{
int eid = *(const int *)(pi->key);
@@ -1163,7 +1183,8 @@ branch_id_str(svn_branch_state_t *branch
branch, scratch_pool);
if (outer_branch)
- outer_el = svn_branch_get_element(outer_branch, outer_eid);
+ svn_error_clear(svn_branch_state_get_element(outer_branch, &outer_el,
+ outer_eid, scratch_pool));
return apr_psprintf(result_pool, "%-10s %-12s root=e%d",
svn_branch_get_id(branch, scratch_pool),
@@ -1230,8 +1251,11 @@ list_branches(svn_branch_txn_t *txn,
for (SVN_ARRAY_ITER(bi, branches, scratch_pool))
{
svn_branch_state_t *branch = bi->val;
+ svn_element_content_t *element;
- if (! svn_branch_get_element(branch, eid)
+ SVN_ERR(svn_branch_state_get_element(branch, &element,
+ eid, scratch_pool));
+ if (! element
|| svn_branch_root_eid(branch) == eid)
continue;
@@ -1686,10 +1710,13 @@ branch_diff_r(svn_branch_el_rev_id_t *le
const char *prefix,
apr_pool_t *scratch_pool)
{
- svn_branch_subtree_t *s_left
- = svn_branch_get_subtree(left->branch, left->eid, scratch_pool);
- svn_branch_subtree_t *s_right
- = svn_branch_get_subtree(right->branch, right->eid, scratch_pool);
+ svn_branch_subtree_t *s_left;
+ svn_branch_subtree_t *s_right;
+
+ SVN_ERR(svn_branch_get_subtree(left->branch, &s_left, left->eid,
+ scratch_pool));
+ SVN_ERR(svn_branch_get_subtree(right->branch, &s_right, right->eid,
+ scratch_pool));
SVN_ERR(subtree_diff_r(s_left,
left->rev,
@@ -1784,9 +1811,11 @@ do_put_file(svn_branch_txn_t *txn,
if (file_el_rev->eid != -1)
{
/* get existing props */
- svn_element_content_t *existing_element
- = svn_branch_get_element(file_el_rev->branch, file_el_rev->eid);
+ svn_element_content_t *existing_element;
+ SVN_ERR(svn_branch_state_get_element(file_el_rev->branch,
+ &existing_element,
+ file_el_rev->eid, scratch_pool));
props = existing_element->payload->props;
}
else
@@ -1854,11 +1883,12 @@ do_cat(svn_branch_el_rev_id_t *file_el_r
{
apr_hash_t *props;
svn_stringbuf_t *text;
+ svn_element_content_t *existing_element;
apr_hash_index_t *hi;
/* get existing props */
- svn_element_content_t *existing_element
- = svn_branch_get_element(file_el_rev->branch, file_el_rev->eid);
+ SVN_ERR(svn_branch_state_get_element(file_el_rev->branch, &existing_element,
+ file_el_rev->eid, scratch_pool));
props = existing_element->payload->props;
text = existing_element->payload->text;
@@ -2100,7 +2130,8 @@ do_branch_into(svn_branch_state_t *from_
from_branch, scratch_pool), from_eid);
}
- from_subtree = svn_branch_get_subtree(from_branch, from_eid, scratch_pool);
+ SVN_ERR(svn_branch_get_subtree(from_branch, &from_subtree, from_eid,
+ scratch_pool));
/* Change this subtree's root element to TO_PARENT_EID/NEW_NAME. */
new_root_content
@@ -2321,9 +2352,10 @@ do_move(svn_branch_el_rev_id_t *el_rev,
= branch_peid_name_to_path(to_parent_el_rev->branch,
to_parent_el_rev->eid, to_name, scratch_pool);
/* New payload shall be the same as before */
- svn_element_content_t *existing_element
- = svn_branch_get_element(el_rev->branch, el_rev->eid);
+ svn_element_content_t *existing_element;
+ SVN_ERR(svn_branch_state_get_element(el_rev->branch, &existing_element,
+ el_rev->eid, scratch_pool));
SVN_ERR(svn_branch_state_alter_one(el_rev->branch, el_rev->eid,
to_parent_el_rev->eid, to_name,
existing_element->payload, scratch_pool));