Rev 993: Make repos implementation more complete in file:///data/jelmer/bzr-svn/pyrex/

Jelmer Vernooij jelmer at samba.org
Sun Mar 16 13:40:29 GMT 2008


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

------------------------------------------------------------
revno: 993
revision-id:jelmer at samba.org-20080316134027-mk1hfpou37zvot0t
parent: jelmer at samba.org-20080316131204-2whdut1lz5qw5qzf
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: pyrex
timestamp: Sun 2008-03-16 14:40:27 +0100
message:
  Make repos implementation more complete
modified:
  client.pyx                     client.pyx-20080313235339-wbyjbw2namuiql8f-1
  commit.py                      commit.py-20060607190346-qvq128wgfubhhgm2-1
  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 12:26:31 +0000
+++ b/client.pyx	2008-03-16 13:40:27 +0000
@@ -172,8 +172,15 @@
                 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:
+        return NULL
     py_commit_items = []
-    (py_log_msg, py_tmp_file) = baton(py_commit_items)
+    ret = baton(py_commit_items)
+    if isinstance(ret, tuple):
+        (py_log_msg, py_tmp_file) = ret
+    else:
+        py_tmp_file = None
+        py_log_msg = ret
     if py_log_msg is not None:
         log_msg[0] = py_log_msg
     if py_tmp_file is not None:

=== modified file 'commit.py'
--- a/commit.py	2008-03-16 13:12:04 +0000
+++ b/commit.py	2008-03-16 13:40:27 +0000
@@ -419,6 +419,8 @@
             except RevpropChangeFailed:
                 pass # Ignore for now
 
+            self.revid = revid
+
         bp_parts = self.branch.get_branch_path().split("/")
         repository_latest_revnum = self.repository.transport.get_latest_revnum()
         lock = self.repository.transport.lock_write(".")
@@ -503,7 +505,7 @@
         finally:
             lock.unlock()
 
-        return revid
+        return self.revid
 
     def record_entry_contents(self, ie, parent_invs, path, tree,
                               content_summary):

=== modified file 'core.pxd'
--- a/core.pxd	2008-03-16 12:26:31 +0000
+++ b/core.pxd	2008-03-16 13:40:27 +0000
@@ -16,10 +16,12 @@
 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
 from apr cimport apr_pool_t, apr_array_header_t, apr_hash_t
-from types cimport svn_error_t, svn_lock_t
+from types cimport svn_error_t, svn_lock_t, svn_stream_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 *
+cdef svn_stream_t *new_py_stream(apr_pool_t *pool, object py)
+cdef svn_stream_t *string_stream(apr_pool_t *pool, text)

=== modified file 'core.pyx'
--- a/core.pyx	2008-03-16 12:26:31 +0000
+++ b/core.pyx	2008-03-16 13:40:27 +0000
@@ -15,11 +15,22 @@
 # 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, 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_initialize, apr_status_t, apr_time_t, apr_hash_t, apr_size_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
+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
+
+cdef extern from "Python.h":
+    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)
 
 apr_initialize()
 
@@ -152,4 +163,35 @@
         revprops[PROP_REVISION_DATE] = date
     baton(py_changed_paths, revision, revprops)
 
+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
+
 

=== modified file 'ra.pyx'
--- a/ra.pyx	2008-03-16 13:12:04 +0000
+++ b/ra.pyx	2008-03-16 13:40:27 +0000
@@ -19,13 +19,12 @@
 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
+from core cimport check_error, Pool, wrap_lock, string_list_to_apr_array, py_svn_log_wrapper, new_py_stream
 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_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
+from types cimport svn_stream_t
 
 apr_initialize()
 
@@ -33,12 +32,6 @@
     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:
@@ -1010,37 +1003,6 @@
 def get_ssl_client_cert_pw_file_provider():
     pass # 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

=== modified file 'repos.pyx'
--- a/repos.pyx	2008-03-15 20:33:59 +0000
+++ b/repos.pyx	2008-03-16 13:40:27 +0000
@@ -17,7 +17,11 @@
 from apr cimport apr_pool_t, apr_hash_t, apr_pool_destroy
 from types cimport svn_error_t, svn_boolean_t, svn_cancel_func_t, svn_stream_t
 
-from core cimport Pool, check_error
+from core cimport Pool, check_error, new_py_stream, py_cancel_func
+
+cdef extern from "svn_fs.h":
+    ctypedef struct svn_fs_t
+    svn_error_t *svn_fs_get_uuid(svn_fs_t *fs, char **uuid, apr_pool_t *pool)
 
 cdef extern from "svn_repos.h":
     ctypedef struct svn_repos_t
@@ -32,6 +36,9 @@
                               apr_hash_t *config,
                               apr_hash_t *fs_config,
                               apr_pool_t *pool)
+    svn_error_t *svn_repos_open(svn_repos_t **repos_p,
+                            char *path,
+                            apr_pool_t *pool)
     svn_error_t *svn_repos_load_fs2(svn_repos_t *repos,
                                 svn_stream_t *dumpstream,
                                 svn_stream_t *feedback_stream,
@@ -42,6 +49,7 @@
                                 svn_cancel_func_t cancel_func,
                                 void *cancel_baton,
                                 apr_pool_t *pool)
+    svn_fs_t *svn_repos_fs(svn_repos_t *repos)
 
 def create(path, config=None, fs_config=None):
     cdef svn_repos_t *repos
