You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@subversion.apache.org by Stefan Sperling <st...@elego.de> on 2012/09/27 19:08:05 UTC

work in progress patch: recording moved-here at op-root

Currently, we set the moved-here flag in NODES on the op-root
of a move and on all of its children.

Philip and I want to change that in order to eventually handle moves
in mixed-revision working copies better, because we cannot mark
every node inside a mixed-revision tree as "moved-here" since nodes
at different revisions cannot be considered part of the same move
operation (see http://wiki.apache.org/subversion/MultiLayerMoveUpdate).

Here's a work-in-progress patch towards setting moved-here only on
the op-root. I'm sending this to dev@ because it is not ready for
commit yet but I wanted to share it. Review and further contributions
are appreciated.

It's not clear whether this approach will be used. An alternative
approach is setting moved-here only on children with the same op-depth
as the op-root.

I've only been running the op-depth-tests with this so far, and they
all pass except for the last one (a test which involves mixed-revisions,
so the test is probably not quite correct yet).

No log message yet either :P

Index: subversion/libsvn_wc/wc-metadata.sql
===================================================================
--- subversion/libsvn_wc/wc-metadata.sql	(revision 1391059)
+++ subversion/libsvn_wc/wc-metadata.sql	(working copy)
@@ -387,9 +387,11 @@ CREATE TABLE NODES (
      perhaps add a column called "moved_from". */
 
   /* Boolean value, specifying if this node was moved here (rather than just
-     copied). This is set on all the nodes in the moved tree.  The source of
-     the move is implied by a different node with a moved_to column pointing
-     at the root node of the moved tree. */
+     copied). This is set on the op-root of the moved tree. Children at the
+     same op_depth inherit the flag, while children at higher op-depths appear
+     as separate op-roots which are disjoint from the moved-here layer.
+     The source of the move is implied by a different node with a moved_to
+     column pointing at the root node of the moved tree. */
   moved_here  INTEGER,
 
   /* If the underlying node was moved away (rather than just deleted), this
Index: subversion/libsvn_wc/wc_db.c
===================================================================
--- subversion/libsvn_wc/wc_db.c	(revision 1391059)
+++ subversion/libsvn_wc/wc_db.c	(working copy)
@@ -3974,27 +3974,6 @@ db_op_copy(svn_wc__db_wcroot_t *src_wcroot,
                     (status == svn_wc__db_status_copied && op_root)))
                 SVN_ERR(svn_sqlite__bind_int(stmt, 7, 1));
             }
-          else
-            {
-              svn_sqlite__stmt_t *info_stmt;
-              svn_boolean_t have_row;
-
-              /* We're moving a child along with the root of the move.
-               *
-               * Set moved-here depending on dst_parent, propagating
-               * the above decision to moved-along children.
-               * We can't use scan_addition() to detect moved-here because
-               * the delete-half of the move might not yet exist. */
-              SVN_ERR(svn_sqlite__get_statement(&info_stmt, dst_wcroot->sdb,
-                                                STMT_SELECT_NODE_INFO));
-              SVN_ERR(svn_sqlite__bindf(info_stmt, "is", dst_wcroot->wc_id,
-                                        dst_parent_relpath));
-              SVN_ERR(svn_sqlite__step(&have_row, info_stmt));
-              SVN_ERR_ASSERT(have_row);
-              if (svn_sqlite__column_boolean(info_stmt, 15))
-                SVN_ERR(svn_sqlite__bind_int(stmt, 7, 1));
-              SVN_ERR(svn_sqlite__reset(info_stmt));
-            }
         }
 
       SVN_ERR(svn_sqlite__step_done(stmt));
