private async Task <FileMatrix> BuildMatrix(GetFileMatrix query) { var revisions = await _session.Query <ReviewRevision>() .Where(x => x.ReviewId == query.ReviewId) .OrderBy(x => x.RevisionNumber) .ToListAsync(); var revisionIds = revisions.Select(x => (RevisionId) new RevisionId.Selected(x.RevisionNumber)); var mergeRequest = await _api.GetMergeRequestInfo(query.ReviewId.ProjectId, query.ReviewId.ReviewId); var hasProvisional = !revisions.Any() || mergeRequest.HeadCommit != revisions.Last().HeadCommit; if (hasProvisional) { revisionIds = revisionIds.Union(new RevisionId.Hash(mergeRequest.HeadCommit)); } var fileHistoryEntries = await _session.Query <FileHistoryEntry>() .Where(x => x.ReviewId == query.ReviewId) .GroupBy(x => x.FileId) .ToListAsync(); var provisionalDiff = new List <FileDiff>(); if (hasProvisional) { provisionalDiff = await _api.GetDiff(query.ReviewId.ProjectId, revisions.LastOrDefault()?.HeadCommit ?? mergeRequest.BaseCommit, mergeRequest.HeadCommit); if (_features.For("dont-show-excesive-files-from-rebases").IsActive) { if (revisions.Any() && revisions.Last().HeadCommit != mergeRequest.HeadCommit) { provisionalDiff = (await RelevantFilesFilter.Filter(provisionalDiff, fileHistoryEntries, query.ReviewId, mergeRequest.BaseCommit, mergeRequest.HeadCommit, _api)).ToList(); } } } var remainingDiffs = new HashSet <FileDiff>(provisionalDiff); var matrix = new FileMatrix(revisionIds); var revisionsMap = revisions.ToDictionary(x => (Guid?)x.Id); foreach (var(fileId, history) in fileHistoryEntries) { var sortedHistory = history .OrderBy(x => x.RevisionId.HasValue ? revisionsMap[x.RevisionId].RevisionNumber : int.MinValue); FileHistoryEntry previousEntry = null; foreach (var entry in sortedHistory) { if (entry.RevisionId == null) { previousEntry = entry; continue; } var rev = revisionsMap[entry.RevisionId]; string oldPath = previousEntry?.FileName ?? entry.FileName; var path = PathPair.Make(oldPath, entry.FileName); matrix.Append(new RevisionId.Selected(rev.RevisionNumber), path, entry); previousEntry = entry; } if (hasProvisional) { var diff = remainingDiffs.SingleOrDefault(x => x.Path.OldPath == previousEntry.FileName); remainingDiffs.Remove(diff); if (diff != null) { matrix.Append(new RevisionId.Hash(mergeRequest.HeadCommit), diff.Path, new FileHistoryEntry { FileId = fileId, FileName = diff.Path.NewPath, IsNew = diff.NewFile, IsDeleted = diff.DeletedFile, IsModified = true, IsRenamed = diff.RenamedFile }); } } } foreach (var diff in remainingDiffs) { matrix.Append(new RevisionId.Hash(mergeRequest.HeadCommit), diff.Path, new FileHistoryEntry { FileId = Guid.Empty, FileName = diff.Path.NewPath, IsNew = diff.NewFile, IsDeleted = diff.DeletedFile, IsModified = true, IsRenamed = diff.RenamedFile }); } matrix.TMP_FillFullRangeFilePath(); matrix.FillUnchanged(); matrix.Sort(DelegateComparer.For((FileMatrix.Entry e) => e.File.NewPath)); return(matrix); }
public Entry(RevisionId[] revisionsOrder) { _revisionsOrder = revisionsOrder; Revisions = new SortedDictionary <RevisionId, Status>(DelegateComparer.For((RevisionId r) => _revisionsOrder.IndexOf(r))); }