Initial commit: git-issue-commit CLI tool
This commit is contained in:
88
src/cli/commands.rs
Normal file
88
src/cli/commands.rs
Normal file
@@ -0,0 +1,88 @@
|
||||
use anyhow::Result;
|
||||
use crate::cli::Args;
|
||||
use crate::fetcher::fetch_issue_content;
|
||||
use crate::parser::{parse_issue_content, ConventionalMessage};
|
||||
use crate::generator::MessageGenerator;
|
||||
use crate::interactive::run_interactive_mode;
|
||||
use std::process::Command;
|
||||
|
||||
pub async fn execute(args: Args) -> Result<()> {
|
||||
let conventional_msg = if let Some(url) = args.get_url() {
|
||||
let content = fetch_issue_content(url).await?;
|
||||
let mut msg = parse_issue_content(&content.title, &content.body);
|
||||
msg.body = Some(content.body);
|
||||
msg
|
||||
} else if let Some(text) = args.get_text() {
|
||||
let mut msg = parse_issue_content("Generated from text", text);
|
||||
msg.body = Some(text.to_string());
|
||||
msg
|
||||
} else {
|
||||
parse_issue_content("", "")
|
||||
};
|
||||
|
||||
let mut generator = MessageGenerator::from(conventional_msg);
|
||||
|
||||
if args.is_interactive() {
|
||||
generator = run_interactive_mode(generator).await?;
|
||||
}
|
||||
|
||||
let message = generator.format_message();
|
||||
|
||||
if message.trim().is_empty() {
|
||||
anyhow::bail!("Generated commit message is empty. Please provide a description or use interactive mode.");
|
||||
}
|
||||
|
||||
if matches!(args.command, Some(crate::cli::args::Commands::Commit { .. })) {
|
||||
execute_git_commit(&message, &args)?;
|
||||
} else {
|
||||
println!("{}", message);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn execute_git_commit(message: &str, args: &Args) -> Result<()> {
|
||||
let git_repo_check = Command::new("git")
|
||||
.args(["rev-parse", "--is-inside-work-tree"])
|
||||
.output();
|
||||
|
||||
match git_repo_check {
|
||||
Ok(output) if output.status.success() => {}
|
||||
Ok(_) | Err(_) => {
|
||||
anyhow::bail!("Not in a git repository. Please run this command from the root of a git repository.");
|
||||
}
|
||||
}
|
||||
|
||||
let commit_msg_path = std::env::temp_dir().join("COMMIT_EDITMSG");
|
||||
std::fs::write(&commit_msg_path, message)?;
|
||||
|
||||
let mut cmd = Command::new("git");
|
||||
let commit_msg_str = commit_msg_path.to_str()
|
||||
.ok_or_else(|| anyhow::anyhow!("Commit message path contains invalid Unicode"))?;
|
||||
cmd.args(["commit", "-F", commit_msg_str]);
|
||||
|
||||
let amend = args.amend || match &args.command {
|
||||
Some(crate::cli::args::Commands::Commit { amend, .. }) => *amend,
|
||||
_ => false,
|
||||
};
|
||||
|
||||
if args.dry_run {
|
||||
println!("[dry-run] Would commit:");
|
||||
println!("{}", message);
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
if amend {
|
||||
cmd.arg("--amend");
|
||||
if args.no_edit {
|
||||
cmd.arg("--no-edit");
|
||||
}
|
||||
}
|
||||
|
||||
let status = cmd.status()?;
|
||||
if !status.success() {
|
||||
anyhow::bail!("Git commit failed");
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
Reference in New Issue
Block a user