Rev 994: Add wrappers for some more workingcopy functions, fix segfaults. in file:///data/jelmer/bzr-svn/pyrex/

Jelmer Vernooij jelmer at samba.org
Sun Mar 16 14:17:24 GMT 2008


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

------------------------------------------------------------
revno: 994
revision-id:jelmer at samba.org-20080316141723-gfcom3f4nvgh5ltk
parent: jelmer at samba.org-20080316134027-mk1hfpou37zvot0t
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: pyrex
timestamp: Sun 2008-03-16 15:17:23 +0100
message:
  Add wrappers for some more workingcopy functions, fix segfaults.
modified:
  client.pyx                     client.pyx-20080313235339-wbyjbw2namuiql8f-1
  convert.py                     svn2bzr.py-20051018015439-cb4563bff29e632d
  core.pxd                       core.pxd-20080314004625-ng663dn07ewpc26a-1
  core.pyx                       core.pyx-20080313210413-17k59slolpfe5kdq-1
  ra.pyx                         ra.pyx-20080313140933-qybkqaxe3m4mcll7-1
  repos.pyx                      repos.pyx-20080314114432-g2b5lqe776tkbl4k-1
  wc.pyx                         wc.pyx-20080313142018-10l8l23vha2j9e6b-1
  workingtree.py                 workingtree.py-20060306120941-b083cb0fdd4a69de
=== modified file 'client.pyx'
--- a/client.pyx	2008-03-16 13:40:27 +0000
+++ b/client.pyx	2008-03-16 14:17:23 +0000
@@ -18,7 +18,7 @@
 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, svn_log_message_receiver_t
-from core cimport Pool, check_error, string_list_to_apr_array, py_svn_log_wrapper
+from core cimport Pool, check_error, string_list_to_apr_array, py_svn_log_wrapper, prop_hash_to_dict
 
 # Make sure APR is initialized
 apr_initialize()
@@ -170,6 +170,15 @@
                 receiver_baton,
                 svn_client_ctx_t *ctx,
                 apr_pool_t *pool)
