From 1df71e9b78fd516f9902f42db733f0b02808ad50 Mon Sep 17 00:00:00 2001
From: Adrian Kummerlaender
Date: Tue, 5 Jan 2016 21:17:42 +0100
Subject: Fix `generate` problem caused by _boost_ update
i.e. the directory tree was not correctly created in all circumstances which led to both the `generate` and `write-file` test cases failing. This was combined with some accumulated changes such as the extraction of process context instantiation.
---
ixslt.cc | 4 ++--
src/function/external_command.cc | 41 ++++++++++++++++++++--------------------
src/function/generate.cc | 2 +-
src/function/read_directory.cc | 6 +++---
src/function/read_file.cc | 12 ++++++------
src/function/write_file.cc | 4 +++-
6 files changed, 35 insertions(+), 34 deletions(-)
diff --git a/ixslt.cc b/ixslt.cc
index a085af2..a7926dc 100644
--- a/ixslt.cc
+++ b/ixslt.cc
@@ -19,7 +19,7 @@ namespace {
class WarningGuard {
public:
WarningGuard(InputXSLT::TransformerFacade* transformer):
- transformer_(transformer) { };
+ transformer_(transformer) { }
~WarningGuard() {
InputXSLT::WarningCapacitor::warning_cache_ptr warnings(
@@ -29,7 +29,7 @@ class WarningGuard {
for ( auto&& warning : *warnings ) {
std::cerr << warning << std::endl;
}
- };
+ }
private:
InputXSLT::TransformerFacade* const transformer_;
diff --git a/src/function/external_command.cc b/src/function/external_command.cc
index 606ff8f..dda403e 100644
--- a/src/function/external_command.cc
+++ b/src/function/external_command.cc
@@ -16,12 +16,6 @@ namespace {
using InputXSLT::XercesStringGuard;
-inline std::string wrapOutput(const std::string& rawOutput) {
- return std::string(
- "" + rawOutput + ""
- );
-}
-
inline bool isWrappedOutput(const XMLCh* nodeName) {
return xercesc::XMLString::equals(
nodeName,
@@ -42,7 +36,7 @@ std::unique_ptr readOutput(
);
} else {
return std::make_unique(
- wrapOutput(rawOutput)
+ "" + rawOutput + ""
);
}
}
@@ -67,6 +61,20 @@ boost::optional importDocumentElement(
}
}
+boost::process::context createContext(
+ const InputXSLT::FilesystemContext& fsContext) {
+ boost::process::context context;
+
+ context.environment = boost::process::self::get_environment();
+ context.stdout_behavior = boost::process::capture_stream();
+ context.stdin_behavior = boost::process::capture_stream();
+ context.work_directory = boost::filesystem::canonical(
+ fsContext.getBase().parent_path()
+ ).string();
+
+ return context;
+}
+
}
namespace InputXSLT {
@@ -76,21 +84,13 @@ DomDocumentCache::document_ptr FunctionExternalCommand::constructDocument(
std::string command,
boost::optional input
) const {
- DomDocumentCache::document_ptr domDocument(
+ DomDocumentCache::document_ptr domDocument{
DomDocumentCache::createDocument("content")
- );
-
- boost::process::context context;
- context.environment = boost::process::self::get_environment();
- context.stdout_behavior = boost::process::capture_stream();
- context.stdin_behavior = boost::process::capture_stream();
- context.work_directory = boost::filesystem::canonical(
- fsContext.getBase().parent_path()
- ).string();
+ };
- boost::process::child commandProcess(
- boost::process::launch_shell(command, context)
- );
+ boost::process::child commandProcess{
+ boost::process::launch_shell(command, createContext(fsContext))
+ };
if ( input ) {
boost::process::postream& inputStream = commandProcess.get_stdin();
@@ -140,7 +140,6 @@ DomDocumentCache::document_ptr FunctionExternalCommand::constructDocument(
result.setAttribute("result", "error");
}
-
return domDocument;
}
diff --git a/src/function/generate.cc b/src/function/generate.cc
index b93c2f1..5cd5781 100644
--- a/src/function/generate.cc
+++ b/src/function/generate.cc
@@ -33,7 +33,7 @@ DomDocumentCache::document_ptr FunctionGenerate::constructDocument(
result.setAttribute("path", (*targetPath).string());
boost::filesystem::create_directories(
- (*targetPath).parent_path()
+ boost::filesystem::absolute(*targetPath).parent_path()
);
boost::filesystem::ofstream file(*targetPath);
diff --git a/src/function/read_directory.cc b/src/function/read_directory.cc
index d630e5d..9dfc211 100644
--- a/src/function/read_directory.cc
+++ b/src/function/read_directory.cc
@@ -9,11 +9,11 @@ DomDocumentCache::document_ptr FunctionReadDirectory::constructDocument(
const FilesystemContext&,
boost::filesystem::path directoryPath
) const {
- DomDocumentCache::document_ptr domDocument(
+ DomDocumentCache::document_ptr domDocument{
DomDocumentCache::createDocument("content")
- );
+ };
- ResultNodeFacade result(domDocument.get(), "directory");
+ ResultNodeFacade result{domDocument.get(), "directory"};
result.setAttribute("path", directoryPath.string());
if ( boost::filesystem::is_directory(directoryPath) ) {
diff --git a/src/function/read_file.cc b/src/function/read_file.cc
index 8216034..96fa0ff 100644
--- a/src/function/read_file.cc
+++ b/src/function/read_file.cc
@@ -12,17 +12,17 @@
namespace {
inline bool isXmlFile(const boost::filesystem::path& filePath) {
- return filePath.extension() == ".xml" ||
- filePath.extension() == ".xsl";
+ return filePath.extension() == ".xml"
+ || filePath.extension() == ".xsl";
}
boost::optional readXmlFile(
const boost::filesystem::path& filePath,
xercesc::DOMDocument* const domDocument
) {
- const xercesc::LocalFileInputSource file(
+ const xercesc::LocalFileInputSource file{
*InputXSLT::XercesStringGuard(filePath.string())
- );
+ };
xercesc::XercesDOMParser parser;
parser.setDoNamespaces(true);
@@ -79,8 +79,8 @@ DomDocumentCache::document_ptr FunctionReadFile::constructDocument(
if ( auto importedNode = readXmlFile(
filePath,
- domDocument.get())
- ) {
+ domDocument.get()
+ ) ) {
result.setContent(*importedNode);
result.setAttribute("result", "success");
diff --git a/src/function/write_file.cc b/src/function/write_file.cc
index db9eea5..c402d84 100644
--- a/src/function/write_file.cc
+++ b/src/function/write_file.cc
@@ -24,7 +24,9 @@ bool serializeNodeToFile(
if ( contentType != xalan::XalanNode::DOCUMENT_NODE &&
contentType != xalan::XalanNode::ATTRIBUTE_NODE ) {
- boost::filesystem::create_directories(filePath.parent_path());
+ boost::filesystem::create_directories(
+ boost::filesystem::absolute(filePath).parent_path()
+ );
boost::filesystem::ofstream file(filePath);
if ( file.is_open() ) {
--
cgit v1.2.3