--- a/hgext/convert/subversion.py Sun Jun 21 23:04:02 2009 +0200
+++ b/hgext/convert/subversion.py Sun Jun 21 23:17:02 2009 +0200
@@ -10,7 +10,7 @@
import tempfile
import urllib
-from mercurial import strutil, util
+from mercurial import strutil, util, encoding
from mercurial.i18n import _
# Subversion stuff. Works best with very recent Python SVN bindings
@@ -50,6 +50,9 @@
path = os.path.normpath(os.path.abspath(path))
if os.name == 'nt':
path = '/' + util.normpath(path)
+ # Module URL is later compared with the repository URL returned
+ # by svn API, which is UTF-8.
+ path = encoding.tolocal(path)
return 'file://%s' % urllib.quote(path)
return path
@@ -226,7 +229,7 @@
self.rootmodule = self.module
self.commits = {}
self.paths = {}
- self.uuid = svn.ra.get_uuid(self.ra).decode(self.encoding)
+ self.uuid = svn.ra.get_uuid(self.ra)
except SubversionException:
ui.traceback()
raise NoRepo("%s does not look like a Subversion repo" % self.url)
@@ -253,8 +256,8 @@
self.head = self.latest(self.module, latest)
if not self.head:
- raise util.Abort(_('no revision found in module %s') %
- self.module.encode(self.encoding))
+ raise util.Abort(_('no revision found in module %s')
+ % self.module)
self.last_changed = self.revnum(self.head)
self._changescache = None
@@ -314,8 +317,8 @@
self.module += '/' + trunk
self.head = self.latest(self.module, self.last_changed)
if not self.head:
- raise util.Abort(_('no revision found in module %s') %
- self.module.encode(self.encoding))
+ raise util.Abort(_('no revision found in module %s')
+ % self.module)
# First head in the list is the module's head
self.heads = [self.head]
@@ -333,8 +336,7 @@
continue
brevid = self.latest(module, self.last_changed)
if not brevid:
- self.ui.note(_('ignoring empty branch %s\n') %
- branch.encode(self.encoding))
+ self.ui.note(_('ignoring empty branch %s\n') % branch)
continue
self.ui.note(_('found branch %s at %d\n') %
(branch, self.revnum(brevid)))
@@ -511,16 +513,13 @@
self.convertfp.flush()
def revid(self, revnum, module=None):
- if not module:
- module = self.module
- return u"svn:%s%s@%s" % (self.uuid, module.decode(self.encoding),
- revnum)
+ return 'svn:%s%s@%s' % (self.uuid, module or self.module, revnum)
def revnum(self, rev):
return int(rev.split('@')[-1])
def revsplit(self, rev):
- url, revnum = rev.encode(self.encoding).rsplit('@', 1)
+ url, revnum = rev.rsplit('@', 1)
revnum = int(revnum)
parts = url.split('/', 1)
uuid = parts.pop(0)[4:]
@@ -786,7 +785,7 @@
desc=log,
parents=parents,
branch=branch,
- rev=rev.encode('utf-8'))
+ rev=rev)
self.commits[rev] = cset
# The parents list is *shared* among self.paths and the
--- a/tests/svn/encoding.svndump Sun Jun 21 23:04:02 2009 +0200
+++ b/tests/svn/encoding.svndump Sun Jun 21 23:17:02 2009 +0200
@@ -1,6 +1,6 @@
SVN-fs-dump-format-version: 2
-UUID: 64cf20ed-79ff-4f10-8aaf-041d1993b42e
+UUID: 7ec0009b-ac71-43a6-9416-7fc295ee5ca1
Revision-number: 0
Prop-content-length: 56
@@ -9,7 +9,7 @@
K 8
svn:date
V 27
-2009-06-21T10:05:28.031033Z
+2009-06-21T15:50:22.535630Z
PROPS-END
Revision-number: 1
@@ -27,7 +27,7 @@
K 8
svn:date
V 27
-2009-06-21T10:05:28.108227Z
+2009-06-21T15:50:22.584588Z
PROPS-END
Node-path: branches
@@ -72,7 +72,7 @@
K 8
svn:date
V 27
-2009-06-21T10:05:29.109026Z
+2009-06-21T15:50:23.143007Z
PROPS-END
Node-path: trunk/à
@@ -125,7 +125,7 @@
K 8
svn:date
V 27
-2009-06-21T10:05:32.061964Z
+2009-06-21T15:50:26.088415Z
PROPS-END
Node-path: trunk/è
@@ -167,7 +167,7 @@
K 8
svn:date
V 27
-2009-06-21T10:05:33.096353Z
+2009-06-21T15:50:27.162784Z
PROPS-END
Node-path: trunk/è
@@ -178,3 +178,53 @@
Node-action: delete
+Revision-number: 5
+Prop-content-length: 120
+Content-length: 120
+
+K 7
+svn:log
+V 18
+branch to branché
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T15:50:30.079728Z
+PROPS-END
+
+Node-path: branches/branché
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 4
+Node-copyfrom-path: trunk
+
+
+Revision-number: 6
+Prop-content-length: 121
+Content-length: 121
+
+K 7
+svn:log
+V 19
+branch to branchée
+K 10
+svn:author
+V 7
+pmezard
+K 8
+svn:date
+V 27
+2009-06-21T15:50:33.072456Z
+PROPS-END
+
+Node-path: branches/branchée
+Node-kind: dir
+Node-action: add
+Node-copyfrom-rev: 5
+Node-copyfrom-path: branches/branché
+
+
--- a/tests/svn/svndump-encoding.sh Sun Jun 21 23:04:02 2009 +0200
+++ b/tests/svn/svndump-encoding.sh Sun Jun 21 23:17:02 2009 +0200
@@ -35,6 +35,16 @@
svn rm trunk/è
svn rm trunk/ù
svn ci -m 'remove files'
+
+# Create branches with and from weird names
+svn up
+svn cp trunk branches/branché
+echo a > branches/branché/a
+svn ci -m 'branch to branché'
+svn up
+svn cp branches/branché branches/branchée
+echo a >> branches/branché/a
+svn ci -m 'branch to branchée'
cd ..
svnadmin dump svn-repo > ../encoding.svndump