On Fri, Sep 4, 2026 at 5:58 PM <[email protected]> wrote:
Author: rinrab
Date: Fri Sep 4 15:57:28 2026
New Revision: 1937873
Log:
Add tests on the compat RA API (svn_ra_plugin_t) and fix a
few crashes in
open_session that were making it completely unusable.
* subversion/libsvn_ra/wrapper_template.h
(compat_open): Add scratch_pool and check that session_url
is not NULL.
* subversion/tests/libsvn_ra/ra-test.c
(#includes): Rearrange includes to shut the deprecation
warnings up.
(test_compat_vtable): New test.
(test_funcs): Run the test.
Modified:
subversion/trunk/subversion/libsvn_ra/wrapper_template.h
subversion/trunk/subversion/tests/libsvn_ra/ra-test.c
Modified:
subversion/trunk/subversion/libsvn_ra/wrapper_template.h
==============================================================================
--- subversion/trunk/subversion/libsvn_ra/wrapper_template.h
Fri Sep 4 15:54:51 2026 (r1937872)
+++ subversion/trunk/subversion/libsvn_ra/wrapper_template.h
Fri Sep 4 15:57:28 2026 (r1937873)
@@ -71,7 +71,12 @@ static svn_error_t *compat_open(void **s
* the alternative (creating a new ra_util library) would
be massive
* overkill for the time being. Just be sure to keep the
following
* line and the code of svn_ra_create_callbacks in sync. */
+
+ /* Some RA modules (libsvn_ra_serf) want this exact pool
configuration and
+ * refuse to work with the same pool as both scratch_pool
and result_pool. */
apr_pool_t *sesspool = svn_pool_create(pool);
+ apr_pool_t *scratch_pool = svn_pool_create(sesspool);
+
svn_ra_callbacks2_t *callbacks2 = apr_pcalloc(sesspool,
sizeof(*callbacks2));
@@ -93,9 +98,11 @@ static svn_error_t *compat_open(void **s
SVN_ERR(VTBL.open_session(sess, &session_url, NULL, repos_URL,
callbacks2, callback_baton,
callbacks ?
callbacks->auth_baton : NULL,
- config, sesspool, sesspool));
+ config, sesspool, scratch_pool));
+
+ svn_pool_destroy(scratch_pool);
- if (strcmp(repos_URL, session_url) != 0)
+ if (session_url && strcmp(repos_URL, session_url) != 0)
{
svn_pool_destroy(sesspool);
return
svn_error_createf(SVN_ERR_RA_SESSION_URL_MISMATCH, NULL,
Modified: subversion/trunk/subversion/tests/libsvn_ra/ra-test.c
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_ra/ra-test.c
Fri Sep 4 15:54:51 2026 (r1937872)
+++ subversion/trunk/subversion/tests/libsvn_ra/ra-test.c
Fri Sep 4 15:57:28 2026 (r1937873)
@@ -23,6 +23,9 @@
+#include "../svn_test.h"
+#include "../svn_test_fs.h"
+
#include <apr_general.h>
#include <apr_pools.h>
#include <apr_file_io.h>
@@ -37,8 +40,6 @@
#include "svn_dirent_uri.h"
#include "svn_hash.h"
-#include "../svn_test.h"
-#include "../svn_test_fs.h"
#include "../../libsvn_ra_local/ra_local.h"
/*-------------------------------------------------------------------*/
@@ -1914,6 +1915,49 @@ test_get_deleted_rev_errors(const svn_te
return SVN_NO_ERROR;
}
+static svn_error_t *
+test_compat_vtable(const svn_test_opts_t *opts,
+ apr_pool_t *pool)
+{
+ svn_ra_plugin_t *lib;
+ void *ra_baton, *session_baton, *edit_baton, *root_baton,
*dir_baton;
+ const svn_delta_editor_t *editor;
+ const char *url;
+ svn_ra_callbacks_t cbtable = { 0 };
+
+ SVN_ERR(svn_test__create_repos2(NULL, &url, NULL,
"test_compat_vtable", opts,
+ pool, pool));
+ SVN_ERR(svn_ra_initialize(pool));
+
+ SVN_ERR(svn_ra_init_ra_libs(&ra_baton, pool));
+ SVN_ERR(svn_ra_get_ra_library(&lib, ra_baton, url, pool));
+
+ SVN_ERR(svn_test__init_auth_baton(&cbtable.auth_baton, pool));
+ SVN_ERR(lib->open(&session_baton, url, &cbtable, NULL,
NULL, pool));
+
+ /* mkdir A */
+ SVN_ERR(lib->get_commit_editor(session_baton, &editor,
&edit_baton,
+ "r1", NULL, NULL, pool));
+ SVN_ERR(editor->open_root(edit_baton, SVN_INVALID_REVNUM,
+ pool, &root_baton));
+ SVN_ERR(editor->add_directory("A", root_baton, NULL,
SVN_INVALID_REVNUM,
+ pool, &dir_baton));
+ SVN_ERR(editor->close_directory(dir_baton, pool));
+ SVN_ERR(editor->close_directory(root_baton, pool));
+ SVN_ERR(editor->close_edit(edit_baton, pool));
+
+ /* delete A */
+ SVN_ERR(lib->get_commit_editor(session_baton, &editor,
&edit_baton,
+ "r2", NULL, NULL, pool));
+ SVN_ERR(editor->open_root(edit_baton, SVN_INVALID_REVNUM,
+ pool, &root_baton));
+ SVN_ERR(editor->delete_entry("A", SVN_INVALID_REVNUM,
root_baton, pool));
+ SVN_ERR(editor->close_directory(root_baton, pool));
+ SVN_ERR(editor->close_edit(edit_baton, pool));
+
+ return SVN_NO_ERROR;
+}
+
/* The test table. */
@@ -1954,6 +1998,8 @@ static struct svn_test_descriptor_t test
"test get-deleted-rev no delete"),
SVN_TEST_OPTS_PASS(test_get_deleted_rev_errors,
"test get-deleted-rev errors"),
+ SVN_TEST_OPTS_PASS(test_compat_vtable,
+ "test compat svn_ra_plugin_t"),
SVN_TEST_NULL
};
I discovered that the API we provide for backward compatibility
hasn't been working for quite some time (I believe r1873487/1.14
was the revision it was first broken, maybe even earlier). I
don't think anyone should still be using this code. So does
anyone still test it.
The answer is probably we don't. Plus it seems wasteful to
remember to update this wrapper any time something changes. I
think, since it's no longer a compatibility promise, why spend
time maintaining this code at all. This API has been deprecated
since 1.1 and nobody is using it.
I propose we remove it and make svn_ra_get_ra_library & friends
return an error so that we atleast keep it technically binary
compatible. Alternatively, we could remove the symbols alongside
the svn_ra_plugin_t entirely, but it's probably more towards 2.0.