94 Commits
Author SHA1 Message Date
cat 88a19aefaa internal/rosa/package/python: 3.14.7 to 3.15.0
Test / Create distribution (push) Successful in 55s
Test / Sandbox (push) Successful in 3m23s
Test / Hakurei (push) Successful in 5m30s
Test / Sandbox (race detector) (push) Successful in 6m17s
Test / Hakurei (race detector) (push) Successful in 7m41s
Test / ShareFS (push) Successful in 8m30s
Test / Flake checks (push) Successful in 1m7s
This has been blocking OpenSSL for months. This currently sits on a release candidate.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-15 18:10:22 +09:00
cat f01776200d internal/rosa/package/openssl: 3.6.2 to 4.0.1
Test / Create distribution (push) Successful in 53s
Test / Sandbox (push) Successful in 2m59s
Test / Hakurei (push) Successful in 4m50s
Test / Sandbox (race detector) (push) Successful in 6m19s
Test / Hakurei (race detector) (push) Successful in 7m36s
Test / ShareFS (push) Successful in 7m58s
Test / Flake checks (push) Successful in 1m17s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-15 18:09:23 +09:00
cat e58b6eb171 internal/rosa/package: net-tools
Test / ShareFS (push) Successful in 27s
Test / Create distribution (push) Successful in 28s
Test / Sandbox (push) Successful in 37s
Test / Sandbox (race detector) (push) Successful in 39s
Test / Hakurei (push) Successful in 41s
Test / Hakurei (race detector) (push) Successful in 43s
Test / Flake checks (push) Successful in 1m6s
These are nice to have, but will not be included in the base system.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-15 16:18:44 +09:00
cat 1625aaee80 internal/rosa/package/nss: 3.126 to 3.126.1
Test / Hakurei (push) Successful in 6m50s
Test / Hakurei (race detector) (push) Successful in 9m6s
Test / Sandbox (push) Successful in 4m18s
Test / Sandbox (race detector) (push) Successful in 7m48s
Test / ShareFS (push) Successful in 9m55s
Test / Create distribution (push) Successful in 1m41s
Test / Flake checks (push) Successful in 1m7s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-14 16:19:17 +09:00
cat 203ce6864b internal/rosa/package/go: 1.26.5 to 1.26.6
Test / Hakurei (race detector) (push) Successful in 9m26s
Test / Sandbox (push) Successful in 4m18s
Test / Sandbox (race detector) (push) Successful in 7m51s
Test / ShareFS (push) Successful in 9m42s
Test / Create distribution (push) Successful in 1m25s
Test / Hakurei (push) Successful in 2m54s
Test / Flake checks (push) Successful in 1m7s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-14 16:18:55 +09:00
cat 050051e593 internal/rosa/package/procps: 4.0.6 to 4.0.7
Test / Create distribution (push) Successful in 59s
Test / Sandbox (push) Successful in 3m14s
Test / Hakurei (push) Successful in 5m22s
Test / Sandbox (race detector) (push) Successful in 6m22s
Test / Hakurei (race detector) (push) Successful in 7m48s
Test / ShareFS (push) Successful in 8m11s
Test / Flake checks (push) Successful in 1m16s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-13 20:09:27 +09:00
cat 530b63ca70 internal/rosa/package/harfbuzz: 14.3.0 to 14.3.1
Test / Hakurei (race detector) (push) Successful in 7m54s
Test / Sandbox (push) Successful in 3m9s
Test / Create distribution (push) Successful in 58s
Test / Sandbox (race detector) (push) Successful in 6m25s
Test / ShareFS (push) Successful in 8m3s
Test / Hakurei (push) Successful in 2m50s
Test / Flake checks (push) Successful in 1m14s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-13 20:09:06 +09:00
cat 8821d34b10 internal/pkg: deduplicate unwrapped input errors
Test / Create distribution (push) Successful in 55s
Test / Sandbox (push) Successful in 2m47s
Test / Hakurei (push) Successful in 4m27s
Test / Hakurei (race detector) (push) Successful in 6m58s
Test / Sandbox (race detector) (push) Successful in 5m50s
Test / ShareFS (push) Successful in 7m7s
Test / Flake checks (push) Successful in 1m8s
This avoids repeating errors belonging to multiple instances of the same artifact in different locations in memory.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-12 22:34:12 +09:00
cat 054a8813d7 internal/rosa/package/qemu: disable broken tests
Test / Sandbox (push) Successful in 3m1s
Test / Hakurei (push) Successful in 4m35s
Test / Sandbox (race detector) (push) Successful in 5m59s
Test / Hakurei (race detector) (push) Successful in 7m1s
Test / ShareFS (push) Successful in 7m28s
Test / Flake checks (push) Successful in 1m9s
Test / Create distribution (push) Successful in 50s
The copy-before-write test was failing on a Haswell machine, although it seems to work pretty reliably on the Zen 3 workstation and RK3588.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-12 19:01:49 +09:00
cat 1bc16b51a6 cmd/hakurei: terminate specified instance
Test / Create distribution (push) Successful in 59s
Test / Sandbox (push) Successful in 2m55s
Test / Hakurei (push) Successful in 4m56s
Test / Sandbox (race detector) (push) Successful in 6m7s
Test / Hakurei (race detector) (push) Successful in 7m20s
Test / ShareFS (push) Successful in 7m35s
Test / Flake checks (push) Successful in 1m7s
This is theoretically susceptible to the PID race, but such an event is statistically impossible, and not exploitable in the intended use case, regardless.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-12 18:03:54 +09:00
cat 3718c044c4 internal/rosa/package/qemu: use system meson
Test / Create distribution (push) Successful in 53s
Test / Hakurei (race detector) (push) Successful in 6m56s
Test / Sandbox (push) Successful in 3m1s
Test / Sandbox (race detector) (push) Successful in 5m44s
Test / ShareFS (push) Successful in 7m23s
Test / Hakurei (push) Successful in 3m27s
Test / Flake checks (push) Successful in 1m18s
This also enables meson colour and fixes test suite invocation.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-12 17:57:57 +09:00
cat 07e92db918 internal/rosa/package/dbus: xdg-dbus-proxy 0.1.7 to 0.1.8
Test / Create distribution (push) Successful in 53s
Test / Hakurei (push) Successful in 6m43s
Test / Hakurei (race detector) (push) Successful in 9m16s
Test / Sandbox (push) Successful in 3m33s
Test / Sandbox (race detector) (push) Successful in 6m56s
Test / ShareFS (push) Successful in 9m15s
Test / Flake checks (push) Successful in 1m9s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-12 16:29:07 +09:00
cat d2ee7cb551 internal/rosa/package/qemu: 11.0.3 to 11.1.0
Test / Create distribution (push) Successful in 1m6s
Test / Hakurei (push) Successful in 6m21s
Test / Sandbox (push) Successful in 3m31s
Test / ShareFS (push) Successful in 9m30s
Test / Sandbox (race detector) (push) Successful in 7m47s
Test / Hakurei (race detector) (push) Successful in 9m42s
Test / Flake checks (push) Successful in 1m11s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-12 16:28:47 +09:00
cat 39e757a84d internal/rosa/package/python: wheel 0.47.0 to 0.48.0
Test / Hakurei (race detector) (push) Successful in 10m1s
Test / Sandbox (push) Successful in 3m38s
Test / Hakurei (push) Successful in 2m49s
Test / Sandbox (race detector) (push) Successful in 8m4s
Test / Create distribution (push) Successful in 1m25s
Test / ShareFS (push) Successful in 9m49s
Test / Flake checks (push) Successful in 1m10s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-12 16:28:18 +09:00
cat a431f16e6f internal/pkg: in-flight error resolution
Test / Hakurei (push) Successful in 4m28s
Test / Sandbox (race detector) (push) Successful in 5m55s
Test / Create distribution (push) Successful in 55s
Test / Sandbox (push) Successful in 2m58s
Test / Hakurei (race detector) (push) Successful in 7m35s
Test / ShareFS (push) Successful in 8m31s
Test / Flake checks (push) Successful in 1m32s
The DCE is a slow and overcomplicated solution to a simple problem. This change replaces the DCE by resolving errors in-flight.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-12 16:21:47 +09:00
cat 1f45d44e7f internal/rosa/package/python: hatchling 1.17.1 to 1.18.0
Test / Hakurei (push) Successful in 8m45s
Test / Create distribution (push) Successful in 1m26s
Test / Hakurei (race detector) (push) Successful in 8m47s
Test / Sandbox (push) Successful in 3m33s
Test / Sandbox (race detector) (push) Successful in 7m9s
Test / ShareFS (push) Successful in 32s
Test / Flake checks (push) Successful in 1m13s
This has gained another dependency, pulling in the fourth python build system we have had to package.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-11 21:43:19 +09:00
cat 92d01752ab internal/rosa/package/python: poetry-core tomlkit
Test / Hakurei (push) Successful in 6m34s
Test / Sandbox (push) Successful in 4m18s
Test / Create distribution (push) Successful in 1m46s
Test / ShareFS (push) Successful in 34s
Test / Hakurei (race detector) (push) Successful in 46s
Test / Sandbox (race detector) (push) Successful in 41s
Test / Flake checks (push) Successful in 1m11s
This is the fourth python build system required to package meson. Required by tomlkit which is now required by hatchling (yet another build system).

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-11 21:42:09 +09:00
cat 82bf46d23f internal/rosa/package: replace pkg-config
Test / Hakurei (push) Successful in 5m32s
Test / Sandbox (push) Successful in 3m6s
Test / Create distribution (push) Successful in 1m42s
Test / ShareFS (push) Successful in 31s
Test / Sandbox (race detector) (push) Successful in 39s
Test / Hakurei (race detector) (push) Successful in 43s
Test / Flake checks (push) Successful in 1m12s
This replaces pkg-config with pkgconf for most packages.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-11 21:27:09 +09:00
cat 2abcb99ea2 internal/rosa/package: pkgconf
Test / Create distribution (push) Successful in 1m2s
Test / Sandbox (push) Successful in 3m2s
Test / Hakurei (push) Successful in 5m48s
Test / Sandbox (race detector) (push) Successful in 6m1s
Test / Hakurei (race detector) (push) Successful in 7m29s
Test / ShareFS (push) Successful in 8m2s
Test / Flake checks (push) Successful in 1m18s
This replaces pkg-config for packages later than meson.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-11 21:23:11 +09:00
cat 2218efc0cf internal/rosa: improve nil-exec error reporting
Test / Hakurei (push) Successful in 5m54s
Test / Sandbox (race detector) (push) Successful in 6m42s
Test / Hakurei (race detector) (push) Successful in 8m13s
Test / ShareFS (push) Successful in 8m39s
Test / Flake checks (push) Successful in 1m16s
Test / Create distribution (push) Successful in 1m9s
Test / Sandbox (push) Successful in 3m28s
This panics with a more descriptive error instead of relying on the SIGSEGV handler.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-11 20:40:00 +09:00
cat 30c5525d7b internal/rosa/package/libpsl: 0.23.1 to 0.23.2
Test / Create distribution (push) Successful in 1m0s
Test / Sandbox (push) Successful in 3m1s
Test / Hakurei (push) Successful in 7m29s
Test / Sandbox (race detector) (push) Successful in 5m37s
Test / Hakurei (race detector) (push) Successful in 8m11s
Test / ShareFS (push) Successful in 7m25s
Test / Flake checks (push) Successful in 1m15s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-11 14:39:44 +09:00
cat bf6d1ada71 internal/rosa/package/libexpat: 2.8.2 to 2.8.3
Test / Hakurei (race detector) (push) Successful in 12m22s
Test / Sandbox (push) Successful in 5m19s
Test / Sandbox (race detector) (push) Successful in 6m24s
Test / ShareFS (push) Successful in 11m20s
Test / Create distribution (push) Successful in 1m31s
Test / Hakurei (push) Successful in 3m15s
Test / Flake checks (push) Successful in 1m31s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-11 14:39:16 +09:00
cat 16294a35ee internal/rosa/package/googletest: 1.17.0 to 1.18.0
Test / Hakurei (push) Successful in 8m12s
Test / Hakurei (race detector) (push) Successful in 12m47s
Test / Sandbox (push) Successful in 4m57s
Test / ShareFS (push) Successful in 13m48s
Test / Create distribution (push) Successful in 1m38s
Test / Sandbox (race detector) (push) Successful in 2m33s
Test / Flake checks (push) Successful in 1m34s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-11 14:38:56 +09:00
cat 22756af8fb internal/rosa/package/firmware: 20260622 to 20260810
Test / Flake checks (push) Successful in 1m22s
Test / Hakurei (push) Successful in 10m6s
Test / Sandbox (push) Successful in 5m29s
Test / ShareFS (push) Successful in 13m52s
Test / Create distribution (push) Successful in 1m57s
Test / Sandbox (race detector) (push) Successful in 2m46s
Test / Hakurei (race detector) (push) Successful in 4m41s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-11 14:38:36 +09:00
cat 739ae4a7cf internal/rosa/package/meson: 1.11.2 to 1.12.0
Test / Flake checks (push) Successful in 1m19s
Test / Hakurei (push) Successful in 10m34s
Test / Sandbox (push) Successful in 5m53s
Test / Sandbox (race detector) (push) Successful in 9m53s
Test / ShareFS (push) Successful in 14m40s
Test / Create distribution (push) Successful in 2m28s
Test / Hakurei (race detector) (push) Successful in 5m3s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-11 14:38:13 +09:00
cat eec89c4519 internal/rosa/package/kernel: 6.18.43 to 6.18.44
Test / Hakurei (push) Successful in 7m39s
Test / Create distribution (push) Successful in 54s
Test / Sandbox (push) Successful in 1m33s
Test / Sandbox (race detector) (push) Successful in 2m25s
Test / Hakurei (race detector) (push) Successful in 3m44s
Test / ShareFS (push) Successful in 5m36s
Test / Flake checks (push) Successful in 1m13s
Typo fix of rkisp1_ext_param_buffer_version caused world rebuild.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-11 00:08:47 +09:00
cat 7193656b6a internal/rosa: improve helper bindings
Test / Sandbox (race detector) (push) Successful in 5m50s
Test / Hakurei (race detector) (push) Successful in 7m11s
Test / ShareFS (push) Successful in 7m32s
Test / Flake checks (push) Successful in 1m10s
Test / Create distribution (push) Successful in 54s
Test / Sandbox (push) Successful in 2m59s
Test / Hakurei (push) Successful in 4m49s
This uses more intuitive names for some arguments and inverts their default value. Slices and nil-capable strings replace skip arguments.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-10 21:55:47 +09:00
cat 7d86e19c07 internal/rosa/azalea: implement nil identifier
Test / Hakurei (race detector) (push) Successful in 6m59s
Test / Sandbox (push) Successful in 2m55s
Test / Sandbox (race detector) (push) Successful in 5m43s
Test / ShareFS (push) Successful in 7m12s
Test / Create distribution (push) Successful in 59s
Test / Hakurei (push) Successful in 3m4s
Test / Flake checks (push) Successful in 1m24s
This also implements a nil-capable string type.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-10 21:36:21 +09:00
cat f1ffb180bc internal/rosa: optionally block packages from early stages
Test / Create distribution (push) Successful in 53s
Test / Sandbox (push) Successful in 2m54s
Test / Hakurei (push) Successful in 4m46s
Test / Sandbox (race detector) (push) Successful in 5m49s
Test / Hakurei (race detector) (push) Successful in 7m6s
Test / ShareFS (push) Successful in 7m33s
Test / Flake checks (push) Successful in 1m13s
This helps avoid inadvertently increasing bootstrap input count.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-10 17:50:36 +09:00
cat 7f690145e3 internal/rosa/package/hakurei: 0.4.5 to 0.4.6
Test / Create distribution (push) Successful in 53s
Test / Sandbox (push) Successful in 2m44s
Test / Hakurei (push) Successful in 4m24s
Test / Sandbox (race detector) (push) Successful in 5m47s
Test / Hakurei (race detector) (push) Successful in 6m54s
Test / ShareFS (push) Successful in 7m14s
Test / Flake checks (push) Successful in 1m7s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-09 21:21:39 +09:00
cat c79ae7aed6 release: 0.4.6
Test / Create distribution (push) Successful in 32s
Test / ShareFS (push) Successful in 35s
Test / Sandbox (race detector) (push) Successful in 45s
Test / Hakurei (push) Successful in 44s
Test / Sandbox (push) Successful in 45s
Test / Hakurei (race detector) (push) Successful in 49s
Release / Create release (push) Successful in 57s
Test / Flake checks (push) Successful in 1m7s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-09 20:48:28 +09:00
cat 396ae2ba2a cmd/dist: replace readme with license
Test / Create distribution (push) Successful in 52s
Test / Sandbox (push) Successful in 2m55s
Test / Hakurei (push) Successful in 4m31s
Test / Sandbox (race detector) (push) Successful in 5m53s
Test / Hakurei (race detector) (push) Successful in 7m0s
Test / ShareFS (push) Successful in 7m17s
Test / Flake checks (push) Successful in 1m22s
The readme document is pretty useless for anything other than the website, so replace it with something more relevant.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-09 20:40:52 +09:00
cat 1e85dca9e2 internal/rosa/package/python: setuptools 83.0.0 to 84.0.0
Test / Create distribution (push) Successful in 52s
Test / Sandbox (push) Successful in 2m59s
Test / Hakurei (push) Successful in 4m41s
Test / Sandbox (race detector) (push) Successful in 5m48s
Test / Hakurei (race detector) (push) Successful in 7m1s
Test / ShareFS (push) Successful in 7m24s
Test / Flake checks (push) Successful in 1m9s
This has also turned into AI slop at some point, although its quality was never great to begin with. This may be a candidate to pin and ignore.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-09 19:13:05 +09:00
cat d236c9eaf7 cmd/mbf: improve title format
Test / Hakurei (race detector) (push) Successful in 7m24s
Test / Sandbox (push) Successful in 3m30s
Test / Sandbox (race detector) (push) Successful in 6m3s
Test / Create distribution (push) Successful in 54s
Test / ShareFS (push) Successful in 8m2s
Test / Hakurei (push) Successful in 3m1s
Test / Flake checks (push) Successful in 1m11s
This is cleaner for long-running daemon processes, and the additional information is more intuitive.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-08 13:10:18 +09:00
cat 3c1a6f0793 internal/rosa/package/python: vcs-versioning 2.2.3 to 2.2.4
Test / Create distribution (push) Successful in 1m0s
Test / Sandbox (push) Successful in 2m58s
Test / Hakurei (push) Successful in 4m46s
Test / Sandbox (race detector) (push) Successful in 6m5s
Test / Hakurei (race detector) (push) Successful in 7m16s
Test / ShareFS (push) Successful in 7m48s
Test / Flake checks (push) Successful in 1m27s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-08 13:05:30 +09:00
cat 16f84f9499 internal/rosa/package/kernel: 6.18.42 to 6.18.43
Test / Create distribution (push) Successful in 1m3s
Test / Sandbox (push) Successful in 5m8s
Test / Sandbox (race detector) (push) Successful in 7m23s
Test / Hakurei (push) Successful in 8m38s
Test / Hakurei (race detector) (push) Successful in 9m29s
Test / ShareFS (push) Successful in 10m9s
Test / Flake checks (push) Successful in 1m22s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-08 12:52:27 +09:00
cat 9deed030f0 internal/rosa/package/p11-kit: 0.26.4 to 0.26.5
Test / Create distribution (push) Successful in 1m7s
Test / Sandbox (push) Successful in 3m31s
Test / Hakurei (push) Successful in 9m1s
Test / Sandbox (race detector) (push) Successful in 7m28s
Test / Hakurei (race detector) (push) Successful in 11m50s
Test / ShareFS (push) Successful in 11m8s
Test / Flake checks (push) Successful in 1m23s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-08 12:51:55 +09:00
cat 69095e03c9 internal/rosa/package/nss: nspr 4.39 to 4.40
Test / Hakurei (race detector) (push) Successful in 11m51s
Test / Sandbox (push) Successful in 4m33s
Test / Sandbox (race detector) (push) Successful in 8m32s
Test / ShareFS (push) Successful in 13m45s
Test / Create distribution (push) Successful in 54s
Test / Hakurei (push) Successful in 3m37s
Test / Flake checks (push) Successful in 1m20s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-08 12:51:29 +09:00
cat 8138b2a3f0 internal/rosa/package/lvm2: 2.03.41 to 2.03.42
Test / Hakurei (race detector) (push) Successful in 11m23s
Test / Sandbox (push) Successful in 3m29s
Test / Sandbox (race detector) (push) Successful in 7m57s
Test / ShareFS (push) Successful in 12m12s
Test / Create distribution (push) Successful in 56s
Test / Hakurei (push) Successful in 3m40s
Test / Flake checks (push) Successful in 1m19s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-08 12:50:58 +09:00
cat 308c7d1846 internal/rosa/package/gcc: 16.1.0 to 16.2.0
Test / Sandbox (push) Successful in 3m13s
Test / Hakurei (push) Successful in 6m16s
Test / Sandbox (race detector) (push) Successful in 8m9s
Test / Hakurei (race detector) (push) Successful in 11m13s
Test / ShareFS (push) Successful in 11m21s
Test / Flake checks (push) Successful in 2m33s
Test / Create distribution (push) Successful in 58s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-08 12:50:13 +09:00
cat 807f4ccbeb replace goreportcard badge
Test / Flake checks (push) Successful in 1m9s
Test / Sandbox (push) Successful in 35s
Test / Sandbox (race detector) (push) Successful in 38s
Test / Hakurei (push) Successful in 43s
Test / Hakurei (race detector) (push) Successful in 43s
Test / ShareFS (push) Successful in 31s
Test / Create distribution (push) Successful in 27s
Closes #40.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-07 21:57:06 +09:00
cat f1dd3a085b command: hard wrap help message flags
Test / Create distribution (push) Successful in 53s
Test / Sandbox (push) Successful in 2m51s
Test / Hakurei (push) Successful in 4m29s
Test / Sandbox (race detector) (push) Successful in 5m53s
Test / Hakurei (race detector) (push) Successful in 7m2s
Test / ShareFS (push) Successful in 7m19s
Test / Flake checks (push) Successful in 1m8s
This greatly improves readability when lots of flags are registered.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-07 20:32:24 +09:00
cat b37c1d8993 command: use NUL for magic usage string
Test / Create distribution (push) Successful in 52s
Test / Sandbox (push) Successful in 2m51s
Test / Hakurei (push) Successful in 4m44s
Test / Sandbox (race detector) (push) Successful in 5m46s
Test / Hakurei (race detector) (push) Successful in 7m5s
Test / ShareFS (push) Successful in 7m5s
Test / Flake checks (push) Successful in 1m8s
This change also improves documentation.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-07 18:57:01 +09:00
cat 6a7f124deb internal/rosa/package: cryptsetup
Test / Sandbox (race detector) (push) Successful in 8m26s
Test / ShareFS (push) Successful in 10m12s
Test / Hakurei (race detector) (push) Successful in 11m5s
Test / Flake checks (push) Successful in 1m26s
Test / Create distribution (push) Successful in 56s
Test / Sandbox (push) Successful in 3m3s
Test / Hakurei (push) Successful in 7m43s
Useful for now, will likely be replaced by a native implementation.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-06 18:16:41 +09:00
cat a9a32284b6 internal/rosa/package/mesa: 26.1.6 to 26.2.0
Test / Sandbox (race detector) (push) Successful in 8m49s
Test / ShareFS (push) Successful in 10m24s
Test / Hakurei (race detector) (push) Successful in 11m58s
Test / Hakurei (push) Successful in 5m40s
Test / Flake checks (push) Successful in 1m21s
Test / Create distribution (push) Successful in 1m6s
Test / Sandbox (push) Successful in 3m34s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-06 18:16:08 +09:00
cat 255a1bbf74 internal/rosa/package/fontconfig: 2.18.2 to 2.18.3
Test / Sandbox (push) Successful in 3m12s
Test / Create distribution (push) Successful in 1m5s
Test / Hakurei (push) Successful in 8m16s
Test / Hakurei (race detector) (push) Successful in 7m43s
Test / ShareFS (push) Successful in 8m53s
Test / Flake checks (push) Successful in 1m15s
Test / Sandbox (race detector) (push) Successful in 8m54s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-06 18:15:48 +09:00
cat 96cdf4cc07 internal/rosa/package/python: 3.14.6 to 3.14.7
Test / Sandbox (push) Successful in 3m47s
Test / Sandbox (race detector) (push) Successful in 5m12s
Test / Hakurei (race detector) (push) Successful in 10m19s
Test / Create distribution (push) Successful in 1m5s
Test / Hakurei (push) Successful in 3m25s
Test / ShareFS (push) Successful in 6m14s
Test / Flake checks (push) Successful in 1m8s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-06 18:15:24 +09:00
cat 35a55854fd internal/rosa/package/python: flit-core 3.12.0 to 4.0.2
Test / Hakurei (race detector) (push) Successful in 10m10s
Test / Sandbox (push) Successful in 4m8s
Test / Sandbox (race detector) (push) Successful in 6m34s
Test / ShareFS (push) Successful in 9m22s
Test / Create distribution (push) Successful in 57s
Test / Hakurei (push) Successful in 5m10s
Test / Flake checks (push) Successful in 1m21s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-06 18:14:57 +09:00
cat 2f057cc72f internal/rosa/package/python: packaging 26.2 to 26.3
Test / Flake checks (push) Successful in 1m52s
Test / Sandbox (push) Successful in 3m22s
Test / Create distribution (push) Successful in 1m2s
Test / Hakurei (push) Successful in 8m41s
Test / Sandbox (race detector) (push) Successful in 5m58s
Test / Hakurei (race detector) (push) Successful in 11m8s
Test / ShareFS (push) Successful in 10m17s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-06 18:13:58 +09:00
cat 3356ca3e46 internal/rosa/package/python: mako 1.3.12 to 1.4.1
Test / Flake checks (push) Successful in 1m50s
Test / Create distribution (push) Successful in 1m1s
Test / Sandbox (push) Successful in 4m22s
Test / Hakurei (push) Successful in 8m9s
Test / Sandbox (race detector) (push) Successful in 8m10s
Test / Hakurei (race detector) (push) Successful in 11m10s
Test / ShareFS (push) Successful in 12m31s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-06 18:13:33 +09:00
cat ccef0a086a internal/rosa/package/pango: 1.58.1 to 1.58.2
Test / Flake checks (push) Successful in 1m44s
Test / Create distribution (push) Successful in 54s
Test / Sandbox (push) Successful in 3m22s
Test / Hakurei (push) Successful in 6m25s
Test / Sandbox (race detector) (push) Successful in 8m10s
Test / ShareFS (push) Successful in 11m10s
Test / Hakurei (race detector) (push) Successful in 11m37s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-06 18:12:39 +09:00
cat edb694fb41 internal/rosa/package/x: libXfont2 2.0.8 to 2.0.9
Test / Flake checks (push) Successful in 1m41s
Test / Create distribution (push) Successful in 55s
Test / Sandbox (push) Successful in 3m1s
Test / Hakurei (push) Successful in 5m35s
Test / Sandbox (race detector) (push) Successful in 7m57s
Test / ShareFS (push) Successful in 10m18s
Test / Hakurei (race detector) (push) Successful in 11m54s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-06 18:12:17 +09:00
cat 90535adc89 internal/rosa/package: lvm2
Test / Flake checks (push) Successful in 1m6s
Test / Create distribution (push) Successful in 58s
Test / Sandbox (push) Successful in 3m0s
Test / Hakurei (push) Successful in 4m36s
Test / Sandbox (race detector) (push) Successful in 5m48s
Test / Hakurei (race detector) (push) Successful in 7m6s
Test / ShareFS (push) Successful in 7m19s
This is only really packaged for devmapper, and will eventually be replaced by a native implementation.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-06 16:50:02 +09:00
cat 6fed6d67bd internal/rosa/package: libaio
Test / Create distribution (push) Successful in 56s
Test / Sandbox (push) Successful in 2m54s
Test / Hakurei (push) Successful in 4m45s
Test / Sandbox (race detector) (push) Successful in 5m54s
Test / Hakurei (race detector) (push) Successful in 7m11s
Test / ShareFS (push) Successful in 7m34s
Test / Flake checks (push) Successful in 1m10s
Library for the dreaded AIO syscalls. Test suite is absurdly expensive. Required by lvm2.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-06 15:51:05 +09:00
cat dcaf67b3d7 internal/rosa/package: e2fsprogs
Test / Hakurei (push) Successful in 5m34s
Test / Sandbox (push) Successful in 3m16s
Test / Sandbox (race detector) (push) Successful in 6m19s
Test / ShareFS (push) Successful in 8m16s
Test / Create distribution (push) Successful in 56s
Test / Hakurei (race detector) (push) Successful in 3m49s
Test / Flake checks (push) Successful in 1m22s
These are probably not worth reimplementing, and are quite useful for debugging, regardless.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-06 15:13:33 +09:00
cat c7de3d45e3 internal/rosa/package: popt
Test / Create distribution (push) Successful in 59s
Test / Sandbox (push) Successful in 3m2s
Test / Hakurei (push) Successful in 5m3s
Test / Sandbox (race detector) (push) Successful in 6m23s
Test / Hakurei (race detector) (push) Successful in 7m48s
Test / ShareFS (push) Successful in 8m5s
Test / Flake checks (push) Successful in 1m15s
Somewhat widely-used library. Required by cryptsetup.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-06 15:12:37 +09:00
cat d9bddff160 internal/rosa/package/kernel: 6.18.41 to 6.18.42
Test / Hakurei (race detector) (push) Successful in 7m6s
Test / Sandbox (push) Successful in 2m55s
Test / Sandbox (race detector) (push) Successful in 5m50s
Test / ShareFS (push) Successful in 7m6s
Test / Create distribution (push) Successful in 58s
Test / Hakurei (push) Successful in 3m7s
Test / Flake checks (push) Successful in 1m6s
A change to a single field in a btrfs struct caused world rebuild.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-04 15:04:54 +09:00
cat 5c6dcce543 internal/rosa/package/glslang: switch to vulkan-sdk tags
Test / Create distribution (push) Successful in 1m0s
Test / Sandbox (push) Successful in 3m50s
Test / Hakurei (push) Successful in 6m30s
Test / Sandbox (race detector) (push) Successful in 7m1s
Test / Hakurei (race detector) (push) Successful in 8m32s
Test / ShareFS (push) Successful in 9m21s
Test / Flake checks (push) Successful in 1m7s
This restores compatibility with other SPIRV packages.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-04 13:12:13 +09:00
cat 905a69d2a0 internal/rosa/package/pango: 1.58.0 to 1.58.1
Test / Create distribution (push) Successful in 1m2s
Test / Sandbox (push) Successful in 3m18s
Test / Hakurei (push) Successful in 5m30s
Test / Sandbox (race detector) (push) Successful in 7m3s
Test / Hakurei (race detector) (push) Successful in 8m58s
Test / ShareFS (push) Successful in 8m59s
Test / Flake checks (push) Successful in 1m18s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-04 13:10:34 +09:00
cat e453bc67d0 internal/rosa/package/lua: 5.5.0 to 5.5.1
Test / Hakurei (race detector) (push) Successful in 9m7s
Test / Sandbox (push) Successful in 3m11s
Test / Sandbox (race detector) (push) Successful in 7m1s
Test / ShareFS (push) Successful in 8m16s
Test / Create distribution (push) Successful in 56s
Test / Hakurei (push) Successful in 2m48s
Test / Flake checks (push) Successful in 1m6s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-04 13:10:11 +09:00
cat 0fa145a1a0 internal/rosa/package/libpsl: 0.23.0 to 0.23.1
Test / Create distribution (push) Successful in 59s
Test / Sandbox (push) Successful in 2m55s
Test / Hakurei (push) Successful in 4m43s
Test / Sandbox (race detector) (push) Successful in 6m5s
Test / Hakurei (race detector) (push) Successful in 7m5s
Test / ShareFS (push) Successful in 7m28s
Test / Flake checks (push) Successful in 1m10s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-02 10:15:12 +09:00
cat b5a65d1255 internal/rosa/package/cmake: 4.4.1 to 4.4.2
Test / Hakurei (push) Successful in 8m40s
Test / Hakurei (race detector) (push) Successful in 10m29s
Test / Sandbox (race detector) (push) Successful in 8m32s
Test / ShareFS (push) Successful in 10m48s
Test / Create distribution (push) Successful in 1m26s
Test / Sandbox (push) Successful in 1m35s
Test / Flake checks (push) Successful in 2m2s
Those regressions sure came quickly. Concerning.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-01 16:38:46 +09:00
cat ccdc0fa37e internal/rosa/package/libudev-zero: 1.0.4 to 1.0.5
Test / Sandbox (push) Successful in 5m17s
Test / Create distribution (push) Successful in 1m28s
Test / Hakurei (push) Successful in 11m52s
Test / Sandbox (race detector) (push) Successful in 9m19s
Test / Hakurei (race detector) (push) Successful in 13m57s
Test / ShareFS (push) Successful in 12m36s
Test / Flake checks (push) Successful in 1m16s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-01 16:38:20 +09:00
cat b97518552d internal/rosa/package/spirv: spirv-llvm-translator 22.1.4 to 22.1.5
Test / Create distribution (push) Successful in 54s
Test / Sandbox (push) Successful in 4m57s
Test / Hakurei (push) Successful in 9m25s
Test / Sandbox (race detector) (push) Successful in 10m37s
Test / Hakurei (race detector) (push) Successful in 14m8s
Test / ShareFS (push) Successful in 16m51s
Test / Flake checks (push) Successful in 1m33s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-01 16:37:51 +09:00
cat 67d14dc12c internal/rosa/package/noto: 2026.07.01 to 2026.08.01
Test / Create distribution (push) Successful in 1m12s
Test / Sandbox (push) Successful in 4m16s
Test / Hakurei (push) Successful in 8m40s
Test / Sandbox (race detector) (push) Successful in 10m47s
Test / Hakurei (race detector) (push) Successful in 14m34s
Test / ShareFS (push) Successful in 17m18s
Test / Flake checks (push) Successful in 1m31s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-01 16:37:18 +09:00
cat 695b1b4845 internal/rosa/package/harfbuzz: 14.2.1 to 14.3.0
Test / Create distribution (push) Successful in 1m16s
Test / Sandbox (push) Successful in 3m42s
Test / Hakurei (push) Successful in 7m42s
Test / Sandbox (race detector) (push) Successful in 10m51s
Test / Hakurei (race detector) (push) Successful in 13m57s
Test / ShareFS (push) Successful in 16m55s
Test / Flake checks (push) Successful in 1m38s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-08-01 16:36:58 +09:00
cat 2e5d954f49 internal/rosa/package/hwdata: 0.409 to 0.410
Test / Hakurei (race detector) (push) Successful in 6m59s
Test / Sandbox (push) Successful in 2m44s
Test / Sandbox (race detector) (push) Successful in 5m44s
Test / ShareFS (push) Successful in 6m57s
Test / Create distribution (push) Successful in 53s
Test / Hakurei (push) Successful in 2m50s
Test / Flake checks (push) Successful in 1m8s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-31 21:07:22 +09:00
cat e6af0c405a internal/rosa/package: pipewire/wireplumber
Test / Create distribution (push) Successful in 1m2s
Test / Sandbox (push) Successful in 3m53s
Test / Hakurei (push) Successful in 6m34s
Test / Sandbox (race detector) (push) Successful in 7m2s
Test / Hakurei (race detector) (push) Successful in 8m23s
Test / ShareFS (push) Successful in 9m37s
Test / Flake checks (push) Successful in 1m7s
These are built separately to avoid meson wrap.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-31 17:06:26 +09:00
cat 599a761b27 internal/rosa/package: lua
Test / Create distribution (push) Successful in 51s
Test / Sandbox (push) Successful in 2m55s
Test / Hakurei (push) Successful in 4m54s
Test / Sandbox (race detector) (push) Successful in 6m10s
Test / Hakurei (race detector) (push) Successful in 8m0s
Test / ShareFS (push) Successful in 8m29s
Test / Flake checks (push) Successful in 1m34s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-31 17:03:02 +09:00
cat b7aa91f08f cmd/mbf: set window title
Test / Hakurei (race detector) (push) Successful in 6m57s
Test / Sandbox (push) Successful in 3m8s
Test / Sandbox (race detector) (push) Successful in 5m46s
Test / ShareFS (push) Successful in 7m26s
Test / Create distribution (push) Successful in 50s
Test / Hakurei (push) Successful in 2m54s
Test / Flake checks (push) Successful in 1m9s
This displays ongoing and complete cures via the notify channel.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-31 15:49:07 +09:00
cat 280a736ce3 internal/pkg: cure entry/exit notification
Test / Create distribution (push) Successful in 55s
Test / Sandbox (push) Successful in 2m55s
Test / Hakurei (push) Successful in 4m49s
Test / Sandbox (race detector) (push) Successful in 6m7s
Test / Hakurei (race detector) (push) Successful in 7m42s
Test / ShareFS (push) Successful in 8m10s
Test / Flake checks (push) Successful in 1m39s
This enables cure status display without inspecting internal state.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-31 13:58:32 +09:00
cat 4e41b9bc99 cmd/mbf: all command
Test / Create distribution (push) Successful in 59s
Test / Sandbox (push) Successful in 2m56s
Test / Hakurei (push) Successful in 4m37s
Test / Sandbox (race detector) (push) Successful in 5m52s
Test / Hakurei (race detector) (push) Successful in 7m6s
Test / ShareFS (push) Successful in 7m15s
Test / Flake checks (push) Successful in 1m7s
This is a convenience command to cure all registered packages to avoid relying on the test.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-31 13:16:36 +09:00
cat 153c980a61 internal/rosa/package/kernel: 6.18.40 to 6.18.41
Test / Create distribution (push) Successful in 2m7s
Test / Sandbox (push) Successful in 5m21s
Test / Hakurei (push) Successful in 7m4s
Test / Sandbox (race detector) (push) Successful in 7m57s
Test / Hakurei (race detector) (push) Successful in 9m18s
Test / ShareFS (push) Successful in 9m55s
Test / Flake checks (push) Successful in 1m10s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 23:16:17 +09:00
cat a2f97f7e0f internal/rosa/package: use mirrors.kernel.org
Test / Create distribution (push) Successful in 1m0s
Test / Sandbox (push) Successful in 2m56s
Test / Hakurei (push) Successful in 4m42s
Test / Sandbox (race detector) (push) Successful in 5m56s
Test / Hakurei (race detector) (push) Successful in 7m12s
Test / ShareFS (push) Successful in 7m23s
Test / Flake checks (push) Successful in 1m16s
The GNU mirror redirector was down yet again, and I have had enough. This change replaces all mentions of ftpmirror.gnu.org with mirrors.kernel.org.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 22:59:08 +09:00
cat 5e1b4bb0b8 cmd/mbf: print checksum to stdout
Test / Create distribution (push) Successful in 1m0s
Test / Sandbox (push) Successful in 3m10s
Test / Hakurei (push) Successful in 5m12s
Test / Sandbox (race detector) (push) Successful in 6m20s
Test / Hakurei (race detector) (push) Successful in 7m23s
Test / ShareFS (push) Successful in 7m54s
Test / Flake checks (push) Successful in 1m11s
Same as the cure command, enables usage in scripts.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 22:45:05 +09:00
cat e73f9e0626 internal/pkg: highlight miscellaneous verbose output
Test / Create distribution (push) Successful in 59s
Test / Sandbox (push) Successful in 3m11s
Test / Hakurei (push) Successful in 5m10s
Test / Sandbox (race detector) (push) Successful in 6m23s
Test / Hakurei (race detector) (push) Successful in 7m51s
Test / ShareFS (push) Successful in 8m21s
Test / Flake checks (push) Successful in 1m18s
These were missed when adding highlight for core cache verbose output.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 22:41:18 +09:00
cat ddd90b780b internal/rosa: drain optional unstructured input
Test / Create distribution (push) Successful in 56s
Test / Sandbox (push) Successful in 2m56s
Test / Hakurei (push) Successful in 4m48s
Test / Sandbox (race detector) (push) Successful in 6m2s
Test / Hakurei (race detector) (push) Successful in 7m46s
Test / ShareFS (push) Successful in 7m56s
Test / Flake checks (push) Successful in 1m26s
This was missed, causing non-minimal kindEtc IR to be rejected.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 22:39:29 +09:00
cat 89c32f5614 cmd/mbf: print outcome pathname to stdout
Test / Create distribution (push) Successful in 1m1s
Test / Sandbox (push) Successful in 3m6s
Test / Hakurei (push) Successful in 4m47s
Test / Sandbox (race detector) (push) Successful in 6m4s
Test / Hakurei (race detector) (push) Successful in 7m10s
Test / ShareFS (push) Successful in 7m30s
Test / Flake checks (push) Successful in 1m6s
This enables use of the cure command in scripts.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 17:39:56 +09:00
cat 1567a3e582 internal/pkg: highlight cache verbose output
Test / Create distribution (push) Successful in 53s
Test / Sandbox (push) Successful in 2m49s
Test / Hakurei (push) Successful in 4m33s
Test / Sandbox (race detector) (push) Successful in 5m50s
Test / Hakurei (race detector) (push) Successful in 7m11s
Test / ShareFS (push) Successful in 7m34s
Test / Flake checks (push) Successful in 1m21s
This highlights sections of messages, increasing readability in some cases.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 17:35:49 +09:00
cat aa9952cd9e internal/rosa/package/spirv: 1.4.350.1 to 1.4.357.0
Test / Create distribution (push) Successful in 53s
Test / Sandbox (push) Successful in 3m1s
Test / Hakurei (push) Successful in 4m34s
Test / Sandbox (race detector) (push) Successful in 5m56s
Test / Hakurei (race detector) (push) Successful in 6m56s
Test / ShareFS (push) Successful in 7m21s
Test / Flake checks (push) Successful in 1m12s
This also switches spirv-tools to the vulkan-sdk tags to remain compatible with spriv-headers.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 16:52:25 +09:00
cat 99efc551ad internal/rosa/package/meson: respect CLICOLOR_FORCE
Test / Create distribution (push) Successful in 1m17s
Test / Sandbox (push) Successful in 3m22s
Test / Hakurei (push) Successful in 6m25s
Test / Sandbox (race detector) (push) Successful in 7m47s
Test / Hakurei (race detector) (push) Successful in 10m39s
Test / ShareFS (push) Successful in 14m12s
Test / Flake checks (push) Successful in 1m37s
Upstream had ticket and patch available since 2017, still unmerged and refuses to support the environment variable, so patch it in. This also strips out the variable for test execution to work around buggy test suites like glib.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 08:51:46 +09:00
cat 4dbfee0698 internal/rosa: force output colouring
Test / Create distribution (push) Successful in 58s
Test / Sandbox (push) Successful in 3m0s
Test / Hakurei (push) Successful in 4m45s
Test / Sandbox (race detector) (push) Successful in 6m0s
Test / Hakurei (race detector) (push) Successful in 7m16s
Test / ShareFS (push) Successful in 7m47s
Test / Flake checks (push) Successful in 2m56s
This sets known de facto standard environment variables to enable colours during builds.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 06:01:54 +09:00
cat 4e65e41101 internal/rosa/package/mesa: 26.1.5 to 26.1.6
Test / Create distribution (push) Successful in 54s
Test / Sandbox (push) Successful in 3m33s
Test / Hakurei (push) Successful in 5m54s
Test / Sandbox (race detector) (push) Successful in 6m7s
Test / Hakurei (race detector) (push) Successful in 8m5s
Test / ShareFS (push) Successful in 7m16s
Test / Flake checks (push) Successful in 1m13s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 05:19:55 +09:00
cat b8306fe9e2 internal/rosa/package/python: vcs-versioning 2.2.2 to 2.2.3
Test / Create distribution (push) Successful in 1m7s
Test / Sandbox (push) Successful in 2m58s
Test / Hakurei (push) Successful in 6m24s
Test / Sandbox (race detector) (push) Successful in 5m37s
Test / Hakurei (race detector) (push) Successful in 8m14s
Test / ShareFS (push) Successful in 7m39s
Test / Flake checks (push) Successful in 1m20s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 05:19:21 +09:00
cat 6b246e9036 internal/rosa/package/glib: 2.89.2 to 2.89.3
Test / Sandbox (push) Successful in 1m32s
Test / Create distribution (push) Successful in 1m0s
Test / Sandbox (race detector) (push) Successful in 4m45s
Test / Hakurei (race detector) (push) Successful in 8m33s
Test / ShareFS (push) Successful in 7m26s
Test / Hakurei (push) Successful in 32m29s
Test / Flake checks (push) Successful in 1m9s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 05:18:23 +09:00
cat 869820ec6d cmd/mbf: enable output colouring
Test / Create distribution (push) Successful in 58s
Test / Sandbox (push) Successful in 3m36s
Test / Hakurei (push) Successful in 6m11s
Test / Sandbox (race detector) (push) Successful in 7m44s
Test / Hakurei (race detector) (push) Successful in 9m57s
Test / ShareFS (push) Successful in 10m35s
Test / Flake checks (push) Successful in 1m30s
This respects the de facto standards, on top of checking stderr.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 05:16:39 +09:00
cat 6fb2065a51 internal/pkg: optionally colour output
Test / Create distribution (push) Successful in 53s
Test / Sandbox (push) Successful in 2m55s
Test / Hakurei (push) Successful in 5m2s
Test / Sandbox (race detector) (push) Successful in 6m19s
Test / ShareFS (push) Successful in 8m41s
Test / Hakurei (race detector) (push) Successful in 8m49s
Test / Flake checks (push) Successful in 1m29s
This increases readability in some cases.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 05:15:19 +09:00
cat 698fd2d66a internal/rosa/package/libarchive: 3.8.8 to 3.8.9
Test / Create distribution (push) Successful in 1m6s
Test / Sandbox (push) Successful in 3m8s
Test / Hakurei (push) Successful in 5m32s
Test / Sandbox (race detector) (push) Successful in 6m28s
Test / Hakurei (race detector) (push) Successful in 7m49s
Test / ShareFS (push) Successful in 8m9s
Test / Flake checks (push) Successful in 1m14s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 04:02:23 +09:00
cat 4cfbc93aa0 internal/rosa/package/gcc: binutils 2.46.1 to 2.47
Test / Create distribution (push) Successful in 55s
Test / Sandbox (push) Successful in 3m3s
Test / Hakurei (push) Successful in 4m59s
Test / Sandbox (race detector) (push) Successful in 6m24s
Test / Hakurei (race detector) (push) Successful in 8m0s
Test / ShareFS (push) Successful in 8m12s
Test / Flake checks (push) Successful in 1m15s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 04:02:00 +09:00
cat feec4b0d22 internal/rosa/package/cmake: 4.4.0 to 4.4.1
Test / Create distribution (push) Successful in 57s
Test / Sandbox (push) Successful in 2m59s
Test / Hakurei (push) Successful in 5m16s
Test / Sandbox (race detector) (push) Successful in 6m37s
Test / Hakurei (race detector) (push) Successful in 7m44s
Test / ShareFS (push) Successful in 8m23s
Test / Flake checks (push) Successful in 1m15s
Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 03:24:48 +09:00
cat 6487b41d92 internal/rosa: remove legacy exec helper
Test / Hakurei (race detector) (push) Successful in 9m33s
Test / Sandbox (push) Successful in 5m27s
Test / Sandbox (race detector) (push) Successful in 8m21s
Test / ShareFS (push) Successful in 10m32s
Test / Create distribution (push) Successful in 1m51s
Test / Hakurei (push) Successful in 3m5s
Test / Flake checks (push) Successful in 1m28s
This change also adds a fourth stage to the bootstrap machinery, offering more correct toolchain validation that works around LLVM dynamic linking flaws.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-30 00:18:22 +09:00
cat 7908fb9583 internal/rosa/llvm: exclude runtime symbols
Test / Hakurei (push) Successful in 4m44s
Test / Sandbox (push) Successful in 3m5s
Test / Sandbox (race detector) (push) Successful in 5m55s
Test / ShareFS (push) Successful in 7m22s
Test / Create distribution (push) Successful in 1m0s
Test / Hakurei (race detector) (push) Successful in 6m22s
Test / Flake checks (push) Successful in 1m13s
These leak by default when static linking, which is considered unacceptable for many libraries.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-29 03:00:59 +09:00
cat 95aa7c205c internal/rosa: remove calls to low-level exec helper
Test / Create distribution (push) Successful in 53s
Test / Sandbox (push) Successful in 2m54s
Test / Hakurei (push) Successful in 4m32s
Test / Sandbox (race detector) (push) Successful in 5m48s
Test / Hakurei (race detector) (push) Successful in 6m59s
Test / ShareFS (push) Successful in 7m29s
Test / Flake checks (push) Successful in 1m12s
This method predates the helper infrastructure, it is awkward to use and difficult to maintain for the replacement bootstrap mechanism. This change prepares for its removal.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-27 18:24:38 +09:00
cat bd0cc3656f internal/rosa/llvm: statically link libc++
Test / Hakurei (race detector) (push) Successful in 6m54s
Test / Sandbox (push) Successful in 2m53s
Test / Sandbox (race detector) (push) Successful in 5m58s
Test / ShareFS (push) Successful in 7m25s
Test / Create distribution (push) Successful in 53s
Test / Hakurei (push) Successful in 2m51s
Test / Flake checks (push) Successful in 1m9s
This avoids unnecessarily depending on the toolchain.

