gitdataai/lib/git/cmd/merge/merge_analysis.rs
2026-05-30 01:38:40 +08:00

77 lines
2.3 KiB
Rust

use crate::{
bare::GitBare,
cmd::{
merge::{MergeAnalysisResult, MergePreferenceResult},
oid::ObjectId,
},
errors::GitResult,
};
impl GitBare {
pub fn merge_analysis(
&self,
their_commit: ObjectId,
) -> GitResult<(MergeAnalysisResult, MergePreferenceResult)> {
let repo = self.gix_repo()?;
let their_gix_id: gix::hash::ObjectId = (&their_commit).try_into()?;
let head_id = repo.head_id()?;
let head_gix_id = head_id.detach();
let is_up_to_date = repo
.merge_base(their_gix_id, head_gix_id)
.ok()
.is_some_and(|base| base.detach() == their_gix_id);
if is_up_to_date {
return Ok((
MergeAnalysisResult {
is_none: false,
is_normal: false,
is_up_to_date: true,
is_fast_forward: false,
is_unborn: false,
},
MergePreferenceResult {
is_none: false,
is_no_fast_forward: false,
is_fastforward_only: false,
},
));
}
let is_fast_forward = repo
.merge_base(head_gix_id, their_gix_id)
.ok()
.is_some_and(|base| base.detach() == head_gix_id);
if is_fast_forward {
return Ok((
MergeAnalysisResult {
is_none: false,
is_normal: false,
is_up_to_date: false,
is_fast_forward: true,
is_unborn: false,
},
MergePreferenceResult {
is_none: false,
is_no_fast_forward: false,
is_fastforward_only: false,
},
));
}
Ok((
MergeAnalysisResult {
is_none: false,
is_normal: true,
is_up_to_date: false,
is_fast_forward: false,
is_unborn: false,
},
MergePreferenceResult {
is_none: false,
is_no_fast_forward: false,
is_fastforward_only: false,
},
))
}
}