diff options
Diffstat (limited to 'bpkg/pkg-build-collect.cxx')
-rw-r--r-- | bpkg/pkg-build-collect.cxx | 153 |
1 files changed, 88 insertions, 65 deletions
diff --git a/bpkg/pkg-build-collect.cxx b/bpkg/pkg-build-collect.cxx index 6f1195c..e99557a 100644 --- a/bpkg/pkg-build-collect.cxx +++ b/bpkg/pkg-build-collect.cxx @@ -1490,78 +1490,87 @@ namespace bpkg // applied. Ignore the replacement if its version doesn't satisfy the // dependency constraints specified by the caller. Also ignore if this is // a drop and the required-by package names of the specified build package - // object have the "required by dependents" semantics + // object have the "required by dependents" semantics. // auto vi (replaced_vers.find (pk)); + const version* replacement_version (nullptr); - if (vi != replaced_vers.end () && !vi->second.replaced) + if (vi != replaced_vers.end ()) { - l5 ([&]{trace << "apply version replacement for " - << pkg.available_name_version_db ();}); - replaced_version& v (vi->second); if (v.available != nullptr) + replacement_version = (v.system + ? v.available->system_version (pk.db) + : &v.available->version); + + if (!vi->second.replaced) { - const version& rv (v.system - ? *v.available->system_version (pk.db) - : v.available->version); + l5 ([&]{trace << "apply version replacement for " + << pkg.available_name_version_db ();}); - bool replace (true); - for (const constraint_type& c: pkg.constraints) + if (v.available != nullptr) { - if (!satisfies (rv, c.value)) + assert (replacement_version != nullptr); + + const version& rv (*replacement_version); + + bool replace (true); + for (const constraint_type& c: pkg.constraints) { - replace = false; + if (!satisfies (rv, c.value)) + { + replace = false; - l5 ([&]{trace << "replacement to " << rv << " is denied since " - << c.dependent << " depends on (" << pk.name << ' ' - << c.value << ')';}); + l5 ([&]{trace << "replacement to " << rv << " is denied since " + << c.dependent << " depends on (" << pk.name << ' ' + << c.value << ')';}); + } } - } - if (replace) - { - v.replaced = true; + if (replace) + { + v.replaced = true; - pkg.available = v.available; - pkg.repository_fragment = v.repository_fragment; - pkg.system = v.system; + pkg.available = v.available; + pkg.repository_fragment = v.repository_fragment; + pkg.system = v.system; - l5 ([&]{trace << "replacement: " - << pkg.available_name_version_db ();}); + l5 ([&]{trace << "replacement: " + << pkg.available_name_version_db ();}); + } } - } - else - { - if (!pkg.required_by_dependents) + else { - v.replaced = true; + if (!pkg.required_by_dependents) + { + v.replaced = true; - l5 ([&]{trace << "replacement: drop";}); + l5 ([&]{trace << "replacement: drop";}); - // We shouldn't be replacing a package build with the drop if someone - // depends on this package. - // - assert (pkg.selected != nullptr); + // We shouldn't be replacing a package build with the drop if someone + // depends on this package. + // + assert (pkg.selected != nullptr); - collect_drop (options, pkg.db, pkg.selected, replaced_vers); - return nullptr; - } - else - { - assert (!pkg.required_by.empty ()); + collect_drop (options, pkg.db, pkg.selected, replaced_vers); + return nullptr; + } + else + { + assert (!pkg.required_by.empty ()); - l5 ([&] - { - diag_record dr (trace); - dr << "replacement to drop is denied since " << pk - << " is required by "; - for (auto b (pkg.required_by.begin ()), i (b); - i != pkg.required_by.end (); - ++i) - dr << (i != b ? ", " : "") << *i; - }); + l5 ([&] + { + diag_record dr (trace); + dr << "replacement to drop is denied since " << pk + << " is required by "; + for (auto b (pkg.required_by.begin ()), i (b); + i != pkg.required_by.end (); + ++i) + dr << (i != b ? ", " : "") << *i; + }); + } } } } @@ -1629,19 +1638,28 @@ namespace bpkg build_package* p2 (&pkg); // Pick with the following preference order: user selection over - // implicit one, source package over a system one, newer version over - // an older one. So get the preferred into p1 and the other into p2. + // implicit one, source package over a system one, replacement version + // over a non-replacement one, newer version over an older one. So get + // the preferred into p1 and the other into p2. // { + const version& v1 (p1->available_version ()); + const version& v2 (p2->available_version ()); + int us (p1->user_selection () - p2->user_selection ()); int sf (p1->system - p2->system); + int rv (replacement_version != nullptr + ? (v1 == *replacement_version) - (v2 == *replacement_version) + : 0); if (us < 0 || (us == 0 && sf > 0) || (us == 0 && sf == 0 && - p2->available_version () > p1->available_version ())) + (rv < 0 || (rv == 0 && v2 > v1)))) + { swap (p1, p2); + } } // If the versions differ, pick the satisfactory one and if both are @@ -3349,7 +3367,7 @@ namespace bpkg pdb, nm, pkg.available_version (), - false /* selected_dependent */); + false /* existing_dependent */); if (!satisfies (v2, c1.value)) { @@ -3522,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 @@ -7490,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) @@ -7539,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; @@ -7555,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)) { @@ -7564,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 @@ -7577,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; @@ -7593,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:: @@ -7964,7 +7987,7 @@ namespace bpkg dpt.db, dpt.name, *dpt.version, - true /* selected_package */); + true /* existing_package */); } // Note: not recursive. |