blob: d57492dff4fc39c7e2bf3bcce513b5ee1ef873c2 [file] [log] [blame]
use std::ffi::OsString;
use std::path::PathBuf;
use std::process::{exit, Command};
const WRAPPED_TOOL_NAME: &str = env!("WRAPPED_TOOL_NAME");
const WRAPPED_TOOL_TARGET: &str = env!("WRAPPED_TOOL_TARGET");
#[cfg(not(target_os = "windows"))]
const PATH_SEPARATOR: &str = ":";
#[cfg(target_os = "windows")]
const PATH_SEPARATOR: &str = ";";
fn main() {
let runfiles = runfiles::Runfiles::create().unwrap();
let wrapped_tool_path = runfiles::rlocation!(runfiles, WRAPPED_TOOL_TARGET).unwrap();
if !wrapped_tool_path.exists() {
panic!(
"{WRAPPED_TOOL_NAME} does not exist at: {}",
wrapped_tool_path.display()
);
}
let tool_directory = wrapped_tool_path
.parent()
.expect("parent directory of tool binary");
let old_path = std::env::var_os("PATH").unwrap_or_default();
let mut new_path = OsString::from(tool_directory);
new_path.push(PATH_SEPARATOR);
new_path.push(&old_path);
let working_directory = std::env::var_os("BUILD_WORKING_DIRECTORY")
.map(PathBuf::from)
.unwrap_or_else(|| std::env::current_dir().expect("Failed to get working directory"));
let status = Command::new(wrapped_tool_path)
.current_dir(&working_directory)
.args(std::env::args_os().skip(1))
.env("PATH", new_path)
.status()
.unwrap_or_else(|e| panic!("Failed to run {WRAPPED_TOOL_NAME} {:#}", e));
if let Some(exit_code) = status.code() {
exit(exit_code);
}
exit_for_signal(&status);
panic!("Child rustfmt process didn't exit or get a signal - don't know how to handle it");
}
#[cfg(target_family = "unix")]
fn exit_for_signal(status: &std::process::ExitStatus) {
use std::os::unix::process::ExitStatusExt;
if let Some(signal) = status.signal() {
exit(signal);
}
}
#[cfg(not(target_family = "unix"))]
#[allow(unused)]
fn exit_for_signal(status: &std::process::ExitStatus) {}