import _vfs
import
shell:
- Vfs
_container.common:
- runtime_dir
proc.run:
- toolbox
strand:
- pipeline
fs
def run_command
:name = nil
cd: cd_override = nil
env: env_override = nil
...args
do
toolbox run
if (name != nil)
--container $name
-- env -C
if (cd_override != nil)
$cd_override
else
$cd()
for k v = (env_override || {})
if (v == nil)
-u (str k)
else
$(str k)=$v
...args
def run_agent
thunk
:name = nil
cd: cd_override = nil
env: env_override = nil
do
let socket = "$(runtime_dir())/toolbox-vfs-$name"
let agent = _vfs.bin()
let input = strand.input()
pipeline
do run_command
- $agent
- $socket
:name
cd: $cd_override
env: (env_override || {})
do
strand.next()
let agent = Vfs.unix_socket $socket
try
return strand.redirect input: $input do agent $thunk
finally
fs.remove $socket
pub def run
cmd
:name = nil
cd: cd_override = nil
env: env_override = nil
...args
do
run_command
:name
cd: $cd_override
env: $env_override
$cmd ...args.pos_only()
# Run a callable inside a toolbox container.
#
# The block sees the toolbox filesystem and process environment.
pub def with
thunk
:name = nil
cd: cd_override = nil
env: env_override = nil
do
run_agent
$thunk
:name
cd: $cd_override
env: $env_override