use std::path::Path;
use kimetsu_core::KimetsuResult;
use crate::conflict;
use crate::lock::ProjectLock;
use crate::project::*;
use crate::user_brain;
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct ScopedConflict {
pub source: String,
#[serde(flatten)]
pub report: conflict::ConflictReport,
}
pub fn list_conflicts(start: &Path, limit: u32) -> KimetsuResult<Vec<ScopedConflict>> {
let mut out = Vec::new();
let (_paths, config, project_conn) = load_project_readonly(start)?;
for report in conflict::list_unresolved_conflicts(&project_conn, limit)? {
out.push(ScopedConflict {
source: "project".to_string(),
report,
});
}
if let Some(user_conn) =
user_brain::open_user_brain_readonly_for_config(config.kimetsu.use_user_brain)?
{
for report in conflict::list_unresolved_conflicts(&user_conn, limit)? {
out.push(ScopedConflict {
source: "user".to_string(),
report,
});
}
}
out.sort_by(|a, b| b.report.detected_at.cmp(&a.report.detected_at));
Ok(out)
}
pub fn resolve_conflict(start: &Path, conflict_id: &str, resolution: &str) -> KimetsuResult<bool> {
let (paths, config, project_conn) = load_project(start)?;
let _lock = ProjectLock::acquire(&paths, "brain memory conflict resolve", None)?;
if conflict::resolve_conflict(&project_conn, conflict_id, resolution)? {
return Ok(true);
}
drop(project_conn); if let Some(user_conn) = user_brain::open_user_brain_for_config(config.kimetsu.use_user_brain)?
{
return conflict::resolve_conflict(&user_conn, conflict_id, resolution);
}
Ok(false)
}