aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2026-05-18 00:07:39 +0900
committerOphestra <cat@gensokyo.uk>2026-05-18 00:07:39 +0900
commit3e236333a77233cfcd96b6fc93be91e14ab7c680 (patch)
tree97b4bc6703d6763a0c24455a33ce18d637966c1c
parentf24ae21af111e0ce34f62a37ddb4a9fc18166ae6 (diff)
internal/rosa: panic error for invalid handle
This enables recovery and better error handling for errors originating from external azalea files. Signed-off-by: Ophestra <cat@gensokyo.uk>
-rw-r--r--cmd/mbf/main.go13
-rw-r--r--internal/rosa/state.go15
-rw-r--r--internal/rosa/state_native.go384
3 files changed, 217 insertions, 195 deletions
diff --git a/cmd/mbf/main.go b/cmd/mbf/main.go
index df089e89..f3532326 100644
--- a/cmd/mbf/main.go
+++ b/cmd/mbf/main.go
@@ -58,6 +58,19 @@ func main() {
log.Fatal("this program must not run as root")
}
+ defer func() {
+ r := recover()
+ if r == nil {
+ return
+ }
+
+ h, ok := r.(rosa.HandleError)
+ if !ok {
+ panic(r)
+ }
+ log.Fatal(h)
+ }()
+
ctx, stop := signal.NotifyContext(context.Background(),
syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
defer stop()
diff --git a/internal/rosa/state.go b/internal/rosa/state.go
index 89ee1840..67cfdf97 100644
--- a/internal/rosa/state.go
+++ b/internal/rosa/state.go
@@ -19,6 +19,9 @@ import (
// ArtifactH is a handle of the unique name of a prepared [pkg.Artifact].
type ArtifactH unique.Handle[string]
+// H is a convenient function for acquiring an [ArtifactH] by name.
+func H(name string) ArtifactH { return ArtifactH(unique.Make(name)) }
+
// String returns the name of p.
func (handle ArtifactH) String() string {
return unique.Handle[string](handle).Value()
@@ -39,6 +42,14 @@ func (handle *ArtifactH) UnmarshalJSON(data []byte) error {
return nil
}
+// A HandleError is panicked when attempting to acquire an [Artifact] via an
+// invalid [ArtifactH] with the Must suite of methods.
+type HandleError ArtifactH
+
+func (e HandleError) Error() string {
+ return "artifact " + strconv.Quote(ArtifactH(e).String()) + " not available"
+}
+
type (
// Stage denotes the infrastructure to compile a [pkg.Artifact] on.
Stage uint32
@@ -234,7 +245,7 @@ func (s *S) Get(handle ArtifactH) (meta *Artifact) {
func (s *S) MustGet(handle ArtifactH) (meta *Artifact) {
meta = s.Get(handle)
if meta == nil {
- panic("artifact " + strconv.Quote(handle.String()) + " not available")
+ panic(HandleError(handle))
}
return
}
@@ -270,7 +281,7 @@ func (t Toolchain) Load(handle ArtifactH) (pkg.Artifact, string) {
func (t Toolchain) MustLoad(handle ArtifactH) (pkg.Artifact, string) {
a, version := t.Load(handle)
if a == nil {
- panic("artifact " + strconv.Quote(handle.String()) + " not available")
+ panic(HandleError(handle))
}
return a, version
}
diff --git a/internal/rosa/state_native.go b/internal/rosa/state_native.go
index 89d26dfa..c320642e 100644
--- a/internal/rosa/state_native.go
+++ b/internal/rosa/state_native.go
@@ -1,197 +1,195 @@
package rosa
-import "unique"
-
var (
- LLVM = ArtifactH(unique.Make("llvm"))
- EarlyInit = ArtifactH(unique.Make("earlyinit"))
- ImageSystem = ArtifactH(unique.Make("system-image"))
- ImageInitramfs = ArtifactH(unique.Make("initramfs-image"))
- Kernel = ArtifactH(unique.Make("kernel"))
- KernelHeaders = ArtifactH(unique.Make("kernel-headers"))
- KernelSource = ArtifactH(unique.Make("kernel-source"))
- Firmware = ArtifactH(unique.Make("firmware"))
- ACL = ArtifactH(unique.Make("acl"))
- ArgpStandalone = ArtifactH(unique.Make("argp-standalone"))
- Attr = ArtifactH(unique.Make("attr"))
- Autoconf = ArtifactH(unique.Make("autoconf"))
- Automake = ArtifactH(unique.Make("automake"))
- BC = ArtifactH(unique.Make("bc"))
- Bash = ArtifactH(unique.Make("bash"))
- Binutils = ArtifactH(unique.Make("binutils"))
- Bison = ArtifactH(unique.Make("bison"))
- Bzip2 = ArtifactH(unique.Make("bzip2"))
- CMake = ArtifactH(unique.Make("cmake"))
- Connman = ArtifactH(unique.Make("connman"))
- Coreutils = ArtifactH(unique.Make("coreutils"))
- Curl = ArtifactH(unique.Make("curl"))
- DBus = ArtifactH(unique.Make("dbus"))
- DTC = ArtifactH(unique.Make("dtc"))
- Diffutils = ArtifactH(unique.Make("diffutils"))
- Elfutils = ArtifactH(unique.Make("elfutils"))
- Fakeroot = ArtifactH(unique.Make("fakeroot"))
- Findutils = ArtifactH(unique.Make("findutils"))
- Flex = ArtifactH(unique.Make("flex"))
- FontUtil = ArtifactH(unique.Make("font-util"))
- Freetype = ArtifactH(unique.Make("freetype"))
- Fuse = ArtifactH(unique.Make("fuse"))
- GMP = ArtifactH(unique.Make("gmp"))
- GLib = ArtifactH(unique.Make("glib"))
- Gawk = ArtifactH(unique.Make("gawk"))
- GenInitCPIO = ArtifactH(unique.Make("gen_init_cpio"))
- Gettext = ArtifactH(unique.Make("gettext"))
- Git = ArtifactH(unique.Make("git"))
- Glslang = ArtifactH(unique.Make("glslang"))
- GnuTLS = ArtifactH(unique.Make("gnutls"))
- Go = ArtifactH(unique.Make("go"))
- Gperf = ArtifactH(unique.Make("gperf"))
- Grep = ArtifactH(unique.Make("grep"))
- Gzip = ArtifactH(unique.Make("gzip"))
- Hakurei = ArtifactH(unique.Make("hakurei"))
- HakureiDist = ArtifactH(unique.Make("hakurei-dist"))
- Hwdata = ArtifactH(unique.Make("hwdata"))
- IPTables = ArtifactH(unique.Make("iptables"))
- Kmod = ArtifactH(unique.Make("kmod"))
- LIT = ArtifactH(unique.Make("lit"))
- LibX11 = ArtifactH(unique.Make("libX11"))
- LibXau = ArtifactH(unique.Make("libXau"))
- LibXdmcp = ArtifactH(unique.Make("libXdmcp"))
- LibXext = ArtifactH(unique.Make("libXext"))
- LibXfixes = ArtifactH(unique.Make("libXfixes"))
- LibXfont2 = ArtifactH(unique.Make("libXfont2"))
- LibXrandr = ArtifactH(unique.Make("libXrandr"))
- LibXrender = ArtifactH(unique.Make("libXrender"))
- LibXxf86vm = ArtifactH(unique.Make("libXxf86vm"))
- Libarchive = ArtifactH(unique.Make("libarchive"))
- Libbsd = ArtifactH(unique.Make("libbsd"))
- Libcap = ArtifactH(unique.Make("libcap"))
- Libconfig = ArtifactH(unique.Make("libconfig"))
- LibdisplayInfo = ArtifactH(unique.Make("libdisplay-info"))
- Libdrm = ArtifactH(unique.Make("libdrm"))
- Libepoxy = ArtifactH(unique.Make("libepoxy"))
- Libev = ArtifactH(unique.Make("libev"))
- Libexpat = ArtifactH(unique.Make("libexpat"))
- Libffi = ArtifactH(unique.Make("libffi"))
- Libfontenc = ArtifactH(unique.Make("libfontenc"))
- Libgd = ArtifactH(unique.Make("libgd"))
- Libglvnd = ArtifactH(unique.Make("libglvnd"))
- Libiconv = ArtifactH(unique.Make("libiconv"))
- Libmd = ArtifactH(unique.Make("libmd"))
- Libmnl = ArtifactH(unique.Make("libmnl"))
- Libnftnl = ArtifactH(unique.Make("libnftnl"))
- Libpciaccess = ArtifactH(unique.Make("libpciaccess"))
- Libpng = ArtifactH(unique.Make("libpng"))
- Libpsl = ArtifactH(unique.Make("libpsl"))
- Libseccomp = ArtifactH(unique.Make("libseccomp"))
- Libtasn1 = ArtifactH(unique.Make("libtasn1"))
- Libtirpc = ArtifactH(unique.Make("libtirpc"))
- Libtool = ArtifactH(unique.Make("libtool"))
- Libucontext = ArtifactH(unique.Make("libucontext"))
- Libunistring = ArtifactH(unique.Make("libunistring"))
- Libva = ArtifactH(unique.Make("libva"))
- LibxcbRenderUtil = ArtifactH(unique.Make("libxcb-render-util"))
- LibxcbUtil = ArtifactH(unique.Make("libxcb-util"))
- LibxcbUtilImage = ArtifactH(unique.Make("libxcb-util-image"))
- LibxcbUtilKeysyms = ArtifactH(unique.Make("libxcb-util-keysyms"))
- LibxcbUtilWM = ArtifactH(unique.Make("libxcb-util-wm"))
- Libxcvt = ArtifactH(unique.Make("libxcvt"))
- Libxkbfile = ArtifactH(unique.Make("libxkbfile"))
- Libxml2 = ArtifactH(unique.Make("libxml2"))
- Libxshmfence = ArtifactH(unique.Make("libxshmfence"))
- Libxslt = ArtifactH(unique.Make("libxslt"))
- Libxtrans = ArtifactH(unique.Make("libxtrans"))
- LMSensors = ArtifactH(unique.Make("lm_sensors"))
- M4 = ArtifactH(unique.Make("m4"))
- MPC = ArtifactH(unique.Make("mpc"))
- MPFR = ArtifactH(unique.Make("mpfr"))
- Make = ArtifactH(unique.Make("make"))
- Mesa = ArtifactH(unique.Make("mesa"))
- Meson = ArtifactH(unique.Make("meson"))
- Mksh = ArtifactH(unique.Make("mksh"))
- MuslFts = ArtifactH(unique.Make("musl-fts"))
- MuslObstack = ArtifactH(unique.Make("musl-obstack"))
- NSS = ArtifactH(unique.Make("nss"))
- NSSCACert = ArtifactH(unique.Make("nss-cacert"))
- Ncurses = ArtifactH(unique.Make("ncurses"))
- Nettle = ArtifactH(unique.Make("nettle"))
- Ninja = ArtifactH(unique.Make("ninja"))
- OpenSSL = ArtifactH(unique.Make("openssl"))
- P11Kit = ArtifactH(unique.Make("p11-kit"))
- PCRE2 = ArtifactH(unique.Make("pcre2"))
- Parallel = ArtifactH(unique.Make("parallel"))
- Patch = ArtifactH(unique.Make("patch"))
- Perl = ArtifactH(unique.Make("perl"))
- PerlLocaleGettext = ArtifactH(unique.Make("perl-Locale::gettext"))
- PerlMIMECharset = ArtifactH(unique.Make("perl-MIME::Charset"))
- PerlModuleBuild = ArtifactH(unique.Make("perl-Module::Build"))
- PerlPodParser = ArtifactH(unique.Make("perl-Pod::Parser"))
- PerlSGMLS = ArtifactH(unique.Make("perl-SGMLS"))
- PerlTermReadKey = ArtifactH(unique.Make("perl-Term::ReadKey"))
- PerlTestCmd = ArtifactH(unique.Make("perl-Test::Cmd"))
- PerlTextCharWidth = ArtifactH(unique.Make("perl-Text::CharWidth"))
- PerlTextWrapI18N = ArtifactH(unique.Make("perl-Text::WrapI18N"))
- PerlUnicodeLineBreak = ArtifactH(unique.Make("perl-Unicode::LineBreak"))
- PerlYAMLTiny = ArtifactH(unique.Make("perl-YAML::Tiny"))
- Pixman = ArtifactH(unique.Make("pixman"))
- PkgConfig = ArtifactH(unique.Make("pkg-config"))
- Procps = ArtifactH(unique.Make("procps"))
- Python = ArtifactH(unique.Make("python"))
- PythonFlitCore = ArtifactH(unique.Make("python-flit-core"))
- PythonHatchling = ArtifactH(unique.Make("python-hatchling"))
- PythonIniConfig = ArtifactH(unique.Make("python-iniconfig"))
- PythonMako = ArtifactH(unique.Make("python-mako"))
- PythonMarkupSafe = ArtifactH(unique.Make("python-markupsafe"))
- PythonPackaging = ArtifactH(unique.Make("python-packaging"))
- PythonPathspec = ArtifactH(unique.Make("python-pathspec"))
- PythonPluggy = ArtifactH(unique.Make("python-pluggy"))
- PythonPyTest = ArtifactH(unique.Make("python-pytest"))
- PythonPyYAML = ArtifactH(unique.Make("python-pyyaml"))
- PythonPycparser = ArtifactH(unique.Make("python-pycparser"))
- PythonPygments = ArtifactH(unique.Make("python-pygments"))
- PythonSetuptools = ArtifactH(unique.Make("python-setuptools"))
- PythonSetuptoolsSCM = ArtifactH(unique.Make("python-setuptools-scm"))
- PythonTroveClassifiers = ArtifactH(unique.Make("python-trove-classifiers"))
- PythonVCSVersioning = ArtifactH(unique.Make("python-vcs-versioning"))
- PythonWheel = ArtifactH(unique.Make("python-wheel"))
- QEMU = ArtifactH(unique.Make("qemu"))
- Rdfind = ArtifactH(unique.Make("rdfind"))
- Readline = ArtifactH(unique.Make("readline"))
- Rsync = ArtifactH(unique.Make("rsync"))
- Sed = ArtifactH(unique.Make("sed"))
- SPIRVHeaders = ArtifactH(unique.Make("spirv-headers"))
- SPIRVLLVMTranslator = ArtifactH(unique.Make("spirv-llvm-translator"))
- SPIRVTools = ArtifactH(unique.Make("spirv-tools"))
- SquashfsTools = ArtifactH(unique.Make("squashfs-tools"))
- Strace = ArtifactH(unique.Make("strace"))
- TamaGo = ArtifactH(unique.Make("tamago"))
- Tar = ArtifactH(unique.Make("tar"))
- Texinfo = ArtifactH(unique.Make("texinfo"))
- Toybox = ArtifactH(unique.Make("toybox"))
- toyboxEarly = ArtifactH(unique.Make("toybox-early"))
- Unzip = ArtifactH(unique.Make("unzip"))
- UtilLinux = ArtifactH(unique.Make("util-linux"))
- VIM = ArtifactH(unique.Make("vim"))
- Wayland = ArtifactH(unique.Make("wayland"))
- WaylandProtocols = ArtifactH(unique.Make("wayland-protocols"))
- XCB = ArtifactH(unique.Make("xcb"))
- XCBProto = ArtifactH(unique.Make("xcb-proto"))
- XDGDBusProxy = ArtifactH(unique.Make("xdg-dbus-proxy"))
- XZ = ArtifactH(unique.Make("xz"))
- Xkbcomp = ArtifactH(unique.Make("xkbcomp"))
- XkeyboardConfig = ArtifactH(unique.Make("xkeyboard-config"))
- XorgProto = ArtifactH(unique.Make("xorgproto"))
- Xserver = ArtifactH(unique.Make("xserver"))
- Zlib = ArtifactH(unique.Make("zlib"))
- Zstd = ArtifactH(unique.Make("zstd"))
- stage0Dist = ArtifactH(unique.Make("stage0-dist"))
- llvmSource = ArtifactH(unique.Make("llvm-project"))
- earlyCompilerRT = ArtifactH(unique.Make("early-compiler-rt"))
- earlyRuntimes = ArtifactH(unique.Make("early-runtimes"))
- buildcatrust = ArtifactH(unique.Make("python-buildcatrust"))
- utilMacros = ArtifactH(unique.Make("util-macros"))
- Musl = ArtifactH(unique.Make("musl"))
- muslHeaders = ArtifactH(unique.Make("musl-headers"))
- gcc = ArtifactH(unique.Make("gcc"))
- nettle3 = ArtifactH(unique.Make("nettle3"))
- Stage0 = ArtifactH(unique.Make("rosa-stage0"))
+ LLVM = H("llvm")
+ EarlyInit = H("earlyinit")
+ ImageSystem = H("system-image")
+ ImageInitramfs = H("initramfs-image")
+ Kernel = H("kernel")
+ KernelHeaders = H("kernel-headers")
+ KernelSource = H("kernel-source")
+ Firmware = H("firmware")
+ ACL = H("acl")
+ ArgpStandalone = H("argp-standalone")
+ Attr = H("attr")
+ Autoconf = H("autoconf")
+ Automake = H("automake")
+ BC = H("bc")
+ Bash = H("bash")
+ Binutils = H("binutils")
+ Bison = H("bison")
+ Bzip2 = H("bzip2")
+ CMake = H("cmake")
+ Connman = H("connman")
+ Coreutils = H("coreutils")
+ Curl = H("curl")
+ DBus = H("dbus")
+ DTC = H("dtc")
+ Diffutils = H("diffutils")
+ Elfutils = H("elfutils")
+ Fakeroot = H("fakeroot")
+ Findutils = H("findutils")
+ Flex = H("flex")
+ FontUtil = H("font-util")
+ Freetype = H("freetype")
+ Fuse = H("fuse")
+ GMP = H("gmp")
+ GLib = H("glib")
+ Gawk = H("gawk")
+ GenInitCPIO = H("gen_init_cpio")
+ Gettext = H("gettext")
+ Git = H("git")
+ Glslang = H("glslang")
+ GnuTLS = H("gnutls")
+ Go = H("go")
+ Gperf = H("gperf")
+ Grep = H("grep")
+ Gzip = H("gzip")
+ Hakurei = H("hakurei")
+ HakureiDist = H("hakurei-dist")
+ Hwdata = H("hwdata")
+ IPTables = H("iptables")
+ Kmod = H("kmod")
+ LIT = H("lit")
+ LibX11 = H("libX11")
+ LibXau = H("libXau")
+ LibXdmcp = H("libXdmcp")
+ LibXext = H("libXext")
+ LibXfixes = H("libXfixes")
+ LibXfont2 = H("libXfont2")
+ LibXrandr = H("libXrandr")
+ LibXrender = H("libXrender")
+ LibXxf86vm = H("libXxf86vm")
+ Libarchive = H("libarchive")
+ Libbsd = H("libbsd")
+ Libcap = H("libcap")
+ Libconfig = H("libconfig")
+ LibdisplayInfo = H("libdisplay-info")
+ Libdrm = H("libdrm")
+ Libepoxy = H("libepoxy")
+ Libev = H("libev")
+ Libexpat = H("libexpat")
+ Libffi = H("libffi")
+ Libfontenc = H("libfontenc")
+ Libgd = H("libgd")
+ Libglvnd = H("libglvnd")
+ Libiconv = H("libiconv")
+ Libmd = H("libmd")
+ Libmnl = H("libmnl")
+ Libnftnl = H("libnftnl")
+ Libpciaccess = H("libpciaccess")
+ Libpng = H("libpng")
+ Libpsl = H("libpsl")
+ Libseccomp = H("libseccomp")
+ Libtasn1 = H("libtasn1")
+ Libtirpc = H("libtirpc")
+ Libtool = H("libtool")
+ Libucontext = H("libucontext")
+ Libunistring = H("libunistring")
+ Libva = H("libva")
+ LibxcbRenderUtil = H("libxcb-render-util")
+ LibxcbUtil = H("libxcb-util")
+ LibxcbUtilImage = H("libxcb-util-image")
+ LibxcbUtilKeysyms = H("libxcb-util-keysyms")
+ LibxcbUtilWM = H("libxcb-util-wm")
+ Libxcvt = H("libxcvt")
+ Libxkbfile = H("libxkbfile")
+ Libxml2 = H("libxml2")
+ Libxshmfence = H("libxshmfence")
+ Libxslt = H("libxslt")
+ Libxtrans = H("libxtrans")
+ LMSensors = H("lm_sensors")
+ M4 = H("m4")
+ MPC = H("mpc")
+ MPFR = H("mpfr")
+ Make = H("make")
+ Mesa = H("mesa")
+ Meson = H("meson")
+ Mksh = H("mksh")
+ MuslFts = H("musl-fts")
+ MuslObstack = H("musl-obstack")
+ NSS = H("nss")
+ NSSCACert = H("nss-cacert")
+ Ncurses = H("ncurses")
+ Nettle = H("nettle")
+ Ninja = H("ninja")
+ OpenSSL = H("openssl")
+ P11Kit = H("p11-kit")
+ PCRE2 = H("pcre2")
+ Parallel = H("parallel")
+ Patch = H("patch")
+ Perl = H("perl")
+ PerlLocaleGettext = H("perl-Locale::gettext")
+ PerlMIMECharset = H("perl-MIME::Charset")
+ PerlModuleBuild = H("perl-Module::Build")
+ PerlPodParser = H("perl-Pod::Parser")
+ PerlSGMLS = H("perl-SGMLS")
+ PerlTermReadKey = H("perl-Term::ReadKey")
+ PerlTestCmd = H("perl-Test::Cmd")
+ PerlTextCharWidth = H("perl-Text::CharWidth")
+ PerlTextWrapI18N = H("perl-Text::WrapI18N")
+ PerlUnicodeLineBreak = H("perl-Unicode::LineBreak")
+ PerlYAMLTiny = H("perl-YAML::Tiny")
+ Pixman = H("pixman")
+ PkgConfig = H("pkg-config")
+ Procps = H("procps")
+ Python = H("python")
+ PythonFlitCore = H("python-flit-core")
+ PythonHatchling = H("python-hatchling")
+ PythonIniConfig = H("python-iniconfig")
+ PythonMako = H("python-mako")
+ PythonMarkupSafe = H("python-markupsafe")
+ PythonPackaging = H("python-packaging")
+ PythonPathspec = H("python-pathspec")
+ PythonPluggy = H("python-pluggy")
+ PythonPyTest = H("python-pytest")
+ PythonPyYAML = H("python-pyyaml")
+ PythonPycparser = H("python-pycparser")
+ PythonPygments = H("python-pygments")
+ PythonSetuptools = H("python-setuptools")
+ PythonSetuptoolsSCM = H("python-setuptools-scm")
+ PythonTroveClassifiers = H("python-trove-classifiers")
+ PythonVCSVersioning = H("python-vcs-versioning")
+ PythonWheel = H("python-wheel")
+ QEMU = H("qemu")
+ Rdfind = H("rdfind")
+ Readline = H("readline")
+ Rsync = H("rsync")
+ Sed = H("sed")
+ SPIRVHeaders = H("spirv-headers")
+ SPIRVLLVMTranslator = H("spirv-llvm-translator")
+ SPIRVTools = H("spirv-tools")
+ SquashfsTools = H("squashfs-tools")
+ Strace = H("strace")
+ TamaGo = H("tamago")
+ Tar = H("tar")
+ Texinfo = H("texinfo")
+ Toybox = H("toybox")
+ toyboxEarly = H("toybox-early")
+ Unzip = H("unzip")
+ UtilLinux = H("util-linux")
+ VIM = H("vim")
+ Wayland = H("wayland")
+ WaylandProtocols = H("wayland-protocols")
+ XCB = H("xcb")
+ XCBProto = H("xcb-proto")
+ XDGDBusProxy = H("xdg-dbus-proxy")
+ XZ = H("xz")
+ Xkbcomp = H("xkbcomp")
+ XkeyboardConfig = H("xkeyboard-config")
+ XorgProto = H("xorgproto")
+ Xserver = H("xserver")
+ Zlib = H("zlib")
+ Zstd = H("zstd")
+ stage0Dist = H("stage0-dist")
+ llvmSource = H("llvm-project")
+ earlyCompilerRT = H("early-compiler-rt")
+ earlyRuntimes = H("early-runtimes")
+ buildcatrust = H("python-buildcatrust")
+ utilMacros = H("util-macros")
+ Musl = H("musl")
+ muslHeaders = H("musl-headers")
+ gcc = H("gcc")
+ nettle3 = H("nettle3")
+ Stage0 = H("rosa-stage0")
)