diff --git a/mercurial/extensions.py b/mercurial/extensions.py --- a/mercurial/extensions.py +++ b/mercurial/extensions.py @@ -936,6 +936,10 @@ version = b'' if isinstance(version, (list, tuple)): version = b'.'.join(pycompat.bytestr(o) for o in version) + else: + # version data should be bytes, but not all extensions are ported + # to py3. + version = stringutil.forcebytestr(version) return version diff --git a/tests/test-extension.t b/tests/test-extension.t --- a/tests/test-extension.t +++ b/tests/test-extension.t @@ -1399,12 +1399,20 @@ > cmdtable = {} > command = registrar.command(cmdtable) > class Bogon(Exception): pass + > # NB: version should be bytes; simulating extension not ported to py3 + > __version__ = '1.0.0' > @command(b'throw', [], b'hg throw', norepo=True) > def throw(ui, **opts): > """throws an exception""" > raise Bogon() > EOF +Test extension without proper byteification of key attributes doesn't crash when +accessed. + + $ hg version -v --config extensions.throw=throw.py | grep '^ ' + throw external 1.0.0 + No declared supported version, extension complains: $ hg --config extensions.throw=throw.py throw 2>&1 | egrep '^\*\*' ** Unknown exception encountered with possibly-broken third-party extension throw