use super::git_passthrough::git_passthrough;
use crate::{ai, git::GitRepo};
use console::style;
use std::fs;
use std::process::Command;
pub fn handle_commit(args: &[String]) -> Result<(), Box<dyn std::error::Error>> {
let has_message_flag = args.iter().any(|arg| {
arg == "-m"
|| arg == "--message"
|| arg == "-F"
|| arg == "--file"
|| arg == "-C"
|| arg == "--reuse-message"
|| arg == "-c"
|| arg == "--reedit-message"
|| arg == "--fixup"
|| arg == "--squash"
|| arg.starts_with("-m=")
|| arg.starts_with("--message=")
});
if has_message_flag || !args.is_empty() {
return passthrough_commit(args);
}
ai_commit()
}
fn passthrough_commit(args: &[String]) -> Result<(), Box<dyn std::error::Error>> {
git_passthrough("commit", args)
}
fn ai_commit() -> Result<(), Box<dyn std::error::Error>> {
let git_repo = GitRepo::open(".")?;
if !git_repo.has_staged_changes()? {
eprintln!(
"{} No changes staged for commit.",
style("⚠").yellow().bold()
);
return Ok(());
}
let diff_text = git_repo.diff_staged()?;
let generated_message = ai::generate_commit_message(&diff_text)?;
if let Some(message) = generated_message {
let temp_file = "/tmp/gitx_commit_template";
let template_content = format!(
"{message}\n\n# Generated by gitx with Claude AI\n# Edit the message above and save to commit"
);
fs::write(temp_file, &template_content)?;
let mut cmd = Command::new("git");
cmd.arg("commit");
cmd.arg("-t");
cmd.arg(temp_file);
cmd.arg("--allow-empty-message");
let status = cmd.status()?;
let _ = fs::remove_file(temp_file);
if !status.success() {
std::process::exit(status.code().unwrap_or(1));
}
} else {
let status = Command::new("git").arg("commit").status()?;
if !status.success() {
std::process::exit(status.code().unwrap_or(1));
}
}
Ok(())
}