/// <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()));
        }
Esempio n. 3
0
@@ -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);
            }
Esempio n. 4
0
            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);
            }
Esempio n. 5
0
            public void FirstChunk_CheckDiffLineZeroBased()
            {
                var expectDiffLine = 0;
                var header         = "@@ -1 +1 @@";

                var chunk = DiffUtilities.ParseFragment(header).First();

                Assert.Equal(expectDiffLine, chunk.DiffLine);
            }
Esempio n. 6
0
            public void NoLineMatchesFromNoLines()
            {
                var chunks = new DiffChunk[0];
                var lines  = new DiffLine[0];

                var line = DiffUtilities.Match(chunks, lines);

                Assert.Null(line);
            }
Esempio n. 7
0
            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);
            }
Esempio n. 8
0
            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);
            }
Esempio n. 11
0
            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);
            }
Esempio n. 12
0
            public void HeaderOnly_OneChunkNoLines(string header)
            {
                var chunks = DiffUtilities.ParseFragment(header);

                Assert.Single(chunks);
                var chunk = chunks.First();

                Assert.Empty(chunk.Lines);
            }
Esempio n. 13
0
        /// <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());
        }
Esempio n. 14
0
            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);
            }
Esempio n. 15
0
            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);
            }
Esempio n. 16
0
        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());
        }
Esempio n. 17
0
            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);
            }
Esempio n. 18
0
            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);
            }
Esempio n. 19
0
            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);
            }
Esempio n. 20
0
            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);
            }
Esempio n. 21
0
        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()));
        }
Esempio n. 22
0
            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);
            }
Esempio n. 23
0
        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()));
        }
Esempio n. 24
0
            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());
            }
Esempio n. 25
0
            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);
        }
Esempio n. 27
0
            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);
            }
Esempio n. 28
0
            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);
            }
Esempio n. 29
0
            [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);
            }
Esempio n. 30
0
        /// <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>());
            }
        }