mirror of
https://github.com/sourcegit-scm/sourcegit.git
synced 2024-12-24 20:57:19 -08:00
refactor: move some method from view to its data source class
This commit is contained in:
parent
e64026d44c
commit
dbc95e7209
3 changed files with 126 additions and 127 deletions
|
@ -69,6 +69,80 @@ namespace SourceGit.Models
|
||||||
public string Repo { get; set; } = null;
|
public string Repo { get; set; } = null;
|
||||||
public DiffOption Option { get; set; } = null;
|
public DiffOption Option { get; set; } = null;
|
||||||
|
|
||||||
|
public TextDiffSelection MakeSelection(int startLine, int endLine, bool isSideBySide, bool isOldSide)
|
||||||
|
{
|
||||||
|
var rs = new TextDiffSelection();
|
||||||
|
rs.StartLine = startLine;
|
||||||
|
rs.EndLine = endLine;
|
||||||
|
|
||||||
|
for (int i = 0; i < startLine - 1; i++)
|
||||||
|
{
|
||||||
|
var line = Lines[i];
|
||||||
|
if (line.Type == TextDiffLineType.Added)
|
||||||
|
{
|
||||||
|
rs.HasLeftChanges = true;
|
||||||
|
rs.IgnoredAdds++;
|
||||||
|
}
|
||||||
|
else if (line.Type == TextDiffLineType.Deleted)
|
||||||
|
{
|
||||||
|
rs.HasLeftChanges = true;
|
||||||
|
rs.IgnoredDeletes++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = startLine - 1; i < endLine; i++)
|
||||||
|
{
|
||||||
|
var line = Lines[i];
|
||||||
|
if (line.Type == TextDiffLineType.Added)
|
||||||
|
{
|
||||||
|
if (!isSideBySide)
|
||||||
|
{
|
||||||
|
rs.HasChanges = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (isOldSide)
|
||||||
|
{
|
||||||
|
rs.HasLeftChanges = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rs.HasChanges = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (line.Type == TextDiffLineType.Deleted)
|
||||||
|
{
|
||||||
|
if (!isSideBySide)
|
||||||
|
{
|
||||||
|
rs.HasChanges = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else if (isOldSide)
|
||||||
|
{
|
||||||
|
rs.HasChanges = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
rs.HasLeftChanges = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!rs.HasLeftChanges)
|
||||||
|
{
|
||||||
|
for (int i = endLine; i < Lines.Count; i++)
|
||||||
|
{
|
||||||
|
var line = Lines[i];
|
||||||
|
if (line.Type == TextDiffLineType.Added || line.Type == TextDiffLineType.Deleted)
|
||||||
|
{
|
||||||
|
rs.HasLeftChanges = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rs;
|
||||||
|
}
|
||||||
|
|
||||||
public void GenerateNewPatchFromSelection(Change change, string fileBlobGuid, TextDiffSelection selection, bool revert, string output)
|
public void GenerateNewPatchFromSelection(Change change, string fileBlobGuid, TextDiffSelection selection, bool revert, string output)
|
||||||
{
|
{
|
||||||
var isTracked = !string.IsNullOrEmpty(fileBlobGuid);
|
var isTracked = !string.IsNullOrEmpty(fileBlobGuid);
|
||||||
|
@ -392,9 +466,6 @@ namespace SourceGit.Models
|
||||||
System.IO.File.WriteAllText(output, builder.ToString());
|
System.IO.File.WriteAllText(output, builder.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
[GeneratedRegex(@"^@@ \-(\d+),?\d* \+(\d+),?\d* @@")]
|
|
||||||
private static partial Regex REG_INDICATOR();
|
|
||||||
|
|
||||||
private bool ProcessIndicatorForPatch(StringBuilder builder, TextDiffLine indicator, int idx, int start, int end, int ignoreRemoves, int ignoreAdds, bool revert, bool tailed)
|
private bool ProcessIndicatorForPatch(StringBuilder builder, TextDiffLine indicator, int idx, int start, int end, int ignoreRemoves, int ignoreAdds, bool revert, bool tailed)
|
||||||
{
|
{
|
||||||
var match = REG_INDICATOR().Match(indicator.Content);
|
var match = REG_INDICATOR().Match(indicator.Content);
|
||||||
|
@ -554,6 +625,9 @@ namespace SourceGit.Models
|
||||||
builder.Append($"\n@@ -{oldStart},{oldCount} +{newStart},{newCount} @@");
|
builder.Append($"\n@@ -{oldStart},{oldCount} +{newStart},{newCount} @@");
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[GeneratedRegex(@"^@@ \-(\d+),?\d* \+(\d+),?\d* @@")]
|
||||||
|
private static partial Regex REG_INDICATOR();
|
||||||
}
|
}
|
||||||
|
|
||||||
public class LFSDiff
|
public class LFSDiff
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
using System.Collections.Generic;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
using Avalonia;
|
using Avalonia;
|
||||||
|
|
||||||
using CommunityToolkit.Mvvm.ComponentModel;
|
using CommunityToolkit.Mvvm.ComponentModel;
|
||||||
|
|
||||||
namespace SourceGit.ViewModels
|
namespace SourceGit.ViewModels
|
||||||
|
@ -53,6 +56,45 @@ namespace SourceGit.ViewModels
|
||||||
_syncScrollOffset = previous._syncScrollOffset;
|
_syncScrollOffset = previous._syncScrollOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void ConvertsToCombinedRange(Models.TextDiff combined, ref int startLine, ref int endLine, bool isOldSide)
|
||||||
|
{
|
||||||
|
endLine = Math.Min(endLine, combined.Lines.Count);
|
||||||
|
|
||||||
|
var oneSide = isOldSide ? Old : New;
|
||||||
|
var firstContentLine = -1;
|
||||||
|
for (int i = startLine - 1; i < endLine; i++)
|
||||||
|
{
|
||||||
|
var line = oneSide[i];
|
||||||
|
if (line.Type != Models.TextDiffLineType.None)
|
||||||
|
{
|
||||||
|
firstContentLine = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (firstContentLine < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var endContentLine = -1;
|
||||||
|
for (int i = Math.Min(endLine - 1, oneSide.Count - 1); i >= startLine - 1; i--)
|
||||||
|
{
|
||||||
|
var line = oneSide[i];
|
||||||
|
if (line.Type != Models.TextDiffLineType.None)
|
||||||
|
{
|
||||||
|
endContentLine = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (endContentLine < 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
var firstContent = oneSide[firstContentLine];
|
||||||
|
var endContent = oneSide[endContentLine];
|
||||||
|
startLine = combined.Lines.IndexOf(firstContent) + 1;
|
||||||
|
endLine = combined.Lines.IndexOf(endContent) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
private void FillEmptyLines()
|
private void FillEmptyLines()
|
||||||
{
|
{
|
||||||
if (Old.Count < New.Count)
|
if (Old.Count < New.Count)
|
||||||
|
|
|
@ -1159,10 +1159,10 @@ namespace SourceGit.Views
|
||||||
if (startLine > endLine)
|
if (startLine > endLine)
|
||||||
(startLine, endLine) = (endLine, startLine);
|
(startLine, endLine) = (endLine, startLine);
|
||||||
|
|
||||||
if (UseSideBySideDiff)
|
if (Editor.Content is ViewModels.TwoSideTextDiff twoSides)
|
||||||
(startLine, endLine) = GetUnifiedRange(diff, startLine, endLine, isOldSide);
|
twoSides.ConvertsToCombinedRange(diff, ref startLine, ref endLine, isOldSide);
|
||||||
|
|
||||||
var selection = MakeSelection(diff, startLine, endLine, !UseSideBySideDiff, isOldSide);
|
var selection = diff.MakeSelection(startLine, endLine, UseSideBySideDiff, isOldSide);
|
||||||
if (!selection.HasChanges)
|
if (!selection.HasChanges)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1429,7 +1429,7 @@ namespace SourceGit.Views
|
||||||
if (change == null)
|
if (change == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var selection = MakeSelection(diff, chunk.StartIdx + 1, chunk.EndIdx + 1, true, false);
|
var selection = diff.MakeSelection(chunk.StartIdx + 1, chunk.EndIdx + 1, false, false);
|
||||||
if (!selection.HasChanges)
|
if (!selection.HasChanges)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1487,7 +1487,7 @@ namespace SourceGit.Views
|
||||||
if (change == null)
|
if (change == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var selection = MakeSelection(diff, chunk.StartIdx + 1, chunk.EndIdx + 1, true, false);
|
var selection = diff.MakeSelection(chunk.StartIdx + 1, chunk.EndIdx + 1, false, false);
|
||||||
if (!selection.HasChanges)
|
if (!selection.HasChanges)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1543,7 +1543,7 @@ namespace SourceGit.Views
|
||||||
if (change == null)
|
if (change == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
var selection = MakeSelection(diff, chunk.StartIdx + 1, chunk.EndIdx + 1, true, false);
|
var selection = diff.MakeSelection(chunk.StartIdx + 1, chunk.EndIdx + 1, false, false);
|
||||||
if (!selection.HasChanges)
|
if (!selection.HasChanges)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -1588,122 +1588,5 @@ namespace SourceGit.Views
|
||||||
repo.SetWatcherEnabled(true);
|
repo.SetWatcherEnabled(true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private (int, int) GetUnifiedRange(Models.TextDiff diff, int startLine, int endLine, bool isOldSide)
|
|
||||||
{
|
|
||||||
endLine = Math.Min(endLine, diff.Lines.Count);
|
|
||||||
if (Editor.Content is ViewModels.TwoSideTextDiff twoSides)
|
|
||||||
{
|
|
||||||
var target = isOldSide ? twoSides.Old : twoSides.New;
|
|
||||||
var firstContentLine = -1;
|
|
||||||
for (int i = startLine - 1; i < endLine; i++)
|
|
||||||
{
|
|
||||||
var line = target[i];
|
|
||||||
if (line.Type != Models.TextDiffLineType.None)
|
|
||||||
{
|
|
||||||
firstContentLine = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (firstContentLine < 0)
|
|
||||||
return (-1, -1);
|
|
||||||
|
|
||||||
var endContentLine = -1;
|
|
||||||
for (int i = Math.Min(endLine - 1, target.Count - 1); i >= startLine - 1; i--)
|
|
||||||
{
|
|
||||||
var line = target[i];
|
|
||||||
if (line.Type != Models.TextDiffLineType.None)
|
|
||||||
{
|
|
||||||
endContentLine = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (endContentLine < 0)
|
|
||||||
return (-1, -1);
|
|
||||||
|
|
||||||
var firstContent = target[firstContentLine];
|
|
||||||
var endContent = target[endContentLine];
|
|
||||||
startLine = diff.Lines.IndexOf(firstContent) + 1;
|
|
||||||
endLine = diff.Lines.IndexOf(endContent) + 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (startLine, endLine);
|
|
||||||
}
|
|
||||||
|
|
||||||
private Models.TextDiffSelection MakeSelection(Models.TextDiff diff, int startLine, int endLine, bool combined, bool isOldSide)
|
|
||||||
{
|
|
||||||
var rs = new Models.TextDiffSelection();
|
|
||||||
rs.StartLine = startLine;
|
|
||||||
rs.EndLine = endLine;
|
|
||||||
|
|
||||||
for (int i = 0; i < startLine - 1; i++)
|
|
||||||
{
|
|
||||||
var line = diff.Lines[i];
|
|
||||||
if (line.Type == Models.TextDiffLineType.Added)
|
|
||||||
{
|
|
||||||
rs.HasLeftChanges = true;
|
|
||||||
rs.IgnoredAdds++;
|
|
||||||
}
|
|
||||||
else if (line.Type == Models.TextDiffLineType.Deleted)
|
|
||||||
{
|
|
||||||
rs.HasLeftChanges = true;
|
|
||||||
rs.IgnoredDeletes++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = startLine - 1; i < endLine; i++)
|
|
||||||
{
|
|
||||||
var line = diff.Lines[i];
|
|
||||||
if (line.Type == Models.TextDiffLineType.Added)
|
|
||||||
{
|
|
||||||
if (combined)
|
|
||||||
{
|
|
||||||
rs.HasChanges = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (isOldSide)
|
|
||||||
{
|
|
||||||
rs.HasLeftChanges = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rs.HasChanges = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (line.Type == Models.TextDiffLineType.Deleted)
|
|
||||||
{
|
|
||||||
if (combined)
|
|
||||||
{
|
|
||||||
rs.HasChanges = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if (isOldSide)
|
|
||||||
{
|
|
||||||
rs.HasChanges = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
rs.HasLeftChanges = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!rs.HasLeftChanges)
|
|
||||||
{
|
|
||||||
for (int i = endLine; i < diff.Lines.Count; i++)
|
|
||||||
{
|
|
||||||
var line = diff.Lines[i];
|
|
||||||
if (line.Type == Models.TextDiffLineType.Added || line.Type == Models.TextDiffLineType.Deleted)
|
|
||||||
{
|
|
||||||
rs.HasLeftChanges = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rs;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue