swigutil_py.c
来自「linux subdivision ying gai ke yi le ba」· C语言 代码 · 共 1,316 行 · 第 1/3 页
C
1,316 行
Py_DECREF(list);
return NULL;
}
/*** Callback Errors ***/
/* Return a Subversion error about a failed callback. */
static svn_error_t *callback_exception_error(void)
{
return svn_error_create(SVN_ERR_SWIG_PY_EXCEPTION_SET, NULL,
"Python callback raised an exception");
}
/* Raise a TypeError exception with MESSAGE, and return a Subversion
error about an invalid return from a callback. */
static svn_error_t *callback_bad_return_error(const char *message)
{
PyErr_SetString(PyExc_TypeError, message);
return svn_error_create(APR_EGENERAL, NULL,
"Python callback returned an invalid object");
}
/*** Editor Wrapping ***/
/* this baton is used for the editor, directory, and file batons. */
typedef struct {
PyObject *editor; /* the editor handling the callbacks */
PyObject *baton; /* the dir/file baton (or NULL for edit baton) */
} item_baton;
static item_baton *make_baton(apr_pool_t *pool,
PyObject *editor,
PyObject *baton)
{
item_baton *newb = apr_palloc(pool, sizeof(*newb));
/* one more reference to the editor. */
Py_INCREF(editor);
/* note: we take the caller's reference to 'baton' */
newb->editor = editor;
newb->baton = baton;
return newb;
}
static svn_error_t *close_baton(void *baton,
const char *method)
{
item_baton *ib = baton;
PyObject *result;
svn_error_t *err;
svn_swig_py_acquire_py_lock();
/* If there is no baton object, then it is an edit_baton, and we should
not bother to pass an object. Note that we still shove a NULL onto
the stack, but the format specified just won't reference it. */
/* ### python doesn't have 'const' on the method name and format */
if ((result = PyObject_CallMethod(ib->editor, (char *)method,
ib->baton ? (char *)"(O)" : NULL,
ib->baton)) == NULL)
{
err = callback_exception_error();
goto finished;
}
/* there is no return value, so just toss this object (probably Py_None) */
Py_DECREF(result);
/* We're now done with the baton. Since there isn't really a free, all
we need to do is note that its objects are no longer referenced by
the baton. */
Py_DECREF(ib->editor);
Py_XDECREF(ib->baton);
#ifdef SVN_DEBUG
ib->editor = ib->baton = NULL;
#endif
err = SVN_NO_ERROR;
finished:
svn_swig_py_release_py_lock();
return err;
}
static svn_error_t *set_target_revision(void *edit_baton,
svn_revnum_t target_revision,
apr_pool_t *pool)
{
item_baton *ib = edit_baton;
PyObject *result;
svn_error_t *err;
svn_swig_py_acquire_py_lock();
/* ### python doesn't have 'const' on the method name and format */
if ((result = PyObject_CallMethod(ib->editor, (char *)"set_target_revision",
(char *)"l", target_revision)) == NULL)
{
err = callback_exception_error();
goto finished;
}
/* there is no return value, so just toss this object (probably Py_None) */
Py_DECREF(result);
err = SVN_NO_ERROR;
finished:
svn_swig_py_release_py_lock();
return err;
}
static svn_error_t *open_root(void *edit_baton,
svn_revnum_t base_revision,
apr_pool_t *dir_pool,
void **root_baton)
{
item_baton *ib = edit_baton;
PyObject *result;
svn_error_t *err;
svn_swig_py_acquire_py_lock();
/* ### python doesn't have 'const' on the method name and format */
if ((result = PyObject_CallMethod(ib->editor, (char *)"open_root",
(char *)"lO&", base_revision,
make_ob_pool, dir_pool)) == NULL)
{
err = callback_exception_error();
goto finished;
}
/* make_baton takes our 'result' reference */
*root_baton = make_baton(dir_pool, ib->editor, result);
err = SVN_NO_ERROR;
finished:
svn_swig_py_release_py_lock();
return err;
}
static svn_error_t *delete_entry(const char *path,
svn_revnum_t revision,
void *parent_baton,
apr_pool_t *pool)
{
item_baton *ib = parent_baton;
PyObject *result;
svn_error_t *err;
svn_swig_py_acquire_py_lock();
/* ### python doesn't have 'const' on the method name and format */
if ((result = PyObject_CallMethod(ib->editor, (char *)"delete_entry",
(char *)"slOO&", path, revision, ib->baton,
make_ob_pool, pool)) == NULL)
{
err = callback_exception_error();
goto finished;
}
/* there is no return value, so just toss this object (probably Py_None) */
Py_DECREF(result);
err = SVN_NO_ERROR;
finished:
svn_swig_py_release_py_lock();
return err;
}
static svn_error_t *add_directory(const char *path,
void *parent_baton,
const char *copyfrom_path,
svn_revnum_t copyfrom_revision,
apr_pool_t *dir_pool,
void **child_baton)
{
item_baton *ib = parent_baton;
PyObject *result;
svn_error_t *err;
svn_swig_py_acquire_py_lock();
/* ### python doesn't have 'const' on the method name and format */
if ((result = PyObject_CallMethod(ib->editor, (char *)"add_directory",
(char *)"sOslO&", path, ib->baton,
copyfrom_path, copyfrom_revision,
make_ob_pool, dir_pool)) == NULL)
{
err = callback_exception_error();
goto finished;
}
/* make_baton takes our 'result' reference */
*child_baton = make_baton(dir_pool, ib->editor, result);
err = SVN_NO_ERROR;
finished:
svn_swig_py_release_py_lock();
return err;
}
static svn_error_t *open_directory(const char *path,
void *parent_baton,
svn_revnum_t base_revision,
apr_pool_t *dir_pool,
void **child_baton)
{
item_baton *ib = parent_baton;
PyObject *result;
svn_error_t *err;
svn_swig_py_acquire_py_lock();
/* ### python doesn't have 'const' on the method name and format */
if ((result = PyObject_CallMethod(ib->editor, (char *)"open_directory",
(char *)"sOlO&", path, ib->baton,
base_revision,
make_ob_pool, dir_pool)) == NULL)
{
err = callback_exception_error();
goto finished;
}
/* make_baton takes our 'result' reference */
*child_baton = make_baton(dir_pool, ib->editor, result);
err = SVN_NO_ERROR;
finished:
svn_swig_py_release_py_lock();
return err;
}
static svn_error_t *change_dir_prop(void *dir_baton,
const char *name,
const svn_string_t *value,
apr_pool_t *pool)
{
item_baton *ib = dir_baton;
PyObject *result;
svn_error_t *err;
svn_swig_py_acquire_py_lock();
/* ### python doesn't have 'const' on the method name and format */
if ((result = PyObject_CallMethod(ib->editor, (char *)"change_dir_prop",
(char *)"Oss#O&", ib->baton, name,
value ? value->data : NULL,
value ? value->len : 0,
make_ob_pool, pool)) == NULL)
{
err = callback_exception_error();
goto finished;
}
/* there is no return value, so just toss this object (probably Py_None) */
Py_DECREF(result);
err = SVN_NO_ERROR;
finished:
svn_swig_py_release_py_lock();
return err;
}
static svn_error_t *close_directory(void *dir_baton,
apr_pool_t *pool)
{
return close_baton(dir_baton, "close_directory");
}
static svn_error_t *add_file(const char *path,
void *parent_baton,
const char *copyfrom_path,
svn_revnum_t copyfrom_revision,
apr_pool_t *file_pool,
void **file_baton)
{
item_baton *ib = parent_baton;
PyObject *result;
svn_error_t *err;
svn_swig_py_acquire_py_lock();
/* ### python doesn't have 'const' on the method name and format */
if ((result = PyObject_CallMethod(ib->editor, (char *)"add_file",
(char *)"sOslO&", path, ib->baton,
copyfrom_path, copyfrom_revision,
make_ob_pool, file_pool)) == NULL)
{
err = callback_exception_error();
goto finished;
}
/* make_baton takes our 'result' reference */
*file_baton = make_baton(file_pool, ib->editor, result);
err = SVN_NO_ERROR;
finished:
svn_swig_py_release_py_lock();
return err;
}
static svn_error_t *open_file(const char *path,
void *parent_baton,
svn_revnum_t base_revision,
apr_pool_t *file_pool,
void **file_baton)
{
item_baton *ib = parent_baton;
PyObject *result;
svn_error_t *err;
svn_swig_py_acquire_py_lock();
/* ### python doesn't have 'const' on the method name and format */
if ((result = PyObject_CallMethod(ib->editor, (char *)"open_file",
(char *)"sOlO&", path, ib->baton,
base_revision,
make_ob_pool, file_pool)) == NULL)
{
err = callback_exception_error();
goto finished;
}
/* make_baton takes our 'result' reference */
*file_baton = make_baton(file_pool, ib->editor, result);
err = SVN_NO_ERROR;
finished:
svn_swig_py_release_py_lock();
return err;
}
static svn_error_t *window_handler(svn_txdelta_window_t *window,
void *baton)
{
PyObject *handler = baton;
PyObject *result;
svn_error_t *err;
svn_swig_py_acquire_py_lock();
if (window == NULL)
{
/* the last call; it closes the handler */
/* invoke the handler with None for the window */
/* ### python doesn't have 'const' on the format */
result = PyObject_CallFunction(handler, (char *)"O", Py_None);
/* we no longer need to refer to the handler object */
Py_DECREF(handler);
}
else
{
/* invoke the handler with the window */
/* ### python doesn't have 'const' on the format */
result = PyObject_CallFunction(handler,
(char *)"O&", make_ob_window, window);
}
if (result == NULL)
{
err = callback_exception_error();
goto finished;
}
/* there is no return value, so just toss this object (probably Py_None) */
Py_DECREF(result);
err = SVN_NO_ERROR;
finished:
svn_swig_py_release_py_lock();
return err;
}
static svn_error_t *apply_textdelta(void *file_baton,
const char *base_checksum,
apr_pool_t *pool,
svn_txdelta_window_handler_t *handler,
void **h_baton)
{
item_baton *ib = file_baton;
PyObject *result;
svn_error_t *err;
svn_swig_py_acquire_py_lock();
/* ### python doesn't have 'const' on the method name and format */
if ((result = PyObject_CallMethod(ib->editor, (char *)"apply_textdelta",
(char *)"(Os)", ib->baton,
base_checksum)) == NULL)
{
err = callback_exception_error();
goto finished;
}
/* Interpret None to mean svn_delta_noop_window_handler. This is much
easier/faster than making code always have to write a NOOP handler
in Python. */
if (result == Py_None)
{
Py_DECREF(result);
*handler = svn_delta_noop_window_handler;
*h_baton = NULL;
}
else
{
/* return the thunk for invoking the handler. the baton takes our
'result' reference, which is the handler. */
*handler = window_handler;
*h_baton = result;
}
err = SVN_NO_ERROR;
finished:
svn_swig_py_release_py_lock();
return err;
}
static svn_error_t *change_file_prop(void *file_baton,
const char *name,
const svn_string_t *value,
apr_pool_t *pool)
{
item_baton *ib = file_baton;
PyObject *result;
svn_error_t *err;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?