Skip to content

Commit 296aa06

Browse files
committed
Merge pull request #1039 from dmalikov/feature/1037-patience-diff
PatienceAlgorithm flag in CompareOptions
2 parents 0b31090 + 70d1439 commit 296aa06

File tree

3 files changed

+80
-0
lines changed

3 files changed

+80
-0
lines changed

LibGit2Sharp.Tests/DiffTreeToTreeFixture.cs

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1133,5 +1133,75 @@ public void CallingCompareWithAnUnsupportedGenericParamThrows()
11331133
Assert.Throws<LibGit2SharpException>(() => repo.Diff.Compare<string>());
11341134
}
11351135
}
1136+
1137+
[Fact]
1138+
public void UsingPatienceAlgorithmCompareOptionProducesPatienceDiff()
1139+
{
1140+
string repoPath = InitNewRepository();
1141+
using (var repo = new Repository(repoPath))
1142+
{
1143+
Func<string, Tree> fromString =
1144+
s =>
1145+
repo.ObjectDatabase.CreateTree(new TreeDefinition().Add("file.txt",
1146+
OdbHelper.CreateBlob(repo, s), Mode.NonExecutableFile));
1147+
1148+
Tree treeOld = fromString(new StringBuilder()
1149+
.Append("aaaaaa\n")
1150+
.Append("aaaaaa\n")
1151+
.Append("bbbbbb\n")
1152+
.Append("bbbbbb\n")
1153+
.Append("cccccc\n")
1154+
.Append("cccccc\n")
1155+
.Append("abc\n").ToString());
1156+
1157+
Tree treeNew = fromString(new StringBuilder()
1158+
.Append("abc\n")
1159+
.Append("aaaaaa\n")
1160+
.Append("aaaaaa\n")
1161+
.Append("bbbbbb\n")
1162+
.Append("bbbbbb\n")
1163+
.Append("cccccc\n")
1164+
.Append("cccccc\n").ToString());
1165+
1166+
string diffDefault = new StringBuilder()
1167+
.Append("diff --git a/file.txt b/file.txt\n")
1168+
.Append("index 3299d68..accc3bd 100644\n")
1169+
.Append("--- a/file.txt\n")
1170+
.Append("+++ b/file.txt\n")
1171+
.Append("@@ -1,7 +1,7 @@\n")
1172+
.Append("+abc\n")
1173+
.Append(" aaaaaa\n")
1174+
.Append(" aaaaaa\n")
1175+
.Append(" bbbbbb\n")
1176+
.Append(" bbbbbb\n")
1177+
.Append(" cccccc\n")
1178+
.Append(" cccccc\n")
1179+
.Append("-abc\n").ToString();
1180+
1181+
string diffPatience = new StringBuilder()
1182+
.Append("diff --git a/file.txt b/file.txt\n")
1183+
.Append("index 3299d68..accc3bd 100644\n")
1184+
.Append("--- a/file.txt\n")
1185+
.Append("+++ b/file.txt\n")
1186+
.Append("@@ -1,7 +1,7 @@\n")
1187+
.Append("-aaaaaa\n")
1188+
.Append("-aaaaaa\n")
1189+
.Append("-bbbbbb\n")
1190+
.Append("-bbbbbb\n")
1191+
.Append("-cccccc\n")
1192+
.Append("-cccccc\n")
1193+
.Append(" abc\n")
1194+
.Append("+aaaaaa\n")
1195+
.Append("+aaaaaa\n")
1196+
.Append("+bbbbbb\n")
1197+
.Append("+bbbbbb\n")
1198+
.Append("+cccccc\n")
1199+
.Append("+cccccc\n").ToString();
1200+
1201+
Assert.Equal(diffDefault, repo.Diff.Compare<Patch>(treeOld, treeNew));
1202+
Assert.Equal(diffPatience, repo.Diff.Compare<Patch>(treeOld, treeNew,
1203+
compareOptions: new CompareOptions { UsePatienceAlgorithm = true }));
1204+
}
1205+
}
11361206
}
11371207
}

LibGit2Sharp/CompareOptions.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,5 +35,10 @@ public CompareOptions()
3535
/// Include "unmodified" entries in the results.
3636
/// </summary>
3737
public bool IncludeUnmodified { get; set; }
38+
39+
/// <summary>
40+
/// Use the "patience diff" algorithm.
41+
/// </summary>
42+
public bool UsePatienceAlgorithm { get; set; }
3843
}
3944
}

LibGit2Sharp/Diff.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,11 @@ private static GitDiffOptions BuildOptions(DiffModifiers diffOptions, FilePath[]
4949
options.Flags |= GitDiffOptionFlags.GIT_DIFF_INCLUDE_UNMODIFIED;
5050
}
5151

52+
if (compareOptions.UsePatienceAlgorithm)
53+
{
54+
options.Flags |= GitDiffOptionFlags.GIT_DIFF_PATIENCE;
55+
}
56+
5257
if (diffOptions.HasFlag(DiffModifiers.DisablePathspecMatch))
5358
{
5459
options.Flags |= GitDiffOptionFlags.GIT_DIFF_DISABLE_PATHSPEC_MATCH;

0 commit comments

Comments
 (0)