Rev 1082: Several more minor fixes. in file:///data/jelmer/bzr-svn/cext/

Jelmer Vernooij jelmer at samba.org
Thu Jun 5 15:48:24 BST 2008


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

------------------------------------------------------------
revno: 1082
revision-id: jelmer at samba.org-20080605144823-yk82b00wxz0mc4tc
parent: jelmer at samba.org-20080605111713-6f2d16i82vyn15zu
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: cext
timestamp: Thu 2008-06-05 16:48:23 +0200
message:
  Several more minor fixes.
modified:
  commit.py                      commit.py-20060607190346-qvq128wgfubhhgm2-1
  logwalker.py                   logwalker.py-20060621215743-c13fhfnyzh1xzwh2-1
  ra.c                           ra.pyx-20080313140933-qybkqaxe3m4mcll7-1
  tests/__init__.py              __init__.py-20060508151940-e9f4d914801a2535
  tests/test_commit.py           test_commit.py-20060624213521-l5kcufywkh9mnilk-1
  tests/test_fetch.py            test_fetch.py-20070624210302-luvgwjmlfysk5qeq-1
  tests/test_logwalker.py        test_logwalker.py-20060622141944-pkocc3rj8g62ukbi-1
  util.c                         util.c-20080531154025-s8ef6ej9tytsnkkw-1
  wc.c                           wc.pyx-20080313142018-10l8l23vha2j9e6b-1
  workingtree.py                 workingtree.py-20060306120941-b083cb0fdd4a69de
=== modified file 'commit.py'
--- a/commit.py	2008-06-04 23:03:52 +0000
+++ b/commit.py	2008-06-05 14:48:23 +0000
@@ -401,11 +401,12 @@
             """Callback that is called by the Subversion commit editor 
             once the commit finishes.
             """
-
-            self.revision_metadata = object()
-            self.revision_metadata.revision = revision
-            self.revision_metadata.author = author
-            self.revision_metadata.date = date
+            class CommitResult:
+                def __init__(self, revision, author, date):
+                    self.revision = revision
+                    self.author = author
+                    self.date = date
+            self.revision_metadata = CommitResult(revision, author, date)
 
         bp_parts = self.branch.get_branch_path().split("/")
         repository_latest_revnum = self.repository.get_latest_revnum()
@@ -525,7 +526,7 @@
             if constants.PROP_REVISION_AUTHOR in override_svn_revprops:
                 new_revprops[constants.PROP_REVISION_AUTHOR] = self._committer.encode("utf-8")
             if constants.PROP_REVISION_DATE in override_svn_revprops:
-                new_revprops[constants.PROP_REVISION_DATE] = svn_time_to_cstring(1000000*self._timestamp)
+                new_revprops[constants.PROP_REVISION_DATE] = time_to_cstring(1000000*self._timestamp)
             set_svn_revprops(self.repository.transport, self.revision_metadata.revision, new_revprops)
 
         try:

=== modified file 'logwalker.py'
--- a/logwalker.py	2008-06-04 18:56:53 +0000
+++ b/logwalker.py	2008-06-05 14:48:23 +0000
@@ -20,13 +20,13 @@
 from bzrlib.trace import mutter
 import bzrlib.ui as ui
 
-from core import SubversionException
-from transport import SvnRaTransport
-import core
-import constants
+from bzrlib.plugins.svn.core import SubversionException
+from bzrlib.plugins.svn.transport import SvnRaTransport
+from bzrlib.plugins.svn import core, constants
 
 from bzrlib.plugins.svn.cache import CacheTable
 from bzrlib.plugins.svn import changes
+from bzrlib.plugins.svn.ra import DIRENT_KIND
 
 class lazy_dict(object):
     def __init__(self, initial, create_fn, *args):
@@ -333,10 +333,10 @@
         try:
             return self._transport.iter_log([path], revnum, 0, 2, True, False, []).next()[1]
         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" % revnum)
-            if num == svn.core.SVN_ERR_FS_NOT_FOUND:
+            if num == constants.ERR_FS_NOT_FOUND:
                 return None
             raise
 
