From 3e17d1f3a57aa3aec4a28f202a616cd52ba37f05 Mon Sep 17 00:00:00 2001 From: "Hatter Jiang@Pixelbook" Date: Sat, 25 Jul 2020 21:36:15 +0800 Subject: [PATCH] feat: add mod git --- src/cmd_default.rs | 2 ++ src/git.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 1 + 3 files changed, 59 insertions(+) create mode 100644 src/git.rs diff --git a/src/cmd_default.rs b/src/cmd_default.rs index 1055c9d..6b23a32 100644 --- a/src/cmd_default.rs +++ b/src/cmd_default.rs @@ -10,6 +10,8 @@ impl CommandDefault { } pub fn run(_arg_matches: &ArgMatches) -> CommandError { + println!("Git status: {}", crate::git::check_git_status()); + println!("Git hash : {}", crate::git::get_git_hash().unwrap_or_else(|| "".to_owned())); error!("Default command is not implemented!"); Ok(()) } diff --git a/src/git.rs b/src/git.rs new file mode 100644 index 0000000..9aa34a5 --- /dev/null +++ b/src/git.rs @@ -0,0 +1,56 @@ +use std::process::Command; + +pub fn check_git_status() -> bool { + match Command::new("git").env("LANG", "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; + }, + }, + } + match Command::new("git").env("LANG", "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", + "Yourbranch 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 { + match Command::new("git").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), + } + } +} \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index d2567eb..a77c3f4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -6,6 +6,7 @@ use clap::{ App, ArgMatches }; mod cmd; mod cmd_default; mod cmd_new; +mod git; use cmd::{ Command, CommandError }; use cmd_default::CommandDefault;