+
+    svn_error_t *svn_client_propget2(apr_hash_t **props,
+                    char *propname,
+                    char *target,
+                    svn_opt_revision_t *peg_revision,
+                    svn_opt_revision_t *revision,
+                    svn_boolean_t recurse,
+                    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 *:
     if baton is None:
@@ -235,6 +244,7 @@
 
     def commit(self, targets, recurse=True, keep_locks=True):
         cdef svn_commit_info_t *commit_info
+        commit_info = NULL
         check_error(svn_client_commit3(&commit_info, 
                    string_list_to_apr_array(self.pool, targets),
                    recurse, keep_locks, self.client, self.pool))
@@ -242,6 +252,7 @@
 
     def mkdir(self, paths):
         cdef svn_commit_info_t *commit_info
+        commit_info = NULL
         check_error(svn_client_mkdir2(&commit_info, 
                     string_list_to_apr_array(self.pool, paths), 
                     self.client, self.pool))
@@ -249,6 +260,7 @@
 
     def delete(self, paths, force=False):
         cdef svn_commit_info_t *commit_info
+        commit_info = NULL
         check_error(svn_client_delete2(&commit_info, 
                     string_list_to_apr_array(self.pool, paths),
                     force, self.client, self.pool))
@@ -271,6 +283,18 @@
         check_error(svn_client_propset2(propname, &c_propval,
                     target, recurse, skip_checks, self.client, self.pool))
     
+    def propget(self, propname, target, peg_revision=None, revision=None,
+                recurse=False):
+        cdef svn_string_t c_propval
+        cdef svn_opt_revision_t c_peg_rev
+        cdef svn_opt_revision_t c_rev
+        cdef apr_hash_t *hash_props
+        to_opt_revision(peg_revision, &c_peg_rev)
+        to_opt_revision(revision, &c_rev)
+        check_error(svn_client_propget2(&hash_props, propname, target,
+                    &c_peg_rev, &c_rev, recurse, self.client, self.pool))
+        return prop_hash_to_dict(hash_props)
+
     def update(self, paths, rev=None, recurse=True, ignore_externals=False):
         cdef apr_array_header_t *result_revs
         cdef svn_opt_revision_t c_rev

=== modified file 'convert.py'
--- a/convert.py	2008-03-16 06:11:05 +0000
+++ b/convert.py	2008-03-16 14:17:23 +0000
@@ -71,8 +71,7 @@
     else:
         file = open(dumpfile)
     try:
-        r.load_fs2(file, StringIO(), 
-                repos.load_uuid_default, '', 0, 0, None)
+        r.load_fs(file, StringIO(), repos.LOAD_UUID_DEFAULT)
     except core.SubversionException, (_, num):
         if num == constants.ERR_STREAM_MALFORMED_DATA:
             raise NotDumpFile(dumpfile)

=== modified file 'core.pxd'
--- a/core.pxd	2008-03-16 13:40:27 +0000
+++ b/core.pxd	2008-03-16 14:17:23 +0000
@@ -25,3 +25,4 @@
 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 svn_stream_t *new_py_stream(apr_pool_t *pool, object py)
 cdef svn_stream_t *string_stream(apr_pool_t *pool, text)
+cdef prop_hash_to_dict(apr_hash_t *)

=== modified file 'core.pyx'
--- a/core.pyx	2008-03-16 13:40:27 +0000
+++ b/core.pyx	2008-03-16 14:17:23 +0000
@@ -21,11 +21,12 @@
 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
 from types cimport 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
+from types cimport svn_stringbuf_t, svn_stringbuf_ncreate, svn_string_t
 
 cdef extern from "Python.h":
     void Py_INCREF(object)
     void Py_DECREF(object)
+    object PyString_FromStringAndSize(char *, unsigned long)
     char *PyString_AS_STRING(object)
 	
 cdef extern from "string.h":
@@ -194,4 +195,20 @@
     svn_stream_set_close(stream, py_stream_close)
     return stream
 
-
+cdef prop_hash_to_dict(apr_hash_t *props):
+    cdef char *key
+    cdef apr_hash_index_t *idx
+    cdef long klen
+    cdef svn_string_t *val
+    cdef apr_pool_t *pool
+    if props == NULL:
+        return None
+    pool = Pool(NULL)
+    py_props = {}
+    idx = apr_hash_first(pool, props)
+    while idx:
+        apr_hash_this(idx, <void **>&key, &klen, <void **>&val)
+        py_props[key] = PyString_FromStringAndSize(val.data, val.len)
+        idx = apr_hash_next(idx)
+    apr_pool_destroy(pool)
+    return py_props

=== modified file 'ra.pyx'
--- a/ra.pyx	2008-03-16 13:40:27 +0000
+++ b/ra.pyx	2008-03-16 14:17:23 +0000
@@ -19,7 +19,7 @@
 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, py_svn_log_wrapper, new_py_stream
+from core cimport check_error, Pool, wrap_lock, string_list_to_apr_array, py_svn_log_wrapper, new_py_stream, prop_hash_to_dict
 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
@@ -408,11 +408,15 @@
         return py_txdelta
 
     def change_prop(self, name, value):
-        cdef svn_string_t c_value
-        c_value.data = value
-        c_value.len = len(value)
+        cdef svn_string_t c_value, *p_c_value
+        if value is None:
+            p_c_value = NULL
+        else:
+            c_value.data = value
+            c_value.len = len(value)
+            p_c_value = &c_value
         check_error(self.editor.change_file_prop(self.file_baton, name, 
-                    &c_value, self.pool))
+                    p_c_value, self.pool))
 
     def close(self, checksum=None):
         cdef char *c_checksum
@@ -428,7 +432,7 @@
     cdef void *dir_baton
     cdef apr_pool_t *pool
 
-    def delete_entry(self, path, revision):
+    def delete_entry(self, path, revision=-1):
         check_error(self.editor.delete_entry(path, revision, self.dir_baton,
                                              self.pool))
 
@@ -452,11 +456,15 @@
         return new_dir_editor(self.editor, child_baton, self.pool)
 
     def change_prop(self, name, value):
