utils: avoid using internal _imp.is_frozen()
imp has been deprecated for a long time, and were removed in Python 3.12 . As a
workaround, we started using the internal _imp. That is ugly and risky.
It seems less risky to get the functionality in some other way. Here, we just
inspect if 'origin' of the '__main__' module is set and 'frozen'. That seems to
work and do the same, and might be better than using the internal _imp
directly.
This way of inspecting module attributes seems to work in some test cases, but
it is a risky change. This level of importlib doesn't have much documentation,
a complicated implementation, and we are dealing with some odd use cases.
--- a/mercurial/utils/resourceutil.py Thu Jan 11 20:32:07 2024 +0100
+++ b/mercurial/utils/resourceutil.py Tue Jun 27 13:05:03 2023 +0200
@@ -8,7 +8,6 @@
# GNU General Public License version 2 or any later version.
-import _imp
import os
import sys
@@ -24,7 +23,12 @@
return (
hasattr(sys, "frozen") # new py2exe
or hasattr(sys, "importers") # old py2exe
- or _imp.is_frozen("__main__") # tools/freeze
+ or getattr(
+ getattr(sys.modules.get('__main__'), '__spec__', None),
+ 'origin',
+ None,
+ )
+ == 'frozen' # tools/freeze
)
@@ -44,7 +48,6 @@
assert dirs[0] == b"mercurial"
return os.path.join(_rootpath, *dirs[1:])
-
else:
datapath = os.path.dirname(os.path.dirname(pycompat.fsencode(__file__)))
_rootpath = os.path.dirname(datapath)
@@ -90,7 +93,6 @@
for p in os.listdir(path):
yield pycompat.fsencode(p)
-
else:
from .. import encoding