# HG changeset patch # User Patrick Mezard # Date 1247967873 18000 # Node ID 5567af673f83a8c4e5a54b6afc1de0523b098f9a # Parent 037bba1c673617b2582caf206ef02de0b5fda8be Revive svn+http(s) URLs support (issue94) Telling svn from mercurial repository automatically is not always possible, or at least not seamlessly. Let 'http://repo.com/svn' be an svn repository, protected with basic authentication. Trying to clone it directly does something like: 1- Open it like a mercurial repository: * send between command, ask for credentials, fail * fallback to static-http, ask for crendentials two times, fail 2- Open it like an svn repository Mercurial [auth] facility is helpful here, but few people know about it, and it may seem weird to store svn credentials in mercurial configuration. An svn-like password manager would not help either because all connections attempts in [1] fail and it's unlikely we would store credentials in this situation. Instead, we can clone 'svn+http://repo.com/svn', which will skip step [1]. diff --git a/hgsubversion/__init__.py b/hgsubversion/__init__.py --- a/hgsubversion/__init__.py +++ b/hgsubversion/__init__.py @@ -146,7 +146,8 @@ def _lookup(url): # install scheme handlers hg.schemes.update({ 'file': _lookup, 'http': svnrepo, 'https': svnrepo, - 'svn': svnrepo, 'svn+ssh': svnrepo }) + 'svn': svnrepo, 'svn+ssh': svnrepo, 'svn+http': svnrepo, + 'svn+https': svnrepo}) cmdtable = { "svn": diff --git a/hgsubversion/util.py b/hgsubversion/util.py --- a/hgsubversion/util.py +++ b/hgsubversion/util.py @@ -70,8 +70,10 @@ def version(ui): return node.hex(ver)[:12] -def normalize_url(svnurl): - url, revs, checkout = hg.parseurl(svnurl) +def normalize_url(url): + if url.startswith('svn+http://'): + url = url[4:] + url, revs, checkout = hg.parseurl(url) url = url.rstrip('/') if checkout: url = '%s#%s' % (url, checkout) diff --git a/tests/test_urls.py b/tests/test_urls.py --- a/tests/test_urls.py +++ b/tests/test_urls.py @@ -53,6 +53,9 @@ class TestSvnRepo(test_util.TestBase): repo = svnrepo.svnremoterepo(ui, 'svn+ssh://joe@foo/bar') self.assertEqual('svn+ssh://bob@foo/bar', repo.svnurl) + repo = svnrepo.svnremoterepo(ui, 'svn+http://joe@foo/bar') + self.assertEqual(('http://foo/bar', 'bob', None), repo.svnauth) + def suite(): all = [unittest.TestLoader().loadTestsFromTestCase(TestSubversionUrls)] return unittest.TestSuite(all)