extensions: make `hg nonexistent` not crash with PyOxidizer
authorMartin von Zweigbergk <martinvonz@google.com>
Tue, 14 Jul 2020 11:28:06 -0700
changeset 45105 5d09a120b4be
parent 45104 eb26a9cf7821
child 45106 a03c177a4679
extensions: make `hg nonexistent` not crash with PyOxidizer When running `hg nonexistent`, we try to look for extensions that provide that command. We do that by looking for files in the `hgext.__file__` directory. However, PyOxidizer doesn't provide a `__file__`, so we crash when running with PyOxidizer. We should be able to look for the command in built-in extensions, but we seem to already have code for skipping the scan when running in a frozen binary, so I just modified that code instead. By the way, it also seems like we should be able to search for extensions in the `hgext3rd` module, but we don't do that yet either (before or after this patch). Differential Revision: https://phab.mercurial-scm.org/D8750
mercurial/extensions.py
--- a/mercurial/extensions.py	Thu Jul 09 12:52:04 2020 +0200
+++ b/mercurial/extensions.py	Tue Jul 14 11:28:06 2020 -0700
@@ -706,12 +706,17 @@
     '''find paths of disabled extensions. returns a dict of {name: path}'''
     import hgext
 
-    extpath = os.path.dirname(
-        os.path.abspath(pycompat.fsencode(hgext.__file__))
-    )
-    try:  # might not be a filesystem path
-        files = os.listdir(extpath)
-    except OSError:
+    # The hgext might not have a __file__ attribute (e.g. in PyOxidizer) and
+    # it might not be on a filesystem even if it does.
+    if util.safehasattr(hgext, '__file__'):
+        extpath = os.path.dirname(
+            os.path.abspath(pycompat.fsencode(hgext.__file__))
+        )
+        try:
+            files = os.listdir(extpath)
+        except OSError:
+            return {}
+    else:
         return {}
 
     exts = {}