106 lines
2.7 KiB
C#
106 lines
2.7 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace AxCopilot.Services;
|
|
|
|
public static class DiffService
|
|
{
|
|
public enum DiffType
|
|
{
|
|
Equal,
|
|
Added,
|
|
Removed
|
|
}
|
|
|
|
public record DiffLine(DiffType Type, int? OldLineNo, int? NewLineNo, string Content);
|
|
|
|
public static List<DiffLine> ComputeDiff(string oldText, string newText)
|
|
{
|
|
string[] array = (oldText ?? "").Split('\n');
|
|
string[] array2 = (newText ?? "").Split('\n');
|
|
List<DiffLine> list = new List<DiffLine>();
|
|
List<string> list2 = ComputeLcs(array, array2);
|
|
int num = 0;
|
|
int num2 = 0;
|
|
int num3 = 0;
|
|
while (num < array.Length || num2 < array2.Length)
|
|
{
|
|
if (num3 < list2.Count && num < array.Length && num2 < array2.Length && array[num].TrimEnd('\r') == list2[num3] && array2[num2].TrimEnd('\r') == list2[num3])
|
|
{
|
|
list.Add(new DiffLine(DiffType.Equal, num + 1, num2 + 1, array[num].TrimEnd('\r')));
|
|
num++;
|
|
num2++;
|
|
num3++;
|
|
continue;
|
|
}
|
|
if (num3 < list2.Count && num < array.Length && array[num].TrimEnd('\r') != list2[num3])
|
|
{
|
|
list.Add(new DiffLine(DiffType.Removed, num + 1, null, array[num].TrimEnd('\r')));
|
|
num++;
|
|
continue;
|
|
}
|
|
if (num2 < array2.Length && (num3 >= list2.Count || array2[num2].TrimEnd('\r') != list2[num3]))
|
|
{
|
|
list.Add(new DiffLine(DiffType.Added, null, num2 + 1, array2[num2].TrimEnd('\r')));
|
|
num2++;
|
|
continue;
|
|
}
|
|
if (num < array.Length)
|
|
{
|
|
list.Add(new DiffLine(DiffType.Removed, num + 1, null, array[num].TrimEnd('\r')));
|
|
num++;
|
|
}
|
|
if (num2 < array2.Length)
|
|
{
|
|
list.Add(new DiffLine(DiffType.Added, null, num2 + 1, array2[num2].TrimEnd('\r')));
|
|
num2++;
|
|
}
|
|
}
|
|
return list;
|
|
}
|
|
|
|
private static List<string> ComputeLcs(string[] a, string[] b)
|
|
{
|
|
int num = a.Length;
|
|
int num2 = b.Length;
|
|
int[,] array = new int[num + 1, num2 + 1];
|
|
for (int i = 1; i <= num; i++)
|
|
{
|
|
for (int j = 1; j <= num2; j++)
|
|
{
|
|
array[i, j] = ((a[i - 1].TrimEnd('\r') == b[j - 1].TrimEnd('\r')) ? (array[i - 1, j - 1] + 1) : Math.Max(array[i - 1, j], array[i, j - 1]));
|
|
}
|
|
}
|
|
List<string> list = new List<string>();
|
|
int num3 = num;
|
|
int num4 = num2;
|
|
while (num3 > 0 && num4 > 0)
|
|
{
|
|
if (a[num3 - 1].TrimEnd('\r') == b[num4 - 1].TrimEnd('\r'))
|
|
{
|
|
list.Add(a[num3 - 1].TrimEnd('\r'));
|
|
num3--;
|
|
num4--;
|
|
}
|
|
else if (array[num3 - 1, num4] > array[num3, num4 - 1])
|
|
{
|
|
num3--;
|
|
}
|
|
else
|
|
{
|
|
num4--;
|
|
}
|
|
}
|
|
list.Reverse();
|
|
return list;
|
|
}
|
|
|
|
public static string GetSummary(List<DiffLine> diff)
|
|
{
|
|
int value = diff.Count((DiffLine d) => d.Type == DiffType.Added);
|
|
int value2 = diff.Count((DiffLine d) => d.Type == DiffType.Removed);
|
|
return $"+{value} -{value2} 라인 변경";
|
|
}
|
|
}
|