Rev 992: Wrap stream functions. in file:///data/jelmer/bzr-svn/pyrex/

Jelmer Vernooij jelmer at samba.org
Sun Mar 16 13:12:05 GMT 2008


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

------------------------------------------------------------
revno: 992
revision-id:jelmer at samba.org-20080316131204-2whdut1lz5qw5qzf
parent: jelmer at samba.org-20080316122631-bhzx47o9a3f997dk
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: pyrex
timestamp: Sun 2008-03-16 14:12:04 +0100
message:
  Wrap stream functions.
modified:
  commit.py                      commit.py-20060607190346-qvq128wgfubhhgm2-1
  ra.pyx                         ra.pyx-20080313140933-qybkqaxe3m4mcll7-1
  types.pxd                      types.pxi-20080313202425-vtt1ry64o98kgpg8-1
=== modified file 'commit.py'
--- a/commit.py	2008-03-16 06:11:05 +0000
+++ b/commit.py	2008-03-16 13:12:04 +0000
@@ -393,14 +393,32 @@
         """Finish the commit.
 
         """
-        def done(revision_data):
+        def done(revision, author, date):
             """Callback that is called by the Subversion commit editor 
             once the commit finishes.
-
-            :param revision_data: Revision metadata
             """
-            self.revision_metadata = revision_data
-        
+
+            # Make sure the logwalker doesn't try to use ra 
+            # during checkouts...
+            self.repository._log.fetch_revisions(revision)
+
+            revid = self.branch.generate_revision_id(revision)
+            self.mutter('commit %d finished. author: %r, date: %r, revid: %r' % 
+               (revision, author, date, revid))
+
+            assert self._new_revision_id is None or self._new_revision_id == revid
+
+            if self.repository.get_config().get_override_svn_revprops():
+                set_svn_revprops(self.repository.transport, revision, {
+                    constants.PROP_REVISION_AUTHOR: self._committer,
+                    constants.PROP_REVISION_DATE: svn_time_to_cstring(1000000*self._timestamp)})
+
+            try:
+                set_svn_revprops(self.repository.transport, revision, 
+                             self._svn_revprops) 
+            except RevpropChangeFailed:
+                pass # Ignore for now
+
         bp_parts = self.branch.get_branch_path().split("/")
         repository_latest_revnum = self.repository.transport.get_latest_revnum()
         lock = self.repository.transport.lock_write(".")
@@ -440,7 +458,6 @@
         try:
             existing_bp_parts = _check_dirs_exist(self.repository.transport, 
                                               bp_parts, -1)
-            self.revision_metadata = None
             try:
                 self.editor = self.repository.transport.get_commit_editor(
                         self._svn_revprops, done, None, False)
@@ -486,32 +503,6 @@
         finally:
             lock.unlock()
 
