Mercurial > public > mercurial-scm > hg
annotate mercurial/utils/resourceutil.py @ 48674:f7086f6173f8 stable
dirstate-v2: rename the configuration to enable the format
The rename of the old experimental name was overlooked before the 6.0 release.
We rename everything to use the new name (and keep the released name as an alias
for compatibility).
Differential Revision: https://phab.mercurial-scm.org/D12129
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 01 Feb 2022 16:36:20 +0100 |
parents | c0588d389c5f |
children | 6000f5b25c9b |
rev | line source |
---|---|
43671
664e24207728
procutil: move mainfrozen() to new resourceutil.py
Martin von Zweigbergk <martinvonz@google.com>
parents:
43657
diff
changeset
|
1 # resourceutil.py - utility for looking up resources |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
2 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
3 # Copyright 2005 K. Thananchayan <thananck@yahoo.com> |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Rapha?l Gom?s <rgomes@octobus.net>
parents:
46783
diff
changeset
|
4 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com> |
8226
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
5 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com> |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
6 # |
8b2cd04a6e97
put license and copyright info into comment blocks
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
7 # This software may be used and distributed according to the terms of the |
10263 | 8 # GNU General Public License version 2 or any later version. |
1082 | 9 |
37118
5be286db5fb5
procutil: move process/executable management functions to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37117
diff
changeset
|
10 from __future__ import absolute_import |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
11 |
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
12 import imp |
43672
9fb85668ee15
util: move definition of datapath to resourceutil
Martin von Zweigbergk <martinvonz@google.com>
parents:
43671
diff
changeset
|
13 import os |
27358
ac839ee45b6a
util: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
27357
diff
changeset
|
14 import sys |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
15 |
43671
664e24207728
procutil: move mainfrozen() to new resourceutil.py
Martin von Zweigbergk <martinvonz@google.com>
parents:
43657
diff
changeset
|
16 from .. import pycompat |
1293
a6ffcebd3315
Enhance the file filtering capabilities.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1292
diff
changeset
|
17 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
18 |
14228
116de1da2154
rename util.main_is_frozen to mainfrozen
Adrian Buehlmann <adrian@cadifra.com>
parents:
14167
diff
changeset
|
19 def mainfrozen(): |
6499
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
20 """return True if we are a frozen executable. |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
21 |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
22 The code supports py2exe (most common, Windows only) and tools/freeze |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
23 (portable, not much used). |
479847ccabe0
Added hgexecutable support for py2exe/frozen scripts
"Paul Moore <p.f.moore@gmail.com>"
parents:
5659
diff
changeset
|
24 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43019
diff
changeset
|
25 return ( |
44924
6c8384afbf77
resourceutil: fix location of line comments
Manuel Jacob <me@manueljacob.de>
parents:
44241
diff
changeset
|
26 pycompat.safehasattr(sys, "frozen") # new py2exe |
6c8384afbf77
resourceutil: fix location of line comments
Manuel Jacob <me@manueljacob.de>
parents:
44241
diff
changeset
|
27 or pycompat.safehasattr(sys, "importers") # old py2exe |
6c8384afbf77
resourceutil: fix location of line comments
Manuel Jacob <me@manueljacob.de>
parents:
44241
diff
changeset
|
28 or imp.is_frozen("__main__") # tools/freeze |
6c8384afbf77
resourceutil: fix location of line comments
Manuel Jacob <me@manueljacob.de>
parents:
44241
diff
changeset
|
29 ) |
43672
9fb85668ee15
util: move definition of datapath to resourceutil
Martin von Zweigbergk <martinvonz@google.com>
parents:
43671
diff
changeset
|
30 |
9fb85668ee15
util: move definition of datapath to resourceutil
Martin von Zweigbergk <martinvonz@google.com>
parents:
43671
diff
changeset
|
31 |
9fb85668ee15
util: move definition of datapath to resourceutil
Martin von Zweigbergk <martinvonz@google.com>
parents:
43671
diff
changeset
|
32 # the location of data files matching the source code |
44241 | 33 if mainfrozen() and getattr(sys, "frozen", None) != "macosx_app": |
43672
9fb85668ee15
util: move definition of datapath to resourceutil
Martin von Zweigbergk <martinvonz@google.com>
parents:
43671
diff
changeset
|
34 # executable version (py2exe) doesn't support __file__ |
9fb85668ee15
util: move definition of datapath to resourceutil
Martin von Zweigbergk <martinvonz@google.com>
parents:
43671
diff
changeset
|
35 datapath = os.path.dirname(pycompat.sysexecutable) |
44208
9e367157a990
resourceutil: correct the root path for file based lookup under py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
44152
diff
changeset
|
36 _rootpath = datapath |
44219
aab70b540d3d
resourceutil: account for the non-resource-like file hierarchy under py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
44208
diff
changeset
|
37 |
aab70b540d3d
resourceutil: account for the non-resource-like file hierarchy under py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
44208
diff
changeset
|
38 # The installers store the files outside of library.zip, like |
aab70b540d3d
resourceutil: account for the non-resource-like file hierarchy under py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
44208
diff
changeset
|
39 # C:\Program Files\Mercurial\defaultrc\*.rc. This strips the |
aab70b540d3d
resourceutil: account for the non-resource-like file hierarchy under py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
44208
diff
changeset
|
40 # leading "mercurial." off of the package name, so that these |
aab70b540d3d
resourceutil: account for the non-resource-like file hierarchy under py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
44208
diff
changeset
|
41 # pseudo resources are found in their directory next to the |
aab70b540d3d
resourceutil: account for the non-resource-like file hierarchy under py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
44208
diff
changeset
|
42 # executable. |
aab70b540d3d
resourceutil: account for the non-resource-like file hierarchy under py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
44208
diff
changeset
|
43 def _package_path(package): |
44241 | 44 dirs = package.split(b".") |
45 assert dirs[0] == b"mercurial" | |
44219
aab70b540d3d
resourceutil: account for the non-resource-like file hierarchy under py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
44208
diff
changeset
|
46 return os.path.join(_rootpath, *dirs[1:]) |
aab70b540d3d
resourceutil: account for the non-resource-like file hierarchy under py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
44208
diff
changeset
|
47 |
44241 | 48 |
43672
9fb85668ee15
util: move definition of datapath to resourceutil
Martin von Zweigbergk <martinvonz@google.com>
parents:
43671
diff
changeset
|
49 else: |
9fb85668ee15
util: move definition of datapath to resourceutil
Martin von Zweigbergk <martinvonz@google.com>
parents:
43671
diff
changeset
|
50 datapath = os.path.dirname(os.path.dirname(pycompat.fsencode(__file__))) |
44027
52f0140c2604
resourceutil: don't limit resources to the `mercurial` package
Matt Harbison <matt_harbison@yahoo.com>
parents:
43955
diff
changeset
|
51 _rootpath = os.path.dirname(datapath) |
43871
1390bb81163e
help: get helptext/ data from `resources` module if available
Martin von Zweigbergk <martinvonz@google.com>
parents:
43862
diff
changeset
|
52 |
44219
aab70b540d3d
resourceutil: account for the non-resource-like file hierarchy under py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
44208
diff
changeset
|
53 def _package_path(package): |
44241 | 54 return os.path.join(_rootpath, *package.split(b".")) |
55 | |
44219
aab70b540d3d
resourceutil: account for the non-resource-like file hierarchy under py2exe
Matt Harbison <matt_harbison@yahoo.com>
parents:
44208
diff
changeset
|
56 |
43871
1390bb81163e
help: get helptext/ data from `resources` module if available
Martin von Zweigbergk <martinvonz@google.com>
parents:
43862
diff
changeset
|
57 try: |
45452
dd9e28612468
resourceutil: document when we expect to take the importlib.resouces code path
Martin von Zweigbergk <martinvonz@google.com>
parents:
44924
diff
changeset
|
58 # importlib.resources exists from Python 3.7; see fallback in except clause |
dd9e28612468
resourceutil: document when we expect to take the importlib.resouces code path
Martin von Zweigbergk <martinvonz@google.com>
parents:
44924
diff
changeset
|
59 # further down |
48008
c0588d389c5f
typing: suppress an import-error warning in `mercurial/utils/resourceutil.py`
Matt Harbison <matt_harbison@yahoo.com>
parents:
47860
diff
changeset
|
60 from importlib import resources # pytype: disable=import-error |
43871
1390bb81163e
help: get helptext/ data from `resources` module if available
Martin von Zweigbergk <martinvonz@google.com>
parents:
43862
diff
changeset
|
61 |
1390bb81163e
help: get helptext/ data from `resources` module if available
Martin von Zweigbergk <martinvonz@google.com>
parents:
43862
diff
changeset
|
62 # Force loading of the resources module |
43955
75ec46c63657
resourceutil: use `from importlib import resources`
Martin von Zweigbergk <martinvonz@google.com>
parents:
43905
diff
changeset
|
63 resources.open_binary # pytype: disable=module-attr |
43871
1390bb81163e
help: get helptext/ data from `resources` module if available
Martin von Zweigbergk <martinvonz@google.com>
parents:
43862
diff
changeset
|
64 |
43955
75ec46c63657
resourceutil: use `from importlib import resources`
Martin von Zweigbergk <martinvonz@google.com>
parents:
43905
diff
changeset
|
65 except (ImportError, AttributeError): |
45452
dd9e28612468
resourceutil: document when we expect to take the importlib.resouces code path
Martin von Zweigbergk <martinvonz@google.com>
parents:
44924
diff
changeset
|
66 # importlib.resources was not found (almost definitely because we're on a |
dd9e28612468
resourceutil: document when we expect to take the importlib.resouces code path
Martin von Zweigbergk <martinvonz@google.com>
parents:
44924
diff
changeset
|
67 # Python version before 3.7) |
43871
1390bb81163e
help: get helptext/ data from `resources` module if available
Martin von Zweigbergk <martinvonz@google.com>
parents:
43862
diff
changeset
|
68 |
1390bb81163e
help: get helptext/ data from `resources` module if available
Martin von Zweigbergk <martinvonz@google.com>
parents:
43862
diff
changeset
|
69 def open_resource(package, name): |
1390bb81163e
help: get helptext/ data from `resources` module if available
Martin von Zweigbergk <martinvonz@google.com>
parents:
43862
diff
changeset
|
70 path = os.path.join(_package_path(package), name) |
44241 | 71 return open(path, "rb") |
44028
42a897bf678c
resourceutil: implement `is_resource()`
Matt Harbison <matt_harbison@yahoo.com>
parents:
44027
diff
changeset
|
72 |
42a897bf678c
resourceutil: implement `is_resource()`
Matt Harbison <matt_harbison@yahoo.com>
parents:
44027
diff
changeset
|
73 def is_resource(package, name): |
42a897bf678c
resourceutil: implement `is_resource()`
Matt Harbison <matt_harbison@yahoo.com>
parents:
44027
diff
changeset
|
74 path = os.path.join(_package_path(package), name) |
42a897bf678c
resourceutil: implement `is_resource()`
Matt Harbison <matt_harbison@yahoo.com>
parents:
44027
diff
changeset
|
75 |
42a897bf678c
resourceutil: implement `is_resource()`
Matt Harbison <matt_harbison@yahoo.com>
parents:
44027
diff
changeset
|
76 try: |
42a897bf678c
resourceutil: implement `is_resource()`
Matt Harbison <matt_harbison@yahoo.com>
parents:
44027
diff
changeset
|
77 return os.path.isfile(pycompat.fsdecode(path)) |
42a897bf678c
resourceutil: implement `is_resource()`
Matt Harbison <matt_harbison@yahoo.com>
parents:
44027
diff
changeset
|
78 except (IOError, OSError): |
42a897bf678c
resourceutil: implement `is_resource()`
Matt Harbison <matt_harbison@yahoo.com>
parents:
44027
diff
changeset
|
79 return False |
44029
bba9149adc14
resourceutil: implement `contents()` to iterate over resources in a package
Matt Harbison <matt_harbison@yahoo.com>
parents:
44028
diff
changeset
|
80 |
bba9149adc14
resourceutil: implement `contents()` to iterate over resources in a package
Matt Harbison <matt_harbison@yahoo.com>
parents:
44028
diff
changeset
|
81 def contents(package): |
bba9149adc14
resourceutil: implement `contents()` to iterate over resources in a package
Matt Harbison <matt_harbison@yahoo.com>
parents:
44028
diff
changeset
|
82 path = pycompat.fsdecode(_package_path(package)) |
bba9149adc14
resourceutil: implement `contents()` to iterate over resources in a package
Matt Harbison <matt_harbison@yahoo.com>
parents:
44028
diff
changeset
|
83 |
bba9149adc14
resourceutil: implement `contents()` to iterate over resources in a package
Matt Harbison <matt_harbison@yahoo.com>
parents:
44028
diff
changeset
|
84 for p in os.listdir(path): |
bba9149adc14
resourceutil: implement `contents()` to iterate over resources in a package
Matt Harbison <matt_harbison@yahoo.com>
parents:
44028
diff
changeset
|
85 yield pycompat.fsencode(p) |
47860
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
86 |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
87 |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
88 else: |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
89 from .. import encoding |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
90 |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
91 def open_resource(package, name): |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
92 return resources.open_binary( # pytype: disable=module-attr |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
93 pycompat.sysstr(package), pycompat.sysstr(name) |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
94 ) |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
95 |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
96 def is_resource(package, name): |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
97 return resources.is_resource( # pytype: disable=module-attr |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
98 pycompat.sysstr(package), encoding.strfromlocal(name) |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
99 ) |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
100 |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
101 def contents(package): |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
102 # pytype: disable=module-attr |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
103 for r in resources.contents(pycompat.sysstr(package)): |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
104 # pytype: enable=module-attr |
08f16b3331df
resources: narrow the try:except clause to minimum
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47858
diff
changeset
|
105 yield encoding.strtolocal(r) |