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));