# HG changeset patch # User Matt Harbison # Date 1606506877 18000 # Node ID 3db545fccac1382261e2b9d7b6b2cec8fb9b047e # Parent 464539c305aac7aaf9501d825ab1643076b623d3 extensions: avoid a crash when the version isn't properly byteified on py3 We already force bytestr on the `testedwith` and `buglink` attributes in dispatch.py when generating a bug report with a similar comment about not every extension being ported to py3. We should do the same here, so the function can be properly typed. Differential Revision: https://phab.mercurial-scm.org/D9433 diff -r 464539c305aa -r 3db545fccac1 mercurial/extensions.py --- a/mercurial/extensions.py Fri Nov 27 19:35:37 2020 -0500 +++ b/mercurial/extensions.py Fri Nov 27 14:54:37 2020 -0500 @@ -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 -r 464539c305aa -r 3db545fccac1 tests/test-extension.t --- a/tests/test-extension.t Fri Nov 27 19:35:37 2020 -0500 +++ b/tests/test-extension.t Fri Nov 27 14:54:37 2020 -0500 @@ -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