# HG changeset patch # User Dan Villiom Podlaski Christiansen # Date 1273861352 -7200 # Node ID b70f7c82b9b81c77921dd783dca92eb4453f5a6d # Parent 300b917d23c5586a9c6eb9789b8604d216d2f84c svncommands: fix layering violation & tweak error messages. Importing `SubversionException' directly from `svn.core' is a layering violation: Anything within the Subversion bindings should only be accessed via svnwrap. The advantages to doing this are twofold: we only need to intercept missing bindings in one place, and we have the option of supporting alternate bindings. As an added bonus, the recently-added support for intercepting missing Subversion bindings actually works. Two error messages are tweaked to remove `It appears...' from one error message (just blaming Subversion instead) and make both errors include the URL in the suggested command line. diff --git a/hgsubversion/svncommands.py b/hgsubversion/svncommands.py --- a/hgsubversion/svncommands.py +++ b/hgsubversion/svncommands.py @@ -8,8 +8,6 @@ from mercurial import node from mercurial import util as hgutil from mercurial import error -from svn import core - import maps import svnwrap import svnrepo @@ -420,11 +418,8 @@ def svn(ui, repo, subcommand, *args, **o try: commandfunc = table[subcommand] return commandfunc(ui, args=args, repo=repo, **opts) - except core.SubversionException, e: - if e.apr_err == core.SVN_ERR_RA_SERF_SSL_CERT_UNTRUSTED: - raise hgutil.Abort('It appears svn does not trust the ssl cert for this site.\n' - 'Please try running svn ls on that url first.') - raise + except svnwrap.SubversionConnectionException, e: + raise hgutil.Abort(*e.args) except TypeError: tb = traceback.extract_tb(sys.exc_info()[2]) if len(tb) == 1: diff --git a/hgsubversion/svnrepo.py b/hgsubversion/svnrepo.py --- a/hgsubversion/svnrepo.py +++ b/hgsubversion/svnrepo.py @@ -93,7 +93,11 @@ class svnremoterepo(mercurial.repo.repos @propertycache def svn(self): - return svnwrap.SubversionRepo(*self.svnauth) + try: + return svnwrap.SubversionRepo(*self.svnauth) + except svnwrap.SubversionConnectionException, e: + self.ui.traceback() + raise hgutil.Abort(e) @property def svnuuid(self): diff --git a/hgsubversion/svnwrap/svn_swig_wrapper.py b/hgsubversion/svnwrap/svn_swig_wrapper.py --- a/hgsubversion/svnwrap/svn_swig_wrapper.py +++ b/hgsubversion/svnwrap/svn_swig_wrapper.py @@ -44,6 +44,11 @@ class SubversionRepoCanNotDiff(Exception """Exception raised when the svn API diff3() command cannot be used """ +class SubversionConnectionException(Exception): + """Exception raised when a generic error occurs when connecting to a + repository. + """ + '''Default chunk size used in fetch_history_at_paths() and revisions().''' _chunk_size = 1000 @@ -252,9 +257,22 @@ class SubversionRepo(object): path=urllib.quote(path) url = urlparse.urlunparse((scheme, netloc, path, params, query, fragment)) self.ra = ra.open2(url, callbacks, - svn_config, self.pool) + svn_config, self.pool) except core.SubversionException, e: - raise hgutil.Abort(e.args[0]) + if e.apr_err == core.SVN_ERR_RA_SERF_SSL_CERT_UNTRUSTED: + msg = ('Subversion does not trust the SSL certificate for this ' + 'site; please try running \'svn ls %s\' first.' + % self.svn_url) + elif e.apr_err == core.SVN_ERR_RA_DAV_REQUEST_FAILED: + msg = ('Failed to open Subversion repository; please try ' + 'running \'svn ls %s\' for details.' % self.svn_url) + else: + msg = e.args[0] + for k, v in vars(core).iteritems(): + if k.startswith('SVN_ERR_') and v == e.apr_err: + msg = '%s (%s)' % (msg, k) + break + raise SubversionConnectionException(msg) def HEAD(self): return ra.get_latest_revnum(self.ra, self.pool)