Author: julianfoad
Date: Wed Feb 25 17:35:16 2015
New Revision: 1662285

URL: http://svn.apache.org/r1662285
Log:
On the 'move-tracking-2' branch: Recursively branch all nested branches when
branching.

* subversion/libsvn_delta/branching.c
  (svn_branch_branch_subtree_r): Split into two functions. In this function, do
    only what is unique to duplicating the outermost branch.
  (svn_branch_branch_subtree_r2): New function. Here, do what is common to
    the outermost and the nested branches, and recurse.

Modified:
    subversion/branches/move-tracking-2/subversion/libsvn_delta/branching.c

Modified: 
subversion/branches/move-tracking-2/subversion/libsvn_delta/branching.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/branching.c?rev=1662285&r1=1662284&r2=1662285&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/branching.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/branching.c Wed 
Feb 25 17:35:16 2015
@@ -1256,6 +1256,15 @@ svn_branch_repos_find_el_rev_by_path_rev
  * ========================================================================
  */
 
+static svn_error_t *
+svn_branch_branch_subtree_r2(svn_branch_instance_t **new_branch_p,
+                            svn_branch_instance_t *from_branch,
+                            int from_eid,
+                            svn_branch_instance_t *to_outer_branch,
+                            svn_editor3_eid_t to_outer_eid,
+                             svn_branch_sibling_t *new_branch_def,
+                            apr_pool_t *scratch_pool);
+
 svn_error_t *
 svn_branch_branch_subtree_r(svn_branch_instance_t **new_branch_p,
                             svn_branch_instance_t *from_branch,
@@ -1267,7 +1276,6 @@ svn_branch_branch_subtree_r(svn_branch_i
 {
   int to_outer_eid;
   svn_branch_sibling_t *new_branch_def;
-  svn_branch_instance_t *new_branch;
 
   /* Source element must exist */
   if (! svn_branch_get_path_by_eid(from_branch, from_eid, scratch_pool))
@@ -1296,11 +1304,41 @@ svn_branch_branch_subtree_r(svn_branch_i
   svn_branch_map_update_as_subbranch_root(to_outer_branch, to_outer_eid,
                                           to_outer_parent_eid, new_name);
 
-  /* create new inner branch sibling & instance */
-  /* ### On sub-branches, should not add new branch sibling, only instance. */
+  /* create new inner branch sibling-defn (for the top-level branching only,
+     not for any nested branches, as their sibling-defns already exist) */
   new_branch_def
     = 
svn_branch_family_add_new_branch_sibling(from_branch->sibling_defn->family,
                                                from_eid);
+
+  SVN_ERR(svn_branch_branch_subtree_r2(new_branch_p,
+                                       from_branch, from_eid,
+                                       to_outer_branch, to_outer_eid,
+                                       new_branch_def,
+                                       scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+/* Make a new branch of FROM_BRANCH, selecting only the subtree at FROM_EID,
+ * at existing branch-root element TO_OUTER_BRANCH:TO_OUTER_EID.
+ */
+static svn_error_t *
+svn_branch_branch_subtree_r2(svn_branch_instance_t **new_branch_p,
+                             svn_branch_instance_t *from_branch,
+                             int from_eid,
+                             svn_branch_instance_t *to_outer_branch,
+                             svn_editor3_eid_t to_outer_eid,
+                             svn_branch_sibling_t *new_branch_def,
+                             apr_pool_t *scratch_pool)
+{
+  svn_branch_instance_t *new_branch;
+
+  /* Source element must exist */
+  SVN_ERR_ASSERT(svn_branch_get_path_by_eid(from_branch, from_eid, 
scratch_pool));
+  /* FROM_BRANCH must be an immediate child branch of TO_OUTER_BRANCH. */
+  SVN_ERR_ASSERT(SAME_BRANCH(from_branch->outer_branch, to_outer_branch));
+
+  /* create new inner branch instance */
   new_branch = svn_branch_add_new_branch_instance(to_outer_branch, 
to_outer_eid,
                                                   new_branch_def, 
scratch_pool);
 
@@ -1321,7 +1359,6 @@ svn_branch_branch_subtree_r(svn_branch_i
                                          scratch_pool));
 
   /* branch any subbranches under FROM_BRANCH:FROM_EID */
-#if 0 /* ### Later. */
   {
     apr_array_header_t *subbranches;
     int i;
@@ -1332,18 +1369,16 @@ svn_branch_branch_subtree_r(svn_branch_i
       {
         svn_branch_instance_t *subbranch
           = APR_ARRAY_IDX(subbranches, i, void *);
-        int new_parent_eid /* = ### */;
-        const char *new_name /* = ### */;
 
         /* branch this subbranch into NEW_BRANCH (recursing) */
-        SVN_ERR(svn_branch_branch_subtree_r(NULL,
-                                            subbranch,
-                                            subbranch->sibling_defn->root_eid,
-                                            new_branch, new_parent_eid, 
new_name,
-                                            scratch_pool));
+        SVN_ERR(svn_branch_branch_subtree_r2(NULL,
+                                             subbranch,
+                                             subbranch->sibling_defn->root_eid,
+                                             new_branch, subbranch->outer_eid,
+                                             subbranch->sibling_defn,
+                                             scratch_pool));
       }
   }
-#endif
 
   if (new_branch_p)
     *new_branch_p = new_branch;


Reply via email to