Signed-off-by: Ophestra <cat@gensokyo.uk>
2026-07-27 18:15:00 +09:00
156 changed files with 1942 additions and 4602 deletions
+1 -1
View File
@@ -11,7 +11,7 @@
<a href="https://git.gensokyo.uk/rosa/hakurei/actions"><img src="https://git.gensokyo.uk/rosa/hakurei/actions/workflows/test.yml/badge.svg?branch=staging&style=flat-square" alt="Gitea Workflow Status" /></a>
<br/>
<a href="https://git.gensokyo.uk/rosa/hakurei/releases"><img src="https://img.shields.io/gitea/v/release/rosa/hakurei?gitea_url=https%3A%2F%2Fgit.gensokyo.uk&color=purple" alt="Release" /></a>
<a href="https://goreportcard.com/report/hakurei.app"><img src="https://goreportcard.com/badge/hakurei.app" alt="Go Report Card" /></a>
<a href="https://git.gensokyo.uk/rosa/hakurei/src/branch/master/LICENSE"><img src="https://img.shields.io/badge/license-MIT-pink" alt="MIT License" /></a>
<a href="https://hakurei.app"><img src="https://img.shields.io/website?url=https%3A%2F%2Fhakurei.app" alt="Website" /></a>
</p>
+1 -1
View File
@@ -1 +1 @@
v0.4.5
v0.4.6
+6
View File
@@ -36,6 +36,11 @@ _hakurei_show() {
'files:files:__hakurei_files'
}
_hakurei_kill() {
_alternative \
'instances:domains:__hakurei_instances'
}
__hakurei_files() {
_files -g "*.(json|hakurei)"
return $?
@@ -60,6 +65,7 @@ __hakurei_instances() {
"run:Load and start container from configuration file"
"exec:Configure and start a permissive container"
"show:Show live or local instance configuration"
"kill:Terminate an active instance"
"ps:List active instances"
"version:Display version information"
"license:Show full license text"
+2 -2
View File
@@ -217,7 +217,7 @@ func main() {
mustWriteFile("comp/", nil, os.ModeDir|0755)
mustWriteFile("comp/_hakurei", comp, 0644)
mustWriteFile("install.sh", []byte(`#!/bin/sh -e
cd "$(dirname -- "$0")" || exit 1
cd "$(dirname -- "$0")"
install -vDm0755 "bin/hakurei" "${DESTDIR}`+prefix+`/bin/hakurei"
install -vDm0755 "bin/sharefs" "${DESTDIR}`+prefix+`/bin/sharefs"
@@ -230,7 +230,7 @@ fi
install -vDm0644 "comp/_hakurei" "${DESTDIR}`+prefix+`/share/zsh/site-functions/_hakurei"
`), 0755)
mustWriteFromPath("README.md", "README.md", 0)
mustWriteFromPath("LICENSE", "LICENSE", 0)
mustWriteFile("hsurc.default", []byte("1000 0"), 0400)
mustWriteFromPath("bin/hsu", filepath.Join(s, "hsu"), 04511)
for _, name := range []string{
+18
View File
@@ -11,6 +11,7 @@ import (
"os/user"
"strconv"
"sync"
"syscall"
"time"
"hakurei.app/check"
@@ -372,6 +373,23 @@ func buildCommand(ctx context.Context, msg message.Msg, early *earlyHardeningErr
Flag(&flagNoStore, "no-store", command.BoolFlag(false), "Do not attempt to match from active instances")
}
c.NewCommand("kill", "Terminate an active instance", func(args []string) error {
if len(args) != 1 {
log.Fatal("kill requires 1 argument")
}
var sc hst.Paths
env.CopyPaths().Copy(&sc, new(outcome.Hsu).MustID(nil))
entry := tryIdentifier(msg, args[0], outcome.NewStore(&sc))
if entry == nil {
log.Fatalf("%q does not match any active instance", args[0])
}
if err := syscall.Kill(entry.PID, syscall.SIGTERM); err != nil {
log.Fatalf("cannot terminate %s: %v", entry.ID.String(), err)
}
return errSuccess
})
{
var flagShort bool
c.NewCommand("ps", "List active instances", func(args []string) error {
+10 -6
View File
@@ -19,13 +19,13 @@ func TestHelp(t *testing.T) {
want string
}{
{
"main", []string{}, `
Usage: hakurei [-h | --help] [-v] [--insecure] [--json] COMMAND [OPTIONS]
"main", []string{}, `usage: hakurei [-h | --help] [-v] [--insecure] [--json] <command> [<args>]
Commands:
commands:
run Load and start container from configuration file
exec Configure and start a permissive container
show Show live or local instance configuration
kill Terminate an active instance
ps List active instances
version Display version information
license Show full license text
@@ -35,10 +35,14 @@ Commands:
`,
},
{
"exec", []string{"exec", "-h"}, `
Usage: hakurei exec [-h | --help] [--dbus-config <value>] [--dbus-system <value>] [--mpris] [--dbus-log] [--id <value>] [-a <int>] [-g <value>] [-d <value>] [-u <value>] [--policy <value>] [--priority <int>] [--private-runtime] [--private-tmpdir] [--wayland] [-X] [--dbus] [--pipewire] [--pulse] COMMAND [OPTIONS]
"exec", []string{"exec", "-h"}, `usage: hakurei exec [-h | --help] [--dbus-config <value>]
[--dbus-system <value>] [--mpris] [--dbus-log]
[--id <value>] [-a <int>] [-g <value>] [-d <value>]
[-u <value>] [--policy <value>] [--priority <int>]
[--private-runtime] [--private-tmpdir] [--wayland] [-X]
[--dbus] [--pipewire] [--pulse] <command> [<args>]
Flags:
flags:
-X Enable direct connection to X11
-a int
Application identity
+54
View File
@@ -5,6 +5,7 @@ import (
"net/http"
"os"
"path/filepath"
"strconv"
"testing"
"hakurei.app/check"
@@ -28,6 +29,8 @@ type cache struct {
idle bool
// Unset [pkg.CSuppressInit].
verboseInit bool
// Whether to enable output colours.
color bool
// Unset [pkg.CExternShallow].
deep bool
// Loaded artifact of [rosa.QEMU].
@@ -36,18 +39,32 @@ type cache struct {
base, mirror string
}
// writeTitle sets title of the terminal connected to [message.Msg].
func writeTitle(msg message.Msg, s string) {
msg.Suspend()
w := msg.GetLogger().Writer()
_, _ = w.Write([]byte("\x1b]0;" + s + "\a"))
msg.Resume()
}
// open opens the underlying [pkg.Cache].
func (cache *cache) open() (err error) {
if cache.c != nil {
return os.ErrInvalid
}
var hostname string
if hostname, err = os.Hostname(); err != nil {
return
}
var base *check.Absolute
if cache.base, err = filepath.Abs(cache.base); err != nil {
return
} else if base, err = check.NewAbs(cache.base); err != nil {
return
}
var notify chan bool
if cache.idle {
cache.attr.Flags |= pkg.CSchedIdle
@@ -61,6 +78,11 @@ func (cache *cache) open() (err error) {
if !cache.deep {
cache.attr.Flags |= pkg.CExternShallow
}
if cache.color {
cache.attr.Flags |= pkg.CColourOutput
notify = make(chan bool, 1<<12)
cache.attr.Notify = notify
}
done := make(chan struct{})
defer close(done)
@@ -104,6 +126,33 @@ func (cache *cache) open() (err error) {
cache.c.SetExternal(r)
}
if cache.attr.Notify != nil {
cache.msg.Suspend()
_, _ = cache.msg.GetLogger().Writer().Write([]byte("\x1b[22;0t"))
cache.msg.Resume()
prefix := hostname + ": mbf "
go func() {
var n, nc uint64
for enter := range notify {
if enter {
nc++
} else {
nc--
n++
}
if nc == 0 {
writeTitle(cache.msg, prefix[:len(prefix)-1])
continue
}
writeTitle(cache.msg, prefix+
"("+strconv.FormatUint(nc, 10)+
" running, "+strconv.FormatUint(n, 10)+" complete)")
}
}()
}
if cache.qemu != nil {
var pathname *check.Absolute
pathname, _, err = cache.c.Cure(cache.qemu)
@@ -124,6 +173,11 @@ func (cache *cache) open() (err error) {
func (cache *cache) Close() {
if cache.c != nil {
cache.c.Close()
if cache.attr.Notify != nil {
cache.msg.Suspend()
_, _ = cache.msg.GetLogger().Writer().Write([]byte("\x1b[23;0t"))
cache.msg.Resume()
}
}
}
+45 -7
View File
@@ -92,6 +92,11 @@ func main() {
var cm cache
defer func() { cm.Close() }()
if cm.color = ext.Isatty(syscall.Stderr) &&
os.Getenv("NO_COLOR") == "" &&
os.Getenv("TERM") != "dumb"; cm.color {
log.SetPrefix("\x1b[2mmbf: \x1b[0m")
}
var (
flagQuiet bool
@@ -278,7 +283,7 @@ func main() {
if _, err := io.Copy(h, os.Stdin); err != nil {
return err
}
log.Println(pkg.Encode(pkg.Checksum(h.Sum(nil))))
fmt.Println(pkg.Encode(pkg.Checksum(h.Sum(nil))))
return nil
},
)
@@ -616,7 +621,7 @@ func main() {
{
c.NewCommand(
"stage3",
"stage4",
"Check for toolchain 3-stage non-determinism",
func(args []string) (err error) {
var (
@@ -636,21 +641,31 @@ func main() {
if err = cm.Do(func(cache *pkg.Cache) (err error) {
_, llvm := rosa.Native().New(rosa.Std - 1).Load(_llvm)
pathname, checksum[0], err = cache.Cure(llvm)
pathname, _, err = cache.Cure(llvm)
return
}); err != nil {
return
}
log.Println("stage2:", pathname)
if err = cm.Do(func(cache *pkg.Cache) (err error) {
_, llvm := rosa.Native().New(rosa.Std).Load(_llvm)
pathname, checksum[1], err = cache.Cure(llvm)
pathname, checksum[0], err = cache.Cure(llvm)
return
}); err != nil {
return
}
log.Println("stage3:", pathname)
if err = cm.Do(func(cache *pkg.Cache) (err error) {
_, llvm := rosa.Native().New(rosa.Stage3).Load(_llvm)
pathname, checksum[1], err = cache.Cure(llvm)
return
}); err != nil {
return
}
log.Println("stage4:", pathname)
if checksum[0] != checksum[1] {
err = &pkg.ChecksumMismatchError{
Got: checksum[0].Value(),
@@ -658,7 +673,7 @@ func main() {
}
} else {
log.Println(
"stage2 is identical to stage3",
"stage3 is identical to stage4",
"("+pkg.Encode(checksum[0].Value())+")",
)
}
@@ -667,6 +682,25 @@ func main() {
)
}
c.NewCommand(
"all",
command.UsageInternal,
func([]string) error {
all := rosa.Native().CollectAll()
a := make(pkg.Collect, len(all))
for i, h := range all {
_, a[i] = rosa.Native().Std().Load(h)
}
return cm.Do(func(cache *pkg.Cache) (err error) {
_, _, err = cache.Cure(&a)
if pkg.IsCollected(err) {
err = nil
}
return
})
},
)
{
var (
flagDump string
@@ -730,7 +764,7 @@ func main() {
if err != nil {
return err
}
log.Println(pathname)
fmt.Println(pathname)
if flagExport != "" {
msg.Verbosef("exporting %s to %s...", args[0], flagExport)
@@ -791,7 +825,7 @@ func main() {
}
pathname, err := cureRemote(ctx, &addr, a, flags)
if !flagNoReply && err == nil {
log.Println(pathname)
fmt.Println(pathname)
}
if errors.Is(err, context.Canceled) {
@@ -1162,6 +1196,10 @@ func main() {
if w, ok := err.(interface{ Unwrap() []error }); !ok {
log.Fatal(err)
} else {
if _, ok = w.(pkg.InputError); ok {
log.Fatal(w)
}
errs := w.Unwrap()
for i, e := range errs {
if i == len(errs)-1 {
+3 -2
View File
@@ -13,6 +13,7 @@ func New(output io.Writer, logf LogFunc, name string, early HandlerFunc) Command
return c
}
// newNode initialises a subcommand tree and returns its address.
func newNode(output io.Writer, logf LogFunc, name, usage string) *node {
n := &node{
name: name, usage: usage,
@@ -22,8 +23,8 @@ func newNode(output io.Writer, logf LogFunc, name, usage string) *node {
n.set.SetOutput(output)
n.set.Usage = func() {
_ = n.writeHelp()
if n.suffix.Len() > 0 {
_, _ = fmt.Fprintln(output, "Flags:")
if len(n.suffix) > 0 {
_, _ = fmt.Fprintln(output, "flags:")
n.set.PrintDefaults()
_, _ = fmt.Fprintln(output)
}
+16 -4
View File
@@ -18,8 +18,14 @@ func TestBuild(t *testing.T) {
t.Run("direct zero length", func(t *testing.T) {
wantPanic := "invalid subcommand"
t.Run("zero length name", func(t *testing.T) { defer checkRecover(t, "Command", wantPanic); c.Command("", "usage", stubHandler) })
t.Run("zero length usage", func(t *testing.T) { defer checkRecover(t, "Command", wantPanic); c.Command("name", "", stubHandler) })
t.Run("zero length name", func(t *testing.T) {
defer checkRecover(t, "Command", wantPanic)
c.Command("", "usage", stubHandler)
})
t.Run("zero length usage", func(t *testing.T) {
defer checkRecover(t, "Command", wantPanic)
c.Command("name", "", stubHandler)
})
})
t.Run("direct adopt unique names", func(t *testing.T) {
@@ -34,8 +40,14 @@ func TestBuild(t *testing.T) {
t.Run("zero length", func(t *testing.T) {
wantPanic := "invalid subcommand tree"
t.Run("zero length name", func(t *testing.T) { defer checkRecover(t, "New", wantPanic); c.New("", "usage") })
t.Run("zero length usage", func(t *testing.T) { defer checkRecover(t, "New", wantPanic); c.New("name", "") })
t.Run("zero length name", func(t *testing.T) {
defer checkRecover(t, "New", wantPanic)
c.New("", "usage")
})
t.Run("zero length usage", func(t *testing.T) {
defer checkRecover(t, "New", wantPanic)
c.New("name", "")
})
})
t.Run("direct adopt unique names", func(t *testing.T) {
+26 -6
View File
@@ -6,36 +6,43 @@ import (
"strings"
)
// UsageInternal causes the command to be hidden from help text when set as the usage string.
const UsageInternal = "internal"
// UsageInternal is a special usage string that hides the command from the
// generated help message.
const UsageInternal = "\x00"
type (
// HandlerFunc is called when matching a directly handled subcommand tree.
HandlerFunc = func(args []string) error
// LogFunc is the function signature of a printf function.
// LogFunc is the function signature of a printf function. The zero value
// implies [log.Printf].
LogFunc = func(format string, a ...any)
// FlagDefiner is a deferred flag definer value, usually encapsulating the default value.
// FlagDefiner is a deferred flag definer value, usually encapsulating the
// default value.
FlagDefiner interface {
// Define defines the flag in set.
Define(b *strings.Builder, set *flag.FlagSet, p any, name, usage string)
}
// A Flag is satisfied by command objects capable of receiving flags.
Flag[T any] interface {
// Flag defines a generic flag type in Node's flag set.
Flag(p any, name string, value FlagDefiner, usage string) T
}
// A Command is the root of a command tree.
Command interface {
Parse(arguments []string) error
// MustParse determines exit outcomes for Parse errors
// and calls handleError if [HandlerFunc] returns a non-nil error.
// MustParse determines exit outcomes for Parse errors and calls
// handleError if [HandlerFunc] returns a non-nil error.
MustParse(arguments []string, handleError func(error))
baseNode[Command]
}
// A Node is a subcommand under a [Command].
Node baseNode[Node]
baseNode[T any] interface {
@@ -53,3 +60,16 @@ type (
Flag[T]
}
)
// rootNode satisfies baseNode for [Command].
type rootNode struct{ *node }
func (r rootNode) Command(name, usage string, f HandlerFunc) Command {
r.node.Command(name, usage, f)
return r
}
func (r rootNode) Flag(p any, name string, value FlagDefiner, usage string) Command {
r.node.Flag(p, name, value, usage)
return r
}
+7 -1
View File
@@ -16,7 +16,13 @@ func (e FlagError) Is(target error) bool {
}
func (n *node) Flag(p any, name string, value FlagDefiner, usage string) Node {
value.Define(&n.suffix, n.set, p, name, usage)
var buf strings.Builder
value.Define(&buf, n.set, p, name, usage)
s := buf.String()
if len(s) > 0 && s[0] == ' ' {
s = s[1:]
}
n.suffix = append(n.suffix, s)
return n
}
+21 -3
View File
@@ -1,6 +1,7 @@
package command
import (
"bytes"
"errors"
"fmt"
"io"
@@ -13,14 +14,31 @@ var ErrHelp = errors.New("help requested")
func (n *node) PrintHelp() { _ = n.writeHelp() }
func (n *node) writeHelp() error {
prefix := strings.Join(append(n.prefix, n.name), " ")
var buf strings.Builder
offset := 7 + len(prefix)
line := offset + 14
w := bytes.Repeat([]byte{' '}, offset+1)
w[0] = '\n'
for _, flag := range n.suffix {
line += len(flag) + 1
if line >= 80 {
line = offset + len(flag) + 1
buf.Write(w)
}
buf.WriteByte(' ')
buf.WriteString(flag)
}
if _, err := fmt.Fprintf(n.out,
"\nUsage:\t%s [-h | --help]%s COMMAND [OPTIONS]\n",
strings.Join(append(n.prefix, n.name), " "), &n.suffix,
"usage: %s [-h | --help]%s <command> [<args>]\n",
prefix, &buf,
); err != nil {
return err
}
if n.child != nil {
if _, err := fmt.Fprint(n.out, "\nCommands:\n"); err != nil {
if _, err := fmt.Fprint(n.out, "\ncommands:\n"); err != nil {
return err
}
}
+6 -2
View File
@@ -3,9 +3,9 @@ package command
import (
"flag"
"io"
"strings"
)
// A node represents a command.
type node struct {
child, next *node
name, usage string
@@ -13,13 +13,16 @@ type node struct {
out io.Writer
logf LogFunc
// Names of commands preceding node.
prefix []string
suffix strings.Builder
// Short user-facing representations of flags received by node.
suffix []string
f HandlerFunc
set *flag.FlagSet
}
// adopt adds v as the last child of n.
func (n *node) adopt(v *node) bool {
if n.child != nil {
return n.child.append(v)
@@ -28,6 +31,7 @@ func (n *node) adopt(v *node) bool {
return true
}
// append adds v as the last sibling of n.
func (n *node) append(v *node) bool {
if n.name == v.name {
return false
+18 -22
View File
@@ -70,7 +70,7 @@ func TestParse(t *testing.T) {
"d=0 out of order string flag",
buildTestCommand,
[]string{"string", "--string", "64d3b4b7b21788585845060e2199a78f"},
"flag provided but not defined: -string\n\nUsage:\ttest string [-h | --help] COMMAND [OPTIONS]\n\n", "",
"flag provided but not defined: -string\nusage: test string [-h | --help] <command> [<args>]\n\n", "",
errors.New("flag provided but not defined: -string"),
},
{
@@ -120,7 +120,7 @@ func TestParse(t *testing.T) {
"d=1 empty sub help",
buildTestCommand,
[]string{"empty", "-h"},
"\nUsage:\ttest empty [-h | --help] COMMAND [OPTIONS]\n\n", "", flag.ErrHelp,
"usage: test empty [-h | --help] <command> [<args>]\n\n", "", flag.ErrHelp,
},
{
"d=1 no match",
@@ -151,10 +151,10 @@ func TestParse(t *testing.T) {
"d=0 help",
buildTestCommand,
[]string{},
`
Usage: test [-h | --help] [-v] [--fail] [--string <value>] [--int <int>] [--repeat <value>] COMMAND [OPTIONS]
`usage: test [-h | --help] [-v] [--fail] [--string <value>] [--int <int>]
[--repeat <value>] <command> [<args>]
Commands:
commands:
error return an error
print wraps Fprint
string print string passed by flag
@@ -171,10 +171,10 @@ Commands:
"d=0 help flag",
buildTestCommand,
[]string{"-h"},
`
Usage: test [-h | --help] [-v] [--fail] [--string <value>] [--int <int>] [--repeat <value>] COMMAND [OPTIONS]
`usage: test [-h | --help] [-v] [--fail] [--string <value>] [--int <int>]
[--repeat <value>] <command> [<args>]
Commands:
commands:
error return an error
print wraps Fprint
string print string passed by flag
@@ -185,7 +185,7 @@ Commands:
succeed this command succeeds
deep top level of command tree with various levels
Flags:
flags:
-fail
fail early
-int int
@@ -203,10 +203,9 @@ Flags:
"d=1 help",
buildTestCommand,
[]string{"join"},
`
Usage: test join [-h | --help] COMMAND [OPTIONS]
`usage: test join [-h | --help] <command> [<args>]
Commands:
commands:
out write result to wout
log log result to wlog
@@ -216,10 +215,9 @@ Commands:
"d=1 help flag",
buildTestCommand,
[]string{"join", "-h"},
`
Usage: test join [-h | --help] COMMAND [OPTIONS]
`usage: test join [-h | --help] <command> [<args>]
Commands:
commands:
out write result to wout
log log result to wlog
@@ -230,10 +228,9 @@ Commands:
"d=2 help",
buildTestCommand,
[]string{"deep", "d=2"},
`
Usage: test deep d=2 [-h | --help] COMMAND [OPTIONS]
`usage: test deep d=2 [-h | --help] <command> [<args>]
Commands:
commands:
d=3 relative third level
`, "", command.ErrHelp,
@@ -242,10 +239,9 @@ Commands:
"d=2 help flag",
buildTestCommand,
[]string{"deep", "d=2", "-h"},
`
Usage: test deep d=2 [-h | --help] COMMAND [OPTIONS]
`usage: test deep d=2 [-h | --help] <command> [<args>]
Commands:
commands:
d=3 relative third level
`, "", flag.ErrHelp,
@@ -261,7 +257,7 @@ Commands:
t.Errorf("Parse: error = %v; wantErr %v", err, tc.wantErr)
}
if got := wout.String(); got != tc.want {
t.Errorf("Parse: %s want %s", got, tc.want)
t.Errorf("Parse:\n%s\nwant\n%s", got, tc.want)
}
if gotLog := wlog.String(); gotLog != tc.wantLog {
t.Errorf("Parse: log = %s wantLog %s", gotLog, tc.wantLog)
-14
View File
@@ -1,14 +0,0 @@
package command
// the top level node wants [Command] returned for its builder methods
type rootNode struct{ *node }
func (r rootNode) Command(name, usage string, f HandlerFunc) Command {
r.node.Command(name, usage, f)
return r
}
func (r rootNode) Flag(p any, name string, value FlagDefiner, usage string) Command {
r.node.Flag(p, name, value, usage)
return r
}
+12 -3
View File
@@ -73,7 +73,10 @@ func (c *Cache) Clean(dry, inputs bool, keep ...Artifact) (
continue
}
c.msg.Verbosef("arranging for destruction of %s...", name)
c.msg.Verbosef(
"arranging for destruction of %s%s%s...",
c.sgrIdent, name, c.sgrRes,
)
idents = append(idents, identPair{id, name})
}
@@ -102,7 +105,10 @@ func (c *Cache) Clean(dry, inputs bool, keep ...Artifact) (
if err = c.parent.Err(); err != nil {
return destroyedIdents, destroyedChecksums, err
}
c.msg.Verbosef("destroying checksum %s...", name)
c.msg.Verbosef(
"destroying checksum %s%s%s...",
c.sgrIdent, name, c.sgrRes,
)
if !dry {
if err = errors.Join(removeAll(c.base.Append(
dirChecksum,
@@ -130,7 +136,10 @@ func (c *Cache) Clean(dry, inputs bool, keep ...Artifact) (
continue
}
c.msg.Verbosef("destroying substitute %s...", name)
c.msg.Verbosef(
"destroying substitute %s%s%s...",
c.sgrIdent, name, c.sgrRes,
)
if !dry {
if err = os.Remove(c.base.Append(
dirStatus,
+15 -4
View File
@@ -444,7 +444,7 @@ func scanVerbose(
msg message.Msg,
cancel context.CancelFunc,
done chan<- struct{},
prefix string,
prefix, suffix string,
r io.Reader,
) {
defer close(done)
@@ -454,7 +454,7 @@ func scanVerbose(
bufio.MaxScanTokenSize<<12,
)
for s.Scan() {
msg.Verbose(prefix, s.Text())
msg.Verbose(prefix, s.Text()+suffix)
}
if err := s.Err(); err != nil && !errors.Is(err, os.ErrClosed) {
cancel()
@@ -728,14 +728,25 @@ func (a *execArtifact) cure(f *FContext, hostNet bool) (err error) {
brStdout, brStderr := f.cache.getReader(stdout), f.cache.getReader(stderr)
stdoutDone, stderrDone := make(chan struct{}), make(chan struct{})
var suffix, prefixO, prefixE string
if f.cache.attr.Flags&CColourOutput != 0 {
suffix = "\x1b[0m"
prefixO = "\x1b[1;37m(" + a.name + ")\x1b[0m"
prefixE = "\x1b[1;97m(" + a.name + ")\x1b[0m"
} else {
prefixO = "(" + a.name + ":1)"
prefixE = "(" + a.name + ":2)"
}
go scanVerbose(
msg, cancel, stdoutDone,
"("+a.name+":1)",
prefixO, suffix,
io.TeeReader(brStdout, status),
)
go scanVerbose(
msg, cancel, stderrDone,
"("+a.name+":2)",
prefixE, suffix,
io.TeeReader(brStderr, status),
)
defer func() {
+2 -5
View File
@@ -118,11 +118,8 @@ func TestExec(t *testing.T) {
[]string{"testtool"},
pkg.MustPath("/proc/nonexistent", false, failingArtifact),
), nil, nil, pkg.WNew, &pkg.DependencyCureError{
{
A: failingArtifact,
Err: stub.UniqueError(0xcafe),
},
), nil, nil, pkg.WNew, pkg.InputError{
failingArtifact: stub.UniqueError(0xcafe),
}},
{"invalid paths", pkg.NewExec(
+2 -2
View File
@@ -823,8 +823,8 @@ func (d *IRDecoder) decode() (a Artifact, err error) {
d.ident[id] = a
} else {
d.c.msg.Verbosef(
"artifact %s appeared more than once in IR stream",
Encode(id.Value()),
"artifact %s%s%s appeared more than once in IR stream",
d.c.sgrIdent, Encode(id.Value()), d.c.sgrRes,
)
}
+124 -108
View File
@@ -15,10 +15,10 @@ import (
"hash"
"io"
"io/fs"
"iter"
"maps"
"math"
"os"
"os/signal"
"path/filepath"
"runtime"
"slices"
@@ -654,10 +654,10 @@ type pendingArtifactDep struct {
// if curing succeeds.
resP *cureRes
// Address of result error slice populated during [Cache.Cure], dereferenced
// Address of result error map populated during [Cache.Cure], dereferenced
// after acquiring errsMu if curing fails. No additional action is taken,
// [Cache] and its caller are responsible for further error handling.
errs *DependencyCureError
errs InputError
// Address of mutex synchronising access to errs.
errsMu *sync.Mutex
@@ -721,6 +721,9 @@ const (
// CExternShallow arranges for only non-flood inputs to be fetched when
// curing an [Artifact] available via the external cache.
CExternShallow
// CColourOutput enables output colouring via ANSI control sequences.
CColourOutput
)
// toplevel holds [context.WithCancel] over caller-supplied context, where all
@@ -776,6 +779,8 @@ type Cache struct {
wg sync.WaitGroup
// Reports new cures and passed to [Artifact].
msg message.Msg
// Select graphics rendition sequences, populated by Open.
sgrRes, sgrIdent, sgrWarn, sgrErr string
// Directory where all [Cache] related files are placed.
base *check.Absolute
@@ -1132,7 +1137,10 @@ func (c *Cache) Scrub(checks int) error {
} else if !ce.check(ent, want) {
wg.Go(func() { condemn(ent) })
} else {
c.msg.Verbosef("%s is consistent", ent.Name())
c.msg.Verbosef(
"%s%s%s is consistent",
c.sgrIdent, ent.Name(), c.sgrRes,
)
}
p.Put(want)
wg.Done()
@@ -1508,10 +1516,10 @@ func (c *Cache) openFile(
id := c.Ident(f)
if c.msg.IsVerbose() {
rn := reportName(f, id)
c.msg.Verbosef("curing %s in memory...", rn)
c.msg.Verbosef("curing %s%s%s in memory...", c.sgrIdent, rn, c.sgrRes)
defer func() {
if err == nil {
c.msg.Verbosef("opened %s for reading", rn)
c.msg.Verbosef("opened %s%s%s for reading", c.sgrIdent, rn, c.sgrRes)
}
}()
}
@@ -1713,111 +1721,67 @@ retry:
goto retry
}
// CureError wraps a non-nil error returned attempting to cure an [Artifact].
type CureError struct {
A Artifact
Err error
}
// An InputError describes inputs of a [FloodArtifact] which had failed to cure.
type InputError map[Artifact]error
// Unwrap returns the underlying error.
func (e *CureError) Unwrap() error { return e.Err }
// unwrap returns an iterator over sorted, deduplicated [Artifact] and their
// corresponding identifier.
func (e InputError) unwrap() iter.Seq2[Artifact, unique.Handle[ID]] {
ir := NewIR()
// Error returns the error message from the underlying Err.
func (e *CureError) Error() string { return e.Err.Error() }
// A DependencyCureError wraps errors returned while curing dependencies.
type DependencyCureError []*CureError
// unwrapM recursively expands underlying errors into a caller-supplied map.
func (e *DependencyCureError) unwrapM(
ctx context.Context,
ir *IRCache,
me map[unique.Handle[ID]]*CureError,
) {
for _, err := range *e {
if ctx.Err() != nil {
break
}
id := ir.Ident(err.A)
if _, ok := me[id]; ok {
continue
}
if _e, ok := err.Err.(*DependencyCureError); ok {
_e.unwrapM(ctx, ir, me)
continue
}
me[id] = err
}
}
// unwrap recursively expands and deduplicates underlying errors.
func (e *DependencyCureError) unwrap(
ctx context.Context,
ir *IRCache,
) DependencyCureError {
me := make(map[unique.Handle[ID]]*CureError)
e.unwrapM(ctx, ir, me)
type ent struct {
type input struct {
a Artifact
id unique.Handle[ID]
err *CureError
}
errs := make([]*ent, 0, len(me))
for id, err := range me {
errs = append(errs, &ent{id, err})
p := make([]input, 0, len(e))
for a := range e {
p = append(p, input{a, ir.Ident(a)})
}
var identBuf [2]ID
slices.SortFunc(errs, func(a, b *ent) int {
slices.SortFunc(p, func(a, b input) int {
identBuf[0], identBuf[1] = a.id.Value(), b.id.Value()
return slices.Compare(identBuf[0][:], identBuf[1][:])
})
p = slices.CompactFunc(p, func(a, b input) bool { return a.id == b.id })
_errs := make(DependencyCureError, len(errs))
for i, v := range errs {
_errs[i] = v.err
return func(yield func(Artifact, unique.Handle[ID]) bool) {
for _, i := range p {
if !yield(i.a, i.id) {
return
}
}
}
return _errs
}
// Unwrap returns a deduplicated slice of underlying errors.
func (e *DependencyCureError) Unwrap() []error {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()
errs := e.unwrap(ctx, NewIR())
_errs := make([]error, len(errs))
for i, err := range errs {
_errs[i] = err
}
return _errs
}
// Error returns a user-facing multiline error message.
func (e *DependencyCureError) Error() string {
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()
ir := NewIR()
errs := e.unwrap(ctx, ir)
if len(errs) == 0 {
return "invalid dependency cure outcome"
}
// Error returns a user-facing, deterministic text representation of e.
func (e InputError) Error() string {
var buf strings.Builder
buf.WriteString("errors curing dependencies:")
for _, err := range errs {
buf.WriteString("\n\t" +
reportName(err.A, ir.Ident(err.A)) + ": " +
err.Error())
}
if ctx.Err() != nil {
buf.WriteString("\nerror resolution cancelled")
buf.WriteString("errors curing inputs:")
for a, id := range e.unwrap() {
buf.WriteString("\n\t")
buf.WriteString(reportName(a, id))
buf.WriteString(": ")
buf.WriteString(e[a].Error())
}
return buf.String()
}
// Unwrap returns a slice of underlying errors sorted by identifier.
func (e InputError) Unwrap() []error {
errs := make([]error, 0, len(e))
for a := range e.unwrap() {
errs = append(errs, e[a])
}
return errs
}
// enterCure must be called before entering an [Artifact] implementation.
func (c *Cache) enterCure(a Artifact, curesExempt bool) error {
if c.attr.Notify != nil {
c.attr.Notify <- true
}
if a.IsExclusive() {
c.exclMu.Lock()
}
@@ -1840,6 +1804,10 @@ func (c *Cache) enterCure(a Artifact, curesExempt bool) error {
// exitCure must be called after exiting an [Artifact] implementation.
func (c *Cache) exitCure(a Artifact, curesExempt bool) {
if c.attr.Notify != nil {
c.attr.Notify <- false
}
if a.IsExclusive() {
c.exclMu.Unlock()
}
@@ -1890,7 +1858,10 @@ func (mr *measuredReader) Close() (err error) {
}
if n > 0 {
mr.c.msg.Verbosef("missed %d bytes on measured reader", n)
mr.c.msg.Verbosef(
"%smissed %d bytes on measured reader%s",
mr.c.sgrWarn, n, mr.c.sgrRes,
)
}
if err = mr.r.Close(); err != nil {
@@ -2004,7 +1975,7 @@ func (c *Cache) cureMany(
wg.Add(len(inputs))
var mask []bool
res := make([]cureRes, len(inputs))
errs := make(DependencyCureError, 0, len(inputs))
errs := make(InputError)
var errsMu sync.Mutex
if shallow {
mask = make([]bool, len(inputs))
@@ -2023,13 +1994,13 @@ func (c *Cache) cureMany(
continue
}
}
pending := pendingArtifactDep{d, &res[i], &errs, &errsMu, &wg}
pending := pendingArtifactDep{d, &res[i], errs, &errsMu, &wg}
go pending.cure(c)
}
wg.Wait()
if len(errs) > 0 {
return mask, &errs
return mask, errs
}
for i, p := range res {
if shallow && mask[i] {
@@ -2151,8 +2122,9 @@ func (c *Cache) cure(a Artifact, curesExempt, rebuild bool) (
)
if errors.Is(err, os.ErrExist) {
c.msg.Verbosef(
"creating alternative over %s for artifact %s",
Encode(substitute.Value()), ids,
"creating alternative over %s%s%s for artifact %s%s%s",
c.sgrIdent, Encode(substitute.Value()), c.sgrRes,
c.sgrIdent, ids, c.sgrRes,
)
err = nil
}
@@ -2195,15 +2167,18 @@ func (c *Cache) cure(a Artifact, curesExempt, rebuild bool) (
whence = WNew
if c.msg.IsVerbose() {
rn := reportName(a, id)
c.msg.Verbosef("curing %s...", rn)
c.msg.Verbosef("curing %s%s%s...", c.sgrIdent, rn, c.sgrRes)
defer func() {
if err != nil {
return
}
if checksums != "" {
c.msg.Verbosef("cured %s checksum %s", rn, checksums)
c.msg.Verbosef(
"cured %s%s%s checksum %s%s%s",
c.sgrIdent, rn, c.sgrRes,
c.sgrIdent, checksums, c.sgrRes)
} else {
c.msg.Verbosef("cured %s", rn)
c.msg.Verbosef("cured %s%s%s", c.sgrIdent, rn, c.sgrRes)
}
}()
}
@@ -2298,7 +2273,11 @@ func (c *Cache) cure(a Artifact, curesExempt, rebuild bool) (
c.exitCure(a, curesExempt)
if err != nil {
if c.msg.IsVerbose() {
c.msg.Verbosef("cure file %s: %v", reportName(f, id), err)
c.msg.Verbosef(
"cure file %s%s%s: %s%v%s",
c.sgrIdent, reportName(f, id), c.sgrRes,
c.sgrErr, err, c.sgrRes,
)
}
return
}
@@ -2345,7 +2324,11 @@ func (c *Cache) cure(a Artifact, curesExempt, rebuild bool) (
c.exitCure(a, curesExempt)
if err != nil {
if c.msg.IsVerbose() {
c.msg.Verbosef("cure trivial %s: %v", reportName(ca, id), err)
c.msg.Verbosef(
"cure trivial %s%s%s: %s%v%s",
c.sgrIdent, reportName(ca, id), c.sgrRes,
c.sgrErr, err, c.sgrRes,
)
}
return
}
@@ -2355,7 +2338,11 @@ func (c *Cache) cure(a Artifact, curesExempt, rebuild bool) (
var externChecksum unique.Handle[Checksum]
if externChecksum, err = c.tryExtern(ctx, id); err != nil {
if c.msg.IsVerbose() {
c.msg.Verbosef("extern %s: %v", reportName(ca, id), err)
c.msg.Verbosef(
"extern %s%s%s: %s%v%s",
c.sgrIdent, reportName(ca, id), c.sgrRes,
c.sgrErr, err, c.sgrRes,
)
}
return
}
@@ -2395,8 +2382,8 @@ func (c *Cache) cure(a Artifact, curesExempt, rebuild bool) (
if sum == zeroChecksum {
if c.msg.IsVerbose() {
c.msg.Verbosef(
"input %s not available",
reportName(d, did),
"input %s%s%s not available",
c.sgrIdent, reportName(d, did), c.sgrRes,
)
}
err = HangingInputError(did)
@@ -2460,7 +2447,11 @@ func (c *Cache) cure(a Artifact, curesExempt, rebuild bool) (
if checksum != zeroChecksum && externChecksum != checksum {
err = &ChecksumMismatchError{externChecksum.Value(), checksum.Value()}
if c.msg.IsVerbose() {
c.msg.Verbosef("extern %s: %v", reportName(ca, id), err)
c.msg.Verbosef(
"extern %s%s%s: %s%v%s",
c.sgrIdent, reportName(ca, id), c.sgrRes,
c.sgrErr, err, c.sgrRes,
)
}
return
}
@@ -2509,7 +2500,11 @@ func (c *Cache) cure(a Artifact, curesExempt, rebuild bool) (
}
if err != nil {
if c.msg.IsVerbose() {
c.msg.Verbosef("cure %s: %v", reportName(ca, id), err)
c.msg.Verbosef(
"cure %s%s%s: %s%v%s",
c.sgrIdent, reportName(ca, id), c.sgrRes,
c.sgrErr, err, c.sgrRes,
)
}
return
}
@@ -2560,7 +2555,11 @@ func (c *Cache) cure(a Artifact, curesExempt, rebuild bool) (
Want: checksum.Value(),
}
if c.msg.IsVerbose() {
c.msg.Verbosef("validate %s: %v", reportName(a, id), err)
c.msg.Verbosef(
"validate %s%s%s: %s%v%s",
c.sgrIdent, reportName(a, id), c.sgrRes,
c.sgrErr, err, c.sgrRes,
)
}
return
}
@@ -2604,7 +2603,11 @@ func (pending *pendingArtifactDep) cure(c *Cache) {
}
pending.errsMu.Lock()
*pending.errs = append(*pending.errs, &CureError{pending.a, err})
if errs, ok := err.(InputError); ok {
maps.Copy(pending.errs, errs)
} else {
pending.errs[pending.a] = err
}
pending.errsMu.Unlock()
}
@@ -2702,6 +2705,10 @@ func (c *Cache) Close() {
c.wg.Wait()
close(c.cures)
c.unlock()
if c.attr.Notify != nil {
close(c.attr.Notify)
}
}
// UnsupportedVariantError describes an on-disk cache with an extension variant
@@ -2729,6 +2736,8 @@ type CacheAttr struct {
Jobs int
// Preferred loadavg target, when applicable.
Load int
// Optional cure entry and exit notification.
Notify chan<- bool
// Omit the [lockedfile] lock.
skipLock bool
@@ -2895,6 +2904,13 @@ func Open(
return nil, UnsupportedVariantError(s)
}
if a.Flags&CColourOutput != 0 {
c.sgrRes = "\x1b[0m"
c.sgrIdent = "\x1b[1m"
c.sgrWarn = "\x1b[35m"
c.sgrErr = "\x1b[1;31m"
}
return &c, nil
}
+32 -49
View File
@@ -861,14 +861,11 @@ func TestCache(t *testing.T) {
cure: func(f *pkg.FContext) error {
panic("attempting to cure impossible artifact")
},
}, nil, nil, pkg.WNew, &pkg.DependencyCureError{
{
A: failingFile,
Err: struct {
}, nil, nil, pkg.WNew, pkg.InputError{
failingFile: struct {
_ []byte
stub.UniqueError
}{UniqueError: 0xbad},
},
}},
})
@@ -1949,7 +1946,7 @@ errors during scrub:
}
}
func TestDependencyCureError(t *testing.T) {
func TestInputError(t *testing.T) {
t.Parallel()
makeIdent := func(ident ...byte) pkg.Artifact {
@@ -1962,56 +1959,40 @@ func TestDependencyCureError(t *testing.T) {
testCases := []struct {
name string
err pkg.DependencyCureError
err pkg.InputError
want string
unwrap []error
}{
{"simple", pkg.DependencyCureError{
{A: makeIdent(0xff, 9), Err: stub.UniqueError(0xbad09)},
{A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)},
{A: makeIdent(0xff, 0xf), Err: stub.UniqueError(0xbad0f)},
{A: makeIdent(0xff, 1), Err: stub.UniqueError(0xbad01)},
}, `errors curing dependencies:
{"simple", pkg.InputError{
makeIdent(0xff, 9): stub.UniqueError(0xbad09),
makeIdent(0xff, 0): stub.UniqueError(0xbad00),
makeIdent(0xff, 0xf): stub.UniqueError(0xbad0f),
makeIdent(0xff, 1): stub.UniqueError(0xbad01),
}, `errors curing inputs:
_wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765184 injected by the test suite
_wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765185 injected by the test suite
_wkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765193 injected by the test suite
_w8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765199 injected by the test suite`, []error{
&pkg.CureError{A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)},
&pkg.CureError{A: makeIdent(0xff, 1), Err: stub.UniqueError(0xbad01)},
&pkg.CureError{A: makeIdent(0xff, 9), Err: stub.UniqueError(0xbad09)},
&pkg.CureError{A: makeIdent(0xff, 0xf), Err: stub.UniqueError(0xbad0f)},
stub.UniqueError(0xbad00),
stub.UniqueError(0xbad01),
stub.UniqueError(0xbad09),
stub.UniqueError(0xbad0f),
}},
{"dedup", pkg.DependencyCureError{
{A: makeIdent(0xff, 9), Err: stub.UniqueError(0xbad09)},
{A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)},
{A: makeIdent(0xff, 0xfd), Err: &pkg.DependencyCureError{
{A: makeIdent(0xff, 9), Err: stub.UniqueError(0xbad09)},
{A: makeIdent(0xff, 0xc), Err: &pkg.DependencyCureError{
{A: makeIdent(0xff, 0xf), Err: stub.UniqueError(0xbad0f)},
{A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)},
}},
{A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)},
{A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)},
}},
{A: makeIdent(0xff, 0xff), Err: &pkg.DependencyCureError{
{A: makeIdent(0xff, 9), Err: stub.UniqueError(0xbad09)},
{A: makeIdent(0xff, 0xc), Err: &pkg.DependencyCureError{
{A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)},
}},
{A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)},
}},
{A: makeIdent(0xff, 0xf), Err: stub.UniqueError(0xbad0f)},
{A: makeIdent(0xff, 1), Err: stub.UniqueError(0xbad01)},
}, `errors curing dependencies:
{"dedup", pkg.InputError{
makeIdent(0xff, 9): stub.UniqueError(0xbad09),
makeIdent(0xff, 9): stub.UniqueError(0xbad09),
makeIdent(0xff, 9): stub.UniqueError(0xbad09),
makeIdent(0xff, 0): stub.UniqueError(0xbad00),
makeIdent(0xff, 0): stub.UniqueError(0xbad00),
makeIdent(0xff, 1): stub.UniqueError(0xbad01),
}, `errors curing inputs:
_wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765184 injected by the test suite
_wEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765185 injected by the test suite
_wkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765193 injected by the test suite
_w8AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765199 injected by the test suite`, []error{
&pkg.CureError{A: makeIdent(0xff, 0), Err: stub.UniqueError(0xbad00)},
&pkg.CureError{A: makeIdent(0xff, 1), Err: stub.UniqueError(0xbad01)},
&pkg.CureError{A: makeIdent(0xff, 9), Err: stub.UniqueError(0xbad09)},
&pkg.CureError{A: makeIdent(0xff, 0xf), Err: stub.UniqueError(0xbad0f)},
_wkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA: unique error 765193 injected by the test suite`, []error{
stub.UniqueError(0xbad00),
stub.UniqueError(0xbad01),
stub.UniqueError(0xbad09),
}},
}
for _, tc := range testCases {
@@ -2055,19 +2036,21 @@ func (a earlyFailureF) Cure(*pkg.FContext) error {
func BenchmarkEarlyDCE(b *testing.B) {
msg := message.New(log.New(os.Stderr, "dce: ", 0))
msg.SwapVerbose(testing.Verbose())
for b.Loop() {
b.StopTimer()
c, err := pkg.Open(b.Context(), msg, check.MustAbs(b.TempDir()), nil)
if err != nil {
b.Fatal(err)
}
b.StartTimer()
_, _, err = c.Cure(earlyFailureF(8))
b.StopTimer()
if !errors.Is(err, stub.UniqueError(0xcafe)) {
b.Fatalf("Cure: error = %v", err)
}
c.Close()
dce := err.(*pkg.DependencyCureError)
for b.Loop() {
dce.Unwrap()
b.StartTimer()
}
}
+2 -2
View File
@@ -174,8 +174,8 @@ func (a *tarArtifact) Cure(t *TContext) (err error) {
case tar.TypeChar:
t.GetMessage().Verbosef(
"skipping character device %d, %d %q",
header.Devmajor, header.Devminor, header.Name,
"%sskipping character device %d, %d %q%s",
t.cache.sgrWarn, header.Devmajor, header.Devminor, header.Name, t.cache.sgrRes,
)
continue
+59 -6
View File
@@ -12,7 +12,7 @@ import (
// Value are types supported by the language.
type Value interface {
bool | int64 | string | []string | []int64 | [][2]string
bool | int64 | string | []string | []int64 | [][2]string | Nil
}
type (
@@ -33,6 +33,29 @@ type (
F func(args FArgs) (v any, set bool, err error)
V map[unique.Handle[Ident]]any
}
// Nil represents an untyped nil.
Nil struct{}
// AString represents an argument string that may be nil.
AString struct {
V string
Nil bool
}
)
// NilError is returned for an invalid nil assignment.
type NilError struct{ reflect.Type }
func (e NilError) Error() string {
return fmt.Sprintf("attempting to assign nil to %s", e.Type)
}
var (
// nilStringV is the [reflect.Value] of an Azalea nil assigned to an [AString].
nilStringV = reflect.ValueOf(AString{Nil: true})
// nilStringT is the [reflect.Type] of nilStringV.
nilStringT = nilStringV.Type()
)
// Apply applies named arguments and rejects unused arguments.
@@ -50,8 +73,8 @@ func (args FArgs) Apply(v map[unique.Handle[Ident]]any) error {
}
return UndefinedError(arg.K.Value())
}
err := storeE(r, arg.V)
if err != nil {
if err := storeE(r, arg.V); err != nil {
return err
}
}
@@ -115,11 +138,38 @@ func (e TypeError) Is(err error) bool {
}
// storeE is a convenience function to set the value of a result pointer.
func storeE(rp any, r any) error {
func storeE(rp, r any) error {
pv := reflect.ValueOf(rp).Elem()
pt := pv.Type()
as := nilStringT.AssignableTo(pt)
if r == (Nil{}) {
switch kind := pt.Kind(); kind {
case reflect.Bool, reflect.String:
return NilError{pt}
default:
if rv, ok := rp.(*any); ok && !reflect.ValueOf(*rv).IsValid() {
*rv = Nil{}
} else if as {
pv.Set(nilStringV)
} else {
pv.SetZero()
}
return nil
}
}
v := reflect.ValueOf(r)
pt, vt := pv.Type(), v.Type()
if !vt.AssignableTo(pt) {
if vt := v.Type(); !vt.AssignableTo(pt) {
if as {
var asv AString
if err := storeE(&asv.V, r); err != nil {
return err
}
pv.Set(reflect.ValueOf(asv))
return nil
}
return TypeError{vt, pt}
}
pv.Set(v)
@@ -226,6 +276,9 @@ func evaluateAny(d PF, s []Frame, expr, rp any) bool {
case "false":
store(rp, false)
return true
case "nil":
store(rp, Nil{})
return true
default:
return evaluateAny(d, s, v, rp)
}
+69 -5
View File
@@ -100,15 +100,79 @@ func TestEvaluate(t *testing.T) {
Err: UndefinedError("f"),
}},
{"error wrap deep", `f { v = nil; }`, makeStackCheck(func(
{"error wrap deep", `f { v = nonexistent; }`, makeStackCheck(func(
FArgs,
) (any, error) {
panic("unreachable")
}), "", EvaluationError{
Expr: Ident("nil"),
Err: UndefinedError("nil"),
Expr: Ident("nonexistent"),
Err: UndefinedError("nonexistent"),
}},
{"nil", `f { v = nil; }`, checkArgs(FArgs{
{K: unique.Make(Ident("v")), V: Nil{}},
}), "\xfd", nil},
{"apply nil string", `f { v = nil; }`, makeStackCheck(func(
args FArgs,
) (v any, err error) {
var s string
err = args.Apply(map[unique.Handle[Ident]]any{
unique.Make(Ident("v")): &s,
})
v = s
return
}), "", EvaluationError{
Expr: Func{
Ident: Ident("f"),
Args: []Arg{
{K: []Ident{"v"}, V: Val{Ident("nil")}},
},
},
Err: NilError{Type: reflect.TypeFor[string]()},
}},
{"apply nil AString", `f { v = nil; }`, makeStackCheck(func(
args FArgs,
) (v any, err error) {
s := AString{}
err = args.Apply(map[unique.Handle[Ident]]any{
unique.Make(Ident("v")): &s,
})
v = s.V
if !s.Nil {
err = fmt.Errorf("got non-nil string %q", s.V)
}
return
}), "", nil},
{"apply AString", `f { v = "\xfd"; }`, makeStackCheck(func(
args FArgs,
) (v any, err error) {
s := AString{}
err = args.Apply(map[unique.Handle[Ident]]any{
unique.Make(Ident("v")): &s,
})
v = s.V
if s.Nil {
err = fmt.Errorf("unexpected nil %q", s.V)
}
return
}), "\xfd", nil},
{"apply nil", `f { v = nil; }`, makeStackCheck(func(
args FArgs,
) (v any, err error) {
s := make([]struct{}, 9)
err = args.Apply(map[unique.Handle[Ident]]any{
unique.Make(Ident("v")): &s,
})
if s != nil {
err = fmt.Errorf("got non-nil value %#v", s)
}
return
}), "", nil},
{"common inputs", `package name { inputs, v = []; }`, nil, "", EvaluationError{
Expr: Func{
Ident: Ident("name"),
@@ -214,8 +278,8 @@ func TestEvaluate(t *testing.T) {
}
var errEquals bool
if _, ok := errors.AsType[TypeError](err); ok {
errEquals = errors.Is(err, tc.err)
if e, ok := errors.AsType[TypeError](err); ok {
errEquals = e.Is(tc.err)
} else {
errEquals = reflect.DeepEqual(err, tc.err)
}
+1 -1
View File
@@ -35,7 +35,7 @@ type CMakeHelper struct {
var _ Helper = new(CMakeHelper)
// extra returns the cmake handle alongside either ninja or make.
func (attr *CMakeHelper) extra(int) P {
func (attr *CMakeHelper) extra() P {
if attr != nil && attr.Make {
return P{_cmake, _make}
}
+2
View File
@@ -107,6 +107,8 @@ func init() {
a := cureEtc{}
if r.ReadUint32() == 0 {
a.minimal = true
} else {
r.Next()
}
if _, ok := r.Finalise(); ok {
panic(pkg.ErrUnexpectedChecksum)
+12 -5
View File
@@ -20,10 +20,13 @@ func (t Toolchain) NewViaGit(
return t.New(strings.TrimSuffix(
path.Base(url),
".git",
)+"-src-"+path.Base(rev), THostNet, t.Append(nil,
_nssCACert,
_git,
), &checksum, nil, `
)+"-src", path.Base(rev), nil, &PackageAttr{
KnownChecksum: &checksum,
HostNet: true,
Paths: []pkg.ExecPath{resolvconf()},
}, &GenericHelper{
Build: `
git \
-c advice.detachedHead=false \
clone \
@@ -34,5 +37,9 @@ git \
` + url + ` \
/work
rm -rf /work/.git
`, resolvconf())
`,
},
_nssCACert,
_git,
)
}
+2 -2
View File
@@ -13,7 +13,7 @@ func (t Toolchain) newGo(
script string,
boot ...pkg.Artifact,
) pkg.Artifact {
return t.NewPackage("go", version, newTar(
return t.New("go", version, newTar(
"https://go.dev/dl/go"+version+".src.tar.gz",
checksum,
pkg.Gzip,
@@ -75,7 +75,7 @@ func init() {
)
switch t.arch {
case "amd64":
bootstrapEarly = []pkg.Artifact{t.NewPackage("go", "1.4-bootstrap", newTar(
bootstrapEarly = []pkg.Artifact{t.New("go", "1.4-bootstrap", newTar(
"https://dl.google.com/go/go1.4-bootstrap-20171003.tar.gz",
"8o9JL_ToiQKadCTb04nvBDkp8O1xiWOolAxVEqaTGodieNe4lOFEjlOxN3bwwe23",
pkg.Gzip,
+17 -3
View File
@@ -83,9 +83,11 @@ func init() {
{"LIBCXX_ENABLE_STATIC_ABI_LIBRARY", "OFF"},
{"LIBCXX_HAS_MUSL_LIBC", "ON"},
{"LIBCXX_HARDENING_MODE", "fast"},
{"LIBCXX_STATICALLY_LINK_ABI_IN_STATIC_LIBRARY", "ON"},
{"LIBCXXABI_USE_LLVM_UNWINDER", "ON"},
{"LIBCXXABI_ENABLE_STATIC_UNWINDER", "OFF"},
{"LIBCXXABI_ENABLE_STATIC_UNWINDER", "ON"},
{"LIBCXXABI_USE_COMPILER_RT", "ON"},
{"LIBCXXABI_STATICALLY_LINK_UNWINDER_IN_STATIC_LIBRARY", "ON"},
{"LLVM_INSTALL_BINUTILS_SYMLINKS", "ON"},
{"LLVM_INSTALL_UTILS", "ON"},
{"LLVM_BUILD_LLVM_DYLIB", "ON"},
@@ -138,6 +140,10 @@ func init() {
"CodeGen/PowerPC/ppc-tmmintrin.c",
"CodeGen/PowerPC/ppc-smmintrin.c",
"CodeGenCUDA/amdgpu-alias-undef-symbols.cu",
// clang: deadlocks with LIBCXXABI_ENABLE_STATIC_UNWINDER
"global-value-regex",
"global-hex-value-regex",
"check-globals",
// cxx: fails on musl
"close.dont-get-rid-of-buffer",
"re/re.traits",
@@ -178,8 +184,8 @@ func init() {
}...)
}
return &meta, t.NewPackage("llvm", meta.Version, source, &PackageAttr{
Flag: TExclusive,
return &meta, t.New("llvm", meta.Version, source, &PackageAttr{
Exclusive: true,
Bin: []string{
"chmod",
"mkdir",
@@ -187,6 +193,10 @@ func init() {
"tr",
"awk",
},
ScriptEarly: `
rm -f /system/bin/clang++.cfg
`,
}, &CMakeHelper{
Append: []string{"llvm"},
@@ -196,6 +206,10 @@ ln -s ld.lld /work/system/bin/ld
ln -s clang /work/system/bin/cc
ln -s clang /work/system/bin/cpp
ln -s clang++ /work/system/bin/c++
cat << EOF > /work/system/bin/clang++.cfg
-static-libstdc++
-Wl,--exclude-libs,libunwind.a:libc++.a:libc++experimental.a:libc++abi.a
EOF
`,
// LLVM_LINK_LLVM_DYLIB causes llvm test suite to leak system
+8 -6
View File
@@ -52,15 +52,16 @@ type MakeHelper struct {
var _ Helper = new(MakeHelper)
// extra returns make and other optional dependencies.
func (attr *MakeHelper) extra(flag int) P {
extra := P{_make}
if (attr == nil || !attr.OmitDefaults) && flag&TEarly == 0 {
extra = append(extra,
func (attr *MakeHelper) extra() P {
if attr == nil || !attr.OmitDefaults {
return P{
_make,
_awk,
_coreutils,
)
}
return extra
}
return P{_make}
}
// wantsChmod returns whether the build system needs to be generated.
@@ -172,6 +173,7 @@ make \
scriptMake += attr.ScriptCheckEarly + `make \
` + jobsFlagE + ` \
` + loadFlagE + ` \
AM_COLOR_TESTS=always \
`
if len(attr.Check) > 0 {
scriptMake += strings.Join(attr.Check, " \\\n\t")
+1 -1
View File
@@ -35,7 +35,7 @@ type MesonHelper struct {
var _ Helper = new(MesonHelper)
// extra returns hardcoded meson runtime dependencies.
func (attr *MesonHelper) extra(int) P {
func (attr *MesonHelper) extra() P {
if !attr.isPython() {
return P{_muon}
}
+1 -1
View File
@@ -39,7 +39,7 @@ package acl {
exec = make {
// makes assumptions about uid_map/gid_map
skipCheck = true;
check = nil;
};
inputs = [ attr, kernel-headers ];
+3 -3
View File
@@ -15,9 +15,9 @@ package awk {
chmod = true;
exec = make {
omitDefaults = true;
inPlace = true;
skipConfigure = true;
defaults = false;
chdir = false;
configure = nil;
make = [ "YACC='yacc -d -b awkgram'" ];
preCheck = "install -vD a.out /system/bin/awk\n";
install = "install -vD a.out /work/system/bin/awk";
+3 -2
View File
@@ -5,12 +5,14 @@ package bison {
version# = "3.8.2";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/bison/bison-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/bison/bison-"+version+".tar.gz";
checksum = "BhRM6K7URj1LNOkIDCFDctSErLS-Xo5d9ba9seg10o6ACrgC1uNhED7CQPgIY29Y";
compress = gzip;
};
toyboxEarly = true;
exec = make {
defaults = false;
check = [
"TESTSUITEFLAGS=" + jobsFlagE + "' " + skipGNUTests {
tests = [
@@ -24,6 +26,5 @@ package bison {
];
};
toyboxEarly = true;
inputs = [ m4 ];
}
+3 -1
View File
@@ -18,5 +18,7 @@ package byacc {
writable = true;
chmod = true;
exec = make {};
exec = make {
defaults = false;
};
}
+4 -7
View File
@@ -15,13 +15,10 @@ package bzip2 {
enterSource = true;
exec = make {
skipConfigure = true;
skipCheck = true;
inPlace = true;
make = [
"CC=cc",
];
chdir = false;
configure = nil;
make = [ "CC=cc" ];
check = nil;
install = "make PREFIX=/work/system install";
};
}
+1 -1
View File
@@ -27,7 +27,7 @@ package cairo {
// runs the entire test suite in a single meson test
interactiveTest = true;
// only works with specific dependency versions
skipTest = true;
test = false;
};
inputs = [
+3 -3
View File
@@ -3,12 +3,12 @@ package cmake {
website = "https://cmake.org";
anitya = 306;
version# = "4.4.0";
version# = "4.4.2";
source = remoteGitHubRelease {
suffix = "Kitware/CMake";
tag = "v"+version;
name = "cmake-"+version+".tar.gz";
checksum = "ZL0Y19_mSJWsl3dMjRRQJAaCvl4_PqbwpgUC1aBA-cdVdrK_gt4ylpUM2GMoQMku";
checksum = "IWlqJqJCZ6f-z-7Ft1U4ycvCX4riuihKale5NKWusiHemBgC3m5gCecrzikXoL7S";
compress = gzip;
};
patches = [ "disable-broken-tests-musl.patch" ];
@@ -20,7 +20,7 @@ package cmake {
chmod = true;
exec = make {
omitDefaults = true;
defaults = false;
configureName = "/usr/src/cmake/bootstrap";
configure = {
+1 -1
View File
@@ -19,7 +19,7 @@ package connman {
inputs = [
automake,
libtool,
pkg-config,
pkgconf,
dbus,
iptables,
+43
View File
@@ -0,0 +1,43 @@
package cryptsetup {
description = "open-source disk encryption";
website = "https://gitlab.com/cryptsetup/cryptsetup";
anitya = 13709;
version# = "2.8.7";
source = remoteGitLab {
domain = "gitlab.com";
suffix = "cryptsetup/cryptsetup";
ref = "v"+version;
checksum = "eDi_UaMtwhIzqpsdcA91aVb56zCYDrsDzeMWfWXAnPbuvn2bEgeH5dFs7mouHz8V";
};
bin = [ "bash" ];
exec = meson {
setup = {
"asciidoc": "disabled";
"ssh-token": "false";
"blkid": "false";
};
};
inputs = [
bash,
gettext,
coreutils,
popt,
lvm2,
json-c,
e2fsprogs,
argp-standalone,
kernel-headers,
];
runtime = [
popt,
lvm2,
json-c,
e2fsprogs,
openssl,
];
}
+1 -1
View File
@@ -21,7 +21,7 @@ touch \
`;
exec = make {
inPlace = true;
chdir = false;
configureName = "../dist/configure";
forceAutoconf = true;
configure = {
+2 -2
View File
@@ -41,11 +41,11 @@ package xdg-dbus-proxy {
website = "https://github.com/flatpak/xdg-dbus-proxy";
anitya = 58434;
version# = "0.1.7";
version# = "0.1.8";
source = remoteGitHub {
suffix = "flatpak/xdg-dbus-proxy";
tag = version;
checksum = "UW5Pe-TP-XAaN-kTbxrkOQ7eYdmlAQlr2pdreLtPT0uwdAz-7rzDP8V_8PWuZBup";
checksum = "ygdW0EEvZ-_PJfnFTNoobITmRzqJecTinBsJd_iJQrRvzidwqESCjeNkB55smZ2y";
};
exec = meson {
+28
View File
@@ -0,0 +1,28 @@
package e2fsprogs {
description = "ext2/3/4 filesystem userspace utilities";
website = "http://e2fsprogs.sourceforge.net";
anitya = 646;
version# = "1.47.4";
source = remoteTar {
url = "https://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git"+
"/snapshot/e2fsprogs-"+version+".tar.gz";
compress = gzip;
checksum = "gdnAEVjncIciqG-ZhFfYVv4wbBbCHBmPPYwRxltIfOTqdYH5L3ri8wk75YIVlgN0";
};
exec = make {
configure = {
"enable-elf-shlibs";
};
};
inputs = [
perl,
gzip,
bzip2,
diffutils,
kernel-headers,
];
}
+4 -4
View File
@@ -18,17 +18,17 @@ package elfutils {
];
exec = make {
// nonstandard glibc extension
skipCheck = true;
configure = {
"enable-deterministic-archives";
};
// nonstandard glibc extension
check = nil;
};
inputs = [
m4,
pkg-config,
pkgconf,
zlib,
bzip2,
+6 -6
View File
@@ -3,12 +3,12 @@ package firmware {
website = "https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git";
anitya = 141464;
version# = "20260622";
version# = "20260810";
source = remoteGitLab {
domain = "gitlab.com";
suffix = "kernel-firmware/linux-firmware";
ref = version;
checksum = "gpytkDM58EVjaUuryOekcekh_rWsfuv3S7LQxopHlNlVGmMsuqNwfug4BjgTgizE";
checksum = "XNUhz9QstaDKNegM3Bl0-TtZzpsvX7-E8WMnDCO7KBhBC6t_TxsdG05-ETdXynry";
};
// dedup creates temporary file
@@ -22,17 +22,17 @@ package firmware {
];
exec = make {
omitDefaults = true;
skipConfigure = true;
inPlace = true;
defaults = false;
chdir = false;
configure = nil;
make = [
"DESTDIR=/work/system",
"install-zst",
];
// requires pre-commit
skipCheck = true;
check = nil;
install = "make " + jobsFlagE + " " + loadFlagE + " DESTDIR=/work/system dedup";
};
+3 -3
View File
@@ -3,12 +3,12 @@ package fontconfig {
website = "https://www.freedesktop.org/wiki/Software/fontconfig";
anitya = 827;
version# = "2.18.2";
version# = "2.18.3";
source = remoteGitLab {
domain = "gitlab.freedesktop.org";
suffix = "fontconfig/fontconfig";
ref = version;
checksum = "P8YoQunIynBhc3gdDyPkImw_GGYoy1U4aX0jTnpkgtLmU4nqIgUyeqCH3-rNzpTd";
checksum = "ZZzmt8fYh-3jKJ6vHXUDbeAWM2ilRusWxdynLt3Z4E_CQQ8cCwzpuAWACXmr9qHI";
};
exec = make {
@@ -18,7 +18,7 @@ package fontconfig {
inputs = [
automake,
libtool,
pkg-config,
pkgconf,
gettext,
gperf,
gzip,
+1 -1
View File
@@ -22,7 +22,7 @@ package fuse {
postCompile = "python3 -m pytest test/";
// this project uses pytest
skipTest = true;
test = false;
};
inputs = [
+1 -1
View File
@@ -8,7 +8,7 @@ package gawk {
version# = "5.4.0";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/gawk/gawk-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/gawk/gawk-"+version+".tar.gz";
checksum = "m0RkIolC-PI7EY5q8pcx5Y-0twlIW0Yp3wXXmV-QaHorSdf8BhZ7kW9F8iWomz0C";
compress = gzip;
};
+6 -6
View File
@@ -3,10 +3,10 @@ package binutils {
website = "https://www.gnu.org/software/binutils";
anitya = 7981;
version# = "2.46.1";
version# = "2.47";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/binutils/binutils-"+version+".tar.bz2";
checksum = "ihCVohBxX-URAR-YFDdVrL3inLYsEVX8KbbQmcbHaShHgqqmtsvUue1h3LXSjW-d";
url = "https://mirrors.kernel.org/gnu/binutils/binutils-"+version+".tar.bz2";
checksum = "VjbMg5KtZ6VSeNc77Z5p8RKg9eZ56g29ViKbbsF3tcFhZu0Yurg0nZt7UwB577LM";
compress = bzip2;
};
@@ -20,11 +20,11 @@ package gcc {
website = "https://www.gnu.org/software/gcc";
anitya = 6502;
version# = "16.1.0";
version# = "16.2.0";
source = remoteTar {
url = "https://ftp.tsukuba.wide.ad.jp/software/gcc/releases/"+
"gcc-"+version+"/gcc-"+version+".tar.gz";
checksum = "4ASoWbxaA2FW7PAB0zzHDPC5XnNhyaAyjtDPpGzceSLeYnEIXsNYZR3PA_Zu5P0K";
checksum = "yWDNSrcKa6yA5ucD4G-a5nCN99yPA8cRlxKgQlaaT-jM4pWYR6e1EvI2qbjUqXWZ";
compress = gzip;
};
patches = [
@@ -65,7 +65,7 @@ ln -s system/lib /work/
// This toolchain is hacked to pieces, it is not expected to ever work
// well in its current state. That does not matter as long as the
// toolchain it produces passes its own test suite.
skipCheck = true;
check = nil;
};
inputs = [
+1 -1
View File
@@ -23,7 +23,7 @@ rm -f /system/bin/httpd
bin = [ "perl" ];
populateUsrBin = true;
exec = make {
inPlace = true;
chdir = false;
generate = "make configure";
preMake = `
+2 -2
View File
@@ -3,11 +3,11 @@ package glib {
website = "https://developer.gnome.org/glib";
anitya = 10024;
version# = "2.89.2";
version# = "2.89.3";
source = remoteGit {
url = "https://gitlab.gnome.org/GNOME/glib.git";
tag = version;
checksum = "ZetUwjVOKs0v2xtndzy7_4kvZY2VEESOTT45AAMJVLr22fmTRKit4MJOwruB0als";
checksum = "eM9KrXwhwKiZferwrILKmDeq-IGnSjr0EKqV90EEVl0Ee82QVcyVSf2LDMROHcOF";
};
files = {
+4 -4
View File
@@ -1,13 +1,13 @@
package glslang {
description = "reference front end for GLSL/ESSL";
website = "https://github.com/KhronosGroup/glslang";
anitya = 205796;
anitya = 334917;
version# = "16.4.0";
version# = "1.4.357.0";
source = remoteGitHub {
suffix = "KhronosGroup/glslang";
tag = version;
checksum = "u67ps8Fv_75QDiusvKjzgttPPPxb5V7HsObb0q6OvqQfHh0UGN2_x8Y0RKb9JEie";
tag = "vulkan-sdk-"+version;
checksum = "7Zq12xtSd5z_aEEeYCnsWR5WvcEGVlTsRaV6MqkmY1a3iNIrRbX_rrg-taI3wMe6";
};
// test suite writes to source
+38 -30
View File
@@ -7,7 +7,7 @@ package m4 {
version# = "1.4.21";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/m4/m4-"+version+".tar.bz2";
url = "https://mirrors.kernel.org/gnu/m4/m4-"+version+".tar.bz2";
checksum = "pPa6YOo722Jw80l1OsH1tnUaklnPFjFT-bxGw5iAVrZTm1P8FQaWao_NXop46-pm";
compress = bzip2;
};
@@ -17,9 +17,11 @@ package m4 {
chmod +w tests/test-c32ispunct.sh && echo '#!/bin/sh' > tests/test-c32ispunct.sh
`;
exec = make {};
toyboxEarly = true;
exec = make {
defaults = false;
};
inputs = [
diffutils,
@@ -34,7 +36,7 @@ package autoconf {
version# = "2.73";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/autoconf/autoconf-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/autoconf/autoconf-"+version+".tar.gz";
checksum = "yGabDTeOfaCUB0JX-h3REYLYzMzvpDwFmFFzHNR7QilChCUNE4hR6q7nma4viDYg";
compress = gzip;
};
@@ -69,7 +71,7 @@ package automake {
version# = "1.18.1";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/automake/automake-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/automake/automake-"+version+".tar.gz";
checksum = "FjvLG_GdQP7cThTZJLDMxYpRcKdpAVG-YDs1Fj1yaHlSdh_Kx6nRGN14E0r_BjcG";
compress = gzip;
};
@@ -105,14 +107,14 @@ package libtool {
version# = "2.6.2";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/libtool/libtool-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/libtool/libtool-"+version+".tar.gz";
checksum = "roFqdjyoGjpK7CWWLJJrTS56LuOQcIdq6Tgr4yplacSwirFHoaiDe6CojIWYinWe";
compress = gzip;
};
exec = make {
// _Z2a2c: symbol not found
skipEarlyStageCheck = true;
checkEarly = false;
check = [
"TESTSUITEFLAGS=" + jobsFlagE,
@@ -133,14 +135,14 @@ package gzip {
version# = "1.14";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/gzip/gzip-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/gzip/gzip-"+version+".tar.gz";
checksum = "NWhjUavnNfTDFkZJyAUonL9aCOak8GVajWX2OMlzpFnuI0ErpBFyj88mz2xSjz0q";
compress = gzip;
};
exec = make {
// dependency loop
skipCheck = true;
check = nil;
};
}
@@ -151,7 +153,7 @@ package sed {
version# = "4.10";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/sed/sed-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/sed/sed-"+version+".tar.gz";
checksum = "TXTRFQJCyflb-bpBRI2S5Y1DpplwvT7-KfXtpqN4AdZgZ5OtI6yStn1-bkhDKx51";
compress = gzip;
};
@@ -179,7 +181,7 @@ package diffutils {
version# = "3.12";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/diffutils/diffutils-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/diffutils/diffutils-"+version+".tar.gz";
checksum = "9J5VAq5oA7eqwzS1Yvw-l3G5o-TccUrNQR3PvyB_lgdryOFAfxtvQfKfhdpquE44";
compress = gzip;
};
@@ -194,7 +196,9 @@ test_disable '#!/bin/sh' tests/cmp
`;
toyboxEarly = true;
exec = make {};
exec = make {
defaults = false;
};
}
package patch {
@@ -204,7 +208,7 @@ package patch {
version# = "2.8";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/patch/patch-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/patch/patch-"+version+".tar.gz";
checksum = "MA0BQc662i8QYBD-DdGgyyfTwaeALZ1K0yusV9rAmNiIsQdX-69YC4t9JEGXZkeR";
compress = gzip;
};
@@ -218,7 +222,9 @@ test_disable '#!/bin/sh' tests/need-filename
`;
toyboxEarly = true;
exec = make {};
exec = make {
defaults = false;
};
}
package grep {
@@ -228,7 +234,7 @@ package grep {
version# = "3.12";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/grep/grep-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/grep/grep-"+version+".tar.gz";
checksum = "qMB4RjaPNRRYsxix6YOrjE8gyAT1zVSTy4nW4wKW9fqa0CHYAuWgPwDTirENzm_1";
compress = gzip;
};
@@ -253,7 +259,7 @@ package gettext {
version# = "1.0";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/gettext/gettext-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/gettext/gettext-"+version+".tar.gz";
checksum = "3MasKeEdPeFEgWgzsBKk7JqWqql1wEMbgPmzAfs-mluyokoW0N8oQVxPQoOnSdgC";
compress = gzip;
};
@@ -293,7 +299,7 @@ package findutils {
version# = "4.11.0";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/findutils/findutils-"+version+".tar.xz";
url = "https://mirrors.kernel.org/gnu/findutils/findutils-"+version+".tar.xz";
compress = xz;
checksum = "X-qsv9aUoBL583q-4iZcBI3_7Ufd3fSIqFmNLXWdEpUihlRfMpGGyAUt8SAvDKae";
};
@@ -321,13 +327,14 @@ package bash {
version# = "5.3";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/bash/bash-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/bash/bash-"+version+".tar.gz";
checksum = "4LQ_GRoB_ko-Ih8QPf_xRKA02xAm_TOxQgcJLmFDT6udUPxTAWrsj-ZNeuTusyDq";
compress = gzip;
};
toyboxEarly = true;
exec = make {
defaults = false;
configure = {
"without-bash-malloc";
};
@@ -342,7 +349,7 @@ package coreutils {
version# = "9.11";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/coreutils/coreutils-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/coreutils/coreutils-"+version+".tar.gz";
checksum = "t8UMed5wpFEoC56aa42_yidfOAaRGzOfj7MRtQkkqgGbpXiskNA8bd-EmVSQkZie";
compress = gzip;
};
@@ -364,6 +371,7 @@ test_disable 'int main(){return 0;}' gnulib-tests/test-lchown.c
`;
exec = make {
defaults = false;
configure = {
"enable-single-binary": "symlinks";
};
@@ -384,7 +392,7 @@ package tar {
version# = "1.35";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/tar/tar-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/tar/tar-"+version+".tar.gz";
checksum = "zSaoSlVUDW0dSfm4sbL4FrXLFR8U40Fh3zY5DWhR5NCIJ6GjU6Kc4VZo2-ZqpBRA";
compress = gzip;
};
@@ -421,14 +429,14 @@ package texinfo {
version# = "7.3";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/texinfo/texinfo-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/texinfo/texinfo-"+version+".tar.gz";
checksum = "RRmC8Xwdof7JuZJeWGAQ_GeASIHAuJFQMbNONXBz5InooKIQGmqmWRjGNGEr5n4-";
compress = gzip;
};
exec = make {
// nonstandard glibc extension
skipCheck = true;
check = nil;
};
inputs = [ perl ];
@@ -446,7 +454,7 @@ package gperf {
version# = "3.3";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gperf/gperf-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/gperf/gperf-"+version+".tar.gz";
checksum = "RtIy9pPb_Bb8-31J2Nw-rRGso2JlS-lDlVhuNYhqR7Nt4xM_nObznxAlBMnarJv7";
compress = gzip;
};
@@ -463,7 +471,7 @@ package bc {
version# = "1.08.2";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/bc/bc-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/bc/bc-"+version+".tar.gz";
checksum = "8h6f3hjV80XiFs6v9HOPF2KEyg1kuOgn5eeFdVspV05ODBVQss-ey5glc8AmneLy";
compress = gzip;
};
@@ -486,7 +494,7 @@ package libiconv {
version# = "1.19";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/libiconv/libiconv-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/libiconv/libiconv-"+version+".tar.gz";
checksum = "UibB6E23y4MksNqYmCCrA3zTFO6vJugD1DEDqqWYFZNuBsUWMVMcncb_5pPAr88x";
compress = gzip;
};
@@ -501,7 +509,7 @@ package parallel {
version# = "20260722";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/parallel/parallel-"+version+".tar.bz2";
url = "https://mirrors.kernel.org/gnu/parallel/parallel-"+version+".tar.bz2";
checksum = "liG9pBSRqUPqDuRXmnJPoVh-G53lDKkkO8GGabSxQnSho4b9BD0EaJDdScgVhnwj";
compress = bzip2;
};
@@ -524,7 +532,7 @@ package libunistring {
version# = "1.4.2";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/libunistring/libunistring-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/libunistring/libunistring-"+version+".tar.gz";
checksum = "iW9BbfLoVlXjWoLTZ4AekQSu4cFBnLcZ4W8OHWbv0AhJNgD3j65_zqaLMzFKylg2";
compress = gzip;
};
@@ -551,7 +559,7 @@ package libtasn1 {
version# = "4.21.0";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/libtasn1/libtasn1-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/libtasn1/libtasn1-"+version+".tar.gz";
checksum = "9DYI3UYbfYLy8JsKUcY6f0irskbfL0fHZA91Q-JEOA3kiUwpodyjemRsYRjUpjuq";
compress = gzip;
};
@@ -566,7 +574,7 @@ package readline {
version# = "8.3";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/readline/readline-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/readline/readline-"+version+".tar.gz";
checksum = "r-lcGRJq_MvvBpOq47Z2Y1OI2iqrmtcqhTLVXR0xWo37ZpC2uT_md7gKq5o_qTMV";
compress = gzip;
};
@@ -640,7 +648,7 @@ package mpc {
enterSource = true;
exec = make {
inPlace = true;
chdir = false;
generate = "autoreconf -vfi";
};
+1 -1
View File
@@ -47,7 +47,7 @@ echo 'int main(){return 0;}' > tests/mini-dtls-fragments.c
bison,
gettext,
gperf,
pkg-config,
pkgconf,
python,
texinfo,
-135
View File
@@ -1,135 +0,0 @@
From 06f90ebfa6f3e0a744584513e2786988b26569da Mon Sep 17 00:00:00 2001
From: Damien Neil <dneil@google.com>
Date: Wed, 08 Jul 2026 11:11:48 -0700
Subject: [PATCH] os: properly handle trailing / in Root.MkdirAll
MkdirAll("dir/") should create "dir", not return an error.
Fixes #80308
Change-Id: I75458c30b6cb94be3a3d368f6024caef6a6a6964
---
diff --git a/src/os/root_noopenat.go b/src/os/root_noopenat.go
index 228b580..a84e952 100644
--- a/src/os/root_noopenat.go
+++ b/src/os/root_noopenat.go
@@ -158,6 +158,9 @@
if err := checkPathEscapes(r, name); err == errPathEscapes {
return &PathError{Op: "mkdirat", Path: name, Err: err}
}
+ if name == "" {
+ return &PathError{Op: "mkdirat", Path: name, Err: syscall.ENOENT}
+ }
prefix := r.root.name + string(PathSeparator)
if err := MkdirAll(prefix+name, perm); err != nil {
if pe, ok := err.(*PathError); ok {
diff --git a/src/os/root_openat.go b/src/os/root_openat.go
index d7c9334..92865e4 100644
--- a/src/os/root_openat.go
+++ b/src/os/root_openat.go
@@ -167,6 +167,12 @@
fi, e := r.Stat(fullname)
if e == nil && fi.Mode().IsDir() {
err = nil
+ } else if e == nil {
+ err = syscall.ENOTDIR
+ } else if !IsNotExist(e) {
+ // EPERM, ELOOP, etc.,
+ // probably more useful than EEXIST.
+ err = e
}
}
}
@@ -177,7 +183,12 @@
}
return struct{}{}, &PathError{Op: "mkdirat", Err: err}
}
- _, err := doInRoot(r, fullname, 0, openDirFunc, openLastComponentFunc)
+ flags := uint(doInRootCreatingDirectory)
+ switch runtime.GOOS {
+ case "linux", "windows":
+ flags = doInRootNoHandleTerminalSlash // see rootMkdir
+ }
+ _, err := doInRoot(r, fullname, flags, openDirFunc, openLastComponentFunc)
if err != nil {
if _, ok := err.(*PathError); !ok {
err = &PathError{Op: "mkdirat", Path: fullname, Err: err}
diff --git a/src/os/root_test.go b/src/os/root_test.go
index 5e0acf9..33a2f33 100644
--- a/src/os/root_test.go
+++ b/src/os/root_test.go
@@ -585,6 +585,11 @@
func TestRootMkdirAll(t *testing.T) {
for _, test := range rootTestCases {
+ if test.name == "directory does not exist" {
+ // Test expects error, mkdirall creates the missing directory.
+ // TestRootMultiMkdirAll covers this case better anyway, just skip.
+ continue
+ }
test.run(t, func(t *testing.T, target string, root *os.Root) {
wantError := test.wantError
if test.ltarget != "" {
@@ -593,7 +598,7 @@
wantError = true
}
- err := root.Mkdir(test.open, 0o777)
+ err := root.MkdirAll(test.open, 0o777)
if errEndsTest(t, err, wantError, "root.MkdirAll(%q)", test.open) {
return
}
@@ -3133,6 +3138,52 @@
})
}
+func TestRootMultiMkdirAllShallow(t *testing.T) {
+ runRootMultiTest(t, func(t *testing.T, test *rootMultiTest) (string, error) {
+ return testRootMultiMkdirAll(t, test, test.targetPath)
+ })
+}
+
+func TestRootMultiMkdirAllDeep(t *testing.T) {
+ runRootMultiTest(t, func(t *testing.T, test *rootMultiTest) (string, error) {
+ targetPath := test.targetPath
+ if len(targetPath) > 0 && os.IsPathSeparator(targetPath[len(targetPath)-1]) {
+ targetPath += "a/b/"
+ } else {
+ targetPath += "/a/b"
+ }
+ return testRootMultiMkdirAll(t, test, targetPath)
+ })
+}
+
+func testRootMultiMkdirAll(t *testing.T, test *rootMultiTest, targetPath string) (string, error) {
+ var mkdirAll = os.MkdirAll
+ if test.root != nil {
+ mkdirAll = test.root.MkdirAll
+ }
+
+ test.setOp("MkdirAll(%q, 0o777)", targetPath)
+ gotErr := mkdirAll(targetPath, 0o777)
+
+ switch {
+ case test.root != nil && test.target.lescapes():
+ // "mkdir ../target", or equivalent escaping path.
+ test.wantError(t, gotErr, os.ErrPathEscapes)
+ case test.root != nil && test.target.escapes():
+ // "mkdir ../target", or equivalent escaping path.
+ test.wantError(t, gotErr, errAny)
+ return "", errSkipRootConsistencyCheck
+ case test.root != nil && test.target.kind == testFileSymlink && test.target.target.kind == testFileAbsent && targetPath != test.targetPath:
+ // A minor inconsistency between Root.MkdirAll and os.MkdirAll:
+ // When an intermediate component of the tree being constructed is a
+ // dangling symlink, Root.MkdirAll will follow the symlink and create
+ // its target directory, while os.MkdirAll will fail with an error.
+ return "", errSkipRootConsistencyCheck
+ default:
+ }
+ return "", gotErr
+}
+
func TestRootMultiRename(t *testing.T) {
if runtime.GOOS == "wasip1" {
switch os.Getenv("GOWASIRUNTIME") {
+3 -5
View File
@@ -3,18 +3,16 @@ package go {
website = "https://go.dev";
anitya = 1227;
version# = "1.26.5";
version# = "1.26.6";
source = remoteTar {
url = "https://go.dev/dl/go"+version+".src.tar.gz";
checksum = "13yt1u_NGOd62LO-WZ8W6CUXodOrEF5CdkiTTiH9E635IHn1luvlXYjsHpBXNFSw";
checksum = "BJQz9rGJ7ElMsZGURH7lw48Hw0x88RwdQJpINMomtgGCMK3AtwGCxDRkLE9REh5r";
compress = gzip;
};
patches = [
// https://go.dev/issue/77674
"746640.patch",
// https://go.dev/issue/80308
"799064.patch",
];
env = [
@@ -27,7 +25,7 @@ package go {
enterSource = true;
exec = generic {
inPlace = true;
chdir = false;
build = `
mkdir /work/system/ "${TMPDIR}"
cp -r . /work/system/go
+2 -2
View File
@@ -3,12 +3,12 @@ package googletest {
exclude = true;
anitya = 18290;
version# = "1.17.0";
version# = "1.18.0";
output = remoteGitHubRelease {
suffix = "google/googletest";
tag = "v"+version;
name = "googletest-"+version+".tar.gz";
checksum = "-1r3ch8vPP8COF7xUH5hyX6bEJ4dN9TQh4IxrmpHr6vaig6mA3DdUpV4cihQ_9dw";
checksum = "ABVPC5sduQR7xfkZQm7UHSmBTaAJcVPRHS_lNMhlL99HU_YffpFmXbwRKeG1ZY8A";
compress = gzip;
};
}
@@ -2,11 +2,11 @@ package hakurei-source {
description = "hakurei source tree";
exclude = true;
version# = "0.4.5";
version# = "0.4.6";
output = remoteTar {
url = "https://git.gensokyo.uk/rosa/hakurei/archive/"+
"v"+version+".tar.gz";
checksum = "5bvbuIRcDIrtijogwqXn3y8h5f3rVS4ZSVhOig6Galfzt3g-O3Ufb-tHL1kQCQWK";
checksum = "2HxvdykuSSymAu-c1WIwQAy3qT4dDm8B--93iL4uomBlBC8wfSWldbvPF1noNkUC";
compress = gzip;
};
}
@@ -27,16 +27,9 @@ package hakurei {
"CC=clang -O3 -Werror",
];
files = {
"hostname/main.go": "hostname";
};
exec = generic {
inPlace = true;
chdir = false;
build = `
echo 'Building test helper (hostname).'
go build -o /bin/hostname /usr/src/hostname/main.go
mkdir -p /work/system/libexec/hakurei/
echo "Building hakurei for $(go env GOOS)/$(go env GOARCH)."
@@ -71,7 +64,8 @@ mkdir -p /work/system/bin/
inputs = [
go,
pkg-config,
pkgconf,
net-tools,
libseccomp,
acl,
@@ -98,16 +92,9 @@ package hakurei-dist {
"CC=clang -O3 -Werror",
];
files = {
"hostname/main.go": "hostname";
};
exec = generic {
inPlace = true;
chdir = false;
build = `
echo 'Building test helper (hostname).'
go build -o /bin/hostname /usr/src/hostname/main.go
NAME=make`;
check = `
NAME=all`;
@@ -118,7 +105,8 @@ DESTDIR=/work "./${NAME}.sh"
inputs = [
go,
pkg-config,
pkgconf,
net-tools,
libseccomp,
acl,
@@ -146,7 +134,7 @@ package earlyinit {
];
exec = generic {
inPlace = true;
chdir = false;
build = `
echo '# Building earlyinit.'
go build -trimpath -v -o /work/ -ldflags="-s -w
-11
View File
@@ -1,11 +0,0 @@
package main
import "os"
func main() {
if name, err := os.Hostname(); err != nil {
panic(err)
} else {
os.Stdout.WriteString(name)
}
}
+2 -2
View File
@@ -3,11 +3,11 @@ package harfbuzz {
website = "https://harfbuzz.github.io";
anitya = 1299;
version# = "14.2.1";
version# = "14.3.1";
source = remoteGitHub {
suffix = "harfbuzz/harfbuzz";
tag = version;
checksum = "gWl1fS1nXSH9Z9GpJSrh6w7Iv6AOjZbDL_4JZAZTiTYSyLCfxIFuCRLjYmqT2nbt";
checksum = "ykVwQNNbvY38Y27VjAfk16SGcEO5NY5A8CFxJCJ8z0ARh5MdLImmONpy-ZSb79Il";
};
exec = meson {
+4 -4
View File
@@ -3,11 +3,11 @@ package hwdata {
website = "https://github.com/vcrhonek/hwdata";
anitya = 5387;
version# = "0.409";
version# = "0.410";
source = remoteGitHub {
suffix = "vcrhonek/hwdata";
tag = "v"+version;
checksum = "p2qr1_Y9dpjMNnK8OPNcuHSNwZldwb6mtiJ9Nd5HgU8z3L9fixLthnixywU8dd65";
checksum = "w1fbTz8NR7C6SYOupqTyNZGJHa_cDRAsGs4guZ3LddqlmawgEP_CWFw9-OYFKJ1q";
};
writable = true;
@@ -15,9 +15,9 @@ package hwdata {
exec = make {
// awk: fatal: cannot open file `hwdata.spec' for reading: No such file or directory
inPlace = true;
chdir = false;
// lspci: Unknown option 'A' (see "lspci --help")
skipCheck = true;
check = nil;
};
}
+3 -3
View File
@@ -21,7 +21,7 @@ package iproute2 {
chmod = true;
exec = make {
inPlace = true;
chdir = false;
// drop default autoconf options
configureName = "./configure";
configure = {
@@ -30,11 +30,11 @@ package iproute2 {
};
make = [ "CC=cc", "YACC=yacc" ];
// wants root
skipCheck = true;
check = nil;
};
inputs = [
pkg-config,
pkgconf,
m4,
byacc,
flex,
+2 -1
View File
@@ -1,6 +1,6 @@
#
# Automatically generated file; DO NOT EDIT.
# Linux/x86 6.18.40 Kernel Configuration
# Linux/x86 6.18.44 Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="clang version 22.1.8"
CONFIG_GCC_VERSION=0
@@ -7311,6 +7311,7 @@ CONFIG_AGP_INTEL=m
CONFIG_AGP_SIS=m
CONFIG_AGP_VIA=m
CONFIG_INTEL_GTT=m
CONFIG_GPU_BUDDY=y
CONFIG_DRM=m
#
+2 -1
View File
@@ -1,6 +1,6 @@
#
# Automatically generated file; DO NOT EDIT.
# Linux/arm64 6.18.40 Kernel Configuration
# Linux/arm64 6.18.44 Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="clang version 22.1.8"
CONFIG_GCC_VERSION=0
@@ -7986,6 +7986,7 @@ CONFIG_HT16K33=m
CONFIG_MAX6959=m
CONFIG_SEG_LED_GPIO=m
CONFIG_PANEL=m
CONFIG_GPU_BUDDY=y
CONFIG_TEGRA_HOST1X_CONTEXT_BUS=y
CONFIG_TEGRA_HOST1X=m
CONFIG_TEGRA_HOST1X_FIREWALL=y
+13 -11
View File
@@ -3,11 +3,11 @@ package kernel-source {
website = "https://kernel.org";
exclude = true;
version# = "6.18.40";
version# = "6.18.44";
output = remoteTar {
url = "https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/"+
"snapshot/linux-"+version+".tar.gz";
checksum = "s4lO-rWM-3FudvHLoD4zBEF5wDv21JR6XavpOqe5D4CCUsvwVCX4hWZ923cuAs-k";
checksum = "yNPGMl3A-EgU6LgD37PAcXIa9iUtP-AmoJuQozfGRSq6Eg1Eq4fdbpKy3iWewU9_";
compress = gzip;
};
}
@@ -25,7 +25,8 @@ package kernel-headers {
toyboxEarly = true;
exec = make {
skipConfigure = true;
defaults = false;
configure = nil;
make = [
"-f /usr/src/kernel-headers/Makefile",
"O=/tmp/kbuild",
@@ -34,7 +35,7 @@ package kernel-headers {
"INSTALL_HDR_PATH=/work/system",
"headers_install",
];
skipCheck = true;
check = nil;
install = `
cat \
/usr/src/version.h > \
@@ -45,9 +46,9 @@ cat \
checksum = arch {
default = "";
amd64 = "U2DVl4KAYBB18KOb91ga6ob7-B0OPjTHLssLXf_Lh5XEe8TTsplPxXamV9a94WpK";
arm64 = "oI4quef6uM-wrRoQa2dNYog4b7CtSjvLY84eXaNbRvTJA2tEm3oCx0guKBmScE38";
riscv64 = "bgWRcfzfAh00TZvXy4W-EkWm4lq7VAk9-Bsv53hWh2qgz1fTMqw1Q9rgo_-aKgeS";
amd64 = "vN5Ts9yAlHTntcQcNGJSisY5guYsYfvGnQqI1NzTBzvhBMPD432WB3B0KFGYQntA";
arm64 = "FQtpqCA0tlz17RJP8a5t9YEM_6F9kGPqQ9Z60gFrkVP3v8_P-Vnf5S7wLlxyRlOe";
riscv64 = "U5yQ9TI5_7diyrCcm2Iqh3XCMl0P60oQGeDMWxt3OQ91zFWPQ5FCH-eoYG9tSTMT";
};
inputs = [ rsync ];
}
@@ -85,11 +86,12 @@ install -Dm0500 \
exclusive = true;
exec = make {
omitDefaults = true;
skipConfigure = true;
defaults = false;
configure = nil;
// Build, install, and boot kernel before running kselftest on it.
skipCheck = true;
check = nil;
make = [
"-f /usr/src/kernel/Makefile",
@@ -153,7 +155,7 @@ package gen_init_cpio {
enterSource = true;
exec = generic {
inPlace = true;
chdir = false;
build = `
mkdir -p /work/system/bin/
cc -o /work/system/bin/gen_init_cpio usr/gen_init_cpio.c
+2 -1
View File
@@ -1,6 +1,6 @@
#
# Automatically generated file; DO NOT EDIT.
# Linux/riscv 6.18.40 Kernel Configuration
# Linux/riscv 6.18.44 Kernel Configuration
#
CONFIG_CC_VERSION_TEXT="clang version 22.1.8"
CONFIG_GCC_VERSION=0
@@ -6897,6 +6897,7 @@ CONFIG_HT16K33=m
CONFIG_MAX6959=m
CONFIG_SEG_LED_GPIO=m
CONFIG_PANEL=m
CONFIG_GPU_BUDDY=y
CONFIG_DRM=m
#
+2 -2
View File
@@ -1,5 +1,5 @@
#define LINUX_VERSION_CODE 397864
#define LINUX_VERSION_CODE 397868
#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + ((c) > 255 ? 255 : (c)))
#define LINUX_VERSION_MAJOR 6
#define LINUX_VERSION_PATCHLEVEL 18
#define LINUX_VERSION_SUBLEVEL 40
#define LINUX_VERSION_SUBLEVEL 44
+1 -1
View File
@@ -22,7 +22,7 @@ package kmod {
};
// makes assumptions about the running kernel
skipTest = true;
test = false;
};
inputs = [
+37
View File
@@ -0,0 +1,37 @@
package libaio {
description = "kernel asynchronous I/O (AIO) support";
website = "https://lse.sourceforge.net/io/aio.html";
anitya = 1557;
version# = "0.3.113";
source = remoteTar {
url = "https://pagure.io/libaio/archive/libaio-"+version+
"/libaio-libaio-"+version+".tar.gz";
compress = gzip;
checksum = "vUATfur4I3D742vjRhiGMLYDCm-blbsymb3JTUiM3RV5HIEWi0wDBiPqh7jJpMWd";
};
enterSource = true;
writable = true;
chmod = true;
env = [ "PATH=/system/sbin" ];
bin = [ "bash" ];
exec = make {
chdir = false;
configure = nil;
preCheck = "rm harness/cases/20.t; "+ // flaky
"CFLAGS='"+
"-Wno-unknown-warning-option "+
"-Wno-gnu-designator "+
"-Wno-#warnings' ";
check = [ "partcheck" ];
install = "make prefix=/work/system install";
};
inputs = [
bash,
e2fsprogs,
kernel-headers,
];
}
@@ -60,4 +60,5 @@ list(APPEND CTEST_CUSTOM_TESTS_IGNORE
"libarchive_test_read_format_tar_filename"
"libarchive_test_read_format_ustar_filename"
"libarchive_test_read_append_wrong_filter"
"libarchive_test_read_format_zip_ppmd8_aes256_streaming"
)
+2 -2
View File
@@ -3,11 +3,11 @@ package libarchive {
website = "https://www.libarchive.org";
anitya = 1558;
version# = "3.8.8";
version# = "3.8.9";
source = remoteGitHub {
suffix = "libarchive/libarchive";
tag = "v"+version;
checksum = "MYlQdlxHX14rFL_zEYvDArKgGVIueTPzSEDgCzaZkmi0_N7WsaEpogGO3qnHpfTc";
checksum = "8C_8Mr22elOAO8Qvxl-B-R-B35M7dpdFdAlph1CeE1L75JdyUnolee-P3KDRFc8T";
};
files = { "CTestCustom.cmake"; };
+3 -3
View File
@@ -16,9 +16,9 @@ package libbpf {
chmod = true;
exec = make {
inPlace = true;
skipConfigure = true;
skipCheck = true;
chdir = false;
configure = nil;
check = nil;
install = "make DESTDIR=/work LIBSUBDIR=lib install";
};
+4 -12
View File
@@ -23,18 +23,10 @@ package libcap {
bin = [ "bash" ];
exec = make {
skipConfigure = true;
inPlace = true;
make = [
"CC=cc",
"all",
];
check = [
"CC=cc",
"test",
];
chdir = false;
configure = nil;
make = [ "CC=cc", "all" ];
check = [ "CC=cc", "test" ];
};
inputs = [
+2 -2
View File
@@ -3,7 +3,7 @@ package libexpat {
website = "https://libexpat.github.io";
anitya = 770;
version# = "2.8.2";
version# = "2.8.3";
source = remoteGitHubRelease {
suffix = "libexpat/libexpat";
tag = "R_"+replace {
@@ -12,7 +12,7 @@ package libexpat {
new = "_";
};
name = "expat-"+version+".tar.bz2";
checksum = "98Pdyj5QtO7QRtNFXTWsCNCixQDx701ZGql2B-JIrTDkw49J5WXXUwnS4AdMlM4L";
checksum = "prHQc14YY3Gp6BfflneNcVyRXM-AxFCqiigxrGL9TT1sGhVODvI_9JNR2xnZlZSj";
compress = bzip2;
};
+3 -3
View File
@@ -3,12 +3,12 @@ package libpsl {
website = "https://rockdaboot.github.io/libpsl";
anitya = 7305;
version# = "0.23.0";
version# = "0.23.2";
source = remoteGitHubRelease {
suffix = "rockdaboot/libpsl";
tag = version;
name = "libpsl-"+version+".tar.gz";
checksum = "7M0i3g6snxXGri0PcE5iYJFVGhZjBq1QxEom45ML0tCyu8b7i-ydvlcIAS2g9zqa";
checksum = "-XIKaQK0QoyzXpwezyvGzDdIBCUTqPyd8jU6axIusrnma-qsYxhLUO1Oycwcelr2";
compress = gzip;
};
@@ -22,7 +22,7 @@ test_disable 'int main(){return 0;}' tests/test-is-public-builtin.c
exec = make {};
inputs = [
pkg-config,
pkgconf,
python,
];
}
+2 -2
View File
@@ -20,7 +20,7 @@ package libtirpc {
exec = make {
generate = "sh -e ./bootstrap";
configure = {
"CFLAGS": `"$(pkg-config --cflags libbsd-overlay) ${CFLAGS:-}"`;
"CFLAGS": `"$(pkgconf --cflags libbsd-overlay) ${CFLAGS:-}"`;
"disable-gssapi";
};
};
@@ -28,7 +28,7 @@ package libtirpc {
inputs = [
automake,
libtool,
pkg-config,
pkgconf,
libbsd,
kernel-headers,
+4 -6
View File
@@ -16,13 +16,11 @@ package libucontext {
enterSource = true;
exec = make {
omitDefaults = true;
skipConfigure = true;
inPlace = true;
defaults = false;
chdir = false;
make = [
"ARCH=" + linuxArch,
];
configure = nil;
make = [ "ARCH=" + linuxArch ];
install = "make prefix=/system DESTDIR=/work install";
};
}
+3 -14
View File
@@ -3,25 +3,14 @@ package libudev-zero {
website = "https://github.com/illiliti/libudev-zero";
anitya = 145201;
version# = "1.0.4";
version# = "1.0.5";
source = remoteGitHub {
suffix = "illiliti/libudev-zero";
tag = version;
checksum = "MHETnJwIdXc62qvE1Ya9xb2Shb53gWxdXzr8FVCFEacXF1rc01yE9guP3eXlKhYw";
checksum = "9WJKgtQH_MxqC1lB-gveIm19gWW99wvcRpEDrc3tQwqjo1SCnbk5k6WDF5Y7DUpe";
};
env = [ "CC=cc" ];
enterSource = true;
writable = true;
exec = make {
inPlace = true;
skipConfigure = true;
skipCheck = true;
make = [ "PREFIX=/system" ];
install = "make DESTDIR=/work PREFIX=/system install";
};
exec = meson {};
inputs = [ kernel-headers ];
}
+2 -2
View File
@@ -15,14 +15,14 @@ package libxslt {
generate = "NOCONFIGURE=1 ./autogen.sh";
// python libxml2 cyclic dependency
skipCheck = true;
check = nil;
};
inputs = [
automake,
libtool,
python,
pkg-config,
pkgconf,
libxml2,
];
+1 -1
View File
@@ -7,7 +7,7 @@ package lit {
exec = pip {
append = [ "llvm", "utils", "lit" ];
// already checked during llvm
skipCheck = true;
check = nil;
};
inputs = [ python-setuptools ];
+2 -2
View File
@@ -56,7 +56,7 @@ message(NOTICE "${LLVM_VERSION_MAJOR}")
"COMPILER_RT_BUILD_PROFILE": "OFF";
"COMPILER_RT_BUILD_XRAY": "OFF";
};
skipTest = true;
test = nil;
postInstall = `
mkdir -p "/work/system/lib/clang/$LLVM_VERSION_MAJOR/lib/"
ln -s \
@@ -119,7 +119,7 @@ package early-runtimes {
"LLVM_ENABLE_ZSTD": "FORCE_ON";
"LLVM_ENABLE_LIBXML2": "OFF";
};
skipTest = true;
test = nil;
};
inputs = [
+4 -14
View File
@@ -17,20 +17,10 @@ package lm_sensors {
bin = [ "perl" ];
populateUsrBin = true;
exec = make {
inPlace = true;
skipConfigure = true;
make = [
"CC=cc",
"ETCDIR=/system/etc",
"PREFIX=/system",
];
check = [
"CC=cc",
"check",
];
chdir = false;
configure = nil;
make = [ "CC=cc", "ETCDIR=/system/etc", "PREFIX=/system" ];
check = [ "CC=cc", "check" ];
install = "make DESTDIR=/work PREFIX=/system install";
};
@@ -0,0 +1,13 @@
diff --git a/src/luaconf.h b/src/luaconf.h
index 96a7780..0bfa66c 100644
--- a/src/luaconf.h
+++ b/src/luaconf.h
@@ -239,7 +239,7 @@
#else /* }{ */
-#define LUA_ROOT "/usr/local/"
+#define LUA_ROOT "/system/"
#define LUA_LDIR LUA_ROOT "share/lua/" LUA_VDIR "/"
#define LUA_CDIR LUA_ROOT "lib/lua/" LUA_VDIR "/"
+23
View File
@@ -0,0 +1,23 @@
# lua.pc -- pkg-config data for Lua
prefix=/system
INSTALL_BIN=${prefix}/bin
INSTALL_INC=${prefix}/include
INSTALL_LIB=${prefix}/lib
INSTALL_MAN=${prefix}/man/man1
INSTALL_LMOD=${prefix}/share/lua/@MAJOR_VER@.@MINOR_VER@
INSTALL_CMOD=${prefix}/lib/lua/@MAJOR_VER@.@MINOR_VER@
# canonical vars
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: Lua
Description: An Extensible Extension Language
Version: @MAJOR_VER@.@MINOR_VER@
Requires:
Libs: -L${libdir} -llua -lm
Cflags: -I${includedir}
# (end of lua@MAJOR_VER@.pc)
+36
View File
@@ -0,0 +1,36 @@
package lua {
description = "the programming language lua";
website = "https://www.lua.org/home.html";
anitya = 1847;
version# = "5.5.1";
source = remoteTar {
url = "https://www.lua.org/ftp/lua-"+version+".tar.gz";
compress = gzip;
checksum = "8KCnY3UBf_oRuVhs7gc2pa18favYMzcMsjgeOOWjbbR9Y6W4qvm4gt1A-iMlXYBw";
};
patches = [ "conf-prefix.patch" ];
files = {
"lua.pc";
};
enterSource = true;
writable = true;
chmod = true;
exec = make {
chdir = false;
configure = nil;
make = [ "CC='clang -fPIC'", "all" ];
check = [ "test" ];
install = `
make INSTALL_TOP=/work/system install
mkdir /work/system/lib/pkgconfig
sed \
-e "s|@MAJOR_VER@|$(cc -P -E -include src/lua.h - <<< LUA_VERSION_MAJOR_N | tail -n 1)|g" \
-e "s|@MINOR_VER@|$(cc -P -E -include src/lua.h - <<< LUA_VERSION_MINOR_N | tail -n 1)|g" \
../lua.pc > /work/system/lib/pkgconfig/lua.pc
`;
};
}
@@ -0,0 +1,67 @@
diff --git a/lib/commands/toolcontext.c b/lib/commands/toolcontext.c
index 60739af..8b3fdf7 100644
--- a/lib/commands/toolcontext.c
+++ b/lib/commands/toolcontext.c
@@ -1661,6 +1661,7 @@ struct cmd_context *create_toolcontext(unsigned is_clvmd,
reset_lvm_errno(1);
/* Set in/out stream buffering before glibc */
+#ifdef __GLIBC__
if (set_buffering
&& !cmd->running_on_valgrind /* Skipping within valgrind execution. */
#ifdef SYS_gettid
@@ -1704,6 +1705,7 @@ struct cmd_context *create_toolcontext(unsigned is_clvmd,
} else if (!set_buffering)
/* Without buffering, must not use stdin/stdout */
init_silent(1);
+#endif
/*
* Environment variable LVM_SYSTEM_DIR overrides this below.
@@ -2038,6 +2040,7 @@ void destroy_toolcontext(struct cmd_context *cmd)
if (cmd->cft_def_hash)
dm_hash_destroy(cmd->cft_def_hash);
+#ifdef __GLIBC__
if (!cmd->running_on_valgrind && cmd->linebuffer) {
int flags;
/* Reset stream buffering to defaults */
@@ -2061,6 +2064,7 @@ void destroy_toolcontext(struct cmd_context *cmd)
free(cmd->linebuffer);
}
+#endif
destroy_config_context(cmd);
diff --git a/tools/lvmcmdline.c b/tools/lvmcmdline.c
index 7209ebd..778c8c0 100644
--- a/tools/lvmcmdline.c
+++ b/tools/lvmcmdline.c
@@ -3378,7 +3378,7 @@ static int _check_standard_fds(void)
int err = is_valid_fd(STDERR_FILENO);
if (!is_valid_fd(STDIN_FILENO) &&
- !(stdin = fopen(_PATH_DEVNULL, "r"))) {
+ !freopen(_PATH_DEVNULL, "r", stdin)) {
if (err)
perror("stdin stream open");
else
@@ -3388,7 +3388,7 @@ static int _check_standard_fds(void)
}
if (!is_valid_fd(STDOUT_FILENO) &&
- !(stdout = fopen(_PATH_DEVNULL, "w"))) {
+ !freopen(_PATH_DEVNULL, "w", stdout)) {
if (err)
perror("stdout stream open");
/* else no stdout */
@@ -3396,7 +3396,7 @@ static int _check_standard_fds(void)
}
if (!is_valid_fd(STDERR_FILENO) &&
- !(stderr = fopen(_PATH_DEVNULL, "w"))) {
+ !freopen(_PATH_DEVNULL, "w", stderr)) {
printf("stderr stream open: %s\n",
strerror(errno));
return 0;
+28
View File
@@ -0,0 +1,28 @@
package lvm2 {
description = "userspace toolset that provide logical volume management facilities";
website = "https://sourceware.org/lvm2";
anitya = 5354;
version# = "2.03.42";
source = remoteTar {
url = "https://mirrors.kernel.org/sourceware/lvm2/releases/LVM2."+version+".tgz";
compress = gzip;
checksum = "qzqVAeW9ttt_H5W0Wfg8twvZjFZH7x_RIzSjqYSooMsRpiXQ7yNdOL1MXY5Zntvi";
};
patches = [
"fix-stdio-usage.patch",
"remove-man.patch",
];
exec = make {
// requires root
check = nil;
};
inputs = [
pkgconf,
libaio,
kernel-headers,
];
}
@@ -0,0 +1,13 @@
diff --git a/Makefile.in b/Makefile.in
index bf011ff4f..86713f2cd 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -18,7 +18,7 @@ top_builddir = @top_builddir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
-SUBDIRS = libdm conf daemons include lib libdaemon man scripts tools
+SUBDIRS = libdm conf daemons include lib libdaemon scripts tools
ifeq ("@UDEV_RULES@", "yes")
SUBDIRS += udev
+1 -1
View File
@@ -5,7 +5,7 @@ package make {
version# = "4.4.1";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/make/make-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/make/make-"+version+".tar.gz";
checksum = "YS_B07ZcAy9PbaK5_vKGj64SrxO2VMpnMKfc9I0Q9IC1rn0RwOH7802pJoj2Mq4a";
compress = gzip;
};
+2 -2
View File
@@ -4,12 +4,12 @@ package mesa {
anitya = 1970;
latest = anityaFallback;
version# = "26.1.5";
version# = "26.2.0";
source = remoteGitLab {
domain = "gitlab.freedesktop.org";
suffix = "mesa/mesa";
ref = "mesa-"+version;
checksum = "6C3NMUvTAOTjJtiHgvj9bFUO9dC1uu_by32ZgLQg5H6sNWzYQcwDpD6V3OFkWYJj";
checksum = "UPnIdpo5wUsE938GXY-YyYDzfF62enRoEzCYRyLLPvzBhBbP4wZ8nDiKsjivcs5v";
};
exec = meson {
@@ -3,12 +3,16 @@ package meson {
website = "https://mesonbuild.com";
anitya = 6472;
version# = "1.11.2";
version# = "1.12.0";
source = remoteGitHub {
suffix = "mesonbuild/meson";
tag = version;
checksum = "9AMilGxTOVqPA2DaGMASyuVs1BeTzgDZ0NH2oSYoRZk846ApvfOBa4cc18XEEK7M";
checksum = "K0hm0h26_6e3-1poYZKwj18IB6bdAtYE-whpROtTCSpVN5GllwSwbXC2xPYcSFAJ";
};
patches = [
"respect-colour.patch",
"test-strip-colour.patch",
];
env = [
"CMAKE_MAKE_PROGRAM=ninja",
@@ -0,0 +1,13 @@
diff --git a/mesonbuild/mlog.py b/mesonbuild/mlog.py
index e1d998a5d..83d6cf9d2 100644
--- a/mesonbuild/mlog.py
+++ b/mesonbuild/mlog.py
@@ -404,6 +404,8 @@ class _Logger:
_colorize_console = os.isatty(output.fileno()) and _windows_ansi()
else:
_colorize_console = os.isatty(output.fileno()) and os.environ.get('TERM', 'dumb') != 'dumb'
+ if os.environ.get('CLICOLOR_FORCE', '') != '':
+ _colorize_console = True
except Exception:
_colorize_console = False
output.colorize_console = _colorize_console # type: ignore
@@ -0,0 +1,13 @@
diff --git a/mesonbuild/mtest.py b/mesonbuild/mtest.py
index 0661fa529..34ab36aa9 100644
--- a/mesonbuild/mtest.py
+++ b/mesonbuild/mtest.py
@@ -1817,6 +1817,8 @@ class TestHarness:
test.exe_wrapper and test.exe_wrapper.found()):
env['MESON_EXE_WRAPPER'] = join_args(test.exe_wrapper.get_command())
env['MESON_TEST_ITERATION'] = str(iteration + 1)
+ env.pop('CLICOLOR_FORCE')
+ env.pop('FORCE_COLOR')
return SingleTestRunner(test, env, name, options)
def process_test_result(self, result: TestRun) -> None:
+1 -1
View File
@@ -21,6 +21,6 @@ package musl-fts {
inputs = [
automake,
libtool,
pkg-config,
pkgconf,
];
}
+1 -1
View File
@@ -21,6 +21,6 @@ package musl-obstack {
inputs = [
automake,
libtool,
pkg-config,
pkgconf,
];
}
+5 -11
View File
@@ -23,14 +23,9 @@ package musl-headers {
];
exec = make {
omitDefaults = true;
skipCheck = true;
make = [
"DESTDIR=/work",
"install-headers",
];
defaults = false;
make = [ "DESTDIR=/work", "install-headers" ];
check = nil;
install = "# headers installed during make";
};
@@ -53,9 +48,8 @@ package musl {
];
exec = make {
omitDefaults = true;
skipCheck = true;
defaults = false;
check = nil;
postInstall = `
mkdir -p /work/system/bin
COMPAT_LINKER_NAME="ld-musl-` + linuxArch + `.so.1"
+2 -2
View File
@@ -5,7 +5,7 @@ package ncurses {
version# = "6.6";
source = remoteTar {
url = "https://ftpmirror.gnu.org/gnu/ncurses/ncurses-"+version+".tar.gz";
url = "https://mirrors.kernel.org/gnu/ncurses/ncurses-"+version+".tar.gz";
checksum = "XvWp4xi6hR_hH8XUoGY26L_pqBSDapJYulhzZqPuR0KNklqypqNc1yNXU-nOjf5w";
compress = gzip;
};
@@ -19,7 +19,7 @@ package ncurses {
};
// "tests" are actual demo programs, not a test suite.
skipCheck = true;
check = nil;
postInstall = `
find /work/system/lib \
@@ -0,0 +1,115 @@
From 7a8f42fb20013a1493d8cae1c43436f85e656f2d Mon Sep 17 00:00:00 2001
From: Zephkeks <zephyrofficialdiscord@gmail.com>
Date: Tue, 13 May 2025 11:04:17 +0200
Subject: [PATCH] CVE-2025-46836: interface.c: Stack-based Buffer Overflow in
get_name()
Coordinated as GHSA-pfwf-h6m3-63wf
---
lib/interface.c | 63 ++++++++++++++++++++++++++++++-------------------
1 file changed, 39 insertions(+), 24 deletions(-)
diff --git a/lib/interface.c b/lib/interface.c
index 71d4163..a054f12 100644
--- a/lib/interface.c
+++ b/lib/interface.c
@@ -211,32 +211,47 @@ static int if_readconf(void)
}
static const char *get_name(char *name, const char *p)
+/* Safe version — guarantees at most IFNAMSIZ1 bytes are copied
+ and the destination buffer is always NULterminated. */
{
- while (isspace(*p))
- p++;
- while (*p) {
- if (isspace(*p))
- break;
- if (*p == ':') { /* could be an alias */
- const char *dot = p++;
- while (*p && isdigit(*p)) p++;
- if (*p == ':') {
- /* Yes it is, backup and copy it. */
- p = dot;
- *name++ = *p++;
- while (*p && isdigit(*p)) {
- *name++ = *p++;
- }
- } else {
- /* No, it isn't */
- p = dot;
- }
- p++;
- break;
- }
- *name++ = *p++;
+ char *dst = name; /* current write ptr */
+ const char *end = name + IFNAMSIZ - 1; /* last byte we may write */
+
+ /* Skip leading whitespace. */
+ while (isspace((unsigned char)*p))
+ ++p;
+
+ /* Copy until whitespace, end of string, or buffer full. */
+ while (*p && !isspace((unsigned char)*p) && dst < end) {
+ if (*p == ':') { /* possible alias veth0:123: */
+ const char *dot = p; /* remember the colon */
+ ++p;
+ while (*p && isdigit((unsigned char)*p))
+ ++p;
+
+ if (*p == ':') { /* confirmed alias */
+ p = dot; /* rewind and copy it all */
+
+ /* copy the colon */
+ if (dst < end)
+ *dst++ = *p++;
+
+ /* copy the digits */
+ while (*p && isdigit((unsigned char)*p) && dst < end)
+ *dst++ = *p++;
+
+ if (*p == ':') /* consume trailing colon */
+ ++p;
+ } else { /* if so treat as normal */
+ p = dot;
+ }
+ break; /* interface name ends here */
+ }
+
+ *dst++ = *p++; /* ordinary character copy */
}
- *name++ = '\0';
+
+ *dst = '\0'; /* always NULterminate */
return p;
}
From ddb0e375fb9ca95bb69335540b85bbdaa2714348 Mon Sep 17 00:00:00 2001
From: Bernd Eckenfels <net-tools@lina.inka.de>
Date: Sat, 17 May 2025 21:53:23 +0200
Subject: [PATCH] Interface statistic regression after 7a8f42fb2
---
lib/interface.c | 5 ++---
1 file changed, 2 insertions(+), 3 deletions(-)
diff --git a/lib/interface.c b/lib/interface.c
index a054f12..ca4adf1 100644
--- a/lib/interface.c
+++ b/lib/interface.c
@@ -239,12 +239,11 @@ static const char *get_name(char *name, const char *p)
/* copy the digits */
while (*p && isdigit((unsigned char)*p) && dst < end)
*dst++ = *p++;
-
- if (*p == ':') /* consume trailing colon */
- ++p;
} else { /* if so treat as normal */
p = dot;
}
+ if (*p == ':') /* consume trailing colon */
+ ++p;
break; /* interface name ends here */
}

Some files were not shown because too many files have changed in this diff Show More