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

login
register
mail settings
Submitter phabricator
Date Nov. 28, 2020, 4:49 a.m.
Message ID <differential-rev-PHID-DREV-eef4qvgeapfoxcksarbe-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/47714/
State Superseded
Headers show

Comments

phabricator - Nov. 28, 2020, 4:49 a.m.
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




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

Patch

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