emulate -L zsh
set -e
realScriptFn=$(readlink -f $0)
topDir=$realScriptFn:h
SELINUX=""
if (($+commands[selinuxenabled])) && selinuxenabled; then
SELINUX=":z"
fi
zparseopts -D -K x=o_xtrace n=o_dryrun \
-reuse-target-dir=o_reuse_target_dir \
-image:=o_image -target:=o_targetDir
if (($#o_xtrace)); then set -x; fi
function x {
print -r -- '#' ${(@q-)argv}
if (($#o_dryrun)); then return; fi
"$@"
}
if (($#o_image)); then
imageName=${o_image[2]#=}
else
imageName=perl
fi
volOpts=()
reuse_target_dir=0
if (($#o_targetDir)); then
reuse_target_dir=0
volOpts+=(-v ${o_targetDir[2]#=}:/app/target${SELINUX})
elif ((! $#o_reuse_target_dir)); then
reuse_target_dir=0
dn=$topDir.target.${imageName:gs/:/__/}
mkdir -vp $dn
volOpts+=(-v $dn:/app/target${SELINUX})
else
reuse_target_dir=1
fi
docker=(docker)
if [[ -r /etc/os-release ]]; then
source /etc/os-release
if [[ $ID == "fedora" ]] && ((VERSION_ID >= 31)); then
docker=(podman --cgroup-manager=systemd)
fi
fi
cmdList=(
'apt update'
'apt install -y llvm-dev libclang-dev clang'
'curl --proto "=https" --tlsv1.2 -sSf https://sh.rustup.rs > rustup.sh'
'sh rustup.sh -y'
'source $HOME/.cargo/env'
'rustup component add rustfmt'
'cd /app'
)
if (($reuse_target_dir)); then
cmdList+=('cargo clean')
fi
cmdList+=(
'cargo build -vv'
)
if ((ARGC)); then
cmdList+=("${(j/ /)${(@q-)argv}}")
else
cmdList+=("cargo test --all")
fi
x exec $docker run --rm -it \
-v $topDir:/app${SELINUX} \
$volOpts \
$imageName /bin/bash -c "${(j/&&/)cmdList}"