plan/plan-server/build.rs

130 lines
4.3 KiB
Rust

#![feature(unix_send_signal)]
use core::time::Duration;
use std::{
io::Read,
os::unix::process::ChildExt,
path::Path,
process::{ChildStdout, Command, ExitStatus, Stdio},
thread::sleep,
time::Instant,
};
fn main() {
// add_from_dir("../");
return;
let server_path = std::env::current_dir().unwrap_or_else(|_| {
std::env::var("CARGO_MANIFEST_DIR")
.expect("CARGO_MANIFEST_DIR")
.into()
});
unsafe {
std::env::set_var(
"CARGO_TARGET_DIR",
server_path
.parent()
.unwrap()
.join("target-server")
.to_str()
.unwrap(),
)
};
let web_path = server_path.parent().expect("no parent").join("calendar");
add_from_dir(&web_path);
build_calendar(&web_path);
}
fn build_calendar(web_path: &Path) {
let mut cmd = Command::new("trunk");
let target_dir = web_path.parent().unwrap().join("target-calendar");
cmd.current_dir(web_path)
// .env_clear()
// .env("PATH", std::env::var("PATH").unwrap_or_default())
.arg("build")
.arg("--release")
.arg("--color")
.arg("never")
.arg("--verbose")
.env("CARGO_TARGET_DIR", target_dir.to_str().unwrap())
.stdout(Stdio::piped())
.stderr(Stdio::piped())
.stdin(Stdio::null());
let mut child = cmd.spawn().unwrap();
let start = Instant::now();
let status = loop {
if let Some(status) = child.try_wait().unwrap() {
break Some(status);
}
if (Instant::now() - start) > Duration::from_secs(30) {
eprintln!("build_calendar timed out");
if let Err(err) = child.send_signal(9) {
panic!("killing build_calendar build: {err}");
}
// panic!("a");
break None;
}
sleep(Duration::from_millis(100));
};
let status_code = status.and_then(|status| status.code()).unwrap_or(!0u8 as _);
if status_code != 0 {
eprintln!("trunk build status code: {status_code}");
// // if let Some(mut stdout) = child.stdout.take() {
// // // let mut buf = vec![];
// // let mut buf = [0u8; 1];
// // let mut cnt = 0usize;
// // while let Ok(len) = stdout.read(&mut buf) {
// // if cnt == 2269 {
// // panic!("A");
// // }
// // if len == 0 {
// // break;
// // } else {
// // eprint!("{}", buf[0] as char);
// // cnt += 1;
// // }
// // }
// // // panic!("a");
// // // stdout.read_to_end(&mut buf).unwrap();
// // // eprintln!("trunk build stdout: {}", String::from_utf8(buf).unwrap());
// // }
// if let Some(mut stderr) = child.stderr.take() {
// // let mut buf = vec![];
// // stderr.read_to_end(&mut buf).unwrap();
// let mut buf = [0u8; 1];
// let mut cnt = 0usize;
// while let Ok(len) = stderr.read(&mut buf) {
// if len == 0 {
// break;
// } else {
// eprint!("{}", buf[0] as char);
// cnt += 1;
// }
// if cnt == 50 {
// panic!("A");
// }
// }
// panic!("a");
// // eprintln!("trunk build stderr: {}", String::from_utf8(buf).unwrap());
// }
eprintln!("calendar build failed");
}
}
#[allow(unused)]
fn add_from_dir(dir: &Path) {
for item in std::fs::read_dir(dir)
.unwrap_or_else(|err| panic!("could not read calendar source directory ({dir:?}): {err}"))
{
let item = item.unwrap_or_else(|err| panic!("item in {dir:?} source directory: {err}"));
if let Some(file_name) = item.file_name().to_str()
&& file_name.ends_with(".rs")
{
let path = dir.join(file_name);
println!("cargo:rerun-if-changed={}", path.to_str().unwrap());
} else if item.file_type().map(|t| t.is_dir()).unwrap_or_default() {
add_from_dir(&item.path());
}
}
}