@@ -18,8 +18,6 @@ pub struct Options {
1818#[ derive( Debug , thiserror:: Error ) ]
1919#[ allow( missing_docs) ]
2020pub enum Error {
21- #[ error( "At least one resource was too large to be processed" ) ]
22- ResourceTooLarge ,
2321 #[ error( transparent) ]
2422 PrepareExternalDriver ( #[ from] inner:: prepare_external_driver:: Error ) ,
2523 #[ error( "Failed to launch external merge driver: {cmd}" ) ]
@@ -299,25 +297,29 @@ pub(super) mod inner {
299297 /// Returns `None` if one of the buffers is too large, making a merge impossible.
300298 /// Note that if the *pick* wasn't [`Pick::Buffer`], then `out` will not have been cleared,
301299 /// and one has to take the data from the respective resource.
300+ ///
301+ /// If there is no buffer loaded as the resource is too big, we will automatically perform a binary merge
302+ /// which effectively chooses our side by default.
302303 pub fn builtin_merge (
303304 & self ,
304305 driver : BuiltinDriver ,
305306 out : & mut Vec < u8 > ,
306307 input : & mut imara_diff:: intern:: InternedInput < & ' parent [ u8 ] > ,
307308 labels : builtin_driver:: text:: Labels < ' _ > ,
308- ) -> Option < ( Pick , Resolution ) > {
309- let base = self . ancestor . data . as_slice ( ) ? ;
310- let ours = self . current . data . as_slice ( ) ? ;
311- let theirs = self . other . data . as_slice ( ) ? ;
309+ ) -> ( Pick , Resolution ) {
310+ let base = self . ancestor . data . as_slice ( ) ;
311+ let ours = self . current . data . as_slice ( ) ;
312+ let theirs = self . other . data . as_slice ( ) ;
312313 let driver = if driver != BuiltinDriver :: Binary
313314 && ( is_binary_buf ( ours) || is_binary_buf ( theirs) || is_binary_buf ( base) )
314315 {
315316 BuiltinDriver :: Binary
316317 } else {
317318 driver
318319 } ;
319- Some ( match driver {
320+ match driver {
320321 BuiltinDriver :: Text => {
322+ let ( ( base, ours) , theirs) = base. zip ( ours) . zip ( theirs) . expect ( "would use binary if missing" ) ;
321323 let resolution =
322324 builtin_driver:: text ( out, input, labels, ours, base, theirs, self . options . text ) ;
323325 ( Pick :: Buffer , resolution)
@@ -332,6 +334,7 @@ pub(super) mod inner {
332334 ( pick, resolution)
333335 }
334336 BuiltinDriver :: Union => {
337+ let ( ( base, ours) , theirs) = base. zip ( ours) . zip ( theirs) . expect ( "would use binary if missing" ) ;
335338 let resolution = builtin_driver:: text (
336339 out,
337340 input,
@@ -346,13 +349,15 @@ pub(super) mod inner {
346349 ) ;
347350 ( Pick :: Buffer , resolution)
348351 }
349- } )
352+ }
350353 }
351354 }
352355
353- fn is_binary_buf ( buf : & [ u8 ] ) -> bool {
354- let buf = & buf[ ..buf. len ( ) . min ( 8000 ) ] ;
355- buf. contains ( & 0 )
356+ fn is_binary_buf ( buf : Option < & [ u8 ] > ) -> bool {
357+ buf. map_or ( true , |buf| {
358+ let buf = & buf[ ..buf. len ( ) . min ( 8000 ) ] ;
359+ buf. contains ( & 0 )
360+ } )
356361 }
357362 }
358363}
@@ -400,9 +405,7 @@ impl<'parent> PlatformRef<'parent> {
400405 Err ( builtin) => {
401406 let mut input = imara_diff:: intern:: InternedInput :: new ( & [ ] [ ..] , & [ ] ) ;
402407 out. clear ( ) ;
403- let ( pick, resolution) = self
404- . builtin_merge ( builtin, out, & mut input, labels)
405- . ok_or ( Error :: ResourceTooLarge ) ?;
408+ let ( pick, resolution) = self . builtin_merge ( builtin, out, & mut input, labels) ;
406409 Ok ( ( pick, resolution) )
407410 }
408411 }
0 commit comments