Rev 1435: Support mergeinfo ra call. in http://people.samba.org/bzr/jelmer/bzr-svn/trunk

Jelmer Vernooij jelmer at samba.org
Fri Jul 4 03:18:03 BST 2008


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

------------------------------------------------------------
revno: 1435
revision-id: jelmer at samba.org-20080704021802-ycbr1t7gi9y5j9np
parent: jelmer at samba.org-20080704005915-12e0gyhi4fa7v6c9
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: 0.4
timestamp: Fri 2008-07-04 04:18:02 +0200
message:
  Support mergeinfo ra call.
modified:
  ra.c                           ra.pyx-20080313140933-qybkqaxe3m4mcll7-1
=== modified file 'ra.c'
--- a/ra.c	2008-07-03 16:38:27 +0000
+++ b/ra.c	2008-07-04 02:18:02 +0000
@@ -1544,6 +1544,109 @@
 	apr_pool_destroy(temp_pool);
 	return ret;
 }
+
+#if SVN_VER_MAJOR >= 1 && SVN_VER_MINOR >= 5
+static PyObject *range_to_tuple(svn_merge_range_t *range)
+{
+	return Py_BuildValue("(llb)", range->start, range->end, range->inheritable);
+}
+
+static PyObject *merge_rangelist_to_list(apr_array_header_t *rangelist)
+{
+	PyObject *ret;
+	int i;
+
+	ret = PyList_New(rangelist->nelts);
+
+	for (i = 0; i < rangelist->nelts; i++) {
+		PyObject *pyval = range_to_tuple(APR_ARRAY_IDX(rangelist, i, svn_merge_range_t *));
+		if (pyval == NULL)
+			return NULL;
+		PyList_SetItem(ret, i, pyval);
+	}
+	return ret;
+}
+
+static PyObject *mergeinfo_to_dict(svn_mergeinfo_t mergeinfo, apr_pool_t *temp_pool)
+{
+	PyObject *ret = PyDict_New();
+	char *key;
+	apr_ssize_t klen;
+	apr_hash_index_t *idx;
+	apr_array_header_t *range;
+
+	for (idx = apr_hash_first(temp_pool, mergeinfo); idx != NULL; 
+		idx = apr_hash_next(idx)) {
+		PyObject *pyval;
+		apr_hash_this(idx, (const void **)&key, &klen, (void **)&range);
+		pyval = merge_rangelist_to_list(range);
+		if (pyval == NULL)
+			return NULL;
+		PyDict_SetItemString(ret, key, pyval);
+	}
+
+	return ret;
+}
+#endif
+
+static PyObject *ra_mergeinfo(PyObject *self, PyObject *args)
+{
+#if SVN_VER_MAJOR >= 1 && SVN_VER_MINOR >= 5
+	RemoteAccessObject *ra = (RemoteAccessObject *)self;
+	apr_array_header_t *apr_paths;
+	apr_pool_t *temp_pool;
+	svn_mergeinfo_catalog_t catalog;
+	apr_ssize_t klen;
+	apr_hash_index_t *idx;
+	svn_mergeinfo_t val;
+	char *key;
+	PyObject *ret;
+	svn_revnum_t revision = -1;
+	PyObject *paths;
+	svn_mergeinfo_inheritance_t inherit = svn_mergeinfo_explicit;
+	svn_boolean_t include_descendants;
+
+	if (!PyArg_ParseTuple(args, "O|lib", &paths, &revision, &inherit, &include_descendants))
+		return NULL;
+
+	temp_pool = Pool(NULL);
+	if (temp_pool == NULL)
+		return NULL;
+
+	if (!string_list_to_apr_array(temp_pool, paths, &apr_paths)) {
+		apr_pool_destroy(temp_pool);
+		return NULL;
+	}
+
+	RUN_RA_WITH_POOL(temp_pool, ra, svn_ra_get_mergeinfo(ra->ra, 
+                     &catalog, apr_paths, revision, inherit, 
+					 include_descendants,
+                     temp_pool));
+
+	ret = PyDict_New();
+
+	if (catalog != NULL) {
+		for (idx = apr_hash_first(temp_pool, catalog); idx != NULL; 
+			idx = apr_hash_next(idx)) {
+			PyObject *pyval;
+			apr_hash_this(idx, (const void **)&key, &klen, (void **)&val);
+			pyval = mergeinfo_to_dict(val, temp_pool);
+			if (pyval == NULL) {
+				apr_pool_destroy(temp_pool);
+				return NULL;
+			}
+			PyDict_SetItemString(ret, key, pyval);
+		}
+	}
+
+	apr_pool_destroy(temp_pool);
+
+	return ret;
+#else
+	PyErr_SetString(PyExc_NotImplementedError, "mergeinfo is only supported in Subversion >= 1.5");
+	return NULL;
+#endif
+}
 	
 static PyObject *ra_get_file_revs(PyObject *self, PyObject *args)
 {
@@ -1607,6 +1710,7 @@
 	{ "get_locks", ra_get_locks, METH_VARARGS, NULL },
 	{ "lock", ra_lock, METH_VARARGS, NULL },
 	{ "unlock", ra_unlock, METH_VARARGS, NULL },
+	{ "mergeinfo", ra_mergeinfo, METH_VARARGS, NULL },
 	{ "has_capability", ra_has_capability, METH_VARARGS, NULL },
 	{ "check_path", ra_check_path, METH_VARARGS, NULL },
 	{ "get_lock", ra_get_lock, METH_VARARGS, NULL },
@@ -2468,6 +2572,12 @@
 	PyModule_AddIntConstant(mod, "DIRENT_LAST_AUTHOR", SVN_DIRENT_LAST_AUTHOR);
 	PyModule_AddIntConstant(mod, "DIRENT_ALL", SVN_DIRENT_ALL);
 
+#if SVN_VER_MAJOR >= 1 && SVN_VER_MINOR >= 5
+	PyModule_AddIntConstant(mod, "MERGEINFO_EXPLICIT", svn_mergeinfo_explicit);
+	PyModule_AddIntConstant(mod, "MERGEINFO_INHERITED", svn_mergeinfo_inherited);
+	PyModule_AddIntConstant(mod, "MERGEINFO_NEAREST_ANCESTOR", svn_mergeinfo_nearest_ancestor);
+#endif
+
 #ifdef SVN_VER_REVISION
 	PyModule_AddIntConstant(mod, "SVN_REVISION", SVN_VER_REVISION);
 #endif




More information about the bazaar-commits mailing list