Skip to content

Commit 241a21f

Browse files
committed
feat: respect the conflict-marker-size attribute as well.
1 parent 6ee54dc commit 241a21f

File tree

5 files changed

+28
-7
lines changed

5 files changed

+28
-7
lines changed

gix-merge/src/blob/platform/mod.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ impl Platform {
9595
attr_stack,
9696
attrs: {
9797
let mut out = attributes::search::Outcome::default();
98-
out.initialize_with_selection(&Default::default(), Some("merge"));
98+
out.initialize_with_selection(&Default::default(), ["merge", "conflict-marker-size"]);
9999
out
100100
},
101101
options,

gix-merge/src/blob/platform/prepare_merge.rs

+19-3
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1+
use crate::blob::builtin_driver::text::Conflict;
12
use crate::blob::platform::{merge, DriverChoice, ResourceRef};
23
use crate::blob::{BuiltinDriver, Platform, PlatformRef, ResourceKind};
34
use bstr::{BStr, BString, ByteSlice};
45
use gix_filter::attributes;
6+
use std::num::NonZeroU8;
7+
use std::str::FromStr;
58

69
/// The error returned by [Platform::prepare_merge_state()](Platform::prepare_merge()).
710
#[derive(Debug, thiserror::Error)]
@@ -45,12 +48,14 @@ impl Platform {
4548
rela_path: current.rela_path.clone(),
4649
})?;
4750
entry.matching_attributes(&mut self.attrs);
48-
let attr = self.attrs.iter_selected().next().expect("pre-initialized with 'diff'");
49-
let mut driver = match attr.assignment.state {
51+
let mut attrs = self.attrs.iter_selected();
52+
let merge_attr = attrs.next().expect("pre-initialized with 'merge'");
53+
let marker_size_attr = attrs.next().expect("pre-initialized with 'conflict-marker-size'");
54+
let mut driver = match merge_attr.assignment.state {
5055
attributes::StateRef::Set => DriverChoice::BuiltIn(BuiltinDriver::Text),
5156
attributes::StateRef::Unset => DriverChoice::BuiltIn(BuiltinDriver::Binary),
5257
attributes::StateRef::Value(_) | attributes::StateRef::Unspecified => {
53-
let name = match attr.assignment.state {
58+
let name = match merge_attr.assignment.state {
5459
attributes::StateRef::Value(name) => Some(name.as_bstr()),
5560
attributes::StateRef::Unspecified => {
5661
self.options.default_driver.as_ref().map(|name| name.as_bstr())
@@ -60,6 +65,17 @@ impl Platform {
6065
self.find_driver_by_name(name)
6166
}
6267
};
68+
if let attributes::StateRef::Value(value) = marker_size_attr.assignment.state {
69+
if let Some(value) = u8::from_str(value.as_bstr().to_str_lossy().as_ref())
70+
.ok()
71+
.and_then(NonZeroU8::new)
72+
{
73+
match &mut options.text.conflict {
74+
Conflict::Keep { marker_size, .. } => *marker_size = value,
75+
Conflict::ResolveWithOurs | Conflict::ResolveWithTheirs | Conflict::ResolveWithUnion => {}
76+
}
77+
}
78+
}
6379
if let Some(recursive_driver_name) = match driver {
6480
DriverChoice::Index(idx) => self.drivers.get(idx),
6581
_ => None,
Binary file not shown.

gix-merge/tests/fixtures/make_blob_repo.sh

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ echo unset > unset
1111
echo unspecified > unspecified
1212

1313
cat <<EOF >.gitattributes
14-
just-set merge
14+
just-set merge conflict-marker-size=32
1515
b merge=b
1616
union merge=union
1717
missing merge=missing

gix-merge/tests/merge/blob/platform.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -514,15 +514,15 @@ mod prepare_merge {
514514
platform.set_resource(
515515
gix_hash::Kind::Sha1.null(),
516516
EntryKind::Blob,
517-
"just-set".into(),
517+
"ancestor does not matter for attributes".into(),
518518
ResourceKind::CommonAncestorOrBase,
519519
&gix_object::find::Never,
520520
)?;
521521

522522
platform.set_resource(
523523
gix_hash::Kind::Sha1.null(),
524524
EntryKind::Blob,
525-
"does not matter for driver".into(),
525+
"just-set".into(),
526526
ResourceKind::CurrentOrOurs,
527527
&gix_object::find::Never,
528528
)?;
@@ -540,6 +540,11 @@ mod prepare_merge {
540540
DriverChoice::BuiltIn(BuiltinDriver::Text),
541541
"`merge` attribute means text"
542542
);
543+
assert_eq!(
544+
prepared.options.text.conflict.marker_size(),
545+
Some(32),
546+
"marker sizes are picked up from attributes as well"
547+
);
543548

544549
platform.set_resource(
545550
gix_hash::Kind::Sha1.null(),

0 commit comments

Comments
 (0)