feat: add util
This commit is contained in:
70
src/util.rs
Normal file
70
src/util.rs
Normal file
@@ -0,0 +1,70 @@
|
||||
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<PathBuf> {
|
||||
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!");
|
||||
}
|
||||
Reference in New Issue
Block a user