internal/rosa: panic error for invalid handle
All checks were successful
Test / Create distribution (push) Successful in 1m4s
Test / Sandbox (push) Successful in 2m53s
Test / Hakurei (push) Successful in 3m52s
Test / ShareFS (push) Successful in 4m42s
Test / Sandbox (race detector) (push) Successful in 5m28s
Test / Hakurei (race detector) (push) Successful in 6m36s
Test / Flake checks (push) Successful in 1m23s

This enables recovery and better error handling for errors originating from external azalea files.

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
2026-05-18 00:07:39 +09:00
parent f24ae21af1
commit 3e236333a7
3 changed files with 217 additions and 195 deletions

View File

@@ -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()

View File

@@ -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
}

View File

@@ -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")
)