mirror of
https://github.com/sourcegit-scm/sourcegit
synced 2025-05-21 04:04:59 +00:00
feature<Diff>: highlights differences for modified lines (both added and removed)
This commit is contained in:
parent
776defe6c3
commit
92de6f2b79
7 changed files with 142 additions and 29 deletions
|
@ -1,4 +1,5 @@
|
|||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text.RegularExpressions;
|
||||
|
||||
namespace SourceGit.Commands {
|
||||
|
@ -8,6 +9,8 @@ namespace SourceGit.Commands {
|
|||
public class Diff : Command {
|
||||
private static readonly Regex REG_INDICATOR = new Regex(@"^@@ \-(\d+),?\d* \+(\d+),?\d* @@");
|
||||
private Models.TextChanges changes = new Models.TextChanges();
|
||||
private List<Models.TextChanges.Line> deleted = new List<Models.TextChanges.Line>();
|
||||
private List<Models.TextChanges.Line> added = new List<Models.TextChanges.Line>();
|
||||
private int oldLine = 0;
|
||||
private int newLine = 0;
|
||||
|
||||
|
@ -18,6 +21,7 @@ namespace SourceGit.Commands {
|
|||
|
||||
public Models.TextChanges Result() {
|
||||
Exec();
|
||||
ProcessChanges();
|
||||
if (changes.IsBinary) changes.Lines.Clear();
|
||||
return changes;
|
||||
}
|
||||
|
@ -37,6 +41,7 @@ namespace SourceGit.Commands {
|
|||
changes.Lines.Add(new Models.TextChanges.Line(Models.TextChanges.LineMode.Indicator, line, "", ""));
|
||||
} else {
|
||||
if (line.Length == 0) {
|
||||
ProcessChanges();
|
||||
changes.Lines.Add(new Models.TextChanges.Line(Models.TextChanges.LineMode.Normal, "", $"{oldLine}", $"{newLine}"));
|
||||
oldLine++;
|
||||
newLine++;
|
||||
|
@ -45,12 +50,13 @@ namespace SourceGit.Commands {
|
|||
|
||||
var ch = line[0];
|
||||
if (ch == '-') {
|
||||
changes.Lines.Add(new Models.TextChanges.Line(Models.TextChanges.LineMode.Deleted, line.Substring(1), $"{oldLine}", ""));
|
||||
deleted.Add(new Models.TextChanges.Line(Models.TextChanges.LineMode.Deleted, line.Substring(1), $"{oldLine}", ""));
|
||||
oldLine++;
|
||||
} else if (ch == '+') {
|
||||
changes.Lines.Add(new Models.TextChanges.Line(Models.TextChanges.LineMode.Added, line.Substring(1), "", $"{newLine}"));
|
||||
added.Add(new Models.TextChanges.Line(Models.TextChanges.LineMode.Added, line.Substring(1), "", $"{newLine}"));
|
||||
newLine++;
|
||||
} else if (ch != '\\') {
|
||||
ProcessChanges();
|
||||
var match = REG_INDICATOR.Match(line);
|
||||
if (match.Success) {
|
||||
oldLine = int.Parse(match.Groups[1].Value);
|
||||
|
@ -64,5 +70,29 @@ namespace SourceGit.Commands {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void ProcessChanges() {
|
||||
if (deleted.Count > 0) {
|
||||
if (added.Count == deleted.Count) {
|
||||
for (int i = added.Count - 1; i >= 0; i--) {
|
||||
var left = deleted[i];
|
||||
var right = added[i];
|
||||
var result = DiffPlex.Differ.Instance.CreateCharacterDiffs(left.Content, right.Content, false, false);
|
||||
foreach (var block in result.DiffBlocks) {
|
||||
left.Highlights.Add(new Models.TextChanges.HighlightRange(block.DeleteStartA, block.DeleteCountA));
|
||||
right.Highlights.Add(new Models.TextChanges.HighlightRange(block.InsertStartB, block.InsertCountB));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
changes.Lines.AddRange(deleted);
|
||||
deleted.Clear();
|
||||
}
|
||||
|
||||
if (added.Count > 0) {
|
||||
changes.Lines.AddRange(added);
|
||||
added.Clear();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue