|
@@ -156,7 +156,25 @@ private void manifest_usage() {
|
|
|
* wins); when no group is viable an itemised per-group report is printed.
|
|
* wins); when no group is viable an itemised per-group report is printed.
|
|
|
* Returns false when the phase's requirements are unmet.
|
|
* Returns false when the phase's requirements are unmet.
|
|
|
*/
|
|
*/
|
|
|
-private bool phase_dependencies_satisfied(Usm.DependencyPhase? phase, string label, Usm.ResourceFinder finder) {
|
|
|
|
|
|
|
+/**
|
|
|
|
|
+ * Whether `resource` is present for a dependency phase: `finder`
|
|
|
|
|
+ * first, then the system-rooted {@link resfinder} when given as a
|
|
|
|
|
+ * fallback. The fallback serves the RUNTIME phase under a
|
|
|
|
|
+ * `USM_DESTDIR` staging install: the destination root is later merged
|
|
|
|
|
+ * into a system that already carries these (usmrad slots — git, the
|
|
|
|
|
+ * ssh clients and usm itself live in the container image, never in
|
|
|
|
|
+ * the slot), and without the fallback every system-present runtime
|
|
|
|
|
+ * dependency of a staged manifest fails as "missing" no matter what
|
|
|
|
|
+ * is installed.
|
|
|
|
|
+ */
|
|
|
|
|
+private bool phase_resource_present(Usm.ResourceRef resource, Usm.ResourceFinder finder, Usm.ResourceFinder? fallback) {
|
|
|
|
|
+ if(finder.has_resource(resource)) {
|
|
|
|
|
+ return true;
|
|
|
|
|
+ }
|
|
|
|
|
+ return fallback != null && ((!)fallback).has_resource(resource);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+private bool phase_dependencies_satisfied(Usm.DependencyPhase? phase, string label, Usm.ResourceFinder finder, Usm.ResourceFinder? fallback = null) {
|
|
|
if(phase == null) {
|
|
if(phase == null) {
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
@@ -164,7 +182,7 @@ private bool phase_dependencies_satisfied(Usm.DependencyPhase? phase, string lab
|
|
|
if(!phase.is_grouped) {
|
|
if(!phase.is_grouped) {
|
|
|
var sane = true;
|
|
var sane = true;
|
|
|
foreach(var resource in phase.ordered_required()) {
|
|
foreach(var resource in phase.ordered_required()) {
|
|
|
- if(!finder.has_resource(resource)) {
|
|
|
|
|
|
|
+ if(!phase_resource_present(resource, finder, fallback)) {
|
|
|
printerr(@"Missing $label dependency \"$resource\".\n");
|
|
printerr(@"Missing $label dependency \"$resource\".\n");
|
|
|
sane = false;
|
|
sane = false;
|
|
|
}
|
|
}
|
|
@@ -174,7 +192,7 @@ private bool phase_dependencies_satisfied(Usm.DependencyPhase? phase, string lab
|
|
|
|
|
|
|
|
var groups = phase.ordered_groups();
|
|
var groups = phase.ordered_groups();
|
|
|
foreach(var group in groups) {
|
|
foreach(var group in groups) {
|
|
|
- var missing = group.where(r => !finder.has_resource(r)).to_vector();
|
|
|
|
|
|
|
+ var missing = group.where(r => !phase_resource_present(r, finder, fallback)).to_vector();
|
|
|
if(missing.length == 0) {
|
|
if(missing.length == 0) {
|
|
|
return true;
|
|
return true;
|
|
|
}
|
|
}
|
|
@@ -183,7 +201,7 @@ private bool phase_dependencies_satisfied(Usm.DependencyPhase? phase, string lab
|
|
|
printerr(@"No viable $label dependency group:\n");
|
|
printerr(@"No viable $label dependency group:\n");
|
|
|
for(uint index = 0; index < groups.length; index++) {
|
|
for(uint index = 0; index < groups.length; index++) {
|
|
|
printerr(@" Group $(index + 1) ($(groups[index].to_string(r => r.to_string(), ", "))):\n");
|
|
printerr(@" Group $(index + 1) ($(groups[index].to_string(r => r.to_string(), ", "))):\n");
|
|
|
- foreach(var resource in groups[index].where(r => !finder.has_resource(r))) {
|
|
|
|
|
|
|
+ foreach(var resource in groups[index].where(r => !phase_resource_present(r, finder, fallback))) {
|
|
|
printerr(@" Missing $label dependency \"$resource\".\n");
|
|
printerr(@" Missing $label dependency \"$resource\".\n");
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
@@ -459,7 +477,7 @@ private int install() {
|
|
|
|
|
|
|
|
var sane = phase_dependencies_satisfied(manifest.dependencies.manage, "management", resfinder) &
|
|
var sane = phase_dependencies_satisfied(manifest.dependencies.manage, "management", resfinder) &
|
|
|
phase_dependencies_satisfied(manifest.dependencies.build, "build", resfinder) &
|
|
phase_dependencies_satisfied(manifest.dependencies.build, "build", resfinder) &
|
|
|
- phase_dependencies_satisfied(manifest.dependencies.runtime, "runtime", destresfinder);
|
|
|
|
|
|
|
+ phase_dependencies_satisfied(manifest.dependencies.runtime, "runtime", destresfinder, resfinder);
|
|
|
|
|
|
|
|
// Missing dependencies may be installable from the system package
|
|
// Missing dependencies may be installable from the system package
|
|
|
// manager or USM repositories; on a completed offer the checks
|
|
// manager or USM repositories; on a completed offer the checks
|
|
@@ -467,7 +485,7 @@ private int install() {
|
|
|
if(!sane && offer_missing_dependencies(manifest)) {
|
|
if(!sane && offer_missing_dependencies(manifest)) {
|
|
|
sane = phase_dependencies_satisfied(manifest.dependencies.manage, "management", resfinder) &
|
|
sane = phase_dependencies_satisfied(manifest.dependencies.manage, "management", resfinder) &
|
|
|
phase_dependencies_satisfied(manifest.dependencies.build, "build", resfinder) &
|
|
phase_dependencies_satisfied(manifest.dependencies.build, "build", resfinder) &
|
|
|
- phase_dependencies_satisfied(manifest.dependencies.runtime, "runtime", destresfinder);
|
|
|
|
|
|
|
+ phase_dependencies_satisfied(manifest.dependencies.runtime, "runtime", destresfinder, resfinder);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if(!sane) {
|
|
if(!sane) {
|
|
@@ -539,12 +557,12 @@ private int install() {
|
|
|
* tree to its suggested path, with no build or install staging involved.
|
|
* tree to its suggested path, with no build or install staging involved.
|
|
|
*/
|
|
*/
|
|
|
private int install_data_package() {
|
|
private int install_data_package() {
|
|
|
- var sane = phase_dependencies_satisfied(manifest.dependencies.runtime, "runtime", destresfinder);
|
|
|
|
|
|
|
+ var sane = phase_dependencies_satisfied(manifest.dependencies.runtime, "runtime", destresfinder, resfinder);
|
|
|
|
|
|
|
|
// The same offer path the regular install uses: runtime deps may be
|
|
// The same offer path the regular install uses: runtime deps may be
|
|
|
// installable from the system package manager or USM repositories
|
|
// installable from the system package manager or USM repositories
|
|
|
if(!sane && offer_missing_dependencies(manifest)) {
|
|
if(!sane && offer_missing_dependencies(manifest)) {
|
|
|
- sane = phase_dependencies_satisfied(manifest.dependencies.runtime, "runtime", destresfinder);
|
|
|
|
|
|
|
+ sane = phase_dependencies_satisfied(manifest.dependencies.runtime, "runtime", destresfinder, resfinder);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if(!sane) {
|
|
if(!sane) {
|
|
@@ -742,7 +760,7 @@ private int autoprovides() {
|
|
|
|
|
|
|
|
var sane = phase_dependencies_satisfied(manifest.dependencies.manage, "management", resfinder) &
|
|
var sane = phase_dependencies_satisfied(manifest.dependencies.manage, "management", resfinder) &
|
|
|
phase_dependencies_satisfied(manifest.dependencies.build, "build", resfinder) &
|
|
phase_dependencies_satisfied(manifest.dependencies.build, "build", resfinder) &
|
|
|
- phase_dependencies_satisfied(manifest.dependencies.runtime, "runtime", destresfinder);
|
|
|
|
|
|
|
+ phase_dependencies_satisfied(manifest.dependencies.runtime, "runtime", destresfinder, resfinder);
|
|
|
|
|
|
|
|
if(!sane) {
|
|
if(!sane) {
|
|
|
printerr("Could not install manifest, missing dependencies\n");
|
|
printerr("Could not install manifest, missing dependencies\n");
|
|
@@ -1125,7 +1143,7 @@ private int validate() {
|
|
|
|
|
|
|
|
var sane = phase_dependencies_satisfied(manifest.dependencies.manage, "management", resfinder) &
|
|
var sane = phase_dependencies_satisfied(manifest.dependencies.manage, "management", resfinder) &
|
|
|
phase_dependencies_satisfied(manifest.dependencies.build, "build", resfinder) &
|
|
phase_dependencies_satisfied(manifest.dependencies.build, "build", resfinder) &
|
|
|
- phase_dependencies_satisfied(manifest.dependencies.runtime, "runtime", destresfinder);
|
|
|
|
|
|
|
+ phase_dependencies_satisfied(manifest.dependencies.runtime, "runtime", destresfinder, resfinder);
|
|
|
|
|
|
|
|
if(!sane) {
|
|
if(!sane) {
|
|
|
printerr("Could not validate manifest, missing dependencies\n");
|
|
printerr("Could not validate manifest, missing dependencies\n");
|