blob: 964361e82a46b3d6b9d54eba91cc9b0438a9272b [file] [log] [blame]
/*
* compat.c : Wrappers and callbacks for compatibility.
*
* ====================================================================
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
* ====================================================================
*/
#include <apr_pools.h>
#include <apr_strings.h>
#include "svn_hash.h"
#include "svn_types.h"
#include "svn_error.h"
#include "svn_compat.h"
#include "svn_props.h"
/* Baton for use with svn_compat_wrap_commit_callback */
struct commit_wrapper_baton {
void *baton;
svn_commit_callback_t callback;
};
/* This implements svn_commit_callback2_t. */
static svn_error_t *
commit_wrapper_callback(const svn_commit_info_t *commit_info,
void *baton, apr_pool_t *pool)
{
struct commit_wrapper_baton *cwb = baton;
if (cwb->callback)
return cwb->callback(commit_info->revision,
commit_info->date,
commit_info->author,
cwb->baton);
return SVN_NO_ERROR;
}
void
svn_compat_wrap_commit_callback(svn_commit_callback2_t *callback2,
void **callback2_baton,
svn_commit_callback_t callback,
void *callback_baton,
apr_pool_t *pool)
{
struct commit_wrapper_baton *cwb = apr_palloc(pool, sizeof(*cwb));
/* Set the user provided old format callback in the baton */
cwb->baton = callback_baton;
cwb->callback = callback;
*callback2_baton = cwb;
*callback2 = commit_wrapper_callback;
}
void
svn_compat_log_revprops_clear(apr_hash_t *revprops)
{
if (revprops)
{
svn_hash_sets(revprops, SVN_PROP_REVISION_AUTHOR, NULL);
svn_hash_sets(revprops, SVN_PROP_REVISION_DATE, NULL);
svn_hash_sets(revprops, SVN_PROP_REVISION_LOG, NULL);
}
}
apr_array_header_t *
svn_compat_log_revprops_in(apr_pool_t *pool)
{
apr_array_header_t *revprops = apr_array_make(pool, 3, sizeof(char *));
APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_AUTHOR;
APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_DATE;
APR_ARRAY_PUSH(revprops, const char *) = SVN_PROP_REVISION_LOG;
return revprops;
}
void
svn_compat_log_revprops_out_string(const svn_string_t **author,
const svn_string_t **date,
const svn_string_t **message,
apr_hash_t *revprops)
{
*author = *date = *message = NULL;
if (revprops)
{
*author = svn_hash_gets(revprops, SVN_PROP_REVISION_AUTHOR);
*date = svn_hash_gets(revprops, SVN_PROP_REVISION_DATE);
*message = svn_hash_gets(revprops, SVN_PROP_REVISION_LOG);
}
}
void
svn_compat_log_revprops_out(const char **author, const char **date,
const char **message, apr_hash_t *revprops)
{
const svn_string_t *author_s, *date_s, *message_s;
svn_compat_log_revprops_out_string(&author_s, &date_s, &message_s,
revprops);
*author = author_s ? author_s->data : NULL;
*date = date_s ? date_s->data : NULL;
*message = message_s ? message_s->data : NULL;
}
/* Baton for use with svn_compat_wrap_log_receiver */
struct log_wrapper_baton {
void *baton;
svn_log_message_receiver_t receiver;
};
/* This implements svn_log_entry_receiver_t. */
static svn_error_t *
log_wrapper_callback(void *baton,
svn_log_entry_t *log_entry,
apr_pool_t *pool)
{
struct log_wrapper_baton *lwb = baton;
if (lwb->receiver && SVN_IS_VALID_REVNUM(log_entry->revision))
{
const char *author, *date, *message;
svn_compat_log_revprops_out(&author, &date, &message,
log_entry->revprops);
return lwb->receiver(lwb->baton,
log_entry->changed_paths2,
log_entry->revision,
author, date, message,
pool);
}
return SVN_NO_ERROR;
}
void
svn_compat_wrap_log_receiver(svn_log_entry_receiver_t *receiver2,
void **receiver2_baton,
svn_log_message_receiver_t receiver,
void *receiver_baton,
apr_pool_t *pool)
{
struct log_wrapper_baton *lwb = apr_palloc(pool, sizeof(*lwb));
/* Set the user provided old format callback in the baton. */
lwb->baton = receiver_baton;
lwb->receiver = receiver;
*receiver2_baton = lwb;
*receiver2 = log_wrapper_callback;
}