Author: julianfoad
Date: Tue Feb 24 16:43:16 2015
New Revision: 1662011

URL: http://svn.apache.org/r1662011
Log:
On the 'move-tracking-2' branch: Prevent bad branch nesting in the
'svnmover branch' command.

* subversion/libsvn_delta/branching.c
  (SAME_BRANCH): New macro.
  (svn_branch_branch_subtree_r): Check preconditions here: move the existence
    check here, and add a check for correct nesting.

* subversion/libsvn_delta/compat3b.c
  (svn_branch_branch): Move the existence check away from here.

Modified:
    subversion/branches/move-tracking-2/subversion/libsvn_delta/branching.c
    subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3b.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=1662011&r1=1662010&r2=1662011&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/branching.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/branching.c Tue 
Feb 24 16:43:16 2015
@@ -42,6 +42,9 @@
   ((branch1)->sibling_defn->family->fid \
    == (branch2)->sibling_defn->family->fid)
 
+#define SAME_BRANCH(branch1, branch2) \
+  ((branch1)->sibling_defn->family->fid \
+   == (branch2)->sibling_defn->family->fid)
 
 svn_branch_repos_t *
 svn_branch_repos_create(apr_pool_t *result_pool)
@@ -1266,11 +1269,26 @@ svn_branch_branch_subtree_r(svn_branch_i
   svn_branch_sibling_t *new_branch_def;
   svn_branch_instance_t *new_branch;
 
-  /* FROM_BRANCH must be an immediate child branch of OUTER_BRANCH. */
-  /* SVN_ERR_ASSERT(from_branch->sibling_defn->family->parent_family->fid
-                 == to_outer_branch->sibling_defn->family->fid); */
-
-  /* SVN_ERR_ASSERT(...); */
+  /* Source element must exist */
+  if (! svn_branch_get_path_by_eid(from_branch, from_eid, scratch_pool))
+    {
+      return svn_error_createf(SVN_ERR_BRANCHING, NULL,
+                               _("cannot branch from b%d e%d: "
+                                 "does not exist"),
+                               from_branch->sibling_defn->bid, from_eid);
+    }
+
+  /* FROM_BRANCH must be an immediate child branch of TO_OUTER_BRANCH. */
+  if (! SAME_BRANCH(from_branch->outer_branch, to_outer_branch))
+    {
+      return svn_error_createf(SVN_ERR_BRANCHING, NULL,
+                               _("source and destination must be within same "
+                                 "outer branch; source is b%d inside b%d, "
+                                 "destination is in b%d"),
+                               from_branch->sibling_defn->bid,
+                               from_branch->outer_branch->sibling_defn->bid,
+                               to_outer_branch->sibling_defn->bid);
+    }
 
   /* assign new eid to root node (outer branch) */
   to_outer_eid

Modified: subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3b.c
URL: 
http://svn.apache.org/viewvc/subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3b.c?rev=1662011&r1=1662010&r2=1662011&view=diff
==============================================================================
--- subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3b.c 
(original)
+++ subversion/branches/move-tracking-2/subversion/libsvn_delta/compat3b.c Tue 
Feb 24 16:43:16 2015
@@ -891,14 +891,6 @@ svn_branch_branch(svn_editor3_t *editor,
                   const char *new_name,
                   apr_pool_t *scratch_pool)
 {
-  if (! svn_branch_get_path_by_eid(from_branch, from_eid, scratch_pool))
-    {
-      return svn_error_createf(SVN_ERR_BRANCHING, NULL,
-                               _("cannot branch from b%d e%d: "
-                                 "does not exist"),
-                               from_branch->sibling_defn->bid, from_eid);
-    }
-
   SVN_ERR(svn_branch_branch_subtree_r(NULL,
                                       from_branch, from_eid,
                                       to_outer_branch, to_outer_parent_eid,


Reply via email to