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