async Task UpdateLiveFile(PullRequestSessionLiveFile file, ITextSnapshot snapshot) { if (file.TextBuffer.CurrentSnapshot == snapshot) { await UpdateLiveFile(file, false); } }
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; } }
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); }
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); } } }