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