示例#1
0
            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);
            }
示例#2
0
            public Entry(RevisionId[] revisionsOrder)
            {
                _revisionsOrder = revisionsOrder;

                Revisions = new SortedDictionary <RevisionId, Status>(DelegateComparer.For((RevisionId r) => _revisionsOrder.IndexOf(r)));
            }