# HG changeset patch # User Martin Geisler # Date 1305821365 -7200 # Node ID bd23d5f28bbb67c5c71c7109c00a0bc8a197b228 # Parent ab687820c4cc81d7551c08e2692820838cb2a984 changelog: convert user and desc from local encoding early Failing to do so makes it impossible to use the memctx API to create a changeset with a commit message or username outside of the current encoding.encoding setting. diff -r ab687820c4cc -r bd23d5f28bbb mercurial/changelog.py --- a/mercurial/changelog.py Wed May 18 15:13:26 2011 +0200 +++ b/mercurial/changelog.py Thu May 19 18:09:25 2011 +0200 @@ -199,6 +199,11 @@ def add(self, manifest, files, desc, transaction, p1, p2, user, date=None, extra=None): + # Convert to UTF-8 encoded bytestrings as the very first + # thing: calling any method on a localstr object will turn it + # into a str object and the cached UTF-8 string is thus lost. + user, desc = encoding.fromlocal(user), encoding.fromlocal(desc) + user = user.strip() # An empty username or a username with a "\n" will make the # revision text contain two "\n\n" sequences -> corrupt @@ -212,8 +217,6 @@ # strip trailing whitespace and leading and trailing empty lines desc = '\n'.join([l.rstrip() for l in desc.splitlines()]).strip('\n') - user, desc = encoding.fromlocal(user), encoding.fromlocal(desc) - if date: parseddate = "%d %d" % util.parsedate(date) else: diff -r ab687820c4cc -r bd23d5f28bbb tests/test-context.py --- a/tests/test-context.py Wed May 18 15:13:26 2011 +0200 +++ b/tests/test-context.py Thu May 19 18:09:25 2011 +0200 @@ -1,5 +1,5 @@ import os -from mercurial import hg, ui +from mercurial import hg, ui, context, encoding u = ui.ui() @@ -17,3 +17,16 @@ repo.commit(text='commit1', date="0 0") print "workingfilectx.date =", repo[None]['foo'].date() + +# test memctx with non-ASCII commit message + +def filectxfn(repo, memctx, path): + return context.memfilectx("foo", "") + +ctx = context.memctx(repo, ['tip', None], + encoding.tolocal("Gr\xc3\xbcezi!"), + ["foo"], filectxfn) +ctx.commit() +for enc in "ASCII", "Latin-1", "UTF-8": + encoding.encoding = enc + print "%-8s: %s" % (enc, repo["tip"].description()) diff -r ab687820c4cc -r bd23d5f28bbb tests/test-context.py.out --- a/tests/test-context.py.out Wed May 18 15:13:26 2011 +0200 +++ b/tests/test-context.py.out Thu May 19 18:09:25 2011 +0200 @@ -1,1 +1,4 @@ workingfilectx.date = (1000, 0) +ASCII : Gr?ezi! +Latin-1 : Grüezi! +UTF-8 : Grüezi!