use std::path::PathBuf; use std::process::Command; trait RunCommandAsEnUs { fn en_us(&mut self) -> &mut Self; } impl RunCommandAsEnUs for Command { fn en_us(&mut self) -> &mut Self { self.env("LANG", "en_US") } } pub fn get_git_base_path() -> Option { match PathBuf::from(".").canonicalize() { Err(e) => { warn!("Get current path failed: {}", e); None }, Ok(mut path) => loop { if path.join(".git").is_dir() { debug!("Found git base dir: {:?}", path); return Some(path); } if !path.pop() { return None; } } } } pub fn check_git_status() -> bool { trace!("Run: git fetch --dry-run"); match Command::new("git").en_us().args(&["fetch", "--dry-run"]).output() { Err(e) => { warn!("Error in run git fetch --dry-run: {}", e); return false; }, Ok(o) => match String::from_utf8(o.stdout) { Err(e) => { warn!("Error in get utf8 git fetch --dry-run stdout: {}", e); return false; }, Ok(stdout) => if !stdout.trim().is_empty() { warn!("Std out is not empty git fetch --dry-run: {}", stdout); return false; }, }, } trace!("Run: git status"); match Command::new("git").en_us().args(&["status"]).output() { Err(e) => { warn!("Error in run git status: {}", e); return false; }, Ok(o) => match String::from_utf8(o.stdout) { Err(e) => { warn!("Error in get utf8 git status: {}", e); return false; }, Ok(stdout) => if [ "Changes not staged for commit", "Your branch is ahead of", "Untracked files" ].iter().any(|s| stdout.contains(s)) { warn!("Std out check failed git status: {}", stdout); return false; } } } true } pub fn get_git_hash() -> Option { trace!("Run: git rev-parse HEAD"); match Command::new("git").en_us().args(&["rev-parse", "HEAD"]).output(){ Err(e) => { warn!("Error in run git rev-parse HEAD: {}", e); None }, Ok(o) => match String::from_utf8(o.stdout) { Err(e) => { warn!("Error in get utf8 git rev-parse HEAD: {}", e); None }, Ok(stdout) => Some(stdout.trim().into()), } } }