@@ -383,7 +383,7 @@
             return struct_revpaths_to_tuples(
                 self._transport.iter_log(None, revnum, revnum, 1, True, True, []).next()[0])
         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" % revnum)
             raise
@@ -397,66 +397,20 @@
         assert isinstance(path, str), "invalid path"
         path = path.strip("/")
         conn = self._transport.connections.get(self._transport.get_svn_repos_root())
-        try:
-            ft = conn.check_path(path, revnum)
-            if ft == core.NODE_FILE:
-                return []
-            assert ft == core.NODE_DIR
-        finally:
-            self._transport.connections.add(conn)
-
-        class TreeLister(svn.delta.Editor):
-            def __init__(self, base):
-                self.files = []
-                self.base = base
-
-            def set_target_revision(self, revnum):
-                """See Editor.set_target_revision()."""
-                pass
-
-            def open_root(self, revnum):
-                """See Editor.open_root()."""
-                return path
-
-            def add_directory(self, path, parent_baton, copyfrom_path, copyfrom_revnum, pool):
-                """See Editor.add_directory()."""
-                self.files.append(urlutils.join(self.base, path))
-                return path
-
-            def change_dir_prop(self, id, name, value, pool):
-                pass
-
-            def change_file_prop(self, id, name, value, pool):
-                pass
-
-            def add_file(self, path, parent_id, copyfrom_path, copyfrom_revnum, baton):
-                self.files.append(urlutils.join(self.base, path))
-                return path
-
-            def close_dir(self, id):
-                pass
-
-            def close_file(self, path, checksum):
-                pass
-
-            def close_edit(self):
-                pass
-
-            def abort_edit(self):
-                pass
-
-            def apply_textdelta(self, file_id, base_checksum):
-                pass
-
-        editor = TreeLister(path)
-        try:
-            conn = self._transport.connections.get(urlutils.join(self._transport.get_svn_repos_root(), path))
-            reporter = conn.do_update(revnum, True, editor, pool)
-            reporter.set_path("", revnum, True, None, pool)
-            reporter.finish_report(pool)
-        finally:
-            self._transport.connections.add(conn)
-        return editor.files
+        results = []
+        unchecked_dirs = set([path])
+        try:
+            while len(unchecked_dirs) > 0:
+                nextp = unchecked_dirs.pop()
+                (dirents, fetch_rev, props) = conn.get_dir(nextp, revnum, DIRENT_KIND)
+                for k,v in dirents.items():
+                    childp = urlutils.join(nextp, k)
+                    if v['kind'] == core.NODE_DIR:
+                        unchecked_dirs.add(childp)
+                    results.append(childp)
+        finally:
+            self._transport.connections.add(conn)
+        return results
 
     def get_previous(self, path, revnum):
         """Return path,revnum pair specified pair was derived from.

=== modified file 'ra.c'
--- a/ra.c	2008-06-05 11:17:13 +0000
+++ b/ra.c	2008-06-05 14:48:23 +0000
@@ -677,7 +677,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_PUSH(apr_paths, 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;
@@ -1658,4 +1658,12 @@
 
 	busy_exc = PyErr_NewException("ra.BusyException", NULL, NULL);
 	PyModule_AddObject(mod, "BusyException", busy_exc);
+
+    PyModule_AddIntConstant(mod, "DIRENT_KIND", SVN_DIRENT_KIND);
+    PyModule_AddIntConstant(mod, "DIRENT_SIZE", SVN_DIRENT_SIZE);
+    PyModule_AddIntConstant(mod, "DIRENT_HAS_PROPS", SVN_DIRENT_HAS_PROPS);
+    PyModule_AddIntConstant(mod, "DIRENT_CREATED_REV", SVN_DIRENT_CREATED_REV);
+    PyModule_AddIntConstant(mod, "DIRENT_TIME", SVN_DIRENT_TIME);
+    PyModule_AddIntConstant(mod, "DIRENT_LAST_AUTHOR", SVN_DIRENT_LAST_AUTHOR);
+    PyModule_AddIntConstant(mod, "DIRENT_ALL", SVN_DIRENT_ALL);
 }

=== modified file 'tests/__init__.py'
--- a/tests/__init__.py	2008-06-05 11:17:13 +0000
+++ b/tests/__init__.py	2008-06-05 14:48:23 +0000
@@ -124,7 +124,7 @@
         return self.client_ctx.revprop_get(name, url, revnum)[0]
 
     def client_set_revprop(self, url, revnum, name, value):
-        return self.client_ctx.revprop_set(name, url, renum, value)
+        return self.client_ctx.revprop_set(name, value, url, revnum)
         
     def client_commit(self, dir, message=None, recursive=True):
         """Commit current changes in specified working copy.
