You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2013/12/13 19:34:15 UTC

svn commit: r1550799 - in /subversion/trunk/subversion: libsvn_client/mtcc.c tests/libsvn_client/mtcc-test.c

Author: rhuijben
Date: Fri Dec 13 18:34:15 2013
New Revision: 1550799

URL: http://svn.apache.org/r1550799
Log:
Make the recently added mtcc libsvn_client api properly obtain a log message
via the svn_client_ctx_t callbacks.

* subversion/libsvn_client/mtcc.c
  (add_commit_items): New function.
  (svn_client_mtcc_commit): Call log function.

* subversion/tests/libsvn_client/mtcc-test.c
  (verify_mtcc_commit): Update caller.
  (test_swap): Add a new test.
  (test_list): Add test.

Modified:
    subversion/trunk/subversion/libsvn_client/mtcc.c
    subversion/trunk/subversion/tests/libsvn_client/mtcc-test.c

Modified: subversion/trunk/subversion/libsvn_client/mtcc.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/mtcc.c?rev=1550799&r1=1550798&r2=1550799&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/mtcc.c (original)
+++ subversion/trunk/subversion/libsvn_client/mtcc.c Fri Dec 13 18:34:15 2013
@@ -676,6 +676,75 @@ commit_directory(const svn_delta_editor_
   return svn_error_trace(editor->close_directory(dir_baton, scratch_pool));
 }
 
