Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test features in ci #802

Open
wants to merge 105 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 12 commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
ffac148
WIP: Test features in ci
autoantwort Nov 9, 2022
adc9011
Add command line to specify which ports to test and how features are …
autoantwort Nov 9, 2022
5f99418
Use old clang-format
autoantwort Nov 9, 2022
80a53a3
optimize
autoantwort Nov 9, 2022
6946d6a
Don't delete packages folders
autoantwort Nov 10, 2022
a93c707
Don't purge packages folder to make the binary cache happy
autoantwort Nov 10, 2022
bbdf7e7
Clear internal binary cache state instead of keep packages folder bec…
autoantwort Nov 10, 2022
c6ed7b3
Don't try to build known failures.
autoantwort Nov 10, 2022
8760f5c
Merge branch 'main' into feature/ci-test-features
autoantwort Nov 12, 2022
a1a0188
Rename command line arguments
autoantwort Nov 12, 2022
1f9ebad
Make pipeline happy
autoantwort Nov 12, 2022
fcefd69
Fix windows
autoantwort Nov 12, 2022
e760b17
Merge branch 'main' into feature/ci-test-features
autoantwort Nov 19, 2022
4aeaf49
Fix spelling
autoantwort Nov 19, 2022
ab8591d
Merge branch 'main' into feature/ci-test-features
autoantwort Nov 30, 2022
517e614
Add support for a baseline file
autoantwort Dec 8, 2022
a610bb4
Make msvc happy
autoantwort Dec 8, 2022
1c208e8
Merge branch 'main' into feature/ci-test-features
autoantwort Dec 9, 2022
781c7b1
Create issue template for failing ports
autoantwort Dec 9, 2022
1d60a7d
Give the logs folder a better name
autoantwort Dec 10, 2022
be0dbda
Merge branch 'main' into feature/ci-test-features
autoantwort Dec 22, 2022
9a0c844
Collect time needed to build a port
autoantwort Dec 26, 2022
03eb18c
Don't include cascaded features in the "all" feature test
autoantwort Jan 15, 2023
e801de1
Fix warning
autoantwort Jan 15, 2023
f83b661
Fix msvc warnings
autoantwort Jan 15, 2023
625213b
Merge branch 'main' into feature/ci-test-features
autoantwort Jan 15, 2023
d49840f
Merge branch 'main' into feature/ci-test-features
autoantwort Jan 23, 2023
498b36b
Add option to only run feature tests
autoantwort Jan 27, 2023
673c36c
Merge branch 'main' into feature/ci-test-features
autoantwort Feb 9, 2023
a3beb6e
Add command test-features
autoantwort Feb 14, 2023
ebfc504
Remove feature test code from ci command. Add option to exclude known…
autoantwort Feb 14, 2023
dcdef4a
Remove leftover setting
autoantwort Feb 14, 2023
cf527fa
Merge branch 'main' into feature/ci-test-features
autoantwort Feb 14, 2023
d2edb00
No print2 anymore
autoantwort Feb 14, 2023
c53a769
Merge branch 'main' into feature/ci-test-features
autoantwort Feb 20, 2023
c407d6d
Merge branch 'main' into feature/ci-test-features
autoantwort Feb 28, 2023
e399b2d
Fix build
autoantwort Feb 28, 2023
1f2a2ad
Merge branch 'main' into feature/ci-test-features
autoantwort Mar 16, 2023
1b2519a
Fix build
autoantwort Mar 16, 2023
4cdc14c
Make sure all dependencies are tested before a FullPackageSpec is tested
autoantwort Mar 20, 2023
c7f5598
Use stable sort to keep features of ports together
autoantwort Mar 20, 2023
db0364c
Don't test unsupported ports
autoantwort Mar 23, 2023
61a453f
Fix usage of wrong variable
autoantwort Mar 24, 2023
2772c23
Do a full comparison if the vectors are not sorted
autoantwort Mar 24, 2023
c67d769
Don't use moved from variable
autoantwort Mar 26, 2023
6ed1709
Merge branch 'main' into feature/ci-test-features
autoantwort Mar 27, 2023
d4b1bce
Merge branch 'main' into feature/ci-test-features
autoantwort Apr 4, 2023
7f89ea8
Fix msvc build
autoantwort Apr 4, 2023
f111e15
Move CiFeatureBaseline classes into own files since they don't share …
autoantwort Apr 4, 2023
d188944
Merge branch 'main' into feature/ci-test-features
autoantwort Apr 26, 2023
78cb67f
Merge branch 'main' into feature/ci-test-features
autoantwort May 2, 2023
935ffd9
core is not allowed in non fail baseline entries
autoantwort May 5, 2023
fc6c3d8
Add support for options
autoantwort May 5, 2023
fab6107
Add combination-fails and feature-fails so that failing features are …
autoantwort May 5, 2023
82b52d5
File conflicts are not always the fault of the port
autoantwort May 6, 2023
6dbedb6
Don't add the core feature twice
autoantwort May 7, 2023
424d729
Fix msvc warning
autoantwort May 7, 2023
59174dc
Merge branch 'main' into feature/ci-test-features
autoantwort May 21, 2023
170d279
Fetch binary cache before installation
autoantwort May 23, 2023
c6845cf
Use PortAbiCache to reduce time spend on computing abis
autoantwort May 23, 2023
600a6d7
Batch binary caching pre checks to improve speed.
autoantwort May 23, 2023
2793f04
BinaryCaching: Only reset state to available if package was restored
autoantwort May 30, 2023
e2fc16d
Merge branch 'main' into feature/ci-test-features
autoantwort May 31, 2023
e774fb7
Fix msvc warning
autoantwort May 31, 2023
c525294
Fix msvc warning
autoantwort May 31, 2023
66f0514
Merge branch 'main' into feature/ci-test-features
autoantwort May 31, 2023
6d6f8a9
Fix msvc warning
autoantwort Jun 6, 2023
92de08a
Localisation
autoantwort Jun 6, 2023
1dc9663
More localization
autoantwort Jun 6, 2023
3b21335
More localization
autoantwort Jun 12, 2023
f5e037e
Merge branch 'main' into feature/ci-test-features
autoantwort Jun 13, 2023
fe08c5e
Fix build
autoantwort Jun 13, 2023
d6f922b
If the first tested feature is an expected cascade the whole tested f…
autoantwort Jun 16, 2023
ff9a23e
Emit error is feature is specified as cascade and feature-fails
autoantwort Jun 16, 2023
6d46b6a
Trigger Build
autoantwort Jun 16, 2023
3616c9a
Add message map
autoantwort Jun 17, 2023
7de7b89
Remove unnecessary changes
autoantwort Jun 21, 2023
948a7ba
Actually detect errors while parsing + detect more errors.
autoantwort Jun 27, 2023
021d1c9
Merge branch 'main' into feature/ci-test-features
autoantwort Jun 27, 2023
2428299
Restore old CMakeVarProvider interface changed in #1109
autoantwort Jun 28, 2023
f003d33
More localization + more information in result text
autoantwort Jun 28, 2023
d8ca81d
Merge branch 'main' into feature/ci-test-features
autoantwort Jul 12, 2023
7dfc95d
Merge branch 'main' into feature/ci-test-features
autoantwort Aug 15, 2023
e208e4d
Fix warning
autoantwort Aug 15, 2023
d2e15d4
Merge branch 'main' into feature/ci-test-features
autoantwort Aug 24, 2023
3a08f95
Add command to format a ci.feature.baseline.txt file
autoantwort Aug 27, 2023
6062fb8
Merge branch 'main' into feature/ci-test-features
autoantwort Aug 27, 2023
4a2d427
windows: Allow writing to file that is read
autoantwort Aug 28, 2023
9495a2a
Merge branch 'feature/ci-test-features' of github.com:autoantwort/vcp…
autoantwort Aug 28, 2023
07725fb
Merge branch 'main' into feature/ci-test-features
autoantwort Aug 29, 2023
8b112b9
Revert "windows: Allow writing to file that is read"
autoantwort Aug 29, 2023
e8eb42b
Merge branch 'main' into feature/ci-test-features
autoantwort Sep 7, 2023
09d83b8
Merge branch 'main' into feature/ci-test-features
autoantwort Sep 9, 2023
3c048e6
Rename options and rename command to x-test-features
autoantwort Sep 16, 2023
67c698b
Merge branch 'main' into feature/ci-test-features
autoantwort Oct 11, 2023
2471c5b
Merge fun with branch 'main' into feature/ci-test-features
autoantwort Nov 12, 2023
9e13600
Merge branch 'main' into feature/ci-test-features
autoantwort Dec 13, 2023
0658071
Merge branch 'main' into feature/ci-test-features
autoantwort Apr 17, 2024
3ab6b83
Fix merge conflict
autoantwort Apr 17, 2024
ea7e63e
Message db
autoantwort Apr 17, 2024
7af8217
Lof of fun fixing merge conflicts while Merging branch 'main' into fe…
autoantwort May 22, 2024
291a9d3
Merge branch 'main' into feature/ci-test-features and resolve conflict
autoantwort Aug 30, 2024
3da56e8
Merge branch 'main' into feature/ci-test-features
autoantwort Nov 18, 2024
43cd7c2
Fix merge conflicts
autoantwort Nov 18, 2024
8c2055b
Fix warning
autoantwort Nov 18, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions include/vcpkg/binarycaching.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ namespace vcpkg
void mark_unavailable(const IBinaryProvider* sender);
void mark_available(const IBinaryProvider* sender) noexcept;
void mark_restored() noexcept;
void mark_unrestored() noexcept;

private:
CacheStatusState m_status = CacheStatusState::unknown;
Expand Down Expand Up @@ -142,6 +143,8 @@ namespace vcpkg
/// Returns a vector where each index corresponds to the matching index in `actions`.
std::vector<CacheAvailability> precheck(View<InstallPlanAction> actions);

void clear_cache();

private:
std::unordered_map<std::string, CacheStatus> m_status;
std::vector<std::unique_ptr<IBinaryProvider>> m_providers;
Expand Down
8 changes: 8 additions & 0 deletions include/vcpkg/commands.setinstalled.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,14 @@
namespace vcpkg::Commands::SetInstalled
{
extern const CommandStructure COMMAND_STRUCTURE;

/**
* @brief adjust_action_plan_to_status_db creates an action plan that installs only the requested ports
* @param action_plan An action plan that was created with an empty status db
* @param status_db The status db of the installed folder
*/
void adjust_action_plan_to_status_db(ActionPlan& action_plan, const StatusParagraphs& status_db);

void perform_and_exit_ex(const VcpkgCmdArguments& args,
const VcpkgPaths& paths,
const PathsPortFileProvider& provider,
Expand Down
8 changes: 7 additions & 1 deletion include/vcpkg/install.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
#include <vcpkg/binaryparagraph.h>
#include <vcpkg/build.h>
#include <vcpkg/dependencies.h>
#include <vcpkg/remove.h>
#include <vcpkg/vcpkgcmdarguments.h>
#include <vcpkg/vcpkgpaths.h>

Expand All @@ -32,6 +33,10 @@ namespace vcpkg

const BinaryParagraph* get_binary_paragraph() const;
const PackageSpec& get_spec() const { return m_spec; }
Optional<const std::string&> get_abi() const
{
return m_install_action ? m_install_action->package_abi() : nullopt;
}
bool is_user_requested_install() const;
Optional<ExtendedBuildResult> build_result;
vcpkg::ElapsedTime timing;
Expand Down Expand Up @@ -115,7 +120,8 @@ namespace vcpkg
StatusParagraphs& status_db,
BinaryCache& binary_cache,
const IBuildLogsRecorder& build_logs_recorder,
const CMakeVars::CMakeVarProvider& var_provider);
const CMakeVars::CMakeVarProvider& var_provider,
Remove::Purge purge = Remove::Purge::YES);

