[M6] cmd_build auto-resolves missing deps via resolver chain
This commit is contained in:
@@ -8,6 +8,7 @@ import cargoxx.linkdb;
|
|||||||
import cargoxx.lockfile;
|
import cargoxx.lockfile;
|
||||||
import cargoxx.codegen;
|
import cargoxx.codegen;
|
||||||
import cargoxx.exec;
|
import cargoxx.exec;
|
||||||
|
import cargoxx.resolver;
|
||||||
|
|
||||||
namespace cargoxx::cli {
|
namespace cargoxx::cli {
|
||||||
|
|
||||||
@@ -146,17 +147,46 @@ auto cmd_build(const fs::path& project_root, bool no_build, bool release,
|
|||||||
return std::unexpected(layout_result.error());
|
return std::unexpected(layout_result.error());
|
||||||
}
|
}
|
||||||
|
|
||||||
auto db = linkdb::Database::open(std::move(overlay_path));
|
const auto effective_overlay = overlay_path.value_or(linkdb::default_overlay_path());
|
||||||
|
auto db = linkdb::Database::open(effective_overlay);
|
||||||
if (!db) {
|
if (!db) {
|
||||||
return std::unexpected(db.error());
|
return std::unexpected(db.error());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto auto_resolve = [&](const std::string& name, const std::string& version,
|
||||||
|
const std::vector<std::string>& components)
|
||||||
|
-> util::Result<void> {
|
||||||
|
auto build_fn = [&](const fs::path& root) {
|
||||||
|
return cmd_build(root, /*no_build=*/false, /*release=*/false,
|
||||||
|
/*target=*/std::nullopt, effective_overlay);
|
||||||
|
};
|
||||||
|
const auto scratch_root =
|
||||||
|
std::filesystem::temp_directory_path() /
|
||||||
|
std::format("cargoxx-discover-{}", std::random_device{}());
|
||||||
|
auto disc = resolver::discover(name, version, components,
|
||||||
|
effective_overlay, scratch_root, build_fn);
|
||||||
|
std::error_code ec;
|
||||||
|
std::filesystem::remove_all(scratch_root, ec);
|
||||||
|
if (!disc) {
|
||||||
|
return std::unexpected(disc.error());
|
||||||
|
}
|
||||||
|
return {};
|
||||||
|
};
|
||||||
|
|
||||||
auto resolve_list = [&](const std::vector<manifest::Dependency>& deps)
|
auto resolve_list = [&](const std::vector<manifest::Dependency>& deps)
|
||||||
-> util::Result<std::vector<linkdb::Recipe>> {
|
-> util::Result<std::vector<linkdb::Recipe>> {
|
||||||
std::vector<linkdb::Recipe> out;
|
std::vector<linkdb::Recipe> out;
|
||||||
out.reserve(deps.size());
|
out.reserve(deps.size());
|
||||||
for (const auto& dep : deps) {
|
for (const auto& dep : deps) {
|
||||||
auto r = db->resolve(dep.name, dep.version_spec, dep.components);
|
auto r = db->resolve(dep.name, dep.version_spec, dep.components);
|
||||||
|
if (!r && r.error().code == util::ErrorCode::LinkdbUnknownPackage) {
|
||||||
|
if (auto resolved = auto_resolve(dep.name, dep.version_spec,
|
||||||
|
dep.components);
|
||||||
|
!resolved) {
|
||||||
|
return std::unexpected(resolved.error());
|
||||||
|
}
|
||||||
|
r = db->resolve(dep.name, dep.version_spec, dep.components);
|
||||||
|
}
|
||||||
if (!r) {
|
if (!r) {
|
||||||
return std::unexpected(r.error());
|
return std::unexpected(r.error());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -156,7 +156,7 @@ TEST_CASE("cmd_build fails for an unknown dep", "[cli][build]") {
|
|||||||
|
|
||||||
auto r = cmd_build(root, true, false, std::nullopt, overlay_path(parent));
|
auto r = cmd_build(root, true, false, std::nullopt, overlay_path(parent));
|
||||||
REQUIRE_FALSE(r.has_value());
|
REQUIRE_FALSE(r.has_value());
|
||||||
REQUIRE(r.error().code == ErrorCode::LinkdbUnknownPackage);
|
REQUIRE(r.error().code == ErrorCode::ResolutionUnknownPackage);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CASE("cmd_build --release writes a release-typed build/CMakeLists",
|
TEST_CASE("cmd_build --release writes a release-typed build/CMakeLists",
|
||||||
|
|||||||
Reference in New Issue
Block a user