use std::path::Path;
use crate::api;
use crate::core::index::MergeConflictReader;
use crate::error::OxenError;
use crate::model::LocalRepository;
pub fn diff(
repo: &LocalRepository,
resource: Option<&str>,
path: impl AsRef<Path>,
) -> Result<String, OxenError> {
if let Some(resource) = resource {
if let Some(compare_commit) = api::local::commits::get_by_id(repo, resource)? {
let original_commit = api::local::commits::head_commit(repo)?;
api::local::diff::diff(repo, &original_commit, &compare_commit, path)
} else if let Some(branch) = api::local::branches::get_by_name(repo, resource)? {
let compare_commit = api::local::commits::get_by_id(repo, &branch.commit_id)?.unwrap();
let original_commit = api::local::commits::head_commit(repo)?;
api::local::diff::diff(repo, &original_commit, &compare_commit, path)
} else if Path::new(resource).exists() {
api::local::diff::diff_files(resource, path)
} else {
Err(OxenError::basic_str(format!(
"Could not find resource: {resource:?}"
)))
}
} else {
let merger = MergeConflictReader::new(repo)?;
if merger.has_conflicts()? {
match merger.get_conflict_commit() {
Ok(Some(commit)) => {
let current_path = path.as_ref();
let version_path = api::local::diff::get_version_file_from_commit(
repo,
&commit,
current_path,
)?;
api::local::diff::diff_files(current_path, version_path)
}
err => {
log::error!("{err:?}");
Err(OxenError::basic_str(format!(
"Could not find merge resource: {resource:?}"
)))
}
}
} else {
let current_path = path.as_ref();
let commit = api::local::commits::head_commit(repo)?;
let version_path =
api::local::diff::get_version_file_from_commit(repo, &commit, current_path)?;
api::local::diff::diff_files(version_path, current_path)
}
}
}