| // 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: |