# HG changeset patch # User Matt Harbison # Date 2020-11-27 19:54:37 # Node ID 27c23c8f14da48a24a0896b588721c0139e92560 # Parent 07b0a687c01a07bbea7d2fe5a1d590be2685f1f2 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 --git a/mercurial/extensions.py b/mercurial/extensions.py --- a/mercurial/extensions.py +++ b/mercurial/extensions.py @@ -936,6 +936,10 @@ def moduleversion(module): 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 @@ Broken disabled extension and command: > 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