Rev 963: Wrap more ra functions. in file:///data/jelmer/bzr-svn/pyrex/

Jelmer Vernooij jelmer at samba.org
Thu Mar 13 17:29:37 GMT 2008


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

------------------------------------------------------------
revno: 963
revision-id:jelmer at samba.org-20080313172936-2p4ayu4auh9yglq9
parent: jelmer at samba.org-20080313170828-3ni4evu6st0ifys1
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: pyrex
timestamp: Thu 2008-03-13 18:29:36 +0100
message:
  Wrap more ra functions.
modified:
  ra.pyx                         ra.pyx-20080313140933-qybkqaxe3m4mcll7-1
  transport.py                   transport.py-20060406231150-b3472d06b3a0818d
=== modified file 'ra.pyx'
--- a/ra.pyx	2008-03-13 17:08:28 +0000
+++ b/ra.pyx	2008-03-13 17:29:36 +0000
@@ -77,6 +77,7 @@
     ctypedef struct svn_string_t:
         char *data
         long len
+    svn_string_t *svn_string_ncreate(char *bytes, long size, apr_pool_t *pool)
 
 cdef extern from "svn_delta.h":
     ctypedef struct svn_txdelta_window_t
@@ -151,6 +152,11 @@
 
 cdef extern from "svn_types.h":
     ctypedef svn_error_t *(*svn_log_message_receiver_t) (baton, apr_hash_t *changed_paths, long revision, char *author, char *date, char *message, apr_pool_t *pool) except *
+    ctypedef enum svn_node_kind_t:
+        svn_node_node
+        svn_node_file
+        svn_node_dir
+        svn_node_unknown
     ctypedef struct svn_commit_info_t:
         long revision
         char *date
@@ -175,6 +181,7 @@
     baton(py_changed_paths, revision, author, date, message)
 
 cdef extern from "svn_ra.h":
+    ctypedef struct svn_lock_t
     svn_version_t *svn_ra_version()
 
     ctypedef struct svn_ra_reporter2_t:
@@ -287,6 +294,32 @@
                                            int keep_locks,
                                            apr_pool_t *pool)
 
+    svn_error_t *svn_ra_change_rev_prop(svn_ra_session_t *session,
+                                    long rev,
+                                    char *name,
+                                    svn_string_t *value,
+                                    apr_pool_t *pool)
+
+    svn_error_t *svn_ra_get_dir2(svn_ra_session_t *session,
+                                 apr_hash_t **dirents,
+                                 long *fetched_rev,
+                                 apr_hash_t **props,
+                                 char *path,
+                                 long revision,
+                                 long dirent_fields,
+                                 apr_pool_t *pool)
+
+    svn_error_t *svn_ra_get_lock(svn_ra_session_t *session,
+                                 svn_lock_t **lock,
+                                 char *path,
+                                 apr_pool_t *pool)
+
+    svn_error_t *svn_ra_check_path(svn_ra_session_t *session,
+                                   char *path,
+                                   long revision,
+                                   svn_node_kind_t *kind,
+                                   apr_pool_t *pool)
+
 
 cdef class Reporter:
     """Change reporter."""
@@ -448,7 +481,7 @@
         apr_pool_destroy(temp_pool)
         return py_props
 
-    def get_commit_editor(self, log_msg, commit_callback, lock_tokens, 
+    def get_commit_editor(self, revprops, commit_callback, lock_tokens, 
                           keep_locks):
         cdef apr_pool_t *temp_pool
         cdef svn_delta_editor_t *editor
@@ -456,11 +489,51 @@
         cdef apr_hash_t *hash_lock_tokens
         temp_pool = Pool(self.pool)
         _check_error(svn_ra_get_commit_editor2(self.ra, &editor, 
-                     &edit_baton, log_msg, py_commit_callback, commit_callback, 
-                     hash_lock_tokens, keep_locks, temp_pool))
+			&edit_baton, revprops[SVN_PROP_REVISION_LOG], py_commit_callback, 
+			commit_callback, hash_lock_tokens, keep_locks, temp_pool))
         apr_pool_destroy(temp_pool)
         return None # FIXME: convert editor
 
