Author: rinrab
Date: Fri Sep 18 12:45:34 2026
New Revision: 1938346

Log:
On the 'reparentless' branch: Implement a few easy operations with full
repository path instead of session URL-rooted paths.

Not touching libsvn_ra_serf just yet because some aspects of it are not obvious
and it's better we keep it aside and finish it up later. Right now the first
priority is to do all the methods - so that they at least work locally.

* subversion/include/svn_ra.h
  (svn_ra_get_file2,
   svn_ra_list2,
   svn_ra_get_locations2,
   svn_ra_get_location_segments2,
   svn_ra_get_file_revs3,
   svn_ra_get_lock2,
   svn_ra_get_locks3,
   svn_ra_get_deleted_rev2,
   svn_ra_get_inherited_props2,
   svn_ra_fetch_file_contents2): Bump version, add repos_relpath, and update
   description.
  (svn_ra_get_file,
   svn_ra_list,
   svn_ra_get_locations,
   svn_ra_get_location_segments,
   svn_ra_get_file_revs2,
   svn_ra_get_lock,
   svn_ra_get_locks2,
   svn_ra_get_deleted_rev,
   svn_ra_get_inherited_props,
   svn_ra_fetch_file_contents): Deprecate.
* subversion/libsvn_ra/deprecated.c
  (svn_ra_get_file,
   svn_ra_list,
   svn_ra_get_locations,
   svn_ra_get_location_segments,
   svn_ra_get_file_revs2,
   svn_ra_get_lock,
   svn_ra_get_locks2,
   svn_ra_get_deleted_rev,
   svn_ra_get_inherited_props,
   svn_ra_fetch_file_contents): Implement compat func.
* subversion/libsvn_ra/ra_loader.c
  (svn_ra_get_file2,
   svn_ra_list2,
   svn_ra_get_locations2,
   svn_ra_get_location_segments2,
   svn_ra_get_file_revs3,
   svn_ra_get_lock2,
   svn_ra_get_locks3,
   svn_ra_get_deleted_rev2,
   svn_ra_get_inherited_props2,
   svn_ra_fetch_file_contents2): Add repos_relpath.
  (svn_ra_get_locations2,
   svn_ra_get_location_segments2,
   svn_ra_get_file_revs3): Comment-down compat code.
* subversion/libsvn_ra/ra_loader.h,
  (svn_ra__vtable_t::get_commit_editor,
   svn_ra__vtable_t::get_file,
   svn_ra__vtable_t::list,
   svn_ra__vtable_t::get_locations,
   svn_ra__vtable_t::get_location_segments,
   svn_ra__vtable_t::get_file_revs,
   svn_ra__vtable_t::get_lock,
   svn_ra__vtable_t::get_locks,
   svn_ra__vtable_t::get_deleted_rev,
   svn_ra__vtable_t::get_inherited_props,
   svn_ra__vtable_t::fetch_file_contents): Add repos_relpath.
* subversion/libsvn_ra_local/ra_plugin.c,
  (svn_ra_local__get_commit_editor,
   svn_ra_local__get_file,
   svn_ra_local__list,
   svn_ra_local__get_locations,
   svn_ra_local__get_location_segments,
   svn_ra_local__get_file_revs,
   svn_ra_local__get_lock,
   svn_ra_local__get_locks,
   svn_ra_local__get_deleted_rev,
   svn_ra_local__get_inherited_props,
   svn_ra_local__fetch_file_contents): Add repos_relpath.
* subversion/libsvn_ra_svn/client.c
  (ra_svn_get_commit_editor,
   ra_svn_get_file,
   ra_svn_list,
   ra_svn_get_locations,
   ra_svn_get_location_segments,
   ra_svn_get_file_revs,
   ra_svn_get_lock,
   ra_svn_get_locks,
   ra_svn_get_deleted_rev,
   ra_svn_get_inherited_props,
   ra_svn_fetch_file_contents): Add repos_relpath.

Modified:
   subversion/branches/reparentless/subversion/include/svn_ra.h
   subversion/branches/reparentless/subversion/libsvn_ra/deprecated.c
   subversion/branches/reparentless/subversion/libsvn_ra/ra_loader.c
   subversion/branches/reparentless/subversion/libsvn_ra/ra_loader.h
   subversion/branches/reparentless/subversion/libsvn_ra_local/ra_plugin.c
   subversion/branches/reparentless/subversion/libsvn_ra_svn/client.c

