blob: f853c7c59c18858c3e1bdd155cfd93fdbb58f917 [file] [log] [blame]
// SPDX-License-Identifier: GPL-3.0-or-later OR AGPL-3.0-or-later
// Copyright (C) 2025 Red Hat, Inc.
use crate::config::Config;
use crate::conflict_resolver::ConflictResolver;
use crate::git_utils::{ContextLines, GitUtils};
use anyhow::Result;
use clap::Parser;
mod api_client;
mod config;
mod conflict_resolver;
mod git_utils;
mod logger;
mod prob;
#[cfg(feature = "telemetry")]
mod telemetry;
include!("main_args.rs");
#[tokio::main]
async fn main() -> Result<()> {
logger::log_init();
let args = Args::parse();
// Load configuration
let config_path = shellexpand::full(&args.config_path)?;
let config = Config::load(std::path::Path::new(config_path.as_ref()))?;
log::info!("Using config file: {}", args.config_path);
// Initialize git utilities
let mut git_utils = GitUtils::new(
ContextLines {
code_context_lines: args.code_context_lines,
diff_context_lines: args.diff_context_lines,
patch_context_lines: args.patch_context_lines,
},
true,
);
// Try to cherry-pick with diff3 mode
let result = git_utils.check_diff3();
if result.is_err() {
eprintln!("Diff3 check failed. Run 'git config merge.conflictStyle diff3' to fix this.");
std::process::exit(1);
}
// Check if we're in a cherry-pick and extract commit if needed
let git_diff = if let Some(commit_hash) = git_utils.find_commit_hash()? {
log::info!("Extracting diff for commit {}", commit_hash);
git_utils.extract_diff(&commit_hash)?
} else {
None
};
// Check if there are conflicts
let conflicts = git_utils.find_conflicts()?;
if conflicts.is_empty() {
println!("No conflicts found.");
return Ok(());
}
println!("Found {} conflicts to resolve", conflicts.len());
// Resolve conflicts using AI
let resolver = ConflictResolver::new(
ContextLines {
code_context_lines: args.code_context_lines,
diff_context_lines: args.diff_context_lines,
patch_context_lines: args.patch_context_lines,
},
&config,
git_diff,
false,
);
let resolved_conflicts = resolver.resolve_conflicts(&conflicts).await?.0;
git_utils.apply_resolved_conflicts(&resolved_conflicts)?;
#[cfg(feature = "telemetry")]
{
let telemetry = telemetry::Telemetry::new(&config, &conflicts, &resolved_conflicts);
telemetry.submit().await?;
}
Ok(())
}
// Local Variables:
// rust-format-on-save: t
// End: