using System; using System.Text; using LibGit2Sharp.Core; namespace LibGit2Sharp { /// /// Holds the changes between two s. /// public class ContentChanges : Changes { /// /// Needed for mocking purposes. /// protected ContentChanges() { } internal ContentChanges(Repository repo, Blob oldBlob, Blob newBlob, GitDiffOptions options) { Proxy.git_diff_blobs(repo.Handle, oldBlob != null ? oldBlob.Id : null, newBlob != null ? newBlob.Id : null, options, FileCallback, HunkCallback, LineCallback); } private int FileCallback(GitDiffDelta delta, float progress, IntPtr payload) { IsBinaryComparison = delta.IsBinary(); if (!IsBinaryComparison) { return 0; } AppendToPatch("Binary content differ\n"); return 0; } private int HunkCallback(GitDiffDelta delta, GitDiffRange range, IntPtr header, UIntPtr headerlen, IntPtr payload) { string decodedContent = Utf8Marshaler.FromNative(header, (int)headerlen); AppendToPatch(decodedContent); return 0; } private int LineCallback(GitDiffDelta delta, GitDiffRange range, GitDiffLineOrigin lineorigin, IntPtr content, UIntPtr contentlen, IntPtr payload) { string decodedContent = Utf8Marshaler.FromNative(content, (int)contentlen); string prefix; switch (lineorigin) { case GitDiffLineOrigin.GIT_DIFF_LINE_ADDITION: LinesAdded++; prefix = Encoding.ASCII.GetString(new[] { (byte)lineorigin }); break; case GitDiffLineOrigin.GIT_DIFF_LINE_DELETION: LinesDeleted++; prefix = Encoding.ASCII.GetString(new[] { (byte)lineorigin }); break; case GitDiffLineOrigin.GIT_DIFF_LINE_CONTEXT: prefix = Encoding.ASCII.GetString(new[] { (byte)lineorigin }); break; default: prefix = string.Empty; break; } AppendToPatch(prefix); AppendToPatch(decodedContent); return 0; } } }