diff --git a/doc/development/html_themes/index.rst b/doc/development/html_themes/index.rst
index 8724398a5..35a3b363a 100644
--- a/doc/development/html_themes/index.rst
+++ b/doc/development/html_themes/index.rst
@@ -373,13 +373,12 @@ example of code to accomplish this:
.. code-block:: python
- from os import path
- from sphinx.util.fileutil import copy_asset_file
+ import shutil
def copy_custom_files(app, exc):
if app.builder.format == 'html' and not exc:
- staticdir = path.join(app.builder.outdir, '_static')
- copy_asset_file('path/to/myextension/_static/myjsfile.js', staticdir)
+ static_dir = app.outdir / '_static'
+ shutil.copyfile('path/to/myextension/_static/myjsfile.js', static_dir)
def setup(app):
app.connect('build-finished', copy_custom_files)
diff --git a/sphinx/builders/_epub_base.py b/sphinx/builders/_epub_base.py
index d8d7c7564..8f862f6e6 100644
--- a/sphinx/builders/_epub_base.py
+++ b/sphinx/builders/_epub_base.py
@@ -412,8 +412,11 @@ class EpubBuilder(StandaloneHTMLBuilder):
logger.warning(__('cannot read image file %r: copying it instead'),
path.join(self.srcdir, src))
try:
- copyfile(path.join(self.srcdir, src),
- path.join(self.outdir, self.imagedir, dest))
+ copyfile(
+ self.srcdir / src,
+ self.outdir / self.imagedir / dest,
+ force=True,
+ )
except OSError as err:
logger.warning(__('cannot copy image file %r: %s'),
path.join(self.srcdir, src), err)
@@ -475,14 +478,14 @@ class EpubBuilder(StandaloneHTMLBuilder):
def build_mimetype(self) -> None:
"""Write the metainfo file mimetype."""
logger.info(__('writing mimetype file...'))
- copy_asset_file(path.join(self.template_dir, 'mimetype'), self.outdir)
+ copyfile(path.join(self.template_dir, 'mimetype'), self.outdir, force=True)
def build_container(self, outname: str = 'META-INF/container.xml') -> None:
"""Write the metainfo file META-INF/container.xml."""
logger.info(__('writing META-INF/container.xml file...'))
outdir = path.join(self.outdir, 'META-INF')
ensuredir(outdir)
- copy_asset_file(path.join(self.template_dir, 'container.xml'), outdir)
+ copyfile(path.join(self.template_dir, 'container.xml'), outdir, force=True)
def content_metadata(self) -> dict[str, Any]:
"""Create a dictionary with all metadata for the content.opf
@@ -625,7 +628,8 @@ class EpubBuilder(StandaloneHTMLBuilder):
copy_asset_file(
path.join(self.template_dir, 'content.opf.jinja'),
self.outdir,
- context=metadata
+ context=metadata,
+ force=True,
)
def new_navpoint(self, node: dict[str, Any], level: int, incr: bool = True) -> NavPoint:
@@ -709,8 +713,12 @@ class EpubBuilder(StandaloneHTMLBuilder):
navpoints = self.build_navpoints(refnodes)
level = max(item['level'] for item in self.refnodes)
level = min(level, self.config.epub_tocdepth)
- copy_asset_file(path.join(self.template_dir, 'toc.ncx.jinja'), self.outdir,
- context=self.toc_metadata(level, navpoints))
+ copy_asset_file(
+ path.join(self.template_dir, 'toc.ncx.jinja'),
+ self.outdir,
+ context=self.toc_metadata(level, navpoints),
+ force=True,
+ )
def build_epub(self) -> None:
"""Write the epub file.
diff --git a/sphinx/builders/changes.py b/sphinx/builders/changes.py
index 18515649e..c69683dea 100644
--- a/sphinx/builders/changes.py
+++ b/sphinx/builders/changes.py
@@ -14,7 +14,7 @@ from sphinx.theming import HTMLThemeFactory
from sphinx.util import logging
from sphinx.util.console import bold
from sphinx.util.fileutil import copy_asset_file
-from sphinx.util.osutil import ensuredir, os_path
+from sphinx.util.osutil import copyfile, ensuredir, os_path
if TYPE_CHECKING:
from sphinx.application import Sphinx
@@ -140,10 +140,18 @@ class ChangesBuilder(Builder):
f.write(self.templates.render('changes/rstsource.html', ctx))
themectx = {'theme_' + key: val for (key, val) in
self.theme.get_options({}).items()}
- copy_asset_file(path.join(package_dir, 'themes', 'default', 'static', 'default.css.jinja'), # NoQA: E501
- self.outdir, context=themectx, renderer=self.templates)
- copy_asset_file(path.join(package_dir, 'themes', 'basic', 'static', 'basic.css'),
- self.outdir)
+ copy_asset_file(
+ path.join(package_dir, 'themes', 'default', 'static', 'default.css.jinja'),
+ self.outdir,
+ context=themectx,
+ renderer=self.templates,
+ force=True,
+ )
+ copyfile(
+ path.join(package_dir, 'themes', 'basic', 'static', 'basic.css'),
+ self.outdir,
+ force=True,
+ )
def hl(self, text: str, version: str) -> str:
text = html.escape(text)
diff --git a/sphinx/builders/epub3.py b/sphinx/builders/epub3.py
index 94b5f884d..004821b6e 100644
--- a/sphinx/builders/epub3.py
+++ b/sphinx/builders/epub3.py
@@ -197,7 +197,8 @@ class Epub3Builder(_epub_base.EpubBuilder):
copy_asset_file(
path.join(self.template_dir, 'nav.xhtml.jinja'),
self.outdir,
- context=self.navigation_doc_metadata(navlist)
+ context=self.navigation_doc_metadata(navlist),
+ force=True,
)
# Add nav.xhtml to epub file
diff --git a/sphinx/builders/latex/__init__.py b/sphinx/builders/latex/__init__.py
index 5ba288621..15e3c1c45 100644
--- a/sphinx/builders/latex/__init__.py
+++ b/sphinx/builders/latex/__init__.py
@@ -26,7 +26,7 @@ from sphinx.util.docutils import SphinxFileOutput, new_document
from sphinx.util.fileutil import copy_asset_file
from sphinx.util.i18n import format_date
from sphinx.util.nodes import inline_all_toctrees
-from sphinx.util.osutil import SEP, make_filename_from_project
+from sphinx.util.osutil import SEP, copyfile, make_filename_from_project
from sphinx.util.template import LaTeXRenderer
from sphinx.writers.latex import LaTeXTranslator, LaTeXWriter
@@ -432,7 +432,7 @@ class LaTeXBuilder(Builder):
def copy_latex_additional_files(self) -> None:
for filename in self.config.latex_additional_files:
logger.info(' ' + filename, nonl=True)
- copy_asset_file(
+ copyfile(
self.confdir / filename,
self.outdir,
force=True,
@@ -446,7 +446,7 @@ class LaTeXBuilder(Builder):
stringify_func=stringify_func):
dest = self.images[src]
try:
- copy_asset_file(
+ copyfile(
self.srcdir / src,
self.outdir / dest,
force=True,
@@ -457,7 +457,7 @@ class LaTeXBuilder(Builder):
if self.config.latex_logo:
if not path.isfile(path.join(self.confdir, self.config.latex_logo)):
raise SphinxError(__('logo file %r does not exist') % self.config.latex_logo)
- copy_asset_file(
+ copyfile(
self.confdir / self.config.latex_logo,
self.outdir,
force=True,
diff --git a/sphinx/builders/texinfo.py b/sphinx/builders/texinfo.py
index ece5684fd..46dcb9ee5 100644
--- a/sphinx/builders/texinfo.py
+++ b/sphinx/builders/texinfo.py
@@ -20,9 +20,8 @@ from sphinx.util import logging
from sphinx.util.console import darkgreen
from sphinx.util.display import progress_message, status_iterator
from sphinx.util.docutils import new_document
-from sphinx.util.fileutil import copy_asset_file
from sphinx.util.nodes import inline_all_toctrees
-from sphinx.util.osutil import SEP, ensuredir, make_filename_from_project
+from sphinx.util.osutil import SEP, copyfile, ensuredir, make_filename_from_project
from sphinx.writers.texinfo import TexinfoTranslator, TexinfoWriter
if TYPE_CHECKING:
@@ -189,10 +188,13 @@ class TexinfoBuilder(Builder):
stringify_func=stringify_func):
dest = self.images[src]
try:
- imagedir = path.join(self.outdir, targetname + '-figures')
+ imagedir = self.outdir / f'{targetname}-figures'
ensuredir(imagedir)
- copy_asset_file(path.join(self.srcdir, src),
- path.join(imagedir, dest))
+ copyfile(
+ self.srcdir / src,
+ imagedir / dest,
+ force=True,
+ )
except Exception as err:
logger.warning(__('cannot copy image file %r: %s'),
path.join(self.srcdir, src), err)
@@ -201,7 +203,7 @@ class TexinfoBuilder(Builder):
try:
with progress_message(__('copying Texinfo support files')):
logger.info('Makefile ', nonl=True)
- copy_asset_file(os.path.join(template_dir, 'Makefile'), self.outdir)
+ copyfile(os.path.join(template_dir, 'Makefile'), self.outdir, force=True)
except OSError as err:
logger.warning(__("error writing file Makefile: %s"), err)