Handle versioning in the environment

This commit is contained in:
Daniel Neuhäuser
2011-01-08 00:06:02 +01:00
parent 5c39cfb6e9
commit 071546601e
4 changed files with 23 additions and 88 deletions

View File

@@ -17,7 +17,6 @@ from collections import defaultdict
from docutils import nodes from docutils import nodes
from sphinx.builders import Builder from sphinx.builders import Builder
from sphinx.builders.versioning import VersioningBuilderMixin
from sphinx.util.nodes import extract_messages from sphinx.util.nodes import extract_messages
from sphinx.util.osutil import SEP, copyfile from sphinx.util.osutil import SEP, copyfile
from sphinx.util.console import darkgreen from sphinx.util.console import darkgreen
@@ -44,7 +43,7 @@ msgstr ""
"""[1:] """[1:]
class I18nBuilder(Builder, VersioningBuilderMixin): class I18nBuilder(Builder):
""" """
General i18n builder. General i18n builder.
""" """
@@ -52,7 +51,6 @@ class I18nBuilder(Builder, VersioningBuilderMixin):
def init(self): def init(self):
Builder.init(self) Builder.init(self)
VersioningBuilderMixin.init(self)
self.catalogs = defaultdict(dict) self.catalogs = defaultdict(dict)
def get_target_uri(self, docname, typ=None): def get_target_uri(self, docname, typ=None):
@@ -67,15 +65,9 @@ class I18nBuilder(Builder, VersioningBuilderMixin):
def write_doc(self, docname, doctree): def write_doc(self, docname, doctree):
catalog = self.catalogs[docname.split(SEP, 1)[0]] catalog = self.catalogs[docname.split(SEP, 1)[0]]
self.handle_versioning(docname, doctree, nodes.TextElement)
for node, msg in extract_messages(doctree): for node, msg in extract_messages(doctree):
catalog.setdefault(node.uid, msg) catalog.setdefault(node.uid, msg)
def finish(self):
Builder.finish(self)
VersioningBuilderMixin.finish(self)
class MessageCatalogBuilder(I18nBuilder): class MessageCatalogBuilder(I18nBuilder):
""" """

View File

@@ -1,72 +0,0 @@
# -*- coding: utf-8 -*-
"""
sphinx.builders.versioning
~~~~~~~~~~~~~~~~~~~~~~~~~~
:copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS.
:license: BSD, see LICENSE for details.
"""
import os
import cPickle as pickle
from docutils.utils import Reporter
from sphinx.util.osutil import copyfile
from sphinx.environment import WarningStream
from sphinx.versioning import add_uids, merge_doctrees
class VersioningBuilderMixin(object):
def walk_doctree_files(self):
for root, dirs, files in os.walk(self.doctreedir):
for fn in files:
yield os.path.join(root, fn)
def init(self):
for fp in self.walk_doctree_files():
if fp.endswith('.doctree'):
copyfile(fp, fp + '.old')
def get_old_doctree(self, docname):
fp = self.env.doc2path(docname, self.doctreedir, '.doctree.old')
try:
f = open(fp, 'rb')
try:
doctree = pickle.load(f)
finally:
f.close()
except IOError:
return None
doctree.settings.env = self.env
doctree.reporter = Reporter(self.env.doc2path(docname), 2, 5,
stream=WarningStream(self.env._warnfunc))
return doctree
def resave_doctree(self, docname, doctree):
reporter = doctree.reporter
doctree.reporter = None
doctree.settings.warning_stream = None
doctree.settings.env = None
doctree.settings.record_dependencies = None
fp = self.env.doc2path(docname, self.doctreedir, '.doctree')
f = open(fp, 'wb')
try:
pickle.dump(doctree, f, pickle.HIGHEST_PROTOCOL)
finally:
f.close()
doctree.reporter = reporter
def handle_versioning(self, docname, doctree, condition):
old_doctree = self.get_old_doctree(docname)
if old_doctree:
list(merge_doctrees(old_doctree, doctree, condition))
else:
list(add_uids(doctree, condition))
self.resave_doctree(docname, doctree)
def finish(self):
for fp in self.walk_doctree_files():
if fp.endswith('.doctree.old'):
os.remove(fp)