@@ -4255,19 +4234,21 @@ db_op_copy_shadowed_layer(svn_wc__db_wcroot_t *src
   if (dst_presence == svn_wc__db_status_normal
       && src_wcroot == dst_wcroot) /* ### Remove limitation */
     {
+      svn_boolean_t moved_here;
+
       SVN_ERR(svn_sqlite__get_statement(&stmt, src_wcroot->sdb,
                              STMT_INSERT_WORKING_NODE_COPY_FROM_DEPTH));
 
       /* Perhaps we should avoid setting moved_here to 0 and leave it
          null instead? */
+      moved_here = (is_move && dst_op_depth == relpath_depth(dst_relpath));
       SVN_ERR(svn_sqlite__bindf(stmt, "issdstdd",
                         src_wcroot->wc_id, src_relpath,
                         dst_relpath,
                         dst_op_depth,
                         svn_relpath_dirname(dst_relpath, iterpool),
                         presence_map, dst_presence,
-                        (is_move ? 1 : 0),
-                        src_op_depth));
+                        moved_here, src_op_depth));
 
       SVN_ERR(svn_sqlite__step_done(stmt));
 
@@ -4641,7 +4622,6 @@ svn_wc__db_op_copy_dir(svn_wc__db_t *db,
   iwb.changed_rev = changed_rev;
   iwb.changed_date = changed_date;
   iwb.changed_author = changed_author;
-  iwb.moved_here = is_move;
 
   if (original_root_url != NULL)
     {
@@ -4658,6 +4638,7 @@ svn_wc__db_op_copy_dir(svn_wc__db_t *db,
                             original_repos_relpath, original_revision,
                             wcroot, local_relpath, scratch_pool));
 
+  iwb.moved_here = (is_move && iwb.op_depth == relpath_depth(local_relpath));
   iwb.children = children;
   iwb.depth = depth;
 
@@ -4718,7 +4699,6 @@ svn_wc__db_op_copy_file(svn_wc__db_t *db,
   iwb.changed_rev = changed_rev;
   iwb.changed_date = changed_date;
   iwb.changed_author = changed_author;
-  iwb.moved_here = is_move;
 
   if (original_root_url != NULL)
     {
@@ -4735,6 +4715,7 @@ svn_wc__db_op_copy_file(svn_wc__db_t *db,
                             original_repos_relpath, original_revision,
                             wcroot, local_relpath, scratch_pool));
 
+  iwb.moved_here = (is_move && iwb.op_depth == relpath_depth(local_relpath));
   iwb.checksum = checksum;
 
   if (update_actual_props)
@@ -11133,7 +11114,8 @@ follow_moved_to(apr_array_header_t **moved_tos,
 
           SVN_ERR(svn_sqlite__get_statement(&stmt, wcroot->sdb,
                                             STMT_SELECT_MOVED_HERE));
-          SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id, node_moved_to,
+          SVN_ERR(svn_sqlite__bindf(stmt, "isd", wcroot->wc_id,
+                                    ancestor_moved_to,
                                     relpath_depth(ancestor_moved_to)));
           SVN_ERR(svn_sqlite__step(&have_row, stmt));
           if (!have_row)
Index: subversion/tests/libsvn_wc/op-depth-test.c
===================================================================
--- subversion/tests/libsvn_wc/op-depth-test.c	(revision 1391059)
+++ subversion/tests/libsvn_wc/op-depth-test.c	(working copy)
@@ -1746,7 +1746,7 @@ test_wc_move(const svn_test_opts_t *opts, apr_pool
       { 2, "A/B",             "base-deleted", NO_COPY_FROM, "A/B-move" },
       { 2, "A/B/C",           "base-deleted", NO_COPY_FROM},
       { 2, "A/B-move",        "normal",       1, "A/B", MOVED_HERE },
-      { 2, "A/B-move/C",      "normal",       1, "A/B/C", MOVED_HERE },
+      { 2, "A/B-move/C",      "normal",       1, "A/B/C"},
       { 3, "A/B-move/C",      "base-deleted", NO_COPY_FROM, "A/B-move/C-move" },
       { 3, "A/B-move/C-move", "normal",       1, "A/B/C", MOVED_HERE },
       { 0 }
@@ -3803,7 +3803,7 @@ nested_moves_child_first(const svn_test_opts_t *op
       {2, "A/B",     "base-deleted", NO_COPY_FROM, "A/B2"},
       {2, "A/B/C",   "base-deleted", NO_COPY_FROM},
       {2, "A/B2",    "normal",       1, "A/B",   MOVED_HERE},
-      {2, "A/B2/C",  "normal",       1, "A/B/C", MOVED_HERE},
+      {2, "A/B2/C",  "normal",       1, "A/B/C"},
       {3, "A/B2/C",  "base-deleted", NO_COPY_FROM, "A/B2/C2"},
       {3, "A/B2/C2", "normal",       1, "A/B/C", MOVED_HERE},
       {0}
@@ -3821,12 +3821,12 @@ nested_moves_child_first(const svn_test_opts_t *op
       {1, "A/B",     "base-deleted", NO_COPY_FROM},
       {1, "A/B/C",   "base-deleted", NO_COPY_FROM},
       {1, "A2",      "normal",       1, "A",     MOVED_HERE},
-      {1, "A2/B",    "normal",       1, "A/B",   MOVED_HERE},
-      {1, "A2/B/C",  "normal",       1, "A/B/C", MOVED_HERE},
+      {1, "A2/B",    "normal",       1, "A/B"},
+      {1, "A2/B/C",  "normal",       1, "A/B/C"},
       {2, "A2/B",    "base-deleted", NO_COPY_FROM, "A2/B2"},
       {2, "A2/B/C",  "base-deleted", NO_COPY_FROM},
       {2, "A2/B2",   "normal",       1, "A/B",   MOVED_HERE},
-      {2, "A2/B2/C", "normal",       1, "A/B/C", MOVED_HERE},
+      {2, "A2/B2/C", "normal",       1, "A/B/C"},
       {3, "A2/B2/C", "base-deleted", NO_COPY_FROM, "A2/B2/C2"},
       {3, "A2/B2/C2","normal",       1, "A/B/C", MOVED_HERE},
       {0}
@@ -3847,8 +3847,8 @@ nested_moves_child_first(const svn_test_opts_t *op
       {1, "A/B",     "base-deleted", NO_COPY_FROM},
       {1, "A/B/C",   "base-deleted", NO_COPY_FROM},
       {1, "A2",      "normal",       1, "A",     MOVED_HERE},
-      {1, "A2/B",    "normal",       1, "A/B",   MOVED_HERE},
-      {1, "A2/B/C",  "normal",       1, "A/B/C", MOVED_HERE},
+      {1, "A2/B",    "normal",       1, "A/B"},
+      {1, "A2/B/C",  "normal",       1, "A/B/C"},
       {0}
     };
     SVN_ERR(check_db_rows(&b, "", nodes));
@@ -3891,8 +3891,8 @@ nested_moves_child_last(const svn_test_opts_t *opt
       {1, "A/B",     "base-deleted", NO_COPY_FROM},
       {1, "A/B/C",   "base-deleted", NO_COPY_FROM},
       {1, "A2",      "normal",       1, "A",     MOVED_HERE},
-      {1, "A2/B",    "normal",       1, "A/B",   MOVED_HERE},
-      {1, "A2/B/C",  "normal",       1, "A/B/C", MOVED_HERE},
+      {1, "A2/B",    "normal",       1, "A/B"},
+      {1, "A2/B/C",  "normal",       1, "A/B/C"},
       {0}
     };
     SVN_ERR(check_db_rows(&b, "", nodes));
@@ -3908,12 +3908,12 @@ nested_moves_child_last(const svn_test_opts_t *opt
       {1, "A/B",     "base-deleted", NO_COPY_FROM},
       {1, "A/B/C",   "base-deleted", NO_COPY_FROM},
       {1, "A2",      "normal",       1, "A",     MOVED_HERE},
-      {1, "A2/B",    "normal",       1, "A/B",   MOVED_HERE},
-      {1, "A2/B/C",  "normal",       1, "A/B/C", MOVED_HERE},
+      {1, "A2/B",    "normal",       1, "A/B"},
+      {1, "A2/B/C",  "normal",       1, "A/B/C"},
       {2, "A2/B",    "base-deleted", NO_COPY_FROM, "A2/B2"},
       {2, "A2/B/C",  "base-deleted", NO_COPY_FROM},
       {2, "A2/B2",   "normal",       1, "A/B",   MOVED_HERE},
-      {2, "A2/B2/C", "normal",       1, "A/B/C", MOVED_HERE},
+      {2, "A2/B2/C", "normal",       1, "A/B/C"},
       {0}
     };
     SVN_ERR(check_db_rows(&b, "", nodes));
@@ -3929,12 +3929,12 @@ nested_moves_child_last(const svn_test_opts_t *opt
       {1, "A/B",     "base-deleted", NO_COPY_FROM},
       {1, "A/B/C",   "base-deleted", NO_COPY_FROM},
       {1, "A2",      "normal",       1, "A",     MOVED_HERE},
-      {1, "A2/B",    "normal",       1, "A/B",   MOVED_HERE},
-      {1, "A2/B/C",  "normal",       1, "A/B/C", MOVED_HERE},
+      {1, "A2/B",    "normal",       1, "A/B"},
+      {1, "A2/B/C",  "normal",       1, "A/B/C"},
       {2, "A2/B",    "base-deleted", NO_COPY_FROM, "A2/B2"},
       {2, "A2/B/C",  "base-deleted", NO_COPY_FROM},
       {2, "A2/B2",   "normal",       1, "A/B",   MOVED_HERE},
-      {2, "A2/B2/C", "normal",       1, "A/B/C", MOVED_HERE},
+      {2, "A2/B2/C", "normal",       1, "A/B/C"},
       {3, "A2/B2/C", "base-deleted", NO_COPY_FROM, "A2/B2/C2"},
       {3, "A2/B2/C2","normal",       1, "A/B/C", MOVED_HERE},
       {0}
@@ -3955,8 +3955,8 @@ nested_moves_child_last(const svn_test_opts_t *opt
       {1, "A/B",     "base-deleted", NO_COPY_FROM},
       {1, "A/B/C",   "base-deleted", NO_COPY_FROM},
       {1, "A2",      "normal",       1, "A",     MOVED_HERE},
-      {1, "A2/B",    "normal",       1, "A/B",   MOVED_HERE},
-      {1, "A2/B/C",  "normal",       1, "A/B/C", MOVED_HERE},
+      {1, "A2/B",    "normal",       1, "A/B"},
+      {1, "A2/B/C",  "normal",       1, "A/B/C"},
       {0}
     };
     SVN_ERR(check_db_rows(&b, "", nodes));
@@ -4162,7 +4162,7 @@ move_to_swap(const svn_test_opts_t *opts, apr_pool
       {1, "A",    "base-deleted", NO_COPY_FROM, "A2"},
       {1, "A/B",  "base-deleted", NO_COPY_FROM},
       {1, "A2",   "normal",       1, "A", MOVED_HERE},
-      {1, "A2/B", "normal",       1, "A/B", MOVED_HERE},
+      {1, "A2/B", "normal",       1, "A/B"},
       {2, "A2/B", "base-deleted", NO_COPY_FROM, "X/B"},
       {2, "A2/Y", "normal",       1, "X/Y", MOVED_HERE},
       {2, "X/Y",  "base-deleted", NO_COPY_FROM, "A2/Y"},
@@ -4183,9 +4183,9 @@ move_to_swap(const svn_test_opts_t *opts, apr_pool
       {0, "X/Y",  "normal",       1, "X/Y"},
       {1, "A",    "normal",       1, "X", FALSE, "A2", TRUE},
       {1, "A/B",  "base-deleted", NO_COPY_FROM},
-      {1, "A/Y",  "normal",       1, "X/Y", MOVED_HERE},
+      {1, "A/Y",  "normal",       1, "X/Y"},
       {1, "A2",   "normal",       1, "A", MOVED_HERE},
-      {1, "A2/B", "normal",       1, "A/B", MOVED_HERE},
+      {1, "A2/B", "normal",       1, "A/B"},
       {1, "X",    "base-deleted", NO_COPY_FROM, "A"},
       {1, "X/Y",  "base-deleted", NO_COPY_FROM},
       {2, "A/B",  "normal",       1, "A/B", MOVED_HERE},
@@ -4207,10 +4207,10 @@ move_to_swap(const svn_test_opts_t *opts, apr_pool
       {0, "X",   "normal",       1, "X"},
       {0, "X/Y", "normal",       1, "X/Y"},
       {1, "A",   "normal",       1, "X",   FALSE, "X", TRUE},
-      {1, "A/Y", "normal",       1, "X/Y", MOVED_HERE},
+      {1, "A/Y", "normal",       1, "X/Y"},
       {1, "A/B", "base-deleted", NO_COPY_FROM},
       {1, "X",   "normal",       1, "A",   FALSE, "A", TRUE},
-      {1, "X/B", "normal",       1, "A/B", MOVED_HERE},
+      {1, "X/B", "normal",       1, "A/B"},
       {1, "X/Y", "base-deleted", NO_COPY_FROM},
       {2, "A/Y", "base-deleted", NO_COPY_FROM, "X/Y"},
       {2, "X/B", "base-deleted", NO_COPY_FROM, "A/B"},
@@ -4236,10 +4236,10 @@ move_to_swap(const svn_test_opts_t *opts, apr_pool
       {0, "X",   "normal",       1, "X"},
       {0, "X/Y", "normal",       1, "X/Y"},
       {1, "A",   "normal",       1, "X",   FALSE, "X", TRUE},
-      {1, "A/Y", "normal",       1, "X/Y", MOVED_HERE},
+      {1, "A/Y", "normal",       1, "X/Y"},
       {1, "A/B", "base-deleted", NO_COPY_FROM},
       {1, "X",   "normal",       1, "A",   FALSE, "A", TRUE},
-      {1, "X/B", "normal",       1, "A/B", MOVED_HERE},
+      {1, "X/B", "normal",       1, "A/B"},
       {1, "X/Y", "base-deleted", NO_COPY_FROM},
       {0}
     };
@@ -4257,10 +4257,10 @@ move_to_swap(const svn_test_opts_t *opts, apr_pool
       {0, "X",   "normal",       1, "X"},
       {0, "X/Y", "normal",       1, "X/Y"},
       {1, "A",   "normal",       1, "X",   FALSE, "X", TRUE},
-      {1, "A/Y", "normal",       1, "X/Y", MOVED_HERE},
+      {1, "A/Y", "normal",       1, "X/Y"},
       {1, "A/B", "base-deleted", NO_COPY_FROM},
       {1, "X",   "normal",       1, "A",   FALSE, "A", TRUE},
-      {1, "X/B", "normal",       1, "A/B", MOVED_HERE},
+      {1, "X/B", "normal",       1, "A/B"},
       {1, "X/Y", "base-deleted", NO_COPY_FROM},
       {2, "A/Y", "base-deleted", NO_COPY_FROM, "X/Y"},
       {2, "X/B", "base-deleted", NO_COPY_FROM, "A/B"},
@@ -4287,8 +4287,8 @@ revert_nested_move(const svn_test_opts_t *opts, ap
     {1, "A/B",    "base-deleted", NO_COPY_FROM},
     {1, "A/B/C",  "base-deleted", NO_COPY_FROM},
     {1, "A2",     "normal",       1, "A",     MOVED_HERE},
-    {1, "A2/B",   "normal",       1, "A/B",   MOVED_HERE},
-    {1, "A2/B/C", "normal",       1, "A/B/C", MOVED_HERE},
+    {1, "A2/B",   "normal",       1, "A/B"},
+    {1, "A2/B/C", "normal",       1, "A/B/C"},
     {0}
   };
   nodes_row_t nodes_AB_moved[] = {
@@ -4300,12 +4300,12 @@ revert_nested_move(const svn_test_opts_t *opts, ap
     {1, "A/B",     "base-deleted", NO_COPY_FROM},
     {1, "A/B/C",   "base-deleted", NO_COPY_FROM},
     {1, "A2",      "normal",       1, "A",     MOVED_HERE},
-    {1, "A2/B",    "normal",       1, "A/B",   MOVED_HERE},
-    {1, "A2/B/C",  "normal",       1, "A/B/C", MOVED_HERE},
+    {1, "A2/B",    "normal",       1, "A/B"},
+    {1, "A2/B/C",  "normal",       1, "A/B/C"},
     {2, "A2/B",    "base-deleted", NO_COPY_FROM, "A2/B2"},
     {2, "A2/B/C",  "base-deleted", NO_COPY_FROM},
     {2, "A2/B2",   "normal",       1, "A/B",   MOVED_HERE},
-    {2, "A2/B2/C", "normal",       1, "A/B/C", MOVED_HERE},
+    {2, "A2/B2/C", "normal",       1, "A/B/C"},
     {0}
   };
   nodes_row_t nodes_ABC_moved[] = {
@@ -4317,12 +4317,12 @@ revert_nested_move(const svn_test_opts_t *opts, ap
     {1, "A/B",      "base-deleted", NO_COPY_FROM},
     {1, "A/B/C",    "base-deleted", NO_COPY_FROM},
     {1, "A2",       "normal",       1, "A",     MOVED_HERE},
-    {1, "A2/B",     "normal",       1, "A/B",   MOVED_HERE},
-    {1, "A2/B/C",   "normal",       1, "A/B/C", MOVED_HERE},
+    {1, "A2/B",     "normal",       1, "A/B"},
+    {1, "A2/B/C",   "normal",       1, "A/B/C"},
     {2, "A2/B",     "base-deleted", NO_COPY_FROM, "A2/B2"},
     {2, "A2/B/C",   "base-deleted", NO_COPY_FROM},
     {2, "A2/B2",    "normal",       1, "A/B",   MOVED_HERE},
-    {2, "A2/B2/C",  "normal",       1, "A/B/C", MOVED_HERE},
+    {2, "A2/B2/C",  "normal",       1, "A/B/C"},
     {3, "A2/B2/C",  "base-deleted", NO_COPY_FROM, "A2/B2/C2"},
     {3, "A2/B2/C2", "normal",       1, "A/B/C", MOVED_HERE},
     {0}
@@ -4451,7 +4451,7 @@ move_on_move2(const svn_test_opts_t *opts, apr_poo
       {0, "X",        "normal",       1, "X"},
       {0, "X/B",      "normal",       1, "X/B"},
       {1, "A2",       "normal",       1, "A",   MOVED_HERE},
-      {1, "A2/B",     "normal",       1, "A/B", MOVED_HERE},
+      {1, "A2/B",     "normal",       1, "A/B"},
       {1, "A",        "normal",       1, "X", FALSE, "A2"},
       {1, "A/B",      "normal",       1, "X/B"},
       {0}
@@ -4468,7 +4468,7 @@ move_on_move2(const svn_test_opts_t *opts, apr_poo
       {0, "X",        "normal",       1, "X"},
       {0, "X/B",      "normal",       1, "X/B"},
       {1, "A2",       "normal",       1, "A",   MOVED_HERE},
-      {1, "A2/B",     "normal",       1, "A/B", MOVED_HERE},
+      {1, "A2/B",     "normal",       1, "A/B"},
       {1, "B3",       "normal",       1, "X/B", MOVED_HERE},
       {1, "A",        "normal",       1, "X", FALSE, "A2"},
       {1, "A/B",      "normal",       1, "X/B"},
@@ -4507,7 +4507,7 @@ move_added(const svn_test_opts_t *opts, apr_pool_t
       {1, "A",        "base-deleted", NO_COPY_FROM, "A2"},
       {1, "A/B",      "base-deleted", NO_COPY_FROM},
       {1, "A2",       "normal",       1, "A",   MOVED_HERE},
-      {1, "A2/B",     "normal",       1, "A/B", MOVED_HERE},
+      {1, "A2/B",     "normal",       1, "A/B"},
       {3, "A2/B/C",   "normal",       NO_COPY_FROM},
       {3, "A2/B/C2",  "normal",       NO_COPY_FROM},
       {0}
@@ -4542,7 +4542,7 @@ move_update(const svn_test_opts_t *opts, apr_pool_
       {1, "A",        "base-deleted", NO_COPY_FROM, "A2"},
       {1, "A/B",      "base-deleted", NO_COPY_FROM},
       {1, "A2",       "normal",       1, "A", MOVED_HERE},
-      {1, "A2/B",     "normal",       1, "A/B", MOVED_HERE},
+      {1, "A2/B",     "normal",       1, "A/B"},
       {0}
     };
     SVN_ERR(check_db_rows(&b, "", nodes));
@@ -4562,7 +4562,7 @@ move_update(const svn_test_opts_t *opts, apr_pool_
       {1, "A2",       "normal",       1, "A", MOVED_HERE},
       {1, "A2/B",     "not-present",  2, "A/B"},                 /* XFAIL */
       {2, "A2/B",     "normal",       2, "A/B", MOVED_HERE},
-      {2, "A2/B/C",   "normal",       2, "A/B/C", MOVED_HERE},
+      {2, "A2/B/C",   "normal",       2, "A/B/C"},
       {0}
     };
     SVN_ERR(check_db_rows(&b, "", nodes));
@@ -4651,11 +4651,11 @@ test_scan_delete(const svn_test_opts_t *opts, apr_
       {1, "A2/B",     "base-deleted", NO_COPY_FROM},
       {1, "Z",        "normal",       1, "A2/B", MOVED_HERE},
       {1, "X",        "normal",       1, "A2", MOVED_HERE},
-      {1, "X/B",      "normal",       1, "A2/B", MOVED_HERE},
+      {1, "X/B",      "normal",       1, "A2/B"},
       {2, "A/B",      "base-deleted", NO_COPY_FROM, "X/B"},
       {2, "A/B/C",    "base-deleted", NO_COPY_FROM},
       {2, "X/B",      "normal",       1, "A/B", FALSE, "Z", TRUE},
-      {2, "X/B/C",    "normal",       1, "A/B/C", MOVED_HERE},
+      {2, "X/B/C",    "normal",       1, "A/B/C"},
       {1, "Y",        "normal",       1, "A/B/C", MOVED_HERE},
       {1, "C2",       "base-deleted", NO_COPY_FROM, "X/B/C"},
       {3, "X/B/C",    "normal",       1, "C2", FALSE, "Y", TRUE},
@@ -4794,46 +4794,46 @@ test_follow_moved_to(const svn_test_opts_t *opts,
       {0, "A3/B/C/D/E", "normal", 1, "A3/B/C/D/E"},
 
       {1, "A1",       "normal", 1, "A2", FALSE, "A3", TRUE},
-      {1, "A1/B",     "normal", 1, "A2/B", MOVED_HERE},
-      {1, "A1/B/C",   "normal", 1, "A2/B/C", MOVED_HERE},
-      {1, "A1/B/C/D", "normal", 1, "A2/B/C/D", MOVED_HERE},
-      {1, "A1/B/C/D/E", "normal", 1, "A2/B/C/D/E", MOVED_HERE},
+      {1, "A1/B",     "normal", 1, "A2/B"},
+      {1, "A1/B/C",   "normal", 1, "A2/B/C"},
+      {1, "A1/B/C/D", "normal", 1, "A2/B/C/D"},
+      {1, "A1/B/C/D/E", "normal", 1, "A2/B/C/D/E"},
 
       {1, "A2",       "normal", 1, "A3", FALSE, "A1", TRUE},
-      {1, "A2/B",     "normal", 1, "A3/B", MOVED_HERE},
-      {1, "A2/B/C",   "normal", 1, "A3/B/C", MOVED_HERE},
-      {1, "A2/B/C/D", "normal", 1, "A3/B/C/D", MOVED_HERE},
-      {1, "A2/B/C/D/E", "normal", 1, "A3/B/C/D/E", MOVED_HERE},
+      {1, "A2/B",     "normal", 1, "A3/B"},
+      {1, "A2/B/C",   "normal", 1, "A3/B/C"},
+      {1, "A2/B/C/D", "normal", 1, "A3/B/C/D"},
+      {1, "A2/B/C/D/E", "normal", 1, "A3/B/C/D/E"},
 
       {1, "A3",       "normal", 1, "A1", FALSE, "A2", TRUE},
-      {1, "A3/B",     "normal", 1, "A1/B", MOVED_HERE},
-      {1, "A3/B/C",   "normal", 1, "A1/B/C", MOVED_HERE},
-      {1, "A3/B/C/D", "normal", 1, "A1/B/C/D", MOVED_HERE},
-      {1, "A3/B/C/D/E", "normal", 1, "A1/B/C/D/E", MOVED_HERE},
+      {1, "A3/B",     "normal", 1, "A1/B"},
+      {1, "A3/B/C",   "normal", 1, "A1/B/C"},
+      {1, "A3/B/C/D", "normal", 1, "A1/B/C/D"},
+      {1, "A3/B/C/D/E", "normal", 1, "A1/B/C/D/E"},
 
       {2, "A1/B",     "normal", 1, "A3/B", FALSE, "A3/B", TRUE},
-      {2, "A1/B/C",   "normal", 1, "A3/B/C", MOVED_HERE},
-      {2, "A1/B/C/D", "normal", 1, "A3/B/C/D", MOVED_HERE},
-      {2, "A1/B/C/D/E", "normal", 1, "A3/B/C/D/E", MOVED_HERE},
+      {2, "A1/B/C",   "normal", 1, "A3/B/C"},
+      {2, "A1/B/C/D", "normal", 1, "A3/B/C/D"},
+      {2, "A1/B/C/D/E", "normal", 1, "A3/B/C/D/E"},
 
       {2, "A2/B",     "normal", 1, "A1/B", FALSE, "A1/B", TRUE},
-      {2, "A2/B/C",   "normal", 1, "A1/B/C", MOVED_HERE},
-      {2, "A2/B/C/D", "normal", 1, "A1/B/C/D", MOVED_HERE},
-      {2, "A2/B/C/D/E", "normal", 1, "A1/B/C/D/E", MOVED_HERE},
+      {2, "A2/B/C",   "normal", 1, "A1/B/C"},
+      {2, "A2/B/C/D", "normal", 1, "A1/B/C/D"},
+      {2, "A2/B/C/D/E", "normal", 1, "A1/B/C/D/E"},
 
       {2, "A3/B",     "normal", 1, "A2/B", FALSE, "A2/B", TRUE},
-      {2, "A3/B/C",   "normal", 1, "A2/B/C", MOVED_HERE},
-      {2, "A3/B/C/D", "normal", 1, "A2/B/C/D", MOVED_HERE},
-      {2, "A3/B/C/D/E", "normal", 1, "A2/B/C/D/E", MOVED_HERE},
+      {2, "A3/B/C",   "normal", 1, "A2/B/C"},
+      {2, "A3/B/C/D", "normal", 1, "A2/B/C/D"},
+      {2, "A3/B/C/D/E", "normal", 1, "A2/B/C/D/E"},
 
       {4, "A1/B/C/D",   "normal", 1, "A1/B/C/D", FALSE, "A3/B/C/D", TRUE},
-      {4, "A1/B/C/D/E", "normal", 1, "A1/B/C/D/E", MOVED_HERE},
+      {4, "A1/B/C/D/E", "normal", 1, "A1/B/C/D/E"},
 
       {4, "A2/B/C/D",   "normal", 1, "A2/B/C/D", FALSE, "A1/B/C/D", TRUE},
-      {4, "A2/B/C/D/E", "normal", 1, "A2/B/C/D/E", MOVED_HERE},
+      {4, "A2/B/C/D/E", "normal", 1, "A2/B/C/D/E"},
 
       {4, "A3/B/C/D",   "normal", 1, "A3/B/C/D", FALSE, "A2/B/C/D", TRUE},
-      {4, "A3/B/C/D/E", "normal", 1, "A3/B/C/D/E", MOVED_HERE},
+      {4, "A3/B/C/D/E", "normal", 1, "A3/B/C/D/E"},
 
       {5, "A1/B/C/D/E", "normal", 1, "A2/B/C/D/E", FALSE, "A3/B/C/D/E", TRUE},
       {5, "A2/B/C/D/E", "normal", 1, "A3/B/C/D/E", FALSE, "A1/B/C/D/E", TRUE},


Re: work in progress patch: recording moved-here at op-root

Posted by Stefan Sperling <st...@elego.de>.
On Thu, Sep 27, 2012 at 07:08:05PM +0200, Stefan Sperling wrote:
> Here's a work-in-progress patch towards setting moved-here only on
> the op-root.

> It's not clear whether this approach will be used. An alternative
> approach is setting moved-here only on children with the same op-depth
> as the op-root.

I've decided to go with the alternative approach instead and implemented
it in r1392391.