Rev 1014: Reimplement svn.client.update() in python. The only svn.client function that is now used is commit(). in file:///data/jelmer/bzr-svn/pyrex/

Jelmer Vernooij jelmer at samba.org
Tue Mar 18 23:27:45 GMT 2008


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

------------------------------------------------------------
revno: 1014
revision-id:jelmer at samba.org-20080318232743-3l6scuzhind6q0mi
parent: jelmer at samba.org-20080318215258-dcoi7wm4i4bioyoa
committer: Jelmer Vernooij <jelmer at samba.org>
branch nick: pyrex
timestamp: Wed 2008-03-19 00:27:43 +0100
message:
  Reimplement svn.client.update() in python. The only svn.client function that is now used is commit().
modified:
  auth.py                        auth.py-20071209174622-w8d42k6nm5yhxvi8-1
  fetch.py                       fetch.py-20060625004942-x2lfaib8ra707a8p-1
  logwalker.py                   logwalker.py-20060621215743-c13fhfnyzh1xzwh2-1
  ra.pxd                         ra.pxd-20080316145122-rpus5mpg799ld67s-1
  ra.pyx                         ra.pyx-20080313140933-qybkqaxe3m4mcll7-1
  transport.py                   transport.py-20060406231150-b3472d06b3a0818d
  tree.py                        tree.py-20060624222557-dudlwqcmkf22lt2s-1
  wc.pyx                         wc.pyx-20080313142018-10l8l23vha2j9e6b-1
  workingtree.py                 workingtree.py-20060306120941-b083cb0fdd4a69de
=== modified file 'auth.py'
--- a/auth.py	2008-03-15 15:52:16 +0000
+++ b/auth.py	2008-03-18 23:27:43 +0000
@@ -28,7 +28,6 @@
                 )
 from ra import Auth
 import constants
