You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by st...@apache.org on 2017/01/29 16:31:00 UTC
svn commit: r1780820 - in /subversion/trunk/subversion: include/svn_repos.h
libsvn_repos/deprecated.c libsvn_repos/fs-wrap.c
Author: stefan2
Date: Sun Jan 29 16:31:00 2017
New Revision: 1780820
URL: http://svn.apache.org/viewvc?rev=1780820&view=rev
Log:
Continue work on stream server-side svn_ra_get_mergeinfo.
Make the repos layer API use callbacks instead of collecting a full catalog.
* subversion/include/svn_repos.h
(svn_repos_mergeinfo_receiver_t): Declare new callback. For now, it is
identical to the FS layer type.
(svn_repos_fs_get_mergeinfo2,
svn_repos_fs_get_mergeinfo): Bump the API.
* subversion/libsvn_repos/deprecated.c
(mergeinfo_receiver,
svn_repos_fs_get_mergeinfo): Implement the old API in terms of the new one.
* subversion/libsvn_repos/fs-wrap.c
(svn_repos_fs_get_mergeinfo,
svn_repos_fs_get_mergeinfo2): Replace old API with API implementation.
Apart from the pool rename, the only change
is the call to the bumped FS API function.
Modified:
subversion/trunk/subversion/include/svn_repos.h
subversion/trunk/subversion/libsvn_repos/deprecated.c
subversion/trunk/subversion/libsvn_repos/fs-wrap.c
Modified: subversion/trunk/subversion/include/svn_repos.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_repos.h?rev=1780820&r1=1780819&r2=1780820&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_repos.h (original)
+++ subversion/trunk/subversion/include/svn_repos.h Sun Jan 29 16:31:00 2017
@@ -2227,10 +2227,18 @@ svn_repos_get_logs(svn_repos_t *repos,
/* Retrieving mergeinfo. */
+/** Receives parsed @a mergeinfo for the file system path @a path.
+ *
+ * The user-provided @a baton is being passed through by the retrieval
+ * function and @a scratch_pool will be cleared between invocations.
+ *
+ * @since New in 1.10.
+ */
+typedef svn_fs_mergeinfo_receiver_t svn_repos_mergeinfo_receiver_t;
+
/**
- * Fetch the mergeinfo for @a paths at @a revision in @a repos, and
- * set @a *catalog to a catalog of this mergeinfo. @a *catalog will
- * never be @c NULL but may be empty.
+ * For each node found with mergeinfo on it, invoke @a receiver with
+ * the provided @a receiver_baton.
*
* The paths in @a paths, and the keys of @a catalog, start with '/'.
*
@@ -2251,10 +2259,31 @@ svn_repos_get_logs(svn_repos_t *repos,
* of each path which mergeinfo was requested for (from @a paths).
* Silently omit unreadable paths from the request for mergeinfo.
*
- * Use @a pool for all allocations.
+ * Use @a scratch_pool for temporary allocations.
+ *
+ * @since New in 1.10.
+ */
+svn_error_t *
+svn_repos_fs_get_mergeinfo2(svn_repos_t *repos,
+ const apr_array_header_t *paths,
+ svn_revnum_t revision,
+ svn_mergeinfo_inheritance_t inherit,
+ svn_boolean_t include_descendants,
+ svn_repos_authz_func_t authz_read_func,
+ void *authz_read_baton,
+ svn_repos_mergeinfo_receiver_t receiver,
+ void *receiver_baton,
+ apr_pool_t *scratch_pool);
+
+/**
+ * Same as svn_repos_fs_get_mergeinfo2(), but all mergeinfo is being collected
+ * and returned in @a *catalog. It will never be @c NULL, but may be empty.
*
* @since New in 1.5.
+ *
+ * @deprecated Provided for backward compatibility with the 1.9 API.
*/
+SVN_DEPRECATED
svn_error_t *
svn_repos_fs_get_mergeinfo(svn_mergeinfo_catalog_t *catalog,
svn_repos_t *repos,
Modified: subversion/trunk/subversion/libsvn_repos/deprecated.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/deprecated.c?rev=1780820&r1=1780819&r2=1780820&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/deprecated.c (original)
+++ subversion/trunk/subversion/libsvn_repos/deprecated.c Sun Jan 29 16:31:00 2017
@@ -38,6 +38,7 @@
#include "repos.h"
#include "private/svn_repos_private.h"
+#include "private/svn_subr_private.h"
@@ -507,6 +508,45 @@ svn_repos_fs_get_locks(apr_hash_t **lock
authz_read_baton, pool));
}
+static svn_error_t *
+mergeinfo_receiver(const char *path,
+ svn_mergeinfo_t mergeinfo,
+ void *baton,
+ apr_pool_t *scratch_pool)
+{
+ svn_mergeinfo_catalog_t catalog = baton;
+ apr_pool_t *result_pool = apr_hash_pool_get(catalog);
+ apr_size_t len = strlen(path);
+
+ apr_hash_set(catalog,
+ apr_pstrmemdup(result_pool, path, len),
+ len,
+ svn_mergeinfo_dup(mergeinfo, result_pool));
+
+ return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_repos_fs_get_mergeinfo(svn_mergeinfo_catalog_t *mergeinfo,
+ svn_repos_t *repos,
+ const apr_array_header_t *paths,
+ svn_revnum_t rev,
+ svn_mergeinfo_inheritance_t inherit,
+ svn_boolean_t include_descendants,
+ svn_repos_authz_func_t authz_read_func,
+ void *authz_read_baton,
+ apr_pool_t *pool)
+{
+ svn_mergeinfo_catalog_t result_catalog = svn_hash__make(pool);
+ SVN_ERR(svn_repos_fs_get_mergeinfo2(repos, paths, rev, inherit,
+ include_descendants,
+ authz_read_func, authz_read_baton,
+ mergeinfo_receiver, result_catalog,
+ pool));
+ *mergeinfo = result_catalog;
+
+ return SVN_NO_ERROR;
+}
/*** From logs.c ***/
svn_error_t *
Modified: subversion/trunk/subversion/libsvn_repos/fs-wrap.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/fs-wrap.c?rev=1780820&r1=1780819&r2=1780820&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/fs-wrap.c (original)
+++ subversion/trunk/subversion/libsvn_repos/fs-wrap.c Sun Jan 29 16:31:00 2017
@@ -901,25 +901,26 @@ svn_repos_fs_get_locks2(apr_hash_t **loc
svn_error_t *
-svn_repos_fs_get_mergeinfo(svn_mergeinfo_catalog_t *mergeinfo,
- svn_repos_t *repos,
- const apr_array_header_t *paths,
- svn_revnum_t rev,
- svn_mergeinfo_inheritance_t inherit,
- svn_boolean_t include_descendants,
- svn_repos_authz_func_t authz_read_func,
- void *authz_read_baton,
- apr_pool_t *pool)
+svn_repos_fs_get_mergeinfo2(svn_repos_t *repos,
+ const apr_array_header_t *paths,
+ svn_revnum_t rev,
+ svn_mergeinfo_inheritance_t inherit,
+ svn_boolean_t include_descendants,
+ svn_repos_authz_func_t authz_read_func,
+ void *authz_read_baton,
+ svn_repos_mergeinfo_receiver_t receiver,
+ void *receiver_baton,
+ apr_pool_t *scratch_pool)
{
/* Here we cast away 'const', but won't try to write through this pointer
* without first allocating a new array. */
apr_array_header_t *readable_paths = (apr_array_header_t *) paths;
svn_fs_root_t *root;
- apr_pool_t *iterpool = svn_pool_create(pool);
+ apr_pool_t *iterpool = svn_pool_create(scratch_pool);
if (!SVN_IS_VALID_REVNUM(rev))
- SVN_ERR(svn_fs_youngest_rev(&rev, repos->fs, pool));
- SVN_ERR(svn_fs_revision_root(&root, repos->fs, rev, pool));
+ SVN_ERR(svn_fs_youngest_rev(&rev, repos->fs, scratch_pool));
+ SVN_ERR(svn_fs_revision_root(&root, repos->fs, rev, scratch_pool));
/* Filter out unreadable paths before divining merge tracking info. */
if (authz_read_func)
@@ -940,7 +941,7 @@ svn_repos_fs_get_mergeinfo(svn_mergeinfo
/* Requested paths differ from readable paths. Fork
list of readable paths from requested paths. */
int j;
- readable_paths = apr_array_make(pool, paths->nelts - 1,
+ readable_paths = apr_array_make(scratch_pool, paths->nelts - 1,
sizeof(char *));
for (j = 0; j < i; j++)
{
@@ -957,10 +958,10 @@ svn_repos_fs_get_mergeinfo(svn_mergeinfo
the change itself. */
/* ### TODO(reint): ... but how about descendant merged-to paths? */
if (readable_paths->nelts > 0)
- SVN_ERR(svn_fs_get_mergeinfo2(mergeinfo, root, readable_paths, inherit,
- include_descendants, TRUE, pool, pool));
- else
- *mergeinfo = apr_hash_make(pool);
+ SVN_ERR(svn_fs_get_mergeinfo3(root, readable_paths, inherit,
+ include_descendants, TRUE,
+ receiver, receiver_baton,
+ scratch_pool));
svn_pool_destroy(iterpool);
return SVN_NO_ERROR;