void perform_and_exit(const VcpkgCmdArguments& args,
const VcpkgPaths& paths,
Expand Down
3 changes: 3 additions & 0 deletions include/vcpkg/packagespec.h
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,9 @@ namespace vcpkg
{
}

std::string to_string() const;
void to_string(std::string& s) const;

/// Splats into individual FeatureSpec's
void expand_fspecs_to(std::vector<FeatureSpec>& oFut) const;

Expand Down
10 changes: 10 additions & 0 deletions src/vcpkg/binarycaching.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1458,6 +1458,14 @@ namespace vcpkg
return results;
}

void BinaryCache::clear_cache()
{
for (auto& entry : m_status)
{
entry.second.mark_unrestored();
}
}

bool CacheStatus::should_attempt_precheck(const IBinaryProvider* sender) const noexcept
{
switch (m_status)
Expand Down Expand Up @@ -1534,6 +1542,8 @@ namespace vcpkg
}
}

void CacheStatus::mark_unrestored() noexcept { m_status = CacheStatusState::available; }

const IBinaryProvider* CacheStatus::get_available_provider() const noexcept
{
switch (m_status)
Expand Down
213 changes: 199 additions & 14 deletions src/vcpkg/commands.ci.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
#include <vcpkg/ci-baseline.h>
#include <vcpkg/cmakevars.h>
#include <vcpkg/commands.ci.h>
#include <vcpkg/commands.setinstalled.h>
#include <vcpkg/dependencies.h>
#include <vcpkg/globalstate.h>
#include <vcpkg/help.h>
Expand Down Expand Up @@ -101,26 +102,38 @@ namespace vcpkg::Commands::CI
static constexpr StringLiteral OPTION_OUTPUT_HASHES = "output-hashes";
static constexpr StringLiteral OPTION_PARENT_HASHES = "parent-hashes";
static constexpr StringLiteral OPTION_SKIPPED_CASCADE_COUNT = "x-skipped-cascade-count";
static constexpr StringLiteral OPTION_TEST_FEATURE_CORE = "test-feature-core";
static constexpr StringLiteral OPTION_TEST_FEATURES_COMBINED = "test-features-combined";
static constexpr StringLiteral OPTION_TEST_FEATURES_SEPERATLY = "test-features-seperatly";
autoantwort marked this conversation as resolved.
Show resolved Hide resolved
static constexpr StringLiteral OPTION_RUN_FEATURE_TESTS_PORTS = "run-feature-tests-for-ports";
static constexpr StringLiteral OPTION_RUN_FEATURE_TESTS_ALL_PORTS = "run-feature-tests-for-all-ports";

static constexpr std::array<CommandSetting, 9> CI_SETTINGS = {{
{OPTION_EXCLUDE, "Comma separated list of ports to skip"},
{OPTION_HOST_EXCLUDE, "Comma separated list of ports to skip for the host triplet"},
{OPTION_XUNIT, "File to output results in XUnit format (internal)"},
{OPTION_CI_BASELINE, "Path to the ci.baseline.txt file. Used to skip ports and detect regressions."},
{OPTION_FAILURE_LOGS, "Directory to which failure logs will be copied"},
{OPTION_OUTPUT_HASHES, "File to output all determined package hashes"},
{OPTION_PARENT_HASHES,
"File to read package hashes for a parent CI state, to reduce the set of changed packages"},
{OPTION_SKIPPED_CASCADE_COUNT,
"Asserts that the number of --exclude and supports skips exactly equal this number"},
{OPTION_RUN_FEATURE_TESTS_PORTS,
"A comma seperated list of ports for which the specified feature tests should be run"},
}};

static constexpr std::array<CommandSetting, 8> CI_SETTINGS = {
{{OPTION_EXCLUDE, "Comma separated list of ports to skip"},
{OPTION_HOST_EXCLUDE, "Comma separated list of ports to skip for the host triplet"},
{OPTION_XUNIT, "File to output results in XUnit format (internal)"},
{OPTION_CI_BASELINE, "Path to the ci.baseline.txt file. Used to skip ports and detect regressions."},
{OPTION_FAILURE_LOGS, "Directory to which failure logs will be copied"},
{OPTION_OUTPUT_HASHES, "File to output all determined package hashes"},
{OPTION_PARENT_HASHES,
"File to read package hashes for a parent CI state, to reduce the set of changed packages"},
{OPTION_SKIPPED_CASCADE_COUNT,
"Asserts that the number of --exclude and supports skips exactly equal this number"}}};

static constexpr std::array<CommandSwitch, 5> CI_SWITCHES = {{
static constexpr std::array<CommandSwitch, 9> CI_SWITCHES = {{
{OPTION_DRY_RUN, "Print out plan without execution"},
{OPTION_RANDOMIZE, "Randomize the install order"},
{OPTION_ALLOW_UNEXPECTED_PASSING,
"Indicates that 'Passing, remove from fail list' results should not be emitted."},
{OPTION_SKIP_FAILURES, "Indicates that ports marked `=fail` in ci.baseline.txt should be skipped."},
{OPTION_XUNIT_ALL, "Report also unchanged ports to the XUnit output (internal)"},
{OPTION_RUN_FEATURE_TESTS_ALL_PORTS, "Runs the specified tests for all ports"},
{OPTION_TEST_FEATURE_CORE, "Tests the 'core' feature for every specified port"},
{OPTION_TEST_FEATURES_SEPERATLY, "Tests every feature of a port seperatly for every specified port"},
{OPTION_TEST_FEATURES_COMBINED, "Tests the combination of every feature of a port for every specified port"},
}};

const CommandStructure COMMAND_STRUCTURE = {
Expand Down Expand Up @@ -270,6 +283,33 @@ namespace vcpkg::Commands::CI
});
}

static auto get_ports_to_test_with_features(const ParsedArguments& args, ActionPlan& action_plan)
{
const auto all_ports = Util::Sets::contains(args.switches, OPTION_RUN_FEATURE_TESTS_ALL_PORTS);
std::vector<std::string> ports;
auto iter = args.settings.find(OPTION_RUN_FEATURE_TESTS_PORTS);
if (iter != args.settings.end())
{
ports = Strings::split(iter->second, ',');
}
std::vector<SourceControlFile*> ports_to_test;
if (all_ports || !ports.empty())
{
for (const auto& action : action_plan.install_actions)
{
const auto& source_control_file =
action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO).source_control_file;

if (all_ports || Util::Vectors::contains(ports, source_control_file->core_paragraph->name))
{
ports_to_test.push_back(action.source_control_file_and_location.value_or_exit(VCPKG_LINE_INFO)
.source_control_file.get());
}
}
}
return ports_to_test;
}