-import client
 
 class SubversionAuthenticationConfig(AuthenticationConfig):
     """Simple extended version of AuthenticationConfig that can provide 
@@ -149,14 +148,14 @@
         get_ssl_server_trust_file_provider(),
         ]
 
-    if hasattr(client, 'get_windows_simple_provider'):
-        providers.append(client.get_windows_simple_provider())
-
-    if hasattr(client, 'get_keychain_simple_provider'):
-        providers.append(client.get_keychain_simple_provider())
-
-    if hasattr(client, 'get_windows_ssl_server_trust_provider'):
-        providers.append(client.get_windows_ssl_server_trust_provider())
+    if hasattr(core, 'get_windows_simple_provider'):
+        providers.append(core.get_windows_simple_provider())
+
+    if hasattr(core, 'get_keychain_simple_provider'):
+        providers.append(core.get_keychain_simple_provider())
+
+    if hasattr(core, 'get_windows_ssl_server_trust_provider'):
+        providers.append(core.get_windows_ssl_server_trust_provider())
 
     return Auth(providers)
 

=== modified file 'fetch.py'
--- a/fetch.py	2008-03-18 21:52:58 +0000
+++ b/fetch.py	2008-03-18 23:27:43 +0000
@@ -636,7 +636,7 @@
             reporter.set_path("", parent_revnum, False)
 
         lock = transport.lock_read(".")
-        reporter.finish_report()
+        reporter.finish()
         lock.unlock()
 
     def _fetch_switch(self, revids, pb=None, lhs_parent=None):

=== modified file 'logwalker.py'
--- a/logwalker.py	2008-03-18 19:33:31 +0000
+++ b/logwalker.py	2008-03-18 23:27:43 +0000
@@ -306,7 +306,7 @@
         reporter = transport.do_switch(revnum, True, 
                 urlutils.join(root_repos, path), editor)
         reporter.set_path("", 0, True)
-        reporter.finish_report()
+        reporter.finish()
         return editor.files
 
     def get_previous(self, path, revnum):

=== modified file 'ra.pxd'
--- a/ra.pxd	2008-03-16 14:51:30 +0000
+++ b/ra.pxd	2008-03-18 23:27:43 +0000
@@ -15,8 +15,8 @@
 # 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
-from apr cimport apr_pool_t
+from types cimport svn_error_t, svn_filesize_t, svn_string_t, svn_revnum_t, svn_stream_t
+from apr cimport apr_pool_t, apr_size_t
 
 cdef extern from "svn_ra.h":
     ctypedef struct svn_ra_reporter2_t:
@@ -41,3 +41,100 @@
         svn_error_t *(*finish_report)(void *report_baton, apr_pool_t *pool) except *
 
         svn_error_t *(*abort_report)(void *report_baton, apr_pool_t *pool) except *
+
+cdef extern from "svn_delta.h":
+    ctypedef enum svn_delta_action:
+        svn_txdelta_source
+        svn_txdelta_target
+        svn_txdelta_new
+
+    ctypedef struct svn_txdelta_op_t:
+        svn_delta_action action_code
+        apr_size_t offset
+        apr_size_t length
+
+    ctypedef struct svn_txdelta_window_t:
+        svn_filesize_t sview_offset
+        apr_size_t sview_len
+        apr_size_t tview_len
+        int num_ops
+        int src_ops
+        svn_txdelta_op_t *ops
+        svn_string_t *new_data
+
+    ctypedef svn_error_t *(*svn_txdelta_window_handler_t) (svn_txdelta_window_t *window, void *baton)
+
+    ctypedef struct svn_delta_editor_t:
+        svn_error_t *(*set_target_revision)(void *edit_baton, 
+                svn_revnum_t target_revision, apr_pool_t *pool) except * 
+        svn_error_t *(*open_root)(void *edit_baton, svn_revnum_t base_revision, 
+                                  apr_pool_t *dir_pool, void **root_baton)
+
+        svn_error_t *(*delete_entry)(char *path, long revision, 
+                                     void *parent_baton, apr_pool_t *pool)
+
+        svn_error_t *(*add_directory)(char *path,
+                                void *parent_baton,
+                                char *copyfrom_path,
+                                long copyfrom_revision,
+                                apr_pool_t *dir_pool,
+                                void **child_baton)
+
+        svn_error_t *(*open_directory)(char *path, void *parent_baton,
+                                 long base_revision,
+                                 apr_pool_t *dir_pool,
+                                 void **child_baton)
+
+        svn_error_t *(*change_dir_prop)(void *dir_baton,
+                                  char *name,
+                                  svn_string_t *value,
+                                  apr_pool_t *pool)
+
+        svn_error_t *(*close_directory)(void *dir_baton,
+                                  apr_pool_t *pool)
+
+        svn_error_t *(*absent_directory)(char *path, void *parent_baton, 
+                                     apr_pool_t *pool)
+
+        svn_error_t *(*add_file)(char *path,
+                           void *parent_baton,
+                           char *copy_path,
+                           long copy_revision,
+                           apr_pool_t *file_pool,
+                           void **file_baton)
+
+        svn_error_t *(*open_file)(char *path,
+                            void *parent_baton,
+                            long base_revision,
+                            apr_pool_t *file_pool,
+                            void **file_baton)
+
+        svn_error_t *(*apply_textdelta)(void *file_baton,
+                                  char *base_checksum,
+                                  apr_pool_t *pool,
+                                  svn_txdelta_window_handler_t *handler,
+                                  void **handler_baton)
+        svn_error_t *(*change_file_prop)(void *file_baton,
+                                   char *name,
+                                   svn_string_t *value,
+                                   apr_pool_t *pool)
+
+        svn_error_t *(*close_file)(void *file_baton,
+                             char *text_checksum,
+                             apr_pool_t *pool)
+
+        svn_error_t *(*absent_file)(char *path,
+                              void *parent_baton,
+                              apr_pool_t *pool)
+
+        svn_error_t *(*close_edit)(void *edit_baton, apr_pool_t *pool)
+
+        svn_error_t *(*abort_edit)(void *edit_baton, apr_pool_t *pool)
+
+    svn_error_t *svn_txdelta_send_stream(svn_stream_t *stream,
+                                     svn_txdelta_window_handler_t handler,
+                                     void *handler_baton,
+                                     unsigned char *digest,
+                                     apr_pool_t *pool)
+
+cdef new_editor(svn_delta_editor_t *editor, void *edit_baton, apr_pool_t *pool)

=== modified file 'ra.pyx'
--- a/ra.pyx	2008-03-18 20:34:11 +0000
+++ b/ra.pyx	2008-03-18 23:27:43 +0000
@@ -33,101 +33,6 @@
     void Py_INCREF(object)
     void Py_DECREF(object)
 
-cdef extern from "svn_delta.h":
-    ctypedef enum svn_delta_action:
-        svn_txdelta_source
-        svn_txdelta_target
-        svn_txdelta_new
-
-    ctypedef struct svn_txdelta_op_t:
-        svn_delta_action action_code
-        apr_size_t offset
-        apr_size_t length
-
-    ctypedef struct svn_txdelta_window_t:
-        svn_filesize_t sview_offset
-        apr_size_t sview_len
-        apr_size_t tview_len
-        int num_ops
-        int src_ops
-        svn_txdelta_op_t *ops
-        svn_string_t *new_data
-
-    ctypedef svn_error_t *(*svn_txdelta_window_handler_t) (svn_txdelta_window_t *window, void *baton)
-
-    ctypedef struct svn_delta_editor_t:
-        svn_error_t *(*set_target_revision)(void *edit_baton, 
-                svn_revnum_t target_revision, apr_pool_t *pool) except * 
-        svn_error_t *(*open_root)(void *edit_baton, svn_revnum_t base_revision, 
-                                  apr_pool_t *dir_pool, void **root_baton)
-
-        svn_error_t *(*delete_entry)(char *path, long revision, 
-                                     void *parent_baton, apr_pool_t *pool)
-
-        svn_error_t *(*add_directory)(char *path,
-                                void *parent_baton,
-                                char *copyfrom_path,
-                                long copyfrom_revision,
-                                apr_pool_t *dir_pool,
-                                void **child_baton)
-
-        svn_error_t *(*open_directory)(char *path, void *parent_baton,
-                                 long base_revision,
-                                 apr_pool_t *dir_pool,
-                                 void **child_baton)
-
-        svn_error_t *(*change_dir_prop)(void *dir_baton,
-                                  char *name,
-                                  svn_string_t *value,
-                                  apr_pool_t *pool)
-
-        svn_error_t *(*close_directory)(void *dir_baton,
-                                  apr_pool_t *pool)
-
-        svn_error_t *(*absent_directory)(char *path, void *parent_baton, 
-                                     apr_pool_t *pool)
-
-        svn_error_t *(*add_file)(char *path,
-                           void *parent_baton,
-                           char *copy_path,
-                           long copy_revision,
-                           apr_pool_t *file_pool,
-                           void **file_baton)
-
-        svn_error_t *(*open_file)(char *path,
-                            void *parent_baton,
-                            long base_revision,
-                            apr_pool_t *file_pool,
-                            void **file_baton)
-
-        svn_error_t *(*apply_textdelta)(void *file_baton,
-                                  char *base_checksum,
-                                  apr_pool_t *pool,
-                                  svn_txdelta_window_handler_t *handler,
-                                  void **handler_baton)
-        svn_error_t *(*change_file_prop)(void *file_baton,
-                                   char *name,
-                                   svn_string_t *value,
-                                   apr_pool_t *pool)
-
-        svn_error_t *(*close_file)(void *file_baton,
-                             char *text_checksum,
-                             apr_pool_t *pool)
-
-        svn_error_t *(*absent_file)(char *path,
-                              void *parent_baton,
-                              apr_pool_t *pool)
-
-        svn_error_t *(*close_edit)(void *edit_baton, apr_pool_t *pool)
-
-        svn_error_t *(*abort_edit)(void *edit_baton, apr_pool_t *pool)
-
-    svn_error_t *svn_txdelta_send_stream(svn_stream_t *stream,
-                                     svn_txdelta_window_handler_t handler,
-                                     void *handler_baton,
-                                     unsigned char *digest,
-                                     apr_pool_t *pool)
-
 
 cdef extern from "svn_types.h":
     ctypedef svn_error_t *(*svn_commit_callback2_t) (svn_commit_info_t *commit_info, baton, apr_pool_t *pool) except *
@@ -348,10 +253,10 @@
         check_error(self.reporter.link_path(self.report_baton, path, url, 
                     revision, start_empty, c_lock_token(lock_token), self.pool))
 
-    def finish_report(self):
+    def finish(self):
         check_error(self.reporter.finish_report(self.report_baton, self.pool))
 
-    def abort_report(self):
+    def abort(self):
         check_error(self.reporter.abort_report(self.report_baton, self.pool))
 
     def __dealloc__(self):
@@ -1061,3 +966,11 @@
     apr_pool_destroy(pool)
     return PyString_FromStringAndSize(<char *>digest, 16)
 
+
+cdef new_editor(svn_delta_editor_t *editor, void *edit_baton, apr_pool_t *pool):
+    cdef Editor ret
+    ret = Editor()
+    ret.editor = editor
+    ret.edit_baton = edit_baton
+    ret.pool = pool
+    return ret

=== modified file 'transport.py'
--- a/transport.py	2008-03-18 02:07:16 +0000
+++ b/transport.py	2008-03-18 23:27:43 +0000
@@ -25,7 +25,6 @@
 from auth import create_auth_baton
 import ra
 import core
-import client
 import constants
 
 from errors import convert_svn_error, NoSvnRepositoryPresent
@@ -37,12 +36,6 @@
     return "bzr%s+bzr-svn%s" % (bzrlib.__version__, bzrlib.plugins.svn.__version__)
 
 
-def create_svn_client():
-    ret = client.Client()
-    # FIXME ret.
-    return ret
-
-
 # Don't run any tests on SvnTransport as it is not intended to be 
 # a full implementation of Transport
 def get_test_permutations():

=== modified file 'tree.py'
--- a/tree.py	2008-03-18 21:52:58 +0000
+++ b/tree.py	2008-03-18 23:27:43 +0000
@@ -110,7 +110,7 @@
                 self.revnum, True, 
                 urlutils.join(root_repos, self.branch_path), editor)
         reporter.set_path("", 0, True)
-        reporter.finish_report()
+        reporter.finish()
 
     def get_file_lines(self, file_id):
         return osutils.split_lines(self.file_data[file_id])
@@ -207,7 +207,7 @@
             self.is_executable = (value != None)
         elif name == constants.PROP_SPECIAL:
             self.is_symlink = (value != None)
-        elif name == svn.core.SVN_PROP_EXTERNALS:
+        elif name == constants.PROP_EXTERNALS:
             mutter('%r property on file!' % name)
         elif name == constants.PROP_ENTRY_COMMITTED_REV:
             self.last_file_rev = int(value)

=== modified file 'wc.pyx'
--- a/wc.pyx	2008-03-18 21:50:41 +0000
+++ b/wc.pyx	2008-03-18 23:27:43 +0000
@@ -14,9 +14,9 @@
 # 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_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, apr_array_pop, apr_hash_make, apr_hash_set
+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, apr_array_pop, apr_hash_make, apr_hash_set, apr_palloc
 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 ra cimport svn_ra_reporter2_t
+from ra cimport svn_ra_reporter2_t, svn_delta_editor_t, new_editor
 
 from core cimport check_error, Pool, py_cancel_func
 
@@ -237,6 +237,20 @@
                                 char *repos, svn_revnum_t revision,
                                 apr_pool_t *pool)
 
+    svn_error_t *svn_wc_get_update_editor2(svn_revnum_t *target_revision,
+                                       svn_wc_adm_access_t *anchor,
+                                       char *target,
+                                       svn_boolean_t use_commit_times,
+                                       svn_boolean_t recurse,
+                                       svn_wc_notify_func2_t notify_func,
+                                       void *notify_baton,
+                                       svn_cancel_func_t cancel_func,
+                                       void *cancel_baton,
+                                       char *diff3_cmd,
+                                       svn_delta_editor_t **editor,
+                                       void **edit_baton,
+                                       svn_wc_traversal_info_t *ti,
+                                       apr_pool_t *pool)
 
 def version():
     """Get libsvn_wc version information.
