46 lines
1.1 KiB
Rust
46 lines
1.1 KiB
Rust
//! The `install` subcommand.
|
|
use std::{
|
|
fs::{set_permissions, write, Permissions},
|
|
os::unix::fs::PermissionsExt,
|
|
path::PathBuf,
|
|
};
|
|
|
|
use {
|
|
color_eyre::{eyre::eyre, Result},
|
|
hooked_config::Config,
|
|
tera::{Context, Tera},
|
|
};
|
|
|
|
use crate::{cli::InstallArgs, DEFAULT_TEMPLATE, HOOK_TYPES};
|
|
|
|
/// The `install` subcommand.
|
|
pub fn hooked_install(config: Config, args: InstallArgs) -> Result<()> {
|
|
let git_hooks_dir = PathBuf::from(".git/hooks/");
|
|
if !git_hooks_dir.exists() {
|
|
return Err(eyre!("The \".git/hooks/\" directory does not exist"));
|
|
}
|
|
|
|
for hook_type in HOOK_TYPES {
|
|
let mut context = Context::new();
|
|
context.insert("config_path", &config.general.config);
|
|
context.insert("hook_type", hook_type);
|
|
|
|
let hook_path = git_hooks_dir.join(hook_type);
|
|
if hook_path.exists() && !args.overwrite {
|
|
println!(
|
|
"{:?} exists, use --overwrite to replace the existing file",
|
|
hook_path
|
|
);
|
|
continue;
|
|
}
|
|
|
|
write(
|
|
&hook_path,
|
|
Tera::one_off(DEFAULT_TEMPLATE, &context, false)?,
|
|
)?;
|
|
set_permissions(hook_path, Permissions::from_mode(0o775))?;
|
|
}
|
|
|
|
Ok(())
|
|
}
|