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