D9433: extensions: avoid a crash when the version isn't properly byteified on py3

mharbison72 (Matt Harbison) phabricator at mercurial-scm.org
Sat Nov 28 04:49:02 UTC 2020


mharbison72 created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  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.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D9433

AFFECTED FILES
  mercurial/extensions.py
  tests/test-extension.t

CHANGE DETAILS

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
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
 
 



To: mharbison72, #hg-reviewers
Cc: mercurial-patches, mercurial-devel


More information about the Mercurial-devel mailing list