Kaynağa Gözat

Runtime dependency checks under a staging DESTDIR see the host system too

usm manifest install checks the runtime phase against a finder rooted
at USM_DESTDIR — correct for a portable image root, but usmrad's slots
are prefixes merged into a running system whose git, ssh clients and
usm itself live in the container image, never in the slot: usm-lcc's
newly declared runtime deps all failed as missing although every one
was installed, and the offer flow stayed silent because its resolver
(system-rooted) saw nothing missing at all. The runtime-phase checks
now accept a resource present in the destination root OR on the host
system (the same view the manage/build phases and the offer already
use); a genuinely absent resource still fails and still offers.
clanker 2 hafta önce
ebeveyn
işleme
0e13d63e16
1 değiştirilmiş dosya ile 28 ekleme ve 10 silme
  1. 28 10
      src/cli/Manifest.vala

+ 28 - 10
src/cli/Manifest.vala

@@ -156,7 +156,25 @@ private void manifest_usage() {
  * wins); when no group is viable an itemised per-group report is printed.
  * 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) {
         return true;
     }
@@ -164,7 +182,7 @@ private bool phase_dependencies_satisfied(Usm.DependencyPhase? phase, string lab
     if(!phase.is_grouped) {
         var sane = true;
         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");
                 sane = false;
             }
@@ -174,7 +192,7 @@ private bool phase_dependencies_satisfied(Usm.DependencyPhase? phase, string lab
 
     var groups = phase.ordered_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) {
             return true;
         }
@@ -183,7 +201,7 @@ private bool phase_dependencies_satisfied(Usm.DependencyPhase? phase, string lab
     printerr(@"No viable $label dependency group:\n");
     for(uint index = 0; index < groups.length; index++) {
         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");
         }
     }
@@ -459,7 +477,7 @@ private int install() {
 
     var sane = phase_dependencies_satisfied(manifest.dependencies.manage, "management", 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
     // manager or USM repositories; on a completed offer the checks
@@ -467,7 +485,7 @@ private int install() {
     if(!sane && offer_missing_dependencies(manifest)) {
         sane = phase_dependencies_satisfied(manifest.dependencies.manage, "management", 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) {
@@ -539,12 +557,12 @@ private int install() {
  * tree to its suggested path, with no build or install staging involved.
  */
 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
     // installable from the system package manager or USM repositories
     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) {
@@ -742,7 +760,7 @@ private int autoprovides() {
 
     var sane = phase_dependencies_satisfied(manifest.dependencies.manage, "management", 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) {
         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) &
         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) {
         printerr("Could not validate manifest, missing dependencies\n");