-        assert self.revision_metadata is not None
-
-        # Make sure the logwalker doesn't try to use ra 
-        # during checkouts...
-        self.repository._log.fetch_revisions(self.revision_metadata.revision)
-
-        revid = self.branch.generate_revision_id(self.revision_metadata.revision)
-
-        assert self._new_revision_id is None or self._new_revision_id == revid
-
-        self.mutter('commit %d finished. author: %r, date: %r, revid: %r' % 
-               (self.revision_metadata.revision, self.revision_metadata.author, 
-                   self.revision_metadata.date, revid))
-
-        if self.repository.get_config().get_override_svn_revprops():
-            set_svn_revprops(self.repository.transport, 
-                 self.revision_metadata.revision, {
-                constants.PROP_REVISION_AUTHOR: self._committer,
-                constants.PROP_REVISION_DATE: svn_time_to_cstring(1000000*self._timestamp)})
-
-        try:
-            set_svn_revprops(self.repository.transport, self.revision_metadata.revision, 
-                         self._svn_revprops) 
-        except RevpropChangeFailed:
-            pass # Ignore for now
-
         return revid
 
     def record_entry_contents(self, ie, parent_invs, path, tree,

=== modified file 'ra.pyx'
--- a/ra.pyx	2008-03-16 12:26:31 +0000
+++ b/ra.pyx	2008-03-16 13:12:04 +0000
@@ -23,7 +23,9 @@
 from core import SubversionException
 from constants import PROP_REVISION_LOG, PROP_REVISION_AUTHOR, PROP_REVISION_DATE
 from types cimport svn_error_t, svn_revnum_t, svn_string_t, svn_version_t
-from types cimport svn_string_ncreate, svn_lock_t, svn_auth_baton_t, svn_auth_open, svn_auth_set_parameter, svn_auth_get_parameter, svn_node_kind_t, svn_commit_info_t, svn_stream_t, svn_filesize_t, svn_dirent_t, svn_log_message_receiver_t
+from types cimport svn_string_ncreate, svn_lock_t, svn_auth_baton_t, svn_auth_open, svn_auth_set_parameter, svn_auth_get_parameter, svn_node_kind_t, svn_commit_info_t, svn_filesize_t, svn_dirent_t, svn_log_message_receiver_t
+from types cimport svn_stream_t, svn_stream_set_read, svn_stream_set_write, svn_stream_set_close, svn_stream_from_stringbuf, svn_stream_create
+from types cimport svn_stringbuf_t, svn_stringbuf_ncreate
 
 apr_initialize()
 
@@ -31,6 +33,12 @@
     object PyString_FromStringAndSize(char *, unsigned long)
     void Py_INCREF(object)
     void Py_DECREF(object)
+    char *PyString_AS_STRING(object)
+
+
+cdef extern from "string.h":
+    ctypedef unsigned long size_t 
+    void *memcpy(void *dest, void *src, size_t len)
 
 cdef extern from "svn_delta.h":
     ctypedef enum svn_delta_action:
@@ -132,7 +140,7 @@
     ctypedef svn_error_t *(*svn_commit_callback2_t) (svn_commit_info_t *commit_info, baton, apr_pool_t *pool) except *
 
 cdef svn_error_t *py_commit_callback(svn_commit_info_t *commit_info, baton, apr_pool_t *pool) except *:
-    baton(commit_info.revision, commit_info.date, commit_info.author, commit_info.post_commit_err)
+    baton(commit_info.revision, commit_info.date, commit_info.author)
 
 cdef extern from "svn_ra.h":
     svn_version_t *svn_ra_version()
@@ -1002,13 +1010,41 @@
 def get_ssl_client_cert_pw_file_provider():
     pass # FIXME
 
-cdef svn_stream_t *new_read_stream(object py):
-    return NULL #FIXME
+cdef svn_error_t *py_stream_read(void *baton, char *buffer, apr_size_t *length):
+    self = <object>baton
+    ret = self.read(length[0])
+    length[0] = len(ret)
+    memcpy(buffer, PyString_AS_STRING(ret), len(ret))
+    return NULL
+
+cdef svn_error_t *py_stream_write(void *baton, char *data, apr_size_t *len):
+    self = <object>baton
+    self.write(PyString_FromStringAndSize(data, len[0]))
+    return NULL
+
+cdef svn_error_t *py_stream_close(void *baton):
+    self = <object>baton
+    self.close()
+    Py_DECREF(self)
+
+cdef svn_stream_t *string_stream(apr_pool_t *pool, text):
+    cdef svn_stringbuf_t *buf
+    buf = svn_stringbuf_ncreate(text, len(text), pool)
+    return svn_stream_from_stringbuf(buf, pool)
+
+cdef svn_stream_t *new_py_stream(apr_pool_t *pool, object py):
+    cdef svn_stream_t *stream
+    Py_INCREF(py)
+    stream = svn_stream_create(<void *>py, pool)
+    svn_stream_set_read(stream, py_stream_read)
+    svn_stream_set_write(stream, py_stream_write)
+    svn_stream_set_close(stream, py_stream_close)
+    return stream
 
 def txdelta_send_stream(stream, TxDeltaWindowHandler handler):
     cdef unsigned char digest[16] 
     cdef apr_pool_t *pool
     pool = Pool(NULL)
-    check_error(svn_txdelta_send_stream(new_read_stream(stream), handler.txdelta, handler.txbaton, <unsigned char *>digest, pool))
+    check_error(svn_txdelta_send_stream(new_py_stream(pool, stream), handler.txdelta, handler.txbaton, <unsigned char *>digest, pool))
     apr_pool_destroy(pool)
     return PyString_FromStringAndSize(<char *>digest, 16)

=== modified file 'types.pxd'
--- a/types.pxd	2008-03-16 12:26:31 +0000
+++ b/types.pxd	2008-03-16 13:12:04 +0000
@@ -15,7 +15,7 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
-from apr cimport apr_status_t, apr_pool_t, apr_time_t, apr_array_header_t, apr_hash_t
+from apr cimport apr_status_t, apr_pool_t, apr_time_t, apr_array_header_t, apr_hash_t, apr_size_t
 
 cdef extern from "svn_version.h":
     ctypedef struct svn_version_t:
@@ -24,9 +24,6 @@
         int patch
         char *tag
 
-cdef extern from "svn_io.h":
-    ctypedef struct svn_stream_t
-    ctypedef unsigned long long svn_filesize_t
 
 cdef extern from "svn_error.h":
     ctypedef struct svn_error_t:
@@ -39,6 +36,7 @@
 
 cdef extern from "svn_types.h":
     ctypedef int svn_boolean_t
+    ctypedef unsigned long long svn_filesize_t
     ctypedef svn_error_t *(*svn_cancel_func_t)(cancel_baton)
     ctypedef long svn_revnum_t
     ctypedef struct svn_lock_t:
@@ -76,7 +74,25 @@
     ctypedef struct svn_string_t:
         char *data
         long len
+    ctypedef struct svn_stringbuf_t:
+        apr_pool_t *pool
+        char *data
+        apr_size_t len
+        apr_size_t blocksize
     svn_string_t *svn_string_ncreate(char *bytes, long size, apr_pool_t *pool)
+    svn_stringbuf_t *svn_stringbuf_ncreate(char *bytes, apr_size_t size, apr_pool_t *pool)
+
+
+cdef extern from "svn_io.h":
+    ctypedef struct svn_stream_t
+    ctypedef svn_error_t *(*svn_read_fn_t)(void *baton, char *buffer, apr_size_t *len) 
+    ctypedef svn_error_t *(*svn_write_fn_t)(void *baton, char *data, apr_size_t *len)
+    ctypedef svn_error_t *(*svn_close_fn_t)(void *baton) 
+    void svn_stream_set_read(svn_stream_t *stream, svn_read_fn_t read_fn)
+    void svn_stream_set_write(svn_stream_t *stream, svn_write_fn_t write_fn)
+    void svn_stream_set_close(svn_stream_t *stream, svn_close_fn_t close_fn)
+    svn_stream_t *svn_stream_from_stringbuf(svn_stringbuf_t *str, apr_pool_t *pool)
+    svn_stream_t *svn_stream_create(void *baton, apr_pool_t *pool)
 
 cdef extern from "svn_props.h":
     ctypedef struct svn_prop_t:




More information about the bazaar-commits mailing list