use std::{env, fs, process}; use std::path::PathBuf; use std::process::Command; use std::os::unix::fs::PermissionsExt; use rust_util::util_term::{BOLD, END}; pub fn exit_with_error() -> ! { process::exit(1) } pub fn exit_with_error_message(msg: &str) -> ! { failure!("{}", msg); exit_with_error() } pub fn copy_file_and_apply_executable_permission(from: &PathBuf, to: &PathBuf) { information!("Copy file: {:?} to: {:?}", from, to); let from_content = fs::read(&from).unwrap_or_else(|e| exit_with_error_message(&format!("Read file: {:?}, failed: {}", from, e)) ); fs::write(to, from_content).unwrap_or_else(|e| exit_with_error_message(&format!("Write file: {:?}, failed: {}", to, e)) ); fs::set_permissions(to, PermissionsExt::from_mode(0o755)).unwrap_or_else(|e| exit_with_error_message(&format!("Apply executable permission on file: {:?}, failed: {}", to, e)) ); } pub fn search_git_root_path() -> Option { let mut p = PathBuf::from(".").canonicalize().unwrap_or_else(|e| exit_with_error_message(&format!("Get current dir failed: {}", e)) ); loop { // if is_verbose() { print_info(&format!("Check git path: {:?}", p)); } if p.join(".git").is_dir() { // if is_verbose() { print_ok(&format!("Found git path: {:?}", p)); } return Some(p); } if !p.pop() { return None; } } } pub fn search_git_root_path_e() -> PathBuf { search_git_root_path().unwrap_or_else(|| exit_with_error_message("Git root path not found!")) } pub fn install_commit_msg(force: bool) { let mut commig_msg_exec_file = PathBuf::from(env::args().next().expect("Get args0 failed!")); if !commig_msg_exec_file.exists() { let which_output = Command::new("which").arg(commig_msg_exec_file).output().unwrap_or_else( |e| exit_with_error_message(&format!("Error in get git root path: {}", e)) ); commig_msg_exec_file = PathBuf::from(&String::from_utf8(which_output.stdout).unwrap_or_else( |e| exit_with_error_message(&format!("Error in get git root path: {}", e)) )); } let git_hooks = search_git_root_path_e().join(".git").join("hooks"); if !git_hooks.exists() { exit_with_error_message(&format!("Path {:?} NOT exists!", git_hooks)); } let git_hooks_commit_msg = git_hooks.join("commit-msg"); if git_hooks_commit_msg.exists() && !force { exit_with_error_message(&format!("File {:?} exists! or try {}forceinstall{}.", git_hooks_commit_msg, BOLD, END)); } copy_file_and_apply_executable_permission(&commig_msg_exec_file, &git_hooks_commit_msg); success!("Install commit-msg to repo successed!"); }