diff --git a/hgext/convert/subversion.py b/hgext/convert/subversion.py --- a/hgext/convert/subversion.py +++ b/hgext/convert/subversion.py @@ -65,10 +65,10 @@ except ImportError: svn = None -# In Subversion, paths are Unicode (encoded as UTF-8), which Subversion -# converts from / to native strings when interfacing with the OS. When passing -# paths to Subversion, we have to recode them such that it roundstrips with -# what Subversion is doing. +# In Subversion, paths and URLs are Unicode (encoded as UTF-8), which +# Subversion converts from / to native strings when interfacing with the OS. +# When passing paths and URLs to Subversion, we have to recode them such that +# it roundstrips with what Subversion is doing. fsencoding = None @@ -141,7 +141,9 @@ def quote(s): def geturl(path): try: - return svn.client.url_from_path(svn.core.svn_path_canonicalize(path)) + return svn.client.url_from_path( + svn.core.svn_path_canonicalize(fs2svn(path)) + ) except svn.core.SubversionException: # svn.client.url_from_path() fails with local repositories pass @@ -358,6 +360,19 @@ def issvnurl(ui, url): and path[2:6].lower() == b'%3a/' ): path = path[:2] + b':/' + path[6:] + try: + path.decode(fsencoding) + except UnicodeDecodeError: + ui.warn( + _( + b'Subversion requires that file URLs can be converted ' + b'to Unicode using the current locale encoding (%s)\n' + ) + % pycompat.sysbytes(fsencoding) + ) + return False + # FIXME: The following reasoning and logic is wrong and will be + # fixed in a following changeset. # pycompat.fsdecode() / pycompat.fsencode() are used so that bytes # in the URL roundtrip correctly on Unix. urlreq.url2pathname() on # py3 will decode percent-encoded bytes using the utf-8 encoding diff --git a/tests/test-convert-svn-encoding.t b/tests/test-convert-svn-encoding.t --- a/tests/test-convert-svn-encoding.t +++ b/tests/test-convert-svn-encoding.t @@ -182,6 +182,20 @@ tests) don't work. cannot find required "p4" tool abort: \xff: missing or unsupported repository (glob) (esc) [255] + $ hg convert file://$TESTTMP/$XFF test + initializing destination test repository + Subversion requires that file URLs can be converted to Unicode using the current locale encoding (ascii) + file:/*/$TESTTMP/\xff does not look like a CVS checkout (glob) (esc) + $TESTTMP/file:$TESTTMP/\xff does not look like a Git repository (esc) + file:/*/$TESTTMP/\xff does not look like a Subversion repository (glob) (esc) + file:/*/$TESTTMP/\xff is not a local Mercurial repository (glob) (esc) + file:/*/$TESTTMP/\xff does not look like a darcs repository (glob) (esc) + file:/*/$TESTTMP/\xff does not look like a monotone repository (glob) (esc) + file:/*/$TESTTMP/\xff does not look like a GNU Arch repository (glob) (esc) + file:/*/$TESTTMP/\xff does not look like a Bazaar repository (glob) (esc) + file:/*/$TESTTMP/\xff does not look like a P4 repository (glob) (esc) + abort: file:/*/$TESTTMP/\xff: missing or unsupported repository (glob) (esc) + [255] #if py3 For now, on Python 3, we abort when encountering non-UTF-8 percent-encoded