presets: Add basic error forwarding from cmake preset json parser

Print errors only if there are errors.  Add filename for better
introspection, particularly for FileNotFound errors with presets.
This commit is contained in:
Sankhesh Jhaveri
2022-07-21 09:50:25 -04:00
committed by Brad King
parent 2be09731e0
commit 47929ee98c
8 changed files with 54 additions and 20 deletions

View File

@@ -901,8 +901,9 @@ cmCMakePresetsGraph::ReadProjectPresetsInternal(bool allowNoFiles)
std::string filename = GetUserFilename(this->SourceDir);
std::vector<File*> inProgressFiles;
if (cmSystemTools::FileExists(filename)) {
auto result = this->ReadJSONFile(filename, RootType::User,
ReadReason::Root, inProgressFiles, file);
auto result =
this->ReadJSONFile(filename, RootType::User, ReadReason::Root,
inProgressFiles, file, this->errors);
if (result != ReadFileResult::READ_OK) {
return result;
}
@@ -910,8 +911,9 @@ cmCMakePresetsGraph::ReadProjectPresetsInternal(bool allowNoFiles)
} else {
filename = GetFilename(this->SourceDir);
if (cmSystemTools::FileExists(filename)) {
auto result = this->ReadJSONFile(
filename, RootType::Project, ReadReason::Root, inProgressFiles, file);
auto result =
this->ReadJSONFile(filename, RootType::Project, ReadReason::Root,
inProgressFiles, file, this->errors);
if (result != ReadFileResult::READ_OK) {
return result;
}

View File

@@ -52,6 +52,7 @@ public:
TEST_OUTPUT_TRUNCATION_UNSUPPORTED,
};
std::string errors;
enum class ArchToolsetStrategy
{
Set,
@@ -407,7 +408,7 @@ private:
ReadFileResult ReadProjectPresetsInternal(bool allowNoFiles);
ReadFileResult ReadJSONFile(const std::string& filename, RootType rootType,
ReadReason readReason,
std::vector<File*>& inProgressFiles,
File*& file);
std::vector<File*>& inProgressFiles, File*& file,
std::string& errMsg);
void ClearPresets();
};

View File

