diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-03-12 23:14:12 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-03-13 10:31:14 +0900 |
| commit | 0130f8ea6d88b451ac218f97b07d10eb11ee2f71 (patch) | |
| tree | 6f2af99c25030c6b4ea3a116fc060bb47d115547 /internal/rosa/rosa.go | |
| parent | faac5c4a839e81323760a9a6cd09407f769eef10 (diff) | |
internal/rosa: represent runtime dependencies
This also resolves indirect dependencies, reducing noise.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/rosa/rosa.go')
| -rw-r--r-- | internal/rosa/rosa.go | 49 |
1 files changed, 47 insertions, 2 deletions
diff --git a/internal/rosa/rosa.go b/internal/rosa/rosa.go index fbdba172..060a23b4 100644 --- a/internal/rosa/rosa.go +++ b/internal/rosa/rosa.go @@ -8,6 +8,7 @@ import ( "slices" "strconv" "strings" + "sync" "hakurei.app/container/fhs" "hakurei.app/internal/pkg" @@ -454,6 +455,48 @@ type PackageAttr struct { Flag int } +// pa holds whether a [PArtifact] is present. +type pa = [PresetEnd]bool + +// paPool holds addresses of pa. +var paPool = sync.Pool{New: func() any { return new(pa) }} + +// paGet returns the address of a new pa. +func paGet() *pa { return paPool.Get().(*pa) } + +// paPut returns a pa to paPool. +func paPut(pv *pa) { *pv = pa{}; paPool.Put(pv) } + +// appendPreset recursively appends a [PArtifact] and its runtime dependencies. +func (t Toolchain) appendPreset( + a []pkg.Artifact, + pv *pa, p PArtifact, +) []pkg.Artifact { + if pv[p] { + return a + } + pv[p] = true + + for _, d := range GetMetadata(p).Dependencies { + a = t.appendPreset(a, pv, d) + } + return append(a, t.Load(p)) +} + +// AppendPresets recursively appends multiple [PArtifact] and their runtime +// dependencies. +func (t Toolchain) AppendPresets( + a []pkg.Artifact, + presets ...PArtifact, +) []pkg.Artifact { + pv := paGet() + for _, p := range presets { + a = t.appendPreset(a, pv, p) + } + paPut(pv) + return a +} + // NewPackage constructs a [pkg.Artifact] via a build system helper. func (t Toolchain) NewPackage( name, version string, @@ -486,12 +529,14 @@ func (t Toolchain) NewPackage( extraRes := make([]pkg.Artifact, 0, dc) extraRes = append(extraRes, attr.NonStage0...) if !t.isStage0() { + pv := paGet() for _, p := range helper.extra(attr.Flag) { - extraRes = append(extraRes, t.Load(p)) + extraRes = t.appendPreset(extraRes, pv, p) } for _, p := range extra { - extraRes = append(extraRes, t.Load(p)) + extraRes = t.appendPreset(extraRes, pv, p) } + paPut(pv) } var scriptEarly string |
