Rev 991: Wrap svn_client_log(), fix crashes in delta editor. in file:///data/jelmer/bzr-svn/pyrex/

Jelmer Vernooij jelmer at samba.org
Sun Mar 16 12:26:35 GMT 2008


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

------------------------------------------------------------
revno: 991
revision-id:jelmer at samba.org-20080316122631-bhzx47o9a3f997dk
parent: jelmer at samba.org-20080316061105-i6aj14eqaagphure
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: pyrex
timestamp: Sun 2008-03-16 13:26:31 +0100
message:
  Wrap svn_client_log(), fix crashes in delta editor.
modified:
  client.pyx                     client.pyx-20080313235339-wbyjbw2namuiql8f-1
  core.pxd                       core.pxd-20080314004625-ng663dn07ewpc26a-1
  core.pyx                       core.pyx-20080313210413-17k59slolpfe5kdq-1
  ra.pyx                         ra.pyx-20080313140933-qybkqaxe3m4mcll7-1
  transport.py                   transport.py-20060406231150-b3472d06b3a0818d
  types.pxd                      types.pxi-20080313202425-vtt1ry64o98kgpg8-1
=== modified file 'client.pyx'
--- a/client.pyx	2008-03-16 05:56:59 +0000
+++ b/client.pyx	2008-03-16 12:26:31 +0000
@@ -17,8 +17,8 @@
 from apr cimport apr_initialize, apr_hash_t, apr_time_t
 from apr cimport apr_array_header_t, apr_array_make, apr_array_push
 from apr cimport apr_pool_t, apr_pool_destroy
-from types cimport svn_error_t, svn_cancel_func_t, svn_auth_baton_t, svn_revnum_t, svn_boolean_t, svn_commit_info_t, svn_string_t
-from core cimport Pool, check_error, string_list_to_apr_array
+from types cimport svn_error_t, svn_cancel_func_t, svn_auth_baton_t, svn_revnum_t, svn_boolean_t, svn_commit_info_t, svn_string_t, svn_log_message_receiver_t
+from core cimport Pool, check_error, string_list_to_apr_array, py_svn_log_wrapper
 
 # Make sure APR is initialized
 apr_initialize()
@@ -158,6 +158,18 @@
                         svn_revnum_t *set_rev,
                         svn_client_ctx_t *ctx,
                         apr_pool_t *pool)
+
+    svn_error_t *svn_client_log3(apr_array_header_t *targets,
+                svn_opt_revision_t *peg_revision,
+                svn_opt_revision_t *start,
+                svn_opt_revision_t *end,
+                int limit,
+                svn_boolean_t discover_changed_paths,
+                svn_boolean_t strict_node_history,
+                svn_log_message_receiver_t receiver,
+                receiver_baton,
+                svn_client_ctx_t *ctx,
+                apr_pool_t *pool)
      
 cdef svn_error_t *py_log_msg_func2(char **log_msg, char **tmp_file, apr_array_header_t *commit_items, baton, apr_pool_t *pool) except *:
     py_commit_items = []
@@ -280,3 +292,12 @@
         check_error(svn_client_revprop_set(propname, &c_val, url, 
                     &c_rev, &set_rev, force, self.client, self.pool))
         return set_rev
+
+    def log(self, targets, callback, peg_revision=None, start=None, end=None,
+            limit=0, discover_changed_paths=True, strict_node_history=True):
+        cdef svn_opt_revision_t c_peg_rev, c_start_rev, c_end_rev
+        to_opt_revision(peg_revision, &c_peg_rev)
+        to_opt_revision(start, &c_start_rev)
+        to_opt_revision(end, &c_end_rev)
+        check_error(svn_client_log3(string_list_to_apr_array(self.pool, targets),
+                    &c_peg_rev, &c_start_rev, &c_end_rev, limit, discover_changed_paths, strict_node_history, py_svn_log_wrapper, callback, self.client, self.pool))

=== modified file 'core.pxd'
--- a/core.pxd	2008-03-15 19:13:59 +0000
+++ b/core.pxd	2008-03-16 12:26:31 +0000
@@ -15,10 +15,11 @@
 # 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_pool_t, apr_array_header_t
+from apr cimport apr_pool_t, apr_array_header_t, apr_hash_t
 from types cimport svn_error_t, svn_lock_t
 cdef apr_pool_t *Pool(apr_pool_t *parent)
 cdef check_error(svn_error_t *error)
 cdef svn_error_t *py_cancel_func(cancel_baton)
 cdef wrap_lock(svn_lock_t *)
 cdef apr_array_header_t *string_list_to_apr_array(apr_pool_t *pool, object l)
+cdef svn_error_t *py_svn_log_wrapper(baton, apr_hash_t *changed_paths, long revision, char *author, char *date, char *message, apr_pool_t *pool) except *

=== modified file 'core.pyx'
--- a/core.pyx	2008-03-16 05:24:21 +0000
+++ b/core.pyx	2008-03-16 12:26:31 +0000
@@ -14,11 +14,12 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
-from types cimport svn_error_t, svn_node_kind_t, svn_node_dir, svn_node_file, svn_node_unknown, svn_node_none, svn_error_create
+from types cimport svn_error_t, svn_node_kind_t, svn_node_dir, svn_node_file, svn_node_unknown, svn_node_none, svn_error_create, svn_log_message_receiver_t, svn_log_changed_path_t
 from apr cimport apr_initialize, apr_status_t, apr_time_t, apr_hash_t
 from apr cimport apr_pool_t, apr_pool_create, apr_pool_destroy
 from apr cimport apr_array_header_t, apr_array_make, apr_array_push
 from apr cimport apr_hash_index_t, apr_hash_this, apr_hash_first, apr_hash_next
+from constants import PROP_REVISION_LOG, PROP_REVISION_AUTHOR, PROP_REVISION_DATE
 
 apr_initialize()
 
@@ -123,3 +124,32 @@
         el = <char **>apr_array_push(ret)
         el[0] = i
     return ret
+
+cdef svn_error_t *py_svn_log_wrapper(baton, apr_hash_t *changed_paths, long revision, char *author, char *date, char *message, apr_pool_t *pool) except *:
+    cdef apr_hash_index_t *idx
+    cdef char *key
+    cdef long klen
+    cdef svn_log_changed_path_t *val
+    if changed_paths == NULL:
+        py_changed_paths = None
+    else:
+        py_changed_paths = {}
+        idx = apr_hash_first(pool, changed_paths)
+        while idx:
+            apr_hash_this(idx, <void **>&key, &klen, <void **>&val)
+            if val.copyfrom_path != NULL:
+                py_changed_paths[key] = (chr(val.action), val.copyfrom_path, 
+                                         val.copyfrom_rev)
+            else:
+                py_changed_paths[key] = (chr(val.action), None, -1)
+            idx = apr_hash_next(idx)
+    revprops = {}    
+    if message != NULL:
+        revprops[PROP_REVISION_LOG] = message
+    if author != NULL:
+        revprops[PROP_REVISION_AUTHOR] = author
+    if date != NULL:
+        revprops[PROP_REVISION_DATE] = date
+    baton(py_changed_paths, revision, revprops)
+
+

=== modified file 'ra.pyx'
--- a/ra.pyx	2008-03-16 05:56:59 +0000
+++ b/ra.pyx	2008-03-16 12:26:31 +0000
@@ -19,11 +19,11 @@
 from apr cimport apr_array_header_t, apr_array_make
 from apr cimport apr_file_t, apr_off_t, apr_size_t
 from apr cimport apr_initialize
-from core cimport check_error, Pool, wrap_lock, string_list_to_apr_array
+from core cimport check_error, Pool, wrap_lock, string_list_to_apr_array, py_svn_log_wrapper
 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
+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
 
 apr_initialize()
 
@@ -129,43 +129,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 svn_error_t *(*svn_commit_callback2_t) (svn_commit_info_t *commit_info, baton, apr_pool_t *pool) except *
-    ctypedef struct svn_log_changed_path_t:
-        char action
-        char *copyfrom_path
-        svn_revnum_t copyfrom_rev
 
 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)
 
-cdef svn_error_t *py_svn_log_wrapper(baton, apr_hash_t *changed_paths, long revision, char *author, char *date, char *message, apr_pool_t *pool) except *:
-    cdef apr_hash_index_t *idx
-    cdef char *key
-    cdef long klen
-    cdef svn_log_changed_path_t *val
-    if changed_paths == NULL:
-        py_changed_paths = None
-    else:
-        py_changed_paths = {}
-        idx = apr_hash_first(pool, changed_paths)
-        while idx:
-            apr_hash_this(idx, <void **>&key, &klen, <void **>&val)
-            if val.copyfrom_path != NULL:
-                py_changed_paths[key] = (chr(val.action), val.copyfrom_path, 
-                                         val.copyfrom_rev)
-            else:
-                py_changed_paths[key] = (chr(val.action), None, -1)
-            idx = apr_hash_next(idx)
-    revprops = {}    
-    if message != NULL:
-        revprops[PROP_REVISION_LOG] = message
-    if author != NULL:
-        revprops[PROP_REVISION_AUTHOR] = author
-    if date != NULL:
-        revprops[PROP_REVISION_DATE] = date
-    baton(py_changed_paths, revision, revprops)
-
 cdef extern from "svn_ra.h":
     svn_version_t *svn_ra_version()
 
