Beispiel #1
0
            public static List <IMergeResultBlock> Diff3Merge(string[] a, string[] o, string[] b, bool excludeFalseConflicts)
            {
                // Applies the output of Diff.diff3_merge_indices to actually
                // construct the merged file; the returned result alternates
                // between "ok" and "conflict" blocks.

                var result = new List <IMergeResultBlock>();
                var files  = new Dictionary <Side, string[]>
                {
                    { Side.Left, a },
                    { Side.Old, o },
                    { Side.Right, b }
                };
                var indices = Diff.Diff3MergeIndices(a, o, b);

                var okLines = new List <string>();

                for (var i = 0; i < indices.Count; i++)
                {
                    var x    = indices[i];
                    var side = x.Side;
                    if (side == Side.Conflict)
                    {
                        if (excludeFalseConflicts && !IsTrueConflict(x, a, b))
                        {
                            okLines.AddRange(files[0].SliceJS(x.Offset, x.Offset + x.Length));
                        }
                        else
                        {
                            FlushOk(okLines, result);
                            result.Add(new MergeConflictResultBlock
                            {
                                LeftLines  = a.SliceJS(x.Offset, x.Offset + x.Length),
                                LeftIndex  = x.Offset,
                                OldLines   = o.SliceJS(x.ConflictOldOffset, x.ConflictOldOffset + x.ConflictOldLength),
                                OldIndex   = x.ConflictOldOffset,
                                RightLines = b.SliceJS(x.ConflictRightOffset, x.ConflictRightOffset + x.ConflictRightLength),
                                RightIndex = x.Offset
                            });
                        }
                    }
                    else
                    {
                        okLines.AddRange(files[side].SliceJS(x.Offset, x.Offset + x.Length));
                    }
                }

                FlushOk(okLines, result);
                return(result);
            }