aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2024-05-30 15:02:50 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2024-06-03 13:22:31 +0300
commite75248e863896a63785deaa7383451492f9f7802 (patch)
tree930a93e06e46e31f2f46e45b297a8649fad1e38d
parente3932d2f6db820b733462cb7eb2c8e28dc1f625e (diff)
Improve dependency resolution (GH issue 318)
-rw-r--r--bpkg/pkg-build-collect.cxx29
-rw-r--r--bpkg/pkg-build-collect.hxx16
-rw-r--r--bpkg/pkg-build.cxx112
-rw-r--r--tests/pkg-build.testscript168
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<package_key>& printed,
- optional<bool> selected_dependent) const
+ optional<bool> 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<package_key>& printed,
- optional<bool> selected_dependent) const
+ optional<bool> 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<constraint_type> 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<package_key>& printed,
- optional<bool> selected_dependent = nullopt) const;
+ optional<bool> existing_dependent = nullopt) const;
void
print_constraints (diag_record&,
const package_key&,
string& indent,
std::set<package_key>& printed,
- optional<bool> selected_dependent = nullopt) const;
+ optional<bool> 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<cmdline_adjustment>
+ static optional<cmdline_adjustment>
try_replace_dependency (const common_options& o,
const build_package& p,
+ bool allow_downgrade,
const build_packages& pkgs,
const vector<build_package>& 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<cmdline_adjustment>
+ static optional<cmdline_adjustment>
try_replace_dependent (const common_options& o,
const build_package& p, // Dependency.
+ bool allow_downgrade,
const vector<unsatisfied_constraint>* 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<cmdline_adjustment> 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<cmdline_adjustment> 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<cmdline_adjustment> a = try_replace_dependent (
o,
*d,
+ allow_downgrade,
nullptr /* unsatisfied_constraints */,
pkgs,
cmdline_adjs,
@@ -4298,6 +4317,14 @@ namespace bpkg
optional<cmdline_adjustment> cmdline_refine_adjustment;
optional<size_t> 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<bool> upgrade (pa.options.upgrade () || pa.options.patch ()
+ ? pa.options.upgrade ()
+ : optional<bool> ());
+
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<bool> ()),
+ 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