/// <inheritdoc/> public IReadOnlyList <IInlineCommentThreadModel> BuildCommentThreads( IPullRequestModel pullRequest, string relativePath, IReadOnlyList <DiffChunk> diff) { relativePath = relativePath.Replace("\\", "/"); var commentsByPosition = pullRequest.ReviewComments .Where(x => x.Path == relativePath && x.OriginalPosition.HasValue) .OrderBy(x => x.Id) .GroupBy(x => Tuple.Create(x.OriginalCommitId, x.OriginalPosition.Value)); var threads = new List <IInlineCommentThreadModel>(); foreach (var comments in commentsByPosition) { var hunk = comments.First().DiffHunk; var chunks = DiffUtilities.ParseFragment(hunk); var chunk = chunks.Last(); var diffLines = chunk.Lines.Reverse().Take(5).ToList(); var thread = new InlineCommentThreadModel( relativePath, comments.Key.Item1, comments.Key.Item2, diffLines, comments); threads.Add(thread); } UpdateCommentThreads(threads, diff); return(threads); }
public Task <IReadOnlyList <DiffChunk> > Diff(IRepository repo, string baseSha, string headSha, string path) { var blob1 = GetBlob(path, baseSha); var blob2 = GetBlob(path, headSha); var patch = repository.Diff.Compare(blob1, blob2).Patch; return(Task.FromResult <IReadOnlyList <DiffChunk> >(DiffUtilities.ParseFragment(patch).ToList())); }
@@ -1 +2 @@", 1, 2)] // Extra header info when using `Diff.Compare<Patch>`. public void HeaderOnly_OldAndNewLineNumbers(string header, int expectOldLineNumber, int expectNewLineNumber) { var chunks = DiffUtilities.ParseFragment(header); var chunk = chunks.First(); Assert.Equal(expectOldLineNumber, chunk.OldLineNumber); Assert.Equal(expectNewLineNumber, chunk.NewLineNumber); }
public void FirstChunk_CheckLineNumbers(int oldLineNumber, int newLineNumber) { var header = $"@@ -{oldLineNumber} +{newLineNumber} @@"; var chunk = DiffUtilities.ParseFragment(header).First(); Assert.Equal(oldLineNumber, chunk.OldLineNumber); Assert.Equal(newLineNumber, chunk.NewLineNumber); }
public void FirstChunk_CheckDiffLineZeroBased() { var expectDiffLine = 0; var header = "@@ -1 +1 @@"; var chunk = DiffUtilities.ParseFragment(header).First(); Assert.Equal(expectDiffLine, chunk.DiffLine); }
public void NoLineMatchesFromNoLines() { var chunks = new DiffChunk[0]; var lines = new DiffLine[0]; var line = DiffUtilities.Match(chunks, lines); Assert.Null(line); }
public void InvalidDiffLineChangeChar(string line, string expectMessage) { var fragment = $"@@ -1,4 +1,4 @@\n{line}"; var result = DiffUtilities.ParseFragment(fragment); var e = Assert.Throws <InvalidDataException>(() => result.First()); Assert.Equal(expectMessage, e.Message); }
public void HeaderOnly_OneChunkNoLines(string header) { var chunks = DiffUtilities.ParseFragment(header); Assert.Equal(1, chunks.Count()); var chunk = chunks.First(); Assert.Equal(0, chunk.Lines.Count()); }
public void NoLineMatchesFromNoLines() { var chunks = Array.Empty <DiffChunk>(); var lines = Array.Empty <DiffLine>(); var line = DiffUtilities.Match(chunks, lines); Assert.That(line, Is.Null); }
public void HeaderOnly_OneChunkNoLines(string header) { var chunks = DiffUtilities.ParseFragment(header); Assert.That(chunks, Has.One.Items); var chunk = chunks.First(); Assert.That(chunk.Lines, Is.Empty); }
public void FirstLine_CheckContent(string line) { var fragment = $"@@ -1,4 +1,4 @@\n{line}"; var result = DiffUtilities.ParseFragment(fragment); var firstLine = result.First().Lines.First(); Assert.Equal(line, firstLine.Content); }
public void HeaderOnly_OneChunkNoLines(string header) { var chunks = DiffUtilities.ParseFragment(header); Assert.Single(chunks); var chunk = chunks.First(); Assert.Empty(chunk.Lines); }
/// <inheritdoc/> public async Task <IReadOnlyList <DiffChunk> > Diff( IRepository repo, string baseSha, string headSha, string path) { var patch = await gitClient.Compare(repo, baseSha, headSha, path); return(DiffUtilities.ParseFragment(patch).ToList()); }
public void SkipNLines_CheckDiffLineNumber(string lines, int skip, int expectDiffLineNumber) { var fragment = $"@@ -1 +1 @@\n{lines}"; var result = DiffUtilities.ParseFragment(fragment); var firstLine = result.First().Lines.Skip(skip).First(); Assert.Equal(expectDiffLineNumber, firstLine.DiffLineNumber); }
public void FirstLine_CheckLineNumbers(int oldLineNumber, int newLineNumber, string line, int expectOldLineNumber, int expectNewLineNumber) { var header = $"@@ -{oldLineNumber} +{newLineNumber} @@\n{line}"; var chunk = DiffUtilities.ParseFragment(header).First(); var diffLine = chunk.Lines.First(); Assert.Equal(expectOldLineNumber, diffLine.OldLineNumber); Assert.Equal(expectNewLineNumber, diffLine.NewLineNumber); }
public async Task <IList <DiffChunk> > Diff( IRepository repo, string sha, string path, byte[] contents) { var changes = await gitClient.CompareWith(repo, sha, path, contents); return(DiffUtilities.ParseFragment(changes.Patch).ToList()); }
public void FirstLine_CheckDiffChangeTypes(string line, DiffChangeType expectType) { var fragment = $"@@ -1 +1 @@\n{line}"; var result = DiffUtilities.ParseFragment(fragment); var firstLine = result.First().Lines.First(); Assert.Equal(expectType, firstLine.Type); }
public void FirstChunk_CheckLineContent(string diffLines, string contentLine0, string contentLine1) { var header = "@@ -1 +1 @@"; var diff = header + "\n" + diffLines; var chunk = DiffUtilities.ParseFragment(diff).First(); Assert.Equal(contentLine0, chunk.Lines[0].Content); Assert.Equal(contentLine1, chunk.Lines[1].Content); }
public void FirstChunk_CheckOldLineNumber(string diffLines, int lineNumber0, int lineNumber1) { var header = "@@ -1 +1 @@"; var diff = header + "\n" + diffLines; var chunk = DiffUtilities.ParseFragment(diff).First(); Assert.Equal(lineNumber0, chunk.Lines[0].OldLineNumber); Assert.Equal(lineNumber1, chunk.Lines[1].OldLineNumber); }
public void FirstLine_CheckToString(string line) { var fragment = $"@@ -1 +1 @@\n{line}"; var result = DiffUtilities.ParseFragment(fragment); var firstLine = result.First().Lines.First(); var str = firstLine.ToString(); Assert.Equal(line, str); }
public Task <IList <DiffChunk> > Diff(IRepository repo, string baseSha, string path, byte[] contents) { var tip = repository.Head.Tip.Sha; var stream = contents != null ? new MemoryStream(contents) : new MemoryStream(); var blob1 = repository.Head.Tip[path]?.Target as Blob; var blob2 = repository.ObjectDatabase.CreateBlob(stream, path); var patch = repository.Diff.Compare(blob1, blob2).Patch; return(Task.FromResult <IList <DiffChunk> >(DiffUtilities.ParseFragment(patch).ToList())); }
public void MatchLine(string lines1, string lines2, int skip /* -1 for no match */) { var header = "@@ -1 +1 @@"; var chunks1 = DiffUtilities.ParseFragment(header + "\n" + lines1).ToList(); var chunks2 = DiffUtilities.ParseFragment(header + "\n" + lines2).ToList(); var expectLine = (skip != -1) ? chunks1.First().Lines.Skip(skip).First() : null; var targetLines = chunks2.First().Lines; var line = DiffUtilities.Match(chunks1, targetLines); Assert.Equal(expectLine, line); }
Task <IReadOnlyList <DiffChunk> > Diff(string path, string baseSha, byte[] contents) { var tip = repository.Head.Tip.Sha; var stream = contents != null ? new MemoryStream(contents) : new MemoryStream(); var blob1 = GetBlob(path, baseSha); var blob2 = repository.ObjectDatabase.CreateBlob(stream, path); var patch = repository.Diff.Compare(blob1, blob2, new CompareOptions { IndentHeuristic = true }).Patch; return(Task.FromResult <IReadOnlyList <DiffChunk> >(DiffUtilities.ParseFragment(patch).ToList())); }
public void NoNewLineNotAtEndOfChunk_CheckLineCount() { var header = @"@@ -1 +1 @@ -old \ No newline at end of file +new"; var chunk = DiffUtilities.ParseFragment(header).First(); Assert.Equal(2, chunk.Lines.Count()); }
public void HeaderOnlyNoNewLineAtEnd_NoLines() { var header = @"@@ -1 +1 @@ \ No newline at end of file\n"; var chunks = DiffUtilities.ParseFragment(header); var chunk = chunks.First(); Assert.Empty(chunk.Lines); }
int GetUpdatedLineNumber(IInlineCommentThreadModel thread, IEnumerable <DiffChunk> diff) { var line = DiffUtilities.Match(diff, thread.DiffMatch); if (line != null) { return((thread.DiffLineType == DiffChangeType.Delete) ? line.OldLineNumber - 1 : line.NewLineNumber - 1); } return(-1); }
public void MatchSameLine() { var diff = "@@ -1 +1 @@\n 1"; var chunks1 = DiffUtilities.ParseFragment(diff).ToList(); var chunks2 = DiffUtilities.ParseFragment(diff).ToList(); var expectLine = chunks1.First().Lines.First(); var targetLine = chunks2.First().Lines.First(); var targetLines = new[] { targetLine }; var line = DiffUtilities.Match(chunks1, targetLines); Assert.Equal(expectLine, line); }
public void NoNewLineNotAtEndOfChunk_CheckDiffLineNumber() { var header = @"@@ -1 +1 @@ -old \ No newline at end of file +new"; var chunk = DiffUtilities.ParseFragment(header).First(); var line = chunk.Lines.Last(); Assert.Equal(3, line.DiffLineNumber); }
[InlineData("+a.+b.+x", "+a.+x.", -1)] // backtrack when there is a failed match public void MatchLine(string diffLines, string matchLines, int expectedDiffLineNumber /* -1 for no match */) { var header = "@@ -1 +1 @@"; diffLines = diffLines.Replace(".", "\r\n"); matchLines = matchLines.Replace(".", "\r\n"); var chunks1 = DiffUtilities.ParseFragment(header + "\n" + diffLines).ToList(); var chunks2 = DiffUtilities.ParseFragment(header + "\n" + matchLines).ToList(); var targetLines = chunks2.First().Lines.Reverse().ToList(); var line = DiffUtilities.Match(chunks1, targetLines); var diffLineNumber = (line != null) ? line.DiffLineNumber : -1; Assert.Equal(expectedDiffLineNumber, diffLineNumber); }
/// <inheritdoc/> public async Task <IReadOnlyList <DiffChunk> > Diff( IRepository repo, string baseSha, string headSha, string path) { var patch = await gitService.Compare(repo, baseSha, headSha, path); if (patch != null) { return(DiffUtilities.ParseFragment(patch).ToList()); } else { return(Array.Empty <DiffChunk>()); } }