Rev 1072: Fix more bugs in the bindings. in file:///data/jelmer/bzr-svn/cext/

Jelmer Vernooij jelmer at samba.org
Wed Jun 4 16:55:45 BST 2008


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

------------------------------------------------------------
revno: 1072
revision-id: jelmer at samba.org-20080604155545-ji33cdrattp969wf
parent: jelmer at samba.org-20080603111510-tzr72q62auor1mm2
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: cext
timestamp: Wed 2008-06-04 17:55:45 +0200
message:
  Fix more bugs in the bindings.
modified:
  logwalker.py                   logwalker.py-20060621215743-c13fhfnyzh1xzwh2-1
  mapping3/__init__.py           __init__.py-20080502174630-9324zh25kka98vlw-1
  ra.c                           ra.pyx-20080313140933-qybkqaxe3m4mcll7-1
  tests/__init__.py              __init__.py-20060508151940-e9f4d914801a2535
  transport.py                   transport.py-20060406231150-b3472d06b3a0818d
  util.c                         util.c-20080531154025-s8ef6ej9tytsnkkw-1
=== modified file 'logwalker.py'
--- a/logwalker.py	2008-06-03 07:43:09 +0000
+++ b/logwalker.py	2008-06-04 15:55:45 +0000
@@ -265,7 +265,6 @@
 
         try:
             def update_db(orig_paths, revision, revprops):
-                mutter("update db: %r,%r,%r" % (orig_paths, revision, revprops))
                 assert isinstance(orig_paths, dict) or orig_paths is None
                 assert isinstance(revision, int)
                 assert isinstance(revprops, dict)
@@ -302,12 +301,12 @@
 def struct_revpaths_to_tuples(changed_paths):
     assert isinstance(changed_paths, dict)
     revpaths = {}
-    for k,v in changed_paths.items():
-        if v.copyfrom_path is None:
+    for k,(action, copyfrom_path, copyfrom_rev) in changed_paths.items():
+        if copyfrom_path is None:
             copyfrom_path = None
         else:
-            copyfrom_path = v.copyfrom_path.strip("/")
-        revpaths[k.strip("/")] = (v.action, copyfrom_path, v.copyfrom_rev)
+            copyfrom_path = copyfrom_path.strip("/")
+        revpaths[k.strip("/")] = (action, copyfrom_path, copyfrom_rev)
     return revpaths
 
 
@@ -364,7 +363,7 @@
                 revprops = lazy_dict(known_revprops, self._transport.revprop_list, revnum)
                 yield (revpaths, revnum, revprops)
         except SubversionException, (_, num):
-            if num == svn.core.SVN_ERR_FS_NO_SUCH_REVISION:
+            if num == constants.ERR_FS_NO_SUCH_REVISION:
                 raise NoSuchRevision(branch=self, 
                     revision="Revision number %d" % from_revnum)
             raise
@@ -400,9 +399,9 @@
         conn = self._transport.connections.get(self._transport.get_svn_repos_root())
         try:
             ft = conn.check_path(path, revnum)
-            if ft == svn.core.svn_node_file:
+            if ft == core.NODE_FILE:
                 return []
-            assert ft == svn.core.svn_node_dir
+            assert ft == core.NODE_DIR
         finally:
             self._transport.connections.add(conn)
 

=== modified file 'mapping3/__init__.py'
--- a/mapping3/__init__.py	2008-05-05 18:23:23 +0000
+++ b/mapping3/__init__.py	2008-06-04 15:55:45 +0000
@@ -22,8 +22,8 @@
                              guess_scheme_from_history, ListBranchingScheme, 
                              parse_list_scheme_text, NoBranchingScheme,
                              TrunkBranchingScheme, ListBranchingScheme)
-import sha, svn
-from svn.core import SubversionException
+import sha, core
+import constants
 
 SVN_PROP_BZR_BRANCHING_SCHEME = 'bzr:branching-scheme'
 
@@ -66,14 +66,15 @@
 
     def get_branches(self, revnum, project=""):
         def check_path(path):
-            return self.repository.transport.check_path(path, revnum) == svn.core.svn_node_dir
+            return self.repository.transport.check_path(path, revnum) == core.NODE_DIR
         def find_children(path):
             try:
+                assert not path.startswith("/")
                 dirents = self.repository.transport.get_dir(path, revnum)[0]
-            except SubversionException, (msg, num):
-                if num == svn.core.SVN_ERR_FS_NOT_DIRECTORY:
+            except core.SubversionException, (msg, num):
+                if num == constants.ERR_FS_NOT_DIRECTORY:
                     return None
-                if num == svn.core.SVN_ERR_FS_NOT_FOUND:
+                if num == constants.ERR_FS_NOT_FOUND:
                     return None
                 raise
             return dirents.keys()
@@ -121,7 +122,7 @@
     def done(revmetadata, pool):
         pass
     editor = repository.transport.get_commit_editor(
-            {svn.core.SVN_PROP_REVISION_LOG: "Updating branching scheme for Bazaar."},
+            {constants.PROP_REVISION_LOG: "Updating branching scheme for Bazaar."},
             done, None, False)
     root = editor.open_root(-1)
     editor.change_dir_prop(root, SVN_PROP_BZR_BRANCHING_SCHEME, 

=== modified file 'ra.c'
--- a/ra.c	2008-06-03 11:15:10 +0000
+++ b/ra.c	2008-06-04 15:55:45 +0000
@@ -190,7 +190,7 @@
 }
 
 PyTypeObject Reporter_Type = {
-	PyObject_HEAD_INIT(&PyType_Type) 0,
+	PyObject_HEAD_INIT(NULL) 0,
 	.tp_name = "ra.Reporter",
 	.tp_methods = reporter_methods,
 	.tp_dealloc = reporter_dealloc,
@@ -280,7 +280,7 @@
 static svn_error_t *py_cb_editor_close_directory(void *dir_baton, apr_pool_t *pool)
 {
     PyObject *self = (PyObject *)dir_baton, *ret;
-    ret = PyObject_CallMethod(self, "close", NULL);
+    ret = PyObject_CallMethod(self, "close", "");
 	if (ret == NULL)
 		return py_svn_error();
     Py_DECREF(self);
@@ -327,7 +327,7 @@
 {
 	int i;
 	PyObject *ops, *ret;
-    PyObject *fn = (PyObject *)baton;
+    PyObject *fn = (PyObject *)baton, *py_new_data, *py_window;
     if (window == NULL) {
         /* Signals all delta windows have been received */
         Py_DECREF(fn);
@@ -339,16 +339,18 @@
 	}
     ops = PyList_New(window->num_ops);
 	for (i = 0; i < window->num_ops; i++) {
-		PyList_SetItem(ops, i, Py_BuildValue("(ill)", window->ops[i].action_code, 
+		PyList_SetItem(ops, i, Py_BuildValue("(iII)", window->ops[i].action_code, 
 					window->ops[i].offset, 
 					window->ops[i].length));
 	}
-	ret = PyObject_CallFunction(fn, "(llllOs#)", 
-								window->sview_offset, 
-								window->sview_len, 
-								window->tview_len, 
-								window->src_ops, ops, 
-								window->new_data->data, window->new_data->len);
+	if (window->new_data != NULL) {
+		py_new_data = PyString_FromStringAndSize(window->new_data->data, window->new_data->len);
+	} else {
+		py_new_data = Py_None;
+	}
+	py_window = Py_BuildValue("((LIIiOO))", window->sview_offset, window->sview_len, window->tview_len, 
+								window->src_ops, ops, py_new_data);
+	ret = PyObject_CallFunction(fn, "O", py_window);
 	if (ret == NULL)
 		return py_svn_error();
     return NULL;
@@ -382,7 +384,7 @@
 {
     PyObject *self = (PyObject *)file_baton, *ret;
     if (text_checksum != NULL) {
-		ret = PyObject_CallMethod(self, "close", NULL);
+		ret = PyObject_CallMethod(self, "close", "");
 	} else {
 		ret = PyObject_CallMethod(self, "close", "s", text_checksum);
 	}
@@ -404,7 +406,7 @@
 static svn_error_t *py_cb_editor_close_edit(void *edit_baton, apr_pool_t *pool)
 {
     PyObject *self = (PyObject *)edit_baton, *ret;
-	ret = PyObject_CallMethod(self, "close", NULL);
+	ret = PyObject_CallMethod(self, "close", "");
 	if (ret == NULL)
 		return py_svn_error();
     return NULL;
@@ -413,7 +415,7 @@
 static svn_error_t *py_cb_editor_abort_edit(void *edit_baton, apr_pool_t *pool)
 {
     PyObject *self = (PyObject *)edit_baton, *ret;
-	ret = PyObject_CallMethod(self, "abort", NULL);
+	ret = PyObject_CallMethod(self, "abort", "");
 	if (ret == NULL)
 		return py_svn_error();
     return NULL;
@@ -628,7 +630,7 @@
     apr_pool_t *temp_pool;
 	apr_array_header_t *apr_paths;
 
-	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOll|ibbO", kwnames, 
+	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "OOll|ibbO:get_log", kwnames, 
 						 &callback, &paths, &start, &end, &limit,
 						 &discover_changed_paths, &strict_node_history,
 						 &revprops))
@@ -644,7 +646,7 @@
 		/* FIXME: The subversion libraries don't behave as expected, 
 		 * so tweak our own parameters a bit. */
 		apr_paths = apr_array_make(temp_pool, 1, sizeof(char *));
-		APR_ARRAY_IDX(apr_paths, 0, char *) = apr_pstrdup(temp_pool, "/");
+		APR_ARRAY_PUSH(apr_paths, char *) = apr_pstrdup(temp_pool, "/");
 	} else if (!string_list_to_apr_array(temp_pool, paths, &apr_paths)) {
 		apr_pool_destroy(temp_pool);
 		return NULL;

=== modified file 'tests/__init__.py'
--- a/tests/__init__.py	2008-06-03 07:43:09 +0000
+++ b/tests/__init__.py	2008-06-04 15:55:45 +0000
@@ -19,15 +19,14 @@
 import os
 import sys
 import bzrlib
-from bzrlib import osutils
+from bzrlib import osutils, urlutils
 from bzrlib.bzrdir import BzrDir
 from bzrlib.tests import TestCaseInTempDir, TestSkipped
 from bzrlib.trace import mutter
-from bzrlib.urlutils import local_path_to_url
 from bzrlib.workingtree import WorkingTree
 
 import constants
-import repos, wc, client
+import repos, wc, client, ra
 
 class TestCaseWithSubversionRepository(TestCaseInTempDir):
     """A test case that provides the ability to build Subversion 
@@ -59,7 +58,7 @@
                 open(revprop_hook, 'w').write("#!/bin/sh\n")
                 os.chmod(revprop_hook, os.stat(revprop_hook).st_mode | 0111)
 
-        return local_path_to_url(abspath)
+        return urlutils.local_path_to_url(abspath)
 
     def make_remote_bzrdir(self, relpath):
         """Create a repository."""
@@ -172,6 +171,32 @@
     def client_update(self, path):
         self.client_ctx.update([path], None, True)
 
+    def commit_tree(self, repos_url, changes, revprops={"svn:log": "test commit"}):
+        ret_revnum = None
+        def callback(revmeta):
+            ret_revnum = revmeta.revision
+        x = ra.RemoteAccess(repos_url)
+        editor = x.get_commit_editor(revprops, callback)
+        root = editor.open_root()
+        def process(changes, dir_editor, path):
+            for f, v in changes.items():
+                p = urlutils.join(path, f)
+                if v is None:
+                    dir_editor.delete_entry(p) 
+                elif isinstance(v, dict):
+                    child_editor = dir_editor.add_directory(p)
+                    process(v, child_editor)
+                    child_editor.close()
+                elif isinstance(f, str):
+                    file_editor = dir_editor.add_file(p)
+                    # FIXME: send delta
+                    file_editor.close()
+                else:
+                    raise TypeError("Invalid type for %s" % f)
+        process(changes, root)
+        root.close()
+        return ret_revnum
+
     def build_tree(self, files):
         """Create a directory tree.
         

=== modified file 'transport.py'
--- a/transport.py	2008-06-03 11:15:10 +0000
+++ b/transport.py	2008-06-04 15:55:45 +0000
@@ -237,10 +237,11 @@
         from threading import Thread, Semaphore
 
         class logfetcher(Thread):
-            def __init__(self, transport, **kwargs):
+            def __init__(self, transport, *args, **kwargs):
                 Thread.__init__(self)
                 self.setDaemon(True)
                 self.transport = transport
+                self.args = args
                 self.kwargs = kwargs
                 self.pending = []
                 self.conn = None
@@ -263,7 +264,7 @@
                     self.semaphore.release()
                 self.conn = self.transport.get_connection()
                 try:
-                    self.conn.get_log(rcvr, **self.kwargs)
+                    self.conn.get_log(callback=rcvr, *self.args, **self.kwargs)
                     self.pending.append(None)
                 except Exception, e:
                     self.pending.append(e)
@@ -274,7 +275,7 @@
         else:
             newpaths = [self._request_path(path) for path in paths]
         
-        fetcher = logfetcher(self, paths=newpaths, from_revnum=from_revnum, to_revnum=to_revnum, limit=limit, discover_changed_paths=discover_changed_paths, strict_node_history=strict_node_history, revprops=revprops)
+        fetcher = logfetcher(self, paths=newpaths, start=from_revnum, end=to_revnum, limit=limit, discover_changed_paths=discover_changed_paths, strict_node_history=strict_node_history, revprops=revprops)
         fetcher.start()
         return iter(fetcher.next, None)
 

=== modified file 'util.c'
--- a/util.c	2008-06-03 07:43:09 +0000
+++ b/util.c	2008-06-04 15:55:45 +0000
@@ -95,7 +95,7 @@
 	}
     *ret = apr_array_make(pool, PyList_Size(l), sizeof(char *));
 	for (i = 0; i < PyList_GET_SIZE(l); i++) {
-		APR_ARRAY_IDX(*ret, i, char *) = apr_pstrdup(pool, PyString_AsString(PyList_GET_ITEM(l, i)));
+		APR_ARRAY_PUSH(*ret, char *) = apr_pstrdup(pool, PyString_AsString(PyList_GET_ITEM(l, i)));
 	}
     return true;
 }
@@ -190,7 +190,7 @@
 		return NULL;
 	}
     for (i = 0; i < PyList_Size(l); i++) {
-		APR_ARRAY_IDX(ret, i, svn_revnum_t) = PyLong_AsLong(PyList_GetItem(l, i));
+		APR_ARRAY_PUSH(ret, svn_revnum_t) = PyLong_AsLong(PyList_GetItem(l, i));
 	}
     return ret;
 }




More information about the bazaar-commits mailing list