@@ -433,6 +447,25 @@
                     traversal_info, temp_pool))
         apr_pool_destroy(temp_pool)
 
+    def get_update_editor(self, target, use_commit_times=True, recurse=True, 
+                    notify_func=None, cancel_func=None, diff3_cmd=None):
+        cdef char *c_diff3_cmd
+        cdef svn_delta_editor_t *editor
+        cdef void *edit_baton
+        cdef apr_pool_t *pool
+        cdef svn_revnum_t *latest_revnum
+        if diff3_cmd is None:
+            c_diff3_cmd = NULL
+        else:
+            c_diff3_cmd = diff3_cmd
+        pool = Pool(NULL)
+        latest_revnum = <svn_revnum_t *>apr_palloc(pool, sizeof(svn_revnum_t))
+        check_error(svn_wc_get_update_editor2(latest_revnum, self.adm, target, 
+                    use_commit_times, recurse, py_wc_notify_func, <void *>notify_func, 
+                    py_cancel_func, <void *>cancel_func, c_diff3_cmd, &editor, &edit_baton, 
+                    NULL, pool))
+        return new_editor(editor, edit_baton, pool)
+
     def close(self):
         if self.adm != NULL:
             svn_wc_adm_close(self.adm)
@@ -499,7 +532,11 @@
 
 cdef svn_error_t *py_ra_report_set_path(void *baton, char *path, long revision, int start_empty, char *lock_token, apr_pool_t *pool) except *:
     self = <object>baton
