mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Fix #4362: latex: Don't overwrite .tex file if document not changed
This commit is contained in:
parent
2855721d0b
commit
28fe6dadf4
1
CHANGES
1
CHANGES
@ -137,6 +137,7 @@ Features added
|
|||||||
* html: Output ``canonical_url`` metadata if :confval:`html_baseurl` set (refs:
|
* html: Output ``canonical_url`` metadata if :confval:`html_baseurl` set (refs:
|
||||||
#4193)
|
#4193)
|
||||||
* #5029: autosummary: expose ``inherited_members`` to template
|
* #5029: autosummary: expose ``inherited_members`` to template
|
||||||
|
* #4362: latex: Don't overwrite .tex file if document not changed
|
||||||
|
|
||||||
Bugs fixed
|
Bugs fixed
|
||||||
----------
|
----------
|
||||||
|
@ -13,7 +13,6 @@ import os
|
|||||||
from os import path
|
from os import path
|
||||||
|
|
||||||
from docutils.frontend import OptionParser
|
from docutils.frontend import OptionParser
|
||||||
from docutils.io import FileOutput
|
|
||||||
from six import text_type
|
from six import text_type
|
||||||
|
|
||||||
from sphinx import package_dir, addnodes, highlighting
|
from sphinx import package_dir, addnodes, highlighting
|
||||||
@ -31,7 +30,7 @@ from sphinx.locale import _, __
|
|||||||
from sphinx.transforms import SphinxTransformer
|
from sphinx.transforms import SphinxTransformer
|
||||||
from sphinx.util import texescape, logging, status_iterator
|
from sphinx.util import texescape, logging, status_iterator
|
||||||
from sphinx.util.console import bold, darkgreen # type: ignore
|
from sphinx.util.console import bold, darkgreen # type: ignore
|
||||||
from sphinx.util.docutils import new_document
|
from sphinx.util.docutils import SphinxFileOutput, new_document
|
||||||
from sphinx.util.fileutil import copy_asset_file
|
from sphinx.util.fileutil import copy_asset_file
|
||||||
from sphinx.util.nodes import inline_all_toctrees
|
from sphinx.util.nodes import inline_all_toctrees
|
||||||
from sphinx.util.osutil import SEP, make_filename
|
from sphinx.util.osutil import SEP, make_filename
|
||||||
@ -134,9 +133,8 @@ class LaTeXBuilder(Builder):
|
|||||||
toctree_only = False
|
toctree_only = False
|
||||||
if len(entry) > 5:
|
if len(entry) > 5:
|
||||||
toctree_only = entry[5]
|
toctree_only = entry[5]
|
||||||
destination = FileOutput(
|
destination = SphinxFileOutput(destination_path=path.join(self.outdir, targetname),
|
||||||
destination_path=path.join(self.outdir, targetname),
|
encoding='utf-8', overwrite_if_changed=True)
|
||||||
encoding='utf-8')
|
|
||||||
logger.info(__("processing %s..."), targetname, nonl=1)
|
logger.info(__("processing %s..."), targetname, nonl=1)
|
||||||
toctrees = self.env.get_doctree(docname).traverse(addnodes.toctree)
|
toctrees = self.env.get_doctree(docname).traverse(addnodes.toctree)
|
||||||
if toctrees:
|
if toctrees:
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
"""
|
"""
|
||||||
from __future__ import absolute_import
|
from __future__ import absolute_import
|
||||||
|
|
||||||
|
import codecs
|
||||||
import os
|
import os
|
||||||
import re
|
import re
|
||||||
import types
|
import types
|
||||||
@ -21,6 +22,7 @@ from os import path
|
|||||||
|
|
||||||
import docutils
|
import docutils
|
||||||
from docutils import nodes
|
from docutils import nodes
|
||||||
|
from docutils.io import FileOutput
|
||||||
from docutils.parsers.rst import Directive, directives, roles, convert_directive_function
|
from docutils.parsers.rst import Directive, directives, roles, convert_directive_function
|
||||||
from docutils.statemachine import StateMachine
|
from docutils.statemachine import StateMachine
|
||||||
from docutils.utils import Reporter
|
from docutils.utils import Reporter
|
||||||
@ -300,6 +302,26 @@ def switch_source_input(state, content):
|
|||||||
state.memo.reporter.get_source_and_line = get_source_and_line
|
state.memo.reporter.get_source_and_line = get_source_and_line
|
||||||
|
|
||||||
|
|
||||||
|
class SphinxFileOutput(FileOutput):
|
||||||
|
"""Better FileOutput class for Sphinx."""
|
||||||
|
|
||||||
|
def __init__(self, **kwargs):
|
||||||
|
# type: (Any) -> None
|
||||||
|
self.overwrite_if_changed = kwargs.pop('overwrite_if_changed', False)
|
||||||
|
FileOutput.__init__(self, **kwargs)
|
||||||
|
|
||||||
|
def write(self, data):
|
||||||
|
# type: (unicode) -> unicode
|
||||||
|
if (self.destination_path and self.autoclose and 'b' not in self.mode and
|
||||||
|
self.overwrite_if_changed and os.path.exists(self.destination_path)):
|
||||||
|
with codecs.open(self.destination_path, encoding=self.encoding) as f:
|
||||||
|
# skip writing: content not changed
|
||||||
|
if f.read() == data:
|
||||||
|
return data
|
||||||
|
|
||||||
|
return FileOutput.write(self, data)
|
||||||
|
|
||||||
|
|
||||||
class SphinxDirective(Directive):
|
class SphinxDirective(Directive):
|
||||||
"""A base class for Sphinx directives.
|
"""A base class for Sphinx directives.
|
||||||
|
|
||||||
|
@ -9,9 +9,11 @@
|
|||||||
:license: BSD, see LICENSE for details.
|
:license: BSD, see LICENSE for details.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
from docutils import nodes
|
from docutils import nodes
|
||||||
|
|
||||||
from sphinx.util.docutils import docutils_namespace, register_node
|
from sphinx.util.docutils import SphinxFileOutput, docutils_namespace, register_node
|
||||||
|
|
||||||
|
|
||||||
def test_register_node():
|
def test_register_node():
|
||||||
@ -32,3 +34,31 @@ def test_register_node():
|
|||||||
assert not hasattr(nodes.GenericNodeVisitor, 'depart_custom_node')
|
assert not hasattr(nodes.GenericNodeVisitor, 'depart_custom_node')
|
||||||
assert not hasattr(nodes.SparseNodeVisitor, 'visit_custom_node')
|
assert not hasattr(nodes.SparseNodeVisitor, 'visit_custom_node')
|
||||||
assert not hasattr(nodes.SparseNodeVisitor, 'depart_custom_node')
|
assert not hasattr(nodes.SparseNodeVisitor, 'depart_custom_node')
|
||||||
|
|
||||||
|
|
||||||
|
def test_SphinxFileOutput(tmpdir):
|
||||||
|
content = 'Hello Sphinx World'
|
||||||
|
|
||||||
|
# write test.txt at first
|
||||||
|
filename = str(tmpdir / 'test.txt')
|
||||||
|
output = SphinxFileOutput(destination_path=filename)
|
||||||
|
output.write(content)
|
||||||
|
os.utime(filename, (0, 0))
|
||||||
|
|
||||||
|
# overrite it again
|
||||||
|
output.write(content)
|
||||||
|
assert os.stat(filename).st_mtime != 0 # updated
|
||||||
|
|
||||||
|
# write test2.txt at first
|
||||||
|
filename = str(tmpdir / 'test2.txt')
|
||||||
|
output = SphinxFileOutput(destination_path=filename, overwrite_if_changed=True)
|
||||||
|
output.write(content)
|
||||||
|
os.utime(filename, (0, 0))
|
||||||
|
|
||||||
|
# overrite it again
|
||||||
|
output.write(content)
|
||||||
|
assert os.stat(filename).st_mtime == 0 # not updated
|
||||||
|
|
||||||
|
# overrite it again (content changed)
|
||||||
|
output.write(content + "; content change")
|
||||||
|
assert os.stat(filename).st_mtime != 0 # updated
|
||||||
|
Loading…
Reference in New Issue
Block a user