Rev 1065: Use more convenience functions. in file:///data/jelmer/bzr-svn/cext/

Jelmer Vernooij jelmer at samba.org
Tue Jun 3 08:43:10 BST 2008


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

------------------------------------------------------------
revno: 1065
revision-id: jelmer at samba.org-20080603074309-gto9mwplhx59wb16
parent: jelmer at samba.org-20080603053205-etm0kwor0z9l0qr8
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: cext
timestamp: Tue 2008-06-03 09:43:09 +0200
message:
  Use more convenience functions.
modified:
  __init__.py                    __init__.py-20051008155114-eae558e6cf149e1d
  client.c                       client.pyx-20080313235339-wbyjbw2namuiql8f-1
  logwalker.py                   logwalker.py-20060621215743-c13fhfnyzh1xzwh2-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 '__init__.py'
--- a/__init__.py	2008-06-02 21:15:49 +0000
+++ b/__init__.py	2008-06-03 07:43:09 +0000
@@ -31,7 +31,7 @@
 # versions ending in 'exp' mean experimental mappings
 # versions ending in 'dev' mean development version
 # versions ending in 'final' mean release (well tested, etc)
-version_info = (0, 4, 11, 'dev', 0)
+version_info = (0, 4, 11, 'exp', 0)
 
 if version_info[3] == 'final':
     version_string = '%d.%d.%d' % version_info[:3]

=== modified file 'client.c'
--- a/client.c	2008-06-03 05:32:05 +0000
+++ b/client.c	2008-06-03 07:43:09 +0000
@@ -119,7 +119,9 @@
 
 static PyObject *py_commit_info_tuple(svn_commit_info_t *ci)
 {
-    if (ci == NULL)
+	if (ci == NULL)
+		Py_RETURN_NONE;
+    if (ci->revision == SVN_INVALID_REVNUM)
         Py_RETURN_NONE;
     return Py_BuildValue("(izz)", ci->revision, ci->date, ci->author);
 }

=== modified file 'logwalker.py'
--- a/logwalker.py	2008-06-03 05:32:05 +0000
+++ b/logwalker.py	2008-06-03 07:43:09 +0000
@@ -28,8 +28,6 @@
 from cache import CacheTable
 import changes
 
-LOG_CHUNK_LIMIT = 0
-
 class lazy_dict(object):
     def __init__(self, initial, create_fn, *args):
         self.initial = initial
@@ -266,27 +264,31 @@
         pb = ui.ui_factory.nested_progress_bar()
 
         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)
+                pb.update('fetching svn revision info', revision, to_revnum)
+                if orig_paths is None:
+                    orig_paths = {}
+                for p in orig_paths:
+                    (action, copyfrom_path, copyfrom_rev) = orig_paths[p]
+
+                    if copyfrom_path:
+                        copyfrom_path = copyfrom_path.strip("/")
+                    self.cachedb.execute(
+                         "replace into changed_path (rev, path, action, copyfrom_path, copyfrom_rev) values (?, ?, ?, ?, ?)", 
+                         (revision, p.strip("/"), action, copyfrom_path, copyfrom_rev))
+
+                self.saved_revnum = revision
+                if self.saved_revnum % 1000 == 0:
+                    self.cachedb.commit()
+
             try:
-                while self.saved_revnum < to_revnum:
-                    assert isinstance(self.saved_revnum, int)
-                    assert isinstance(to_revnum, int)
-                    for (orig_paths, revision, revprops) in self.actual._transport.iter_log(None, self.saved_revnum, to_revnum, self.actual._limit, True, 
-                                             True, []):
-                        pb.update('fetching svn revision info', revision, to_revnum)
-                        if orig_paths is None:
-                            orig_paths = {}
-                        for p in orig_paths:
-                            (action, copyfrom_path, copyfrom_rev) = orig_paths[p]
-
-                            if copyfrom_path:
-                                copyfrom_path = copyfrom_path.strip("/")
-                            self.cachedb.execute(
-                                 "replace into changed_path (rev, path, action, copyfrom_path, copyfrom_rev) values (?, ?, ?, ?, ?)", 
-                                 (revision, p.strip("/"), action, copyfrom_path, copyfrom_rev))
-
-                        self.saved_revnum = revision
-                        if self.saved_revnum % 1000 == 0:
-                            self.cachedb.commit()
+                assert isinstance(self.saved_revnum, int)
+                assert isinstance(to_revnum, int)
+                self.actual._transport.get_log(update_db, None, self.saved_revnum, to_revnum, 0, True, True, [])
             finally:
                 pb.finished()
         except SubversionException, (_, num):
@@ -320,11 +322,6 @@
 
         self._transport = transport
 
-        if limit is not None:
-            self._limit = limit
-        else:
-            self._limit = LOG_CHUNK_LIMIT
-
     def find_latest_change(self, path, revnum):
         """Find latest revision that touched path.
 

=== modified file 'ra.c'
--- a/ra.c	2008-06-03 05:32:05 +0000
+++ b/ra.c	2008-06-03 07:43:09 +0000
@@ -22,6 +22,8 @@
 #include <svn_ra.h>
 #include <apr_file_io.h>
 
+#include <structmember.h>
+
 #include "editor.h"
 #include "util.h"
 
@@ -1225,7 +1227,7 @@
 {
 	RemoteAccessObject *ra = (RemoteAccessObject *)self;
 	apr_pool_destroy(ra->pool);
-	Py_DECREF(ra->auth);
+	Py_XDECREF(ra->auth);
 }
 
 static PyObject *ra_repr(PyObject *self)
@@ -1258,6 +1260,12 @@
 	{ NULL, }
 };
 
+static PyMemberDef ra_members[] = {
+	{ "busy", T_BYTE, offsetof(RemoteAccessObject, busy), READONLY, NULL },
+	{ "url", T_STRING, offsetof(RemoteAccessObject, url), READONLY, NULL },
+	{ NULL, }
+};
+
 PyTypeObject RemoteAccess_Type = {
 	PyObject_HEAD_INIT(&PyType_Type) 0,
 	.tp_name = "ra.RemoteAccess",
@@ -1266,6 +1274,7 @@
 	.tp_dealloc = ra_dealloc,
 	.tp_repr = ra_repr,
 	.tp_methods = ra_methods,
+	.tp_members = ra_members,
 	.tp_flags = Py_TPFLAGS_HAVE_GC,
 };
 
@@ -1632,4 +1641,5 @@
 	Py_INCREF(&Auth_Type);
 
 	busy_exc = PyErr_NewException("ra.BusyException", NULL, NULL);
+	PyModule_AddObject(mod, "BusyException", busy_exc);
 }

=== modified file 'tests/__init__.py'
--- a/tests/__init__.py	2008-06-03 05:32:05 +0000
+++ b/tests/__init__.py	2008-06-03 07:43:09 +0000
@@ -131,9 +131,7 @@
         """
         olddir = os.path.abspath('.')
         self.next_message = message
-        os.chdir(dir)
-        info = self.client_ctx.commit(["."], recursive, False)
-        os.chdir(olddir)
+        info = self.client_ctx.commit([dir], recursive, False)
         assert info is not None
         return info
 

=== modified file 'transport.py'
--- a/transport.py	2008-06-03 00:00:50 +0000
+++ b/transport.py	2008-06-03 07:43:09 +0000
@@ -92,193 +92,23 @@
     return convert
 
 
