5 use std::process::{self, Command, Stdio};
7 pub(crate) fn cargo_command(
8 cargo: impl AsRef<Path>,
13 let mut cmd = Command::new(cargo.as_ref());
15 .arg("--manifest-path")
16 .arg(source_dir.join("Cargo.toml"))
18 .arg(source_dir.join("target"));
20 if let Some(triple) = triple {
21 cmd.arg("--target").arg(triple);
27 pub(crate) fn hyperfine_command(
30 prepare: Option<Command>,
34 let mut bench = Command::new("hyperfine");
37 bench.arg("--warmup").arg(warmup.to_string());
41 bench.arg("--runs").arg(runs.to_string());
44 if let Some(prepare) = prepare {
45 bench.arg("--prepare").arg(format!("{:?}", prepare));
48 bench.arg(format!("{:?}", a)).arg(format!("{:?}", b));
54 pub(crate) fn try_hard_link(src: impl AsRef<Path>, dst: impl AsRef<Path>) {
55 let src = src.as_ref();
56 let dst = dst.as_ref();
57 if let Err(_) = fs::hard_link(src, dst) {
58 fs::copy(src, dst).unwrap(); // Fallback to copying if hardlinking failed
63 pub(crate) fn spawn_and_wait(mut cmd: Command) {
64 if !cmd.spawn().unwrap().wait().unwrap().success() {
70 pub(crate) fn spawn_and_wait_with_input(mut cmd: Command, input: String) -> String {
72 .stdin(Stdio::piped())
73 .stdout(Stdio::piped())
75 .expect("Failed to spawn child process");
77 let mut stdin = child.stdin.take().expect("Failed to open stdin");
78 std::thread::spawn(move || {
79 stdin.write_all(input.as_bytes()).expect("Failed to write to stdin");
82 let output = child.wait_with_output().expect("Failed to read stdout");
83 if !output.status.success() {
87 String::from_utf8(output.stdout).unwrap()
90 pub(crate) fn copy_dir_recursively(from: &Path, to: &Path) {
91 for entry in fs::read_dir(from).unwrap() {
92 let entry = entry.unwrap();
93 let filename = entry.file_name();
94 if filename == "." || filename == ".." {
97 if entry.metadata().unwrap().is_dir() {
98 fs::create_dir(to.join(&filename)).unwrap();
99 copy_dir_recursively(&from.join(&filename), &to.join(&filename));
101 fs::copy(from.join(&filename), to.join(&filename)).unwrap();
106 pub(crate) fn is_ci() -> bool {
107 env::var("CI").as_deref() == Ok("true")