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") 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(), ctx, stop := signal.NotifyContext(context.Background(),
syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP) syscall.SIGINT, syscall.SIGTERM, syscall.SIGHUP)
defer stop() defer stop()

View File

@@ -19,6 +19,9 @@ import (
// ArtifactH is a handle of the unique name of a prepared [pkg.Artifact]. // ArtifactH is a handle of the unique name of a prepared [pkg.Artifact].
type ArtifactH unique.Handle[string] 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. // String returns the name of p.
func (handle ArtifactH) String() string { func (handle ArtifactH) String() string {
return unique.Handle[string](handle).Value() return unique.Handle[string](handle).Value()
@@ -39,6 +42,14 @@ func (handle *ArtifactH) UnmarshalJSON(data []byte) error {
return nil 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 ( type (
// Stage denotes the infrastructure to compile a [pkg.Artifact] on. // Stage denotes the infrastructure to compile a [pkg.Artifact] on.
Stage uint32 Stage uint32
@@ -234,7 +245,7 @@ func (s *S) Get(handle ArtifactH) (meta *Artifact) {
func (s *S) MustGet(handle ArtifactH) (meta *Artifact) { func (s *S) MustGet(handle ArtifactH) (meta *Artifact) {
meta = s.Get(handle) meta = s.Get(handle)
if meta == nil { if meta == nil {
panic("artifact " + strconv.Quote(handle.String()) + " not available") panic(HandleError(handle))
} }
return return
} }
@@ -270,7 +281,7 @@ func (t Toolchain) Load(handle ArtifactH) (pkg.Artifact, string) {
func (t Toolchain) MustLoad(handle ArtifactH) (pkg.Artifact, string) { func (t Toolchain) MustLoad(handle ArtifactH) (pkg.Artifact, string) {
a, version := t.Load(handle) a, version := t.Load(handle)
if a == nil { if a == nil {
panic("artifact " + strconv.Quote(handle.String()) + " not available") panic(HandleError(handle))
} }
return a, version return a, version
} }

View File

@@ -1,197 +1,195 @@
package rosa package rosa
import "unique"
var ( var (
LLVM = ArtifactH(unique.Make("llvm")) LLVM = H("llvm")
EarlyInit = ArtifactH(unique.Make("earlyinit")) EarlyInit = H("earlyinit")
ImageSystem = ArtifactH(unique.Make("system-image")) ImageSystem = H("system-image")
ImageInitramfs = ArtifactH(unique.Make("initramfs-image")) ImageInitramfs = H("initramfs-image")
Kernel = ArtifactH(unique.Make("kernel")) Kernel = H("kernel")
KernelHeaders = ArtifactH(unique.Make("kernel-headers")) KernelHeaders = H("kernel-headers")
KernelSource = ArtifactH(unique.Make("kernel-source")) KernelSource = H("kernel-source")
Firmware = ArtifactH(unique.Make("firmware")) Firmware = H("firmware")
ACL = ArtifactH(unique.Make("acl")) ACL = H("acl")
ArgpStandalone = ArtifactH(unique.Make("argp-standalone")) ArgpStandalone = H("argp-standalone")
Attr = ArtifactH(unique.Make("attr")) Attr = H("attr")
Autoconf = ArtifactH(unique.Make("autoconf")) Autoconf = H("autoconf")
Automake = ArtifactH(unique.Make("automake")) Automake = H("automake")
BC = ArtifactH(unique.Make("bc")) BC = H("bc")
Bash = ArtifactH(unique.Make("bash")) Bash = H("bash")
Binutils = ArtifactH(unique.Make("binutils")) Binutils = H("binutils")
Bison = ArtifactH(unique.Make("bison")) Bison = H("bison")
Bzip2 = ArtifactH(unique.Make("bzip2")) Bzip2 = H("bzip2")
CMake = ArtifactH(unique.Make("cmake")) CMake = H("cmake")
Connman = ArtifactH(unique.Make("connman")) Connman = H("connman")
Coreutils = ArtifactH(unique.Make("coreutils")) Coreutils = H("coreutils")
Curl = ArtifactH(unique.Make("curl")) Curl = H("curl")
DBus = ArtifactH(unique.Make("dbus")) DBus = H("dbus")
DTC = ArtifactH(unique.Make("dtc")) DTC = H("dtc")
Diffutils = ArtifactH(unique.Make("diffutils")) Diffutils = H("diffutils")
Elfutils = ArtifactH(unique.Make("elfutils")) Elfutils = H("elfutils")
Fakeroot = ArtifactH(unique.Make("fakeroot")) Fakeroot = H("fakeroot")
Findutils = ArtifactH(unique.Make("findutils")) Findutils = H("findutils")
Flex = ArtifactH(unique.Make("flex")) Flex = H("flex")
FontUtil = ArtifactH(unique.Make("font-util")) FontUtil = H("font-util")
Freetype = ArtifactH(unique.Make("freetype")) Freetype = H("freetype")
Fuse = ArtifactH(unique.Make("fuse")) Fuse = H("fuse")
GMP = ArtifactH(unique.Make("gmp")) GMP = H("gmp")
GLib = ArtifactH(unique.Make("glib")) GLib = H("glib")
Gawk = ArtifactH(unique.Make("gawk")) Gawk = H("gawk")
GenInitCPIO = ArtifactH(unique.Make("gen_init_cpio")) GenInitCPIO = H("gen_init_cpio")
Gettext = ArtifactH(unique.Make("gettext")) Gettext = H("gettext")
Git = ArtifactH(unique.Make("git")) Git = H("git")
Glslang = ArtifactH(unique.Make("glslang")) Glslang = H("glslang")
GnuTLS = ArtifactH(unique.Make("gnutls")) GnuTLS = H("gnutls")
Go = ArtifactH(unique.Make("go")) Go = H("go")
Gperf = ArtifactH(unique.Make("gperf")) Gperf = H("gperf")
Grep = ArtifactH(unique.Make("grep")) Grep = H("grep")
Gzip = ArtifactH(unique.Make("gzip")) Gzip = H("gzip")
Hakurei = ArtifactH(unique.Make("hakurei")) Hakurei = H("hakurei")
HakureiDist = ArtifactH(unique.Make("hakurei-dist")) HakureiDist = H("hakurei-dist")
Hwdata = ArtifactH(unique.Make("hwdata")) Hwdata = H("hwdata")
IPTables = ArtifactH(unique.Make("iptables")) IPTables = H("iptables")
Kmod = ArtifactH(unique.Make("kmod")) Kmod = H("kmod")
LIT = ArtifactH(unique.Make("lit")) LIT = H("lit")
LibX11 = ArtifactH(unique.Make("libX11")) LibX11 = H("libX11")
LibXau = ArtifactH(unique.Make("libXau")) LibXau = H("libXau")
LibXdmcp = ArtifactH(unique.Make("libXdmcp")) LibXdmcp = H("libXdmcp")
LibXext = ArtifactH(unique.Make("libXext")) LibXext = H("libXext")
LibXfixes = ArtifactH(unique.Make("libXfixes")) LibXfixes = H("libXfixes")
LibXfont2 = ArtifactH(unique.Make("libXfont2")) LibXfont2 = H("libXfont2")
LibXrandr = ArtifactH(unique.Make("libXrandr")) LibXrandr = H("libXrandr")
LibXrender = ArtifactH(unique.Make("libXrender")) LibXrender = H("libXrender")
LibXxf86vm = ArtifactH(unique.Make("libXxf86vm")) LibXxf86vm = H("libXxf86vm")
Libarchive = ArtifactH(unique.Make("libarchive")) Libarchive = H("libarchive")
Libbsd = ArtifactH(unique.Make("libbsd")) Libbsd = H("libbsd")
Libcap = ArtifactH(unique.Make("libcap")) Libcap = H("libcap")
Libconfig = ArtifactH(unique.Make("libconfig")) Libconfig = H("libconfig")
LibdisplayInfo = ArtifactH(unique.Make("libdisplay-info")) LibdisplayInfo = H("libdisplay-info")
Libdrm = ArtifactH(unique.Make("libdrm")) Libdrm = H("libdrm")
Libepoxy = ArtifactH(unique.Make("libepoxy")) Libepoxy = H("libepoxy")
Libev = ArtifactH(unique.Make("libev")) Libev = H("libev")
Libexpat = ArtifactH(unique.Make("libexpat")) Libexpat = H("libexpat")
Libffi = ArtifactH(unique.Make("libffi")) Libffi = H("libffi")
Libfontenc = ArtifactH(unique.Make("libfontenc")) Libfontenc = H("libfontenc")
Libgd = ArtifactH(unique.Make("libgd")) Libgd = H("libgd")
Libglvnd = ArtifactH(unique.Make("libglvnd")) Libglvnd = H("libglvnd")
Libiconv = ArtifactH(unique.Make("libiconv")) Libiconv = H("libiconv")
Libmd = ArtifactH(unique.Make("libmd")) Libmd = H("libmd")
Libmnl = ArtifactH(unique.Make("libmnl")) Libmnl = H("libmnl")
Libnftnl = ArtifactH(unique.Make("libnftnl")) Libnftnl = H("libnftnl")
Libpciaccess = ArtifactH(unique.Make("libpciaccess")) Libpciaccess = H("libpciaccess")
Libpng = ArtifactH(unique.Make("libpng")) Libpng = H("libpng")
Libpsl = ArtifactH(unique.Make("libpsl")) Libpsl = H("libpsl")
Libseccomp = ArtifactH(unique.Make("libseccomp")) Libseccomp = H("libseccomp")
Libtasn1 = ArtifactH(unique.Make("libtasn1")) Libtasn1 = H("libtasn1")
Libtirpc = ArtifactH(unique.Make("libtirpc")) Libtirpc = H("libtirpc")
Libtool = ArtifactH(unique.Make("libtool")) Libtool = H("libtool")
Libucontext = ArtifactH(unique.Make("libucontext")) Libucontext = H("libucontext")
Libunistring = ArtifactH(unique.Make("libunistring")) Libunistring = H("libunistring")
Libva = ArtifactH(unique.Make("libva")) Libva = H("libva")
LibxcbRenderUtil = ArtifactH(unique.Make("libxcb-render-util")) LibxcbRenderUtil = H("libxcb-render-util")
LibxcbUtil = ArtifactH(unique.Make("libxcb-util")) LibxcbUtil = H("libxcb-util")
LibxcbUtilImage = ArtifactH(unique.Make("libxcb-util-image")) LibxcbUtilImage = H("libxcb-util-image")
LibxcbUtilKeysyms = ArtifactH(unique.Make("libxcb-util-keysyms")) LibxcbUtilKeysyms = H("libxcb-util-keysyms")
LibxcbUtilWM = ArtifactH(unique.Make("libxcb-util-wm")) LibxcbUtilWM = H("libxcb-util-wm")
Libxcvt = ArtifactH(unique.Make("libxcvt")) Libxcvt = H("libxcvt")
Libxkbfile = ArtifactH(unique.Make("libxkbfile")) Libxkbfile = H("libxkbfile")
Libxml2 = ArtifactH(unique.Make("libxml2")) Libxml2 = H("libxml2")
Libxshmfence = ArtifactH(unique.Make("libxshmfence")) Libxshmfence = H("libxshmfence")
Libxslt = ArtifactH(unique.Make("libxslt")) Libxslt = H("libxslt")
Libxtrans = ArtifactH(unique.Make("libxtrans")) Libxtrans = H("libxtrans")
LMSensors = ArtifactH(unique.Make("lm_sensors")) LMSensors = H("lm_sensors")
M4 = ArtifactH(unique.Make("m4")) M4 = H("m4")
MPC = ArtifactH(unique.Make("mpc")) MPC = H("mpc")
MPFR = ArtifactH(unique.Make("mpfr")) MPFR = H("mpfr")
Make = ArtifactH(unique.Make("make")) Make = H("make")
Mesa = ArtifactH(unique.Make("mesa")) Mesa = H("mesa")
Meson = ArtifactH(unique.Make("meson")) Meson = H("meson")
Mksh = ArtifactH(unique.Make("mksh")) Mksh = H("mksh")
MuslFts = ArtifactH(unique.Make("musl-fts")) MuslFts = H("musl-fts")
MuslObstack = ArtifactH(unique.Make("musl-obstack")) MuslObstack = H("musl-obstack")
NSS = ArtifactH(unique.Make("nss")) NSS = H("nss")
NSSCACert = ArtifactH(unique.Make("nss-cacert")) NSSCACert = H("nss-cacert")
Ncurses = ArtifactH(unique.Make("ncurses")) Ncurses = H("ncurses")
Nettle = ArtifactH(unique.Make("nettle")) Nettle = H("nettle")
Ninja = ArtifactH(unique.Make("ninja")) Ninja = H("ninja")
OpenSSL = ArtifactH(unique.Make("openssl")) OpenSSL = H("openssl")
P11Kit = ArtifactH(unique.Make("p11-kit")) P11Kit = H("p11-kit")
PCRE2 = ArtifactH(unique.Make("pcre2")) PCRE2 = H("pcre2")
Parallel = ArtifactH(unique.Make("parallel")) Parallel = H("parallel")
Patch = ArtifactH(unique.Make("patch")) Patch = H("patch")
Perl = ArtifactH(unique.Make("perl")) Perl = H("perl")
PerlLocaleGettext = ArtifactH(unique.Make("perl-Locale::gettext")) PerlLocaleGettext = H("perl-Locale::gettext")
PerlMIMECharset = ArtifactH(unique.Make("perl-MIME::Charset")) PerlMIMECharset = H("perl-MIME::Charset")
PerlModuleBuild = ArtifactH(unique.Make("perl-Module::Build")) PerlModuleBuild = H("perl-Module::Build")
PerlPodParser = ArtifactH(unique.Make("perl-Pod::Parser")) PerlPodParser = H("perl-Pod::Parser")
PerlSGMLS = ArtifactH(unique.Make("perl-SGMLS")) PerlSGMLS = H("perl-SGMLS")
PerlTermReadKey = ArtifactH(unique.Make("perl-Term::ReadKey")) PerlTermReadKey = H("perl-Term::ReadKey")
PerlTestCmd = ArtifactH(unique.Make("perl-Test::Cmd")) PerlTestCmd = H("perl-Test::Cmd")
PerlTextCharWidth = ArtifactH(unique.Make("perl-Text::CharWidth")) PerlTextCharWidth = H("perl-Text::CharWidth")
PerlTextWrapI18N = ArtifactH(unique.Make("perl-Text::WrapI18N")) PerlTextWrapI18N = H("perl-Text::WrapI18N")
PerlUnicodeLineBreak = ArtifactH(unique.Make("perl-Unicode::LineBreak")) PerlUnicodeLineBreak = H("perl-Unicode::LineBreak")
PerlYAMLTiny = ArtifactH(unique.Make("perl-YAML::Tiny")) PerlYAMLTiny = H("perl-YAML::Tiny")
Pixman = ArtifactH(unique.Make("pixman")) Pixman = H("pixman")
PkgConfig = ArtifactH(unique.Make("pkg-config")) PkgConfig = H("pkg-config")
Procps = ArtifactH(unique.Make("procps")) Procps = H("procps")
Python = ArtifactH(unique.Make("python")) Python = H("python")
PythonFlitCore = ArtifactH(unique.Make("python-flit-core")) PythonFlitCore = H("python-flit-core")
PythonHatchling = ArtifactH(unique.Make("python-hatchling")) PythonHatchling = H("python-hatchling")
PythonIniConfig = ArtifactH(unique.Make("python-iniconfig")) PythonIniConfig = H("python-iniconfig")
PythonMako = ArtifactH(unique.Make("python-mako")) PythonMako = H("python-mako")
PythonMarkupSafe = ArtifactH(unique.Make("python-markupsafe")) PythonMarkupSafe = H("python-markupsafe")
PythonPackaging = ArtifactH(unique.Make("python-packaging")) PythonPackaging = H("python-packaging")
PythonPathspec = ArtifactH(unique.Make("python-pathspec")) PythonPathspec = H("python-pathspec")
PythonPluggy = ArtifactH(unique.Make("python-pluggy")) PythonPluggy = H("python-pluggy")
PythonPyTest = ArtifactH(unique.Make("python-pytest")) PythonPyTest = H("python-pytest")
PythonPyYAML = ArtifactH(unique.Make("python-pyyaml")) PythonPyYAML = H("python-pyyaml")
PythonPycparser = ArtifactH(unique.Make("python-pycparser")) PythonPycparser = H("python-pycparser")
PythonPygments = ArtifactH(unique.Make("python-pygments")) PythonPygments = H("python-pygments")
PythonSetuptools = ArtifactH(unique.Make("python-setuptools")) PythonSetuptools = H("python-setuptools")
PythonSetuptoolsSCM = ArtifactH(unique.Make("python-setuptools-scm")) PythonSetuptoolsSCM = H("python-setuptools-scm")
PythonTroveClassifiers = ArtifactH(unique.Make("python-trove-classifiers")) PythonTroveClassifiers = H("python-trove-classifiers")
PythonVCSVersioning = ArtifactH(unique.Make("python-vcs-versioning")) PythonVCSVersioning = H("python-vcs-versioning")
PythonWheel = ArtifactH(unique.Make("python-wheel")) PythonWheel = H("python-wheel")
QEMU = ArtifactH(unique.Make("qemu")) QEMU = H("qemu")
Rdfind = ArtifactH(unique.Make("rdfind")) Rdfind = H("rdfind")
Readline = ArtifactH(unique.Make("readline")) Readline = H("readline")
Rsync = ArtifactH(unique.Make("rsync")) Rsync = H("rsync")
Sed = ArtifactH(unique.Make("sed")) Sed = H("sed")
SPIRVHeaders = ArtifactH(unique.Make("spirv-headers")) SPIRVHeaders = H("spirv-headers")
SPIRVLLVMTranslator = ArtifactH(unique.Make("spirv-llvm-translator")) SPIRVLLVMTranslator = H("spirv-llvm-translator")
SPIRVTools = ArtifactH(unique.Make("spirv-tools")) SPIRVTools = H("spirv-tools")
SquashfsTools = ArtifactH(unique.Make("squashfs-tools")) SquashfsTools = H("squashfs-tools")
Strace = ArtifactH(unique.Make("strace")) Strace = H("strace")
TamaGo = ArtifactH(unique.Make("tamago")) TamaGo = H("tamago")
Tar = ArtifactH(unique.Make("tar")) Tar = H("tar")
Texinfo = ArtifactH(unique.Make("texinfo")) Texinfo = H("texinfo")
Toybox = ArtifactH(unique.Make("toybox")) Toybox = H("toybox")
toyboxEarly = ArtifactH(unique.Make("toybox-early")) toyboxEarly = H("toybox-early")
Unzip = ArtifactH(unique.Make("unzip")) Unzip = H("unzip")
UtilLinux = ArtifactH(unique.Make("util-linux")) UtilLinux = H("util-linux")
VIM = ArtifactH(unique.Make("vim")) VIM = H("vim")
Wayland = ArtifactH(unique.Make("wayland")) Wayland = H("wayland")
WaylandProtocols = ArtifactH(unique.Make("wayland-protocols")) WaylandProtocols = H("wayland-protocols")
XCB = ArtifactH(unique.Make("xcb")) XCB = H("xcb")
XCBProto = ArtifactH(unique.Make("xcb-proto")) XCBProto = H("xcb-proto")
XDGDBusProxy = ArtifactH(unique.Make("xdg-dbus-proxy")) XDGDBusProxy = H("xdg-dbus-proxy")
XZ = ArtifactH(unique.Make("xz")) XZ = H("xz")
Xkbcomp = ArtifactH(unique.Make("xkbcomp")) Xkbcomp = H("xkbcomp")
XkeyboardConfig = ArtifactH(unique.Make("xkeyboard-config")) XkeyboardConfig = H("xkeyboard-config")
XorgProto = ArtifactH(unique.Make("xorgproto")) XorgProto = H("xorgproto")
Xserver = ArtifactH(unique.Make("xserver")) Xserver = H("xserver")
Zlib = ArtifactH(unique.Make("zlib")) Zlib = H("zlib")
Zstd = ArtifactH(unique.Make("zstd")) Zstd = H("zstd")
stage0Dist = ArtifactH(unique.Make("stage0-dist")) stage0Dist = H("stage0-dist")
llvmSource = ArtifactH(unique.Make("llvm-project")) llvmSource = H("llvm-project")
earlyCompilerRT = ArtifactH(unique.Make("early-compiler-rt")) earlyCompilerRT = H("early-compiler-rt")
earlyRuntimes = ArtifactH(unique.Make("early-runtimes")) earlyRuntimes = H("early-runtimes")
buildcatrust = ArtifactH(unique.Make("python-buildcatrust")) buildcatrust = H("python-buildcatrust")
utilMacros = ArtifactH(unique.Make("util-macros")) utilMacros = H("util-macros")
Musl = ArtifactH(unique.Make("musl")) Musl = H("musl")
muslHeaders = ArtifactH(unique.Make("musl-headers")) muslHeaders = H("musl-headers")
gcc = ArtifactH(unique.Make("gcc")) gcc = H("gcc")
nettle3 = ArtifactH(unique.Make("nettle3")) nettle3 = H("nettle3")
Stage0 = ArtifactH(unique.Make("rosa-stage0")) Stage0 = H("rosa-stage0")
) )