Rev 1045: Finish ra extension. in file:///data/jelmer/bzr-svn/cext/
Jelmer Vernooij
jelmer at samba.org
Mon Jun 2 16:05:56 BST 2008
At file:///data/jelmer/bzr-svn/cext/
------------------------------------------------------------
revno: 1045
revision-id: jelmer at samba.org-20080602150555-pah78gm658kdwsww
parent: jelmer at samba.org-20080531210457-dfzpvviosciqzlr8
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: cext
timestamp: Mon 2008-06-02 17:05:55 +0200
message:
Finish ra extension.
modified:
ra.c ra.pyx-20080313140933-qybkqaxe3m4mcll7-1
repos.c repos.pyx-20080314114432-g2b5lqe776tkbl4k-1
util.c util.c-20080531154025-s8ef6ej9tytsnkkw-1
util.h util.h-20080531154025-s8ef6ej9tytsnkkw-2
=== modified file 'ra.c'
--- a/ra.c 2008-05-31 21:04:57 +0000
+++ b/ra.c 2008-06-02 15:05:55 +0000
@@ -30,6 +30,7 @@
PyAPI_DATA(PyTypeObject) RemoteAccess_Type;
PyAPI_DATA(PyTypeObject) Auth_Type;
PyAPI_DATA(PyTypeObject) AuthProvider_Type;
+PyAPI_DATA(PyTypeObject) TxDeltaWindowHandler_Type;
typedef struct {
PyObject_HEAD
@@ -50,18 +51,18 @@
return NULL;
}
-PyObject *pyify_lock(svn_lock_t *lock)
+PyObject *pyify_lock(const svn_lock_t *lock)
{
return Py_None; /* FIXME */
}
svn_error_t *py_lock_func (void *baton, const char *path, int do_lock,
- svn_lock_t *lock, svn_error_t *ra_err,
+ const svn_lock_t *lock, svn_error_t *ra_err,
apr_pool_t *pool)
{
PyObject *py_ra_err = Py_None, *ret;
if (ra_err != NULL) {
- py_ra_err = SubversionException(ra_err.apr_err, ra_err.message);
+ py_ra_err = PyErr_NewSubversionException(ra_err);
}
ret = PyObject_CallFunction((PyObject *)baton, "zbOO", path, do_lock,
pyify_lock(lock), py_ra_err);
@@ -138,7 +139,7 @@
PyObject *lock_token = Py_None;
ReporterObject *reporter = (ReporterObject *)self;
- if (!PyArg_ParseTuple(args, "sslb|O", &path, &url, &start_empty, &lock_token))
+ if (!PyArg_ParseTuple(args, "sslb|O", &path, &url, &revision, &start_empty, &lock_token))
return NULL;
if (!check_error(reporter->reporter->link_path(reporter->report_baton, path, url,
@@ -184,6 +185,13 @@
apr_pool_destroy(reporter->pool);
}
+PyTypeObject Reporter_Type = {
+ PyObject_HEAD_INIT(NULL) 0,
+ .tp_name = "ra.Reporter",
+ .tp_methods = reporter_methods,
+ .tp_dealloc = reporter_dealloc,
+};
+
typedef struct {
PyObject_HEAD
const svn_delta_editor_t *editor;
@@ -202,22 +210,37 @@
return (PyObject *)obj;
}
+static void py_editor_dealloc(PyObject *self)
+{
+ EditorObject *editor = (EditorObject *)self;
+ apr_pool_destroy(editor->pool);
+}
+
+
+
+typedef struct {
+ PyObject_HEAD
+ svn_txdelta_window_handler_t txdelta_handler;
+ void *txdelta_baton;
+} TxDeltaWindowHandlerObject;
+
static PyObject *py_file_editor_apply_textdelta(PyObject *self, PyObject *args)
{
EditorObject *editor = (EditorObject *)self;
char *c_base_checksum = NULL;
svn_txdelta_window_handler_t txdelta_handler;
void *txdelta_baton;
+ TxDeltaWindowHandlerObject *py_txdelta;
if (!PyArg_ParseTuple(args, "|z", &c_base_checksum))
return NULL;
if (!check_error(editor->editor->apply_textdelta(editor->baton,
c_base_checksum, editor->pool,
&txdelta_handler, &txdelta_baton)))
return NULL;
- py_txdelta = TxDeltaWindowHandler()
- py_txdelta.txdelta = txdelta_handler;
- py_txdelta.txbaton = txdelta_baton;
- return py_txdelta;
+ py_txdelta = PyObject_New(TxDeltaWindowHandlerObject, &TxDeltaWindowHandler_Type);
+ py_txdelta->txdelta_handler = txdelta_handler;
+ py_txdelta->txdelta_baton = txdelta_baton;
+ return (PyObject *)py_txdelta;
}
static PyObject *py_file_editor_change_prop(PyObject *self, PyObject *args)
@@ -252,6 +275,13 @@
{ NULL }
};
+PyTypeObject FileEditor_Type = {
+ PyObject_HEAD_INIT(NULL) 0,
+ .tp_name = "ra.FileEditor",
+ .tp_methods = py_file_editor_methods,
+ .tp_dealloc = py_editor_dealloc,
+};
+
static PyObject *py_dir_editor_delete_entry(PyObject *self, PyObject *args)
{
EditorObject *editor = (EditorObject *)self;
@@ -313,6 +343,8 @@
if (!PyArg_ParseTuple(args, "sz#", &name, &c_value.data, &c_value.len))
return NULL;
+ p_c_value = &c_value;
+
if (!check_error(editor->editor->change_dir_prop(editor->baton, name,
p_c_value, editor->pool)))
return NULL;
@@ -408,6 +440,13 @@
{ NULL }
};
+PyTypeObject DirectoryEditor_Type = {
+ PyObject_HEAD_INIT(NULL) 0,
+ .tp_name = "ra.DirEditor",
+ .tp_methods = py_dir_editor_methods,
+ .tp_dealloc = py_editor_dealloc,
+};
+
static PyObject *py_editor_set_target_revision(PyObject *self, PyObject *args)
{
int target_revision;
@@ -466,11 +505,12 @@
{ NULL }
};
-static void py_editor_dealloc(PyObject *self)
-{
- EditorObject *editor = (EditorObject *)self;
- apr_pool_destroy(editor->pool);
-}
+PyTypeObject Editor_Type = {
+ PyObject_HEAD_INIT(NULL) 0,
+ .tp_name = "ra.Editor",
+ .tp_methods = py_editor_methods,
+ .tp_dealloc = py_editor_dealloc,
+};
/**
* Get libsvn_ra version information.
@@ -1023,7 +1063,7 @@
apr_pool_t *temp_pool;
svn_string_t *val_string;
- if (!PyArg_ParseTuple(args, "ss#", &name, &value, &vallen))
+ if (!PyArg_ParseTuple(args, "lss#", &rev, &name, &value, &vallen))
return NULL;
temp_pool = Pool(ra->pool);
val_string = svn_string_ncreate(value, vallen, temp_pool);
@@ -1123,7 +1163,7 @@
svn_node_kind_t kind;
apr_pool_t *temp_pool;
- if (!PyArg_ParseTuple(args, "sl", &path, revision))
+ if (!PyArg_ParseTuple(args, "sl", &path, &revision))
return NULL;
temp_pool = Pool(ra->pool);
RUN_SVN_WITH_POOL(temp_pool,
@@ -1322,6 +1362,39 @@
return PyString_FromFormat("RemoteAccess(%s)", PyString_AsString(ra->url));
}
+static PyMethodDef ra_methods[] = {
+ { "get_file_revs", ra_get_file_revs, METH_VARARGS, NULL },
+ { "get_locations", ra_get_locations, METH_VARARGS, NULL },
+ { "get_locks", ra_get_locks, METH_VARARGS, NULL },
+ { "lock", ra_lock, METH_VARARGS, NULL },
+ { "unlock", ra_unlock, METH_VARARGS, NULL },
+ { "has_capability", has_capability, METH_VARARGS, NULL },
+ { "check_path", ra_check_path, METH_VARARGS, NULL },
+ { "get_lock", ra_get_lock, METH_VARARGS, NULL },
+ { "get_dir", ra_get_dir, METH_VARARGS, NULL },
+ { "change_rev_prop", ra_change_rev_prop, METH_VARARGS, NULL },
+ { "get_commit_editor", (PyCFunction)get_commit_editor, METH_VARARGS|METH_KEYWORDS, NULL },
+ { "rev_proplist", ra_rev_proplist, METH_VARARGS, NULL },
+ { "replay", ra_replay, METH_VARARGS, NULL },
+ { "do_switch", ra_do_switch, METH_VARARGS, NULL },
+ { "do_update", ra_do_update, METH_VARARGS, NULL },
+ { "get_repos_root", (PyCFunction)ra_get_repos_root, METH_VARARGS|METH_NOARGS, NULL },
+ { "get_log", (PyCFunction)ra_get_log, METH_VARARGS|METH_KEYWORDS, NULL },
+ { "get_latest_revnum", (PyCFunction)ra_get_latest_revnum, METH_NOARGS, NULL },
+ { "reparent", ra_reparent, METH_VARARGS, NULL },
+ { "get_uuid", (PyCFunction)ra_get_uuid, METH_NOARGS, NULL },
+ { NULL }
+};
+
+PyTypeObject RemoteAccess_Type = {
+ PyObject_HEAD_INIT(NULL) 0,
+ .tp_name = "ra.RemoteAccess",
+ .tp_new = ra_new,
+ .tp_dealloc = ra_dealloc,
+ .tp_repr = ra_repr,
+ .tp_methods = ra_methods,
+};
+
typedef struct {
PyObject_HEAD
apr_pool_t *pool;
@@ -1334,6 +1407,11 @@
apr_pool_destroy(auth_provider->pool);
}
+PyTypeObject AuthProvider_Type = {
+ PyObject_HEAD_INIT(NULL) 0,
+ .tp_name = "ra.AuthProvider",
+ .tp_dealloc = auth_provider_dealloc,
+};
static PyObject *auth_init(PyTypeObject *type, PyObject *args, PyObject *kwargs)
{
@@ -1402,6 +1480,14 @@
Py_DECREF(auth->providers);
}
+PyTypeObject Auth_Type = {
+ PyObject_HEAD_INIT(NULL) 0,
+ .tp_new = auth_init,
+ .tp_dealloc = auth_dealloc,
+ .tp_name = "ra.Auth",
+ .tp_methods = auth_methods,
+};
+
static svn_error_t *py_username_prompt(svn_auth_cred_username_t **cred, void *baton, const char *realm, int may_save, apr_pool_t *pool)
{
PyObject *fn = (PyObject *)baton, *ret;
@@ -1448,13 +1534,13 @@
if (!PyArg_ParseTuple(args, "Oi", &prompt_func, &retry_limit))
return NULL;
- auth = AuthProviderObject();
+ auth = PyObject_New(AuthProviderObject, &AuthProvider_Type);
auth->pool = Pool(NULL);
svn_auth_get_simple_prompt_provider (&auth->provider, py_simple_prompt, (void *)prompt_func, retry_limit, auth->pool);
return (PyObject *)auth;
}
-static svn_error_t *py_ssl_server_trust_prompt(svn_auth_cred_ssl_server_trust_t **cred, void *baton, const char *realm, apr_uint32_t failures, svn_auth_ssl_server_cert_info_t *cert_info, svn_boolean_t may_save, apr_pool_t *pool)
+static svn_error_t *py_ssl_server_trust_prompt(svn_auth_cred_ssl_server_trust_t **cred, void *baton, const char *realm, apr_uint32_t failures, const svn_auth_ssl_server_cert_info_t *cert_info, svn_boolean_t may_save, apr_pool_t *pool)
{
PyObject *fn = (PyObject *)baton;
PyObject *ret;
@@ -1568,12 +1654,13 @@
{
unsigned char digest[16];
apr_pool_t *pool = Pool(NULL);
- PyObject *stream, *handler;
+ PyObject *stream;
+ TxDeltaWindowHandlerObject *py_txdelta;
- if (!PyArg_ParseTuple(args, "OO", &stream, &handle))
+ if (!PyArg_ParseTuple(args, "OO", &stream, &py_txdelta))
return NULL;
- if (!check_error(svn_txdelta_send_stream(new_py_stream(pool, stream), handler.txdelta, handler.txbaton, (unsigned char *)digest, pool))) {
+ if (!check_error(svn_txdelta_send_stream(new_py_stream(pool, stream), py_txdelta->txdelta_handler, py_txdelta->txdelta_baton, (unsigned char *)digest, pool))) {
apr_pool_destroy(pool);
return NULL;
}
@@ -1581,10 +1668,15 @@
return PyString_FromStringAndSize((char *)digest, 16);
}
-static PyMethodDef ra_methods[] = {
+static PyMethodDef ra_module_methods[] = {
{ "version", (PyCFunction)version, METH_NOARGS, NULL },
+ { "txdelta_send_stream", (PyCFunction)txdelta_send_stream, METH_VARARGS, NULL },
{ "get_ssl_client_cert_pw_file_provider", (PyCFunction)get_ssl_client_cert_pw_file_provider, METH_NOARGS, NULL },
{ "get_ssl_client_cert_file_provider", (PyCFunction)get_ssl_client_cert_file_provider, METH_NOARGS, NULL },
+ { "get_ssl_server_trust_file_provider", (PyCFunction)get_ssl_server_trust_file_provider, METH_NOARGS, NULL },
+ { "get_simple_provider", (PyCFunction)get_simple_provider, METH_NOARGS, NULL },
+ { "get_username_prompt_provider", (PyCFunction)get_username_prompt_provider, METH_VARARGS, NULL },
+ { "get_simple_prompt_provider", (PyCFunction)get_simple_prompt_provider, METH_VARARGS, NULL },
{ NULL }
};
@@ -1593,7 +1685,7 @@
PyObject *mod;
apr_initialize();
- mod = Py_InitModule3("ra", ra_methods, "Remote Access");
+ mod = Py_InitModule3("ra", ra_module_methods, "Remote Access");
if (mod == NULL)
return;
}
=== modified file 'repos.c'
--- a/repos.c 2008-05-31 04:45:50 +0000
+++ b/repos.c 2008-06-02 15:05:55 +0000
@@ -21,125 +21,250 @@
#include <svn_fs.h>
#include <svn_repos.h>
-from apr cimport apr_pool_t, apr_hash_t, apr_pool_destroy
-from types cimport svn_error_t, svn_boolean_t, svn_cancel_func_t, svn_stream_t, svn_node_kind_t, svn_revnum_t, svn_filesize_t
-
-from core cimport Pool, check_error, new_py_stream, py_cancel_func
-
-def create(path, config=None, fs_config=None):
- cdef svn_repos_t *repos
- cdef apr_pool_t *pool
- cdef apr_hash_t *hash_config, *hash_fs_config
- pool = Pool(NULL)
- hash_config = NULL # FIXME
- hash_fs_config = NULL # FIXME
- check_error(svn_repos_create(&repos, path, "", "",
- hash_config, hash_fs_config, pool))
- apr_pool_destroy(pool)
- return Repository(path)
-
-cdef class Repository:
- cdef apr_pool_t *pool
- cdef svn_repos_t *repos
- def __init__(self, path):
- self.pool = Pool(NULL)
- check_error(svn_repos_open(&self.repos, path, self.pool))
-
- def __dealloc__(self):
- apr_pool_destroy(self.pool)
-
- def load_fs(self, dumpstream, feedback_stream, uuid_action,
- parent_dir="", use_pre_commit_hook=False,
- use_post_commit_hook=False,
- cancel_func=None):
- cdef apr_pool_t *temp_pool
- temp_pool = Pool(self.pool)
- check_error(svn_repos_load_fs2(self.repos,
- new_py_stream(temp_pool, dumpstream),
- new_py_stream(temp_pool, feedback_stream),
- uuid_action, parent_dir, use_pre_commit_hook,
- use_post_commit_hook, py_cancel_func, <void *>cancel_func,
- self.pool))
- apr_pool_destroy(temp_pool)
-
- def fs(self):
- return FileSystem(self)
-
-cdef class FileSystemRoot:
- cdef svn_fs_root_t *root
- cdef apr_pool_t *pool
-
- def __dealloc__(self):
- if self.pool != NULL:
- apr_pool_destroy(self.pool)
-
- def check_path(self, char *path):
- cdef svn_node_kind_t kind
- cdef apr_pool_t *pool
- pool = Pool(NULL)
- check_error(svn_fs_check_path(&kind, self.root, path, pool))
- apr_pool_destroy(pool)
- return kind
-
- def make_dir(self, char *path):
- cdef apr_pool_t *pool
- pool = Pool(self.pool)
- check_error(svn_fs_make_dir(self.root, path, pool))
- apr_pool_destroy(pool)
-
- def delete(self, char *path):
- cdef apr_pool_t *pool
- pool = Pool(self.pool)
- check_error(svn_fs_delete(self.root, path, pool))
- apr_pool_destroy(pool)
-
- def copy(self, char *from_path, FileSystemRoot to_root, char *to_path):
- cdef apr_pool_t *pool
- pool = Pool(self.pool)
- check_error(svn_fs_copy(self.root, from_path, to_root.root, to_path, pool))
- apr_pool_destroy(pool)
-
- def file_length(self, char *path):
- cdef apr_pool_t *pool
- cdef svn_filesize_t length
- pool = Pool(self.pool)
- check_error(svn_fs_file_length(&length, self.root, path, pool))
- apr_pool_destroy(pool)
- return length
-
- def file_md5_checksum(self, char *path):
- cdef char digest[64]
- cdef apr_pool_t *pool
- pool = Pool(NULL)
- check_error(svn_fs_file_md5_checksum(<unsigned char*>digest, self.root, path, pool))
- ret = digest
- apr_pool_destroy(pool)
- return ret
-
- def file_contents(self, char *path):
- cdef apr_pool_t *pool
- cdef svn_stream_t *stream
- pool = Pool(self.pool)
- check_error(svn_fs_file_contents(&stream, self.root, path, pool))
- apr_pool_destroy(pool)
- return None # FIXME
-
- def is_txn_root(self):
- return svn_fs_is_txn_root(self.root)
-
- def is_revision_root(self):
- return svn_fs_is_revision_root(self.root)
-
- def close(self):
- svn_fs_close_root(self.root)
-
-
-cdef class FileSystem:
- cdef svn_fs_t *fs
- cdef apr_pool_t *pool
- def __init__(self, Repository repos):
- self.fs = svn_repos_fs(repos.repos)
- self.pool = Pool(repos.pool)
+typedef struct {
+ PyObject_HEAD
+ apr_pool_t *pool;
+ svn_repos_t *repos;
+} RepositoryObject;
+
+static PyObject *repos_create(PyObject *self, PyObject *args)
+{
+ char *path;
+ PyObject *config=Py_None, *fs_config=Py_None;
+ svn_repos_t *repos;
+ apr_pool_t *pool;
+ apr_hash_t *hash_config, *hash_fs_config;
+ RepositoryObject *ret;
+
+ if (!PyArg_ParseTuple(args, "s|OO", &path, &config, &fs_config))
+ return NULL;
+
+ pool = Pool(NULL);
+ hash_config = NULL; /* FIXME */
+ hash_fs_config = NULL; /* FIXME */
+ RUN_SVN_WITH_POOL(pool, svn_repos_create(&repos, path, "", "",
+ hash_config, hash_fs_config, pool));
+
+ ret = PyObject_New(RepositoryObject, &Repository_Type);
+ if (ret == NULL)
+ return NULL;
+
+ ret->pool = pool;
+ ret->repos = repos;
+
+ return ret;
+}
+
+static void repos_dealloc(PyObject *self)
+{
+ RepositoryObject *repos = (RepositoryObject *)self;
+
+ apr_pool_destroy(repos->pool);
+}
+
+static PyObject *repos_init(PyTypeObject *type, PyObject *args, PyObject *kwargs)
+{
+ char *path;
+ char *kwnames[] = { "path", NULL };
+ RepositoryObject *ret;
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", kwnames, &path))
+ return NULL;
+
+ ret = PyObject_New(RepositoryObject, &Repository_Type);
+ if (ret == NULL)
+ return NULL;
+
+ ret->pool = Pool(NULL);
+ if (!check_error(svn_repos_open(&self.repos, path, self.pool))) {
+ apr_pool_destroy(ret->pool);
+ PyObject_Del(ret);
+ return NULL;
+ }
+}
+
+static PyObject *repos_load_fs(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+ const char *parent_dir = "";
+ PyObject *dumpstream, *feedback_stream, *cancel_func = Py_None;
+ bool use_pre_commit_hook = false, use_post_commit_hook = false;
+ char *kwnames[] = { "dumpstream", "feedback_stream", "uuid_action",
+ "parent_dir", "use_pre_commit_hook",
+ "use_post_commit_hook", "cancel_func", NULL };
+ apr_pool_t *temp_pool;
+ if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOi|sbbO", kwnames,
+ &dumpstream, &feedback_stream, &uuid_action,
+ &parent_dir, &use_pre_commit_hook,
+ &use_post_commit_hook,
+ &cancel_func))
+ return NULL;
+
+ temp_pool = Pool(self.pool);
+ RUN_SVN_WITH_POOL(temp_pool, svn_repos_load_fs2(self.repos,
+ new_py_stream(temp_pool, dumpstream),
+ new_py_stream(temp_pool, feedback_stream),
+ uuid_action, parent_dir, use_pre_commit_hook,
+ use_post_commit_hook, py_cancel_func, (void *)cancel_func,
+ self.pool));
+ apr_pool_destroy(temp_pool);
+ return Py_None;
+}
+
+static PyObject *repos_fs(PyObject *self)
+{
+ FileSystemObject *ret = PyObject_New(FileSystemObject, &FileSystem_Type);
+
+ if (ret == NULL)
+ return NULL;
+
+ ret->fs = svn_repos_fs(self->repos);
+ ret->pool = Pool(self->pool);
+ return (PyObject *)ret;
+}
+
+typedef struct {
+ PyObject_HEAD
+ svn_fs_root_t *root;
+ apr_pool_t *pool;
+} FileSystemRootObject;
+
+static void fsroot_dealloc(PyObject *obj)
+{
+ FileSystemRootObject *fsroot = (FileSystemRootObject *)obj;
+ apr_pool_destroy(fsroot->pool);
+}
+
+static PyObject *repos_check_path(PyObject *self, PyObject *args)
+{
+ char *path;
+ svn_node_kind_t kind;
+ apr_pool_t *pool;
+
+ if (!PyArg_ParseTuple(args, "s", &path))
+ return NULL;
+
+ pool = Pool(NULL);
+ RUN_SVN_WITH_POOL(pool, svn_fs_check_path(&kind, self.root, path, pool));
+ apr_pool_destroy(pool)
+ return kind;
+}
+
+static PyObject *repos_make_dir(PyObject *self, PyObject *args)
+{
+ char *path;
+ apr_pool_t *pool;
+
+ if (!PyArg_ParseTuple(args, "s", &path))
+ return NULL;
+
+ pool = Pool(self.pool);
+ RUN_SVN_WITH_POOL(pool, svn_fs_make_dir(self.root, path, pool));
+ apr_pool_destroy(pool);
+
+ return Py_None;
+}
+
+static PyObject *repos_delete(PyObject *self, PyObject *args)
+{
+ char *path;
+ apr_pool_t *pool
+
+ if (!PyArg_ParseTuple(args, "s", &path))
+ return NULL;
+
+ pool = Pool(self.pool);
+ RUN_SVN_WITH_POOL(pool, svn_fs_delete(self.root, path, pool));
+ apr_pool_destroy(pool);
+
+ return Py_None;
+}
+
+static PyObject *repos_copy(PyObject *self, PyObject *args)
+{
+ char *from_path;
+ PyObject *to_root;
+ char *to_path;
+ apr_pool_t *pool
+
+ if (!PyArg_ParseTuple(args, "sOs", &from_path, &to_root, &to_path))
+ return NULL;
+
+ pool = Pool(self.pool)
+ RUN_SVN_WITH_POOL(pool,
+ svn_fs_copy(self.root, from_path, to_root.root, to_path, pool));
+ apr_pool_destroy(pool);
+
+ return Py_None;
+}
+
+static PyObject *repos_file_length(PyObject *self, PyObject *args)
+{
+ char *path;
+ apr_pool_t *pool;
+ svn_filesize_t length;
+
+ if (!PyArg_ParseTuple(args, "s", &path))
+ return NULL;
+
+ pool = Pool(self.pool);
+ RUN_SVN_WITH_POOL(pool, svn_fs_file_length(&length, self.root, path, pool));
+ apr_pool_destroy(pool);
+ return PyLong_FromLong(length);
+}
+
+static PyObject *repos_file_md5_checksum(PyObject *self, PyObject *args)
+{
+ char *path;
+ char digest[64];
+ apr_pool_t *pool;
+
+ if (!PyArg_ParseTuple(args, "s", &path))
+ return NULL;
+
+ pool = Pool(NULL);
+ RUN_SVN_WITH_POOL(pool,
+ svn_fs_file_md5_checksum((unsigned char*)digest, self.root, path, pool));
+ ret = PyString_FromStringAndSize(digest, 64);
+ apr_pool_destroy(pool);
+ return ret;
+}
+
+static PyObject *repos_file_contents(PyObject *self, PyObject *args)
+{
+ apr_pool_t *pool;
+ svn_stream_t *stream;
+ char *path;
+
+ if (!PyArg_ParseTuple(args, "s", &path))
+ return NULL;
+
+ pool = Pool(self.pool);
+ RUN_SVN_WITH_POOL(pool, svn_fs_file_contents(&stream, self.root, path, pool));
+ apr_pool_destroy(pool);
+ return Py_None; /* FIXME */
+}
+
+static PyObject *repos_is_txn_root(PyObject *self)
+{
+ return PyBool_FromLong(svn_fs_is_txn_root(self.root));
+}
+
+static PyObject *repos_is_revision_root(PyObject *self)
+{
+ return PyBool_FromLong(svn_fs_is_revision_root(self.root));
+}
+
+static PyObject *repos_close(PyObject *self)
+{
+ return svn_fs_close_root(self.root);
+}
+
+typedef struct {
+ PyObject_HEAD
+ svn_fs_t *fs;
+ apr_pool_t *pool;
+} FileSystemObject;
+
def __dealloc__(self):
apr_pool_destroy(self.pool)
@@ -164,12 +289,15 @@
check_error(svn_fs_revision_root(&ret.root, self.fs, rev, ret.pool))
return ret
-
-LOAD_UUID_DEFAULT = 0
-LOAD_UUID_IGNORE = 1
-LOAD_UUID_FORCE = 2
-
void initrepos(void)
{
apr_initialize();
+
+ mod = Py_InitModule3("repos", NULL, "Local repository management");
+ if (mod == NULL)
+ return;
+
+ PyModule_AddObject(mod, "LOAD_UUID_DEFAULT", PyLong_FromLong(0));
+ PyModule_AddObject(mod, "LOAD_UUID_IGNORE", PyLong_FromLong(1));
+ PyModule_AddObject(mod, "LOAD_UUID_FORCE", PyLong_FromLong(2));
}
=== modified file 'util.c'
--- a/util.c 2008-05-31 21:04:57 +0000
+++ b/util.c 2008-06-02 15:05:55 +0000
@@ -37,6 +37,11 @@
return ret;
}
+PyObject *PyErr_NewSubversionException(svn_error_t *error)
+{
+ return NULL; /* FIXME */
+}
+
void PyErr_SetSubversionException(svn_error_t *error)
{
/* FIXME */
=== modified file 'util.h'
--- a/util.h 2008-05-31 21:04:57 +0000
+++ b/util.h 2008-06-02 15:05:55 +0000
@@ -40,5 +40,6 @@
PyObject *wrap_lock(svn_lock_t *lock);
apr_array_header_t *revnum_list_to_apr_array(apr_pool_t *pool, PyObject *l);
svn_stream_t *new_py_stream(apr_pool_t *pool, PyObject *py);
+PyObject *PyErr_NewSubversionException(svn_error_t *error);
#endif /* _BZR_SVN_UTIL_H_ */
More information about the bazaar-commits
mailing list