diff --git a/vcsserver/git.py b/vcsserver/git.py --- a/vcsserver/git.py +++ b/vcsserver/git.py @@ -521,6 +521,9 @@ class GitRemote(object): def discover_git_version(self): stdout, _ = self.run_git_command( {}, ['--version'], _bare=True, _safe=True) + prefix = 'git version' + if stdout.startswith(prefix): + stdout = stdout[len(prefix):] return stdout @reraise_safe_exceptions diff --git a/vcsserver/hg.py b/vcsserver/hg.py --- a/vcsserver/hg.py +++ b/vcsserver/hg.py @@ -142,6 +142,11 @@ class HgRemote(object): } @reraise_safe_exceptions + def discover_hg_version(self): + from mercurial import util + return util.version() + + @reraise_safe_exceptions def archive_repo(self, archive_path, mtime, file_info, kind): if kind == "tgz": archiver = archival.tarit(archive_path, mtime, "gz") diff --git a/vcsserver/svn.py b/vcsserver/svn.py --- a/vcsserver/svn.py +++ b/vcsserver/svn.py @@ -32,6 +32,7 @@ import svn.fs import svn.repos from vcsserver import svn_diff +from vcsserver import exceptions from vcsserver.base import RepoFactory @@ -48,6 +49,30 @@ svn_compatible_versions = set([ ]) +def reraise_safe_exceptions(func): + """Decorator for converting svn exceptions to something neutral.""" + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except Exception as e: + if not hasattr(e, '_vcs_kind'): + log.exception("Unhandled exception in hg remote call") + raise_from_original(exceptions.UnhandledException) + raise + return wrapper + + +def raise_from_original(new_type): + """ + Raise a new exception type with original args and traceback. + """ + _, original, traceback = sys.exc_info() + try: + raise new_type(*original.args), None, traceback + finally: + del traceback + + class SubversionFactory(RepoFactory): def _create_repo(self, wire, create, compatible_version): @@ -88,6 +113,15 @@ class SvnRemote(object): # for subversion self._hg_factory = hg_factory + @reraise_safe_exceptions + def discover_svn_version(self): + try: + import svn.core + svn_ver = svn.core.SVN_VERSION + except ImportError: + svn_ver = None + return svn_ver + def check_url(self, url, config_items): # this can throw exception if not installed, but we detect this from hgsubversion import svnrepo