From 294e9041b7d23d35bec15c7b83760ea705cf4395 Mon Sep 17 00:00:00 2001 From: Takeshi KOMIYA Date: Wed, 22 Aug 2018 22:36:48 +0900 Subject: [PATCH] Fix #5327: "document isn't included in any toctree" warning on rebuild with generated files --- CHANGES | 4 ++++ sphinx/environment/__init__.py | 16 ++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/CHANGES b/CHANGES index f0ca4f51f..1e7e92493 100644 --- a/CHANGES +++ b/CHANGES @@ -7,6 +7,8 @@ Dependencies Incompatible changes -------------------- +* The type of ``env.included`` has been changed to dict of set + Deprecated ---------- @@ -19,6 +21,8 @@ Bugs fixed * #5320: intersphinx: crashed if invalid url given * #5326: manpage: crashed when invalid docname is specified as ``man_pages`` * #5322: autodoc: ``Any`` typehint causes formatting error +* #5327: "document isn't included in any toctree" warning on rebuild with + generated files Testing -------- diff --git a/sphinx/environment/__init__.py b/sphinx/environment/__init__.py index db5a229dc..2a48e5b4e 100644 --- a/sphinx/environment/__init__.py +++ b/sphinx/environment/__init__.py @@ -22,7 +22,7 @@ from os import path from docutils.frontend import OptionParser from docutils.utils import Reporter, get_source_line from six import BytesIO, itervalues, class_types, next -from six.moves import cPickle as pickle +from six.moves import cPickle as pickle, reduce from sphinx import addnodes, versioning from sphinx.deprecation import RemovedInSphinx20Warning @@ -200,7 +200,8 @@ class BuildEnvironment(object): self.dependencies = defaultdict(set) # type: Dict[unicode, Set[unicode]] # docname -> set of dependent file # names, relative to documentation root - self.included = set() # type: Set[unicode] + self.included = defaultdict(set) # type: Dict[unicode, Set[unicode]] + # docname -> set of included file # docnames included from other documents self.reread_always = set() # type: Set[unicode] # docnames to re-read unconditionally on @@ -309,8 +310,8 @@ class BuildEnvironment(object): """Remove all traces of a source file in the inventory.""" if docname in self.all_docs: self.all_docs.pop(docname, None) + self.included.pop(docname, None) self.reread_always.discard(docname) - self.included.discard(docname) for version, changes in self.versionchanges.items(): new = [change for change in changes if change[1] != docname] @@ -329,12 +330,10 @@ class BuildEnvironment(object): docnames = set(docnames) # type: ignore for docname in docnames: self.all_docs[docname] = other.all_docs[docname] + self.included[docname] = other.included[docname] if docname in other.reread_always: self.reread_always.add(docname) - for docname in other.included: - self.included.add(docname) - for version, changes in other.versionchanges.items(): self.versionchanges.setdefault(version, []).extend( change for change in changes if change[1] in docnames) @@ -724,7 +723,7 @@ class BuildEnvironment(object): *filename* should be absolute or relative to the source directory. """ - self.included.add(self.path2doc(filename)) + self.included[self.docname].add(self.path2doc(filename)) def note_reread(self): # type: () -> None @@ -915,12 +914,13 @@ class BuildEnvironment(object): def check_consistency(self): # type: () -> None """Do consistency checks.""" + included = reduce(lambda x, y: x | y, self.included.values(), set()) # type: Set[unicode] # NOQA for docname in sorted(self.all_docs): if docname not in self.files_to_rebuild: if docname == self.config.master_doc: # the master file is not included anywhere ;) continue - if docname in self.included: + if docname in included: # the document is included from other documents continue if 'orphan' in self.metadata[docname]: