You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ph...@apache.org on 2013/02/05 15:37:34 UTC
svn commit: r1442610 - in /subversion/trunk/subversion:
libsvn_wc/wc_db_update_move.c tests/libsvn_wc/op-depth-test.c
Author: philip
Date: Tue Feb 5 14:37:34 2013
New Revision: 1442610
URL: http://svn.apache.org/viewvc?rev=1442610&view=rev
Log:
Move-updating can only raise a tree-conflict if no obstructing
tree-conflict exists.
* subversion/libsvn_wc/wc_db_update_move.c
(mark_tree_conflict): Remove skel parameter, always check existing conflict.
(check_tree_conflict): Move existing conflict code to mark_tree_conflict.
(tc_editor_add_directory, tc_editor_add_file, tc_editor_delete,
resolve_delete_raise_moved_away): Don't pass NULL skel.
* subversion/tests/libsvn_wc/op-depth-test.c
(layered_moved_to): Extend to test failure to resolve.
Modified:
subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c
subversion/trunk/subversion/tests/libsvn_wc/op-depth-test.c
Modified: subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c?rev=1442610&r1=1442609&r2=1442610&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c (original)
+++ subversion/trunk/subversion/libsvn_wc/wc_db_update_move.c Tue Feb 5 14:37:34 2013
@@ -220,9 +220,10 @@ mark_tree_conflict(struct tc_editor_bato
svn_wc_conflict_reason_t reason,
svn_wc_conflict_action_t action,
const char *moved_away_op_root_relpath,
- svn_skel_t *conflict,
apr_pool_t *scratch_pool)
{
+ svn_error_t *err;
+ svn_skel_t *conflict;
svn_wc_conflict_version_t *old_version, *new_version;
const char *moved_away_op_root_abspath
= moved_away_op_root_relpath
@@ -247,7 +248,52 @@ mark_tree_conflict(struct tc_editor_bato
local_relpath),
scratch_pool);
- if (!conflict)
+ err = svn_wc__db_read_conflict_internal(&conflict, b->wcroot, local_relpath,
+ scratch_pool, scratch_pool);
+ if (err && err->apr_err != SVN_ERR_WC_PATH_NOT_FOUND)
+ return err;
+ else if (err)
+ {
+ svn_error_clear(err);
+ conflict = NULL;
+ }
+
+ if (conflict)
+ {
+ svn_wc_conflict_reason_t existing_reason;
+ svn_wc_conflict_action_t existing_action;
+ const char *existing_abspath;
+
+ err = svn_wc__conflict_read_tree_conflict(&existing_reason,
+ &existing_action,
+ &existing_abspath,
+ b->db, b->wcroot->abspath,
+ conflict,
+ scratch_pool, scratch_pool);
+ if (err && err->apr_err != SVN_ERR_WC_MISSING)
+ return err;
+
+ if (!err)
+ {
+ if (reason != existing_reason
+ || action != existing_action
+ || (reason == svn_wc_conflict_reason_moved_away
+ && strcmp(moved_away_op_root_relpath,
+ svn_dirent_skip_ancestor(b->wcroot->abspath,
+ existing_abspath))))
+ return svn_error_createf(SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE, NULL,
+ _("'%s' already in conflict"),
+ svn_dirent_local_style(local_relpath,
+ scratch_pool));
+
+ /* Already a suitable tree-conflict. */
+ return SVN_NO_ERROR;
+ }
+
+ /* Not a tree-conflict. */
+ svn_error_clear(err);
+ }
+ else
conflict = svn_wc__conflict_skel_create(scratch_pool);
b->conflict_root_relpath = apr_pstrdup(b->result_pool, local_relpath);
@@ -324,7 +370,6 @@ check_tree_conflict(svn_boolean_t *is_co
const char *conflict_root_relpath = local_relpath;
const char *moved_to_relpath, *moved_to_op_root_relpath;
const char *moved_away_op_root_relpath;
- svn_skel_t *conflict;
if (b->conflict_root_relpath)
{
@@ -364,28 +409,6 @@ check_tree_conflict(svn_boolean_t *is_co
action = svn_wc_conflict_action_edit;
}
- SVN_ERR(svn_wc__db_read_conflict_internal(&conflict, b->wcroot,
- conflict_root_relpath,
- scratch_pool, scratch_pool));
-
- if (conflict)
- {
- svn_error_t *err
- = svn_wc__conflict_read_tree_conflict(NULL, NULL, NULL,
- b->db, b->wcroot->abspath,
- conflict,
- scratch_pool, scratch_pool);
- if (err && err->apr_err != SVN_ERR_WC_MISSING)
- return err;
-
- if (!err)
- /* Already a tree-conflict. */
- return SVN_NO_ERROR;
-
- /* Not a tree-conflict. */
- svn_error_clear(err);
- }
-
SVN_ERR(svn_wc__db_op_depth_moved_to(&moved_to_relpath,
&moved_to_op_root_relpath,
&moved_away_op_root_relpath,
@@ -399,7 +422,7 @@ check_tree_conflict(svn_boolean_t *is_co
? svn_wc_conflict_reason_moved_away
: svn_wc_conflict_reason_deleted),
action, moved_away_op_root_relpath,
- conflict, scratch_pool));
+ scratch_pool));
if (b->notify_func)
SVN_ERR(update_move_list_add(b->wcroot, local_relpath,
svn_wc_notify_tree_conflict,
@@ -472,7 +495,7 @@ tc_editor_add_directory(void *baton,
SVN_ERR(mark_tree_conflict(b, relpath, old_kind, svn_node_dir,
move_dst_repos_relpath,
svn_wc_conflict_reason_unversioned,
- svn_wc_conflict_action_add, NULL, NULL,
+ svn_wc_conflict_action_add, NULL,
scratch_pool));
action = svn_wc_notify_tree_conflict;
break;
@@ -556,7 +579,7 @@ tc_editor_add_file(void *baton,
SVN_ERR(mark_tree_conflict(b, relpath, old_kind, svn_node_file,
move_dst_repos_relpath,
svn_wc_conflict_reason_unversioned,
- svn_wc_conflict_action_add, NULL, NULL,
+ svn_wc_conflict_action_add, NULL,
scratch_pool));
if (b->notify_func)
SVN_ERR(update_move_list_add(b->wcroot, relpath,
@@ -1072,7 +1095,7 @@ tc_editor_delete(void *baton,
is_conflicted = TRUE;
SVN_ERR(mark_tree_conflict(b, relpath, move_dst_kind, svn_node_none,
move_dst_repos_relpath, reason,
- svn_wc_conflict_action_delete, NULL, NULL,
+ svn_wc_conflict_action_delete, NULL,
scratch_pool));
if (b->notify_func)
SVN_ERR(update_move_list_add(b->wcroot, relpath,
@@ -1981,7 +2004,7 @@ resolve_delete_raise_moved_away(svn_wc__
svn_node_dir /* ### ? */,
moved_dst_repos_relpath,
svn_wc_conflict_reason_moved_away,
- action, local_relpath, NULL, iterpool));
+ action, local_relpath, iterpool));
/* ### Do notification? */
Modified: subversion/trunk/subversion/tests/libsvn_wc/op-depth-test.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_wc/op-depth-test.c?rev=1442610&r1=1442609&r2=1442610&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_wc/op-depth-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_wc/op-depth-test.c Tue Feb 5 14:37:34 2013
@@ -6044,6 +6044,7 @@ static svn_error_t *
layered_moved_to(const svn_test_opts_t *opts, apr_pool_t *pool)
{
svn_test__sandbox_t b;
+ svn_error_t *err;
SVN_ERR(svn_test__sandbox_create(&b, "layered_moved_to", opts, pool));
@@ -6062,6 +6063,9 @@ layered_moved_to(const svn_test_opts_t *
SVN_ERR(sbox_wc_commit(&b, ""));
SVN_ERR(sbox_wc_mkdir(&b, "P"));
SVN_ERR(sbox_wc_commit(&b, ""));
+ SVN_ERR(sbox_wc_propset(&b, "property2", "value", "A/B/C/D/E"));
+ SVN_ERR(sbox_wc_propset(&b, "property2", "value", "C/D/E"));
+ SVN_ERR(sbox_wc_commit(&b, ""));
SVN_ERR(sbox_wc_update(&b, "", 1));
SVN_ERR(sbox_wc_move(&b, "A", "X"));
@@ -6223,7 +6227,98 @@ layered_moved_to(const svn_test_opts_t *
SVN_ERR(check_db_rows(&b, "", nodes));
}
- SVN_ERR(sbox_wc_update(&b, "C", 3));
+ /* Update for conflicts on A and C */
+ SVN_ERR(sbox_wc_update(&b, "", 5));
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 5, ""},
+ {0, "A", "normal", 5, "A"},
+ {0, "A/B", "normal", 5, "A/B"},
+ {0, "A/B/C", "normal", 5, "A/B/C"},
+ {0, "A/B/C/D", "normal", 5, "A/B/C/D"},
+ {0, "A/B/C/D/E", "normal", 5, "A/B/C/D/E"},
+ {0, "P", "normal", 5, "P"},
+ {0, "C", "normal", 5, "C"},
+ {0, "C/D", "normal", 5, "C/D"},
+ {0, "C/D/E", "normal", 5, "C/D/E"},
+ {1, "A", "base-deleted", NO_COPY_FROM, "X"},
+ {1, "A/B", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "C", "base-deleted", NO_COPY_FROM, "X/B/C"},
+ {1, "C/D", "base-deleted", NO_COPY_FROM},
+ {1, "C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "X", "normal", 4, "A", MOVED_HERE},
+ {1, "X/B", "normal", 4, "A/B", MOVED_HERE},
+ {1, "X/B/C", "normal", 4, "A/B/C", MOVED_HERE},
+ {1, "X/B/C/D", "normal", 4, "A/B/C/D", MOVED_HERE},
+ {1, "X/B/C/D/E", "normal", 4, "A/B/C/D/E", MOVED_HERE},
+ {3, "X/B/C", "normal", 3, "C", MOVED_HERE},
+ {3, "X/B/C/D", "normal", 3, "C/D", MOVED_HERE},
+ {3, "X/B/C/D/E", "normal", 3, "C/D/E", FALSE, "E2", TRUE},
+ {5, "X/B/C/D/E", "base-deleted", NO_COPY_FROM, "E3"},
+ {1, "E2", "normal", 4, "A/B/C/D/E", MOVED_HERE},
+ {1, "E3", "normal", 3, "C/D/E", MOVED_HERE},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
+ /* Partially resolve A */
+ SVN_ERR(sbox_wc_resolve(&b, "A", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "X/B/C", svn_depth_empty,
+ svn_wc_conflict_choose_merged));
+
+ /* Cannot resolve C */
+ err = sbox_wc_resolve(&b, "C", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict);
+ SVN_ERR_ASSERT(err && err->apr_err == SVN_ERR_WC_CONFLICT_RESOLVER_FAILURE);
+ svn_error_clear(err);
+
+ /* Complete resolving A and then resolve C */
+ SVN_ERR(sbox_wc_resolve(&b, "X/B/C/D/E", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+ SVN_ERR(sbox_wc_resolve(&b, "C", svn_depth_empty,
+ svn_wc_conflict_choose_mine_conflict));
+
+ {
+ nodes_row_t nodes[] = {
+ {0, "", "normal", 5, ""},
+ {0, "A", "normal", 5, "A"},
+ {0, "A/B", "normal", 5, "A/B"},
+ {0, "A/B/C", "normal", 5, "A/B/C"},
+ {0, "A/B/C/D", "normal", 5, "A/B/C/D"},
+ {0, "A/B/C/D/E", "normal", 5, "A/B/C/D/E"},
+ {0, "P", "normal", 5, "P"},
+ {0, "C", "normal", 5, "C"},
+ {0, "C/D", "normal", 5, "C/D"},
+ {0, "C/D/E", "normal", 5, "C/D/E"},
+ {1, "A", "base-deleted", NO_COPY_FROM, "X"},
+ {1, "A/B", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D", "base-deleted", NO_COPY_FROM},
+ {1, "A/B/C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "C", "base-deleted", NO_COPY_FROM, "X/B/C"},
+ {1, "C/D", "base-deleted", NO_COPY_FROM},
+ {1, "C/D/E", "base-deleted", NO_COPY_FROM},
+ {1, "X", "normal", 5, "A", MOVED_HERE},
+ {1, "X/B", "normal", 5, "A/B", MOVED_HERE},
+ {1, "X/B/C", "normal", 5, "A/B/C", MOVED_HERE},
+ {1, "X/B/C/D", "normal", 5, "A/B/C/D", MOVED_HERE},
+ {1, "X/B/C/D/E", "normal", 5, "A/B/C/D/E", MOVED_HERE},
+ {3, "X/B/C", "normal", 5, "C", MOVED_HERE},
+ {3, "X/B/C/D", "normal", 5, "C/D", MOVED_HERE},
+ {3, "X/B/C/D/E", "normal", 5, "C/D/E", FALSE, "E2", TRUE},
+ {5, "X/B/C/D/E", "base-deleted", NO_COPY_FROM, "E3"},
+ {1, "E2", "normal", 5, "A/B/C/D/E", MOVED_HERE},
+ {1, "E3", "normal", 3, "C/D/E", MOVED_HERE},
+ {0}
+ };
+ SVN_ERR(check_db_rows(&b, "", nodes));
+ }
+
return SVN_NO_ERROR;
}