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