Rev 1076: Simplify C code in a couple of places, fix busy handling. in file:///data/jelmer/bzr-svn/cext/

Jelmer Vernooij jelmer at samba.org
Wed Jun 4 22:20:42 BST 2008


At file:///data/jelmer/bzr-svn/cext/

------------------------------------------------------------
revno: 1076
revision-id: jelmer at samba.org-20080604212042-2v93z80f0oh3vrpt
parent: jelmer at samba.org-20080604205519-t9a8098tq8g2cvwk
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: cext
timestamp: Wed 2008-06-04 23:20:42 +0200
message:
  Simplify C code in a couple of places, fix busy handling.
modified:
  core.c                         core.pyx-20080313210413-17k59slolpfe5kdq-1
  editor.c                       editor.c-20080602191336-frj7az1sdk13o1tw-1
  editor.h                       editor.h-20080602191336-frj7az1sdk13o1tw-2
  ra.c                           ra.pyx-20080313140933-qybkqaxe3m4mcll7-1
  util.c                         util.c-20080531154025-s8ef6ej9tytsnkkw-1
  wc.c                           wc.pyx-20080313142018-10l8l23vha2j9e6b-1
=== modified file 'core.c'
--- a/core.c	2008-06-03 05:32:05 +0000
+++ b/core.c	2008-06-04 21:20:42 +0000
@@ -131,10 +131,10 @@
 	if (mod == NULL)
 		return;
 
-	PyModule_AddObject(mod, "NODE_DIR", PyInt_FromLong(svn_node_dir));
-	PyModule_AddObject(mod, "NODE_FILE", PyInt_FromLong(svn_node_file));
-	PyModule_AddObject(mod, "NODE_UNKNOWN", PyInt_FromLong(svn_node_unknown));
-	PyModule_AddObject(mod, "NODE_NONE", PyInt_FromLong(svn_node_none));
+	PyModule_AddIntConstant(mod, "NODE_DIR", svn_node_dir);
+	PyModule_AddIntConstant(mod, "NODE_FILE", svn_node_file);
+	PyModule_AddIntConstant(mod, "NODE_UNKNOWN", svn_node_unknown);
+	PyModule_AddIntConstant(mod, "NODE_NONE", svn_node_none);
 
 	PyModule_AddObject(mod, "SubversionException", 
 					   PyErr_NewException("core.SubversionException", NULL, NULL));

=== modified file 'editor.c'
--- a/editor.c	2008-06-04 20:55:19 +0000
+++ b/editor.c	2008-06-04 21:20:42 +0000
@@ -56,6 +56,7 @@
 	PyObject_HEAD_INIT(&PyType_Type) 0,
 	.tp_name = "ra.TxDeltaWindowHandler",
 	.tp_call = NULL, /* FIXME */
+	.tp_dealloc = (destructor)PyObject_Del
 };
 
 static PyObject *py_file_editor_apply_textdelta(PyObject *self, PyObject *args)
@@ -65,6 +66,12 @@
 	svn_txdelta_window_handler_t txdelta_handler;
 	void *txdelta_baton;
 	TxDeltaWindowHandlerObject *py_txdelta;