+    def change_rev_prop(self, rev, name, value):
+        cdef apr_pool_t *temp_pool
+        cdef svn_string_t *val_string
+        temp_pool = Pool(self.pool)
+        val_string = svn_string_ncreate(value, len(value), temp_pool)
+        _check_error(svn_ra_change_rev_prop(self.ra, rev, name, 
+                     val_string, temp_pool))
+        apr_pool_destroy(temp_pool)
+    
+    def get_dir(self, path, revision, dirent_fields):
+        cdef apr_pool_t *temp_pool
+        cdef apr_hash_t *dirents
+        cdef apr_hash_t *props
+        cdef long fetch_rev
+        temp_pool = Pool(self.pool)
+        _check_error(svn_ra_get_dir2(self.ra, &dirents, &fetch_rev, &props,
+                     path, revision, dirent_fields, temp_pool))
+        # FIXME: Convert dirents to python hash
+        # FIXME: Convert props to python hash
+        py_dirents = {}
+        py_props = {}
+        apr_pool_destroy(temp_pool)
+        return (py_dirents, fetch_rev, py_props)
+
+    def get_lock(self, path):
+        cdef svn_lock_t *lock
+        cdef apr_pool_t *temp_pool
+        temp_pool = Pool(self.pool)
+        _check_error(svn_ra_get_lock(self.ra, &lock, path, temp_pool))
+        apr_pool_destroy(temp_pool)
+        return lock
+
+    def check_path(self, path, revision):
+        cdef svn_node_kind_t kind
+        cdef apr_pool_t *temp_pool
+        temp_pool = Pool(self.pool)
+        _check_error(svn_ra_check_path(self.ra, path, revision, &kind, 
+                     temp_pool))
+        apr_pool_destroy(temp_pool)
+        return kind
 
     def __dealloc__(self):
         if self.pool != NULL:
@@ -468,3 +541,5 @@
 
     def __repr__(self):
         return "%s(%r)" % (self.__class__.__name__, self.url)
+
+SVN_PROP_REVISION_LOG = "svn:log"

=== modified file 'transport.py'
--- a/transport.py	2008-03-13 17:08:28 +0000
+++ b/transport.py	2008-03-13 17:29:36 +0000
@@ -101,21 +101,6 @@
     return url.rstrip('/')
 
 
-def needs_busy(unbound):
-    """Decorator that marks a transport as busy before running a methd on it.
-    """
-    def convert(self, *args, **kwargs):
-        self._mark_busy()
-        try:
-            return unbound(self, *args, **kwargs)
-        finally:
-            self._unmark_busy()
-
-    convert.__doc__ = unbound.__doc__
-    convert.__name__ = unbound.__name__
-    return convert
-
-
 class Editor:
     """Simple object wrapper around the Subversion delta editor interface."""
     def __init__(self, transport, (editor, editor_baton)):
@@ -142,7 +127,6 @@
     def close(self):
         assert self.recent_baton == []
         svn.delta.editor_invoke_close_edit(self.editor, self.editor_baton)
-        self._transport._unmark_busy()
 
     @convert_svn_error
     def apply_textdelta(self, baton, *args, **kwargs):
@@ -237,16 +221,6 @@
         from bzrlib.plugins.svn import lazy_check_versions
         lazy_check_versions()
 
-        self._busy = False
-
-    def _mark_busy(self):
-        assert not self._busy
-        self._busy = True
-
-    def _unmark_busy(self):
-        assert self._busy
-        self._busy = False
-
     def mutter(self, text):
         if 'transport' in debug.debug_flags:
             mutter(text)
@@ -268,7 +242,6 @@
         raise TransportNotPossible('stat not supported on Subversion')
 
     @convert_svn_error
-    @needs_busy
     def get_uuid(self):
         self.mutter('svn get-uuid')
         return self._ra.get_uuid()
@@ -281,7 +254,6 @@
         return root
 
     @convert_svn_error
-    @needs_busy
     def get_svn_repos_root(self):
         if self._root is None:
             self.mutter("svn get-repos-root")
@@ -289,7 +261,6 @@
         return self._root
 
     @convert_svn_error
-    @needs_busy
     def get_latest_revnum(self):
         self.mutter("svn get-latest-revnum")
         return self._ra.get_latest_revnum()
@@ -304,11 +275,9 @@
     def do_switch(self, switch_rev, recurse, switch_url, editor, pool=None):
         self._open_real_transport()
         self.mutter('svn switch -r %d -> %r' % (switch_rev, switch_url))
-        self._mark_busy()
         return self._ra.do_switch(switch_rev, "", recurse, switch_url, editor)
 
     @convert_svn_error
