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.cxx153
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.