+
+	if (!FileEditor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
 	if (!PyArg_ParseTuple(args, "|z", &c_base_checksum))
 		return NULL;
 	if (!check_error(editor->editor->apply_textdelta(editor->baton,
@@ -82,6 +89,12 @@
 	EditorObject *editor = (EditorObject *)self;
 	char *name;
    	svn_string_t c_value;
+
+	if (!FileEditor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
 	if (!PyArg_ParseTuple(args, "sz#", &name, &c_value.data, &c_value.len))
 		return NULL;
 	if (!check_error(editor->editor->change_file_prop(editor->baton, name, 
@@ -94,6 +107,12 @@
 {
 	EditorObject *editor = (EditorObject *)self;
 	char *c_checksum = NULL;
+
+	if (!FileEditor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
 	if (!PyArg_ParseTuple(args, "|z", &c_checksum))
 		return NULL;
 	if (!check_error(editor->editor->close_file(editor->baton, c_checksum, 
@@ -113,7 +132,7 @@
 	PyObject_HEAD_INIT(&PyType_Type) 0,
 	.tp_name = "ra.FileEditor",
 	.tp_methods = py_file_editor_methods,
-	.tp_dealloc = PyObject_Del,
+	.tp_dealloc = (destructor)PyObject_Del,
 };
 
 static PyObject *py_dir_editor_delete_entry(PyObject *self, PyObject *args)
@@ -122,6 +141,11 @@
 	char *path; 
 	svn_revnum_t revision = -1;
 
+	if (!DirectoryEditor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
 	if (!PyArg_ParseTuple(args, "s|l", &path, &revision))
 		return NULL;
 
@@ -140,6 +164,11 @@
    	void *child_baton;
 	EditorObject *editor = (EditorObject *)self;
 
+	if (!DirectoryEditor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
 	if (!PyArg_ParseTuple(args, "s|zl", &path, &copyfrom_path, &copyfrom_rev))
 		return NULL;
 
@@ -157,6 +186,12 @@
 	EditorObject *editor = (EditorObject *)self;
 	int base_revision=-1;
 	void *child_baton;
+
+	if (!DirectoryEditor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
 	if (!PyArg_ParseTuple(args, "s|l", &path, &base_revision))
 		return NULL;
 
@@ -174,6 +209,11 @@
 	svn_string_t c_value, *p_c_value;
 	EditorObject *editor = (EditorObject *)self;
 
+	if (!DirectoryEditor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
 	if (!PyArg_ParseTuple(args, "sz#", &name, &c_value.data, &c_value.len))
 		return NULL;
 
@@ -189,6 +229,12 @@
 static PyObject *py_dir_editor_close(PyObject *self)
 {
 	EditorObject *editor = (EditorObject *)self;
+
+	if (!DirectoryEditor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
     if (!check_error(editor->editor->close_directory(editor->baton, 
 													 editor->pool)))
 		return NULL;
@@ -201,6 +247,12 @@
 	char *path;
 	EditorObject *editor = (EditorObject *)self;
 
+	if (!Editor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
+
 	if (!PyArg_ParseTuple(args, "s", &path))
 		return NULL;
     
@@ -218,6 +270,11 @@
 	void *file_baton;
 	EditorObject *editor = (EditorObject *)self;
 
+	if (!DirectoryEditor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
 	if (!PyArg_ParseTuple(args, "s|zl", &path, &copy_path, &copy_rev))
 		return NULL;
 
@@ -236,6 +293,11 @@
 	void *file_baton;
 	EditorObject *editor = (EditorObject *)self;
 
+	if (!DirectoryEditor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
 	if (!PyArg_ParseTuple(args, "s|l", &path, &base_revision))
 		return NULL;
 
@@ -251,6 +313,12 @@
 {
 	char *path;
 	EditorObject *editor = (EditorObject *)self;
+
+	if (!DirectoryEditor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
 	if (!PyArg_ParseTuple(args, "s", &path))
 		return NULL;
 
@@ -278,13 +346,19 @@
 	PyObject_HEAD_INIT(&PyType_Type) 0,
 	.tp_name = "ra.DirEditor",
 	.tp_methods = py_dir_editor_methods,
-	.tp_dealloc = PyObject_Del,
+	.tp_dealloc = (destructor)PyObject_Del,
 };
 
 static PyObject *py_editor_set_target_revision(PyObject *self, PyObject *args)
 {
 	int target_revision;
 	EditorObject *editor = (EditorObject *)self;
+
+	if (!Editor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
 	if (!PyArg_ParseTuple(args, "i", &target_revision))
 		return NULL;
 
@@ -301,6 +375,11 @@
 	void *root_baton;
 	EditorObject *editor = (EditorObject *)self;
 
+	if (!Editor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
 	if (!PyArg_ParseTuple(args, "|i", &base_revision))
 		return NULL;
 
@@ -315,6 +394,12 @@
 static PyObject *py_editor_close(PyObject *self)
 {
 	EditorObject *editor = (EditorObject *)self;
+
+	if (!Editor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
 	if (!check_error(editor->editor->close_edit(editor->baton, editor->pool)))
 		return NULL;
 
@@ -328,6 +413,11 @@
 {
 	EditorObject *editor = (EditorObject *)self;
 
+	if (!Editor_Check(self)) {
+		PyErr_BadArgument();
+		return NULL;
+	}
+
 	if (!check_error(editor->editor->abort_edit(editor->baton, editor->pool)))
 		return NULL;
 

=== modified file 'editor.h'
--- a/editor.h	2008-06-04 20:55:19 +0000
+++ b/editor.h	2008-06-04 21:20:42 +0000
@@ -28,6 +28,11 @@
 PyAPI_DATA(PyTypeObject) TxDeltaWindowHandler_Type;
 PyObject *new_editor_object(const svn_delta_editor_t *editor, void *baton, apr_pool_t *pool, PyTypeObject *type, bool *busy_var);
 
+#define DirectoryEditor_Check(op) PyObject_TypeCheck(op, &DirectoryEditor_Type)
+#define FileEditor_Check(op) PyObject_TypeCheck(op, &FileEditor_Type)
+#define Editor_Check(op) PyObject_TypeCheck(op, &Editor_Type)
+#define TxDeltaWindowHandler_Check(op) PyObject_TypeCheck(op, &TxDeltaWindowHandler_Type)
+
 typedef struct {
 	PyObject_HEAD
 	svn_txdelta_window_handler_t txdelta_handler;

=== modified file 'ra.c'
--- a/ra.c	2008-06-04 20:55:19 +0000
+++ b/ra.c	2008-06-04 21:20:42 +0000
@@ -349,7 +349,7 @@
 					window->ops[i].offset, 
 					window->ops[i].length));
 	}
-	if (window->new_data != NULL) {
+	if (window->new_data != NULL && window->new_data->data != NULL) {
 		py_new_data = PyString_FromStringAndSize(window->new_data->data, window->new_data->len);
 	} else {
 		py_new_data = Py_None;
@@ -489,6 +489,7 @@
 		PyErr_SetString(busy_exc, "Remote access object already in use");
 		return true;
 	}
+	raobj->busy = true;
 	return false;
 }
 
@@ -833,7 +834,7 @@
 		NULL };
 	PyObject *revprops, *commit_callback, *lock_tokens = Py_None;
 	bool keep_locks = false;
-	apr_pool_t *temp_pool;
+	apr_pool_t *temp_pool, *pool;
 	const svn_delta_editor_t *editor;
 	void *edit_baton;
 	RemoteAccessObject *ra = (RemoteAccessObject *)self;
@@ -866,11 +867,14 @@
 		return NULL;
 	}
 
+	pool = Pool();
+
 	RUN_SVN_WITH_POOL(temp_pool, svn_ra_get_commit_editor2(ra->ra, &editor, 
 		&edit_baton, 
 		PyString_AsString(PyDict_GetItemString(revprops, SVN_PROP_REVISION_LOG)), py_commit_callback, 
-		commit_callback, hash_lock_tokens, keep_locks, temp_pool));
-	return new_editor_object(editor, edit_baton, temp_pool, 
+		commit_callback, hash_lock_tokens, keep_locks, pool));
+	apr_pool_destroy(temp_pool);
+	return new_editor_object(editor, edit_baton, pool, 
 								  &Editor_Type, &ra->busy);
 }
 

=== modified file 'util.c'
--- a/util.c	2008-06-04 20:55:19 +0000
+++ b/util.c	2008-06-04 21:20:42 +0000
@@ -117,9 +117,13 @@
     py_props = PyDict_New();
     for (idx = apr_hash_first(pool, props); idx != NULL; 
 		 idx = apr_hash_next(idx)) {
+		PyObject *py_val;
         apr_hash_this(idx, (const void **)&key, &klen, (void **)&val);
-        PyDict_SetItemString(py_props, key, 
-							 PyString_FromStringAndSize(val->data, val->len));
+		if (val == NULL || val->data == NULL)
+			py_val = Py_None;
+		else
+			py_val = PyString_FromStringAndSize(val->data, val->len);
+        PyDict_SetItemString(py_props, key, py_val);
 	}
     apr_pool_destroy(pool);
     return py_props;

=== modified file 'wc.c'
--- a/wc.c	2008-06-04 20:55:19 +0000
+++ b/wc.c	2008-06-04 21:20:42 +0000
@@ -236,7 +236,7 @@
 	if (temp_pool == NULL)
 		return NULL;
 	RUN_SVN_WITH_POOL(temp_pool, svn_wc_prop_get(&value, name, path, admobj->adm, temp_pool));
-	if (value == NULL) {
+	if (value == NULL || value->data == NULL) {
 		ret = Py_None;
 	} else {
 		ret = PyString_FromStringAndSize(value->data, value->len);
@@ -350,10 +350,6 @@
 	apr_array_header_t *propchanges;
 	apr_hash_t *original_props;
 	AdmObject *admobj = (AdmObject *)self;
-	apr_hash_index_t *idx;
-	svn_string_t *string;
-	const char *key;
-	apr_ssize_t klen;
 	svn_prop_t *el;
 	int i;
 	PyObject *py_propchanges, *py_orig_props;
@@ -372,13 +368,7 @@
 		PyList_SetItem(py_propchanges, i, 
 					   Py_BuildValue("(ss#)", el->name, el->value->data, el->value->len));
 	}
-	py_orig_props = PyDict_New();
-	idx = apr_hash_first(temp_pool, original_props);
-	while (idx != NULL) {
-		apr_hash_this(idx, (const void **)&key, &klen, (void **)&string);
-		PyDict_SetItemString(py_orig_props, key, PyString_FromStringAndSize(string->data, string->len));
-		idx = apr_hash_next(idx);
-	}
+	py_orig_props = prop_hash_to_dict(original_props);
 	apr_pool_destroy(temp_pool);
 	return Py_BuildValue("(OO)", py_propchanges, py_orig_props);
 }
@@ -755,10 +745,10 @@
 	if (mod == NULL)
 		return;
 
-	PyModule_AddObject(mod, "SCHEDULE_NORMAL", PyLong_FromLong(0));
-	PyModule_AddObject(mod, "SCHEDULE_ADD", PyLong_FromLong(1));
-	PyModule_AddObject(mod, "SCHEDULE_DELETE", PyLong_FromLong(2));
-	PyModule_AddObject(mod, "SCHEDULE_REPLACE", PyLong_FromLong(3));
+	PyModule_AddIntConstant(mod, "SCHEDULE_NORMAL", 0);
+	PyModule_AddIntConstant(mod, "SCHEDULE_ADD", 1);
+	PyModule_AddIntConstant(mod, "SCHEDULE_DELETE", 2);
+	PyModule_AddIntConstant(mod, "SCHEDULE_REPLACE", 3);
 
 	PyModule_AddObject(mod, "WorkingCopy", (PyObject *)&Adm_Type);
 	Py_INCREF(&Adm_Type);




More information about the bazaar-commits mailing list