@@ -465,8 +433,13 @@
 
     def add_directory(self, path, copyfrom_path=None, copyfrom_rev=-1):
         cdef void *child_baton
+        cdef char *c_copyfrom_path
+        if copyfrom_path is None:
+            c_copyfrom_path = NULL
+        else:
+            c_copyfrom_path = copyfrom_path
         check_error(self.editor.add_directory(path, self.dir_baton,
-                    copyfrom_path, copyfrom_rev, self.pool, &child_baton))
+                    c_copyfrom_path, copyfrom_rev, self.pool, &child_baton))
         return new_dir_editor(self.editor, child_baton, self.pool)
 
     def open_directory(self, path, base_revision=None):
@@ -491,10 +464,15 @@
         check_error(self.editor.absent_directory(path, self.dir_baton, 
                     self.pool))
 
-    def add_file(self, path, copy_path, copy_rev):
+    def add_file(self, path, copy_path=None, copy_rev=-1):
         cdef void *file_baton
         cdef FileEditor py_file_editor
-        check_error(self.editor.add_file(path, self.dir_baton, copy_path,
+        cdef char *c_copy_path
+        if copy_path is None:
+            c_copy_path = NULL
+        else:
+            c_copy_path = copy_path
+        check_error(self.editor.add_file(path, self.dir_baton, c_copy_path,
                     copy_rev, self.pool, &file_baton))
         py_file_editor = FileEditor()
         py_file_editor.editor = self.editor
@@ -536,7 +514,7 @@
         check_error(self.editor.set_target_revision(self.edit_baton,
                     target_revision, self.pool))
     
-    def open_root(self, base_revision):
+    def open_root(self, base_revision=-1):
         cdef void *root_baton
         check_error(self.editor.open_root(self.edit_baton, base_revision,
                     self.pool, &root_baton))
@@ -548,6 +526,9 @@
     def abort(self):
         check_error(self.editor.abort_edit(self.edit_baton, self.pool))
 
+    def __dealloc__(self):
+        apr_pool_destroy(self.pool)
+
 
 def version():
     """Get libsvn_ra version information.
@@ -848,10 +829,10 @@
         check_error(svn_ra_get_commit_editor2(self.ra, &editor, 
             &edit_baton, revprops[PROP_REVISION_LOG], py_commit_callback, 
             commit_callback, hash_lock_tokens, keep_locks, temp_pool))
-        apr_pool_destroy(temp_pool)
         py_editor = Editor()
         py_editor.editor = editor
         py_editor.edit_baton = edit_baton
+        py_editor.pool = temp_pool
         return py_editor
 
     def change_rev_prop(self, rev, name, value):

=== modified file 'transport.py'
--- a/transport.py	2008-03-16 05:24:21 +0000
+++ b/transport.py	2008-03-16 12:26:31 +0000
@@ -299,7 +299,8 @@
     @convert_svn_error
     def get_commit_editor(self, revprops, done_cb, lock_token, keep_locks):
         self._open_real_transport()
-        self._ra.get_commit_editor(revprops, done_cb, lock_token, keep_locks)
+        return self._ra.get_commit_editor(revprops, done_cb, lock_token, 
+                                          keep_locks)
 
     def listable(self):
         """See Transport.listable().

=== modified file 'types.pxd'
--- a/types.pxd	2008-03-16 02:30:29 +0000
+++ b/types.pxd	2008-03-16 12:26:31 +0000
@@ -66,6 +66,11 @@
         svn_revnum_t created_rev
         apr_time_t time
         char *last_author
+    ctypedef struct svn_log_changed_path_t:
+        char action
+        char *copyfrom_path
+        svn_revnum_t copyfrom_rev
+    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 *
 
 cdef extern from "svn_string.h":
     ctypedef struct svn_string_t:




More information about the bazaar-commits mailing list