Modified: subversion/branches/reparentless/subversion/include/svn_ra.h
==============================================================================
--- subversion/branches/reparentless/subversion/include/svn_ra.h        Fri Sep 
18 12:45:05 2026        (r1938345)
+++ subversion/branches/reparentless/subversion/include/svn_ra.h        Fri Sep 
18 12:45:34 2026        (r1938346)
@@ -1089,10 +1089,10 @@ svn_ra_get_commit_editor(svn_ra_session_
                          apr_pool_t *pool);
 
 /**
- * Fetch the contents and properties of file @a path at @a revision.
+ * Fetch the contents and properties of file @a repos_relpath at @a revision.
  * @a revision may be SVN_INVALID_REVNUM, indicating that the HEAD
- * revision should be used.  Interpret @a path relative to the URL in
- * @a session.  Use @a pool for all allocations.
+ * revision should be used.  Interpret @a repos_relpath relative to the
+ * repository root in.  Use @a pool for all allocations.
  *
  * If @a revision is @c SVN_INVALID_REVNUM and @a fetched_rev is not
  * @c NULL, then set @a *fetched_rev to the actual revision that was
@@ -1111,7 +1111,22 @@ svn_ra_get_commit_editor(svn_ra_session_
  * The stream handlers for @a stream may not perform any RA
  * operations using @a session.
  *
+ * @since New in 1.16.
+ */
+svn_error_t *
+svn_ra_get_file2(svn_ra_session_t *session,
+                 const char *repos_relpath,
+                 svn_revnum_t revision,
+                 svn_stream_t *stream,
+                 svn_revnum_t *fetched_rev,
+                 apr_hash_t **props,
+                 apr_pool_t *pool);
+
+/**
+ * Similar to @c svn_ra_get_file2, but @a path is relative to session URL.
+ *
  * @since New in 1.2.
+ * @deprecated Provided for compatibility with the 1.15 API.
  */
 svn_error_t *
 svn_ra_get_file(svn_ra_session_t *session,
@@ -1216,12 +1231,12 @@ typedef svn_error_t *(* svn_ra_dirent_re
  * Efficiently list everything within a sub-tree.  Specify a glob pattern
  * to search for specific files and folders.
  *
- * In @a session, walk the sub-tree starting at @a path at @a revision down
- * to the given @a depth.  For each directory entry found, @a receiver will
- * be called with @a receiver_baton.  The starting @a path will be reported
- * as well.  Because retrieving elements of a #svn_dirent_t can be
- * expensive, you need to select them individually via flags set in
- * @a dirent_fields.
+ * In @a session, walk the sub-tree starting at @a repos_relpath at @a revision
+ * down to the given @a depth.  For each directory entry found, @a receiver
+ * will be called with @a receiver_baton.  The starting @a repos_relpath will
+ * be reported as well.  Because retrieving elements of a #svn_dirent_t can be
+ * expensive, you need to select them individually via flags set in @a
+ * dirent_fields.
  *
  * @a patterns is an optional array of <tt>const char *</tt>.  If it is
  * not @c NULL, only those directory entries will be reported whose last
@@ -1229,7 +1244,7 @@ typedef svn_error_t *(* svn_ra_dirent_re
  * apr_fnmatch() for glob matching and requiring '.' to matched by dots
  * in the path.
  *
- * @a path must point to a directory and @a depth must be at least
+ * @a repos_relpath must point to a directory and @a depth must be at least
  * #svn_depth_empty.
  *
  * If the server doesn't support the 'list' command, return
@@ -1238,7 +1253,24 @@ typedef svn_error_t *(* svn_ra_dirent_re
  *
  * Use @a scratch_pool for temporary memory allocation.
  *
- * @since New in 1.10.
+ * @since New in 1.16.
+ */
+svn_error_t *
+svn_ra_list2(svn_ra_session_t *session,
+             const char *repos_relpath,
+             svn_revnum_t revision,
+             const apr_array_header_t *patterns,
+             svn_depth_t depth,
+             apr_uint32_t dirent_fields,
+             svn_ra_dirent_receiver_t receiver,
+             void *receiver_baton,
+             apr_pool_t *scratch_pool);
+
+/**
+ * Similar to @c svn_ra_get_file2, but @a path is relative to session URL.
+ *
+ * @since New in 1.2.
+ * @deprecated Provided for compatibility with the 1.15 API.
  */
 svn_error_t *
 svn_ra_list(svn_ra_session_t *session,
@@ -1961,9 +1993,9 @@ svn_ra_get_repos_root(svn_ra_session_t *
 
 /**
  * Set @a *locations to the locations (at the repository revisions
- * @a location_revisions) of the file identified by @a path in
+ * @a location_revisions) of the file identified by @a repos_relpath in
  * @a peg_revision (passing @c SVN_INVALID_REVNUM is an error).
- * @a path is relative to the URL to which @a session was opened.
+ * @a repos_relpath is relative repository root.
  * @a location_revisions is an array of @c svn_revnum_t's.
  * @a *locations will be a mapping from the revisions to
  * their appropriate absolute paths.  If the file doesn't exist in a
@@ -1971,7 +2003,21 @@ svn_ra_get_repos_root(svn_ra_session_t *
  *
  * Use @a pool for all allocations.
  *
+ * @since New in 1.16.
+ */
+svn_error_t *
+svn_ra_get_locations2(svn_ra_session_t *session,
+                      apr_hash_t **locations,
+                      const char *path,
+                      svn_revnum_t peg_revision,
+                      const apr_array_header_t *location_revisions,
+                      apr_pool_t *pool);
+
+/**
+ * Similar to @c svn_ra_get_locations2, but @a path is relative to session URL.
+ *
  * @since New in 1.2.
+ * @deprecated Provided for compatibility with the 1.15 API.
  */
 svn_error_t *
 svn_ra_get_locations(svn_ra_session_t *session,
@@ -1984,8 +2030,8 @@ svn_ra_get_locations(svn_ra_session_t *s
 
 /**
  * Call @a receiver (with @a receiver_baton) for each segment in the
- * location history of @a path in @a peg_revision, working backwards in
- * time from @a start_rev to @a end_rev.
+ * location history of @a repos_relpath in @a peg_revision, working backwards
+ * in time from @a start_rev to @a end_rev.
  *
  * @a end_rev may be @c SVN_INVALID_REVNUM to indicate that you want
  * to trace the history of the object to its origin.
@@ -1999,7 +2045,24 @@ svn_ra_get_locations(svn_ra_session_t *s
  *
  * Use @a pool for all allocations.
  *
+ * @since New in 1.16.
+ */
+svn_error_t *
+svn_ra_get_location_segments2(svn_ra_session_t *session,
+                              const char *repos_relpath,
+                              svn_revnum_t peg_revision,
+                              svn_revnum_t start_rev,
+                              svn_revnum_t end_rev,
+                              svn_location_segment_receiver_t receiver,
+                              void *receiver_baton,
+                              apr_pool_t *pool);
+
+/**
+ * Similar to @c svn_ra_get_location_segments2, but @a path is relative to
+ * session URL.
+ *
  * @since New in 1.5.
+ * @deprecated Provided for compatibility with the 1.15 API.
  */
 svn_error_t *
 svn_ra_get_location_segments(svn_ra_session_t *session,
@@ -2012,7 +2075,7 @@ svn_ra_get_location_segments(svn_ra_sess
                              apr_pool_t *pool);
 
 /**
- * Retrieve a subset of the interesting revisions of a file @a path
+ * Retrieve a subset of the interesting revisions of a file @a repos_relpath
  * as seen in revision @a end (see svn_fs_history_prev() for a
  * definition of "interesting revisions").  Invoke @a handler with
  * @a handler_baton as its first argument for each such revision.
@@ -2051,6 +2114,22 @@ svn_ra_get_location_segments(svn_ra_sess
  * @since New in 1.5.
  */
 svn_error_t *
+svn_ra_get_file_revs3(svn_ra_session_t *session,
+                      const char *repos_relpath,
+                      svn_revnum_t start,
+                      svn_revnum_t end,
+                      svn_boolean_t include_merged_revisions,
+                      svn_file_rev_handler_t handler,
+                      void *handler_baton,
+                      apr_pool_t *pool);
+
+/**
+ * Similar to @c svn_ra_get_file_revs3, but @a path is relative to session URL.
+ *
+ * @since New in 1.5.
+ * @deprecated Provided for compatibility with the 1.15 API.
+ */
+svn_error_t *
 svn_ra_get_file_revs2(svn_ra_session_t *session,
                       const char *path,
                       svn_revnum_t start,
@@ -2150,15 +2229,28 @@ svn_ra_unlock(svn_ra_session_t *session,
               apr_pool_t *pool);
 
 /**
- * If @a path is locked, set @a *lock to an svn_lock_t which
+ * If @a repos_relpath is locked, set @a *lock to an svn_lock_t which
  * represents the lock, allocated in @a pool.
  *
- * If @a path is not locked or does not exist in HEAD, set @a *lock to NULL.
+ * If @a repos_relpath is not locked or does not exist in HEAD, set @a *lock to
+ * NULL.
  *
  * @note Before 1.9, this function could return SVN_ERR_FS_NOT_FOUND
- * when @a path didn't exist in HEAD on specific ra layers.
+ * when @a repos_relpath didn't exist in HEAD on specific ra layers.
+ *
+ * @since New in 1.16.
+ */
+svn_error_t *
+svn_ra_get_lock2(svn_ra_session_t *session,
+                 svn_lock_t **lock,
+                 const char *path,
+                 apr_pool_t *pool);
+
+/**
+ * Similar to @c svn_ra_get_lock, but @a path is relative to session URL.
  *
  * @since New in 1.2.
+ * @deprecated Provided for compatibility with the 1.15 API.
  */
 svn_error_t *
 svn_ra_get_lock(svn_ra_session_t *session,
@@ -2168,10 +2260,10 @@ svn_ra_get_lock(svn_ra_session_t *sessio
 
 /**
  * Set @a *locks to a hashtable which represents all locks on or
- * below @a path.
+ * below @a repos_relpath.
  *
  * @a depth limits the returned locks to those associated with paths
- * within the specified depth of @a path, and must be one of the
+ * within the specified depth of @a repos_relpath, and must be one of the
  * following values:  #svn_depth_empty, #svn_depth_files,
  * #svn_depth_immediates, or #svn_depth_infinity.
  *
@@ -2189,6 +2281,19 @@ svn_ra_get_lock(svn_ra_session_t *sessio
  * @since New in 1.7.
  */
 svn_error_t *
+svn_ra_get_locks3(svn_ra_session_t *session,
+                  apr_hash_t **locks,
+                  const char *repos_relpath,
+                  svn_depth_t depth,
+                  apr_pool_t *pool);
+
+/**
+ * Similar to @c svn_ra_get_file2, but @a path is relative to session URL.
+ *
+ * @since New in 1.2.
+ * @deprecated Provided for compatibility with the 1.15 API.
+ */
+svn_error_t *
 svn_ra_get_locks2(svn_ra_session_t *session,
                   apr_hash_t **locks,
                   const char *path,
@@ -2276,19 +2381,35 @@ svn_ra_replay(svn_ra_session_t *session,
               apr_pool_t *pool);
 
 /**
- * Given @a path at revision @a peg_revision, set @a *revision_deleted to the
- * revision @a path was first deleted, within the inclusive revision range
- * defined by @a peg_revision and @a end_revision.  @a path is relative
- * to the URL in @a session.
- *
- * If @a path does not exist at @a peg_revision or was not deleted within
- * the specified range, then set @a *revision_deleted to @c SVN_INVALID_REVNUM.
- * If @a peg_revision or @a end_revision are invalid or if @a peg_revision is
- * greater than @a end_revision, then return @c SVN_ERR_CLIENT_BAD_REVISION.
+ * Given @a repos_relpath at revision @a peg_revision, set @a *revision_deleted
+ * to the revision @a repos_relpath was first deleted, within the inclusive
+ * revision range defined by @a peg_revision and @a end_revision.  @a path is
+ * relative to the repository root.
+ *
+ * If @a repos_relpath does not exist at @a peg_revision or was not deleted
+ * within the specified range, then set @a *revision_deleted to @c
+ * SVN_INVALID_REVNUM. If @a peg_revision or @a end_revision are invalid or if
+ * @a peg_revision is greater than @a end_revision, then return @c
+ * SVN_ERR_CLIENT_BAD_REVISION.
  *
  * Use @a pool for all allocations.
  *
+ * @since New in 1.16.
+ */
+svn_error_t *
+svn_ra_get_deleted_rev2(svn_ra_session_t *session,
+                        const char *repos_relpath,
+                        svn_revnum_t peg_revision,
+                        svn_revnum_t end_revision,
+                        svn_revnum_t *revision_deleted,
+                        apr_pool_t *pool);
+
+/**
+ * Similar to @c svn_ra_get_deleted_rev2, but @a path is relative to session
+ * URL.
+ *
  * @since New in 1.6.
+ * @deprecated Provided for compatibility with the 1.15 API.
  */
 svn_error_t *
 svn_ra_get_deleted_rev(svn_ra_session_t *session,
@@ -2301,11 +2422,10 @@ svn_ra_get_deleted_rev(svn_ra_session_t
 /**
  * Set @a *inherited_props to a depth-first ordered array of
  * #svn_prop_inherited_item_t * structures representing the properties
- * inherited by @a path at @a revision (or the 'head' revision if
- * @a revision is @c SVN_INVALID_REVNUM).  Interpret @a path relative to
- * the URL in @a session.  Use @a pool for all allocations.  If no
- * inheritable properties are found, then set @a *inherited_props to
- * an empty array.
+ * inherited by @a repos_relpath at @a revision (or the 'head' revision if
+ * @a revision is @c SVN_INVALID_REVNUM).  Interpret @a repos_relpath relative
+ * to the repository root.  Use @a pool for all allocations.  If no inheritable
+ * properties are found, then set @a *inherited_props to an empty array.
  *
  * The #svn_prop_inherited_item_t->path_or_url members of the
  * #svn_prop_inherited_item_t * structures in @a *inherited_props are
@@ -2315,7 +2435,22 @@ svn_ra_get_deleted_rev(svn_ra_session_t
  * Allocate @a *inherited_props in @a result_pool.  Use @a scratch_pool
  * for temporary allocations.
  *
+ * @since New in 1.16.
+ */
+svn_error_t *
+svn_ra_get_inherited_props2(svn_ra_session_t *session,
+                            apr_array_header_t **inherited_props,
+                            const char *repos_relpath,
+                            svn_revnum_t revision,
+                            apr_pool_t *result_pool,
+                            apr_pool_t *scratch_pool);
+
+/**
+ * Similar to @c svn_ra_get_inherited_props2, but @a path is relative to
+ * session URL.
+ *
  * @since New in 1.8.
+ * @deprecated Provided for compatibility with the 1.15 API.
  */
 svn_error_t *
 svn_ra_get_inherited_props(svn_ra_session_t *session,
@@ -2324,11 +2459,10 @@ svn_ra_get_inherited_props(svn_ra_sessio
                            svn_revnum_t revision,
                            apr_pool_t *result_pool,
                            apr_pool_t *scratch_pool);
-
 /**
- * Fetch the contents of file @a path at @a revision.  Interpret @a path
- * relative to the URL in @a session.  @a revision must be a valid revision
- * number.  Use @a scratch_pool for scratch allocations.
+ * Fetch the contents of file @a repos_relpath at @a revision.  Interpret @a
+ * repos_relpath relative to the repository root.  @a revision must be a
+ * valid revision number.  Use @a scratch_pool for scratch allocations.
  *
  * The contents of the file will be pushed to @a stream, and the stream will
  * be closed when finished.  If the closure is not desired, then you can use
@@ -2339,7 +2473,21 @@ svn_ra_get_inherited_props(svn_ra_sessio
  * endpoint, rather from any local caches such as the one provided by
  * #svn_ra_get_wc_contents_func_t.
  *
+ * @since New in 1.16.
+ */
+svn_error_t *
+svn_ra_fetch_file_contents2(svn_ra_session_t *session,
+                            const char *repos_relpath,
+                            svn_revnum_t revision,
+                            svn_stream_t *stream,
+                            apr_pool_t *scratch_pool);
+
+/**
+ * Similar to @c svn_ra_fetch_file_contents2, but @a path is relative to
+ * session URL.
+ *
  * @since New in 1.15.
+ * @deprecated Provided for compatibility with the 1.15 API.
  */
 svn_error_t *
 svn_ra_fetch_file_contents(svn_ra_session_t *session,
@@ -2347,7 +2495,6 @@ svn_ra_fetch_file_contents(svn_ra_sessio
                            svn_revnum_t revision,
                            svn_stream_t *stream,
                            apr_pool_t *scratch_pool);
-
 /**
  * @defgroup Capabilities Dynamically query the server's capabilities.
  *

Modified: subversion/branches/reparentless/subversion/libsvn_ra/deprecated.c
==============================================================================
--- subversion/branches/reparentless/subversion/libsvn_ra/deprecated.c  Fri Sep 
18 12:45:05 2026        (r1938345)
+++ subversion/branches/reparentless/subversion/libsvn_ra/deprecated.c  Fri Sep 
18 12:45:34 2026        (r1938346)
@@ -428,6 +428,72 @@ svn_error_t *svn_ra_get_file_revs(svn_ra
 }
 
 svn_error_t *
+svn_ra_get_file_revs2(svn_ra_session_t *session,
+                      const char *path,
+                      svn_revnum_t start,
+                      svn_revnum_t end,
+                      svn_boolean_t include_merged_revisions,
+                      svn_file_rev_handler_t handler,
+                      void *handler_baton,
+                      apr_pool_t *pool)
+{
+  const char *session_path;
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+
+  SVN_ERR(get_session_path(session, &session_path, pool));
+  SVN_ERR(svn_ra_get_file_revs3(session,
+                                svn_relpath_join(session_path, path, pool),
+                                start, end, include_merged_revisions, handler,
+                                handler_baton, pool));
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_get_lock(svn_ra_session_t *session,
+                svn_lock_t **lock,
+                const char *path,
+                apr_pool_t *pool)
+{
+  const char *session_path;
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+
+  SVN_ERR(get_session_path(session, &session_path, pool));
+  SVN_ERR(svn_ra_get_lock2(session, lock,
+                           svn_relpath_join(session_path, path, pool),
+                           pool));
+
+  return SVN_NO_ERROR;
+}
+
+
+svn_error_t *svn_ra_get_locks(svn_ra_session_t *session,
+                              apr_hash_t **locks,
+                              const char *path,
+                              apr_pool_t *pool)
+{
+  return svn_ra_get_locks2(session, locks, path, svn_depth_infinity, pool);
+}
+
+svn_error_t *
+svn_ra_get_locks2(svn_ra_session_t *session,
+                  apr_hash_t **locks,
+                  const char *path,
+                  svn_depth_t depth,
+                  apr_pool_t *pool)
+{
+  const char *session_path;
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+
+  SVN_ERR(get_session_path(session, &session_path, pool));
+  SVN_ERR(svn_ra_get_locks3(session, locks,
+                            svn_relpath_join(session_path, path, pool),
+                            depth, pool));
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
 svn_ra_do_update3(svn_ra_session_t *session,
                   const svn_ra_reporter3_t **reporter,
                   void **report_baton,
@@ -693,6 +759,151 @@ svn_ra_check_path(svn_ra_session_t *sess
   return SVN_NO_ERROR;
 }
 
+svn_error_t *
+svn_ra_get_file(svn_ra_session_t *session,
+                const char *path,
+                svn_revnum_t revision,
+                svn_stream_t *stream,
+                svn_revnum_t *fetched_rev,
+                apr_hash_t **props,
+                apr_pool_t *pool)
+{
+  const char *session_path;
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+
+  SVN_ERR(get_session_path(session, &session_path, pool));
+  SVN_ERR(svn_ra_get_file2(session,
+                           svn_relpath_join(session_path, path, pool),
+                           revision, stream, fetched_rev, props, pool));
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_list(svn_ra_session_t *session,
+            const char *path,
+            svn_revnum_t revision,
+            const apr_array_header_t *patterns,
+            svn_depth_t depth,
+            apr_uint32_t dirent_fields,
+            svn_ra_dirent_receiver_t receiver,
+            void *receiver_baton,
+            apr_pool_t *scratch_pool)
+{
+  const char *session_path;
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+
+  SVN_ERR(get_session_path(session, &session_path, scratch_pool));
+  SVN_ERR(svn_ra_list2(session,
+                       svn_relpath_join(session_path, path, scratch_pool),
+                       revision, patterns, depth, dirent_fields, receiver,
+                       receiver_baton, scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_get_locations(svn_ra_session_t *session,
+                     apr_hash_t **locations,
+                     const char *path,
+                     svn_revnum_t peg_revision,
+                     const apr_array_header_t *location_revisions,
+                     apr_pool_t *pool)
+{
+  const char *session_path;
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+
+  SVN_ERR(get_session_path(session, &session_path, pool));
+  SVN_ERR(svn_ra_get_locations2(session, locations,
+                                svn_relpath_join(session_path, path, pool),
+                                peg_revision, location_revisions, pool));
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_get_deleted_rev(svn_ra_session_t *session,
+                       const char *path,
+                       svn_revnum_t peg_revision,
+                       svn_revnum_t end_revision,
+                       svn_revnum_t *revision_deleted,
+                       apr_pool_t *pool)
+{
+  const char *session_path;
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+
+  SVN_ERR(get_session_path(session, &session_path, pool));
+  SVN_ERR(svn_ra_get_deleted_rev2(session,
+                                  svn_relpath_join(session_path, path, pool),
+                                  peg_revision, end_revision, revision_deleted,
+                                  pool));
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_fetch_file_contents(svn_ra_session_t *session,
+                           const char *path,
+                           svn_revnum_t revision,
+                           svn_stream_t *stream,
+                           apr_pool_t *scratch_pool)
+{
+  const char *session_path;
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+
+  SVN_ERR(get_session_path(session, &session_path, scratch_pool));
+  SVN_ERR(svn_ra_fetch_file_contents2(
+        session,
+        svn_relpath_join(session_path, path, scratch_pool),
+        revision, stream, scratch_pool));
+
+  return SVN_NO_ERROR;
+
+}
+
+
+svn_error_t *
+svn_ra_get_location_segments(svn_ra_session_t *session,
+                             const char *path,
+                             svn_revnum_t peg_revision,
+                             svn_revnum_t start_rev,
+                             svn_revnum_t end_rev,
+                             svn_location_segment_receiver_t receiver,
+                             void *receiver_baton,
+                             apr_pool_t *pool)
+{
+  const char *session_path;
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+
+  SVN_ERR(get_session_path(session, &session_path, pool));
+  SVN_ERR(svn_ra_get_location_segments2(
+      session,
+      svn_relpath_join(session_path, path, pool),
+      peg_revision, start_rev, end_rev,
+      receiver, receiver_baton, pool));
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_ra_get_inherited_props(svn_ra_session_t *session,
+                           apr_array_header_t **inherited_props,
+                           const char *path,
+                           svn_revnum_t revision,
+                           apr_pool_t *result_pool,
+                           apr_pool_t *scratch_pool)
+{
+  const char *session_path;
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+
+  SVN_ERR(get_session_path(session, &session_path, scratch_pool));
+  SVN_ERR(svn_ra_get_inherited_props2(
+      session, inherited_props,
+      svn_relpath_join(session_path, path, scratch_pool),
+      revision, result_pool, scratch_pool));
+
+  return SVN_NO_ERROR;
+}
 
 /* For each libsvn_ra_foo library, provide an implementation of deprecated
    svn_ra_foo_init function that wraps svn_ra_foo__compat_init, or returns

Modified: subversion/branches/reparentless/subversion/libsvn_ra/ra_loader.c
==============================================================================
--- subversion/branches/reparentless/subversion/libsvn_ra/ra_loader.c   Fri Sep 
18 12:45:05 2026        (r1938345)
+++ subversion/branches/reparentless/subversion/libsvn_ra/ra_loader.c   Fri Sep 
18 12:45:34 2026        (r1938346)
@@ -621,16 +621,16 @@ svn_error_t *svn_ra_get_commit_editor4(s
                                             lock_tokens, keep_locks, pool);
 }
 
-svn_error_t *svn_ra_get_file(svn_ra_session_t *session,
-                             const char *path,
-                             svn_revnum_t revision,
-                             svn_stream_t *stream,
-                             svn_revnum_t *fetched_rev,
-                             apr_hash_t **props,
-                             apr_pool_t *pool)
+svn_error_t *svn_ra_get_file2(svn_ra_session_t *session,
+                              const char *repos_relpath,
+                              svn_revnum_t revision,
+                              svn_stream_t *stream,
+                              svn_revnum_t *fetched_rev,
+                              apr_hash_t **props,
+                              apr_pool_t *pool)
 {
-  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
-  return session->vtable->get_file(session, path, revision, stream,
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(repos_relpath));
+  return session->vtable->get_file(session, repos_relpath, revision, stream,
                                    fetched_rev, props, pool);
 }
 
@@ -651,25 +651,25 @@ svn_ra_get_dir3(svn_ra_session_t *sessio
 }
 
 svn_error_t *
-svn_ra_list(svn_ra_session_t *session,
-            const char *path,
-            svn_revnum_t revision,
-            const apr_array_header_t *patterns,
-            svn_depth_t depth,
-            apr_uint32_t dirent_fields,
-            svn_ra_dirent_receiver_t receiver,
-            void *receiver_baton,
-            apr_pool_t *scratch_pool)
+svn_ra_list2(svn_ra_session_t *session,
+             const char *repos_relpath,
+             svn_revnum_t revision,
+             const apr_array_header_t *patterns,
+             svn_depth_t depth,
+             apr_uint32_t dirent_fields,
+             svn_ra_dirent_receiver_t receiver,
+             void *receiver_baton,
+             apr_pool_t *scratch_pool)
 {
-  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(repos_relpath));
   if (!session->vtable->list)
     return svn_error_create(SVN_ERR_UNSUPPORTED_FEATURE, NULL, NULL);
 
   SVN_ERR(svn_ra__assert_capable_server(session, SVN_RA_CAPABILITY_LIST,
                                         NULL, scratch_pool));
 
-  return session->vtable->list(session, path, revision, patterns, depth,
-                               dirent_fields, receiver, receiver_baton,
+  return session->vtable->list(session, repos_relpath, revision, patterns,
+                               depth, dirent_fields, receiver, receiver_baton,
                                scratch_pool);
 }
 
@@ -990,62 +990,67 @@ svn_error_t *svn_ra_get_repos_root(svn_r
   return session->vtable->get_repos_root(session, url, pool);
 }
 
-svn_error_t *svn_ra_get_locations(svn_ra_session_t *session,
-                                  apr_hash_t **locations,
-                                  const char *path,
-                                  svn_revnum_t peg_revision,
-                                  const apr_array_header_t *location_revisions,
-                                  apr_pool_t *pool)
+svn_error_t *svn_ra_get_locations2(svn_ra_session_t *session,
+                                   apr_hash_t **locations,
+                                   const char *repos_relpath,
+                                   svn_revnum_t peg_revision,
+                                   const apr_array_header_t 
*location_revisions,
+                                   apr_pool_t *pool)
 {
   svn_error_t *err;
 
   SVN_ERR_ASSERT(SVN_IS_VALID_REVNUM(peg_revision));
-  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
-  err = session->vtable->get_locations(session, locations, path,
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(repos_relpath));
+  err = session->vtable->get_locations(session, locations, repos_relpath,
                                        peg_revision, location_revisions, pool);
+#if TODO
   if (err && (err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED))
     {
       svn_error_clear(err);
 
       /* Do it the slow way, using get-logs, for older servers. */
-      err = svn_ra__locations_from_log(session, locations, path,
+      err = svn_ra__locations_from_log(session, locations, repos_relpath,
                                        peg_revision, location_revisions,
                                        pool);
     }
+#endif
   return err;
 }
 
 svn_error_t *
-svn_ra_get_location_segments(svn_ra_session_t *session,
-                             const char *path,
-                             svn_revnum_t peg_revision,
-                             svn_revnum_t start_rev,
-                             svn_revnum_t end_rev,
-                             svn_location_segment_receiver_t receiver,
-                             void *receiver_baton,
-                             apr_pool_t *pool)
+svn_ra_get_location_segments2(svn_ra_session_t *session,
+                              const char *repos_relpath,
+                              svn_revnum_t peg_revision,
+                              svn_revnum_t start_rev,
+                              svn_revnum_t end_rev,
+                              svn_location_segment_receiver_t receiver,
+                              void *receiver_baton,
+                              apr_pool_t *pool)
 {
   svn_error_t *err;
 
-  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
-  err = session->vtable->get_location_segments(session, path, peg_revision,
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(repos_relpath));
+  err = session->vtable->get_location_segments(session, repos_relpath,
+                                               peg_revision,
                                                start_rev, end_rev,
                                                receiver, receiver_baton, pool);
+#if TODO
   if (err && (err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED))
     {
       svn_error_clear(err);
 
       /* Do it the slow way, using get-logs, for older servers. */
-      err = svn_ra__location_segments_from_log(session, path,
+      err = svn_ra__location_segments_from_log(session, repos_relpath,
                                                peg_revision, start_rev,
                                                end_rev, receiver,
                                                receiver_baton, pool);
     }
+#endif
   return err;
 }
 
-svn_error_t *svn_ra_get_file_revs2(svn_ra_session_t *session,
-                                   const char *path,
+svn_error_t *svn_ra_get_file_revs3(svn_ra_session_t *session,
+                                   const char *repos_relpath,
                                    svn_revnum_t start,
                                    svn_revnum_t end,
                                    svn_boolean_t include_merged_revisions,
@@ -1055,7 +1060,7 @@ svn_error_t *svn_ra_get_file_revs2(svn_r
 {
   svn_error_t *err;
 
-  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(repos_relpath));
 
   if (include_merged_revisions)
     SVN_ERR(svn_ra__assert_mergeinfo_capable_server(session, NULL, pool));
@@ -1067,18 +1072,20 @@ svn_error_t *svn_ra_get_file_revs2(svn_r
                                    NULL,
                                    pool));
 
-  err = session->vtable->get_file_revs(session, path, start, end,
+  err = session->vtable->get_file_revs(session, repos_relpath, start, end,
                                        include_merged_revisions,
                                        handler, handler_baton, pool);
+#if TODO
   if (err && (err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED)
       && !include_merged_revisions)
     {
       svn_error_clear(err);
 
       /* Do it the slow way, using get-logs, for older servers. */
-      err = svn_ra__file_revs_from_log(session, path, start, end,
+      err = svn_ra__file_revs_from_log(session, repos_relpath, start, end,
                                        handler, handler_baton, pool);
     }
+#endif
   return svn_error_trace(err);
 }
 
@@ -1128,35 +1135,28 @@ svn_error_t *svn_ra_unlock(svn_ra_sessio
                                  lock_func, lock_baton, pool);
 }
 
-svn_error_t *svn_ra_get_lock(svn_ra_session_t *session,
-                             svn_lock_t **lock,
-                             const char *path,
-                             apr_pool_t *pool)
+svn_error_t *svn_ra_get_lock2(svn_ra_session_t *session,
+                              svn_lock_t **lock,
+                              const char *repos_relpath,
+                              apr_pool_t *pool)
 {
-  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
-  return session->vtable->get_lock(session, lock, path, pool);
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(repos_relpath));
+  return session->vtable->get_lock(session, lock, repos_relpath, pool);
 }
 
-svn_error_t *svn_ra_get_locks2(svn_ra_session_t *session,
+svn_error_t *svn_ra_get_locks3(svn_ra_session_t *session,
                                apr_hash_t **locks,
-                               const char *path,
+                               const char *repos_relpath,
                                svn_depth_t depth,
                                apr_pool_t *pool)
 {
-  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(repos_relpath));
   SVN_ERR_ASSERT((depth == svn_depth_empty) ||
                  (depth == svn_depth_files) ||
                  (depth == svn_depth_immediates) ||
                  (depth == svn_depth_infinity));
-  return session->vtable->get_locks(session, locks, path, depth, pool);
-}
-
-svn_error_t *svn_ra_get_locks(svn_ra_session_t *session,
-                              apr_hash_t **locks,
-                              const char *path,
-                              apr_pool_t *pool)
-{
-  return svn_ra_get_locks2(session, locks, path, svn_depth_infinity, pool);
+  return session->vtable->get_locks(session, locks, repos_relpath, depth,
+                                    pool);
 }
 
 svn_error_t *svn_ra_replay(svn_ra_session_t *session,
@@ -1314,17 +1314,17 @@ svn_error_t *svn_ra_has_capability(svn_r
 }
 
 svn_error_t *
-svn_ra_get_deleted_rev(svn_ra_session_t *session,
-                       const char *path,
-                       svn_revnum_t peg_revision,
-                       svn_revnum_t end_revision,
-                       svn_revnum_t *revision_deleted,
-                       apr_pool_t *pool)
+svn_ra_get_deleted_rev2(svn_ra_session_t *session,
+                        const char *repos_relpath,
+                        svn_revnum_t peg_revision,
+                        svn_revnum_t end_revision,
+                        svn_revnum_t *revision_deleted,
+                        apr_pool_t *pool)
 {
   svn_error_t *err;
 
   /* Path must be relative. */
-  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(repos_relpath));
 
   if (!SVN_IS_VALID_REVNUM(peg_revision))
     return svn_error_createf(SVN_ERR_CLIENT_BAD_REVISION, NULL,
@@ -1335,63 +1335,67 @@ svn_ra_get_deleted_rev(svn_ra_session_t
   if (end_revision <= peg_revision)
     return svn_error_create(SVN_ERR_CLIENT_BAD_REVISION, NULL,
                             _("Peg revision must precede end revision"));
-  err = session->vtable->get_deleted_rev(session, path,
+  err = session->vtable->get_deleted_rev(session, repos_relpath,
                                          peg_revision,
                                          end_revision,
                                          revision_deleted,
                                          pool);
+#if TODO
   if (err && (err->apr_err == SVN_ERR_UNSUPPORTED_FEATURE))
     {
       svn_error_clear(err);
 
       /* Do it the slow way, using get-logs, for older servers. */
-      err = svn_ra__get_deleted_rev_from_log(session, path, peg_revision,
+      err = svn_ra__get_deleted_rev_from_log(session, repos_relpath, 
peg_revision,
                                              end_revision, revision_deleted,
                                              pool);
     }
+#endif
   return err;
 }
 
 svn_error_t *
-svn_ra_get_inherited_props(svn_ra_session_t *session,
-                           apr_array_header_t **iprops,
-                           const char *path,
-                           svn_revnum_t revision,
-                           apr_pool_t *result_pool,
-                           apr_pool_t *scratch_pool)
+svn_ra_get_inherited_props2(svn_ra_session_t *session,
+                            apr_array_header_t **iprops,
+                            const char *repos_relpath,
+                            svn_revnum_t revision,
+                            apr_pool_t *result_pool,
+                            apr_pool_t *scratch_pool)
 {
   svn_error_t *err;
   /* Path must be relative. */
-  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(repos_relpath));
 
-  err = session->vtable->get_inherited_props(session, iprops, path,
+  err = session->vtable->get_inherited_props(session, iprops, repos_relpath,
                                              revision, result_pool,
                                              scratch_pool);
 
+#if TODO
   if (err && err->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED)
     {
       svn_error_clear(err);
 
       /* Fallback for legacy servers. */
-      SVN_ERR(svn_ra__get_inherited_props_walk(session, path, revision, iprops,
+      SVN_ERR(svn_ra__get_inherited_props_walk(session, repos_relpath, 
revision, iprops,
                                                result_pool, scratch_pool));
     }
   else
+#endif
     SVN_ERR(err);
 
   return SVN_NO_ERROR;
 }
 
 svn_error_t *
-svn_ra_fetch_file_contents(svn_ra_session_t *session,
-                           const char *path,
-                           svn_revnum_t revision,
-                           svn_stream_t *stream,
-                           apr_pool_t *scratch_pool)
+svn_ra_fetch_file_contents2(svn_ra_session_t *session,
+                            const char *repos_relpath,
+                            svn_revnum_t revision,
+                            svn_stream_t *stream,
+                            apr_pool_t *scratch_pool)
 {
-  SVN_ERR_ASSERT(svn_relpath_is_canonical(path));
-  return session->vtable->fetch_file_contents(session, path, revision, stream,
-                                              scratch_pool);
+  SVN_ERR_ASSERT(svn_relpath_is_canonical(repos_relpath));
+  return session->vtable->fetch_file_contents(session, repos_relpath, revision,
+                                              stream, scratch_pool);
 }
 
 svn_error_t *

Modified: subversion/branches/reparentless/subversion/libsvn_ra/ra_loader.h
==============================================================================
--- subversion/branches/reparentless/subversion/libsvn_ra/ra_loader.h   Fri Sep 
18 12:45:05 2026        (r1938345)
+++ subversion/branches/reparentless/subversion/libsvn_ra/ra_loader.h   Fri Sep 
18 12:45:34 2026        (r1938346)
@@ -134,7 +134,7 @@ typedef struct svn_ra__vtable_t {
                                     apr_pool_t *pool);
   /* See svn_ra_get_file(). */
   svn_error_t *(*get_file)(svn_ra_session_t *session,
-                           const char *path,
+                           const char *repos_relpath,
                            svn_revnum_t revision,
                            svn_stream_t *stream,
                            svn_revnum_t *fetched_rev,
@@ -247,13 +247,13 @@ typedef struct svn_ra__vtable_t {
   /* See svn_ra_get_locations(). */
   svn_error_t *(*get_locations)(svn_ra_session_t *session,
                                 apr_hash_t **locations,
-                                const char *path,
+                                const char *repos_relpath,
                                 svn_revnum_t peg_revision,
                                 const apr_array_header_t *location_revisions,
                                 apr_pool_t *pool);
   /* See svn_ra_get_location_segments(). */
   svn_error_t *(*get_location_segments)(svn_ra_session_t *session,
-                                        const char *path,
+                                        const char *repos_relpath,
                                         svn_revnum_t peg_revision,
                                         svn_revnum_t start_rev,
                                         svn_revnum_t end_rev,
@@ -262,7 +262,7 @@ typedef struct svn_ra__vtable_t {
                                         apr_pool_t *pool);
   /* See svn_ra_get_file_revs2(). */
   svn_error_t *(*get_file_revs)(svn_ra_session_t *session,
-                                const char *path,
+                                const char *repos_relpath,
                                 svn_revnum_t start,
                                 svn_revnum_t end,
                                 svn_boolean_t include_merged_revisions,
@@ -287,12 +287,12 @@ typedef struct svn_ra__vtable_t {
   /* See svn_ra_get_lock(). */
   svn_error_t *(*get_lock)(svn_ra_session_t *session,
                            svn_lock_t **lock,
-                           const char *path,
+                           const char *repos_relpath,
                            apr_pool_t *pool);
   /* See svn_ra_get_locks2(). */
   svn_error_t *(*get_locks)(svn_ra_session_t *session,
                             apr_hash_t **locks,
-                            const char *path,
+                            const char *repos_relpath,
                             svn_depth_t depth,
                             apr_pool_t *pool);
   /* See svn_ra_replay(). */
@@ -321,7 +321,7 @@ typedef struct svn_ra__vtable_t {
                   apr_pool_t *pool);
   /* See svn_ra_get_deleted_rev(). */
   svn_error_t *(*get_deleted_rev)(svn_ra_session_t *session,
-                                  const char *path,
+                                  const char *repos_relpath,
                                   svn_revnum_t peg_revision,
                                   svn_revnum_t end_revision,
                                   svn_revnum_t *revision_deleted,
@@ -329,7 +329,7 @@ typedef struct svn_ra__vtable_t {
   /* See svn_ra_get_inherited_props(). */
   svn_error_t *(*get_inherited_props)(svn_ra_session_t *session,
                                       apr_array_header_t **iprops,
-                                      const char *path,
+                                      const char *repos_relpath,
                                       svn_revnum_t revision,
                                       apr_pool_t *result_pool,
                                       apr_pool_t *scratch_pool);
@@ -341,7 +341,7 @@ typedef struct svn_ra__vtable_t {
 
   /* See svn_ra_list(). */
   svn_error_t *(*list)(svn_ra_session_t *session,
-                       const char *path,
+                       const char *repos_relpath,
                        svn_revnum_t revision,
                        const apr_array_header_t *patterns,
                        svn_depth_t depth,
@@ -352,7 +352,7 @@ typedef struct svn_ra__vtable_t {
 
   /* See svn_ra_fetch_file_contents(). */
   svn_error_t *(*fetch_file_contents)(svn_ra_session_t *session,
-                                      const char *path,
+                                      const char *repos_relpath,
                                       svn_revnum_t revision,
                                       svn_stream_t *stream,
                                       apr_pool_t *scratch_pool);

Modified: 
subversion/branches/reparentless/subversion/libsvn_ra_local/ra_plugin.c
==============================================================================
--- subversion/branches/reparentless/subversion/libsvn_ra_local/ra_plugin.c     
Fri Sep 18 12:45:05 2026        (r1938345)
+++ subversion/branches/reparentless/subversion/libsvn_ra_local/ra_plugin.c     
Fri Sep 18 12:45:34 2026        (r1938346)
@@ -721,7 +721,7 @@ svn_ra_local__get_latest_revnum(svn_ra_s
 
 static svn_error_t *
 svn_ra_local__get_file_revs(svn_ra_session_t *session,
-                            const char *path,
+                            const char *repos_relpath,
                             svn_revnum_t start,
                             svn_revnum_t end,
                             svn_boolean_t include_merged_revisions,
@@ -730,8 +730,8 @@ svn_ra_local__get_file_revs(svn_ra_sessi
                             apr_pool_t *pool)
 {
   svn_ra_local__session_baton_t *sess = session->priv;
-  const char *abs_path = svn_fspath__join(sess->fs_path->data, path, pool);
-  return svn_repos_get_file_revs2(sess->repos, abs_path, start, end,
+  repos_relpath = svn_fspath__join("/", repos_relpath, pool);
+  return svn_repos_get_file_revs2(sess->repos, repos_relpath, start, end,
                                   include_merged_revisions, NULL, NULL,
                                   handler, handler_baton, pool);
 }
@@ -1265,7 +1265,7 @@ get_node_props(apr_hash_t **props,
 /* Getting just one file. */
 static svn_error_t *
 get_file(svn_ra_session_t *session,
-         const char *path,
+         const char *repos_relpath,
          svn_revnum_t revision,
          svn_stream_t *stream,
          svn_revnum_t *fetched_rev,
@@ -1276,7 +1276,6 @@ get_file(svn_ra_session_t *session,
   svn_stream_t *contents;
   svn_revnum_t youngest_rev;
   svn_ra_local__session_baton_t *sess = session->priv;
-  const char *abs_path = svn_fspath__join(sess->fs_path->data, path, pool);
   svn_node_kind_t node_kind;
 
   /* Open the revision's root. */
@@ -1290,22 +1289,22 @@ get_file(svn_ra_session_t *session,
   else
     SVN_ERR(svn_fs_revision_root(&root, sess->fs, revision, pool));
 
-  SVN_ERR(svn_fs_check_path(&node_kind, root, abs_path, pool));
+  SVN_ERR(svn_fs_check_path(&node_kind, root, repos_relpath, pool));
   if (node_kind == svn_node_none)
     {
       return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
-                               _("'%s' path not found"), abs_path);
+                               _("'%s' path not found"), repos_relpath);
     }
   else if (node_kind != svn_node_file)
     {
       return svn_error_createf(SVN_ERR_FS_NOT_FILE, NULL,
-                               _("'%s' is not a file"), abs_path);
+                               _("'%s' is not a file"), repos_relpath);
     }
 
   if (stream)
     {
       /* Get a stream representing the file's contents. */
-      SVN_ERR(svn_fs_file_contents(&contents, root, abs_path, pool));
+      SVN_ERR(svn_fs_file_contents(&contents, root, repos_relpath, pool));
 
       /* Now push data from the fs stream back at the caller's stream.
          Note that this particular RA layer does not computing a
@@ -1325,7 +1324,8 @@ get_file(svn_ra_session_t *session,
 
   /* Handle props if requested. */
   if (props)
-    SVN_ERR(get_node_props(props, root, abs_path, sess->uuid, pool, pool));
+    SVN_ERR(get_node_props(props, root, repos_relpath, sess->uuid,
+                           pool, pool));
 
   return SVN_NO_ERROR;
 }
@@ -1442,14 +1442,14 @@ svn_ra_local__get_dir(svn_ra_session_t *
 static svn_error_t *
 svn_ra_local__get_locations(svn_ra_session_t *session,
                             apr_hash_t **locations,
-                            const char *path,
+                            const char *repos_relpath,
                             svn_revnum_t peg_revision,
                             const apr_array_header_t *location_revisions,
                             apr_pool_t *pool)
 {
   svn_ra_local__session_baton_t *sess = session->priv;
-  const char *abs_path = svn_fspath__join(sess->fs_path->data, path, pool);
-  return svn_repos_trace_node_locations(sess->fs, locations, abs_path,
+  repos_relpath = svn_fspath__join("/", repos_relpath, pool);
+  return svn_repos_trace_node_locations(sess->fs, locations, repos_relpath,
                                         peg_revision, location_revisions,
                                         NULL, NULL, pool);
 }
@@ -1457,7 +1457,7 @@ svn_ra_local__get_locations(svn_ra_sessi
 
 static svn_error_t *
 svn_ra_local__get_location_segments(svn_ra_session_t *session,
-                                    const char *path,
+                                    const char *repos_relpath,
                                     svn_revnum_t peg_revision,
                                     svn_revnum_t start_rev,
                                     svn_revnum_t end_rev,
@@ -1466,8 +1466,8 @@ svn_ra_local__get_location_segments(svn_
                                     apr_pool_t *pool)
 {
   svn_ra_local__session_baton_t *sess = session->priv;
-  const char *abs_path = svn_fspath__join(sess->fs_path->data, path, pool);
-  return svn_repos_node_location_segments(sess->repos, abs_path,
+  repos_relpath = svn_fspath__join("/", repos_relpath, pool);
+  return svn_repos_node_location_segments(sess->repos, repos_relpath,
                                           peg_revision, start_rev, end_rev,
                                           receiver, receiver_baton,
                                           NULL, NULL, pool);
@@ -1602,12 +1602,12 @@ svn_ra_local__unlock(svn_ra_session_t *s
 static svn_error_t *
 svn_ra_local__get_lock(svn_ra_session_t *session,
                        svn_lock_t **lock,
-                       const char *path,
+                       const char *repos_relpath,
                        apr_pool_t *pool)
 {
   svn_ra_local__session_baton_t *sess = session->priv;
-  const char *abs_path = svn_fspath__join(sess->fs_path->data, path, pool);
-  return svn_fs_get_lock(lock, sess->fs, abs_path, pool);
+  repos_relpath = svn_fspath__join("/", repos_relpath, pool);
+  return svn_fs_get_lock(lock, sess->fs, repos_relpath, pool);
 }
 
 
@@ -1615,16 +1615,16 @@ svn_ra_local__get_lock(svn_ra_session_t
 static svn_error_t *
 svn_ra_local__get_locks(svn_ra_session_t *session,
                         apr_hash_t **locks,
-                        const char *path,
+                        const char *repos_relpath,
                         svn_depth_t depth,
                         apr_pool_t *pool)
 {
   svn_ra_local__session_baton_t *sess = session->priv;
-  const char *abs_path = svn_fspath__join(sess->fs_path->data, path, pool);
+  repos_relpath = svn_fspath__join("/", repos_relpath, pool);
 
   /* Kinda silly to call the repos wrapper, since we have no authz
      func to give it.  But heck, why not. */
-  return svn_repos_fs_get_locks2(locks, sess->repos, abs_path, depth,
+  return svn_repos_fs_get_locks2(locks, sess->repos, repos_relpath, depth,
                                  NULL, NULL, pool);
 }
 
@@ -1705,17 +1705,17 @@ svn_ra_local__has_capability(svn_ra_sess
 
 static svn_error_t *
 svn_ra_local__get_deleted_rev(svn_ra_session_t *session,
-                              const char *path,
+                              const char *repos_relpath,
                               svn_revnum_t peg_revision,
                               svn_revnum_t end_revision,
                               svn_revnum_t *revision_deleted,
                               apr_pool_t *pool)
 {
   svn_ra_local__session_baton_t *sess = session->priv;
-  const char *abs_path = svn_fspath__join(sess->fs_path->data, path, pool);
+  repos_relpath = svn_fspath__join("/", repos_relpath, pool);
 
   SVN_ERR(svn_repos_deleted_rev(sess->fs,
-                                abs_path,
+                                repos_relpath,
                                 peg_revision,
                                 end_revision,
                                 revision_deleted,
@@ -1727,29 +1727,29 @@ svn_ra_local__get_deleted_rev(svn_ra_ses
 static svn_error_t *
 svn_ra_local__get_inherited_props(svn_ra_session_t *session,
                                   apr_array_header_t **iprops,
-                                  const char *path,
+                                  const char *repos_relpath,
                                   svn_revnum_t revision,
                                   apr_pool_t *result_pool,
                                   apr_pool_t *scratch_pool)
 {
   svn_fs_root_t *root;
   svn_ra_local__session_baton_t *sess = session->priv;
-  const char *abs_path = svn_fspath__join(sess->fs_path->data, path,
-                                          scratch_pool);
   svn_node_kind_t node_kind;
 
+  repos_relpath = svn_fspath__join("/", repos_relpath, scratch_pool);
+
   /* Open the revision's root. */
   SVN_ERR(svn_fs_revision_root(&root, sess->fs, revision, scratch_pool));
 
-  SVN_ERR(svn_fs_check_path(&node_kind, root, abs_path, scratch_pool));
+  SVN_ERR(svn_fs_check_path(&node_kind, root, repos_relpath, scratch_pool));
   if (node_kind == svn_node_none)
     {
       return svn_error_createf(SVN_ERR_FS_NOT_FOUND, NULL,
-                               _("'%s' path not found"), abs_path);
+                               _("'%s' path not found"), repos_relpath);
     }
 
   return svn_error_trace(
-                svn_repos_fs_get_inherited_props(iprops, root, abs_path,
+                svn_repos_fs_get_inherited_props(iprops, root, repos_relpath,
                                                  NULL /* propname */,
                                                  NULL, NULL /* auth */,
                                                  result_pool, scratch_pool));
@@ -1843,7 +1843,7 @@ dirent_receiver(const char *rel_path,
 
 static svn_error_t *
 svn_ra_local__list(svn_ra_session_t *session,
-                   const char *path,
+                   const char *repos_relpath,
                    svn_revnum_t revision,
                    const apr_array_header_t *patterns,
                    svn_depth_t depth,
@@ -1860,9 +1860,10 @@ svn_ra_local__list(svn_ra_session_t *ses
   baton.receiver = receiver;
   baton.receiver_baton = receiver_baton;
 
+  repos_relpath = svn_fspath__join("/", repos_relpath, pool);
+
   SVN_ERR(svn_fs_revision_root(&root, sess->fs, revision, pool));
-  path = svn_dirent_join(sess->fs_path->data, path, pool);
-  return svn_error_trace(svn_repos_list(root, path, patterns, depth,
+  return svn_error_trace(svn_repos_list(root, repos_relpath, patterns, depth,
                                         path_info_only, NULL, NULL,
                                         dirent_receiver, &baton,
                                         sess->callbacks
@@ -1873,7 +1874,7 @@ svn_ra_local__list(svn_ra_session_t *ses
 
 static svn_error_t *
 svn_ra_local__get_file(svn_ra_session_t *session,
-                       const char *path,
+                       const char *repos_relpath,
                        svn_revnum_t revision,
                        svn_stream_t *stream,
                        svn_revnum_t *fetched_rev,
@@ -1884,7 +1885,9 @@ svn_ra_local__get_file(svn_ra_session_t
   if (stream)
     stream = svn_stream_disown(stream, pool);
 
-  SVN_ERR(get_file(session, path, revision, stream, fetched_rev,
+  repos_relpath = svn_fspath__join("/", repos_relpath, pool);
+
+  SVN_ERR(get_file(session, repos_relpath, revision, stream, fetched_rev,
                    props, pool));
 
   return SVN_NO_ERROR;
@@ -1892,12 +1895,14 @@ svn_ra_local__get_file(svn_ra_session_t
 
 static svn_error_t *
 svn_ra_local__fetch_file_contents(svn_ra_session_t *session,
-                                  const char *path,
+                                  const char *repos_relpath,
                                   svn_revnum_t revision,
                                   svn_stream_t *stream,
                                   apr_pool_t *scratch_pool)
 {
-  SVN_ERR(get_file(session, path, revision, stream, NULL,
+  repos_relpath = svn_fspath__join("/", repos_relpath, scratch_pool);
+
+  SVN_ERR(get_file(session, repos_relpath, revision, stream, NULL,
                    NULL, scratch_pool));
 
   return SVN_NO_ERROR;

Modified: subversion/branches/reparentless/subversion/libsvn_ra_svn/client.c
==============================================================================
--- subversion/branches/reparentless/subversion/libsvn_ra_svn/client.c  Fri Sep 
18 12:45:05 2026        (r1938345)
+++ subversion/branches/reparentless/subversion/libsvn_ra_svn/client.c  Fri Sep 
18 12:45:34 2026        (r1938346)
@@ -1502,7 +1502,8 @@ parse_iproplist(apr_array_header_t **inh
   return SVN_NO_ERROR;
 }
 
-static svn_error_t *get_file(svn_ra_session_t *session, const char *path,
+static svn_error_t *get_file(svn_ra_session_t *session,
+                             const char *repos_relpath,
                              svn_revnum_t rev, svn_stream_t *stream,
                              svn_revnum_t *fetched_rev,
                              apr_hash_t **props,
@@ -1515,8 +1516,9 @@ static svn_error_t *get_file(svn_ra_sess
   svn_checksum_t *expected_checksum = NULL;
   svn_checksum_ctx_t *checksum_ctx;
   apr_pool_t *iterpool;
+  const char *path;
 
-  path = reparent_path(session, path, pool);
+  SVN_ERR(reparent_repos_relpath(&path, session, repos_relpath, pool, pool));
   SVN_ERR(svn_ra_svn__write_cmd_get_file(conn, pool, path, rev,
                                          (props != NULL), (stream != NULL)));
   SVN_ERR(handle_auth_request(sess_baton, pool));
@@ -2261,7 +2263,7 @@ static svn_error_t *ra_svn_stat(svn_ra_s
 
 static svn_error_t *ra_svn_get_locations(svn_ra_session_t *session,
                                          apr_hash_t **locations,
-                                         const char *path,
+                                         const char *repos_relpath,
                                          svn_revnum_t peg_revision,
                                          const apr_array_header_t 
*location_revisions,
                                          apr_pool_t *pool)
@@ -2271,9 +2273,10 @@ static svn_error_t *ra_svn_get_locations
   svn_revnum_t revision;
   svn_boolean_t is_done;
   apr_pool_t *iterpool;
+  const char *path;
   int i;
 
-  path = reparent_path(session, path, pool);
+  SVN_ERR(reparent_repos_relpath(&path, session, repos_relpath, pool, pool));
 
   /* Transmit the parameters. */
   SVN_ERR(svn_ra_svn__write_tuple(conn, pool, "w(cr(!",
@@ -2406,7 +2409,7 @@ perform_get_location_segments(svn_error_
 
 static svn_error_t *
 ra_svn_get_location_segments(svn_ra_session_t *session,
-                             const char *path,
+                             const char *repos_relpath,
                              svn_revnum_t peg_revision,
                              svn_revnum_t start_rev,
                              svn_revnum_t end_rev,
@@ -2416,8 +2419,10 @@ ra_svn_get_location_segments(svn_ra_sess
 {
   svn_error_t *outer_err = SVN_NO_ERROR;
   svn_error_t *err;
+  const char *path;
+
+  SVN_ERR(reparent_repos_relpath(&path, session, repos_relpath, pool, pool));
 
-  path = reparent_path(session, path, pool);
   err = svn_error_trace(
             perform_get_location_segments(&outer_err, session, path,
                                           peg_revision, start_rev, end_rev,
@@ -2426,7 +2431,7 @@ ra_svn_get_location_segments(svn_ra_sess
 }
 
 static svn_error_t *ra_svn_get_file_revs(svn_ra_session_t *session,
-                                         const char *path,
+                                         const char *repos_relpath,
                                          svn_revnum_t start, svn_revnum_t end,
                                          svn_boolean_t 
include_merged_revisions,
                                          svn_file_rev_handler_t handler,
@@ -2436,13 +2441,14 @@ static svn_error_t *ra_svn_get_file_revs
   apr_pool_t *rev_pool, *chunk_pool;
   svn_boolean_t has_txdelta;
   svn_boolean_t had_revision = FALSE;
+  const char *path;
 
   /* One sub-pool for each revision and one for each txdelta chunk.
      Note that the rev_pool must live during the following txdelta. */
   rev_pool = svn_pool_create(pool);
   chunk_pool = svn_pool_create(pool);
 
-  path = reparent_path(session, path, pool);
+  SVN_ERR(reparent_repos_relpath(&path, session, repos_relpath, pool, pool));
   SVN_ERR(svn_ra_svn__write_cmd_get_file_revs(sess_baton->conn, pool,
                                               path, start, end,
                                               include_merged_revisions));
@@ -2919,14 +2925,15 @@ static svn_error_t *ra_svn_unlock(svn_ra
 
 static svn_error_t *ra_svn_get_lock(svn_ra_session_t *session,
                                     svn_lock_t **lock,
-                                    const char *path,
+                                    const char *repos_relpath,
                                     apr_pool_t *pool)
 {
   svn_ra_svn__session_baton_t *sess = session->priv;
   svn_ra_svn_conn_t* conn = sess->conn;
   svn_ra_svn__list_t *list;
+  const char *path;
 
-  path = reparent_path(session, path, pool);
+  SVN_ERR(reparent_repos_relpath(&path, session, repos_relpath, pool, pool));
   SVN_ERR(svn_ra_svn__write_cmd_get_lock(conn, pool, path));
 
   /* Servers before 1.2 doesn't support locking.  Check this here. */
@@ -2964,21 +2971,17 @@ static svn_error_t *path_relative_to_roo
 
 static svn_error_t *ra_svn_get_locks(svn_ra_session_t *session,
                                      apr_hash_t **locks,
-                                     const char *path,
+                                     const char *repos_relpath,
                                      svn_depth_t depth,
                                      apr_pool_t *pool)
 {
   svn_ra_svn__session_baton_t *sess = session->priv;
   svn_ra_svn_conn_t* conn = sess->conn;
   svn_ra_svn__list_t *list;
-  const char *full_url, *abs_path;
+  const char *path;
   int i;
 
-  /* Figure out the repository abspath from PATH. */
-  full_url = svn_path_url_add_component2(sess->parent->client_url->data,
-                                         path, pool);
-  SVN_ERR(path_relative_to_root(session, &abs_path, full_url, pool));
-  abs_path = svn_fspath__canonicalize(abs_path, pool);
+  SVN_ERR(reparent_repos_relpath(&path, session, repos_relpath, pool, pool));
 
   SVN_ERR(svn_ra_svn__write_cmd_get_locks(conn, pool, path, depth));
 
@@ -3010,14 +3013,18 @@ static svn_error_t *ra_svn_get_locks(svn
          b) we've asked for a fully recursive answer, or
          c) we've asked for depth=files or depth=immediates, and this
             lock is on an immediate child of our query path.
+
+         Because repos_relpath is a relpath, while lock->path is an fspath,
+         move lock->path forward.
       */
-      if ((strcmp(abs_path, lock->path) == 0) || (depth == svn_depth_infinity))
+      if ((strcmp(repos_relpath, lock->path + 1) == 0) || (depth == 
svn_depth_infinity))
         {
           svn_hash_sets(*locks, lock->path, lock);
         }
       else if ((depth == svn_depth_files) || (depth == svn_depth_immediates))
         {
-          const char *relpath = svn_fspath__skip_ancestor(abs_path, 
lock->path);
+          const char *relpath = svn_relpath_skip_ancestor(repos_relpath,
+                                                          lock->path + 1);
           if (relpath && (svn_path_component_count(relpath) == 1))
             svn_hash_sets(*locks, lock->path, lock);
         }
@@ -3177,7 +3184,7 @@ ra_svn_has_capability(svn_ra_session_t *
 
 static svn_error_t *
 ra_svn_get_deleted_rev(svn_ra_session_t *session,
-                       const char *path,
+                       const char *repos_relpath,
                        svn_revnum_t peg_revision,
                        svn_revnum_t end_revision,
                        svn_revnum_t *revision_deleted,
@@ -3187,8 +3194,9 @@ ra_svn_get_deleted_rev(svn_ra_session_t
   svn_ra_svn__session_baton_t *sess_baton = session->priv;
   svn_ra_svn_conn_t *conn = sess_baton->conn;
   svn_error_t *err;
+  const char *path;
 
-  path = reparent_path(session, path, pool);
+  SVN_ERR(reparent_repos_relpath(&path, session, repos_relpath, pool, pool));
 
   /* Transmit the parameters. */
   SVN_ERR(svn_ra_svn__write_cmd_get_deleted_rev(conn, pool, path,
@@ -3229,7 +3237,7 @@ ra_svn_register_editor_shim_callbacks(sv
 static svn_error_t *
 ra_svn_get_inherited_props(svn_ra_session_t *session,
                            apr_array_header_t **iprops,
-                           const char *path,
+                           const char *repos_relpath,
                            svn_revnum_t revision,
                            apr_pool_t *result_pool,
                            apr_pool_t *scratch_pool)
@@ -3238,8 +3246,11 @@ ra_svn_get_inherited_props(svn_ra_sessio
   svn_ra_svn_conn_t *conn = sess_baton->conn;
   svn_ra_svn__list_t *iproplist;
   svn_boolean_t iprop_capable;
+  const char *path;
+
+  SVN_ERR(reparent_repos_relpath(&path, session, repos_relpath, scratch_pool,
+                                 scratch_pool));
 
-  path = reparent_path(session, path, scratch_pool);
   SVN_ERR(ra_svn_has_capability(session, &iprop_capable,
                                 SVN_RA_CAPABILITY_INHERITED_PROPS,
                                 scratch_pool));
@@ -3261,7 +3272,7 @@ ra_svn_get_inherited_props(svn_ra_sessio
 
 static svn_error_t *
 ra_svn_list(svn_ra_session_t *session,
-            const char *path,
+            const char *repos_relpath,
             svn_revnum_t revision,
             const apr_array_header_t *patterns,
             svn_depth_t depth,
@@ -3274,8 +3285,10 @@ ra_svn_list(svn_ra_session_t *session,
   svn_ra_svn_conn_t *conn = sess_baton->conn;
   int i;
   apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+  const char *path;
 
-  path = reparent_path(session, path, scratch_pool);
+  SVN_ERR(reparent_repos_relpath(&path, session, repos_relpath, scratch_pool,
+                                 scratch_pool));
 
   /* Send the list request. */
   SVN_ERR(svn_ra_svn__write_tuple(conn, scratch_pool, "w(c(?r)w(!", "list",
@@ -3336,7 +3349,8 @@ ra_svn_list(svn_ra_session_t *session,
   return SVN_NO_ERROR;
 }
 
-static svn_error_t *ra_svn_get_file(svn_ra_session_t *session, const char 
*path,
+static svn_error_t *ra_svn_get_file(svn_ra_session_t *session,
+                                    const char *repos_relpath,
                                     svn_revnum_t rev, svn_stream_t *stream,
                                     svn_revnum_t *fetched_rev,
                                     apr_hash_t **props,
@@ -3346,19 +3360,19 @@ static svn_error_t *ra_svn_get_file(svn_
   if (stream)
     stream = svn_stream_disown(stream, pool);
 
-  SVN_ERR(get_file(session, path, rev, stream, fetched_rev,
+  SVN_ERR(get_file(session, repos_relpath, rev, stream, fetched_rev,
                    props, pool));
 
   return SVN_NO_ERROR;
 }
 
 static svn_error_t *ra_svn_fetch_file_contents(svn_ra_session_t *session,
-                                               const char *path,
+                                               const char *repos_relpath,
                                                svn_revnum_t rev,
                                                svn_stream_t *stream,
                                                apr_pool_t *scratch_pool)
 {
-  SVN_ERR(get_file(session, path, rev, stream, NULL,
+  SVN_ERR(get_file(session, repos_relpath, rev, stream, NULL,
                    NULL, scratch_pool));
 
   return SVN_NO_ERROR;

Reply via email to