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.

-- 
Timofei Zhakov

Reply via email to