/* * 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 #include #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(const char **author, const char **date, const char **message, apr_hash_t *revprops) { svn_string_t *author_s, *date_s, *message_s; *author = *date = *message = NULL; if (revprops) { if ((author_s = svn_hash_gets(revprops, SVN_PROP_REVISION_AUTHOR))) *author = author_s->data; if ((date_s = svn_hash_gets(revprops, SVN_PROP_REVISION_DATE))) *date = date_s->data; if ((message_s = svn_hash_gets(revprops, SVN_PROP_REVISION_LOG))) *message = message_s->data; } } /* 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; }