You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by hw...@apache.org on 2012/03/02 03:10:02 UTC
svn commit: r1296033 - in /subversion/trunk/subversion: include/svn_ra_svn.h
libsvn_ra_svn/marshal.c svnserve/serve.c
Author: hwright
Date: Fri Mar 2 02:10:01 2012
New Revision: 1296033
URL: http://svn.apache.org/viewvc?rev=1296033&view=rev
Log:
Ev2 shims: Add callbacks for the svnserve server.
Current number of test failures over ra_svn: 541
* subversion/libsvn_ra_svn/marshal.c
(svn_ra_svn__set_shim_callbacks): New.
* subversion/include/svn_ra_svn.h
(svn_ra_svn__set_shim_callbacks): New.
* subversion/svnserve/serve.c
(fetch_props_func, fetch_kind_func, fetch_base_func): New.
(serve): Create and populate the callbacks shims.
Modified:
subversion/trunk/subversion/include/svn_ra_svn.h
subversion/trunk/subversion/libsvn_ra_svn/marshal.c
subversion/trunk/subversion/svnserve/serve.c
Modified: subversion/trunk/subversion/include/svn_ra_svn.h
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/include/svn_ra_svn.h?rev=1296033&r1=1296032&r2=1296033&view=diff
==============================================================================
--- subversion/trunk/subversion/include/svn_ra_svn.h (original)
+++ subversion/trunk/subversion/include/svn_ra_svn.h Fri Mar 2 02:10:01 2012
@@ -157,6 +157,15 @@ typedef struct svn_ra_svn_item_t
typedef svn_error_t *(*svn_ra_svn_edit_callback)(void *baton);
+/**
+ * Set the shim callbacks to be used by @a conn to @a shim_callbacks.
+ *
+ * @note This is a private API, external consumers should not use it.
+ */
+svn_error_t *
+svn_ra_svn__set_shim_callbacks(svn_ra_svn_conn_t *conn,
+ svn_delta_shim_callbacks_t *shim_callbacks);
+
/** Initialize a connection structure for the given socket or
* input/output files.
*
Modified: subversion/trunk/subversion/libsvn_ra_svn/marshal.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_svn/marshal.c?rev=1296033&r1=1296032&r2=1296033&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_svn/marshal.c (original)
+++ subversion/trunk/subversion/libsvn_ra_svn/marshal.c Fri Mar 2 02:10:01 2012
@@ -125,6 +125,14 @@ svn_error_t *svn_ra_svn_set_capabilities
return SVN_NO_ERROR;
}
+svn_error_t *
+svn_ra_svn__set_shim_callbacks(svn_ra_svn_conn_t *conn,
+ svn_delta_shim_callbacks_t *shim_callbacks)
+{
+ conn->shim_callbacks = shim_callbacks;
+ return SVN_NO_ERROR;
+}
+
svn_boolean_t svn_ra_svn_has_capability(svn_ra_svn_conn_t *conn,
const char *capability)
{
Modified: subversion/trunk/subversion/svnserve/serve.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/svnserve/serve.c?rev=1296033&r1=1296032&r2=1296033&view=diff
==============================================================================
--- subversion/trunk/subversion/svnserve/serve.c (original)
+++ subversion/trunk/subversion/svnserve/serve.c Fri Mar 2 02:10:01 2012
@@ -3094,6 +3094,140 @@ fs_warning_func(void *baton, svn_error_t
svn_pool_clear(b->pool);
}
+
+static svn_error_t *
+fetch_props_func(apr_hash_t **props,
+ void *baton,
+ const char *path,
+ svn_revnum_t base_revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ server_baton_t *sb = baton;
+ svn_fs_root_t *fs_root;
+ svn_error_t *err;
+
+ if (!SVN_IS_VALID_REVNUM(base_revision))
+ SVN_ERR(svn_fs_youngest_rev(&base_revision, sb->fs, scratch_pool));
+
+ if (svn_path_is_url(path))
+ {
+ /* This is a copyfrom URL. */
+ path = svn_uri_skip_ancestor(sb->repos_url, path, scratch_pool);
+ path = svn_fspath__canonicalize(path, scratch_pool);
+ }
+ else
+ {
+ /* This is a base-relative path. */
+ if (path[0] != '/')
+ /* Get an absolute path for use in the FS. */
+ path = svn_fspath__join(sb->fs_path->data, path, scratch_pool);
+ }
+
+ SVN_ERR(svn_fs_revision_root(&fs_root, sb->fs, base_revision, scratch_pool));
+
+ err = svn_fs_node_proplist(props, fs_root, path, result_pool);
+ if (err && err->apr_err == SVN_ERR_FS_NOT_FOUND)
+ {
+ svn_error_clear(err);
+ *props = apr_hash_make(result_pool);
+ return SVN_NO_ERROR;
+ }
+ else if (err)
+ return svn_error_trace(err);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+fetch_kind_func(svn_kind_t *kind,
+ void *baton,
+ const char *path,
+ svn_revnum_t base_revision,
+ apr_pool_t *scratch_pool)
+{
+ server_baton_t *sb = baton;
+ svn_node_kind_t node_kind;
+ svn_fs_root_t *fs_root;
+
+ if (!SVN_IS_VALID_REVNUM(base_revision))
+ SVN_ERR(svn_fs_youngest_rev(&base_revision, sb->fs, scratch_pool));
+
+ if (svn_path_is_url(path))
+ {
+ /* This is a copyfrom URL. */
+ path = svn_uri_skip_ancestor(sb->repos_url, path, scratch_pool);
+ path = svn_fspath__canonicalize(path, scratch_pool);
+ }
+ else
+ {
+ /* This is a base-relative path. */
+ if (path[0] != '/')
+ /* Get an absolute path for use in the FS. */
+ path = svn_fspath__join(sb->fs_path->data, path, scratch_pool);
+ }
+
+ SVN_ERR(svn_fs_revision_root(&fs_root, sb->fs, base_revision, scratch_pool));
+
+ SVN_ERR(svn_fs_check_path(&node_kind, fs_root, path, scratch_pool));
+ *kind = svn__kind_from_node_kind(node_kind, FALSE);
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+fetch_base_func(const char **filename,
+ void *baton,
+ const char *path,
+ svn_revnum_t base_revision,
+ apr_pool_t *result_pool,
+ apr_pool_t *scratch_pool)
+{
+ server_baton_t *sb = baton;
+ svn_stream_t *contents;
+ svn_stream_t *file_stream;
+ const char *tmp_filename;
+ svn_fs_root_t *fs_root;
+ svn_error_t *err;
+
+ if (!SVN_IS_VALID_REVNUM(base_revision))
+ SVN_ERR(svn_fs_youngest_rev(&base_revision, sb->fs, scratch_pool));
+
+ if (svn_path_is_url(path))
+ {
+ /* This is a copyfrom URL. */
+ path = svn_uri_skip_ancestor(sb->repos_url, path, scratch_pool);
+ path = svn_fspath__canonicalize(path, scratch_pool);
+ }
+ else
+ {
+ /* This is a base-relative path. */
+ if (path[0] != '/')
+ /* Get an absolute path for use in the FS. */
+ path = svn_fspath__join(sb->fs_path->data, path, scratch_pool);
+ }
+
+ SVN_ERR(svn_fs_revision_root(&fs_root, sb->fs, base_revision, scratch_pool));
+
+ err = svn_fs_file_contents(&contents, fs_root, path, scratch_pool);
+ if (err && err->apr_err == SVN_ERR_FS_NOT_FOUND)
+ {
+ svn_error_clear(err);
+ *filename = NULL;
+ return SVN_NO_ERROR;
+ }
+ else if (err)
+ return svn_error_trace(err);
+ SVN_ERR(svn_stream_open_unique(&file_stream, &tmp_filename, NULL,
+ svn_io_file_del_on_pool_cleanup,
+ scratch_pool, scratch_pool));
+ SVN_ERR(svn_stream_copy3(contents, file_stream, NULL, NULL, scratch_pool));
+
+ *filename = apr_pstrdup(result_pool, tmp_filename);
+
+ return SVN_NO_ERROR;
+}
+
svn_error_t *serve(svn_ra_svn_conn_t *conn, serve_params_t *params,
apr_pool_t *pool)
{
@@ -3257,5 +3391,18 @@ svn_error_t *serve(svn_ra_svn_conn_t *co
SVN_ERR(svn_ra_svn_write_tuple(conn, pool, "!))"));
}
+ /* Set up editor shims. */
+ {
+ svn_delta_shim_callbacks_t *callbacks =
+ svn_delta_shim_callbacks_default(pool);
+
+ callbacks->fetch_base_func = fetch_base_func;
+ callbacks->fetch_props_func = fetch_props_func;
+ callbacks->fetch_kind_func = fetch_kind_func;
+ callbacks->fetch_baton = &b;
+
+ SVN_ERR(svn_ra_svn__set_shim_callbacks(conn, callbacks));
+ }
+
return svn_ra_svn_handle_commands2(conn, pool, main_commands, &b, FALSE);
}