-    @needs_busy
     def get_log(self, path, from_revnum, to_revnum, limit, discover_changed_paths, 
                 strict_node_history, revprops, rcvr, pool=None):
         self.mutter('svn log %r:%r %r' % (from_revnum, to_revnum, path))
@@ -353,12 +322,11 @@
             self.reparent(self.get_repos_root())
 
     @convert_svn_error
-    def change_rev_prop(self, revnum, name, value, pool=None):
+    def change_rev_prop(self, revnum, name, value):
         self.mutter('svn revprop -r%d --set %s=%s' % (revnum, name, value))
-        svn.ra.change_rev_prop(self._ra, revnum, name, value)
+        self._ra.change_rev_prop(revnum, name, value)
 
     @convert_svn_error
-    @needs_busy
     def reparent(self, url):
         url = url.rstrip("/")
         self.base = url
@@ -375,7 +343,6 @@
         self._backing_url = self.svn_url
 
     @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] != "/"
@@ -386,7 +353,7 @@
             fields = 0
             if kind:
                 fields += svn.core.SVN_DIRENT_KIND
-            return svn.ra.get_dir2(self._ra, path, revnum, fields)
+            return self._ra.get_dir(path, revnum, fields)
         else:
             return svn.ra.get_dir(self._ra, path, revnum)
 
@@ -414,9 +381,8 @@
         return dirents.keys()
 
     @convert_svn_error
-    @needs_busy
     def get_lock(self, path):
-        return svn.ra.get_lock(self._ra, path)
+        return self._ra.get_lock(path)
 
     class SvnLock:
         def __init__(self, transport, tokens):
@@ -427,14 +393,12 @@
             self.transport.unlock(self.locks)
 
     @convert_svn_error
-    @needs_busy
     def unlock(self, locks, break_lock=False):
         def lock_cb(baton, path, do_lock, lock, ra_err, pool):
             pass
         return svn.ra.unlock(self._ra, locks, break_lock, lock_cb)
 
     @convert_svn_error
-    @needs_busy
     def lock_write(self, path_revs, comment=None, steal_lock=False):
         return self.PhonyLock() # FIXME
         tokens = {}
@@ -444,15 +408,13 @@
         return SvnLock(self, tokens)
 
     @convert_svn_error
-    @needs_busy
-    def check_path(self, path, revnum, *args, **kwargs):
+    def check_path(self, path, revnum):
         assert len(path) == 0 or path[0] != "/"
         path = self._request_path(path)
         self.mutter("svn check_path -r%d %s" % (revnum, path))
-        return svn.ra.check_path(self._ra, path.encode('utf-8'), revnum, *args, **kwargs)
+        return self._ra.check_path(path.encode('utf-8'), revnum)
 
     @convert_svn_error
-    @needs_busy
     def mkdir(self, relpath, mode=None):
         assert len(relpath) == 0 or relpath[0] != "/"
         path = urlutils.join(self.svn_url, relpath)
@@ -469,14 +431,12 @@
     def replay(self, revision, low_water_mark, send_deltas, editor):
         self._open_real_transport()
         self.mutter('svn replay -r%r:%r' % (low_water_mark, revision))
-        self._mark_busy()
         self._ra.replay(revision, low_water_mark, send_deltas, editor)
 
     @convert_svn_error
     def do_update(self, revnum, recurse, editor):
         self._open_real_transport()
         self.mutter('svn update -r %r' % revnum)
-        self._mark_busy()
         return self._ra.do_update(revnum, "", recurse, editor))
 
     @convert_svn_error
@@ -491,22 +451,7 @@
     @convert_svn_error
     def get_commit_editor(self, revprops, done_cb, lock_token, keep_locks):
         self._open_real_transport()
-        self._mark_busy()
-        try:
-            if hasattr(svn.ra, 'get_commit_editor3'):
-                editor = svn.ra.get_commit_editor3(self._ra, revprops, done_cb, 
-                                                  lock_token, keep_locks)
-            elif revprops.keys() != [svn.core.SVN_PROP_REVISION_LOG]:
-                raise NotImplementedError()
-            else:
-                editor = svn.ra.get_commit_editor2(self._ra, 
-                            revprops[svn.core.SVN_PROP_REVISION_LOG],
-                            done_cb, lock_token, keep_locks)
-
-            return Editor(self, editor)
-        except:
-            self._unmark_busy()
-            raise
+        self._ra.get_commit_editor(revprops, done_cb, lock_token, keep_locks)
 
     def listable(self):
         """See Transport.listable().




More information about the bazaar-commits mailing list