@@ -603,22 +603,41 @@ public virtual MergeTreeResult MergeCommits(Commit ours, Commit theirs, MergeTre
603
603
604
604
options = options ?? new MergeTreeOptions ( ) ;
605
605
606
+ // We throw away the index after looking at the conflicts, so we'll never need the REUC
607
+ // entries to be there
608
+ GitMergeFlag mergeFlags = GitMergeFlag . GIT_MERGE_NORMAL | GitMergeFlag . GIT_MERGE_SKIP_REUC ;
609
+ if ( options . FindRenames )
610
+ {
611
+ mergeFlags |= GitMergeFlag . GIT_MERGE_FIND_RENAMES ;
612
+ }
613
+ if ( options . FailOnConflict )
614
+ {
615
+ mergeFlags |= GitMergeFlag . GIT_MERGE_FAIL_ON_CONFLICT ;
616
+ }
617
+
618
+
606
619
var mergeOptions = new GitMergeOpts
607
620
{
608
621
Version = 1 ,
609
622
MergeFileFavorFlags = options . MergeFileFavor ,
610
- MergeTreeFlags = options . FindRenames ? GitMergeFlag . GIT_MERGE_FIND_RENAMES
611
- : GitMergeFlag . GIT_MERGE_NORMAL ,
623
+ MergeTreeFlags = mergeFlags ,
612
624
RenameThreshold = ( uint ) options . RenameThreshold ,
613
625
TargetLimit = ( uint ) options . TargetLimit ,
614
626
} ;
615
627
628
+ bool earlyStop ;
616
629
using ( var oneHandle = Proxy . git_object_lookup ( repo . Handle , ours . Id , GitObjectType . Commit ) )
617
630
using ( var twoHandle = Proxy . git_object_lookup ( repo . Handle , theirs . Id , GitObjectType . Commit ) )
618
- using ( var indexHandle = Proxy . git_merge_commits ( repo . Handle , oneHandle , twoHandle , mergeOptions ) )
631
+ using ( var indexHandle = Proxy . git_merge_commits ( repo . Handle , oneHandle , twoHandle , mergeOptions , out earlyStop ) )
619
632
{
620
633
MergeTreeResult mergeResult ;
621
634
635
+ // Stopped due to FailOnConflict so there's no index or conflict list
636
+ if ( earlyStop )
637
+ {
638
+ return new MergeTreeResult ( new Conflict [ ] { } ) ;
639
+ }
640
+
622
641
if ( Proxy . git_index_has_conflicts ( indexHandle ) )
623
642
{
624
643
List < Conflict > conflicts = new List < Conflict > ( ) ;
0 commit comments