Author: rhuijben
Date: Sat Feb 14 22:19:43 2015
New Revision: 1659863
URL: http://svn.apache.org/r1659863
Log:
Fill in the repository root in the commit info when creating it, instead of
relying of a fixup that calls back into the ra layer from an ra layer
callback.
* subversion/libsvn_ra/ra_loader.c
(ccw_baton,
commit_callback_wrapper,
remap_commit_callback): Move to libsvn_ra_local/ra_plugin.
(svn_ra_get_commit_editor3,
svn_ra__get_commit_ev2): Remove unneeded call.
* subversion/libsvn_ra_local/ra_plugin.c
(ccw_baton,
commit_callback_wrapper,
remap_commit_callback): Move here.
(svn_ra_local__get_commit_editor,
svn_ra_local__get_commit_ev2): Add call to remap_commit_callback.
* subversion/libsvn_ra_serf/merge.c
(svn_ra_serf__run_merge): Set repository root.
* subversion/libsvn_ra_svn/client.c
(ra_svn_end_commit): Set repository root.
* subversion/libsvn_repos/commit.c
(invoke_commit_cb): Document that we don't set repository root.
Modified:
subversion/trunk/subversion/libsvn_ra/ra_loader.c
subversion/trunk/subversion/libsvn_ra_local/ra_plugin.c
subversion/trunk/subversion/libsvn_ra_serf/merge.c
subversion/trunk/subversion/libsvn_ra_svn/client.c
subversion/trunk/subversion/libsvn_repos/commit.c
Modified: subversion/trunk/subversion/libsvn_ra/ra_loader.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra/ra_loader.c?rev=1659863&r1=1659862&r2=1659863&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra/ra_loader.c (original)
+++ subversion/trunk/subversion/libsvn_ra/ra_loader.c Sat Feb 14 22:19:43 2015
@@ -587,61 +587,6 @@ svn_error_t *svn_ra_rev_prop(svn_ra_sess
return session->vtable->rev_prop(session, rev, name, value, pool);
}
-struct ccw_baton
-{
- svn_commit_callback2_t original_callback;
- void *original_baton;
-
- svn_ra_session_t *session;
-};
-
-/* Wrapper which populates the repos_root field of the commit_info struct */
-static svn_error_t *
-commit_callback_wrapper(const svn_commit_info_t *commit_info,
- void *baton,
- apr_pool_t *pool)
-{
- struct ccw_baton *ccwb = baton;
- svn_commit_info_t *ci = svn_commit_info_dup(commit_info, pool);
-
- SVN_ERR(svn_ra_get_repos_root2(ccwb->session, &ci->repos_root, pool));
-
- return ccwb->original_callback(ci, ccwb->original_baton, pool);
-}
-
-
-/* Some RA layers do not correctly fill in REPOS_ROOT in commit_info, or
- they are third-party layers conforming to an older commit_info structure.
- Interpose a utility function to ensure the field is valid. */
-static void
-remap_commit_callback(svn_commit_callback2_t *callback,
- void **callback_baton,
- svn_ra_session_t *session,
- svn_commit_callback2_t original_callback,
- void *original_baton,
- apr_pool_t *result_pool)
-{
- if (original_callback == NULL)
- {
- *callback = NULL;
- *callback_baton = NULL;
- }
- else
- {
- /* Allocate this in RESULT_POOL, since the callback will be called
- long after this function has returned. */
- struct ccw_baton *ccwb = apr_palloc(result_pool, sizeof(*ccwb));
-
- ccwb->session = session;
- ccwb->original_callback = original_callback;
- ccwb->original_baton = original_baton;
-
- *callback = commit_callback_wrapper;
- *callback_baton = ccwb;
- }
-}
-
-
svn_error_t *svn_ra_get_commit_editor3(svn_ra_session_t *session,
const svn_delta_editor_t **editor,
void **edit_baton,
@@ -652,10 +597,6 @@ svn_error_t *svn_ra_get_commit_editor3(s
svn_boolean_t keep_locks,
apr_pool_t *pool)
{
- remap_commit_callback(&commit_callback, &commit_baton,
- session, commit_callback, commit_baton,
- pool);
-
return session->vtable->get_commit_editor(session, editor, edit_baton,
revprop_table,
commit_callback, commit_baton,
@@ -1395,11 +1336,6 @@ svn_ra__get_commit_ev2(svn_editor_t **ed
/* The specific RA layer does not have an implementation. Use our
default shim over the normal commit editor. */
- /* Remap for RA layers exposing Ev1. */
- remap_commit_callback(&commit_callback, &commit_baton,
- session, commit_callback, commit_baton,
- result_pool);
-
return svn_error_trace(svn_ra__use_commit_shim(
editor,
session,
Modified: subversion/trunk/subversion/libsvn_ra_local/ra_plugin.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_local/ra_plugin.c?rev=1659863&r1=1659862&r2=1659863&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_local/ra_plugin.c (original)
+++ subversion/trunk/subversion/libsvn_ra_local/ra_plugin.c Sat Feb 14 22:19:43
2015
@@ -791,6 +791,61 @@ svn_ra_local__rev_prop(svn_ra_session_t
NULL, NULL, pool);
}
+struct ccw_baton
+{
+ svn_commit_callback2_t original_callback;
+ void *original_baton;
+
+ svn_ra_session_t *session;
+};
+
+/* Wrapper which populates the repos_root field of the commit_info struct */
+static svn_error_t *
+commit_callback_wrapper(const svn_commit_info_t *commit_info,
+ void *baton,
+ apr_pool_t *pool)
+{
+ struct ccw_baton *ccwb = baton;
+ svn_commit_info_t *ci = svn_commit_info_dup(commit_info, pool);
+
+ /* On RA-local it is safe to get this value in a callback :-) */
+ SVN_ERR(svn_ra_get_repos_root2(ccwb->session, &ci->repos_root, pool));
+
+ return ccwb->original_callback(ci, ccwb->original_baton, pool);
+}
+
+
+/* The repository layer does not correctly fill in REPOS_ROOT in
+ commit_info, as it doesn't know the url that is used to access
+ it. This hooks the callback to fill in the missing pieces. */
+static void
+remap_commit_callback(svn_commit_callback2_t *callback,
+ void **callback_baton,
+ svn_ra_session_t *session,
+ svn_commit_callback2_t original_callback,
+ void *original_baton,
+ apr_pool_t *result_pool)
+{
+ if (original_callback == NULL)
+ {
+ *callback = NULL;
+ *callback_baton = NULL;
+ }
+ else
+ {
+ /* Allocate this in RESULT_POOL, since the callback will be called
+ long after this function has returned. */
+ struct ccw_baton *ccwb = apr_palloc(result_pool, sizeof(*ccwb));
+
+ ccwb->session = session;
+ ccwb->original_callback = original_callback;
+ ccwb->original_baton = original_baton;
+
+ *callback = commit_callback_wrapper;
+ *callback_baton = ccwb;
+ }
+}
+
static svn_error_t *
svn_ra_local__get_commit_editor(svn_ra_session_t *session,
const svn_delta_editor_t **editor,
@@ -805,6 +860,10 @@ svn_ra_local__get_commit_editor(svn_ra_s
svn_ra_local__session_baton_t *sess = session->priv;
struct deltify_etc_baton *deb = apr_palloc(pool, sizeof(*deb));
+ /* Set repos_root_url in commit info */
+ remap_commit_callback(&callback, &callback_baton, session,
+ callback, callback_baton, pool);
+
/* Prepare the baton for deltify_etc() */
deb->fs = sess->fs;
deb->repos = sess->repos;
@@ -1694,6 +1753,9 @@ svn_ra_local__get_commit_ev2(svn_editor_
svn_ra_local__session_baton_t *sess = session->priv;
struct deltify_etc_baton *deb = apr_palloc(result_pool, sizeof(*deb));
+ remap_commit_callback(&commit_cb, &commit_baton, session,
+ commit_cb, commit_baton, result_pool);
+
/* NOTE: the RA callbacks are ignored. We pass everything directly to
the REPOS editor. */
Modified: subversion/trunk/subversion/libsvn_ra_serf/merge.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/merge.c?rev=1659863&r1=1659862&r2=1659863&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/merge.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/merge.c Sat Feb 14 22:19:43 2015
@@ -447,5 +447,8 @@ svn_ra_serf__run_merge(const svn_commit_
"a new revision"));
}
+ merge_ctx->commit_info->repos_root = apr_pstrdup(result_pool,
+ session->repos_root_str);
+
return SVN_NO_ERROR;
}
Modified: subversion/trunk/subversion/libsvn_ra_svn/client.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_svn/client.c?rev=1659863&r1=1659862&r2=1659863&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_svn/client.c (original)
+++ subversion/trunk/subversion/libsvn_ra_svn/client.c Sat Feb 14 22:19:43 2015
@@ -1073,6 +1073,9 @@ static svn_error_t *ra_svn_end_commit(vo
&(commit_info->author),
&(commit_info->post_commit_err)));
+ commit_info->repos_root = apr_pstrdup(ccb->pool,
+ ccb->sess_baton->conn->repos_root);
+
if (ccb->callback)
SVN_ERR(ccb->callback(commit_info, ccb->callback_baton, ccb->pool));
Modified: subversion/trunk/subversion/libsvn_repos/commit.c
URL:
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/commit.c?rev=1659863&r1=1659862&r2=1659863&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/commit.c (original)
+++ subversion/trunk/subversion/libsvn_repos/commit.c Sat Feb 14 22:19:43 2015
@@ -201,6 +201,7 @@ invoke_commit_cb(svn_commit_callback2_t
commit_info->date = date ? date->data : NULL;
commit_info->author = author ? author->data : NULL;
commit_info->post_commit_err = post_commit_errstr;
+ /* commit_info->repos_root = NULL; ### Fixed up in ra-local handling */
return svn_error_trace(commit_cb(commit_info, commit_baton, scratch_pool));
}