From e75248e863896a63785deaa7383451492f9f7802 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Thu, 30 May 2024 15:02:50 +0300 Subject: Improve dependency resolution (GH issue 318) --- bpkg/pkg-build-collect.cxx | 29 ++++---- bpkg/pkg-build-collect.hxx | 16 ++--- bpkg/pkg-build.cxx | 112 +++++++++++++++++++++++------- tests/pkg-build.testscript | 168 ++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 273 insertions(+), 52 deletions(-) diff --git a/bpkg/pkg-build-collect.cxx b/bpkg/pkg-build-collect.cxx index 436d629..e99557a 100644 --- a/bpkg/pkg-build-collect.cxx +++ b/bpkg/pkg-build-collect.cxx @@ -3367,7 +3367,7 @@ namespace bpkg pdb, nm, pkg.available_version (), - false /* selected_dependent */); + false /* existing_dependent */); if (!satisfies (v2, c1.value)) { @@ -3540,7 +3540,7 @@ namespace bpkg pdb, nm, pkg.available_version (), - false /* selected_dependent */); + false /* existing_dependent */); // Now collect this prerequisite. If it was actually collected // (i.e., it wasn't already there) and we are forcing a downgrade @@ -7508,11 +7508,16 @@ namespace bpkg { using constraint_type = build_package::constraint_type; + // Pre-entered entries are always converted to adjustments (see + // above). + // + assert (dp.action); + constraint_type c (move (*dc), ddb, move (dn), dp.selected->version, - true /* selected_dependent */); + *dp.action != build_package::build); if (find_if (p.constraints.begin (), p.constraints.end (), [&c] (const constraint_type& v) @@ -7557,7 +7562,7 @@ namespace bpkg const build_package& p, string& indent, set& printed, - optional selected_dependent) const + optional existing_dependent) const { using constraint_type = build_package::constraint_type; @@ -7573,8 +7578,8 @@ namespace bpkg for (const constraint_type& c: cs) { - if (!selected_dependent || - *selected_dependent == c.selected_dependent) + if (!existing_dependent || + *existing_dependent == c.existing_dependent) { if (const build_package* d = dependent_build (c)) { @@ -7582,7 +7587,7 @@ namespace bpkg << ' ' << c.value << ')'; indent += " "; - print_constraints (dr, *d, indent, printed, selected_dependent); + print_constraints (dr, *d, indent, printed, existing_dependent); indent.resize (indent.size () - 2); } else @@ -7595,8 +7600,8 @@ namespace bpkg { for (const constraint_type& c: cs) { - if (!selected_dependent || - *selected_dependent == c.selected_dependent) + if (!existing_dependent || + *existing_dependent == c.existing_dependent) { dr << '\n' << indent << "..."; break; @@ -7611,11 +7616,11 @@ namespace bpkg const package_key& pk, string& indent, set& printed, - optional selected_dependent) const + optional existing_dependent) const { const build_package* p (entered_build (pk)); assert (p != nullptr); // Expected to be collected. - print_constraints (dr, *p, indent, printed, selected_dependent); + print_constraints (dr, *p, indent, printed, existing_dependent); } void build_packages:: @@ -7982,7 +7987,7 @@ namespace bpkg dpt.db, dpt.name, *dpt.version, - true /* selected_package */); + true /* existing_package */); } // Note: not recursive. diff --git a/bpkg/pkg-build-collect.hxx b/bpkg/pkg-build-collect.hxx index f84c86f..5c8a635 100644 --- a/bpkg/pkg-build-collect.hxx +++ b/bpkg/pkg-build-collect.hxx @@ -221,9 +221,9 @@ namespace bpkg package_version_key dependent; // False for non-packages. Otherwise, indicates whether the constraint - // comes from the selected dependent or not. + // comes from the existing rather than the being built dependent. // - bool selected_dependent; + bool existing_dependent; // Create constraint for a package dependent. // @@ -231,17 +231,17 @@ namespace bpkg database& db, package_name nm, version ver, - bool s) + bool e) : value (move (v)), dependent (db, move (nm), move (ver)), - selected_dependent (s) {} + existing_dependent (e) {} // Create constraint for a non-package dependent. // constraint_type (version_constraint v, database& db, string nm) : value (move (v)), dependent (db, move (nm)), - selected_dependent (false) {} + existing_dependent (false) {} }; vector constraints; @@ -1683,7 +1683,7 @@ namespace bpkg // constraints for the same package twice, printing "..." instead. Noop if // there are no constraints for this package. // - // Optionally, only print constraints from the selected or being built + // Optionally, only print constraints from the existing or being built // dependents (see build_package::constraint_type for details). // void @@ -1691,14 +1691,14 @@ namespace bpkg const build_package&, string& indent, std::set& printed, - optional selected_dependent = nullopt) const; + optional existing_dependent = nullopt) const; void print_constraints (diag_record&, const package_key&, string& indent, std::set& printed, - optional selected_dependent = nullopt) const; + optional existing_dependent = nullopt) const; // Verify that builds ordering is consistent across all the data // structures and the ordering expectations are fulfilled (real build diff --git a/bpkg/pkg-build.cxx b/bpkg/pkg-build.cxx index 0802c40..6a9ad7d 100644 --- a/bpkg/pkg-build.cxx +++ b/bpkg/pkg-build.cxx @@ -2097,6 +2097,8 @@ namespace bpkg // Specifically, try to find the best available package version considering // all the imposed constraints as per unsatisfied_dependents description. If // succeed, return the command line adjustment reflecting the replacement. + // If allow_downgrade is false, then don't return a downgrade adjustment for + // the package, unless it is being deorphaned. // // Notes: // @@ -2133,9 +2135,10 @@ namespace bpkg // requested to be upgraded, patched, and/or deorphaned, then we // shouldn't be silently up/down-grading it. // - optional + static optional try_replace_dependency (const common_options& o, const build_package& p, + bool allow_downgrade, const build_packages& pkgs, const vector& hold_pkgs, const dependency_packages& dep_pkgs, @@ -2423,7 +2426,7 @@ namespace bpkg { r = false; - if (c.dependent.version && !c.selected_dependent) + if (c.dependent.version && !c.existing_dependent) { package_key pk (c.dependent.db, c.dependent.name); @@ -2473,18 +2476,21 @@ namespace bpkg // then the selected one, then what we currently have is the best that // we can get. Thus, we use the selected version as a replacement, // unless it doesn't satisfy all the constraints or we are deorphaning. + // Bail out if we cannot stay with the selected version and downgrade is + // not allowed. // if (constraint == nullptr && sp != nullptr) { const version& sv (sp->version); - if (av < sv && !sp->system () && !p.deorphan) + if (av < sv && !p.deorphan) { - // Only consider the selected package if its version is satisfactory - // for its new dependents (note: must be checked first since has a - // byproduct), differs from the version being replaced, and was - // never used for the same command line (see above for details). + // Only consider to keep the selected non-system package if its + // version is satisfactory for its new dependents (note: must be + // checked first since has a byproduct), differs from the version + // being replaced, and was never used for the same command line (see + // above for details). // - if (satisfactory (sv) && sv != ver) + if (!sp->system () && satisfactory (sv) && sv != ver) { if (!cmdline_adjs.tried_earlier (db, nm, sv)) { @@ -2493,9 +2499,17 @@ namespace bpkg } else l5 ([&]{trace << "selected package replacement " - << package_version_key (db, nm, sp->version) - << " tried earlier for same command line, " - << "skipping";}); + << package_version_key (db, nm, sv) << " tried " + << "earlier for same command line, skipping";}); + } + + if (!allow_downgrade) + { + l5 ([&]{trace << "downgrade for " + << package_version_key (db, nm, sv) << " is not " + << "allowed, bailing out";}); + + break; } } } @@ -2693,11 +2707,12 @@ namespace bpkg // of the specified dependency with a different available version, // satisfactory for all its new and existing dependents (if any). Return the // command line adjustment if such a replacement is deduced and nullopt - // otherwise. It is assumed that the dependency replacement has been - // (unsuccessfully) tried by using the try_replace_dependency() call and its - // resulting list of the dependents, unsatisfied by some of the dependency - // available versions, is also passed to the function call as the - // unsatisfied_dpts argument. + // otherwise. If allow_downgrade is false, then don't return a downgrade + // adjustment, except for a being deorphaned dependent. It is assumed that + // the dependency replacement has been (unsuccessfully) tried by using the + // try_replace_dependency() call and its resulting list of the dependents, + // unsatisfied by some of the dependency available versions, is also passed + // to the function call as the unsatisfied_dpts argument. // // Specifically, try to replace the dependents in the following order by // calling try_replace_dependency() for them: @@ -2723,9 +2738,10 @@ namespace bpkg // - Dependents of all the above types of dependents, discovered by // recursively calling try_replace_dependent() for them. // - optional + static optional try_replace_dependent (const common_options& o, const build_package& p, // Dependency. + bool allow_downgrade, const vector* ucs, const build_packages& pkgs, const cmdline_adjustments& cmdline_adjs, @@ -2758,6 +2774,7 @@ namespace bpkg // auto try_replace = [&o, &p, + allow_downgrade, &pkgs, &cmdline_adjs, &hold_pkgs, @@ -2793,6 +2810,7 @@ namespace bpkg if (optional a = try_replace_dependency ( o, *d, + allow_downgrade, pkgs, hold_pkgs, dep_pkgs, @@ -2816,7 +2834,7 @@ namespace bpkg { const package_version_key& dvk (c.dependent); - if (dvk.version && !c.selected_dependent && !satisfies (av, c.value)) + if (dvk.version && !c.existing_dependent && !satisfies (av, c.value)) { if (optional a = try_replace ( package_key (dvk.db, dvk.name), "unsatisfied dependent")) @@ -2851,7 +2869,7 @@ namespace bpkg { const package_version_key& dvk (c1.dependent); - if (dvk.version && !c1.selected_dependent) + if (dvk.version && !c1.existing_dependent) { const version_constraint& v1 (c1.value); @@ -2900,6 +2918,7 @@ namespace bpkg if (optional a = try_replace_dependent ( o, *d, + allow_downgrade, nullptr /* unsatisfied_constraints */, pkgs, cmdline_adjs, @@ -4298,6 +4317,14 @@ namespace bpkg optional cmdline_refine_adjustment; optional cmdline_refine_index; + // If an --upgrade* or --patch* option is used on the command line, then + // we try to avoid any package downgrades initially. However, if the + // resolution fails in this mode, we fall back to allowing such + // downgrades. Without this logic, we may end up downgrading one package + // in order to upgrade another, which would be incorrect. + // + bool cmdline_allow_downgrade (true); + { // Check if the package is a duplicate. Return true if it is but // harmless. @@ -4843,9 +4870,14 @@ namespace bpkg // configuration. // if (pdb != nullptr) + { + if (u) + cmdline_allow_downgrade = false; + rec_pkgs.push_back (recursive_package {*pdb, pa.name, r, u && *u, d}); + } } } @@ -4901,6 +4933,10 @@ namespace bpkg bool hold_version (pa.constraint.has_value ()); + optional upgrade (pa.options.upgrade () || pa.options.patch () + ? pa.options.upgrade () + : optional ()); + dep_pkgs.push_back ( dependency_package {pdb, move (pa.name), @@ -4909,9 +4945,7 @@ namespace bpkg move (sp), sys, existing, - (pa.options.upgrade () || pa.options.patch () - ? pa.options.upgrade () - : optional ()), + upgrade, pa.options.deorphan (), pa.options.keep_out (), pa.options.disfigure (), @@ -4921,6 +4955,10 @@ namespace bpkg pa.options.checkout_purge (), move (pa.config_vars), pa.system_status}); + + if (upgrade) + cmdline_allow_downgrade = false; + continue; } @@ -5154,6 +5192,9 @@ namespace bpkg pkg_confs.emplace_back (p.db, p.name ()); + if (p.upgrade) + cmdline_allow_downgrade = false; + hold_pkgs.push_back (move (p)); } @@ -5279,6 +5320,9 @@ namespace bpkg l4 ([&]{trace << "stash held package " << p.available_name_version_db ();}); + if (p.upgrade) + cmdline_allow_downgrade = false; + hold_pkgs.push_back (move (p)); // If there are also -i|-r, then we are also upgrading and/or @@ -7022,6 +7066,7 @@ namespace bpkg if ((a = try_replace_dependency (o, *p, + cmdline_allow_downgrade, pkgs, hold_pkgs, dep_pkgs, @@ -7030,6 +7075,7 @@ namespace bpkg "unsatisfactory dependency")) || (a = try_replace_dependent (o, *p, + cmdline_allow_downgrade, &ic.unsatisfied_constraints, pkgs, cmdline_adjs, @@ -7055,7 +7101,27 @@ namespace bpkg prepare_recollect (); } else - unsatisfied_depts.diag (pkgs); // Issue the diagnostics and fail. + { + // If we fail to resolve the unsatisfied dependency + // constraints with the downgrades disallowed, then allow + // downgrades and retry from the very beginning. + // + if (!cmdline_allow_downgrade) + { + l5 ([&]{trace << "cannot resolve unsatisfied dependency " + << "constraints, now allowing downgrades";}); + + cmdline_allow_downgrade = true; + + prepare_recollect (); + } + else + { + // Issue the diagnostics and fail. + // + unsatisfied_depts.diag (pkgs); + } + } } else // We are in the command line adjustments refinement cycle. { diff --git a/tests/pkg-build.testscript b/tests/pkg-build.testscript index 9d19846..9326541 100644 --- a/tests/pkg-build.testscript +++ b/tests/pkg-build.testscript @@ -2369,8 +2369,8 @@ test.arguments += --sys-no-query trace: execute_plan: simulate: yes %.* trace: pkg_build: try to replace unsatisfactory dependency libbar/2.0.0 with some other version - trace: try_replace_dependent: try to replace unsatisfiable dependent libbaz/2.0.0 of dependency libbar/2.0.0 with some other version - trace: try_replace_dependency: replace unsatisfiable dependent version libbaz/2.0.0 with 1.0.0 by adding constraint '?libbaz' -> '?libbaz == 1.0.0' on command line + trace: try_replace_dependent: try to replace unsatisfied dependent libbaz/2.0.0 of dependency libbar/2.0.0 with some other version + trace: try_replace_dependency: replace unsatisfied dependent version libbaz/2.0.0 with 1.0.0 by adding constraint '?libbaz' -> '?libbaz == 1.0.0' on command line trace: pkg_build: refine package collection/plan execution from scratch trace: execute_plan: simulate: yes %.* @@ -2584,8 +2584,8 @@ test.arguments += --sys-no-query trace: execute_plan: simulate: yes %.* trace: pkg_build: try to replace unsatisfactory dependency libbar/2.0.0 with some other version - trace: try_replace_dependent: try to replace unsatisfiable dependent libbaz/2.0.0 of dependency libbar/2.0.0 with some other version - trace: try_replace_dependency: replace unsatisfiable dependent version libbaz/2.0.0 with 1.0.0 by adding constraint '?libbaz' -> '?libbaz == 1.0.0' on command line + trace: try_replace_dependent: try to replace unsatisfied dependent libbaz/2.0.0 of dependency libbar/2.0.0 with some other version + trace: try_replace_dependency: replace unsatisfied dependent version libbaz/2.0.0 with 1.0.0 by adding constraint '?libbaz' -> '?libbaz == 1.0.0' on command line trace: pkg_build: refine package collection/plan execution from scratch trace: collect_build: add foo/1.0.0 trace: collect_build_prerequisites: skip configured foo/1.0.0 @@ -2663,8 +2663,8 @@ test.arguments += --sys-no-query trace: execute_plan: simulate: yes %.* trace: pkg_build: try to replace unsatisfactory dependency libbar/2.0.0 with some other version - trace: try_replace_dependent: try to replace unsatisfiable dependent libbaz/2.0.0 of dependency libbar/2.0.0 with some other version - trace: try_replace_dependency: replace unsatisfiable dependent version libbaz/2.0.0 with 1.0.0 by adding constraint '?libbaz' -> '?libbaz == 1.0.0' on command line + trace: try_replace_dependent: try to replace unsatisfied dependent libbaz/2.0.0 of dependency libbar/2.0.0 with some other version + trace: try_replace_dependency: replace unsatisfied dependent version libbaz/2.0.0 with 1.0.0 by adding constraint '?libbaz' -> '?libbaz == 1.0.0' on command line trace: pkg_build: refine package collection/plan execution from scratch trace: collect_build: add foo/1.0.0 trace: collect_build_prerequisites: skip configured foo/1.0.0 @@ -5217,7 +5217,7 @@ test.arguments += --sys-no-query $pkg_drop libfoo libfox } - : unsatisfied-dependent + : unsatisfied-dependent-noop : : This test demonstrates a case when the dependency resolution : machinery resolves unsatisfied dependency constraints by @@ -5231,6 +5231,16 @@ test.arguments += --sys-no-query { $clone_cfg; + # Dependencies: + # + # libbox/2.0.0: depends: libbax == 1.0.0 + # libbox/1.0.0: depends: libbax + # + # libbix/1.0.0: depends: libbax == 1.0.0 + # libbix/2.0.0: depends: libbax == 2.0.0 + # + # libbux: depends: libbix + # $* libbox ?libbix/1.0.0 libbux 2>!; $pkg_status -ar >>EOO; @@ -5272,8 +5282,10 @@ test.arguments += --sys-no-query trace: execute_plan: simulate: yes %.* trace: pkg_build: try to replace unsatisfactory dependency libbax/2.0.0 with some other version - trace: try_replace_dependent: try to replace unsatisfiable dependent libbix/2.0.0 of dependency libbax/2.0.0 with some other version - trace: try_replace_dependency: replace unsatisfiable dependent version libbix/2.0.0 with 1.0.0 by adding package spec '?libbix == 1.0.0' to command line + trace: try_replace_dependent: try to replace unsatisfied dependent libbox/2.0.0 of dependency libbax/2.0.0 with some other version + trace: try_replace_dependency: downgrade for libbox/2.0.0 is not allowed, bailing out + trace: try_replace_dependent: try to replace unsatisfied dependent libbix/2.0.0 of dependency libbax/2.0.0 with some other version + trace: try_replace_dependency: replace unsatisfied dependent version libbix/2.0.0 with 1.0.0 by adding package spec '?libbix == 1.0.0' to command line trace: pkg_build: refine package collection/plan execution from scratch trace: collect_build: add libbox/2.0.0 trace: collect_build: add libbux/1.0.0 @@ -5299,6 +5311,144 @@ test.arguments += --sys-no-query $pkg_drop libbox libbux } + : unsatisfied-dependent + : + : Similar to the above, but this time noop is not a valid constraints + : resolution due to ?libbix/2.0.0. Thus, the dependency resolution + : machinery ends up with the downgrade of libbox/2.0.0 to 1.0.0. + : + { + $clone_cfg; + + $* libbox ?libbix/1.0.0 libbux 2>!; + + $pkg_status -ar >>EOO; + libbax configured 1.0.0 available 2.0.0 + !libbox configured 2.0.0 + libbax configured 1.0.0 available 2.0.0 + libbix configured !1.0.0 available 2.0.0 + libbax configured 1.0.0 available 2.0.0 + !libbux configured 1.0.0 + libbix configured !1.0.0 available 2.0.0 + libbax configured 1.0.0 available 2.0.0 + EOO + + $* { libbox libbux ?libbax } +{ --upgrade --recursive } ?libbix/2.0.0 2>>~%EOE%; + %.* + trace: pkg_build: refine package collection/plan execution from scratch + trace: collect_build: add libbox/2.0.0 + trace: collect_build: add libbux/1.0.0 + trace: collect_build_prerequisites: skip configured libbox/2.0.0 + trace: collect_build_prerequisites: skip configured libbux/1.0.0 + trace: execute_plan: simulate: yes + %.* + trace: evaluate_dependency: libbix/1.0.0: update to libbix/2.0.0 + %.* + trace: pkg_build: refine package collection/plan execution + trace: collect_build_prerequisites: pre-reeval libbux/1.0.0 + trace: collect_build_prerequisites: pre-reevaluated libbux/1.0.0: end reached + trace: collect_build_prerequisites: begin libbix/2.0.0 + trace: collect_build_prerequisites: no cfg-clause for dependency libbax/2.0.0 of dependent libbix/2.0.0 + trace: collect_build_prerequisites: skip unsatisfied existing dependent libbox of dependency libbax/2.0.0 due to constraint (libbax == 1.0.0) + trace: collect_build_prerequisites: skip being built existing dependent libbix of dependency libbax + trace: collect_build_prerequisites: begin libbax/2.0.0 + trace: collect_build_prerequisites: end libbax/2.0.0 + trace: collect_build_prerequisites: end libbix/2.0.0 + trace: collect_dependents: postpone failure for existing dependent libbox unsatisfied with dependency libbax/2.0.0 (== 1.0.0) + trace: execute_plan: simulate: yes + %.* + trace: pkg_build: try to replace unsatisfactory dependency libbax/2.0.0 with some other version + trace: try_replace_dependent: try to replace unsatisfied dependent libbox/2.0.0 of dependency libbax/2.0.0 with some other version + trace: try_replace_dependency: downgrade for libbox/2.0.0 is not allowed, bailing out + trace: try_replace_dependent: try to replace unsatisfied dependent libbix/2.0.0 of dependency libbax/2.0.0 with some other version + trace: try_replace_dependency: replacement of unsatisfied dependent version libbix/2.0.0 is denied since it is specified on command line as '?libbix == 2.0.0' + trace: pkg_build: cannot resolve unsatisfied dependency constraints, now allowing downgrades + trace: pkg_build: refine package collection/plan execution from scratch + trace: collect_build: add libbox/2.0.0 + trace: collect_build: add libbux/1.0.0 + trace: collect_build_prerequisites: skip configured libbox/2.0.0 + trace: collect_build_prerequisites: skip configured libbux/1.0.0 + trace: execute_plan: simulate: yes + %.* + trace: evaluate_dependency: libbix/1.0.0: update to libbix/2.0.0 + %.* + trace: pkg_build: refine package collection/plan execution + trace: collect_build_prerequisites: pre-reeval libbux/1.0.0 + trace: collect_build_prerequisites: pre-reevaluated libbux/1.0.0: end reached + trace: collect_build_prerequisites: begin libbix/2.0.0 + trace: collect_build_prerequisites: no cfg-clause for dependency libbax/2.0.0 of dependent libbix/2.0.0 + trace: collect_build_prerequisites: skip unsatisfied existing dependent libbox of dependency libbax/2.0.0 due to constraint (libbax == 1.0.0) + trace: collect_build_prerequisites: skip being built existing dependent libbix of dependency libbax + trace: collect_build_prerequisites: begin libbax/2.0.0 + trace: collect_build_prerequisites: end libbax/2.0.0 + trace: collect_build_prerequisites: end libbix/2.0.0 + trace: collect_dependents: postpone failure for existing dependent libbox unsatisfied with dependency libbax/2.0.0 (== 1.0.0) + trace: execute_plan: simulate: yes + %.* + trace: pkg_build: try to replace unsatisfactory dependency libbax/2.0.0 with some other version + trace: try_replace_dependent: try to replace unsatisfied dependent libbox/2.0.0 of dependency libbax/2.0.0 with some other version + trace: try_replace_dependency: replace unsatisfied dependent version libbox/2.0.0 with 1.0.0 by adding constraint 'libbox' -> 'libbox == 1.0.0' on command line + trace: pkg_build: refine package collection/plan execution from scratch + trace: collect_build: add libbox/1.0.0 + trace: collect_build: add libbux/1.0.0 + trace: collect_build_prerequisites: begin libbox/1.0.0 + trace: collect_build_prerequisites: no cfg-clause for dependency libbax/1.0.0 of dependent libbox/1.0.0 + trace: collect_build_prerequisites: skip configured libbax/1.0.0 + trace: collect_build_prerequisites: end libbox/1.0.0 + trace: collect_build_prerequisites: skip configured libbux/1.0.0 + trace: execute_plan: simulate: yes + %.* + trace: evaluate_dependency: libbix/1.0.0: update to libbix/2.0.0 + %.* + trace: pkg_build: refine package collection/plan execution + trace: collect_build_prerequisites: pre-reeval libbux/1.0.0 + trace: collect_build_prerequisites: pre-reevaluated libbux/1.0.0: end reached + trace: collect_build_prerequisites: begin libbix/2.0.0 + trace: collect_build: pick libbax/2.0.0 over libbax/1.0.0 + trace: collect_build: libbax/1.0.0 package version needs to be replaced with libbax/2.0.0 + trace: pkg_build: collection failed due to package version replacement, retry from scratch + trace: pkg_build: refine package collection/plan execution from scratch + trace: collect_build: add libbox/1.0.0 + trace: collect_build: add libbux/1.0.0 + trace: collect_build_prerequisites: begin libbox/1.0.0 + trace: collect_build: apply version replacement for libbax/1.0.0 + trace: collect_build: replacement: libbax/2.0.0 + trace: collect_build_prerequisites: no cfg-clause for dependency libbax/2.0.0 of dependent libbox/1.0.0 + trace: collect_build_prerequisites: skip being built existing dependent libbox of dependency libbax + trace: collect_build_prerequisites: skip unsatisfied existing dependent libbix of dependency libbax/2.0.0 due to constraint (libbax == 1.0.0) + trace: collect_build_prerequisites: begin libbax/2.0.0 + trace: collect_build_prerequisites: end libbax/2.0.0 + trace: collect_build_prerequisites: end libbox/1.0.0 + trace: collect_build_prerequisites: skip configured libbux/1.0.0 + trace: collect_build_prerequisites: pre-reeval libbux/1.0.0 + trace: collect_build_prerequisites: pre-reevaluated libbux/1.0.0: end reached + trace: collect_build_prerequisites: begin libbix/2.0.0 + trace: collect_build_prerequisites: no cfg-clause for dependency libbax/2.0.0 of dependent libbix/2.0.0 + trace: collect_build_prerequisites: end libbix/2.0.0 + trace: execute_plan: simulate: yes + %.* + upgrade libbax/2.0.0 + downgrade libbox/1.0.0 + upgrade libbix/2.0.0 + reconfigure libbux/1.0.0 + trace: execute_plan: simulate: no + %.* + EOE + + $pkg_status -ar >>EOO; + libbax configured 2.0.0 + !libbox configured 1.0.0 available 2.0.0 + libbax configured 2.0.0 + libbix configured !2.0.0 + libbax configured 2.0.0 + !libbux configured 1.0.0 + libbix configured !2.0.0 + libbax configured 2.0.0 + EOO + + $pkg_drop libbox libbux + } + : indirect : : Test replacement of indirect dependents of an unsatisfactory -- cgit v1.1