-class Connection(object):
-    """An single connection to a Subversion repository. This usually can 
-    only do one operation at a time."""
-    def __init__(self, url):
-        self._busy = False
-        self._root = None
-        self._unbusy_handler = None
-        self.url = url
-        try:
-            self.mutter('opening SVN RA connection to %r' % url)
-            self._ra = ra.RemoteAccess(url.encode('utf8'), 
-                    auth=create_auth_baton(self.url))
-            # FIXME: Callbacks
-        except SubversionException, (_, num):
-            if num in (constants.ERR_RA_SVN_REPOS_NOT_FOUND,):
-                raise NoSvnRepositoryPresent(url=url)
-            if num == constants.ERR_BAD_URL:
-                raise InvalidURL(url)
-            raise
-
-        from bzrlib.plugins.svn import lazy_check_versions
-        lazy_check_versions()
-
-    def is_busy(self):
-        return self._busy
-
-    def _mark_busy(self):
-        assert not self._busy, "already busy"
-        self._busy = True
-
-    def set_unbusy_handler(self, handler):
-        self._unbusy_handler = handler
-
-    def _unmark_busy(self):
-        assert self._busy, "not busy"
-        self._busy = False
-        if self._unbusy_handler is not None:
-            self._unbusy_handler()
-            self._unbusy_handler = None
-
-    def mutter(self, text):
-        if 'transport' in debug.debug_flags:
-                mutter(text)
-
-    @convert_svn_error
-    def get_uuid(self):
-        self.mutter('svn get-uuid')
-        return self._ra.get_uuid()
-
-    @convert_svn_error
-    @needs_busy
-    def get_repos_root(self):
-        if self._root is None:
-            self.mutter("svn get-repos-root")
-            self._root = self._ra.get_repos_root()
-        return self._root
-
-    @convert_svn_error
-    def get_latest_revnum(self):
-        self.mutter("svn get-latest-revnum")
-        return self._ra.get_latest_revnum()
-
-    @convert_svn_error
-    def do_switch(self, switch_rev, recurse, switch_url, editor):
-        self.mutter('svn switch -r %d -> %r' % (switch_rev, switch_url))
-        return self._ra.do_switch(switch_rev, "", recurse, switch_url, editor)
-
-    @convert_svn_error
-    def change_rev_prop(self, revnum, name, value):
-        self.mutter('svn revprop -r%d --set %s=%s' % (revnum, name, value))
-        self._ra.change_rev_prop(revnum, name, value)
- 
-    @convert_svn_error
-    @needs_busy
-    def get_dir(self, path, revnum, pool=None, kind=False):
-        self.mutter("svn ls -r %d '%r'" % (revnum, path))
-        assert len(path) == 0 or path[0] != "/"
-        # ra_dav backends fail with strange errors if the path starts with a 
-        # slash while other backends don't.
-        fields = 0
-        if kind:
-            fields += core.SVN_DIRENT_KIND
-        return self._ra.get_dir(path, revnum, fields)
-
-    @convert_svn_error
-    def get_lock(self, path):
-        return self._ra.get_lock(path)
-
-    @convert_svn_error
-    def unlock(self, locks, break_lock=False):
-        def lock_cb(baton, path, do_lock, lock, ra_err):
-            pass
-        return self._ra.unlock(locks, break_lock, lock_cb)
-
-    @convert_svn_error
-    def lock_write(self, path_revs, comment=None, steal_lock=False):
-        return self.PhonyLock() # FIXME
-        tokens = {}
-        def lock_cb(baton, path, do_lock, lock, ra_err):
-            tokens[path] = lock
-        self._ra.lock(path_revs, comment, steal_lock, lock_cb)
-        return SvnLock(self, tokens)
-
-    @convert_svn_error
-    @needs_busy
-    def check_path(self, path, revnum):
-        assert len(path) == 0 or path[0] != "/"
-        self.mutter("svn check_path -r%d %s" % (revnum, path))
-        return self._ra.check_path(path.encode('utf-8'), revnum)
-
-    @convert_svn_error
-    def mkdir(self, relpath, mode=None):
-        assert len(relpath) == 0 or relpath[0] != "/"
-        path = urlutils.join(self.url, relpath)
-        try:
-            self._client.mkdir([path.encode("utf-8")])
-        except SubversionException, (msg, num):
-            if num == constants.ERR_FS_NOT_FOUND:
-                raise NoSuchFile(path)
-            if num == constants.ERR_FS_ALREADY_EXISTS:
-                raise FileExists(path)
-            raise
-
-    @convert_svn_error
-    def replay(self, revision, low_water_mark, send_deltas, editor):
-        self.mutter('svn replay -r%r:%r' % (low_water_mark, revision))
-        self._ra.replay(revision, low_water_mark, editor, send_deltas)
-
-    @convert_svn_error
-    def do_update(self, revnum, recurse, editor):
-        self.mutter('svn update -r %r' % revnum)
-        return self._ra.do_update(revnum, "", recurse, editor)
-
-    @convert_svn_error
-    def has_capability(self, cap):
-        return self._ra.has_capability(cap)
-
-    @convert_svn_error
-    def revprop_list(self, revnum):
-        self.mutter('svn revprop-list -r %r' % revnum)
-        return self._ra.rev_proplist(revnum)
-
-    @convert_svn_error
-    def get_commit_editor(self, revprops, done_cb, lock_token, keep_locks):
-        return self._ra.get_commit_editor(revprops, done_cb, lock_token, 
-                                          keep_locks)
-
-    class SvnLock(object):
-        def __init__(self, connection, tokens):
-            self._tokens = tokens
-            self._connection = connection
-
-        def unlock(self):
-            self._connection.unlock(self.locks)
-
-    @convert_svn_error
-    @needs_busy
-    def lock_write(self, path_revs, comment=None, steal_lock=False):
-        tokens = {}
-        def lock_cb(baton, path, do_lock, lock, ra_err, pool):
-            tokens[path] = lock
-        self._ra.lock(path_revs, comment, steal_lock, lock_cb)
-        return SvnLock(self, tokens)
-
-    @convert_svn_error
-    @needs_busy
-    def get_log(self, paths, from_revnum, to_revnum, limit, 
-                discover_changed_paths, strict_node_history, revprops, rcvr):
-        # No paths starting with slash, please
-        assert paths is None or all([not p.startswith("/") for p in paths])
-        self.mutter('svn log %r:%r %r (limit: %r)' % (from_revnum, to_revnum, paths, limit))
-        return self._ra.get_log(rcvr, paths, 
-                       from_revnum, to_revnum, limit, 
-                       discover_changed_paths, strict_node_history, 
-                       revprops)
-
-    @convert_svn_error
-    @needs_busy
-    def reparent(self, url):
-        if self.url == url:
-            return
-        if hasattr(self._ra, 'reparent'):
-            self.mutter('svn reparent %r' % url)
-            self._ra.reparent(url)
-            self.url = url
-        else:
-            raise NotImplementedError(self.reparent)
+def Connection(url):
+    try:
+        mutter('opening SVN RA connection to %r' % url)
+        ret = ra.RemoteAccess(url.encode('utf8'), 
+                auth=create_auth_baton(url))
+        # FIXME: Callbacks
+    except SubversionException, (_, num):
+        if num in (constants.ERR_RA_SVN_REPOS_NOT_FOUND,):
+            raise NoSvnRepositoryPresent(url=url)
+        if num == constants.ERR_BAD_URL:
+            raise InvalidURL(url)
+        raise
+
+    from bzrlib.plugins.svn import lazy_check_versions
+    lazy_check_versions()
+
+    return ret
 
 
 class ConnectionPool(object):