-        cdef svn_string_t c_value
-        c_value.data = value
-        c_value.len = len(value)
+        cdef svn_string_t c_value, *p_c_value
+        if value is None:
+            p_c_value = NULL
+        else:
+            c_value.data = value
+            c_value.len = len(value)
+            p_c_value = &c_value
         check_error(self.editor.change_dir_prop(self.dir_baton, name, 
-                    &c_value, self.pool))
+                    p_c_value, self.pool))
 
     def close(self):
         check_error(self.editor.close_directory(self.dir_baton, self.pool))
@@ -553,7 +561,7 @@
 
 cdef svn_error_t *py_editor_delete_entry(char *path, long revision, void *parent_baton, apr_pool_t *pool) except *:
     self = <object>parent_baton
-    self.delete_entry(revision)
+    self.delete_entry(path, revision)
     return NULL
 
 cdef svn_error_t *py_editor_add_directory(char *path, void *parent_baton, char *copyfrom_path, long copyfrom_revision, apr_pool_t *dir_pool, void **child_baton) except *:
@@ -575,7 +583,10 @@
 
 cdef svn_error_t *py_editor_change_dir_prop(void *dir_baton, char *name, svn_string_t *value, apr_pool_t *pool) except *:
     self = <object>dir_baton
-    self.change_prop(name, PyString_FromStringAndSize(value.data, value.len))
+    if value != NULL:
+        self.change_prop(name, PyString_FromStringAndSize(value.data, value.len))
+    else:
+        self.change_prop(name, None)
     return NULL
 
 cdef svn_error_t *py_editor_close_directory(void *dir_baton, apr_pool_t *pool) except *:
@@ -632,7 +643,10 @@
 
 cdef svn_error_t *py_editor_change_file_prop(void *file_baton, char *name, svn_string_t *value, apr_pool_t *pool) except *:
     self = <object>file_baton
-    self.change_prop(name, PyString_FromStringAndSize(value.data, value.len))
+    if value != NULL:
+        self.change_prop(name, PyString_FromStringAndSize(value.data, value.len))
+    else:
+        self.change_prop(name, None)
     return NULL
 
 cdef svn_error_t *py_editor_close_file(void *file_baton, char *text_checksum, apr_pool_t *pool) except *:
@@ -798,18 +812,9 @@
     def rev_proplist(self, rev):
         cdef apr_pool_t *temp_pool
         cdef apr_hash_t *props
-        cdef apr_hash_index_t *idx
-        cdef char *key
-        cdef long klen
-        cdef svn_string_t *val
         temp_pool = Pool(self.pool)
         check_error(svn_ra_rev_proplist(self.ra, rev, &props, temp_pool))
-        py_props = {}
-        idx = apr_hash_first(temp_pool, props)
-        while idx:
-            apr_hash_this(idx, <void **>&key, &klen, <void **>&val)
-            py_props[key] = PyString_FromStringAndSize(val.data, val.len)
-            idx = apr_hash_next(idx)
+        py_props = prop_hash_to_dict(props)
         apr_pool_destroy(temp_pool)
         return py_props
 
@@ -853,7 +858,6 @@
         cdef long fetch_rev
         cdef char *key
         cdef svn_dirent_t *dirent
