Skip to content

Commit a5d8e3d

Browse files
authoredAug 18, 2019
Merge pull request #6419 from larsoner/config
ENH: Explain rebuilds
2 parents 4e12d4b + c0e46ad commit a5d8e3d

File tree

3 files changed

+37
-11
lines changed

3 files changed

+37
-11
lines changed
 

‎sphinx/builders/__init__.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -388,9 +388,11 @@ def read(self) -> List[str]:
388388
# ... but not those that already were removed
389389
changed.update(self.env.glob_toctrees & self.env.found_docs)
390390

391-
if changed:
392-
reason = CONFIG_CHANGED_REASON.get(self.env.config_status, '')
391+
if updated: # explain the change iff build config status was not ok
392+
reason = (CONFIG_CHANGED_REASON.get(self.env.config_status, '') +
393+
(self.env.config_status_extra or ''))
393394
logger.info('[%s] ', reason, nonl=True)
395+
394396
logger.info(__('%s added, %s changed, %s removed'),
395397
len(added), len(changed), len(removed))
396398

‎sphinx/environment/__init__.py

+18-8
Original file line numberDiff line numberDiff line change
@@ -95,14 +95,15 @@ class BuildEnvironment:
9595
# --------- ENVIRONMENT INITIALIZATION -------------------------------------
9696

9797
def __init__(self, app: "Sphinx" = None):
98-
self.app = None # type: Sphinx
99-
self.doctreedir = None # type: str
100-
self.srcdir = None # type: str
101-
self.config = None # type: Config
102-
self.config_status = None # type: int
103-
self.events = None # type: EventManager
104-
self.project = None # type: Project
105-
self.version = None # type: Dict[str, str]
98+
self.app = None # type: Sphinx
99+
self.doctreedir = None # type: str
100+
self.srcdir = None # type: str
101+
self.config = None # type: Config
102+
self.config_status = None # type: int
103+
self.config_status_extra = None # type: str
104+
self.events = None # type: EventManager
105+
self.project = None # type: Project
106+
self.version = None # type: Dict[str, str]
106107

107108
# the method of doctree versioning; see set_versioning_method
108109
self.versioning_condition = None # type: Union[bool, Callable]
@@ -232,16 +233,25 @@ def setup(self, app: "Sphinx") -> None:
232233
def _update_config(self, config: Config) -> None:
233234
"""Update configurations by new one."""
234235
self.config_status = CONFIG_OK
236+
self.config_status_extra = ''
235237
if self.config is None:
236238
self.config_status = CONFIG_NEW
237239
elif self.config.extensions != config.extensions:
238240
self.config_status = CONFIG_EXTENSIONS_CHANGED
241+
extensions = sorted(
242+
set(self.config.extensions) ^ set(config.extensions))
243+
if len(extensions) == 1:
244+
extension = extensions[0]
245+
else:
246+
extension = '%d' % (len(extensions),)
247+
self.config_status_extra = ' (%r)' % (extension,)
239248
else:
240249
# check if a config value was changed that affects how
241250
# doctrees are read
242251
for item in config.filter('env'):
243252
if self.config[item.name] != item.value:
244253
self.config_status = CONFIG_CHANGED
254+
self.config_status_extra = ' (%r)' % (item.name,)
245255
break
246256

247257
self.config = config

‎tests/test_environment.py

+15-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
:copyright: Copyright 2007-2019 by the Sphinx team, see AUTHORS.
88
:license: BSD, see LICENSE for details.
99
"""
10+
import os
11+
import shutil
1012
import pytest
1113

1214
from sphinx.builders.html import StandaloneHTMLBuilder
@@ -23,18 +25,30 @@ def test_config_status(make_app, app_params):
2325
app1 = make_app(*args, freshenv=True, **kwargs)
2426
assert app1.env.config_status == CONFIG_NEW
2527
app1.build()
28+
assert '[new config] 1 added' in app1._status.getvalue()
2629

2730
# incremental build (no config changed)
2831
app2 = make_app(*args, **kwargs)
2932
assert app2.env.config_status == CONFIG_OK
33+
app2.build()
34+
assert "0 added, 0 changed, 0 removed" in app2._status.getvalue()
3035

3136
# incremental build (config entry changed)
32-
app3 = make_app(*args, confoverrides={'master_doc': 'content'}, **kwargs)
37+
app3 = make_app(*args, confoverrides={'master_doc': 'indexx'}, **kwargs)
38+
fname = os.path.join(app3.srcdir, 'index.rst')
39+
assert os.path.isfile(fname)
40+
shutil.move(fname, fname[:-4] + 'x.rst')
3341
assert app3.env.config_status == CONFIG_CHANGED
42+
app3.build()
43+
shutil.move(fname[:-4] + 'x.rst', fname)
44+
assert "[config changed ('master_doc')] 1 added" in app3._status.getvalue()
3445

3546
# incremental build (extension changed)
3647
app4 = make_app(*args, confoverrides={'extensions': ['sphinx.ext.autodoc']}, **kwargs)
3748
assert app4.env.config_status == CONFIG_EXTENSIONS_CHANGED
49+
app4.build()
50+
want_str = "[extensions changed ('sphinx.ext.autodoc')] 1 added"
51+
assert want_str in app4._status.getvalue()
3852

3953

4054
@pytest.mark.sphinx('dummy')

0 commit comments

Comments
 (0)
Please sign in to comment.