Skip to content

Commit bf93529

Browse files
committed
Declare sphinxext.redirect_from parallel_read_safe
1 parent ff3a0e4 commit bf93529

File tree

1 file changed

+27
-5
lines changed

1 file changed

+27
-5
lines changed

doc/sphinxext/redirect_from.py

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -48,33 +48,55 @@
4848
def setup(app):
4949
RedirectFrom.app = app
5050
app.add_directive("redirect-from", RedirectFrom)
51+
app.connect("env-before-read-docs", _setup_redirects)
52+
app.connect("env-merge-info", _merge_redirects)
53+
app.connect("env-purge-doc", _purge_redirects)
5154
app.connect("build-finished", _generate_redirects)
5255

56+
metadata = {'parallel_read_safe': True}
57+
return metadata
58+
5359

5460
class RedirectFrom(Directive):
5561
required_arguments = 1
56-
redirects = {}
5762

5863
def run(self):
5964
redirected_doc, = self.arguments
6065
env = self.app.env
6166
builder = self.app.builder
6267
current_doc = env.path2doc(self.state.document.current_source)
6368
redirected_reldoc, _ = env.relfn2path(redirected_doc, current_doc)
64-
if redirected_reldoc in self.redirects:
69+
if redirected_reldoc in env._redirects:
6570
raise ValueError(
6671
f"{redirected_reldoc} is already noted as redirecting to "
67-
f"{self.redirects[redirected_reldoc]}")
68-
self.redirects[redirected_reldoc] = builder.get_relative_uri(
72+
f"{env._redirects[redirected_reldoc]}")
73+
env._redirects[redirected_reldoc] = builder.get_relative_uri(
6974
redirected_reldoc, current_doc)
7075
return []
7176

7277

78+
def _setup_redirects(app, env, docnames):
79+
if not hasattr(env, "_redirects"):
80+
env._redirects = {}
81+
82+
83+
def _merge_redirects(app, env, docnames, other):
84+
for src, dst in other._redirects.items():
85+
if src not in env._redirects:
86+
env._redirects[src] = dst
87+
elif env._redirects[src] != dst:
88+
raise ValueError(f"{src} is already noted as redirecting to {dst}")
89+
90+
91+
def _purge_redirects(app, env, docname):
92+
env._redirects.clear()
93+
94+
7395
def _generate_redirects(app, exception):
7496
builder = app.builder
7597
if builder.name != "html" or exception:
7698
return
77-
for k, v in RedirectFrom.redirects.items():
99+
for k, v in app.env._redirects.items():
78100
p = Path(app.outdir, k + builder.out_suffix)
79101
if p.is_file():
80102
logger.warning(f'A redirect-from directive is trying to create '

0 commit comments

Comments
 (0)