diff options
Diffstat (limited to 'subversion/libsvn_subr/compat.c')
-rw-r--r-- | subversion/libsvn_subr/compat.c | 159 |
1 files changed, 159 insertions, 0 deletions
diff --git a/subversion/libsvn_subr/compat.c b/subversion/libsvn_subr/compat.c new file mode 100644 index 0000000..2089828 --- /dev/null +++ b/subversion/libsvn_subr/compat.c @@ -0,0 +1,159 @@ +/* + * 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(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; +} |