diff options
| author | Ophestra <cat@gensokyo.uk> | 2026-08-25 13:57:38 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2026-08-25 14:00:42 +0900 |
| commit | ac7abbbe3fa2eea01defb670abc7dc1dc336cf21 (patch) | |
| tree | cb8c451110acbd394667e94ae66c53dc422398b8 /cmd/mbf | |
| parent | 7ee5d5368de5494350e7766a595c2bdc8f01ce80 (diff) | |
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>
Diffstat (limited to 'cmd/mbf')
| -rw-r--r-- | cmd/mbf/info.go | 7 | ||||
| -rw-r--r-- | cmd/mbf/info_test.go | 15 | ||||
| -rw-r--r-- | cmd/mbf/internal/pkgserver/api.go | 2 | ||||
| -rw-r--r-- | cmd/mbf/internal/pkgserver/api_test.go | 4 | ||||
| -rw-r--r-- | cmd/mbf/internal/pkgserver/index.go | 4 | ||||
| -rw-r--r-- | cmd/mbf/main.go | 59 | ||||
| -rw-r--r-- | cmd/mbf/main_test.go | 9 |
7 files changed, 49 insertions, 51 deletions
diff --git a/cmd/mbf/info.go b/cmd/mbf/info.go index aaf50bc9..d0afc8f5 100644 --- a/cmd/mbf/info.go +++ b/cmd/mbf/info.go @@ -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 diff --git a/cmd/mbf/info_test.go b/cmd/mbf/info_test.go index 80653f20..d85266ef 100644 --- a/cmd/mbf/info_test.go +++ b/cmd/mbf/info_test.go @@ -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) } diff --git a/cmd/mbf/internal/pkgserver/api.go b/cmd/mbf/internal/pkgserver/api.go index 125be829..68ccd471 100644 --- a/cmd/mbf/internal/pkgserver/api.go +++ b/cmd/mbf/internal/pkgserver/api.go @@ -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 diff --git a/cmd/mbf/internal/pkgserver/api_test.go b/cmd/mbf/internal/pkgserver/api_test.go index 3a9945da..1552fec9 100644 --- a/cmd/mbf/internal/pkgserver/api_test.go +++ b/cmd/mbf/internal/pkgserver/api_test.go @@ -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( diff --git a/cmd/mbf/internal/pkgserver/index.go b/cmd/mbf/internal/pkgserver/index.go index 2cc68f9f..f62a7e73 100644 --- a/cmd/mbf/internal/pkgserver/index.go +++ b/cmd/mbf/internal/pkgserver/index.go @@ -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, diff --git a/cmd/mbf/main.go b/cmd/mbf/main.go index 0024275a..4beefe68 100644 --- a/cmd/mbf/main.go +++ b/cmd/mbf/main.go @@ -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, diff --git a/cmd/mbf/main_test.go b/cmd/mbf/main_test.go index 83dc9a98..76e8d094 100644 --- a/cmd/mbf/main_test.go +++ b/cmd/mbf/main_test.go @@ -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 { |
