aboutsummaryrefslogtreecommitdiff
path: root/bpkg/pkg-build-collect.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'bpkg/pkg-build-collect.cxx')
-rw-r--r--bpkg/pkg-build-collect.cxx71
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.