Mercurial > hgsubversion
changeset 469:5567af673f83
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].
author | Patrick Mezard <pmezard@gmail.com> |
---|---|
date | Sat, 18 Jul 2009 20:44:33 -0500 |
parents | 037bba1c6736 |
children | 6bfaa9deb432 |
files | hgsubversion/__init__.py hgsubversion/util.py tests/test_urls.py |
diffstat | 3 files changed, 9 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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":
--- 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)
--- 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)