@@ -289,7 +119,7 @@
     def get(self, url):
         # Check if there is an existing connection we can use
         for c in self.connections:
-            assert not c.is_busy(), "busy connection in pool"
+            assert not c.busy, "busy connection in pool"
             if c.url == url:
                 self.connections.remove(c)
                 return c
@@ -308,7 +138,7 @@
             raise
 
     def add(self, connection):
-        assert not connection.is_busy(), "adding busy connection in pool"
+        assert not connection.busy, "adding busy connection in pool"
         self.connections.add(connection)
     
 
@@ -363,6 +193,7 @@
 
     def get_uuid(self):
         conn = self.get_connection()
+        self.mutter('svn get-uuid')
         try:
             return conn.get_uuid()
         finally:
@@ -377,6 +208,7 @@
 
     def get_svn_repos_root(self):
         conn = self.get_connection()
+        self.mutter('svn get-repos-root')
         try:
             return conn.get_repos_root()
         finally:
@@ -384,15 +216,17 @@
 
     def get_latest_revnum(self):
         conn = self.get_connection()
+        self.mutter('svn get-latest-revnum')
         try:
             return conn.get_latest_revnum()
         finally:
             self.add_connection(conn)
 
-    def do_switch(self, switch_rev, recurse, switch_url, editor, pool=None):
+    def do_switch(self, switch_rev, recurse, switch_url, editor):
         conn = self._open_real_transport()
+        self.mutter('svn do-switch -r%d %s' % (switch_rev, switch_url))
         conn.set_unbusy_handler(lambda: self.add_connection(conn))
-        return conn.do_switch(switch_rev, recurse, switch_url, editor, pool)
+        return conn.do_switch(switch_rev, recurse, switch_url, editor)
 
     def iter_log(self, paths, from_revnum, to_revnum, limit, discover_changed_paths, 
                  strict_node_history, revprops):
@@ -429,7 +263,7 @@
                     self.semaphore.release()
                 self.conn = self.transport.get_connection()
                 try:
-                    self.conn.get_log(rcvr=rcvr, **self.kwargs)
+                    self.conn.get_log(rcvr, **self.kwargs)
                     self.pending.append(None)
                 except Exception, e:
                     self.pending.append(e)
@@ -444,11 +278,13 @@
         fetcher.start()
         return iter(fetcher.next, None)
 
-    def get_log(self, paths, from_revnum, to_revnum, limit, discover_changed_paths, 
-                strict_node_history, revprops, rcvr, pool=None):
+    def get_log(self, rcvr, paths, from_revnum, to_revnum, limit, discover_changed_paths, 
+                strict_node_history, revprops):
         assert paths is None or isinstance(paths, list), "Invalid paths"
         assert paths is None or all([isinstance(x, str) for x in paths])
 
+        self.mutter('svn log -r%d:%d %r' % (from_revnum, to_revnum, paths))
+
         if paths is None:
             newpaths = None
         else:
@@ -456,10 +292,10 @@
 
         conn = self.get_connection()
         try:
