117 lines
5.1 KiB
Markdown
117 lines
5.1 KiB
Markdown
|
|
# Capability Resolution & Installer Shadowing
|
|||
|
|
|
|||
|
|
## Layer Hierarchy
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌───────────────────────────┐ Highest layer
|
|||
|
|
│ OS-PACKAGES │ (PKGBUILD / debian / rpm)
|
|||
|
|
└───────────▲───────────────┘
|
|||
|
|
│ shadows lower layers
|
|||
|
|
┌───────────┴───────────────┐
|
|||
|
|
│ NIX │ (flake.nix)
|
|||
|
|
└───────────▲───────────────┘
|
|||
|
|
│ shadows lower layers
|
|||
|
|
┌───────────┴───────────────┐
|
|||
|
|
│ PYTHON │ (pyproject.toml)
|
|||
|
|
└───────────▲───────────────┘
|
|||
|
|
│ shadows lower layers
|
|||
|
|
┌───────────┴───────────────┐
|
|||
|
|
│ MAKEFILE │ (Makefile)
|
|||
|
|
└────────────────────────────┘ Lowest layer
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Scenario Matrix
|
|||
|
|
|
|||
|
|
| Scenario | Makefile | Python | Nix | OS-Pkgs | Test Name |
|
|||
|
|
| -------------------------- | -------- | ------ | --- | ------- | ----------------------------- |
|
|||
|
|
| 1) Only Makefile | ✔ | – | – | – | `only_makefile` |
|
|||
|
|
| 2) Python + Makefile | ✔ | ✔ | – | – | `python_and_makefile` |
|
|||
|
|
| 3) Python shadows Makefile | ✗ | ✔ | – | – | `python_shadows_makefile` |
|
|||
|
|
| 4) Nix shadows Py & MF | ✗ | ✗ | ✔ | – | `nix_shadows_python_makefile` |
|
|||
|
|
| 5) OS-Pkgs shadow all | ✗ | ✗ | ✗ | ✔ | `os_packages_shadow_all` |
|
|||
|
|
|
|||
|
|
Legend:
|
|||
|
|
✔ = installer runs
|
|||
|
|
✗ = installer skipped (shadowed by upper layer)
|
|||
|
|
– = no such layer present
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## What the Integration Test Confirms
|
|||
|
|
|
|||
|
|
**Goal:** Validate that the capability-shadowing mechanism correctly determines *which installers actually run* for a given repository layout.
|
|||
|
|
|
|||
|
|
### 1) Only Makefile
|
|||
|
|
|
|||
|
|
* Makefile provides `make-install`.
|
|||
|
|
* No higher layers → MakefileInstaller runs.
|
|||
|
|
|
|||
|
|
### 2) Python + Makefile
|
|||
|
|
|
|||
|
|
* Python provides `python-runtime`.
|
|||
|
|
* Makefile additionally provides `make-install`.
|
|||
|
|
* No capability overlap → both installers run.
|
|||
|
|
|
|||
|
|
### 3) Python shadows Makefile
|
|||
|
|
|
|||
|
|
* Python also provides `make-install`.
|
|||
|
|
* Makefile’s capability is fully covered → MakefileInstaller is skipped.
|
|||
|
|
|
|||
|
|
### 4) Nix shadows Python & Makefile
|
|||
|
|
|
|||
|
|
* Nix provides all capabilities below it.
|
|||
|
|
* Only NixInstaller runs.
|
|||
|
|
|
|||
|
|
### 5) OS-Packages shadow all
|
|||
|
|
|
|||
|
|
* PKGBUILD/debian/rpm provide all capabilities.
|
|||
|
|
* Only the corresponding OS package installer runs.
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Capability Processing Flowchart
|
|||
|
|
|
|||
|
|
```
|
|||
|
|
┌────────────────────────────┐
|
|||
|
|
│ Start │
|
|||
|
|
└───────────────┬────────────┘
|
|||
|
|
│
|
|||
|
|
provided_capabilities = ∅
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌──────────────────────────────────────────────┐
|
|||
|
|
│ For each installer in layer order (low→high) │
|
|||
|
|
└───────────────────┬──────────────────────────┘
|
|||
|
|
│
|
|||
|
|
supports(ctx)?│
|
|||
|
|
┌─────────┴──────────┐
|
|||
|
|
│ no │
|
|||
|
|
│ → skip installer │
|
|||
|
|
└─────────┬──────────┘
|
|||
|
|
│ yes
|
|||
|
|
▼
|
|||
|
|
caps = detect_capabilities(layer)
|
|||
|
|
│
|
|||
|
|
caps ⊆ provided_capabilities ?
|
|||
|
|
┌─────────────┬─────────────┐
|
|||
|
|
│ yes │ no │
|
|||
|
|
│ skip │ run installer│
|
|||
|
|
└─────────────┴──────────────┘
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
provided_capabilities ∪= caps
|
|||
|
|
│
|
|||
|
|
▼
|
|||
|
|
┌────────────────────────┐
|
|||
|
|
│ End of installer list │
|
|||
|
|
└────────────────────────┘
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## Core Principle (one sentence)
|
|||
|
|
|
|||
|
|
**A layer only executes if it provides at least one capability not already guaranteed by any higher layer.**
|