On Feb 22, 2016 10:10 AM, <stefan2_at_apache.org> wrote:
>
> Author: stefan2
> Date: Mon Feb 22 15:06:40 2016
> New Revision: 1731656
>
> URL: http://svn.apache.org/viewvc?rev=1731656&view=rev
> Log:
> Switch svnserve to using the streamy log API.
> --- subversion/trunk/subversion/svnserve/serve.c (original)
> +++ subversion/trunk/subversion/svnserve/serve.c Mon Feb 22 15:06:40 2016
> @@ -87,6 +87,9 @@ typedef struct log_baton_t {
> const char *fs_path;
> svn_ra_svn_conn_t *conn;
> int stack_depth;
> +
> + /* Set to TRUE when at least one changed path has been sent. */
> + svn_boolean_t started;
> } log_baton_t;
>
> typedef struct file_revs_baton_t {
> @@ -2187,14 +2190,58 @@ get_mergeinfo(svn_ra_svn_conn_t *conn,
> return SVN_NO_ERROR;
> }
>
> -/* Send a log entry to the client. */
> -static svn_error_t *log_receiver(void *baton,
> - svn_log_entry_t *log_entry,
> - apr_pool_t *pool)
> +/* Send a changed paths list entry to the client.
> + This implements svn_repos_path_change_receiver_t. */
> +static svn_error_t *
> +path_change_receiver(void *baton,
> + svn_repos_path_change_t *change,
> + apr_pool_t *scratch_pool)
> +{
> + const char symbol[] = "MADR";
> +
> + log_baton_t *b = baton;
> + svn_ra_svn_conn_t *conn = b->conn;
> +
> + /* Sanitize and convert change kind to ra-svn level action.
> +
> + Pushing that conversion down into libsvn_ra_svn would add yet
another
> + API dependency there. */
> + char action = ( change->change_kind < svn_fs_path_change_modify
> + || change->change_kind > svn_fs_path_change_replace)
> + ? 0
> + : symbol[change->change_kind];
> +
> + /* Open lists once: LOG_ENTRY and LOG_ENTRY->CHANGED_PATHS. */
> + if (!b->started)
> + {
> + SVN_ERR(svn_ra_svn__start_list(conn, scratch_pool));
> + SVN_ERR(svn_ra_svn__start_list(conn, scratch_pool));
Is this supposed to be duplicated?
> @@ -2221,49 +2268,35 @@ static svn_error_t *log_receiver(void *b
> else
> revprop_count = 0;
>
> - /* send LOG_ENTRY */
> - SVN_ERR(svn_ra_svn__start_list(conn, pool));
> -
> - /* send LOG_ENTRY->CHANGED_PATHS2 */
> - SVN_ERR(svn_ra_svn__start_list(conn, pool));
> - if (log_entry->changed_paths2)
> + /* Open lists once: LOG_ENTRY and LOG_ENTRY->CHANGED_PATHS. */
> + if (!b->started)
> {
> - for (h = apr_hash_first(pool, log_entry->changed_paths2); h;
> - h =
apr_hash_next(h))
> - {
> - const char *path = apr_hash_this_key(h);
> - svn_log_changed_path2_t *change = apr_hash_this_val(h);
> -
> - SVN_ERR(svn_ra_svn__write_data_log_changed_path(
> - conn, pool,
> - path,
> - change->action,
> - change->copyfrom_path,
> - change->copyfrom_rev,
> - change->node_kind,
> - /* text_modified and props_modified are never
unknown */
> - change->text_modified == svn_tristate_true,
> - change->props_modified == svn_tristate_true));
> - }
> + SVN_ERR(svn_ra_svn__start_list(conn, scratch_pool));
> + SVN_ERR(svn_ra_svn__start_list(conn, scratch_pool));
Ditto.
Cheers,
James
Received on 2016-02-22 16:29:31 CET