Throwaway prototypes for Sausage v3. Plan and decisions: ~/research/sausage-v3/PLAN.md. Results and evidence: the spike READMEs.
43 lines
2.0 KiB
Nu
43 lines
2.0 KiB
Nu
#!/usr/bin/env nu
|
|
# Compare one shell script with bash. Keep both streams and exact exit codes.
|
|
def main [host: path, shell: path] {
|
|
let base = '/tmp/s2-shell/comparison'
|
|
mkdir $base
|
|
for name in [native guest] {
|
|
let root = ($base | path join $name)
|
|
mkdir ($root | path join work sub) ($root | path join other) ($root | path join bin) ($root | path join dev)
|
|
"alpha\n" | save -f ($root | path join work f)
|
|
"one\ntwo\n" | save -f ($root | path join work file)
|
|
'' | save -f ($root | path join work a.txt)
|
|
'' | save -f ($root | path join work b.txt)
|
|
"before\n" | save -f ($root | path join work log)
|
|
'' | save -f ($root | path join dev 'null')
|
|
for tool in [cat tr ls wc yes head] {
|
|
cp --force ($env.FILE_PWD | path join userland target wasm32-wasip2 release s2-userland.wasm) ($root | path join bin $tool)
|
|
}
|
|
}
|
|
let script = (open --raw ($env.FILE_PWD | path join corpus.sh))
|
|
let native_root = ($base | path join native)
|
|
let native = (do { cd $native_root; ^bash --noprofile --norc -c $script } | complete)
|
|
let stdout = ($native.stdout | str replace --all $native_root '')
|
|
$stdout | save -f ($base | path join native.stdout)
|
|
$native.stderr | save -f ($base | path join native.stderr)
|
|
print $'native exit=($native.exit_code)'
|
|
let start = (date now)
|
|
let guest = (^$host ($base | path join guest) $shell -c $script | complete)
|
|
print $'guest elapsed=((date now) - $start)'
|
|
$guest.stdout | save -f ($base | path join guest.stdout)
|
|
$guest.stderr | save -f ($base | path join guest.stderr)
|
|
print $'guest exit=($guest.exit_code)'
|
|
print $'equal stdout=($stdout == $guest.stdout)'
|
|
print '--- native stdout ---'
|
|
print $stdout
|
|
print '--- guest stdout ---'
|
|
print $guest.stdout
|
|
print '--- guest stderr ---'
|
|
print $guest.stderr
|
|
if $native.exit_code != $guest.exit_code or $stdout != $guest.stdout {
|
|
error make {msg: 'shell comparison failed'}
|
|
}
|
|
}
|