-            return conn.get_log(newpaths, 
+            return conn.get_log(rcvr, newpaths, 
                     from_revnum, to_revnum,
                     limit, discover_changed_paths, strict_node_history, 
-                    revprops, rcvr)
+                    revprops)
         finally:
             self.add_connection(conn)
 
@@ -468,18 +304,20 @@
             return self.connections.get(self.svn_url)
         return self.get_connection()
 
-    def change_rev_prop(self, revnum, name, value, pool=None):
+    def change_rev_prop(self, revnum, name, value):
         conn = self.get_connection()
+        self.mutter('svn change-revprop -r%d %s=%s' % (revnum, name, value))
         try:
-            return conn.change_rev_prop(revnum, name, value, pool)
+            return conn.change_rev_prop(revnum, name, value)
         finally:
             self.add_connection(conn)
 
-    def get_dir(self, path, revnum, pool=None, kind=False):
+    def get_dir(self, path, revnum, kind=False):
         path = self._request_path(path)
         conn = self.get_connection()
+        self.mutter('svn get-dir -r%d %s' % (revnum, path))
         try:
-            return conn.get_dir(path, revnum, pool, kind)
+            return conn.get_dir(path, revnum, kind)
         finally:
             self.add_connection(conn)
 
@@ -512,6 +350,7 @@
     def check_path(self, path, revnum):
         path = self._request_path(path)
         conn = self.get_connection()
+        self.mutter('svn check-path -r%d %s' % (revnum, path))
         try:
             return conn.check_path(path, revnum)
         finally:
@@ -519,26 +358,30 @@
 
     def mkdir(self, relpath, mode=None):
         conn = self.get_connection()
+        self.mutter('svn mkdir %s' % (relpath,))
         try:
             return conn.mkdir(relpath, mode)
         finally:
             self.add_connection(conn)
 
-    def replay(self, revision, low_water_mark, send_deltas, editor, pool=None):
+    def replay(self, revision, low_water_mark, send_deltas, editor):
         conn = self._open_real_transport()
+        self.mutter('svn replay -r%d:%d' % (low_water_mark,revision))
         try:
             return conn.replay(revision, low_water_mark, 
-                                             send_deltas, editor, pool)
+                                             send_deltas, editor)
         finally:
             self.add_connection(conn)
 
-    def do_update(self, revnum, recurse, editor, pool=None):
+    def do_update(self, revnum, recurse, editor):
         conn = self._open_real_transport()
+        self.mutter('svn do-update -r%d' % (revnum,))
         conn.set_unbusy_handler(lambda: self.add_connection(conn))
-        return conn.do_update(revnum, recurse, editor, pool)
+        return conn.do_update(revnum, recurse, editor)
 
     def has_capability(self, cap):
         conn = self.get_connection()
+        self.mutter('svn has-capability %s' % (cap,))
         try:
             return conn.has_capability(cap)
         finally:
@@ -546,6 +389,7 @@
 
     def revprop_list(self, revnum):
         conn = self.get_connection()
+        self.mutter('svn revprop-list -r%d' % (revnum,))
         try:
             return conn.revprop_list(revnum)
         finally:
@@ -553,6 +397,7 @@
 
     def get_commit_editor(self, revprops, done_cb, lock_token, keep_locks):
         conn = self._open_real_transport()
+        self.mutter('svn get-commit-editor %r' % (revprops,))
         conn.set_unbusy_handler(lambda: self.add_connection(conn))
         return conn.get_commit_editor(revprops, done_cb,
                                      lock_token, keep_locks)

=== modified file 'util.c'
--- a/util.c	2008-06-03 05:32:05 +0000
+++ b/util.c	2008-06-03 07:43:09 +0000
@@ -94,9 +94,8 @@
 		return false;
 	}
     *ret = apr_array_make(pool, PyList_Size(l), sizeof(char *));
-	for (i = 0; i < PyList_Size(l); i++) {
-		char **el = (char **)apr_array_push(*ret);
-        *el = PyString_AsString(PyList_GetItem(l, i));
+	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)));
 	}
     return true;
 }
@@ -191,8 +190,7 @@
 		return NULL;
 	}
     for (i = 0; i < PyList_Size(l); i++) {
-		svn_revnum_t *el = (svn_revnum_t *)apr_array_push(ret);
-        *el = PyLong_AsLong(PyList_GetItem(l, i));
+		APR_ARRAY_IDX(ret, i, svn_revnum_t) = PyLong_AsLong(PyList_GetItem(l, i));
 	}
     return ret;
 }




More information about the bazaar-commits mailing list