On 4. 9. 2026 18:22, Timofei Zhakov wrote:
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.


Hmm. While I agree in principle that maintaining unused APIs is a burden, our compatibility promises are quite strict. Removing a 1.0 API, even if it was deprecated in 1.1, is a no-go. I'd prefer if we could come up with a way, even if only in maintainer mode, to verify that the backwards compatibility shims are up to date.

-- Brane

Reply via email to