From 0130f8ea6d88b451ac218f97b07d10eb11ee2f71 Mon Sep 17 00:00:00 2001 From: Ophestra Date: Thu, 12 Mar 2026 23:14:12 +0900 Subject: internal/rosa: represent runtime dependencies This also resolves indirect dependencies, reducing noise. Signed-off-by: Ophestra --- internal/rosa/rosa.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 2 deletions(-) (limited to 'internal/rosa/rosa.go') 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 -- cgit v1.3.1