From: Jelmer Vernooij Date: Wed, 18 Jun 2008 11:58:24 +0000 (+0200) Subject: Change API to be more similar to cext branch. X-Git-Tag: bzr-svn-0.4.11_rc1~333 X-Git-Url: http://git.samba.org/samba.git/?p=jelmer%2Fsubvertpy.git;a=commitdiff_plain;h=408af45eb3e2253286e748d2122d48c8addbfff4 Change API to be more similar to cext branch. --- diff --git a/auth.py b/auth.py index 5f237e2e..38279538 100644 --- a/auth.py +++ b/auth.py @@ -18,24 +18,9 @@ from bzrlib.config import AuthenticationConfig from bzrlib.ui import ui_factory -from bzrlib.plugins.svn.ra import (get_username_prompt_provider, - get_simple_prompt_provider, - get_ssl_server_trust_prompt_provider, - get_ssl_client_cert_pw_prompt_provider, - get_simple_provider, - get_username_provider, - get_ssl_client_cert_file_provider, - get_ssl_client_cert_pw_file_provider, - get_ssl_server_trust_file_provider, - Auth - ) +from bzrlib.plugins.svn import ra import svn.core -from svn.core import (svn_auth_cred_username_t, - svn_auth_cred_simple_t, - svn_auth_cred_ssl_client_cert_t, - svn_auth_cred_ssl_client_cert_pw_t, - svn_auth_cred_ssl_server_trust_t) import urlparse import urllib @@ -59,41 +44,31 @@ class SubversionAuthenticationConfig(AuthenticationConfig): self.port = port self.path = path - def get_svn_username(self, realm, may_save, pool=None): + def get_svn_username(self, realm, may_save): """Look up a Subversion user name in the Bazaar authentication cache. :param realm: Authentication realm (optional) :param may_save: Whether or not the username should be saved. - :param pool: Allocation pool, is ignored. - :param default: Assumed username """ - username_cred = svn_auth_cred_username_t() - username_cred.username = self.get_user(self.scheme, - host=self.host, path=self.path, - realm=realm) - username_cred.may_save = False - return username_cred - - def get_svn_simple(self, realm, username, may_save, pool): + username = self.get_user(self.scheme, host=self.host, path=self.path, realm=realm) + return (username, False) + + def get_svn_simple(self, realm, username, may_save): """Look up a Subversion user name+password combination in the Bazaar authentication cache. :param realm: Authentication realm (optional) :param username: Username, if it is already known, or None. :param may_save: Whether or not the username should be saved. - :param pool: Allocation pool, is ignored. """ - simple_cred = svn_auth_cred_simple_t() - simple_cred.username = self.get_user(self.scheme, + username = self.get_user(self.scheme, host=self.host, path=self.path, realm=realm) or username - simple_cred.password = self.get_password(self.scheme, host=self.host, + password = self.get_password(self.scheme, host=self.host, path=self.path, user=simple_cred.username, realm=realm, prompt="%s %s password" % (realm, simple_cred.username)) - simple_cred.may_save = False - return simple_cred + return (username, password, False) - def get_svn_ssl_server_trust(self, realm, failures, cert_info, may_save, - pool): + def get_svn_ssl_server_trust(self, realm, failures, cert_info, may_save): """Return a Subversion auth provider that verifies SSL server trust. :param realm: Realm name (optional) @@ -101,21 +76,19 @@ class SubversionAuthenticationConfig(AuthenticationConfig): :param cert_info: Certificate information :param may_save: Whether this information may be stored. """ - ssl_server_trust = svn_auth_cred_ssl_server_trust_t() credentials = self.get_credentials(self.scheme, host=self.host) if (credentials is not None and credentials.has_key("verify_certificates") and credentials["verify_certificates"] == False): - ssl_server_trust.accepted_failures = ( + accepted_failures = ( SSL_NOTYETVALID + SSL_EXPIRED + SSL_CNMISMATCH + SSL_UNKNOWNCA + SSL_OTHER) else: - ssl_server_trust.accepted_failures = 0 - ssl_server_trust.may_save = False - return ssl_server_trust + accepted_failures = 0 + return (accepted_failures, False) def get_svn_username_prompt_provider(self, retries): """Return a Subversion auth provider for retrieving the username, as @@ -123,7 +96,7 @@ class SubversionAuthenticationConfig(AuthenticationConfig): :param retries: Number of allowed retries. """ - return get_username_prompt_provider(self.get_svn_username, + return ra.get_username_prompt_provider(self.get_svn_username, retries) def get_svn_simple_prompt_provider(self, retries): @@ -132,12 +105,12 @@ class SubversionAuthenticationConfig(AuthenticationConfig): :param retries: Number of allowed retries. """ - return get_simple_prompt_provider(self.get_svn_simple, retries) + return ra.get_simple_prompt_provider(self.get_svn_simple, retries) def get_svn_ssl_server_trust_prompt_provider(self): """Return a Subversion auth provider for checking whether a SSL server is trusted.""" - return get_ssl_server_trust_prompt_provider(self.get_svn_ssl_server_trust) + return ra.get_ssl_server_trust_prompt_provider(self.get_svn_ssl_server_trust) def get_svn_auth_providers(self): """Return a list of auth providers for this authentication file. @@ -146,40 +119,38 @@ class SubversionAuthenticationConfig(AuthenticationConfig): self.get_svn_simple_prompt_provider(1), self.get_svn_ssl_server_trust_prompt_provider()] -def get_ssl_client_cert_pw(realm, may_save, pool): +def get_ssl_client_cert_pw(realm, may_save): """Simple SSL client certificate password prompter. :param realm: Realm, optional. :param may_save: Whether the password can be cached. """ - ssl_cred_pw = svn_auth_cred_ssl_client_cert_pw_t() - ssl_cred_pw.password = ui_factory.get_password( + password = ui_factory.get_password( "Please enter password for client certificate[realm=%s]" % realm) - ssl_cred_pw.may_save = False - return ssl_cred_pw + return (password, False) def get_ssl_client_cert_pw_provider(tries): - return get_ssl_client_cert_pw_prompt_provider( + return ra.get_ssl_client_cert_pw_prompt_provider( get_ssl_client_cert_pw, tries) def get_stock_svn_providers(): - providers = [get_simple_provider(), - get_username_provider(), - get_ssl_client_cert_file_provider(), - get_ssl_client_cert_pw_file_provider(), - get_ssl_server_trust_file_provider(), + providers = [ra.get_simple_provider(), + ra.get_username_provider(), + ra.get_ssl_client_cert_file_provider(), + ra.get_ssl_client_cert_pw_file_provider(), + ra.get_ssl_server_trust_file_provider(), ] - if hasattr(svn.client, 'get_windows_simple_provider'): - providers.append(svn.client.get_windows_simple_provider()) + if hasattr(ra, 'get_windows_simple_provider'): + providers.append(ra.get_windows_simple_provider()) - if hasattr(svn.client, 'get_keychain_simple_provider'): - providers.append(svn.client.get_keychain_simple_provider()) + if hasattr(ra, 'get_keychain_simple_provider'): + providers.append(ra.get_keychain_simple_provider()) - if hasattr(svn.client, 'get_windows_ssl_server_trust_provider'): - providers.append(svn.client.get_windows_ssl_server_trust_provider()) + if hasattr(ra, 'get_windows_ssl_server_trust_provider'): + providers.append(ra.get_windows_ssl_server_trust_provider()) return providers @@ -201,7 +172,7 @@ def create_auth_baton(url): providers += auth_config.get_svn_auth_providers() providers += [get_ssl_client_cert_pw_provider(1)] - auth_baton = Auth(providers) + auth_baton = ra.Auth(providers) if creds is not None: (user, password) = urllib.splitpasswd(creds) if user is not None: diff --git a/commit.py b/commit.py index f7186292..bd90e8f8 100644 --- a/commit.py +++ b/commit.py @@ -298,7 +298,7 @@ class SvnCommitBuilder(RootCommitBuilder): self.modified_files[child_ie.file_id], child_editor) if child_editor is not None: - child_editor.close(None) + child_editor.close() # Loop over subdirectories of file_id in self.new_inventory for child_name in self.new_inventory[file_id].children: diff --git a/fetch.py b/fetch.py index 0ba5098a..4a04423f 100644 --- a/fetch.py +++ b/fetch.py @@ -25,8 +25,6 @@ from bzrlib.trace import mutter from cStringIO import StringIO import md5 -import svn.delta - from bzrlib.plugins.svn import properties from bzrlib.plugins.svn.delta import apply_txdelta_handler from bzrlib.plugins.svn.errors import InvalidFileName @@ -42,6 +40,7 @@ from bzrlib.plugins.svn.svk import SVN_PROP_SVK_MERGE from bzrlib.plugins.svn.tree import (parse_externals_description, inventory_add_external) +import svn.delta def _escape_commit_message(message): """Replace xml-incompatible control characters.""" @@ -86,7 +85,7 @@ def check_filename(path): raise InvalidFileName(path) -class RevisionBuildEditor(svn.delta.Editor): +class RevisionBuildEditor: """Implementation of the Subversion commit editor interface that builds a Bazaar revision. """ @@ -95,6 +94,9 @@ class RevisionBuildEditor(svn.delta.Editor): self.source = source self.transact = target.get_transaction() + def set_target_revision(self, revnum): + assert self.revnum == revnum + def start_revision(self, revid, prev_inventory, revmeta): self.revid = revid (self.branch_path, self.revnum, self.mapping) = self.source.lookup_revision_id(revid) diff --git a/ra.py b/ra.py index 036172be..d6208240 100644 --- a/ra.py +++ b/ra.py @@ -24,15 +24,46 @@ from bzrlib.plugins.svn.core import get_config, SubversionException import bzrlib.plugins.svn.errors as svn_errors -get_username_prompt_provider = svn.core.svn_auth_get_username_prompt_provider -get_simple_prompt_provider = svn.core.svn_auth_get_simple_prompt_provider -get_ssl_client_cert_pw_prompt_provider = svn.core.svn_auth_get_ssl_client_cert_pw_prompt_provider -get_ssl_server_trust_prompt_provider = svn.core.svn_auth_get_ssl_server_trust_prompt_provider +def get_username_prompt_provider(fn, retries): + def wrap_fn(realm, may_save, pool): + username_cred = svn.core.svn_auth_cred_username_t() + (username_cred.username, username_cred.may_save) = fn(realm, may_save) + return username_cred + return svn.core.svn_auth_get_username_prompt_provider(wrap_fn, retries) + +def get_simple_prompt_provider(fn, retries): + def wrap_fn(realm, username, may_save, pool): + simple_cred = svn.core.svn_auth_cred_simple_t() + (simple_cred.username, simple_cred.password, simple_cred.may_save) = \ + fn(realm, username, may_save) + return simple_cred + return svn.core.svn_auth_get_simple_prompt_provider(wrap_fn, retries) + +def get_ssl_server_trust_prompt_provider(fn): + def wrap_fn(realm, failures, cert_info, may_save, pool): + ssl_server_trust = svn.core.svn_auth_cred_ssl_server_trust_t() + (ssl_server_trust.accepted_failures, ssl_server_trust.may_save) = fn(realm, failures, cert_info, may_save) + return ssl_server_trust + return svn.core.svn_auth_get_ssl_server_trust_prompt_provider(wrap_fn) + +def get_ssl_client_cert_pw_prompt_provider(fn, retries): + def wrap_fn(realm, may_save, pool): + ssl_cred_pw = svn.core.svn_auth_cred_ssl_client_cert_pw_t() + (ssl_cred_pw.password, ssl_cred_pw.may_save) = fn(realm, may_save) + return ssl_cred_pw + return svn.core.svn_auth_get_ssl_client_cert_pw_prompt_provider(wrap_fn, retries) + get_simple_provider = svn.client.get_simple_provider get_username_provider = svn.client.get_username_provider get_ssl_client_cert_file_provider = svn.client.get_ssl_client_cert_file_provider get_ssl_client_cert_pw_file_provider = svn.client.get_ssl_client_cert_pw_file_provider get_ssl_server_trust_file_provider = svn.client.get_ssl_server_trust_file_provider +if hasattr(svn.client, 'get_windows_simple_provider'): + get_windows_simple_provider = svn.client.get_windows_simple_provider +if hasattr(svn.client, 'get_keychain_simple_provider'): + get_keychain_simple_provider = svn.client.get_keychain_simple_provider +if hasattr(svn.client, 'get_windows_ssl_server_trust_provider'): + get_windows_ssl_server_trust_provider = svn.client.get_windows_ssl_server_trust_provider txdelta_send_stream = svn.delta.svn_txdelta_send_stream @@ -114,6 +145,9 @@ class Editor(object): self.recent_baton = [] self._connection = connection + def set_target_revision(self, revnum): + svn.delta.editor_invoke_set_target_revision(self.editor, self.editor_baton, revnum) + def open_root(self, base_revnum=-1): assert self.recent_baton == [], "root already opened" baton = svn.delta.editor_invoke_open_root(self.editor, @@ -165,6 +199,59 @@ def create_svn_client(url): return client +class WrappedEditor: + def __init__(self, actual): + self.actual = actual + + def set_target_revision(self, revision): + if getattr(self.actual, "set_target_revision", None) is not None: + self.actual.set_target_revision(revision) + + def open_root(self, base_revision): + if getattr(self.actual, "open_root", None) is not None: + return self.actual.open_root(base_revision) + return None + + def add_directory(self, path, baton, copyfrom_path, copyfrom_rev): + if baton is not None and getattr(baton, "add_directory", None) is not None: + return baton.add_directory(path, copyfrom_path, copyfrom_rev) + return None + + def open_directory(self, path, baton, base_rev): + if baton is not None and getattr(baton, "open_directory", None) is not None: + return baton.open_directory(path, base_rev) + return None + + def close_directory(self, baton): + if baton is not None and getattr(baton, "close", None) is not None: + return baton.close() + + def change_file_prop(self, baton, name, value): + if baton is not None and getattr(baton, "change_prop", None) is not None: + return baton.change_prop(name, value) + + def change_dir_prop(self, baton, name, value): + if baton is not None and getattr(baton, "change_prop", None) is not None: + return baton.change_prop(name, value) + + def apply_textdelta(self, baton, checksum): + if baton is not None and getattr(baton, "apply_textdelta", None) is not None: + return baton.apply_textdelta(checksum) + + def close_file(self, baton, checksum): + if baton is not None and getattr(baton, "close", None) is not None: + return baton.close(checksum) + + def open_file(self, path, baton, base_rev): + if baton is not None and getattr(self.actual, "open_file", None) is not None: + return baton.open_file(path, base_rev) + return None + + def close_edit(self): + if getattr(self.actual, "close_edit", None) is not None: + self.actual.close_edit() + + class RemoteAccess(object): """An single connection to a Subversion repository. This usually can only do one operation at a time.""" @@ -338,10 +425,6 @@ class RemoteAccess(object): return svn.ra.rev_proplist(self._ra, revnum, None) def get_commit_editor(self, revprops, done_cb=None, lock_token=None, keep_locks=False): - def dummy_done(meta, pool): - pass - if done_cb is None: - done_cb = dummy_done self._mark_busy() try: if hasattr(svn.ra, 'get_commit_editor3'): diff --git a/tree.py b/tree.py index c0e04e56..b677c302 100644 --- a/tree.py +++ b/tree.py @@ -184,7 +184,7 @@ class TreeBuildEditor: self.is_executable = False return path - def close_dir(self, id): + def close_directory(self, id): pass def close_file(self, path, checksum): diff --git a/workingtree.py b/workingtree.py index 936908be..d5415468 100644 --- a/workingtree.py +++ b/workingtree.py @@ -72,7 +72,7 @@ def generate_ignore_list(ignore_map): class SvnWorkingTree(WorkingTree): """WorkingTree implementation that uses a Subversion Working Copy for storage.""" def __init__(self, bzrdir, local_path, branch): - version = wc.check_wc(local_path) + version = svn.wc.check_wc(local_path) self._format = SvnWorkingTreeFormat(version) self.basedir = local_path assert isinstance(self.basedir, unicode)