@@ -143,16 +143,6 @@ def current_dev(self) -> Version:
143143"""Find the current CPython version in development."""
144144return max (self ,key = Version .as_tuple )
145145
146- def setup_indexsidebar (self ,current :Version ,dest_path :Path )-> None :
147- """Build indexsidebar.html for Sphinx."""
148- template_path = HERE / "templates" / "indexsidebar.html"
149- template = jinja2 .Template (template_path .read_text (encoding = "UTF-8" ))
150- rendered_template = template .render (
151- current_version = current ,
152- versions = list (reversed (self )),
153- )
154- dest_path .write_text (rendered_template ,encoding = "UTF-8" )
155-
156146
157147@dataclasses .dataclass (frozen = True ,kw_only = True ,slots = True )
158148class Version :
@@ -529,9 +519,9 @@ class DocBuilder:
529519"""Builder for a CPython version and a language."""
530520
531521version :Version
532- versions :Versions
533522language :Language
534523cpython_repo :Repository
524+ docs_by_version_content :bytes
535525switchers_content :bytes
536526build_root :Path
537527www_root :Path
@@ -667,10 +657,7 @@ def build(self) -> None:
667657text = text .replace (" -A switchers=1" ,"" )
668658 (self .checkout / "Doc" / "Makefile" ).write_text (text ,encoding = "utf-8" )
669659
670- self .versions .setup_indexsidebar (
671- self .version ,
672- self .checkout / "Doc" / "tools" / "templates" / "indexsidebar.html" ,
673- )
660+ self .setup_indexsidebar ()
674661run_with_logging ([
675662"make" ,
676663"-C" ,
@@ -713,6 +700,18 @@ def build_venv(self) -> None:
713700run ([venv_path / "bin" / "python" ,"-m" ,"pip" ,"freeze" ,"--all" ])
714701self .venv = venv_path
715702
703+ def setup_indexsidebar (self )-> None :
704+ """Copy indexsidebar.html for Sphinx."""
705+ tmpl_src = HERE / "templates"
706+ tmpl_dst = self .checkout / "Doc" / "tools" / "templates"
707+ dbv_path = tmpl_dst / "_docs_by_version.html"
708+
709+ shutil .copy (tmpl_src / "indexsidebar.html" ,tmpl_dst / "indexsidebar.html" )
710+ if self .version .status != "EOL" :
711+ dbv_path .write_bytes (self .docs_by_version_content )
712+ else :
713+ shutil .copy (tmpl_src / "_docs_by_version.html" ,dbv_path )
714+
716715def copy_build_to_webroot (self ,http :urllib3 .PoolManager )-> None :
717716"""Copy a given build to the appropriate webroot with appropriate rights."""
718717logging .info ("Publishing start." )
@@ -1099,6 +1098,7 @@ def build_docs(args: argparse.Namespace) -> int:
10991098force_build = args .force
11001099del args .force
11011100
1101+ docs_by_version_content = render_docs_by_version (versions ).encode ()
11021102switchers_content = render_switchers (versions ,languages )
11031103
11041104build_succeeded = set ()
@@ -1118,12 +1118,12 @@ def build_docs(args: argparse.Namespace) -> int:
11181118scope = sentry_sdk .get_isolation_scope ()
11191119scope .set_tag ("version" ,version .name )
11201120scope .set_tag ("language" ,language .tag )
1121- cpython_repo .update ()
1121+ cpython_repo .update ()
11221122builder = DocBuilder (
11231123version ,
1124- versions ,
11251124language ,
11261125cpython_repo ,
1126+ docs_by_version_content ,
11271127switchers_content ,
11281128** vars (args ),
11291129 )
@@ -1179,6 +1179,12 @@ def parse_languages_from_config() -> Languages:
11791179return Languages .from_json (config ["defaults" ],config ["languages" ])
11801180
11811181
1182+ def render_docs_by_version (versions :Versions )-> str :
1183+ """Generate content for _docs_by_version.html."""
1184+ links = [f'<li><a href="{ v .url } ">{ v .title } </a></li>' for v in reversed (versions )]
1185+ return "\n " .join (links )
1186+
1187+
11821188def render_switchers (versions :Versions ,languages :Languages )-> bytes :
11831189language_pairs = sorted ((l .tag ,l .switcher_label )for l in languages if l .in_prod )# NoQA: E741
11841190version_pairs = [(v .name ,v .picker_label )for v in reversed (versions )]