use anyhow::Result;
use std::sync::Arc;
use crate::git::{CommitResult, GitRepo};
use crate::log_debug;
pub struct GitCommitService {
repo: Arc<GitRepo>,
verify: bool,
}
impl GitCommitService {
#[must_use]
pub fn new(repo: Arc<GitRepo>, _use_gitmoji: bool, verify: bool) -> Self {
Self { repo, verify }
}
#[must_use]
pub fn from_repo(repo: GitRepo, use_gitmoji: bool, verify: bool) -> Self {
Self::new(Arc::new(repo), use_gitmoji, verify)
}
#[must_use]
pub fn is_remote(&self) -> bool {
self.repo.is_remote()
}
pub fn pre_commit(&self) -> Result<()> {
if self.is_remote() {
log_debug!("Skipping pre-commit hook for remote repository");
return Ok(());
}
if self.verify {
self.repo.execute_hook("pre-commit")
} else {
Ok(())
}
}
pub fn perform_commit(&self, message: &str) -> Result<CommitResult> {
if self.is_remote() {
return Err(anyhow::anyhow!("Cannot commit to a remote repository"));
}
log_debug!("Performing commit with message: {}", message);
if !self.verify {
log_debug!("Skipping pre-commit hook (verify=false)");
return self.repo.commit(message);
}
log_debug!("Executing pre-commit hook");
if let Err(e) = self.repo.execute_hook("pre-commit") {
log_debug!("Pre-commit hook failed: {}", e);
return Err(e);
}
log_debug!("Pre-commit hook executed successfully");
match self.repo.commit(message) {
Ok(result) => {
log_debug!("Executing post-commit hook");
if let Err(e) = self.repo.execute_hook("post-commit") {
log_debug!("Post-commit hook failed: {}", e);
}
log_debug!("Commit performed successfully");
Ok(result)
}
Err(e) => {
log_debug!("Commit failed: {}", e);
Err(e)
}
}
}
pub fn perform_amend(&self, message: &str) -> Result<CommitResult> {
if self.is_remote() {
return Err(anyhow::anyhow!(
"Cannot amend a commit in a remote repository"
));
}
log_debug!("Performing amend with message: {}", message);
if !self.verify {
log_debug!("Skipping pre-commit hook (verify=false)");
return self.repo.amend_commit(message);
}
log_debug!("Executing pre-commit hook");
if let Err(e) = self.repo.execute_hook("pre-commit") {
log_debug!("Pre-commit hook failed: {}", e);
return Err(e);
}
log_debug!("Pre-commit hook executed successfully");
match self.repo.amend_commit(message) {
Ok(result) => {
log_debug!("Executing post-commit hook");
if let Err(e) = self.repo.execute_hook("post-commit") {
log_debug!("Post-commit hook failed: {}", e);
}
log_debug!("Amend performed successfully");
Ok(result)
}
Err(e) => {
log_debug!("Amend failed: {}", e);
Err(e)
}
}
}
pub fn get_head_commit_message(&self) -> Result<String> {
self.repo.get_head_commit_message()
}
#[must_use]
pub fn repo(&self) -> &GitRepo {
&self.repo
}
}
#[cfg(test)]
mod tests {
#[test]
fn test_git_commit_service_construction() {
}
}