Rev 1283: Provide access to new style log functions. in http://people.samba.org/bzr/jelmer/bzr-svn/0.4

Jelmer Vernooij jelmer at samba.org
Sun Jun 22 23:08:52 BST 2008


At http://people.samba.org/bzr/jelmer/bzr-svn/0.4

------------------------------------------------------------
revno: 1283
revision-id: jelmer at samba.org-20080622220850-rmzes5etysi5bupc
parent: jelmer at samba.org-20080622211849-xj8pqhiot48f9njk
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.4
timestamp: Mon 2008-06-23 00:08:50 +0200
message:
  Provide access to new style log functions.
modified:
  client.c                       client.pyx-20080313235339-wbyjbw2namuiql8f-1
  ra.c                           ra.pyx-20080313140933-qybkqaxe3m4mcll7-1
  setup.py                       setup.py-20060502115218-86950492da22353f
  util.c                         util.c-20080531154025-s8ef6ej9tytsnkkw-1
  util.h                         util.h-20080531154025-s8ef6ej9tytsnkkw-2
  wc.c                           wc.pyx-20080313142018-10l8l23vha2j9e6b-1
=== modified file 'client.c'
--- a/client.c	2008-06-22 06:49:47 +0000
+++ b/client.c	2008-06-22 22:08:50 +0000
@@ -95,7 +95,7 @@
 		else
 			copyfrom = Py_None;
 
-		item = Py_BuildValue("(szlOi)", 
+		item = Py_BuildValue("(szlNi)", 
 							 /* commit_item->path */ "foo",
 							 commit_item->url, commit_item->revision, 
 							 copyfrom,

=== modified file 'ra.c'
--- a/ra.c	2008-06-22 21:14:30 +0000
+++ b/ra.c	2008-06-22 22:08:50 +0000
@@ -349,6 +349,8 @@
 	}
 	py_window = Py_BuildValue("((LIIiOO))", window->sview_offset, window->sview_len, window->tview_len, 
 								window->src_ops, ops, py_new_data);
+	Py_DECREF(ops);
+	Py_DECREF(py_new_data);
 	ret = PyObject_CallFunction(fn, "O", py_window);
 	Py_DECREF(py_window);
 	if (ret == NULL)
@@ -723,16 +725,17 @@
 	PyObject *callback, *paths;
 	svn_revnum_t start = 0, end = 0;
 	int limit=0; 
-	bool discover_changed_paths=false, strict_node_history=true;
+	bool discover_changed_paths=false, strict_node_history=true,include_merged_revisions=false;
 	RemoteAccessObject *ra = (RemoteAccessObject *)self;
 	PyObject *revprops = Py_None;
     apr_pool_t *temp_pool;
 	apr_array_header_t *apr_paths;
+	apr_array_header_t *apr_revprops;
 
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOll|ibbO:get_log", kwnames, 
+	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOll|ibbbO:get_log", kwnames, 
 						 &callback, &paths, &start, &end, &limit,
 						 &discover_changed_paths, &strict_node_history,
-						 &revprops))
+						 &include_merged_revisions, &revprops))
 		return NULL;
 
 	if (ra_check_busy(ra))
@@ -750,10 +753,53 @@
 		apr_pool_destroy(temp_pool);
 		return NULL;
 	}
