summaryrefslogtreecommitdiffstats
path: root/subversion/libsvn_subr/compat.c
diff options
context:
space:
mode:
Diffstat (limited to 'subversion/libsvn_subr/compat.c')
-rw-r--r--subversion/libsvn_subr/compat.c159
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;
+}
OpenPOWER on IntegriCloud