presets: Implement closest string for invalid preset

This commit is contained in:
Tyler Yankee committed 2026-11-01 13:53:58 -05:00
1 parent 2603725ccc
commit ba61d59840
11 files changed
+59 -36

No files matched your search

+3 -3
View File
@@ -313,9 +313,9 @@ int main(int argc, char const* const* argv)
auto resolveResult = presetsGraph.ResolvePreset(
presetsArgs.PresetName, presetsGraph.PackagePresets);
auto resolveError = cmCMakePresetsGraph::FormatPresetError<
cmCMakePresetsGraph::PackagePreset>(resolveResult.StatusCode,
resolveResult.ErrorPresetName,
workingDirectory);
cmCMakePresetsGraph::PackagePreset>(
resolveResult.StatusCode, resolveResult.ErrorPresetName,
resolveResult.Suggestion, workingDirectory);
if (resolveError) {
cmCPack_Log(&log, cmCPackLog::LOG_ERROR, *resolveError << "\n");
presetsGraph.PrintPackagePresetList(
+1 -1
View File
@@ -139,7 +139,7 @@ std::unique_ptr<cmCTestGenericHandler> cmCTestBuildCommand::InitializeHandler(
presetsGraph.ResolvePreset(effectivePreset, presetsGraph.BuildPresets);
auto resolveError = cmCMakePresetsGraph::FormatPresetError<BuildPreset>(
resolveResult.StatusCode, resolveResult.ErrorPresetName,
sourceDirectory);
resolveResult.Suggestion, sourceDirectory);
if (resolveError) {
status.SetError(*resolveError);
return nullptr;
+1 -1
View File
@@ -75,7 +75,7 @@ bool ConstructConfigureCommand(
auto resolveError =
cmCMakePresetsGraph::FormatPresetError<ConfigurePreset>(
resolveResult.StatusCode, resolveResult.ErrorPresetName,
sourceDirectory);
resolveResult.Suggestion, sourceDirectory);
if (resolveError) {
status.SetError(*resolveError);
return false;
+1 -1
View File
@@ -95,7 +95,7 @@ cmCTestTestCommand::ResolveTestPreset(cmMakefile& mf,
resolved.EffectivePreset, resolved.PresetsGraph->TestPresets);
auto resolveError = cmCMakePresetsGraph::FormatPresetError<TestPreset>(
resolveResult.StatusCode, resolveResult.ErrorPresetName,
resolved.SourceDirectory);
resolveResult.Suggestion, resolved.SourceDirectory);
if (resolveError) {
status.SetError(*resolveError);
return cm::nullopt;
+7 -6
View File
@@ -426,6 +426,7 @@ public:
Status StatusCode = Status::Success;
std::string ErrorPresetName;
std::string Suggestion;
T const* Preset = nullptr;
};
@@ -439,7 +440,7 @@ public:
template <class T>
static cm::optional<std::string> FormatPresetError(
PresetResolveStatus status, std::string const& errorPresetName,
std::string const& directory);
std::string const& suggestion, std::string const& directory);
template <class T>
bool ResolveDependentPresets(std::map<std::string, PresetPair<T>>& presets);
@@ -573,24 +574,24 @@ cmCMakePresetsGraph::ResolvePreset(
extern template cm::optional<std::string>
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::ConfigurePreset>(
cmCMakePresetsGraph::PresetResolveStatus, std::string const&,
std::string const&);
std::string const&, std::string const&);
extern template cm::optional<std::string>
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::BuildPreset>(
cmCMakePresetsGraph::PresetResolveStatus, std::string const&,
std::string const&);
std::string const&, std::string const&);
extern template cm::optional<std::string>
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::TestPreset>(
cmCMakePresetsGraph::PresetResolveStatus, std::string const&,
std::string const&);
std::string const&, std::string const&);
extern template cm::optional<std::string>
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::PackagePreset>(
cmCMakePresetsGraph::PresetResolveStatus, std::string const&,
std::string const&);
std::string const&, std::string const&);
extern template cm::optional<std::string>
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::WorkflowPreset>(
cmCMakePresetsGraph::PresetResolveStatus, std::string const&,
std::string const&);
std::string const&, std::string const&);
+33 -17
View File
@@ -2,6 +2,8 @@
file LICENSE.rst or https://cmake.org/licensing for details. */
#include <map>
#include <string>
#include <utility>
#include <vector>
#include <cm/optional>
@@ -21,6 +23,13 @@ cmCMakePresetsGraph::PresetResolveResult<T> cmCMakePresetsGraph::ResolvePreset(
if (presetPair == presets.end()) {
result.StatusCode = Result::Status::NotFound;
result.ErrorPresetName = presetName;
std::vector<std::string> candidates;
for (auto const& pair : presets) {
if (!pair.second.Unexpanded.Hidden) {
candidates.push_back(pair.first);
}
}
result.Suggestion = cmFindClosestString(presetName, candidates);
return result;
}
if (presetPair->second.Unexpanded.Hidden) {
@@ -82,13 +91,19 @@ cmCMakePresetsGraph::ResolvePreset(
template <class T>
cm::optional<std::string> cmCMakePresetsGraph::FormatPresetError(
PresetResolveStatus status, std::string const& errorPresetName,
std::string const& directory)
std::string const& suggestion, std::string const& directory)
{
using Status = PresetResolveStatus;
switch (status) {
case Status::NotFound:
return cmStrCat("No such ", T::kind(), " preset in ", directory, ": \"",
errorPresetName, '"');
case Status::NotFound: {
std::string error = cmStrCat("No such ", T::kind(), " preset in ",
directory, ": \"", errorPresetName, '"');
if (!suggestion.empty()) {
error =
cmStrCat(std::move(error), ". Did you mean: \"", suggestion, "\"?");
}
return error;
}
case Status::Hidden:
return cmStrCat("Cannot use hidden ", T::kind(), " preset in ",
directory, ": \"", errorPresetName, '"');
@@ -108,20 +123,21 @@ cm::optional<std::string> cmCMakePresetsGraph::FormatPresetError(
// Explicit template instantiations for FormatPresetError
template cm::optional<std::string>
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::ConfigurePreset>(
PresetResolveStatus, std::string const&, std::string const&);
PresetResolveStatus, std::string const&, std::string const&,
std::string const&);
template cm::optional<std::string>
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::BuildPreset>(
PresetResolveStatus, std::string const&, std::string const&);
template cm::optional<std::string> cmCMakePresetsGraph::FormatPresetError<
cmCMakePresetsGraph::BuildPreset>(PresetResolveStatus, std::string const&,
std::string const&, std::string const&);
template cm::optional<std::string>
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::TestPreset>(
PresetResolveStatus, std::string const&, std::string const&);
template cm::optional<std::string> cmCMakePresetsGraph::FormatPresetError<
cmCMakePresetsGraph::TestPreset>(PresetResolveStatus, std::string const&,
std::string const&, std::string const&);
template cm::optional<std::string>
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::PackagePreset>(
PresetResolveStatus, std::string const&, std::string const&);
template cm::optional<std::string> cmCMakePresetsGraph::FormatPresetError<
cmCMakePresetsGraph::PackagePreset>(PresetResolveStatus, std::string const&,
std::string const&, std::string const&);
template cm::optional<std::string>
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::WorkflowPreset>(
PresetResolveStatus, std::string const&, std::string const&);
template cm::optional<std::string> cmCMakePresetsGraph::FormatPresetError<
cmCMakePresetsGraph::WorkflowPreset>(PresetResolveStatus, std::string const&,
std::string const&, std::string const&);
+2 -2
View File
@@ -833,7 +833,7 @@ int cmCTest::ProcessSteps()
cmCMakePresetsGraph::FormatPresetError<
cmCMakePresetsGraph::ConfigurePreset>(
resolveResult.StatusCode, resolveResult.ErrorPresetName,
sourceDir);
resolveResult.Suggestion, sourceDir);
if (resolveError) {
cmCTestLog(this, ERROR_MESSAGE, *resolveError, '\n');
return 12;
@@ -1660,7 +1660,7 @@ bool cmCTest::SetArgsFromPreset(cmCMakePresetsArgs const& args)
auto resolveError =
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::TestPreset>(
resolveResult.StatusCode, resolveResult.ErrorPresetName,
workingDirectory);
resolveResult.Suggestion, workingDirectory);
if (resolveError) {
cmSystemTools::Error(*resolveError);
cmake cm(cmState::Role::CTest);
+5 -5
View File
@@ -2121,7 +2121,7 @@ bool cmake::SetArgsFromPreset(cmCMakePresetsConfigureArgs const& args,
using S = cmCMakePresetsGraph::PresetResolveStatus;
auto resolveError = cmCMakePresetsGraph::FormatPresetError<ConfigurePreset>(
resolveResult.StatusCode, resolveResult.ErrorPresetName,
this->GetHomeDirectory());
resolveResult.Suggestion, this->GetHomeDirectory());
if (resolveError) {
cmSystemTools::Error(*resolveError);
if (resolveResult.StatusCode == S::NotFound ||
@@ -4081,7 +4081,7 @@ int cmake::Build(cmBuildArgs buildArgs, std::vector<std::string> targets,
auto resolveError =
cmCMakePresetsGraph::FormatPresetError<cmCMakePresetsGraph::BuildPreset>(
resolveResult.StatusCode, resolveResult.ErrorPresetName,
this->GetHomeDirectory());
resolveResult.Suggestion, this->GetHomeDirectory());
if (resolveError) {
cmSystemTools::Error(*resolveError);
settingsFile.PrintBuildPresetList();
@@ -4465,9 +4465,9 @@ int cmake::Workflow(cmCMakePresetsWorkflowArgs const& args)
auto resolveResult =
settingsFile.ResolvePreset(args.PresetName, settingsFile.WorkflowPresets);
auto resolveError = cmCMakePresetsGraph::FormatPresetError<
cmCMakePresetsGraph::WorkflowPreset>(resolveResult.StatusCode,
resolveResult.ErrorPresetName,
this->GetHomeDirectory());
cmCMakePresetsGraph::WorkflowPreset>(
resolveResult.StatusCode, resolveResult.ErrorPresetName,
resolveResult.Suggestion, this->GetHomeDirectory());
if (resolveError) {
cmSystemTools::Error(*resolveError);
settingsFile.PrintWorkflowPresetList();
@@ -0,0 +1 @@
1
@@ -0,0 +1,2 @@
^CMake Error: No such configure preset in [^
]*/Tests/RunCMake/CMakePresets/NoSuchPresetDidYouMean: "GoodNoArg"\. Did you mean: "GoodNoArgs"\?$
@@ -350,6 +350,9 @@ endif()
# Test bad command line arguments
run_cmake_presets(NoSuchPreset)
set(CMakePresets_NO_PRESET 1)
run_cmake_presets(NoSuchPresetDidYouMean --preset=GoodNoArg)
unset(CMakePresets_NO_PRESET)
run_cmake_presets(NoPresetArgument --preset)
run_cmake_presets(NoPresetArgumentEq --preset= -DA=B)
run_cmake_presets(UseHiddenPreset)