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},