You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by ko...@apache.org on 2016/10/10 14:20:28 UTC
svn commit: r1764104 -
/subversion/trunk/subversion/tests/libsvn_client/conflicts-test.c
Author: kotkov
Date: Mon Oct 10 14:20:28 2016
New Revision: 1764104
URL: http://svn.apache.org/viewvc?rev=1764104&view=rev
Log:
Add a failing test for "incoming move vs local edit" tree conflict resolution
upon merge, where the incoming move is a chained one (like, mv a \u2192 b, commit,
mv b \u2192 c, commit).
The test expects to see the "(m) move 'a' to 'c' and merge" option available,
which is not there. I think that the move detection algorithm finds the
first part of the chained move, but fails to see the second one, b \u2192 c.
* subversion/tests/libsvn_client/conflicts-test.c
(test_merge_incoming_chained_move_local_edit): New failing test.
(test_funcs): Reference new test.
Modified:
subversion/trunk/subversion/tests/libsvn_client/conflicts-test.c
Modified: subversion/trunk/subversion/tests/libsvn_client/conflicts-test.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_client/conflicts-test.c?rev=1764104&r1=1764103&r2=1764104&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_client/conflicts-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_client/conflicts-test.c Mon Oct 10 14:20:28 2016
@@ -3144,6 +3144,110 @@ test_merge_incoming_edit_file_moved_away
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_merge_incoming_chained_move_local_edit(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_test__sandbox_t *b = apr_palloc(pool, sizeof(*b));
+ svn_client_ctx_t *ctx;
+ svn_opt_revision_t opt_rev;
+ svn_client_conflict_t *conflict;
+ svn_boolean_t text_conflicted;
+ apr_array_header_t *props_conflicted;
+ svn_boolean_t tree_conflicted;
+ svn_stringbuf_t *buf;
+
+ SVN_ERR(svn_test__sandbox_create(
+ b, "merge_incoming_chained_move_local_edit", opts, pool));
+
+ SVN_ERR(sbox_add_and_commit_greek_tree(b));
+ /* Create a copy of node "A". */
+ SVN_ERR(sbox_wc_copy(b, "A", "A1"));
+ SVN_ERR(sbox_wc_commit(b, ""));
+ /* On "trunk", move the file. */
+ SVN_ERR(sbox_wc_move(b, "A/mu", "A/mu-moved"));
+ SVN_ERR(sbox_wc_commit(b, ""));
+ /* On "trunk", move the file again. */
+ SVN_ERR(sbox_wc_move(b, "A/mu-moved", "A/mu-moved-again"));
+ SVN_ERR(sbox_wc_commit(b, ""));
+ /* On "branch", edit the file. */
+ SVN_ERR(sbox_file_write(b, "A1/mu", "New branch content.\n"));
+ SVN_ERR(sbox_wc_commit(b, ""));
+
+ SVN_ERR(svn_test__create_client_ctx(&ctx, b, pool));
+
+ /* Merge "trunk" to "branch". */
+ SVN_ERR(sbox_wc_update(b, "", SVN_INVALID_REVNUM));
+ opt_rev.kind = svn_opt_revision_head;
+ opt_rev.value.number = SVN_INVALID_REVNUM;
+ SVN_ERR(svn_client_merge_peg5(svn_path_url_add_component2(b->repos_url, "A",
+ pool),
+ NULL, &opt_rev, sbox_wc_path(b, "A1"),
+ svn_depth_infinity,
+ FALSE, FALSE, FALSE, FALSE, FALSE, FALSE,
+ NULL, ctx, pool));
+
+ /* We should have a tree conflict in the file "mu". */
+ SVN_ERR(svn_client_conflict_get(&conflict, sbox_wc_path(b, "A1/mu"), ctx,
+ pool, pool));
+ SVN_ERR(svn_client_conflict_get_conflicted(&text_conflicted,
+ &props_conflicted,
+ &tree_conflicted,
+ conflict, pool, pool));
+ SVN_TEST_ASSERT(!text_conflicted);
+ SVN_TEST_INT_ASSERT(props_conflicted->nelts, 0);
+ SVN_TEST_ASSERT(tree_conflicted);
+
+ /* Check available tree conflict resolution options. */
+ {
+ svn_client_conflict_option_id_t expected_opts[] = {
+ svn_client_conflict_option_postpone,
+ svn_client_conflict_option_accept_current_wc_state,
+ svn_client_conflict_option_incoming_delete_ignore,
+ svn_client_conflict_option_incoming_delete_accept,
+ -1 /* end of list */
+ };
+ SVN_ERR(assert_tree_conflict_options(conflict, ctx, expected_opts, pool));
+ }
+
+ SVN_ERR(svn_client_conflict_tree_get_details(conflict, ctx, pool));
+
+ /* XFAIL: The conflict resolver doesn't find the move, and doesn't offer
+ * the svn_client_conflict_option_incoming_move_file_text_merge option. */
+ {
+ svn_client_conflict_option_id_t expected_opts[] = {
+ svn_client_conflict_option_postpone,
+ svn_client_conflict_option_accept_current_wc_state,
+ svn_client_conflict_option_incoming_move_file_text_merge,
+ -1 /* end of list */
+ };
+ SVN_ERR(assert_tree_conflict_options(conflict, ctx, expected_opts, pool));
+ }
+
+ /* Resolve the tree conflict by moving "mu" to "mu-moved-again". */
+ SVN_ERR(svn_client_conflict_tree_resolve_by_id(
+ conflict, svn_client_conflict_option_incoming_move_file_text_merge,
+ ctx, pool));
+
+ /* The file should not be in conflict. */
+ SVN_ERR(svn_client_conflict_get(&conflict, sbox_wc_path(b, "A1/mu"),
+ ctx, pool, pool));
+ SVN_ERR(svn_client_conflict_get_conflicted(&text_conflicted,
+ &props_conflicted,
+ &tree_conflicted,
+ conflict, pool, pool));
+ SVN_TEST_ASSERT(!text_conflicted);
+ SVN_TEST_INT_ASSERT(props_conflicted->nelts, 0);
+ SVN_TEST_ASSERT(!tree_conflicted);
+
+ /* The move destination should have the expected content. */
+ SVN_ERR(svn_stringbuf_from_file2(&buf, sbox_wc_path(b, "A1/mu-moved-again"),
+ pool));
+ SVN_TEST_STRING_ASSERT(buf->data, "New branch content.\n");
+
+ return SVN_NO_ERROR;
+}
+
/* ========================================================================== */
@@ -3203,6 +3307,8 @@ static struct svn_test_descriptor_t test
"merge incoming move file merge with text conflict"),
SVN_TEST_OPTS_XFAIL(test_merge_incoming_edit_file_moved_away,
"merge incoming edit for a moved-away working file"),
+ SVN_TEST_OPTS_XFAIL(test_merge_incoming_chained_move_local_edit,
+ "merge incoming chained move vs local edit"),
SVN_TEST_NULL
};