You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2016/10/11 13:40:10 UTC

svn commit: r1764239 - /subversion/branches/resolve-incoming-add/subversion/libsvn_client/conflicts.c

Author: stsp
Date: Tue Oct 11 13:40:10 2016
New Revision: 1764239

URL: http://svn.apache.org/viewvc?rev=1764239&view=rev
Log:
On the 'resolve-incoming-add' branch:

When merging added directory trees, merge the properties at the root folder.

* subversion/libsvn_client/conflicts.c
  (merge_added_dir_props): New helper function.
  (diff_dir_added): Merge props on the root of the added tree.

Modified:
    subversion/branches/resolve-incoming-add/subversion/libsvn_client/conflicts.c

Modified: subversion/branches/resolve-incoming-add/subversion/libsvn_client/conflicts.c
URL: http://svn.apache.org/viewvc/subversion/branches/resolve-incoming-add/subversion/libsvn_client/conflicts.c?rev=1764239&r1=1764238&r2=1764239&view=diff
==============================================================================
--- subversion/branches/resolve-incoming-add/subversion/libsvn_client/conflicts.c (original)
+++ subversion/branches/resolve-incoming-add/subversion/libsvn_client/conflicts.c Tue Oct 11 13:40:10 2016
@@ -5572,6 +5572,71 @@ struct merge_newly_added_dir_baton {
   svn_revnum_t merge_right_rev;
 };
 
+static svn_error_t *
+merge_added_dir_props(const char *target_abspath,
+                      const char *added_repos_relpath,
+                      apr_hash_t *added_props,
+                      const char *repos_root_url,
+                      const char *repos_uuid,
+                      svn_revnum_t merge_left_rev,
+                      svn_revnum_t merge_right_rev,
+                      svn_client_ctx_t *ctx,
+                      apr_pool_t *scratch_pool)
+{
+  svn_wc_notify_state_t property_state;
+  apr_array_header_t *propchanges;
+  const svn_wc_conflict_version_t *left_version;
+  const svn_wc_conflict_version_t *right_version;
+  apr_hash_index_t *hi;
+
+  left_version = svn_wc_conflict_version_create2(
+                   repos_root_url, repos_uuid, added_repos_relpath,
+                   merge_left_rev, svn_node_none, scratch_pool);
+
+  right_version = svn_wc_conflict_version_create2(
+                    repos_root_url, repos_uuid, added_repos_relpath,
+                    merge_right_rev, svn_node_dir, scratch_pool);
+
+  propchanges = apr_array_make(scratch_pool, apr_hash_count(added_props),
+                               sizeof(svn_prop_t));
+  for (hi = apr_hash_first(scratch_pool, added_props);
+       hi;
+       hi = apr_hash_next(hi))
+    {
+      svn_prop_t prop;
+
+      prop.name = apr_hash_this_key(hi);
+      prop.value = apr_hash_this_val(hi);
+
+      if (svn_wc_is_normal_prop(prop.name))
+        APR_ARRAY_PUSH(propchanges, svn_prop_t) = prop;
+    }
+
+  SVN_ERR(svn_wc_merge_props3(&property_state, ctx->wc_ctx,
+                              target_abspath,
+                              left_version, right_version,
+                              apr_hash_make(scratch_pool),
+                              propchanges,
+                              FALSE, /* not a dry-run */
+                              NULL, NULL, NULL, NULL,
+                              scratch_pool));
+
+  if (ctx->notify_func2)
+    {
+      svn_wc_notify_t *notify;
+
+      notify = svn_wc_create_notify(target_abspath,
+                                    svn_wc_notify_update_update,
+                                    scratch_pool);
+      notify->kind = svn_node_dir;
+      notify->content_state = svn_wc_notify_state_unchanged;;
+      notify->prop_state = property_state;
+      ctx->notify_func2(ctx->notify_baton2, notify, scratch_pool);
+    }
+
+  return SVN_NO_ERROR;
+}
+
 /* An svn_diff_tree_processor_t callback. */
 static svn_error_t *
 diff_dir_added(const char *relpath,
@@ -5590,9 +5655,20 @@ diff_dir_added(const char *relpath,
   svn_node_kind_t on_disk_kind;
   apr_hash_index_t *hi;
 
-  /* Skip adding the root of the added directory tree itself. */
+  /* Handle the root of the added directory tree. */
   if (relpath[0] == '\0')
-    return SVN_NO_ERROR;
+    {
+      /* ### svn_wc_merge_props3() requires this... */
+      SVN_ERR(svn_wc__del_tree_conflict(b->ctx->wc_ctx, b->target_abspath,
+                                        scratch_pool));
+      SVN_ERR(merge_added_dir_props(b->target_abspath,
+                                    b->added_repos_relpath, right_props,
+                                    b->repos_root_url, b->repos_uuid,
+                                    b->merge_left_rev, b->merge_right_rev,
+                                    b->ctx, scratch_pool));
+      return SVN_NO_ERROR;
+
+    }
 
   local_abspath = svn_dirent_join(b->target_abspath, relpath, scratch_pool);