forked from libgit2/libgit2sharp
-
Notifications
You must be signed in to change notification settings - Fork 2
/
ContentChanges.cs
81 lines (66 loc) · 2.51 KB
/
ContentChanges.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
using System;
using System.Text;
using LibGit2Sharp.Core;
namespace LibGit2Sharp
{
/// <summary>
/// Holds the changes between two <see cref = "Blob" />s.
/// </summary>
public class ContentChanges : Changes
{
/// <summary>
/// Needed for mocking purposes.
/// </summary>
protected ContentChanges()
{ }
internal ContentChanges(Repository repo, Blob oldBlob, Blob newBlob, GitDiffOptions options)
{
using (var osw1 = new ObjectSafeWrapper(oldBlob.Id, repo))
using (var osw2 = new ObjectSafeWrapper(newBlob.Id, repo))
{
Ensure.Success(NativeMethods.git_diff_blobs(osw1.ObjectPtr, osw2.ObjectPtr, options, IntPtr.Zero, FileCallback, HunkCallback, LineCallback));
}
}
private int FileCallback(IntPtr data, GitDiffDelta delta, float progress)
{
IsBinaryComparison = delta.IsBinary();
if (!IsBinaryComparison)
{
return 0;
}
AppendToPatch("Binary content differ\n");
return 0;
}
private int HunkCallback(IntPtr data, GitDiffDelta delta, GitDiffRange range, IntPtr header, uint headerlen)
{
string decodedContent = Utf8Marshaler.FromNative(header, headerlen);
AppendToPatch(decodedContent);
return 0;
}
private int LineCallback(IntPtr data, GitDiffDelta delta, GitDiffRange range, GitDiffLineOrigin lineorigin, IntPtr content, uint contentlen)
{
string decodedContent = Utf8Marshaler.FromNative(content, 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;
}
}
}