View File

@@ -17,13 +17,11 @@ from docutils.io import StringOutput
from sphinx.jinja2glue import BuiltinTemplateLoader from sphinx.jinja2glue import BuiltinTemplateLoader
from sphinx.util.osutil import os_path, relative_uri, ensuredir, copyfile from sphinx.util.osutil import os_path, relative_uri, ensuredir, copyfile
from sphinx.util.websupport import is_commentable
from sphinx.builders.html import PickleHTMLBuilder from sphinx.builders.html import PickleHTMLBuilder
from sphinx.builders.versioning import VersioningBuilderMixin
from sphinx.writers.websupport import WebSupportTranslator from sphinx.writers.websupport import WebSupportTranslator
class WebSupportBuilder(PickleHTMLBuilder, VersioningBuilderMixin): class WebSupportBuilder(PickleHTMLBuilder):
""" """
Builds documents for the web support package. Builds documents for the web support package.
""" """
@@ -31,7 +29,6 @@ class WebSupportBuilder(PickleHTMLBuilder, VersioningBuilderMixin):
def init(self): def init(self):
PickleHTMLBuilder.init(self) PickleHTMLBuilder.init(self)
VersioningBuilderMixin.init(self)
# templates are needed for this builder, but the serializing # templates are needed for this builder, but the serializing
# builder does not initialize them # builder does not initialize them
self.init_templates() self.init_templates()
@@ -58,8 +55,6 @@ class WebSupportBuilder(PickleHTMLBuilder, VersioningBuilderMixin):
destination = StringOutput(encoding='utf-8') destination = StringOutput(encoding='utf-8')
doctree.settings = self.docsettings doctree.settings = self.docsettings
self.handle_versioning(docname, doctree, is_commentable)
self.cur_docname = docname self.cur_docname = docname
self.secnumbers = self.env.toc_secnumbers.get(docname, {}) self.secnumbers = self.env.toc_secnumbers.get(docname, {})
self.imgpath = '/' + posixpath.join(self.virtual_staticdir, '_images') self.imgpath = '/' + posixpath.join(self.virtual_staticdir, '_images')
@@ -144,7 +139,6 @@ class WebSupportBuilder(PickleHTMLBuilder, VersioningBuilderMixin):
self.globalcontext['script'] = doc_ctx['script'] self.globalcontext['script'] = doc_ctx['script']
PickleHTMLBuilder.handle_finish(self) PickleHTMLBuilder.handle_finish(self)
VersioningBuilderMixin.finish(self)
# move static stuff over to separate directory # move static stuff over to separate directory
directories = ['_images', '_static'] directories = ['_images', '_static']

View File

@@ -45,6 +45,7 @@ from sphinx.util.matching import compile_matchers
from sphinx.util.pycompat import all, class_types from sphinx.util.pycompat import all, class_types
from sphinx.errors import SphinxError, ExtensionError from sphinx.errors import SphinxError, ExtensionError
from sphinx.locale import _, init as init_locale from sphinx.locale import _, init as init_locale
from sphinx.versioning import add_uids, merge_doctrees
fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding() fs_encoding = sys.getfilesystemencoding() or sys.getdefaultencoding()
@@ -753,6 +754,26 @@ class BuildEnvironment:
# store time of build, for outdated files detection # store time of build, for outdated files detection
self.all_docs[docname] = time.time() self.all_docs[docname] = time.time()
# get old doctree
old_doctree_path = self.doc2path(docname, self.doctreedir, '.doctree')
try:
f = open(old_doctree_path, 'rb')
try:
old_doctree = pickle.load(f)
finally:
f.close()
old_doctree.settings.env = self
old_doctree.reporter = Reporter(self.doc2path(docname), 2, 5,
stream=WarningStream(self._warnfunc))
except EnvironmentError:
old_doctree = None
# add uids for versioning
if old_doctree is None:
list(add_uids(doctree, nodes.TextElement))
else:
list(merge_doctrees(old_doctree, doctree, nodes.TextElement))
# make it picklable # make it picklable
doctree.reporter = None doctree.reporter = None
doctree.transformer = None doctree.transformer = None