@@ -18,8 +18,6 @@ pub struct Options {
18
18
#[ derive( Debug , thiserror:: Error ) ]
19
19
#[ allow( missing_docs) ]
20
20
pub enum Error {
21
- #[ error( "At least one resource was too large to be processed" ) ]
22
- ResourceTooLarge ,
23
21
#[ error( transparent) ]
24
22
PrepareExternalDriver ( #[ from] inner:: prepare_external_driver:: Error ) ,
25
23
#[ error( "Failed to launch external merge driver: {cmd}" ) ]
@@ -299,25 +297,29 @@ pub(super) mod inner {
299
297
/// Returns `None` if one of the buffers is too large, making a merge impossible.
300
298
/// Note that if the *pick* wasn't [`Pick::Buffer`], then `out` will not have been cleared,
301
299
/// 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.
302
303
pub fn builtin_merge (
303
304
& self ,
304
305
driver : BuiltinDriver ,
305
306
out : & mut Vec < u8 > ,
306
307
input : & mut imara_diff:: intern:: InternedInput < & ' parent [ u8 ] > ,
307
308
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 ( ) ;
312
313
let driver = if driver != BuiltinDriver :: Binary
313
314
&& ( is_binary_buf ( ours) || is_binary_buf ( theirs) || is_binary_buf ( base) )
314
315
{
315
316
BuiltinDriver :: Binary
316
317
} else {
317
318
driver
318
319
} ;
319
- Some ( match driver {
320
+ match driver {
320
321
BuiltinDriver :: Text => {
322
+ let ( ( base, ours) , theirs) = base. zip ( ours) . zip ( theirs) . expect ( "would use binary if missing" ) ;
321
323
let resolution =
322
324
builtin_driver:: text ( out, input, labels, ours, base, theirs, self . options . text ) ;
323
325
( Pick :: Buffer , resolution)
@@ -332,6 +334,7 @@ pub(super) mod inner {
332
334
( pick, resolution)
333
335
}
334
336
BuiltinDriver :: Union => {
337
+ let ( ( base, ours) , theirs) = base. zip ( ours) . zip ( theirs) . expect ( "would use binary if missing" ) ;
335
338
let resolution = builtin_driver:: text (
336
339
out,
337
340
input,
@@ -346,13 +349,15 @@ pub(super) mod inner {
346
349
) ;
347
350
( Pick :: Buffer , resolution)
348
351
}
349
- } )
352
+ }
350
353
}
351
354
}
352
355
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
+ } )
356
361
}
357
362
}
358
363
}
@@ -400,9 +405,7 @@ impl<'parent> PlatformRef<'parent> {
400
405
Err ( builtin) => {
401
406
let mut input = imara_diff:: intern:: InternedInput :: new ( & [ ] [ ..] , & [ ] ) ;
402
407
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) ;
406
409
Ok ( ( pick, resolution) )
407
410
}
408
411
}
0 commit comments