コード例 #1
0
 async Task UpdateLiveFile(PullRequestSessionLiveFile file, ITextSnapshot snapshot)
 {
     if (file.TextBuffer.CurrentSnapshot == snapshot)
     {
         await UpdateLiveFile(file, false);
     }
 }
コード例 #2
0
        async Task UpdateLiveFile(PullRequestSessionLiveFile file, bool rebuildThreads)
        {
            var session = CurrentSession;

            if (session != null)
            {
                var mergeBase = await session.GetMergeBase();

                var contents = sessionService.GetContents(file.TextBuffer);
                file.BaseSha   = session.PullRequest.BaseRefSha;
                file.CommitSha = await CalculateCommitSha(session, file, contents);

                file.Diff = await sessionService.Diff(
                    session.LocalRepository,
                    mergeBase,
                    session.PullRequest.HeadRefSha,
                    file.RelativePath,
                    contents);

                if (rebuildThreads)
                {
                    file.InlineCommentThreads = sessionService.BuildCommentThreads(
                        session.PullRequest,
                        file.RelativePath,
                        file.Diff,
                        session.PullRequest.HeadRefSha);
                }
                else
                {
                    var changedLines = sessionService.UpdateCommentThreads(
                        file.InlineCommentThreads,
                        file.Diff);

                    if (changedLines.Count > 0)
                    {
                        file.NotifyLinesChanged(changedLines);
                    }
                }

                file.TrackingPoints = BuildTrackingPoints(
                    file.TextBuffer.CurrentSnapshot,
                    file.InlineCommentThreads);
            }
            else
            {
                file.BaseSha              = null;
                file.CommitSha            = null;
                file.Diff                 = null;
                file.InlineCommentThreads = null;
                file.TrackingPoints       = null;
            }
        }
コード例 #3
0
        public async Task <IPullRequestSessionLiveFile> GetLiveFile(
            string relativePath,
            ITextView textView,
            ITextBuffer textBuffer)
        {
            PullRequestSessionLiveFile result;

            if (!textBuffer.Properties.TryGetProperty(
                    typeof(IPullRequestSessionLiveFile),
                    out result))
            {
                var dispose = new CompositeDisposable();

                result = new PullRequestSessionLiveFile(
                    relativePath,
                    textBuffer,
                    sessionService.CreateRebuildSignal());

                textBuffer.Properties.AddProperty(
                    typeof(IPullRequestSessionLiveFile),
                    result);

                await UpdateLiveFile(result, true);

                textBuffer.Changed += TextBufferChanged;
                textView.Closed    += TextViewClosed;

                dispose.Add(Disposable.Create(() =>
                {
                    textView.TextBuffer.Changed -= TextBufferChanged;
                    textView.Closed             -= TextViewClosed;
                }));

                dispose.Add(result.Rebuild.Subscribe(x => UpdateLiveFile(result, x).Forget()));

                dispose.Add(this.WhenAnyValue(x => x.CurrentSession)
                            .Skip(1)
                            .Subscribe(_ => UpdateLiveFile(result, true).Forget()));
                dispose.Add(this.WhenAnyValue(x => x.CurrentSession.PullRequest)
                            .Skip(1)
                            .Subscribe(_ => UpdateLiveFile(result, true).Forget()));

                result.ToDispose = dispose;
            }

            return(result);
        }
コード例 #4
0
        void InvalidateLiveThreads(PullRequestSessionLiveFile file, ITextSnapshot snapshot)
        {
            if (file.TrackingPoints != null)
            {
                var linesChanged = new List <Tuple <int, DiffSide> >();

                foreach (var thread in file.InlineCommentThreads)
                {
                    ITrackingPoint trackingPoint;

                    if (file.TrackingPoints.TryGetValue(thread, out trackingPoint))
                    {
                        var position   = trackingPoint.GetPosition(snapshot);
                        var lineNumber = snapshot.GetLineNumberFromPosition(position);

                        if (thread.DiffLineType != DiffChangeType.Delete && lineNumber != thread.LineNumber)
                        {
                            linesChanged.Add(Tuple.Create(lineNumber, DiffSide.Right));
                            linesChanged.Add(Tuple.Create(thread.LineNumber, DiffSide.Right));
                            thread.LineNumber = lineNumber;
                            thread.IsStale    = true;
                        }
                    }
                }

                linesChanged = linesChanged
                               .Where(x => x.Item1 >= 0)
                               .Distinct()
                               .ToList();

                if (linesChanged.Count > 0)
                {
                    file.NotifyLinesChanged(linesChanged);
                }
            }
        }