| #[cfg(windows)] |
| use std::fs::OpenOptions; |
| #[cfg(windows)] |
| use std::io; |
| |
| #[cfg(windows)] |
| use std::env; |
| #[cfg(windows)] |
| use std::fs::{copy, File}; |
| #[cfg(windows)] |
| use std::path::Path; |
| |
| #[cfg(windows)] |
| use http_req; |
| #[cfg(windows)] |
| use tempfile; |
| #[cfg(windows)] |
| use zip; |
| |
| #[cfg(windows)] |
| const WINPTY_PACKAGE_URL: &str = |
| "https://github.com/rprichard/winpty/releases/download/0.4.3/winpty-0.4.3-msvc2015.zip"; |
| |
| fn main() { |
| #[cfg(windows)] |
| { |
| // Path is relative to target/{profile}/build/alacritty-HASH/out |
| let file = Path::new(&env::var("OUT_DIR").unwrap()).join("../../../winpty-agent.exe"); |
| if !file.exists() { |
| aquire_winpty_agent(&file); |
| } |
| |
| // The working directory for `cargo test` is in the deps folder, not the debug/release root |
| copy(&file, file.parent().unwrap().join("deps/winpty-agent.exe")).unwrap(); |
| } |
| } |
| |
| #[cfg(windows)] |
| fn aquire_winpty_agent(out_path: &Path) { |
| let tmp_dir = tempfile::Builder::new().prefix("alacritty_build").tempdir().unwrap(); |
| |
| let mut file = OpenOptions::new() |
| .read(true) |
| .write(true) |
| .create(true) |
| .open(tmp_dir.path().join("winpty_package.zip")) |
| .unwrap(); |
| let mut redirects = 0; |
| let mut url = WINPTY_PACKAGE_URL.to_string(); |
| loop { |
| let res = http_req::request::get(url.clone(), &mut file).unwrap(); |
| if res.status_code().is_redirect() { |
| redirects += 1; |
| url = res.headers().get("Location").unwrap().to_string(); |
| if redirects > 5 { |
| panic!("Too many redirects"); |
| } |
| } else { |
| break; |
| } |
| } |
| |
| let mut archive = zip::ZipArchive::new(file).unwrap(); |
| |
| let target = match env::var("TARGET").unwrap().split("-").next().unwrap() { |
| "x86_64" => "x64", |
| "i386" => "ia32", |
| _ => panic!("architecture has no winpty binary"), |
| }; |
| |
| let mut winpty_agent = archive.by_name(&format!("{}/bin/winpty-agent.exe", target)).unwrap(); |
| |
| io::copy(&mut winpty_agent, &mut File::create(out_path).unwrap()).unwrap(); |
| } |