Exemplo n.º 1
0
        public void Test(CommentSet set)
        {
            var trackedLine = CommentTracker.Track(set.CommentVersion, set.Right, set.CommentLine);

            Assert.That(trackedLine, Is.EqualTo(set.ExpectedCommentLineOnRight), "Comment should be tracked to correct line");
        }
            public async Task <Result> Execute(GetDiffDiscussions query)
            {
                if (query.FileId.IsProvisional)
                {
                    return(new Result
                    {
                        Remapped = new List <RemappedDiscussion>()
                    });
                }

                var headRevision = _session.Query <ReviewRevision>().Where(x => x.ReviewId == query.ReviewId && x.HeadCommit == query.Commits.CurrentHead).FirstOrDefault();

                var q = from discussion in _session.Query <FileDiscussion>()
                        join revision in _session.Query <ReviewRevision>() on discussion.RevisionId equals revision.Id
                        where revision.ReviewId == query.ReviewId
                        where discussion.FileId == query.FileId.PersistentId
                        select new
                {
                    DiscussionId = discussion.Id,
                    RevisionId   = revision.Id,
                    RevisionNo   = revision.RevisionNumber,
                    RevisionHead = revision.HeadCommit,
                    RevisionBase = revision.BaseCommit,
                    Line         = discussion.LineNumber,
                    Comment      = discussion.RootComment.Content
                };

                if (headRevision != null)
                {
                    q = q.Where(x => x.RevisionNo <= headRevision.RevisionNumber);
                }

                var discussions = q.ToList();

                var remapped = new List <RemappedDiscussion>();

                foreach (var discussion in discussions)
                {
                    // is left?
                    if (discussion.RevisionBase == query.Commits.PreviousBase && discussion.RevisionHead == query.Commits.PreviousHead)
                    {
                        remapped.Add(RemappedDiscussion.ForSide("left", discussion.DiscussionId, discussion.Line, discussion.Comment));
                        continue;
                    }

                    // is right?
                    if (discussion.RevisionBase == query.Commits.CurrentBase && discussion.RevisionHead == query.Commits.CurrentHead)
                    {
                        remapped.Add(RemappedDiscussion.ForSide("right", discussion.DiscussionId, discussion.Line, discussion.Comment));
                        continue;
                    }

                    // remap
                    var    commentFileName = FindFileNameForRevision(query.FileId.PersistentId, discussion.RevisionId);
                    string rightFileName;
                    if (headRevision != null)
                    {
                        rightFileName = FindFileNameForCommit(query.FileId.PersistentId, query.Commits.CurrentHead);
                    }
                    else
                    {
                        rightFileName = query.RightFileName;
                    }

                    var commentContent = await _api.GetFileContent(query.ReviewId.ProjectId, discussion.RevisionHead, commentFileName).Then(x => x.DecodeString());

                    var rightContent = await _api.GetFileContent(query.ReviewId.ProjectId, query.Commits.CurrentHead, rightFileName).Then(x => x.DecodeString());

                    var trackedLine = CommentTracker.Track(commentContent, rightContent, discussion.Line);

                    remapped.Add(new RemappedDiscussion
                    {
                        DiscussionId  = discussion.DiscussionId,
                        LineNumber    = trackedLine,
                        OldLineNumber = discussion.Line,
                        Side          = "right",
                        Comment       = discussion.Comment
                    });
                }

                return(new Result
                {
                    Remapped = remapped,
                });
            }