static void parse_exclusions(const std::map<std::string, std::string, std::less<>>& settings,
StringLiteral opt,
Triplet triplet,
Expand Down Expand Up @@ -336,6 +376,20 @@ namespace vcpkg::Commands::CI
const ParsedArguments options = args.parse_arguments(COMMAND_STRUCTURE);
const auto& settings = options.settings;

const auto test_feature_core = Util::Sets::contains(options.switches, OPTION_TEST_FEATURE_CORE);
const auto test_features_combined = Util::Sets::contains(options.switches, OPTION_TEST_FEATURES_COMBINED);
const auto test_features_seperatly = Util::Sets::contains(options.switches, OPTION_TEST_FEATURES_SEPERATLY);

const auto run_tests_all_ports = Util::Sets::contains(options.switches, OPTION_RUN_FEATURE_TESTS_ALL_PORTS);
const auto run_tests_ports_list = Util::Sets::contains(options.settings, OPTION_RUN_FEATURE_TESTS_PORTS);
{
const auto tests_selected = test_feature_core || test_features_combined || test_features_seperatly;
const auto ports_selected = run_tests_all_ports || run_tests_ports_list;
Checks::check_exit(VCPKG_LINE_INFO,
(tests_selected && ports_selected) || (!tests_selected && !ports_selected),
"You specify a flag to test features, but not which port should be checked");
}

BinaryCache binary_cache{args, paths};

ExclusionsMap exclusions_map;
Expand Down Expand Up @@ -473,7 +527,6 @@ namespace vcpkg::Commands::CI
return abi->string(VCPKG_LINE_INFO).to_string();
});
}