-    self.set_path(path, revision, start_empty, lock_token)
+    if lock_token == NULL:
+        py_lock_token = None
+    else:
+        py_lock_token = lock_token
+    self.set_path(path, revision, start_empty, py_lock_token)
     return NULL
 
 cdef svn_error_t *py_ra_report_delete_path(void *baton, char *path, apr_pool_t *pool) except *:
@@ -509,7 +546,11 @@
 
 cdef svn_error_t *py_ra_report_link_path(void *report_baton, char *path, char *url, long revision, int start_empty, char *lock_token, apr_pool_t *pool) except *:
     self = <object>report_baton
-    self.link_path(path, url, revision, start_empty, lock_token)
+    if lock_token == NULL:
+        py_lock_token = None
+    else:
+        py_lock_token = lock_token
+    self.link_path(path, url, revision, start_empty, py_lock_token)
     return NULL
 
 cdef svn_error_t *py_ra_report_finish(void *baton, apr_pool_t *pool) except *:

=== modified file 'workingtree.py'
--- a/workingtree.py	2008-03-18 21:50:41 +0000
+++ b/workingtree.py	2008-03-18 23:27:43 +0000
@@ -45,8 +45,7 @@
 from svk import SVN_PROP_SVK_MERGE, parse_svk_features, serialize_svk_features
 from mapping import escape_svn_path
 from scheme import BranchingScheme
