add support to driver for --builddir logic

create the --builddir before building
if --publish, swap the built directory with the output directory
then --remove the old content
This commit is contained in:
Martin A. Brown 2016-03-07 18:52:13 -08:00
parent b2a8ac28d2
commit 87e1161212
1 changed files with 54 additions and 18 deletions

View File

@ -5,6 +5,7 @@ from __future__ import absolute_import, division, print_function
import os
import sys
import shutil
import logging
import inspect
from argparse import Namespace
@ -14,7 +15,7 @@ from tldp.sources import SourceDocument, arg_issourcedoc
from tldp.outputs import OutputDirectory
from tldp.inventory import Inventory, status_classes, status_types, stypes
from tldp.config import collectconfiguration
from tldp.utils import arg_isloglevel, arg_isdirectory
from tldp.utils import arg_isloglevel, arg_isdirectory, swapdirs
from tldp.doctypes.common import preamble, postamble
logformat = '%(levelname)-9s %(name)s %(filename)s#%(lineno)s ' \
@ -22,6 +23,13 @@ logformat = '%(levelname)-9s %(name)s %(filename)s#%(lineno)s ' \
logging.basicConfig(stream=sys.stderr, format=logformat, level=logging.ERROR)
logger = logging.getLogger(__name__)
# -- short names
#
opa = os.path.abspath
opb = os.path.basename
opd = os.path.dirname
opj = os.path.join
# -- error message prefixes
#
ERR_NEEDPUBDIR = "Option --pubdir (and --sourcedir) required "
@ -126,20 +134,29 @@ def detail(config, docs, **kwargs):
return os.EX_OK
def createBuildDirectory(d):
if not arg_isdirectory(d):
logger.debug("Creating build directory %s.", d)
try:
os.mkdir(d)
except OSError as e:
logger.critical("Could not make --builddir %s.", d)
return False, e.errno
return True, d
def builddir_setup(config):
'''create --builddir; ensure it shares a filesystem with --pubdir'''
if not config.builddir:
builddir = os.path.dirname(os.path.abspath(config.pubdir))
builddir = os.path.join(builddir, 'ldp-builddir')
if not arg_isdirectory(builddir):
logger.debug("Creating build directory %s.", builddir)
try:
os.mkdir(builddir)
except OSError as e:
logger.critical("Could not make --builddir %s.", builddir)
return False, e.errno
builddir = opj(opd(opa(config.pubdir)), 'ldptool-build')
ready, error = createBuildDirectory(builddir)
if not ready:
return ready, error
config.builddir = builddir
if not sameFilesystem(config.pubdir, config.builddir):
return False, "--pubdir and --builddir must be on the same filesystem"
return True, None
@ -165,12 +182,21 @@ def removeUnknownDoctypes(docs):
return sources
def runbuild(config, docs, **kwargs):
def docbuild(config, docs, **kwargs):
result = list()
for x, source in enumerate(docs, 1):
source.output = OutputDirectory.fromsource(config.pubdir, source)
output = source.output
runner = source.doctype(source=source, output=output, config=config)
classname = source.doctype.__name__
docbuilddir = opj(config.builddir, classname)
ready, error = createBuildDirectory(docbuilddir)
if not ready:
text = "%s (%d of %d) failed creating builddir; bailing." % (
source.stem, x, len(docs))
return text
source.working = OutputDirectory.fromsource(docbuilddir, source)
working = source.working
if not source.output:
source.output = OutputDirectory.fromsource(config.pubdir, source)
runner = source.doctype(source=source, output=working, config=config)
logger.info("%s (%d of %d) initiating build",
source.stem, x, len(docs))
result.append(runner.generate())
@ -188,22 +214,32 @@ def build(config, docs, **kwargs):
ready, error = builddir_setup(config)
if not ready:
return error
return runbuild(config, docs, **kwargs)
return docbuild(config, docs, **kwargs)
def script(config, docs, **kwargs):
file = kwargs.get('file', sys.stdout)
print(preamble, file=file)
result = runbuild(config, docs, **kwargs)
result = docbuild(config, docs, **kwargs)
print(postamble, file=file)
return result
def publish(config, docs, **kwargs):
config.build = True
result = runbuild(config, docs, **kwargs)
result = build(config, docs, **kwargs)
if result != os.EX_OK:
return result
return "Aborting all publication: " + result
for x, source in enumerate(docs, 1):
logger.info("%s (%d of %d) publishing outputs",
source.stem, x, len(docs))
# -- swapdirs must raise an error if there are problems
#
swapdirs(source.working.dirname, source.output.dirname)
if os.path.isdir(source.working.dirname):
logger.info("%s removing old directory",
source.stem, source.working.dirname)
shutil.rmtree(source.working.dirname)
return os.EX_OK