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)