use std::{
fs,
io::{self, Write as _},
os::unix::fs::PermissionsExt as _,
path::Path,
process::{Command, Stdio},
};
use crate::child::OwnedChild;
pub fn write_executable_script(path: &Path, contents: impl AsRef<[u8]>) -> io::Result<()> {
let mut writer = OwnedChild::spawn(
Command::new("/bin/sh")
.args(["-c", "cat > \"$1\"", "write-test-script"])
.arg(path)
.stdin(Stdio::piped()),
)?;
let written = writer
.take_stdin()
.ok_or_else(|| io::Error::other("script writer stdin missing"))?
.write_all(contents.as_ref());
let status = writer.wait();
written?;
let status = status?;
if !status.success() {
return Err(io::Error::other(format!("script writer failed: {status}")));
}
let mut permissions = fs::metadata(path)?.permissions();
permissions.set_mode(0o755);
fs::set_permissions(path, permissions)
}
#[cfg(test)]
mod tests;