From d8208d406a0c470b34de79c4b054ba05f50ae34c Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Tue, 18 Jun 2019 00:17:15 +0900 Subject: [PATCH] Close #1464: html: warn html_static_path is inside outdir --- CHANGES | 2 ++ sphinx/builders/html.py | 12 ++++++++++-- tests/test_build_html.py | 27 +++++++++++++++++++++++++++ 3 files changed, 39 insertions(+), 2 deletions(-) diff --git a/CHANGES b/CHANGES index 6e38020e8..faa12bb10 100644 --- a/CHANGES +++ b/CHANGES @@ -25,6 +25,8 @@ Features added -------------- * #5124: graphviz: ``:graphviz_dot:`` option is renamed to ``:layout:`` +* #1464: html: emit a warning if :confval:`html_static_path` and + :confval:`html_extra_path` directories are inside output directory Bugs fixed ---------- diff --git a/sphinx/builders/html.py b/sphinx/builders/html.py index c8d330d2d..7c72ed785 100644 --- a/sphinx/builders/html.py +++ b/sphinx/builders/html.py @@ -1157,17 +1157,25 @@ def validate_math_renderer(app: Sphinx) -> None: def validate_html_extra_path(app: Sphinx, config: Config) -> None: """Check html_extra_paths setting.""" for entry in config.html_extra_path[:]: - if not path.exists(path.join(app.confdir, entry)): + extra_path = path.normpath(path.join(app.confdir, entry)) + if not path.exists(extra_path): logger.warning(__('html_extra_path entry %r does not exist'), entry) config.html_extra_path.remove(entry) + elif path.commonpath([app.outdir, extra_path]) == app.outdir: + logger.warning(__('html_extra_path entry %r is placed inside outdir'), entry) + config.html_extra_path.remove(entry) def validate_html_static_path(app: Sphinx, config: Config) -> None: """Check html_static_paths setting.""" for entry in config.html_static_path[:]: - if not path.exists(path.join(app.confdir, entry)): + static_path = path.normpath(path.join(app.confdir, entry)) + if not path.exists(static_path): logger.warning(__('html_static_path entry %r does not exist'), entry) config.html_static_path.remove(entry) + elif path.commonpath([app.outdir, static_path]) == app.outdir: + logger.warning(__('html_static_path entry %r is placed inside outdir'), entry) + config.html_static_path.remove(entry) def validate_html_logo(app: Sphinx, config: Config) -> None: diff --git a/tests/test_build_html.py b/tests/test_build_html.py index 677ca9de0..352166d94 100644 --- a/tests/test_build_html.py +++ b/tests/test_build_html.py @@ -16,6 +16,7 @@ from itertools import cycle, chain import pytest from html5lib import HTMLParser +from sphinx.builders.html import validate_html_extra_path, validate_html_static_path from sphinx.errors import ConfigError from sphinx.testing.util import strip_escseq from sphinx.util import docutils @@ -1496,3 +1497,29 @@ def test_html_pygments_style_manually(app): def test_html_pygments_for_classic_theme(app): style = app.builder.highlighter.formatter_args.get('style') assert style.__name__ == 'SphinxStyle' + + +@pytest.mark.sphinx(testroot='basic', srcdir='validate_html_extra_path') +def test_validate_html_extra_path(app): + (app.confdir / '_static').makedirs() + app.config.html_extra_path = [ + '/path/to/not_found', # not found + '_static', + app.outdir, # outdir + app.outdir / '_static', # inside outdir + ] + validate_html_extra_path(app, app.config) + assert app.config.html_extra_path == ['_static'] + + +@pytest.mark.sphinx(testroot='basic', srcdir='validate_html_static_path') +def test_validate_html_static_path(app): + (app.confdir / '_static').makedirs() + app.config.html_static_path = [ + '/path/to/not_found', # not found + '_static', + app.outdir, # outdir + app.outdir / '_static', # inside outdir + ] + validate_html_static_path(app, app.config) + assert app.config.html_static_path == ['_static']