77 lines
2.3 KiB
Rust
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,
|
|
},
|
|
))
|
|
}
|
|
}
|