@@ -144,16 +144,17 @@
         """
         self.client_ctx.add(relpath, recursive, False, False)
 
-    def client_log(self, path, start_revnum=0, stop_revnum="HEAD"):
-        assert isinstance(path, str)
+    def client_log(self, url, start_revnum=0, stop_revnum=-1):
+        ra = RemoteAccess(url.encode("utf-8"))
         ret = {}
         def rcvr(orig_paths, rev, revprops):
             ret[rev] = (orig_paths, 
                         revprops.get(constants.PROP_REVISION_AUTHOR),
                         revprops.get(constants.PROP_REVISION_DATE),
                         revprops.get(constants.PROP_REVISION_LOG))
-        self.client_ctx.log([path], rcvr, None, start_revnum, stop_revnum, 
-                            True, True)
+        if stop_revnum == -1:
+            stop_revnum = ra.get_latest_revnum()
+        ra.get_log(rcvr, None, start_revnum, stop_revnum, 0, True, True)
         return ret
 
     def client_delete(self, relpath):

=== modified file 'tests/test_commit.py'
--- a/tests/test_commit.py	2008-06-05 10:23:08 +0000
+++ b/tests/test_commit.py	2008-06-05 14:48:23 +0000
@@ -577,7 +577,7 @@
 
 class RevpropTests(TestCaseWithSubversionRepository):
     def test_change_revprops(self):
-        repos_url = self.make_repository("d")
+        repos_url = self.make_repository("d", allow_revprop_changes=True)
 
         dc = self.commit_editor(repos_url, message="My commit")
         dc.add_file("foo.txt")
@@ -587,8 +587,10 @@
         set_svn_revprops(transport, 1, {"svn:author": "Somebody", 
                                         "svn:date": time_to_cstring(1000000*473385600)})
 
+	self.assertEquals(1, transport.get_latest_revnum())
+
         self.assertEquals(("Somebody", "1985-01-01T00:00:00.000000Z", "My commit"), 
-                          self.client_log(repos_url)[1][1:])
+                self.client_log(repos_url)[1][1:])
 
     def test_change_revprops_disallowed(self):
         repos_url = self.make_repository("d", allow_revprop_changes=False)

=== modified file 'tests/test_fetch.py'
--- a/tests/test_fetch.py	2008-06-05 10:21:04 +0000
+++ b/tests/test_fetch.py	2008-06-05 14:48:23 +0000
@@ -1317,9 +1317,7 @@
         self.client_add("dc/old-trunk")
         self.client_commit("dc", "trunk data")
 
-        self.build_tree({'dc/trunk': None})
-        self.client_add("dc/trunk")
-        self.client_copy("dc/old-trunk/lib", "dc/trunk")
+        self.client_copy("dc/old-trunk", "dc/trunk")
         self.client_commit("dc", "revive old trunk")
 
         oldrepos = Repository.open(repos_url)

=== modified file 'tests/test_logwalker.py'
--- a/tests/test_logwalker.py	2008-06-05 02:09:24 +0000
+++ b/tests/test_logwalker.py	2008-06-05 14:48:23 +0000
@@ -16,11 +16,11 @@
 
 """Log walker tests."""
 
+from bzrlib import debug
 from bzrlib.errors import NoSuchRevision
 
 import os
 from bzrlib.plugins.svn import logwalker
-from bzrlib import debug
 from bzrlib.plugins.svn.tests import TestCaseWithSubversionRepository
 from bzrlib.plugins.svn.transport import SvnRaTransport
 

=== modified file 'util.c'
--- a/util.c	2008-06-04 21:20:42 +0000
+++ b/util.c	2008-06-05 14:48:23 +0000
@@ -52,10 +52,9 @@
 
 void PyErr_SetSubversionException(svn_error_t *error)
 {
-	PyObject *coremod = PyImport_ImportModule("core"), *excobj;
+	PyObject *coremod = PyImport_ImportModule("bzrlib.plugins.svn.core"), *excobj;
 
 	if (coremod == NULL) {
-		PyErr_BadInternalCall();
 		return;
 	}
 		
@@ -89,13 +88,18 @@
         return true;
 	}
 	if (!PyList_Check(l)) {
-		PyErr_Format(PyExc_TypeError, "Expected list of paths, got: %s",
+		PyErr_Format(PyExc_TypeError, "Expected list of strings, got: %s",
 					 l->ob_type->tp_name);
 		return false;
 	}
     *ret = apr_array_make(pool, PyList_Size(l), sizeof(char *));
 	for (i = 0; i < PyList_GET_SIZE(l); i++) {
-		APR_ARRAY_PUSH(*ret, char *) = apr_pstrdup(pool, PyString_AsString(PyList_GET_ITEM(l, i)));
+		PyObject *item = PyList_GET_ITEM(l, i);
+		if (!PyString_Check(item)) {
+			PyErr_SetString(PyExc_TypeError, "Expected list of strings");
+			return false;
+		}
+		APR_ARRAY_PUSH(*ret, char *) = apr_pstrdup(pool, PyString_AsString(item));
 	}
     return true;
 }

=== modified file 'wc.c'
--- a/wc.c	2008-06-04 22:09:09 +0000
+++ b/wc.c	2008-06-05 14:48:23 +0000
@@ -500,6 +500,74 @@
 	return new_editor_object(editor, edit_baton, pool, &Editor_Type, NULL, NULL);
 }
 
+static bool py_dict_to_wcprop_changes(PyObject *dict, apr_pool_t *pool, apr_array_header_t **ret)
+{
+	PyObject *key, *val;
+	Py_ssize_t idx;
+
+	if (dict == Py_None) {
+		*ret = NULL;
+		return true;
+	}
+
+	if (!PyDict_Check(dict)) {
+		PyErr_SetString(PyExc_TypeError, "Expected dictionary with property changes");
+		return false;
+	}
+
+	*ret = apr_array_make(pool, PyDict_Size(dict), sizeof(char *));
+
+	while (PyDict_Next(dict, &idx, &key, &val)) {
+		   svn_prop_t *prop = apr_palloc(pool, sizeof(svn_prop_t));
+		   prop->name = PyString_AsString(key);
+		   if (val == Py_None) {
+			   prop->value = NULL;
+		   } else {
+		       prop->value = svn_string_ncreate(PyString_AsString(val), PyString_Size(val), pool);
+		   }
+		   APR_ARRAY_PUSH(*ret, svn_prop_t *) = prop;
+	}
+
+	return true;
+}
+
+static PyObject *adm_process_committed(PyObject *self, PyObject *args, PyObject *kwargs)
+{
+	char *path, *rev_date, *rev_author;
+	bool recurse, remove_lock = false;
+	unsigned char *digest = NULL;
+	svn_revnum_t new_revnum;
+	PyObject *py_wcprop_changes = Py_None;
+	apr_array_header_t *wcprop_changes;
+	AdmObject *admobj = (AdmObject *)self;
+	apr_pool_t *temp_pool;
+	char *kwnames[] = { "path", "recurse", "new_revnum", "rev_date", "rev_author", 
+		                "wcprop_changes", "remove_lock", "digest", NULL };
+
+	if (!PyArg_ParseTupleAndKeywords(args, kwargs, "sblss|Obs", kwnames, 
+									 &path, &recurse, &new_revnum, &rev_date,
+									 &rev_author, &py_wcprop_changes, 
+									 &remove_lock, &digest))
+		return NULL;
+
+	temp_pool = Pool();
+	if (temp_pool == NULL)
+		return NULL;
+
+	if (!py_dict_to_wcprop_changes(py_wcprop_changes, temp_pool, &wcprop_changes)) {
+		apr_pool_destroy(temp_pool);
+		return NULL;
+	}
+
+	RUN_SVN_WITH_POOL(temp_pool, svn_wc_process_committed3(path, admobj->adm, recurse, new_revnum, 
+														   rev_date, rev_author, wcprop_changes, 
+														   remove_lock, digest, temp_pool));
+
+	apr_pool_destroy(temp_pool);
+
+	return Py_None;
+}
+
 static PyObject *adm_close(PyObject *self)
 {
 	AdmObject *admobj = (AdmObject *)self;
@@ -532,6 +600,7 @@
 	{ "get_update_editor", adm_get_update_editor, METH_VARARGS, NULL },
 	{ "close", (PyCFunction)adm_close, METH_NOARGS, NULL },
 	{ "entry", (PyCFunction)adm_entry, METH_VARARGS, NULL },
+	{ "process_committed", (PyCFunction)adm_process_committed, METH_VARARGS|METH_KEYWORDS, NULL },
 	{ NULL, }
 };
 

=== modified file 'workingtree.py'
--- a/workingtree.py	2008-06-04 23:03:52 +0000
+++ b/workingtree.py	2008-06-05 14:48:23 +0000
@@ -118,8 +118,7 @@
 
                 subprefix = os.path.join(prefix, entry)
 
-                subwc = wc.WorkingCopy(adm, self.abspath(subprefix), False, 
-                                         0, None)
+                subwc = wc.WorkingCopy(adm, self.abspath(subprefix))
                 try:
                     dir_add(subwc, subprefix, urlutils.joinpath(patprefix, entry))
                 finally:
@@ -186,8 +185,7 @@
         self.read_working_inventory()
 
     def _get_wc(self, relpath="", write_lock=False):
-        return wc.WorkingCopy(None, self.abspath(relpath).rstrip("/"), 
-                                write_lock, 0, None)
+        return wc.WorkingCopy(None, self.abspath(relpath).rstrip("/"), write_lock)
 
     def _get_rel_wc(self, relpath, write_lock=False):
         dir = os.path.dirname(relpath)
@@ -348,8 +346,7 @@
                 assert entry
                 
                 if entry.kind == core.NODE_DIR:
-                    subwc = wc.WorkingCopy(adm, self.abspath(subrelpath), 
-                                             False, 0, None)
+                    subwc = wc.WorkingCopy(adm, self.abspath(subrelpath))
                     try:
                         add_dir_to_inv(subrelpath, subwc, id)
                     finally:
@@ -395,8 +392,8 @@
 
             adm.process_committed(self.abspath(path).rstrip("/"), 
                           False, revnum, 
-                          svn_time_to_cstring(newrev.timestamp), 
-                          newrev.committer, None, False)
+                          time_to_cstring(newrev.timestamp), 
+                          newrev.committer)
 
             if newrevtree.inventory[id].kind != 'directory':
                 return
@@ -406,7 +403,7 @@
                 if entry == "":
                     continue
 
-                subwc = wc.WorkingCopy(adm, os.path.join(self.basedir, path, entry), False, 0, None)
+                subwc = wc.WorkingCopy(adm, os.path.join(self.basedir, path, entry), write_lock=True)
                 try:
                     update_settings(subwc, os.path.join(path, entry))
                 finally:
@@ -699,7 +696,7 @@
         
         # Open related remote repository + branch
         try:
-            adm = wc.WorkingCopy(None, self.local_path, False, 0, None)
+            adm = wc.WorkingCopy(None, self.local_path)
         except SubversionException, (msg, constants.ERR_WC_UNSUPPORTED_FORMAT):
             raise UnsupportedFormatError(msg, kind='workingtree')
         try:




More information about the bazaar-commits mailing list