Copy stat as well as files for static content.

This commit is contained in:
Georg Brandl 2009-04-28 20:59:11 +02:00
parent 82af37ea7c
commit 8011b358c8
3 changed files with 31 additions and 26 deletions

View File

@ -11,7 +11,6 @@
import os
import codecs
import shutil
import posixpath
import cPickle as pickle
from os import path
@ -30,7 +29,7 @@ from docutils.readers.doctree import Reader as DoctreeReader
from sphinx import package_dir, __version__
from sphinx.util import SEP, os_path, relative_uri, ensuredir, \
movefile, ustrftime, copy_static_entry
movefile, ustrftime, copy_static_entry, copyfile
from sphinx.errors import SphinxError
from sphinx.search import js_index
from sphinx.theming import Theme
@ -495,8 +494,8 @@ class StandaloneHTMLBuilder(Builder):
ensuredir(path.join(self.outdir, '_images'))
for src, dest in self.images.iteritems():
self.info(' '+src, nonl=1)
shutil.copyfile(path.join(self.srcdir, src),
path.join(self.outdir, '_images', dest))
copyfile(path.join(self.srcdir, src),
path.join(self.outdir, '_images', dest))
self.info()
# copy downloadable files
@ -505,8 +504,8 @@ class StandaloneHTMLBuilder(Builder):
ensuredir(path.join(self.outdir, '_downloads'))
for src, (_, dest) in self.env.dlfiles.iteritems():
self.info(' '+src, nonl=1)
shutil.copyfile(path.join(self.srcdir, src),
path.join(self.outdir, '_downloads', dest))
copyfile(path.join(self.srcdir, src),
path.join(self.outdir, '_downloads', dest))
self.info()
# copy static files
@ -521,8 +520,8 @@ class StandaloneHTMLBuilder(Builder):
jsfile = path.join(package_dir, 'locale', self.config.language,
'LC_MESSAGES', 'sphinx.js')
if path.isfile(jsfile):
shutil.copyfile(jsfile, path.join(self.outdir, '_static',
'translations.js'))
copyfile(jsfile, path.join(self.outdir, '_static',
'translations.js'))
# then, copy over all user-supplied static files
if self.theme:
staticdirnames = [path.join(themepath, 'static')
@ -545,8 +544,8 @@ class StandaloneHTMLBuilder(Builder):
# last, copy logo file (handled differently)
if self.config.html_logo:
logobase = path.basename(self.config.html_logo)
shutil.copyfile(path.join(self.confdir, self.config.html_logo),
path.join(self.outdir, '_static', logobase))
copyfile(path.join(self.confdir, self.config.html_logo),
path.join(self.outdir, '_static', logobase))
# write build info file
fp = open(path.join(self.outdir, '.buildinfo'), 'w')
@ -663,7 +662,7 @@ class StandaloneHTMLBuilder(Builder):
source_name = path.join(self.outdir, '_sources',
os_path(ctx['sourcename']))
ensuredir(path.dirname(source_name))
shutil.copyfile(self.env.doc2path(pagename), source_name)
copyfile(self.env.doc2path(pagename), source_name)
def handle_finish(self):
self.info(bold('dumping search index... '), nonl=True)
@ -778,7 +777,7 @@ class SerializingHTMLBuilder(StandaloneHTMLBuilder):
source_name = path.join(self.outdir, '_sources',
os_path(ctx['sourcename']))
ensuredir(path.dirname(source_name))
shutil.copyfile(self.env.doc2path(pagename), source_name)
copyfile(self.env.doc2path(pagename), source_name)
def handle_finish(self):
# dump the global context
@ -794,8 +793,8 @@ class SerializingHTMLBuilder(StandaloneHTMLBuilder):
# copy the environment file from the doctree dir to the output dir
# as needed by the web app
shutil.copyfile(path.join(self.doctreedir, ENV_PICKLE_FILENAME),
path.join(self.outdir, ENV_PICKLE_FILENAME))
copyfile(path.join(self.doctreedir, ENV_PICKLE_FILENAME),
path.join(self.outdir, ENV_PICKLE_FILENAME))
# touch 'last build' file, used by the web application to determine
# when to reload its environment and clear the cache

View File

@ -10,7 +10,6 @@
"""
import os
import shutil
from os import path
from docutils import nodes
@ -19,7 +18,7 @@ from docutils.utils import new_document
from docutils.frontend import OptionParser
from sphinx import package_dir, addnodes
from sphinx.util import SEP, texescape
from sphinx.util import SEP, texescape, copyfile
from sphinx.builders import Builder
from sphinx.environment import NoUri
from sphinx.util.console import bold, darkgreen
@ -175,8 +174,8 @@ class LaTeXBuilder(Builder):
self.info(bold('copying images...'), nonl=1)
for src, dest in self.images.iteritems():
self.info(' '+src, nonl=1)
shutil.copyfile(path.join(self.srcdir, src),
path.join(self.outdir, dest))
copyfile(path.join(self.srcdir, src),
path.join(self.outdir, dest))
self.info()
# copy additional files
@ -184,20 +183,20 @@ class LaTeXBuilder(Builder):
self.info(bold('copying additional files...'), nonl=1)
for filename in self.config.latex_additional_files:
self.info(' '+filename, nonl=1)
shutil.copyfile(path.join(self.confdir, filename),
path.join(self.outdir, path.basename(filename)))
copyfile(path.join(self.confdir, filename),
path.join(self.outdir, path.basename(filename)))
self.info()
# the logo is handled differently
if self.config.latex_logo:
logobase = path.basename(self.config.latex_logo)
shutil.copyfile(path.join(self.confdir, self.config.latex_logo),
path.join(self.outdir, logobase))
copyfile(path.join(self.confdir, self.config.latex_logo),
path.join(self.outdir, logobase))
self.info(bold('copying TeX support files... '), nonl=True)
staticdirname = path.join(package_dir, 'texinputs')
for filename in os.listdir(staticdirname):
if not filename.startswith('.'):
shutil.copyfile(path.join(staticdirname, filename),
path.join(self.outdir, filename))
copyfile(path.join(staticdirname, filename),
path.join(self.outdir, filename))
self.info('done')

View File

@ -384,7 +384,7 @@ def force_decode(string, encoding):
def movefile(source, dest):
# move a file, removing the destination if it exists
"""Move a file, removing the destination if it exists."""
if os.path.exists(dest):
try:
os.unlink(dest)
@ -393,6 +393,13 @@ def movefile(source, dest):
os.rename(source, dest)
def copyfile(source, dest):
"""Copy a file and its modification times, if possible."""
shutil.copyfile(source, dest)
try: shutil.copystat(source, dest)
except shutil.Error: pass
def copy_static_entry(source, target, builder, context={}):
if path.isfile(source):
if source.lower().endswith('_t'):
@ -403,7 +410,7 @@ def copy_static_entry(source, target, builder, context={}):
fsrc.close()
fdst.close()
else:
shutil.copyfile(source, target)
copyfile(source, target)
elif path.isdir(source):
if source in builder.config.exclude_dirnames:
return