+
+#if SVN_VER_MAJOR <= 1 && SVN_VER_MINOR < 5
+	if (revprops == NULL) {
+		PyErr_SetString(PyExc_NotImplementedError, "fetching all revision properties not supported");	
+		apr_pool_destroy(temp_pool);
+		return NULL;
+	} else {
+		int i;
+		for (i = 0; i < PyList_Size(revprops); i++) {
+			const char *n = PyString_AsString(PyList_GetItem(revprops, i));
+			if (strcmp(SVN_PROP_REVISION_LOG, n) && 
+				strcmp(SVN_PROP_REVISION_AUTHOR, n) &&
+				strcmp(SVN_PROP_REVISION_DATE, n)) {
+				PyErr_SetString(PyExc_NotImplementedError, 
+								"fetching custom revision properties not supported");	
+				apr_pool_destroy(temp_pool);
+				return NULL;
+			}
+		}
+	}
+
+	if (include_merged_revisions) {
+		PyErr_SetString(PyExc_NotImplementedError, "include_merged_revisions not supported in Subversion 1.4");
+		apr_pool_destroy(temp_pool);
+		return NULL;
+	}
+#endif
+
+	if (!string_list_to_apr_array(temp_pool, revprops, &apr_revprops)) {
+		apr_pool_destroy(temp_pool);
+		return NULL;
+	}
+
+#if SVN_VER_MAJOR == 1 && SVN_VER_MINOR >= 5
+	RUN_RA_WITH_POOL(temp_pool, ra, svn_ra_get_log2(ra->ra, 
+            apr_paths, start, end, limit,
+            discover_changed_paths, strict_node_history, 
+			include_merged_revisions,
+			apr_revprops,
+			py_svn_log_entry_receiver, 
+            callback, temp_pool));
+#else
 	RUN_RA_WITH_POOL(temp_pool, ra, svn_ra_get_log(ra->ra, 
             apr_paths, start, end, limit,
             discover_changed_paths, strict_node_history, py_svn_log_wrapper, 
             callback, temp_pool));
+#endif
     apr_pool_destroy(temp_pool);
 	Py_RETURN_NONE;
 }
@@ -1063,7 +1109,7 @@
 
 	py_props = prop_hash_to_dict(props);
 	apr_pool_destroy(temp_pool);
-	return Py_BuildValue("(OlO)", py_dirents, fetch_rev, py_props);
+	return Py_BuildValue("(NlN)", py_dirents, fetch_rev, py_props);
 }
 
 static PyObject *ra_get_lock(PyObject *self, PyObject *args)
@@ -1671,6 +1717,7 @@
 	}
 
 	ret = PyObject_CallFunction(fn, "slOb", realm, failures, py_cert, may_save);
+	Py_DECREF(py_cert);
 	if (ret == NULL)
 		return py_svn_error();
 

=== modified file 'setup.py'
--- a/setup.py	2008-06-22 21:18:49 +0000
+++ b/setup.py	2008-06-22 22:08:50 +0000
@@ -20,7 +20,7 @@
 
 def svn_build_data():
     """Determine the Subversion header file location."""
-    basedirs = ["/usr", "/usr/local", "/usr"]
+    basedirs = ["/usr/local", "/usr"]
     for basedir in basedirs:
         includedir = os.path.join(basedir, "include/subversion-1")
         if os.path.isdir(includedir):

=== modified file 'util.c'
--- a/util.c	2008-06-22 21:14:30 +0000
+++ b/util.c	2008-06-22 22:08:50 +0000
@@ -24,6 +24,7 @@
 #include <apr_errno.h>
 #include <svn_error_codes.h>
 #include <svn_config.h>
+#include <svn_version.h>
 
 #include "util.h"
 
@@ -83,6 +84,11 @@
 	if (error->apr_err == BZR_SVN_APR_ERROR_OFFSET)
 		return false; /* Just let Python deal with it */
 
+	if (error->apr_err == SVN_ERR_RA_NOT_IMPLEMENTED) {
+		PyErr_SetString(PyExc_NotImplementedError, error->message);
+		return false;
+	}
+
 	PyErr_SetSubversionException(error);
 	return false;
 }
@@ -140,13 +146,13 @@
     return py_props;
 }
 
-svn_error_t *py_svn_log_wrapper(void *baton, apr_hash_t *changed_paths, long revision, const char *author, const char *date, const char *message, apr_pool_t *pool)
+static PyObject *pyify_changed_paths(apr_hash_t *changed_paths, apr_pool_t *pool)
 {
+	PyObject *py_changed_paths;
     apr_hash_index_t *idx;
     const char *key;
     apr_ssize_t klen;
     svn_log_changed_path_t *val;
-	PyObject *revprops, *py_changed_paths, *ret;
 
     if (changed_paths == NULL) {
         py_changed_paths = Py_None;
@@ -160,6 +166,50 @@
                                          val->copyfrom_rev));
 		}
 	}
+
+	return py_changed_paths;
+}
+
+#if SVN_VER_MAJOR == 1 && SVN_VER_MINOR >= 5
+svn_error_t *py_svn_log_entry_receiver(void *baton, svn_log_entry_t *log_entry, apr_pool_t *pool)
+{
+	PyObject *revprops, *py_changed_paths, *ret;
+    apr_hash_index_t *idx;
+    const char *key;
+    apr_ssize_t klen;
+	char *val;
+
+	py_changed_paths = pyify_changed_paths(log_entry->changed_paths, pool);
+	if (py_changed_paths == NULL)
+		return py_svn_error();
+
+	revprops = PyDict_New();
+	if (log_entry->revprops != NULL) {
+		 for (idx = apr_hash_first(pool, log_entry->revprops); idx != NULL;
+             idx = apr_hash_next(idx)) {
+            apr_hash_this(idx, (const void **)&key, &klen, (void **)&val);
+			PyDict_SetItemString(revprops, key, PyString_FromString(val));
+		}
+	}
+
+    ret = PyObject_CallFunction((PyObject *)baton, "OlOb", py_changed_paths, 
+								 log_entry->revision, revprops, log_entry->has_children);
+	Py_DECREF(py_changed_paths);
+	Py_DECREF(revprops);
+	if (ret == NULL)
+		return py_svn_error();
+	return NULL;
+}
+#endif
+
+svn_error_t *py_svn_log_wrapper(void *baton, apr_hash_t *changed_paths, long revision, const char *author, const char *date, const char *message, apr_pool_t *pool)
+{
+	PyObject *revprops, *py_changed_paths, *ret;
+
+	py_changed_paths = pyify_changed_paths(changed_paths, pool);
+	if (py_changed_paths == NULL)
+		return py_svn_error();
+
     revprops = PyDict_New();
     if (message != NULL) {
         PyDict_SetItemString(revprops, SVN_PROP_REVISION_LOG, 
@@ -173,8 +223,10 @@
         PyDict_SetItemString(revprops, SVN_PROP_REVISION_DATE, 
 							 PyString_FromString(date));
 	}
-    ret = PyObject_CallFunction((PyObject *)baton, "OlO", py_changed_paths, 
-								 revision, revprops);
+    ret = PyObject_CallFunction((PyObject *)baton, "OlOb", py_changed_paths, 
+								 revision, revprops, FALSE);
+	Py_DECREF(py_changed_paths);
+	Py_DECREF(revprops);
 	if (ret == NULL)
 		return py_svn_error();
 	return NULL;

=== modified file 'util.h'
--- a/util.h	2008-06-22 21:14:30 +0000
+++ b/util.h	2008-06-22 22:08:50 +0000
@@ -47,6 +47,10 @@
 apr_hash_t *config_hash_from_object(PyObject *config, apr_pool_t *pool);
 void PyErr_SetAprStatus(apr_status_t status);
 
+#if SVN_VER_MAJOR == 1 && SVN_VER_MINOR >= 5
+svn_error_t *py_svn_log_entry_receiver(void *baton, svn_log_entry_t *log_entry, apr_pool_t *pool);
+#endif
+
 #pragma GCC visibility pop
 
 #endif /* _BZR_SVN_UTIL_H_ */

=== modified file 'wc.c'
--- a/wc.c	2008-06-22 08:45:53 +0000
+++ b/wc.c	2008-06-22 22:08:50 +0000
@@ -379,7 +379,7 @@
 	}
 	py_orig_props = prop_hash_to_dict(original_props);
 	apr_pool_destroy(temp_pool);
-	return Py_BuildValue("(OO)", py_propchanges, py_orig_props);
+	return Py_BuildValue("(NN)", py_propchanges, py_orig_props);
 }
 
 static PyObject *adm_add(PyObject *self, PyObject *args)




More information about the bazaar-commits mailing list