@@ -53,4 +61,50 @@
     check_error(svn_repos_create(&repos, path, "", "", 
                 hash_config, hash_fs_config, pool))
     apr_pool_destroy(pool)
-    return None # FIXME: repos
+    return Repository(path)
+
+cdef class Repository:
+    cdef apr_pool_t *pool
+    cdef svn_repos_t *repos
+    def __init__(self, path):
+        self.pool = Pool(NULL)
+        check_error(svn_repos_open(&self.repos, path, self.pool))
+
+    def __dealloc__(self):
+        apr_pool_destroy(self.pool)
+
+    def load_fs(self, dumpstream, feedback_stream, uuid_action,
+                parent_dir, use_pre_commit_hook=False, 
+                use_post_commit_hook=False,
+                cancel_func=None):
+        cdef apr_pool_t *temp_pool
+        temp_pool = Pool(self.pool)
+        check_error(svn_repos_load_fs2(self.repos, 
+                    new_py_stream(temp_pool, dumpstream), 
+                    new_py_stream(temp_pool, feedback_stream),
+                    uuid_action, parent_dir, use_pre_commit_hook, 
+                    use_post_commit_hook, py_cancel_func, <void *>cancel_func,
+                    self.pool))
+        apr_pool_destroy(temp_pool)
+
+    def fs(self):
+        return FileSystem(self)
+
+cdef class FileSystem:
+    cdef svn_fs_t *fs
+    cdef apr_pool_t *pool
+    def __init__(self, Repository repos):
+        self.fs = svn_repos_fs(repos.repos)
+        self.pool = Pool(repos.pool)
+
+    def __dealloc__(self):
+        apr_pool_destroy(self.pool)
+
+    def get_uuid(self):
+        cdef char *uuid
+        check_error(svn_fs_get_uuid(self.fs, &uuid, self.pool))
+        return uuid
+
+LOAD_UUID_DEFAULT = 0
+LOAD_UUID_IGNORE = 1
+LOAD_UUID_FORCE = 2

=== modified file 'wc.pyx'
--- a/wc.pyx	2008-03-16 06:11:05 +0000
+++ b/wc.pyx	2008-03-16 13:40:27 +0000
@@ -165,7 +165,13 @@
         repos = entry.repos
     ret = Entry(entry.name, entry.revision, url, repos, uuid, entry.kind, entry.schedule, entry.copied, entry.deleted, entry.absent, entry.incomplete)
     ret.cmt_rev = entry.cmt_rev
-    # FIXME: entry.copyfrom_url, entry.copyfrom_rev, entry.conflict_old, entry.conflict_new, entry.conflict_wrk, entry.prejfile, entry.text_time, entry.prop_time, entry.checksum, entry.cmt_date, entry.cmt_author, entry.lock_token, entry.lock_owner, entry.lock_comment, entry.lock_creation_date, entry.has_props, entry.has_prop_mods, entry.cachable_props, entry.present_props)
+    if entry.copyfrom_url != NULL:
+        ret.copyfrom_url = entry.copyfrom_url
+        ret.copyfrom_rev = entry.copyfrom_rev
+    else:
+        ret.copyfrom_url = None
+        ret.copyfrom_rev = -1
+    # FIXME: entry.conflict_old, entry.conflict_new, entry.conflict_wrk, entry.prejfile, entry.text_time, entry.prop_time, entry.checksum, entry.cmt_date, entry.cmt_author, entry.lock_token, entry.lock_owner, entry.lock_comment, entry.lock_creation_date, entry.has_props, entry.has_prop_mods, entry.cachable_props, entry.present_props)
     return ret
 
 cdef class WorkingCopy:
@@ -194,7 +200,10 @@
         cdef apr_pool_t *temp_pool
         temp_pool = Pool(self.pool)
         check_error(svn_wc_prop_get(&value, name, path, self.adm, temp_pool))
-        ret = PyString_FromStringAndSize(value.data, value.len)
+        if value == NULL:
+            ret = None
+        else:
+            ret = PyString_FromStringAndSize(value.data, value.len)
         apr_pool_destroy(temp_pool)
         return ret
 
@@ -266,7 +275,8 @@
             self.adm = NULL
 
     def __dealloc__(self):
-        apr_pool_destroy(self.pool)
+        if self.pool != NULL:
+            apr_pool_destroy(self.pool)
 
 
 def revision_status(wc_path, trail_url=None, committed=False, cancel_func=None):

=== modified file 'workingtree.py'
--- a/workingtree.py	2008-03-16 06:11:05 +0000
+++ b/workingtree.py	2008-03-16 13:40:27 +0000
@@ -326,7 +326,7 @@
                 assert entry
                 
                 if entry.kind == core.NODE_DIR:
-                    subwc = wc.WorkingCopy(wc, self.abspath(subrelpath), 
+                    subwc = wc.WorkingCopy(adm, self.abspath(subrelpath), 
                                              False, 0, None)
                     try:
                         add_dir_to_inv(subrelpath, subwc, id)
@@ -467,12 +467,12 @@
             adm.close()
             raise
 
-        self.client_ctx.log_msg_baton2 = None
+        self.client_ctx.set_log_msg_func(None)
 
-        revid = self.branch.generate_revision_id(commit_info.revision)
+        revid = self.branch.generate_revision_id(commit_info[0])
 
         self.base_revid = revid
-        self.base_revnum = commit_info.revision
+        self.base_revnum = commit_info[0]
         self.base_tree = SvnBasisTree(self)
 
         return revid




More information about the bazaar-commits mailing list