reduce_action_plan(action_plan, split_specs->known, parent_hashes);

msg::println(msgElapsedTimeForChecks, msg::elapsed = timer.elapsed());
Expand All @@ -494,6 +547,138 @@ namespace vcpkg::Commands::CI
else
{
StatusParagraphs status_db = database_load_check(paths.get_filesystem(), paths.installed());

// test port features
std::unordered_set<std::string> known_failures;
for (const auto port : get_ports_to_test_with_features(options, action_plan))
{
PackageSpec package_spec(port->core_paragraph->name, target_triplet);
var_provider.load_dep_info_vars(Span<PackageSpec>(&package_spec, 1), host_triplet);
const auto dep_info_vars = var_provider.get_dep_info_vars(package_spec).value_or_exit(VCPKG_LINE_INFO);
std::vector<FullPackageSpec> specs_to_test;
if (test_feature_core)
{
specs_to_test.emplace_back(package_spec, InternalFeatureSet{{"core"}});
}
InternalFeatureSet all_features{{"core"}};
for (const auto& feature : port->feature_paragraphs)
{
if (feature->supports_expression.evaluate(dep_info_vars))
{
all_features.push_back(feature->name);
if (test_features_seperatly)
{
specs_to_test.emplace_back(package_spec, InternalFeatureSet{{"core", feature->name}});
}
}
}
if (test_features_combined && all_features.size() > (test_features_seperatly ? size_t{2} : size_t{1}))
{
specs_to_test.emplace_back(package_spec, all_features);
}

for (auto& spec : specs_to_test)
{
auto install_plan = create_feature_install_plan(provider,
var_provider,
Span<FullPackageSpec>(&spec, 1),
{},
{host_triplet, UnsupportedPortAction::Warn});
if (!install_plan.warnings.empty())
{
print2("Skipping testing of ",
install_plan.install_actions.back().displayname(),
" because of the following warnings: \n",
Strings::join("\n", install_plan.warnings),
'\n');
continue;
}

compute_all_abis(paths, install_plan, var_provider, status_db);
if (Util::any_of(install_plan.install_actions, [&known_failures](const auto& install_action) {
return Util::Sets::contains(known_failures,
install_action.package_abi().value_or_exit(VCPKG_LINE_INFO));
}))
{
print2(spec, " will fail tested\n");
continue;
}

// only install the absolute minimum
SetInstalled::adjust_action_plan_to_status_db(install_plan, status_db);
if (install_plan.install_actions.empty()) // already installed
{
continue;
}

if (binary_cache.precheck({&install_plan.install_actions.back(), 1}).front() ==
CacheAvailability::available)
continue;
print2("Test feature ", spec, '\n');
for (auto&& action : install_plan.install_actions)
{
action.build_options = backcompat_prohibiting_package_options;
}
const auto summary = Install::perform(args,
install_plan,
KeepGoing::YES,
paths,
status_db,
binary_cache,
null_build_logs_recorder(),
var_provider);
binary_cache.clear_cache();
for (const auto& result : summary.results)
{
switch (result.build_result.value_or_exit(VCPKG_LINE_INFO).code)
{
case BuildResult::BUILD_FAILED:
case BuildResult::POST_BUILD_CHECKS_FAILED:
case BuildResult::FILE_CONFLICTS:
known_failures.insert(result.get_abi().value_or_exit(VCPKG_LINE_INFO));
break;
default: break;
}
}
switch (summary.results.back().build_result.value_or_exit(VCPKG_LINE_INFO).code)
{
case vcpkg::BuildResult::SUCCEEDED:
case vcpkg::BuildResult::CASCADED_DUE_TO_MISSING_DEPENDENCIES:
print2("Feature ", spec, " works \n");
break;
default: print2("Feature ", spec, " failed with \n");
}
}
}

if (!known_failures.empty())
{
// remove known failures from the action_plan.install_actions
std::set<PackageSpec> known_failure_specs;
for (const auto& install_action : action_plan.install_actions)
{
if (Util::Sets::contains(known_failures,
install_action.package_abi().value_or_exit(VCPKG_LINE_INFO)))
{
split_specs->known.emplace(install_action.spec, BuildResult::BUILD_FAILED);
known_failure_specs.emplace(install_action.spec);
}
else if (Util::any_of(install_action.package_dependencies, [&](const PackageSpec& spec) {
return Util::Sets::contains(known_failure_specs, spec);
}))
{
split_specs->known.emplace(install_action.spec,
BuildResult::CASCADED_DUE_TO_MISSING_DEPENDENCIES);
known_failure_specs.emplace(install_action.spec);
}
}
Util::erase_remove_if(action_plan.install_actions,
[&known_failure_specs](const InstallPlanAction& action) {
return Util::Sets::contains(known_failure_specs, action.spec);
});
}
SetInstalled::adjust_action_plan_to_status_db(action_plan, status_db);

auto summary = Install::perform(
args, action_plan, KeepGoing::YES, paths, status_db, binary_cache, build_logs_recorder, var_provider);

Expand Down
Loading