forked from rosa/hakurei
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:
+32
-27
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user