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