| /* |
| * ==================================================================== |
| * 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. |
| * ==================================================================== |
| * |
| * svn_client.i: SWIG interface file for svn_client.h |
| */ |
| |
| %include svn_global.swg |
| |
| #if defined(SWIGPYTHON) |
| %module(package="libsvn", moduleimport=SVN_PYTHON_MODULEIMPORT) client |
| #elif defined(SWIGPERL) |
| %module "SVN::_Client" |
| #elif defined(SWIGRUBY) |
| %module "svn::ext::client" |
| #endif |
| |
| %import core.i |
| %import svn_delta.i |
| %import svn_wc.i |
| |
| /* Ignore platform-specific auth functions */ |
| %ignore svn_client_get_windows_simple_provider; |
| |
| /* ----------------------------------------------------------------------- |
| %apply-ing of typemaps defined elsewhere |
| */ |
| |
| %apply Pointer NONNULL { |
| const svn_opt_revision_t *revision, |
| const svn_opt_revision_t *peg_revision |
| }; |
| |
| %apply const char *MAY_BE_NULL { |
| const char *native_eol, |
| const char *comment, |
| const char *relative_to_dir |
| }; |
| |
| #ifdef SWIGRUBY |
| %apply apr_hash_t *HASH_CSTRING_MAYBENULL { |
| apr_hash_t *mimetypes_map |
| } |
| #endif |
| |
| #ifdef SWIGRUBY |
| %apply apr_array_header_t *SOURCES { |
| apr_array_header_t *sources |
| } |
| #endif |
| |
| %apply apr_array_header_t *REVISION_RANGE_LIST { |
| const apr_array_header_t *ranges_to_merge, |
| const apr_array_header_t *revision_ranges |
| } |
| |
| #ifdef SWIGRUBY |
| %apply const char *NOT_NULL { |
| const char *changelist_name |
| }; |
| #endif |
| |
| %apply const apr_array_header_t *STRINGLIST { |
| apr_array_header_t *src_paths |
| } |
| |
| #if defined(SWIGRUBY) || defined(SWIGPERL) |
| %apply const apr_array_header_t *STRINGLIST_MAY_BE_NULL { |
| apr_array_header_t *changelists |
| } |
| #else |
| %apply const apr_array_header_t *STRINGLIST { |
| apr_array_header_t *changelists |
| } |
| #endif |
| |
| %apply apr_array_header_t **OUTPUT_OF_CONST_CHAR_P { |
| apr_array_header_t **paths, |
| apr_array_header_t **suggestions |
| } |
| |
| #ifdef SWIGPYTHON |
| %apply svn_stream_t *WRAPPED_STREAM { svn_stream_t * }; |
| #endif |
| |
| /* ----------------------------------------------------------------------- |
| svn_client_proplist() |
| returns apr_array_header_t * <svn_client_proplist_item_t *> |
| */ |
| |
| /* svn_client_proplist_item_t is used exclusively for svn_client_proplist(). |
| The python bindings convert it to a native python tuple. */ |
| #ifdef SWIGPYTHON |
| %ignore svn_client_proplist_item_t; |
| #endif |
| #ifdef SWIGPYTHON |
| %typemap(argout) apr_array_header_t **props { |
| svn_client_proplist_item_t **ppitem; |
| int i; |
| int nelts = (*$1)->nelts; |
| PyObject *list = PyList_New(nelts); |
| if (list == NULL) |
| SWIG_fail; |
| ppitem = (svn_client_proplist_item_t **)(*$1)->elts; |
| for (i = 0; i < nelts; ++i, ++ppitem) { |
| PyObject *item = PyTuple_New(2); |
| PyObject *name = PyBytes_FromStringAndSize((*ppitem)->node_name->data, |
| (*ppitem)->node_name->len); |
| PyObject *hash = svn_swig_py_prophash_to_dict((*ppitem)->prop_hash); |
| |
| if (item == NULL || name == NULL || hash == NULL) { |
| Py_XDECREF(item); |
| Py_XDECREF(name); |
| Py_XDECREF(hash); |
| Py_DECREF(list); |
| SWIG_fail; |
| } |
| PyTuple_SET_ITEM(item, 0, name); |
| PyTuple_SET_ITEM(item, 1, hash); |
| |
| PyList_SET_ITEM(list, i, item); |
| } |
| %append_output(list); |
| } |
| #endif |
| |
| #ifdef SWIGRUBY |
| %typemap(argout) apr_array_header_t **props { |
| %append_output(svn_swig_rb_apr_array_to_array_proplist_item(*$1)); |
| } |
| |
| %typemap(out) apr_hash_t *prop_hash |
| { |
| $result = svn_swig_rb_prop_hash_to_hash($1); |
| } |
| #endif |
| |
| #ifdef SWIGPERL |
| %typemap(argout) apr_array_header_t **props { |
| %append_output(svn_swig_pl_convert_array(*$1, |
| $descriptor(svn_client_proplist_item_t *))); |
| } |
| |
| %typemap(out) apr_hash_t *prop_hash { |
| $result = svn_swig_pl_prophash_to_hash($1); |
| argvi++; |
| } |
| #endif |
| |
| #if defined(SWIGPYTHON) || defined(SWIGRUBY) |
| %callback_typemap(svn_client_get_commit_log3_t log_msg_func, |
| void *log_msg_baton, |
| svn_swig_py_get_commit_log_func, |
| , |
| svn_swig_rb_get_commit_log_func) |
| #endif |
| |
| %callback_typemap(svn_client_blame_receiver_t receiver, void *receiver_baton, |
| svn_swig_py_client_blame_receiver_func, |
| svn_swig_pl_blame_func, |
| svn_swig_rb_client_blame_receiver_func) |
| |
| #ifdef SWIGRUBY |
| %callback_typemap(svn_wc_notify_func2_t notify_func2, void *notify_baton2, |
| , |
| , |
| svn_swig_rb_notify_func2) |
| #endif |
| |
| #ifdef SWIGPYTHON |
| %callback_typemap(svn_info_receiver_t receiver, void *receiver_baton, |
| svn_swig_py_info_receiver_func, |
| , |
| ) |
| |
| %callback_typemap(svn_changelist_receiver_t callback_func, void *callback_baton, |
| svn_swig_py_changelist_receiver_func, |
| , |
| ) |
| #endif |
| |
| /* ----------------------------------------------------------------------- |
| Callback: svn_client_diff_summarize_func_t |
| svn_client_diff_summarize2() |
| svn_client_diff_summarize() |
| svn_client_diff_summarize_peg2() |
| svn_client_diff_summarize_peg() |
| */ |
| |
| #ifdef SWIGPYTHON |
| #endif |
| |
| #ifdef SWIGPERL |
| %typemap(in) (svn_client_diff_summarize_func_t summarize_func, |
| void *summarize_baton) { |
| $1 = svn_swig_pl_thunk_client_diff_summarize_func; |
| $2 = (void *)$input; |
| } |
| #endif |
| |
| #ifdef SWIGRUBY |
| #endif |
| |
| #ifdef SWIGRUBY |
| %callback_typemap(svn_client_diff_summarize_func_t summarize_func, |
| void *summarize_baton, |
| , |
| , |
| svn_swig_rb_client_diff_summarize_func) |
| |
| %callback_typemap(svn_client_list_func_t list_func, void *baton, |
| , |
| , |
| svn_swig_rb_client_list_func) |
| |
| %callback_typemap(svn_proplist_receiver_t receiver, void *receiver_baton, |
| , |
| , |
| svn_swig_rb_proplist_receiver) |
| |
| %callback_typemap(svn_changelist_receiver_t callback_func, void *callback_baton, |
| , |
| , |
| svn_swig_rb_changelist_receiver) |
| #endif |
| |
| /* ----------------------------------------------------------------------- |
| Callback: svn_client_status_func_t |
| svn_client_status*() |
| svn_client__shelf_save_new_version3() |
| */ |
| |
| #ifdef SWIGPYTHON |
| %callback_typemap(svn_client_status_func_t status_func, |
| void *status_baton, |
| svn_swig_py_client_status_func, |
| , |
| ) |
| |
| %callback_typemap_maybenull(svn_client_status_func_t shelved_func, |
| void *shelved_baton, |
| svn_swig_py_client_status_func, |
| , |
| ) |
| |
| %callback_typemap_maybenull(svn_client_status_func_t not_shelved_func, |
| void *not_shelved_baton, |
| svn_swig_py_client_status_func, |
| , |
| ) |
| #endif |
| |
| |
| /* ----------------------------------------------------------------------- |
| We use 'svn_wc_status_t *' in some custom code, but it isn't in the |
| API anywhere. Thus, SWIG doesn't generate a typemap entry for it. by |
| adding a simple declaration here, SWIG will insert a name for it. |
| FIXME: This may be untrue. See svn_wc_status, etc. |
| */ |
| %types(svn_wc_status_t *); |
| |
| /* We also need SWIG to wrap svn_dirent_t and svn_lock_t for us. They |
| don't appear in any API, but svn_client_ls returns a hash of pointers |
| to dirents and locks. */ |
| %types(svn_dirent_t *); |
| %types(svn_lock_t *); |
| |
| /* FIXME: What on earth is all this CALLBACK_BATON stuff actually trying to do? |
| Does Python need to do anything similar? |
| Why is some of it in svn_client.i and should it apply on a wider scope? |
| */ |
| |
| #ifdef SWIGPERL |
| %apply void *CALLBACK_BATON { |
| void *notify_baton, |
| void *log_msg_baton3, |
| void *cancel_baton |
| } |
| #endif |
| |
| #ifdef SWIGRUBY |
| /* ----------------------------------------------------------------------- |
| CALLBACK_BATON: Do not convert to C object from Ruby object. |
| */ |
| %typemap(in) void *CALLBACK_BATON |
| { |
| $1 = (void *)$input; |
| } |
| |
| %apply void *CALLBACK_BATON |
| { |
| void *notify_baton2, |
| void *log_msg_baton3, |
| void *cancel_baton |
| } |
| #endif |
| |
| /* ----------------------------------------------------------------------- |
| * Convert perl hashes back into apr_hash_t * for setting the config |
| * member of the svn_client_ctx_t. This is an ugly hack, it will |
| * always allocate the new apr_hash_t out of the global current_pool |
| * It would be better to make apr_hash_t's into magic variables in |
| * perl that are tied to the apr_hash_t interface. This would |
| * remove the need to convert to and from perl hashs all the time. |
| */ |
| #ifdef SWIGPERL |
| %typemap(in) apr_hash_t *config { |
| apr_pool_t *pool = svn_swig_pl_make_pool ((SV *)NULL); |
| SPAGAIN; |
| $1 = svn_swig_pl_objs_to_hash_by_name ($input, "svn_config_t *", pool); |
| } |
| |
| %typemap(out) apr_hash_t *config { |
| $result = svn_swig_pl_convert_hash($1, |
| $descriptor(svn_config_t *)); |
| argvi++; |
| } |
| #endif |
| |
| #ifdef SWIGPERL |
| /* FIXME: For svn_commit_info_t too? */ |
| %typemap(argout) svn_client_commit_info_t ** { |
| if ($1 == NULL) { |
| %append_output(&PL_sv_undef); |
| } else { |
| %append_output(SWIG_NewPointerObj(*$1, $*1_descriptor, 0)); |
| } |
| } |
| #endif |
| |
| /* ----------------------------------------------------------------------- |
| * Prop change fields of svn_client_commit_item3_t need to be |
| * converted between array data types. */ |
| |
| #ifdef SWIGPERL |
| %typemap(out) apr_array_header_t *incoming_prop_changes { |
| if ($1) { |
| $result = svn_swig_pl_convert_array($1, $descriptor(svn_prop_t *)); |
| argvi++; |
| } |
| } |
| %typemap(out) apr_array_header_t *outgoing_prop_changes { |
| if ($1) { |
| $result = svn_swig_pl_convert_array($1, $descriptor(svn_prop_t *)); |
| argvi++; |
| } |
| } |
| #endif |
| |
| /* ----------------------------------------------------------------------- |
| * wrap svn_client_create_context */ |
| |
| #ifdef SWIGPERL |
| %typemap(argout) svn_client_ctx_t ** { |
| (*$1)->notify_func = svn_swig_pl_notify_func; |
| (*$1)->notify_baton = (void *) &PL_sv_undef; |
| (*$1)->log_msg_func3 = svn_swig_pl_get_commit_log_func; |
| (*$1)->log_msg_baton3 = (void *) &PL_sv_undef; |
| (*$1)->cancel_func = svn_swig_pl_cancel_func; |
| (*$1)->cancel_baton = (void *) &PL_sv_undef; |
| %append_output(SWIG_NewPointerObj(*$1, $*1_descriptor, 0)); |
| } |
| #endif |
| |
| /* ----------------------------------------------------------------------- */ |
| |
| #ifdef SWIGRUBY |
| %{ |
| #include <apu.h> |
| #include <apr_xlate.h> |
| %} |
| %ignore svn_client_ctx_t::config; |
| %ignore svn_client_create_context; |
| %ignore svn_client_commit_item_create; |
| %ignore svn_client_commit_item2_dup; |
| %ignore svn_client_commit_item3_dup; |
| %ignore svn_client_copy_source_t::path; |
| %ignore svn_client_copy_source_t::revision; |
| %ignore svn_client_copy_source_t::peg_revision; |
| |
| #endif |
| |
| %include svn_client_h.swg |
| |
| /* Ugliness because the constant is typedefed and SWIG ignores it |
| as a result. */ |
| %constant apr_size_t SWIG_SVN_INFO_SIZE_UNKNOWN = -1; |
| |
| #ifdef SWIGPYTHON |
| |
| /* provide Python with access to some thunks. */ |
| %constant svn_cancel_func_t svn_swig_py_cancel_func; |
| %constant svn_client_get_commit_log3_t svn_swig_py_get_commit_log_func; |
| %constant svn_wc_notify_func_t svn_swig_py_notify_func; |
| %constant svn_wc_notify_func2_t svn_swig_py_notify_func2; |
| |
| #endif |
| |
| #ifdef SWIGRUBY |
| %extend svn_client_ctx_t |
| { |
| svn_client_ctx_t(apr_pool_t *pool) { |
| svn_error_t *err; |
| svn_client_ctx_t *self; |
| apr_hash_t *cfg_hash; |
| |
| err = svn_config_get_config(&cfg_hash, NULL, pool); |
| if (err) |
| svn_swig_rb_handle_svn_error(err); |
| |
| err = svn_client_create_context2(&self, cfg_hash, pool); |
| if (err) |
| svn_swig_rb_handle_svn_error(err); |
| return self; |
| }; |
| |
| ~svn_client_ctx_t() { |
| }; |
| } |
| |
| %extend svn_client_commit_item3_t |
| { |
| svn_client_commit_item3_t(apr_pool_t *pool) { |
| svn_error_t *err; |
| const svn_client_commit_item3_t *self; |
| err = svn_client_commit_item_create(&self, pool); |
| if (err) |
| svn_swig_rb_handle_svn_error(err); |
| return (svn_client_commit_item3_t *)self; |
| }; |
| |
| ~svn_client_commit_item3_t() { |
| }; |
| |
| svn_client_commit_item3_t *dup(apr_pool_t *pool) { |
| return svn_client_commit_item3_dup(self, pool); |
| }; |
| } |
| |
| %extend svn_client_copy_source_t |
| { |
| %rename(path) _path; |
| %rename(revision) _revision; |
| %rename(peg_revision) _peg_revision; |
| |
| svn_client_copy_source_t(const char *path, |
| const svn_opt_revision_t *rev, |
| const svn_opt_revision_t *peg_rev, |
| apr_pool_t *pool) { |
| svn_client_copy_source_t *self; |
| svn_opt_revision_t *revision; |
| svn_opt_revision_t *peg_revision; |
| |
| self = apr_palloc(pool, sizeof(*self)); |
| self->path = path ? apr_pstrdup(pool, path) : NULL; |
| |
| revision = apr_palloc(pool, sizeof(*revision)); |
| revision->kind = rev->kind; |
| revision->value.number = rev->value.number; |
| revision->value.date = rev->value.date; |
| self->revision = revision; |
| |
| peg_revision = apr_palloc(pool, sizeof(*peg_revision)); |
| peg_revision->kind = peg_rev->kind; |
| peg_revision->value.number = peg_rev->value.number; |
| peg_revision->value.date = peg_rev->value.date; |
| self->peg_revision = peg_revision; |
| |
| return self; |
| }; |
| |
| ~svn_client_copy_source_t() { |
| }; |
| |
| const char *_path(void) { |
| return self->path; |
| }; |
| |
| const svn_opt_revision_t *_revision(void) { |
| return self->revision; |
| }; |
| |
| const svn_opt_revision_t *_peg_revision(void) { |
| return self->peg_revision; |
| }; |
| } |
| |
| %inline %{ |
| static VALUE |
| svn_client_set_log_msg_func3(svn_client_ctx_t *ctx, |
| svn_client_get_commit_log3_t log_msg_func, |
| void *log_msg_baton, |
| apr_pool_t *pool) |
| { |
| ctx->log_msg_func3 = log_msg_func; |
| ctx->log_msg_baton3 = log_msg_baton; |
| return (VALUE) log_msg_baton; |
| } |
| |
| static VALUE |
| svn_client_set_notify_func2(svn_client_ctx_t *ctx, |
| svn_wc_notify_func2_t notify_func2, |
| void *notify_baton2, |
| apr_pool_t *pool) |
| { |
| ctx->notify_func2 = notify_func2; |
| ctx->notify_baton2 = notify_baton2; |
| return (VALUE)notify_baton2; |
| } |
| |
| static VALUE |
| svn_client_set_cancel_func(svn_client_ctx_t *ctx, |
| svn_cancel_func_t cancel_func, |
| void *cancel_baton, |
| apr_pool_t *pool) |
| { |
| ctx->cancel_func = cancel_func; |
| ctx->cancel_baton = cancel_baton; |
| return (VALUE)cancel_baton; |
| } |
| |
| |
| static VALUE |
| svn_client_set_config(svn_client_ctx_t *ctx, |
| apr_hash_t *config, |
| apr_pool_t *pool) |
| { |
| svn_error_t *err; |
| |
| apr_hash_clear(ctx->config); |
| err = svn_config_copy_config(&ctx->config, config, |
| apr_hash_pool_get(ctx->config)); |
| if (err) |
| svn_swig_rb_handle_svn_error(err); |
| return Qnil; |
| } |
| |
| static svn_error_t * |
| svn_client_get_config(svn_client_ctx_t *ctx, |
| apr_hash_t **cfg_hash, |
| apr_pool_t *pool) |
| { |
| *cfg_hash = ctx->config; |
| return SVN_NO_ERROR; |
| } |
| %} |
| #endif |