diff options
Diffstat (limited to 'bpkg/pkg-build-collect.cxx')
-rw-r--r-- | bpkg/pkg-build-collect.cxx | 71 |
1 files changed, 42 insertions, 29 deletions
diff --git a/bpkg/pkg-build-collect.cxx b/bpkg/pkg-build-collect.cxx index 5073ecd..c7be96a 100644 --- a/bpkg/pkg-build-collect.cxx +++ b/bpkg/pkg-build-collect.cxx @@ -1639,27 +1639,35 @@ namespace bpkg // Pick with the following preference order: user selection over // 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. + // over a non-replacement one, deorphaning target version over the + // other 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 && - (rv < 0 || - (rv == 0 && v2 > v1)))) + auto prefer_p2 = [p1, p2, replacement_version] () { + const version& v1 (p1->available_version ()); + const version& v2 (p2->available_version ()); + + if (int us = p1->user_selection () - p2->user_selection ()) + return us < 0; + + if (int sf = p1->system - p2->system) + return sf > 0; + + if (int rv = replacement_version != nullptr + ? (v1 == *replacement_version) - (v2 == *replacement_version) + : 0) + return rv < 0; + + if (int d = p1->deorphan - p2->deorphan) + return d < 0; + + return v2 > v1; + }; + + if (prefer_p2 ()) swap (p1, p2); - } } // If the versions differ, pick the satisfactory one and if both are @@ -3367,7 +3375,7 @@ namespace bpkg pdb, nm, pkg.available_version (), - false /* selected_dependent */); + false /* existing_dependent */); if (!satisfies (v2, c1.value)) { @@ -3540,7 +3548,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 +7516,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 +7570,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 +7586,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 +7595,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 +7608,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 +7624,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 +7995,7 @@ namespace bpkg dpt.db, dpt.name, *dpt.version, - true /* selected_package */); + true /* existing_package */); } // Note: not recursive. |