+
+/* Helper function to recursively create svn_client_commit_item3_t items
+   to provide to the log message callback */
+static svn_error_t *
+add_commit_items(svn_client_mtcc_op_t *op,
+                 const char *url,
+                 apr_array_header_t *commit_items,
+                 apr_pool_t *result_pool,
+                 apr_pool_t *scratch_pool)
+{
+  if ((op->kind != OP_OPEN_DIR && op->kind != OP_OPEN_FILE)
+      || (op->prop_mods && op->prop_mods->nelts)
+      || (op->src_stream))
+    {
+      svn_client_commit_item3_t *item;
+
+      item = svn_client_commit_item3_create(result_pool);
+
+      item->path = NULL;
+      if (op->kind == OP_OPEN_DIR || op->kind == OP_ADD_DIR)
+        item->kind = svn_node_dir;
+      else if (op->kind == OP_OPEN_FILE || op->kind == OP_ADD_FILE)
+        item->kind = svn_node_file;
+      else
+        item->kind = svn_node_unknown;
+
+      item->url = apr_pstrdup(result_pool, url);
+
+      if (op->kind == OP_ADD_DIR || op->kind == OP_ADD_FILE)
+        item->state_flags = SVN_CLIENT_COMMIT_ITEM_ADD;
+      else if (op->kind == OP_DELETE)
+        item->state_flags = SVN_CLIENT_COMMIT_ITEM_DELETE;
+      /* else item->state_flags = 0; */
+
+      if (op->prop_mods && op->prop_mods->nelts)
+        item->state_flags |= SVN_CLIENT_COMMIT_ITEM_PROP_MODS;
+
+      if (op->src_stream)
+        item->state_flags |= SVN_CLIENT_COMMIT_ITEM_TEXT_MODS;
+
+      APR_ARRAY_PUSH(commit_items, svn_client_commit_item3_t *) = item;
+    }
+
+  if (op->children && op->children->nelts)
+    {
+      int i;
+      apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+      for (i = 0; i < op->children->nelts; i++)
+        {
+          svn_client_mtcc_op_t *cop;
+          const char * child_url;
+
+          cop = APR_ARRAY_IDX(op->children, i, svn_client_mtcc_op_t *);
+
+          svn_pool_clear(iterpool);
+
+          child_url = svn_path_url_add_component2(url, cop->name, iterpool);
+
+          SVN_ERR(add_commit_items(cop, child_url, commit_items,
+                                   result_pool, iterpool));
+        }
+
+      svn_pool_destroy(iterpool);
+    }
+
+  return SVN_NO_ERROR;
+}
+
 svn_error_t *
 svn_client_mtcc_commit(apr_hash_t *revprop_table,
                        svn_commit_callback2_t commit_callback,
@@ -684,15 +753,40 @@ svn_client_mtcc_commit(apr_hash_t *revpr
                        apr_pool_t *scratch_pool)
 {
   const svn_delta_editor_t *editor;
+  apr_hash_t *commit_revprops;
   void *edit_baton;
   svn_error_t *err;
   void *root_baton;
   const char *session_url;
+  const char *log_msg;
 
   SVN_ERR(svn_ra_get_session_url(mtcc->ra_session, &session_url, scratch_pool));
 
+    /* Create new commit items and add them to the array. */
+  if (SVN_CLIENT__HAS_LOG_MSG_FUNC(mtcc->ctx))
+    {
+      svn_client_commit_item3_t *item;
+      const char *tmp_file;
+      apr_array_header_t *commit_items
+                = apr_array_make(scratch_pool, 32, sizeof(item));
+
+      SVN_ERR(add_commit_items(mtcc->root_op, session_url, commit_items,
+                               scratch_pool, scratch_pool));
+
+      SVN_ERR(svn_client__get_log_msg(&log_msg, &tmp_file, commit_items,
+                                      mtcc->ctx, scratch_pool));
+
+      if (! log_msg)
+        return SVN_NO_ERROR;
+    }
+  else
+    log_msg = "";
+
+  SVN_ERR(svn_client__ensure_revprop_table(&commit_revprops, revprop_table,
+                                           log_msg, mtcc->ctx, scratch_pool));
+
   SVN_ERR(svn_ra_get_commit_editor3(mtcc->ra_session, &editor, &edit_baton,
-                                    revprop_table,
+                                    commit_revprops,
                                     commit_callback, commit_baton,
                                     NULL /* lock_tokens */,
                                     FALSE /* keep_locks */,

Modified: subversion/trunk/subversion/tests/libsvn_client/mtcc-test.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_client/mtcc-test.c?rev=1550799&r1=1550798&r2=1550799&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_client/mtcc-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_client/mtcc-test.c Fri Dec 13 18:34:15 2013
@@ -38,7 +38,7 @@ verify_mtcc_commit(svn_client_mtcc_t *mt
                    apr_pool_t *pool)
 {
   /* TODO: Verify actual commit, etc. */
-  SVN_ERR(svn_client_mtcc_commit(apr_hash_make(pool), NULL, NULL, mtcc, pool));
+  SVN_ERR(svn_client_mtcc_commit(NULL, NULL, NULL, mtcc, pool));
 
   return SVN_NO_ERROR;
 };
@@ -103,7 +103,7 @@ test_mkdir(const svn_test_opts_t *opts,
   SVN_ERR(svn_test__create_repos(&repos, repos_abspath, opts, pool));
 
   SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
-  SVN_ERR(svn_client_mtcc_create(&mtcc, repos_url, 1, ctx, pool, pool));
+  SVN_ERR(svn_client_mtcc_create(&mtcc, repos_url, 0, ctx, pool, pool));
 
   SVN_ERR(svn_client_mtcc_add_mkdir("branches", mtcc, pool));
   SVN_ERR(svn_client_mtcc_add_mkdir("trunk", mtcc, pool));
@@ -119,7 +119,7 @@ test_mkdir(const svn_test_opts_t *opts,
 
 static svn_error_t *
 test_mkgreek(const svn_test_opts_t *opts,
-           apr_pool_t *pool)
+             apr_pool_t *pool)
 {
   svn_client_mtcc_t *mtcc;
   svn_client_ctx_t *ctx;
@@ -135,7 +135,7 @@ test_mkgreek(const svn_test_opts_t *opts
   SVN_ERR(make_greek_tree(repos_url, pool));
 
   SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
-  SVN_ERR(svn_client_mtcc_create(&mtcc, repos_url, 2, ctx, pool, pool));
+  SVN_ERR(svn_client_mtcc_create(&mtcc, repos_url, 1, ctx, pool, pool));
 
   SVN_ERR(svn_client_mtcc_add_copy("A", 1, "greek_A", mtcc, pool));
 
@@ -144,6 +144,35 @@ test_mkgreek(const svn_test_opts_t *opts
   return SVN_NO_ERROR;
 }
 
+static svn_error_t *
+test_swap(const svn_test_opts_t *opts,
+          apr_pool_t *pool)
+{
+ svn_client_mtcc_t *mtcc;
+  svn_client_ctx_t *ctx;
+  const char *repos_abspath;
+  const char *repos_url;
+  svn_repos_t* repos;
+
+  repos_abspath = svn_test_data_path("mtcc-swap", pool);
+  SVN_ERR(svn_dirent_get_absolute(&repos_abspath, repos_abspath, pool));
+  SVN_ERR(svn_uri_get_file_url_from_dirent(&repos_url, repos_abspath, pool));
+  SVN_ERR(svn_test__create_repos(&repos, repos_abspath, opts, pool));
+
+  SVN_ERR(make_greek_tree(repos_url, pool));
+
+  SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
+  SVN_ERR(svn_client_mtcc_create(&mtcc, repos_url, 1, ctx, pool, pool));
+
+  SVN_ERR(svn_client_mtcc_add_move("A/B", "B", mtcc, pool));
+  SVN_ERR(svn_client_mtcc_add_move("A/D", "A/B", mtcc, pool));
+  SVN_ERR(svn_client_mtcc_add_copy("A/B", 1, "A/D", mtcc, pool));
+
+  SVN_ERR(verify_mtcc_commit(mtcc, pool));
+
+  return SVN_NO_ERROR;
+}
+
 
 /* ========================================================================== */
 
@@ -157,6 +186,8 @@ struct svn_test_descriptor_t test_funcs[
                        "test mtcc mkdir"),
     SVN_TEST_OPTS_PASS(test_mkgreek,
                        "test making greek tree"),
+    SVN_TEST_OPTS_PASS(test_swap,
+                       "swapping some trees"),
     SVN_TEST_NULL
   };