def require [ok: bool, message: string] { if not $ok { error make {msg: $message} } }
def sha [p: path] { open --raw $p | into binary | hash sha256 }
def sources [root: path] {
[[$root honeycrisp] [($root ๏ฟฟ path join ../strata ๏ฟฟ path expand) strata]] | each {|pair|
^git -C $pair.0 ls-files --cached --others --exclude-standard | lines | uniq | sort
| where {|p| (not ($p | str starts-with audit/)) and
(($p | str ends-with '.rs') or ($p | str starts-with '.cargo/') or
(($p | path basename) in [Cargo.toml Cargo.lock rust-toolchain.toml])) }
| each {|p| {path: $'($pair.1)/($p)', sha256: (sha ($pair.0 | path join $p))}}
} | flatten
}
def main [repo: path, cache: path, name: string, argv_json: string] {
let root = ($repo | path expand)
let cache = ($cache | path expand)
cd $root
let out = ($root | path join audit/2026-10-17-native-image-planes)
require (not ($out | path join $'($name).json' | path exists)) 'retain prior receipt'
let rustup = ($env.HOME | path join .cargo/bin/rustup)
let toolchain = '1.95.0'
let rustc = (^$rustup which --toolchain $toolchain rustc | str trim)
let rustdoc = (^$rustup which --toolchain $toolchain rustdoc | str trim)
let cargo = (^$rustup which --toolchain $toolchain cargo | str trim)
let command = ([$rustup run $toolchain] | append ($argv_json | from json))
let run_env = {HOME: $env.HOME, CARGO_HOME: ($env.HOME | path join .cargo),
RUSTUP_HOME: ($env.HOME | path join .rustup),
PATH: ([($rustc | path dirname) ($rustup | path dirname) /opt/homebrew/bin /usr/bin /bin /usr/sbin /sbin] | str join ':'),
RUSTC: $rustc, RUSTDOC: $rustdoc, RUSTFLAGS: '-Dwarnings', RUSTDOCFLAGS: '-Dwarnings',
CARGO_BUILD_JOBS: '2', CARGO_INCREMENTAL: '0', CARGO_NET_OFFLINE: 'true',
CARGO_TARGET_DIR: ($cache | path join target), LANG: C, LC_ALL: C, TZ: UTC}
let inherited = ([RUSTC RUSTDOC RUSTC_WRAPPER RUSTC_WORKSPACE_WRAPPER RUSTFLAGS RUSTDOCFLAGS CARGO_ENCODED_RUSTFLAGS RUSTUP_TOOLCHAIN]
| each {|k| {name: $k, value: ($env | get -o $k)}})
let env_args = ($run_env | transpose key value | each {|r| $'($r.key)=($r.value)'})
let tools = ([$rustup $cargo $rustc $rustdoc] | append ([cargo-clippy clippy-driver cargo-fmt rustfmt] | each {|n|
^$rustup which --toolchain $toolchain $n | str trim
}) | each {|p| {path: $p, sha256: (sha $p)}})
let before = (sources $root)
let digest = ($before | to json --raw | hash sha256)
mkdir ($out | path join inputs)
let manifest = $'inputs/($digest).json'
if not ($out | path join $manifest | path exists) { $before | to json --raw | save ($out | path join $manifest) }
let heads = ([$root ($root | path join ../strata | path expand)] | each {|p| ^git -C $p rev-parse HEAD | str trim})
let runner = (sha ($out | path join run.nu))
let started = (date now | format date '%+')
let result = (do { ^/usr/bin/env -i ...$env_args ...$command } | complete)
let after = (sources $root)
let heads_after = ([$root ($root | path join ../strata | path expand)] | each {|p| ^git -C $p rev-parse HEAD | str trim})
$result.stdout | save ($out | path join $'($name).stdout')
$result.stderr | save ($out | path join $'($name).stderr')
{command: $command, environment: $run_env, inherited_tool_overrides: $inherited,
heads_before: $heads, heads_after: $heads_after, cwd: $root,
source_manifest: $manifest, source_sha256: $digest, sources_equal: ($before == $after),
runner_sha256: $runner, tools: $tools,
versions: ([$cargo $rustc $rustdoc] | each {|p| {path: $p, result: (do { ^/usr/bin/env -i ...$env_args $p -Vv } | complete)}}),
started: $started, finished: (date now | format date '%+'), exit_code: $result.exit_code,
stdout_sha256: ($result.stdout | hash sha256), stderr_sha256: ($result.stderr | hash sha256)
} | to json --raw | save ($out | path join $'($name).json')
require ($before == $after and $heads == $heads_after) 'source or HEAD changed during command'
require ((sha ($out | path join run.nu)) == $runner) 'runner changed during command'
print {name: $name, exit_code: $result.exit_code, source_sha256: $digest}
if $result.exit_code != 0 { print --stderr $result.stderr; exit $result.exit_code }
}