1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
use std::io::{Read, Write}; use std::path::Path; use std::fs::OpenOptions; pub fn rust_version_info_file<T: AsRef<Path>>(dst: T) { let dst_path: &Path = dst.as_ref(); let old_s = read_file(dst_path); let curr_s = format!("{}\n{}\n", rustc_version_info(), tree_version_info(),); if old_s != curr_s { let mut fo = match OpenOptions::new() .create(true) .write(true) .truncate(true) .open(dst_path) { Ok(fo) => fo, Err(_) => return, }; let _ = fo.write_fmt(format_args!("{}", curr_s)); let _ = fo.flush(); } } fn read_file(path: &Path) -> String { match OpenOptions::new() .create(false) .read(true) .open(path) { Ok(mut fi) => { let mut s = String::new(); let _ = fi.read_to_string(&mut s); s } Err(_) => String::new(), } } fn rustc_version_info() -> String { let cmd = std::env::var_os("RUSTC").unwrap_or_else(|| std::ffi::OsString::from("rustc")); let out = std::process::Command::new(cmd) .arg("--version") .output() .unwrap(); let v = out.stdout; let v_len = v.len(); let v = if v_len > 0 && v[v_len - 1] == b'\n' { &v[0..v_len - 1] } else { &v[0..v_len] }; String::from_utf8(v.to_vec()).unwrap() } fn tree_version_info() -> String { let cmd = "cargo"; let out = std::process::Command::new(cmd) .arg("tree") .output() .unwrap(); let v = out.stdout; let v_len = v.len(); let v = if v_len > 0 && v[v_len - 1] == b'\n' { &v[0..v_len - 1] } else { &v[0..v_len] }; String::from_utf8(v.to_vec()).unwrap() }