diff --git a/LibGit2Sharp/LibGit2Sharp.csproj b/LibGit2Sharp/LibGit2Sharp.csproj index 955bfcf62..64ef22fc1 100644 --- a/LibGit2Sharp/LibGit2Sharp.csproj +++ b/LibGit2Sharp/LibGit2Sharp.csproj @@ -77,7 +77,6 @@ - diff --git a/LibGit2Sharp/PatchPrinter.cs b/LibGit2Sharp/PatchPrinter.cs deleted file mode 100644 index 4e103bd0b..000000000 --- a/LibGit2Sharp/PatchPrinter.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using LibGit2Sharp.Core; - -namespace LibGit2Sharp -{ - internal class PatchPrinter - { - private readonly IDictionary filesChanges; - private readonly StringBuilder fullPatchBuilder; - private string currentFilePath; - - private static readonly Utf8Marshaler marshaler = (Utf8Marshaler)Utf8Marshaler.GetInstance(string.Empty); - - internal PatchPrinter(IDictionary filesChanges, StringBuilder fullPatchBuilder) - { - this.filesChanges = filesChanges; - this.fullPatchBuilder = fullPatchBuilder; - } - - - private static string NativeToString(IntPtr content, IntPtr contentlen) - { - return ((Utf8Marshaler)(Utf8Marshaler.GetInstance(string.Empty))).NativeToString(content, contentlen.ToInt32()); - } - - internal int PrintCallBack(IntPtr data, GitDiffDelta delta, GitDiffRange range, GitDiffLineOrigin lineorigin, IntPtr content, IntPtr contentlen) - { - string formattedoutput = NativeToString(content, contentlen); - - switch (lineorigin) - { - case GitDiffLineOrigin.GIT_DIFF_LINE_FILE_HDR: - currentFilePath = (string)marshaler.MarshalNativeToManaged(delta.NewFile.Path); - break; - } - - filesChanges[currentFilePath].PatchBuilder.Append(formattedoutput); - fullPatchBuilder.Append(formattedoutput); - - return 0; - } - } -} diff --git a/LibGit2Sharp/TreeChanges.cs b/LibGit2Sharp/TreeChanges.cs index 3bf3a7c07..b4b3126fa 100644 --- a/LibGit2Sharp/TreeChanges.cs +++ b/LibGit2Sharp/TreeChanges.cs @@ -23,7 +23,8 @@ public class TreeChanges : IEnumerable private int linesDeleted; private readonly IDictionary> fileDispatcher = Build(); - private readonly string patch; + + private readonly StringBuilder fullPatchBuilder = new StringBuilder(); private static IDictionary> Build() { @@ -37,30 +38,39 @@ public class TreeChanges : IEnumerable internal TreeChanges(DiffListSafeHandle diff) { - var fullPatchBuilder = new StringBuilder(); + Ensure.Success(NativeMethods.git_diff_print_patch(diff, IntPtr.Zero, PrintCallBack)); + } - Ensure.Success(NativeMethods.git_diff_foreach(diff, IntPtr.Zero, FileCallback, null, LineCallback)); - Ensure.Success(NativeMethods.git_diff_print_patch(diff, IntPtr.Zero, new PatchPrinter(changes, fullPatchBuilder).PrintCallBack)); + private int PrintCallBack(IntPtr data, GitDiffDelta delta, GitDiffRange range, GitDiffLineOrigin lineorigin, IntPtr content, IntPtr contentlen) + { + string formattedoutput = marshaler.NativeToString(content, contentlen.ToInt32()); + var currentFilePath = (string)marshaler.MarshalNativeToManaged(delta.NewFile.Path); - patch = fullPatchBuilder.ToString(); + AddLineChange(currentFilePath, lineorigin); + + if (lineorigin == GitDiffLineOrigin.GIT_DIFF_LINE_FILE_HDR) + { + AddFileChange(delta); + } + + changes[currentFilePath].PatchBuilder.Append(formattedoutput); + fullPatchBuilder.Append(formattedoutput); + + return 0; } - private int LineCallback(IntPtr data, GitDiffDelta delta, GitDiffRange range, GitDiffLineOrigin lineorigin, IntPtr content, IntPtr contentlen) + private void AddLineChange(string currentFilePath, GitDiffLineOrigin lineOrigin) { - var newFilePath = (string)marshaler.MarshalNativeToManaged(delta.NewFile.Path); - - switch (lineorigin) + switch (lineOrigin) { case GitDiffLineOrigin.GIT_DIFF_LINE_ADDITION: - IncrementLinesAdded(newFilePath); + IncrementLinesAdded(currentFilePath); break; case GitDiffLineOrigin.GIT_DIFF_LINE_DELETION: - IncrementLinesDeleted(newFilePath); + IncrementLinesDeleted(currentFilePath); break; } - - return 0; } private void IncrementLinesDeleted(string filePath) @@ -75,13 +85,6 @@ private void IncrementLinesAdded(string filePath) this[filePath].LinesAdded++; } - private int FileCallback(IntPtr data, GitDiffDelta delta, float progress) - { - AddFileChange(delta); - - return 0; - } - private void AddFileChange(GitDiffDelta delta) { var newFilePath = (string)marshaler.MarshalNativeToManaged(delta.NewFile.Path); @@ -175,7 +178,7 @@ public int LinesDeleted /// public string Patch { - get { return patch; } + get { return fullPatchBuilder.ToString(); } } } }