@@ -411,7 +411,7 @@ cmCMakePresetsGraph::ReadFileResult EnvironmentMapHelper(
cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile(
const std::string& filename, RootType rootType, ReadReason readReason,
std::vector<File*>& inProgressFiles, File*& file)
std::vector<File*>& inProgressFiles, File*& file, std::string& errMsg)
{
ReadFileResult result;
@@ -430,6 +430,7 @@ cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile(
cmsys::ifstream fin(filename.c_str());
if (!fin) {
errMsg = cmStrCat(filename, ": Failed to read file\n", errMsg);
return ReadFileResult::FILE_NOT_FOUND;
}
// If there's a BOM, toss it.
@@ -438,7 +439,8 @@ cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile(
Json::Value root;
Json::CharReaderBuilder builder;
Json::CharReaderBuilder::strictMode(&builder.settings_);
if (!Json::parseFromStream(builder, fin, &root, nullptr)) {
if (!Json::parseFromStream(builder, fin, &root, &errMsg)) {
errMsg = cmStrCat(filename, ":\n", errMsg);
return ReadFileResult::JSON_PARSE_ERROR;
}
@@ -490,6 +492,8 @@ cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile(
for (auto& preset : presets.ConfigurePresets) {
preset.OriginFile = file;
if (preset.Name.empty()) {
errMsg += R"(\n\t)";
errMsg += filename;
return ReadFileResult::INVALID_PRESET;
}
@@ -523,6 +527,8 @@ cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile(
for (auto& preset : presets.BuildPresets) {
preset.OriginFile = file;
if (preset.Name.empty()) {
errMsg += R"(\n\t)";
errMsg += filename;
return ReadFileResult::INVALID_PRESET;
}
@@ -569,12 +575,13 @@ cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile(
auto const includeFile = [this, &inProgressFiles, file](
const std::string& include, RootType rootType2,
ReadReason readReason2) -> ReadFileResult {
ReadReason readReason2,
std::string& FailureMessage) -> ReadFileResult {
ReadFileResult r;
File* includedFile;
if ((r = this->ReadJSONFile(include, rootType2, readReason2,
inProgressFiles, includedFile)) !=
ReadFileResult::READ_OK) {
inProgressFiles, includedFile,
FailureMessage)) != ReadFileResult::READ_OK) {
return r;
}
@@ -589,8 +596,8 @@ cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile(
include = cmStrCat(directory, '/', include);
}
if ((result = includeFile(include, rootType, ReadReason::Included)) !=
ReadFileResult::READ_OK) {
if ((result = includeFile(include, rootType, ReadReason::Included,
errMsg)) != ReadFileResult::READ_OK) {
return result;
}
}
@@ -599,7 +606,7 @@ cmCMakePresetsGraph::ReadFileResult cmCMakePresetsGraph::ReadJSONFile(
auto cmakePresetsFilename = GetFilename(this->SourceDir);
if (cmSystemTools::FileExists(cmakePresetsFilename)) {
if ((result = includeFile(cmakePresetsFilename, RootType::Project,
ReadReason::Root)) !=
ReadReason::Root, errMsg)) !=
ReadFileResult::READ_OK) {
return result;
}

View File

@@ -1286,9 +1286,13 @@ void cmake::SetArgs(const std::vector<std::string>& args)
cmCMakePresetsGraph presetsGraph;
auto result = presetsGraph.ReadProjectPresets(this->GetHomeDirectory());
if (result != cmCMakePresetsGraph::ReadFileResult::READ_OK) {
cmSystemTools::Error(
std::string errorMsg =
cmStrCat("Could not read presets from ", this->GetHomeDirectory(),
": ", cmCMakePresetsGraph::ResultToString(result)));
": ", cmCMakePresetsGraph::ResultToString(result));
if (!presetsGraph.errors.empty()) {
errorMsg = cmStrCat(errorMsg, "\nErrors:\n", presetsGraph.errors);
}
cmSystemTools::Error(errorMsg);
return;
}

View File

@@ -1,2 +1,9 @@
^CMake Error: Could not read presets from [^
]*/Tests/RunCMake/CMakePresets/Comment: JSON parse error$
]*/Tests/RunCMake/CMakePresets/Comment: JSON parse error
Errors:
[^
]*Comment\/CMakePresets.json:
\* Line 1, Column 1
Syntax error: value, object or array expected\.
\* Line 2, Column 1
Extra non-whitespace after JSON value\.$

View File

@@ -1,2 +1,5 @@
^CMake Error: Could not read presets from [^
]*/Tests/RunCMake/CMakePresets/EmptyPresetName: Invalid preset$
]*/Tests/RunCMake/CMakePresets/EmptyPresetName: Invalid preset
Errors:
[^
]*/EmptyPresetName/CMakePresets.json$

View File

@@ -1,2 +1,5 @@
^CMake Error: Could not read presets from [^
]*/Tests/RunCMake/CMakePresets/IncludeNotFound: File not found$
]*/Tests/RunCMake/CMakePresets/IncludeNotFound: File not found
Errors:
[^
]*/IncludeNotFound/NotFound.json: Failed to read file$

View File

@@ -1,2 +1,9 @@
^CMake Error: Could not read presets from [^
]*/Tests/RunCMake/CMakePresets/JSONParseError: JSON parse error$
]*/Tests/RunCMake/CMakePresets/JSONParseError: JSON parse error
Errors:
[^
]*JSONParseError/CMakePresets.json:
\* Line 1, Column 1
Syntax error: value, object or array expected\.
\* Line 1, Column 1
A valid JSON document must be either an array or an object value\.$