public virtual FileDiffModel ParseFileDiff(string fileName, string diff)
{
Requires.NotNullOrEmpty(fileName, "fileName");
Requires.NotNullOrEmpty(diff, "diff");
IEnumerable<DiffHunk> hunks;
using (TextReader rdr = new StringReader(diff))
{
hunks = Reader.ReadHunks(rdr);
}
// Flatten out to lines
IList<LineDiffModel> lines = new List<LineDiffModel>();
int lineIndex = 0;
foreach (var hunk in hunks)
{
int leftLine = hunk.OriginalLocation.Line;
int rightLine = hunk.ModifiedLocation.Line;
lines.Add(new LineDiffModel() { Index = lineIndex++, Type = LineDiffType.HunkHeader, Text = hunk.ToString() });
foreach (var line in hunk.Lines)
{
LineDiffModel newLine = new LineDiffModel()
{
Index = lineIndex++,
Type = line.Type,
Text = line.Content
};
switch (line.Type)
{
case LineDiffType.Same:
newLine.LeftLine = leftLine++;
newLine.RightLine = rightLine++;
break;
case LineDiffType.Added:
newLine.RightLine = rightLine++;
break;
case LineDiffType.Removed:
newLine.LeftLine = leftLine++;
break;
}
lines.Add(newLine);
}
}
return new FileDiffModel()
{
FileName = Converter.CleanFileName(fileName),
Binary = false,
Deletions = lines.Count(m => m.Type == LineDiffType.Removed),
Insertions = lines.Count(m => m.Type == LineDiffType.Added),
Lines = lines.ToList()
};
}