internal/rosa: read-only access to built-ins

This removes potential footguns caused by mutable builtins without requiring unnecessary clones.

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
cat
2026-08-25 14:00:42 +09:00
parent 7ee5d5368d
commit ac7abbbe3f
16 changed files with 123 additions and 94 deletions
+3 -4
View File
@@ -21,7 +21,7 @@ func commandInfo(
r *rosa.Report,
) (err error) {
if len(args) == 0 {
for _, h := range rosa.Native().CollectAll() {
for _, h := range rosa.CollectAll() {
fmt.Println(h)
}
return nil
@@ -39,10 +39,9 @@ func commandInfo(
}
}
t := rosa.Native().Std()
for i, name := range args {
handle := rosa.ArtifactH(unique.Make(name))
if meta, a := t.Load(handle); meta == nil {
if meta, a := rosa.Load(handle); meta == nil {
return fmt.Errorf("unknown artifact %q", name)
} else {
var suffix string
@@ -60,7 +59,7 @@ func commandInfo(
if len(meta.Dependencies) > 0 {
mustPrint("depends on :")
for _, d := range meta.Dependencies {
_meta, _ := rosa.Native().Std().MustLoad(d)
_meta, _ := rosa.MustLoad(d)
s := _meta.Name
if _meta.Version != rosa.Unversioned {
s += "-" + _meta.Version
+7 -8
View File
@@ -21,13 +21,12 @@ import (
func TestInfo(t *testing.T) {
t.Parallel()
_t := rosa.Native().Std()
qemuMeta, _ := _t.Load(rosa.H("qemu"))
glibMeta, _ := _t.Load(rosa.H("glib"))
zlibMeta, zlib := _t.Load(rosa.H("zlib"))
zstdMeta, _ := _t.Load(rosa.H("zstd"))
hakureiMeta, _ := _t.Load(rosa.H("hakurei"))
hakureiDistMeta, _ := _t.Load(rosa.H("hakurei-dist"))
qemuMeta, _ := rosa.MustLoad(rosa.H("qemu"))
glibMeta, _ := rosa.MustLoad(rosa.H("glib"))
zlibMeta, zlib := rosa.MustLoad(rosa.H("zlib"))
zstdMeta, _ := rosa.MustLoad(rosa.H("zstd"))
hakureiMeta, _ := rosa.MustLoad(rosa.H("hakurei"))
hakureiDistMeta, _ := rosa.MustLoad(rosa.H("hakurei-dist"))
testCases := []struct {
name string
@@ -140,7 +139,7 @@ status : not in report
if tc.status != nil {
for name, status := range tc.status {
_, a := _t.Load(rosa.ArtifactH(unique.Make(name)))
_, a := rosa.Load(rosa.ArtifactH(unique.Make(name)))
if a == nil {
t.Fatalf("invalid name %q", name)
}
+1 -1
View File
@@ -30,7 +30,7 @@ var (
// handleInfo writes constant system information.
func handleInfo(w http.ResponseWriter, _ *http.Request) {
infoPayloadOnce.Do(func() {
infoPayload.Count = len(rosa.Native().Collect())
infoPayload.Count = len(rosa.Collect())
infoPayload.HakureiVersion = info.Version()
})
// TODO(mae): cache entire response if no additional fields are planned
+2 -2
View File
@@ -31,7 +31,7 @@ func TestAPIInfo(t *testing.T) {
checkPayload(t, resp, struct {
Count int `json:"count"`
HakureiVersion string `json:"hakurei_version"`
}{len(rosa.Native().Collect()), info.Version()})
}{len(rosa.Collect()), info.Version()})
}
func TestAPIGet(t *testing.T) {
@@ -92,7 +92,7 @@ func TestAPIGet(t *testing.T) {
)
})
count := len(rosa.Native().Collect())
count := len(rosa.Collect())
t.Run("index", func(t *testing.T) {
t.Parallel()
checkValidate(
+2 -2
View File
@@ -56,12 +56,12 @@ func (index *packageIndex) populate(report *rosa.Report) (err error) {
index.handleAccess = report.HandleAccess
}
handles := rosa.Native().Collect()
handles := rosa.Collect()
work := make([]*metadata, len(handles))
index.names = make(map[string]*metadata)
ir := pkg.NewIR()
for i, handle := range handles {
meta, a := rosa.Native().Std().MustLoad(handle)
meta, a := rosa.MustLoad(handle)
m := metadata{
handle: handle,
+32 -27
View File
@@ -48,6 +48,11 @@ import (
"hakurei.app/cmd/mbf/internal/pkgserver/ui"
)
// builtin contains native and embedded [rosa.Artifact] registrations.
//
//go:linkname builtin hakurei.app/internal/rosa.builtin
var builtin rosa.S
// writeFileExcl is like [os.WriteFile], but sets [os.O_EXCL] instead.
func writeFileExcl(name string, data []byte, perm os.FileMode) error {
f, err := os.OpenFile(name, os.O_WRONLY|os.O_CREATE|os.O_EXCL, perm)
@@ -114,7 +119,7 @@ func main() {
addr net.UnixAddr
)
c := command.New(os.Stderr, log.Printf, "mbf", func([]string) error {
if !rosa.Native().HasStageEarly() {
if !rosa.HasStageEarly() {
return pkg.UnsupportedArchError(runtime.GOARCH)
}
@@ -141,13 +146,13 @@ func main() {
if !flagCheck {
flags |= rosa.OptSkipCheck
}
if !flagLTO {
flags |= rosa.OptLLVMNoLTO
if flagLTO {
flags |= rosa.OptToolchainLTO
}
rosa.Native().DropCaches("", flags)
builtin.DropCaches("", flags)
cross := flagArch != "" && flagArch != runtime.GOARCH
if flagQEMU || cross {
_, cm.qemu = rosa.Native().Std().MustLoad(rosa.H("qemu"))
_, cm.qemu = rosa.MustLoad(rosa.H("qemu"))
}
if cross {
@@ -155,14 +160,14 @@ func main() {
flags = flagCrossOverride
}
rosa.Native().DropCaches(flagArch, flags)
if !rosa.Native().HasStageEarly() {
builtin.DropCaches(flagArch, flags)
if !rosa.HasStageEarly() {
return pkg.UnsupportedArchError(flagArch)
}
}
if flagSourcePath != "" {
if err := rosa.Native().SetSource(os.DirFS(flagSourcePath)); err != nil {
if err := builtin.SetSource(os.DirFS(flagSourcePath)); err != nil {
return err
}
}
@@ -173,7 +178,7 @@ func main() {
return err
} else if root, err = os.OpenRoot(a.String()); err != nil {
return err
} else if err = rosa.Native().RegisterFS(root.FS()); err != nil {
} else if err = builtin.RegisterFS(root.FS()); err != nil {
return err
}
}
@@ -432,7 +437,7 @@ func main() {
for range max(flagJobs, 1) {
wg.Go(func() {
for p := range w {
meta, _ := rosa.Native().Std().MustLoad(p)
meta, _ := rosa.MustLoad(p)
if meta.ID == 0 {
continue
}
@@ -462,7 +467,7 @@ func main() {
}
done:
for _, p := range rosa.Native().CollectAll() {
for _, p := range rosa.CollectAll() {
select {
case w <- p:
break
@@ -490,8 +495,8 @@ func main() {
}
c.NewCommand("blocked", command.UsageInternal, func([]string) error {
for _, p := range rosa.Native().CollectAll() {
meta, _ := rosa.Native().Std().Load(p)
for _, p := range rosa.CollectAll() {
meta, _ := rosa.Load(p)
if meta.Blocked != "" {
fmt.Printf("%s: %s\n", meta.Name, meta.Blocked)
}
@@ -631,7 +636,7 @@ func main() {
_llvm := rosa.H("llvm")
if err = cm.Do(func(cache *pkg.Cache) (err error) {
_, llvm := rosa.Native().New(rosa.Std - 2).Load(_llvm)
_, llvm := rosa.MustLoadAt(rosa.Std-2, _llvm)
pathname, _, err = cache.Cure(llvm)
return
}); err != nil {
@@ -640,7 +645,7 @@ func main() {
log.Println("stage1:", pathname)
if err = cm.Do(func(cache *pkg.Cache) (err error) {
_, llvm := rosa.Native().New(rosa.Std - 1).Load(_llvm)
_, llvm := rosa.MustLoadAt(rosa.Std-1, _llvm)
pathname, _, err = cache.Cure(llvm)
return
}); err != nil {
@@ -649,7 +654,7 @@ func main() {
log.Println("stage2:", pathname)
if err = cm.Do(func(cache *pkg.Cache) (err error) {
_, llvm := rosa.Native().New(rosa.Std).Load(_llvm)
_, llvm := rosa.MustLoadAt(rosa.Std, _llvm)
pathname, checksum[0], err = cache.Cure(llvm)
return
}); err != nil {
@@ -658,7 +663,7 @@ func main() {
log.Println("stage3:", pathname)
if err = cm.Do(func(cache *pkg.Cache) (err error) {
_, llvm := rosa.Native().New(rosa.Stage3).Load(_llvm)
_, llvm := rosa.MustLoadAt(rosa.Stage3, _llvm)
pathname, checksum[1], err = cache.Cure(llvm)
return
}); err != nil {
@@ -686,10 +691,10 @@ func main() {
"all",
command.UsageInternal,
func([]string) error {
all := rosa.Native().CollectAll()
all := rosa.CollectAll()
a := make(pkg.Collect, len(all))
for i, h := range all {
_, a[i] = rosa.Native().Std().Load(h)
_, a[i] = rosa.Load(h)
}
return cm.Do(func(cache *pkg.Cache) (err error) {
_, _, err = cache.Cure(&a)
@@ -740,12 +745,12 @@ func main() {
return err
}
}
rosa.Native().SetGentooStage3(flagGentoo, checksum)
builtin.SetGentooStage3(flagGentoo, checksum)
t -= 3 // magic number to discourage misuse
}
_, a := rosa.Native().New(t).Load(rosa.ArtifactH(unique.Make(args[0])))
_, a := rosa.LoadAt(t, rosa.ArtifactH(unique.Make(args[0])))
if a == nil {
return fmt.Errorf("unknown artifact %q", args[0])
}
@@ -965,7 +970,7 @@ func main() {
return errors.New("validate must rebuild at least twice")
}
_, a := rosa.Native().New(stage).Load(rosa.ArtifactH(unique.Make(args[1])))
_, a := rosa.LoadAt(stage, rosa.ArtifactH(unique.Make(args[1])))
if a == nil {
return fmt.Errorf("unknown artifact %q", args[1])
}
@@ -1051,7 +1056,7 @@ func main() {
"Remove identifiers not reachable by loaded packages",
func([]string) error {
return cm.Do(func(cache *pkg.Cache) error {
t := rosa.Native().Clone().Std()
t := rosa.New().Std()
handles := t.CollectAll()
flags := t.Flags()
@@ -1061,7 +1066,7 @@ func main() {
continue
}
t.DropCaches(arch, rosa.OptLLVMNoLTO|rosa.OptSkipCheck)
t.DropCaches(arch, rosa.OptSkipCheck)
a = t.Append(a, handles...)
t.DropCaches(arch, flags)
a = t.Append(a, handles...)
@@ -1117,7 +1122,7 @@ func main() {
handles := make([]rosa.ArtifactH, len(args), len(args)+3)
for i, arg := range args {
handles[i] = rosa.ArtifactH(unique.Make(arg))
if meta, _ := rosa.Native().Std().Load(handles[i]); meta == nil {
if meta, _ := rosa.Load(handles[i]); meta == nil {
return fmt.Errorf("unknown artifact %q", arg)
}
}
@@ -1134,14 +1139,14 @@ func main() {
root := make(pkg.Collect, 0, 6+len(args))
root = append(root, rosa.NewEtc(false))
root = rosa.Native().Std().Append(root, handles...)
root = builtin.Std().Append(root, handles...)
return cm.Do(func(cache *pkg.Cache) error {
return cache.EnterExec(
ctx,
pkg.NewExec(
"",
rosa.Native().Arch(),
builtin.Arch(),
new(pkg.Checksum),
1,
flagNet,
+2 -7
View File
@@ -8,11 +8,6 @@ import (
"hakurei.app/internal/rosa"
)
func TestMain(m *testing.M) {
rosa.Native().DropCaches("", rosa.OptLLVMNoLTO)
os.Exit(m.Run())
}
func TestCureAll(t *testing.T) {
t.Parallel()
const env = "ROSA_TEST_DAEMON"
@@ -35,8 +30,8 @@ func TestCureAll(t *testing.T) {
}
})
for _, handle := range rosa.Native().Collect() {
_, a := rosa.Native().Std().MustLoad(handle)
for _, handle := range rosa.Collect() {
_, a := rosa.MustLoad(handle)
t.Run(handle.String(), func(t *testing.T) {
_, err := cureRemote(t.Context(), &addr, a, 0)
if err != nil {