-from transport import (SvnRaTransport, bzr_to_svn_url, create_svn_client,
-                       svn_config) 
+from transport import (SvnRaTransport, bzr_to_svn_url, svn_config) 
 from tree import SvnBasisTree
 
 import os
@@ -57,6 +56,7 @@
 
 from format import get_rich_root_format
 
+
 class SvnWorkingTree(WorkingTree):
     """WorkingTree implementation that uses a Subversion Working Copy for storage."""
     def __init__(self, bzrdir, local_path, branch):
@@ -64,7 +64,6 @@
         self.basedir = local_path
         self.bzrdir = bzrdir
         self._branch = branch
-        self.client_ctx = create_svn_client()
         self._get_wc()
         (min_rev, max_rev, switched, modified) = \
                 wc.revision_status(self.basedir, None, True)
@@ -131,9 +130,27 @@
     def apply_inventory_delta(self, changes):
         raise NotImplementedError(self.apply_inventory_delta)
 
+    def _update(self, revnum=None):
+        if revnum is None:
+            revnum = self.branch.get_revnum()
+        adm = self._get_wc()
+        # FIXME: honor SVN_CONFIG_SECTION_HELPERS:SVN_CONFIG_OPTION_DIFF3_CMD
+        # FIXME: honor SVN_CONFIG_SECTION_MISCELLANY:SVN_CONFIG_OPTION_USE_COMMIT_TIMES
+        # FIXME: honor SVN_CONFIG_SECTION_MISCELLANY:SVN_CONFIG_OPTION_PRESERVED_CF_EXTS
+        try:
+            editor = adm.get_update_editor(self.basedir, use_commit_times=False, recurse=True)
+            assert editor is not None
+            reporter = self.branch.repository.transport.do_update(revnum, True, editor)
+            adm.crawl_revisions(self.basedir, reporter, restore_files=False, recurse=True, 
+                                use_commit_times=False)
+            # FIXME: handle externals
+        finally:
+            adm.close()
+        return revnum
+
     def update(self, change_reporter=None, possible_transports=None, revnum=None):
         orig_revnum = self.base_revnum
-        self.base_revnum = self.client_ctx.update([self.basedir], rev=revnum)[0]
+        self.base_revnum = self._update(revnum)
         self.base_revid = self.branch.generate_revision_id(self.base_revnum)
         self.base_tree = None
         self.read_working_inventory()
@@ -417,6 +434,8 @@
                 """ Simple log message provider for unit tests. """
                 return message.encode("utf-8")
 
+        import client
+        self.client_ctx = client.Client()
         self.client_ctx.set_log_msg_func(log_message_func)
         if rev_id is not None:
             extra = "%d %s\n" % (self.branch.revno()+1, rev_id)
@@ -556,7 +575,7 @@
         if stop_revision is None:
             stop_revision = self.branch.last_revision()
         revnumber = self.branch.lookup_revision_id(stop_revision)
-        fetched = self.client_ctx.update([self.basedir], revnum, True)
+        fetched = self._update(revnum)
         self.base_revnum = fetched
         self.base_revid = self.branch.generate_revision_id(fetched)
         self.base_tree = None




More information about the bazaar-commits mailing list