-        cdef svn_string_t *string
         cdef long klen
         temp_pool = Pool(self.pool)
         check_error(svn_ra_get_dir2(self.ra, &dirents, &fetch_rev, &props,
@@ -882,16 +886,7 @@
                 py_dirents[key] = py_dirent
                 idx = apr_hash_next(idx)
 
-        if props == NULL:
-            py_props = None
-        else:
-            py_props = {}
-            idx = apr_hash_first(temp_pool, props)
-            while idx:
-                apr_hash_this(idx, <void **>&key, &klen, <void **>&string)
-                py_props[key] = PyString_FromStringAndSize(string.data, string.len)
-                idx = apr_hash_next(idx)
-
+        py_props = prop_hash_to_dict(props)
         apr_pool_destroy(temp_pool)
         return (py_dirents, fetch_rev, py_props)
 

=== modified file 'repos.pyx'
--- a/repos.pyx	2008-03-16 13:40:27 +0000
+++ b/repos.pyx	2008-03-16 14:17:23 +0000
@@ -74,7 +74,7 @@
         apr_pool_destroy(self.pool)
 
     def load_fs(self, dumpstream, feedback_stream, uuid_action,
-                parent_dir, use_pre_commit_hook=False, 
+                parent_dir="", use_pre_commit_hook=False, 
                 use_post_commit_hook=False,
                 cancel_func=None):
         cdef apr_pool_t *temp_pool

=== modified file 'wc.pyx'
--- a/wc.pyx	2008-03-16 13:40:27 +0000
+++ b/wc.pyx	2008-03-16 14:17:23 +0000
@@ -15,7 +15,7 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 from apr cimport apr_pool_t, apr_initialize, apr_hash_t, apr_pool_destroy, apr_time_t, apr_hash_first, apr_hash_next, apr_hash_this, apr_hash_index_t, apr_array_header_t
-from types cimport svn_error_t, svn_version_t, svn_boolean_t, svn_cancel_func_t , svn_string_t, svn_string_ncreate, svn_node_kind_t, svn_revnum_t, svn_prop_t
+from types cimport svn_error_t, svn_version_t, svn_boolean_t, svn_cancel_func_t , svn_string_t, svn_string_ncreate, svn_node_kind_t, svn_revnum_t, svn_prop_t, svn_lock_t
 
 from core cimport check_error, Pool, py_cancel_func
 
@@ -128,6 +128,90 @@
 
     char *svn_wc_get_adm_dir(apr_pool_t *pool)
 
+    ctypedef enum svn_wc_notify_action_t:
+        svn_wc_notify_add
+        svn_wc_notify_copy
+        svn_wc_notify_delete
+        svn_wc_notify_restore
+        svn_wc_notify_revert
+        svn_wc_notify_failed_revert
+        svn_wc_notify_resolved
+        svn_wc_notify_skip
+        svn_wc_notify_update_delete
+        svn_wc_notify_update_add
+        svn_wc_notify_update_update
+        svn_wc_notify_update_completed
+        svn_wc_notify_update_external
+        svn_wc_notify_status_completed
+        svn_wc_notify_status_external
+        svn_wc_notify_commit_modified
+        svn_wc_notify_commit_added
+        svn_wc_notify_commit_deleted
+        svn_wc_notify_commit_replaced
+        svn_wc_notify_commit_postfix_txdelta
+        svn_wc_notify_blame_revision
+        svn_wc_notify_locked
+        svn_wc_notify_unlocked
+        svn_wc_notify_failed_lock
+        svn_wc_notify_failed_unlock
+
+    ctypedef enum svn_wc_notify_state_t:
+        svn_wc_notify_state_inapplicable
+        svn_wc_notify_state_unknown
+        svn_wc_notify_state_unchanged
+        svn_wc_notify_state_missing
+        svn_wc_notify_state_obstructed
+        svn_wc_notify_state_changed
+        svn_wc_notify_state_merged
+        svn_wc_notify_state_conflicted
+
+    ctypedef enum svn_wc_notify_lock_state_t:
+        svn_wc_notify_lock_state_inapplicable
+        svn_wc_notify_lock_state_unknown
+        svn_wc_notify_lock_state_unchanged
+        svn_wc_notify_lock_state_locked
+        svn_wc_notify_lock_state_unlocked
+                
+    ctypedef struct svn_wc_notify_t:
+        char *path
+        svn_wc_notify_action_t action
+        svn_node_kind_t kind
+        char *mime_type
+        svn_lock_t *lock
+        svn_error_t *err
+        svn_wc_notify_state_t content_state
+        svn_wc_notify_state_t prop_state
+        svn_wc_notify_lock_state_t lock_state
+        svn_revnum_t revision
+    ctypedef void svn_wc_notify_func2_t(void *baton, svn_wc_notify_t *notify, apr_pool_t *pool)
+
+    svn_error_t *svn_wc_add2(char *path,
+                         svn_wc_adm_access_t *parent_access,
+                         char *copyfrom_url,
+                         svn_revnum_t copyfrom_rev,
+                         svn_cancel_func_t cancel_func,
+                         void *cancel_baton,
+                         svn_wc_notify_func2_t notify_func,
+                         void *notify_baton,
+                         apr_pool_t *pool)
+
+    svn_error_t *svn_wc_copy2(char *src,
+                          svn_wc_adm_access_t *dst_parent,
+                          char *dst_basename,
+                          svn_cancel_func_t cancel_func,
+                          void *cancel_baton,
+                          svn_wc_notify_func2_t notify_func,
+                          void *notify_baton,
+                          apr_pool_t *pool)
+
+    svn_error_t *svn_wc_delete2(char *path,
+                            svn_wc_adm_access_t *adm_access,
+                            svn_cancel_func_t cancel_func,
+                            void *cancel_baton,
+                            svn_wc_notify_func2_t notify_func,
+                            void *notify_baton,
+                            apr_pool_t *pool)
+
 def version():
     """Get libsvn_wc version information.
 
@@ -136,6 +220,10 @@
     return (svn_wc_version().major, svn_wc_version().minor, 
             svn_wc_version().minor, svn_wc_version().tag)
 
+
+cdef void py_wc_notify_func(void *baton, svn_wc_notify_t *notify, apr_pool_t *pool):
+    pass # FIXME
+
 class Entry:
     def __init__(self, name, revision, url, repos, uuid, kind, schedule, copied=False, deleted=False, absent=False, incomplete=False):
         self.name = name
@@ -269,6 +357,41 @@
         apr_pool_destroy(temp_pool)
         return (py_propchanges, py_orig_props)
 
+    def add(self, path, copyfrom_url=None, copyfrom_rev=-1, cancel_func=None,
+            notify_func=None):
+        cdef apr_pool_t *temp_pool
+        cdef char *c_copyfrom_url
+        temp_pool = Pool(self.pool)
+        if copyfrom_url is None:
+            c_copyfrom_url = NULL
+        else:
+            c_copyfrom_url = copyfrom_url
+        check_error(svn_wc_add2(path, self.adm, c_copyfrom_url, 
+                                copyfrom_rev, py_cancel_func, 
+                                <void *>cancel_func,
+                                py_wc_notify_func, 
+                                <void *>notify_func, 
+                                temp_pool))
+        apr_pool_destroy(temp_pool)
+
+    def copy(self, src, dst, cancel_func=None, notify_func=None):
+        cdef apr_pool_t *temp_pool
+        temp_pool = Pool(self.pool)
+        check_error(svn_wc_copy2(src, self.adm, dst,
+                                py_cancel_func, <void *>cancel_func,
+                                py_wc_notify_func, <void *>notify_func, 
+                                temp_pool))
+        apr_pool_destroy(temp_pool)
+
+    def delete(self, path, cancel_func=None, notify_func=None):
+        cdef apr_pool_t *temp_pool
+        temp_pool = Pool(self.pool)
+        check_error(svn_wc_delete2(path, self.adm, 
+                                py_cancel_func, <void *>cancel_func,
+                                py_wc_notify_func, <void *>notify_func, 
+                                temp_pool))
+        apr_pool_destroy(temp_pool)
+
     def close(self):
         if self.adm != NULL:
             svn_wc_adm_close(self.adm)

=== modified file 'workingtree.py'
--- a/workingtree.py	2008-03-16 13:40:27 +0000
+++ b/workingtree.py	2008-03-16 14:17:23 +0000
@@ -171,8 +171,6 @@
     def move(self, from_paths, to_dir=None, after=False, **kwargs):
         # FIXME: Use after argument
         assert after != True
-        revt = core.svn_opt_revision_t()
-        revt.kind = core.svn_opt_revision_working
         for entry in from_paths:
             try:
                 to_wc = self._get_wc(to_dir, write_lock=True)
@@ -194,8 +192,6 @@
     def rename_one(self, from_rel, to_rel, after=False):
         # FIXME: Use after
         assert after != True
-        revt = core.svn_opt_revision_t()
-        revt.kind = core.svn_opt_revision_unspecified
         (to_wc, to_file) = self._get_rel_wc(to_rel, write_lock=True)
         if os.path.dirname(from_rel) == os.path.dirname(to_rel):
             # Prevent lock contention




More information about the bazaar-commits mailing list