Example #1
0
        private static ReviewIdentifier[] FindPotentialMergeRequests(RunArchiverVerb options, ISession session)
        {
            var thresholdDate = options.ThresholdDate;

            ReviewRevision revision = null;
            Review         review   = null;

            var reviewsQuery = session.QueryOver <ReviewRevision>(() => revision).Where(() => revision.ArchiveState == (int)ArchiveState.NotArchived)
                               .JoinEntityAlias(() => review, () => revision.Id == review.RevisionId)
                               .Where(() => review.ReviewedAt < thresholdDate);

            if (options.ProjectId.HasValue)
            {
                reviewsQuery = reviewsQuery.Where(() => revision.ReviewId.ProjectId == options.ProjectId.Value);
            }


            IEnumerable <ReviewIdentifier> idList = reviewsQuery
                                                    .Select(Projections.Distinct(Projections.Property(() => revision.ReviewId)))
                                                    .List <ReviewIdentifier>();


            if (options.BatchSize.HasValue)
            {
                idList = idList.Take(options.BatchSize.Value);
            }

            var mergeRequests = idList.ToArray();

            Console.WriteLine($"Total of {mergeRequests.Length} potential archive merge requests.");

            return(mergeRequests);
        }
 public FillFileHistory(ISessionAdapter sessionAdapter, IRepository api, ReviewRevision currentRevision, FeatureToggle features)
 {
     _sessionAdapter  = sessionAdapter;
     _api             = api;
     _currentRevision = currentRevision;
     _features        = features;
 }
Example #3
0
        async Task ISessionAdapter.Save(ReviewRevision revision)
        {
            if (Revisions.Contains(revision))
            {
                return;
            }

            Assert.That(revision.RevisionNumber, Is.EqualTo(Revisions.Count + 1));

            Revisions.Add(revision);
        }
Example #4
0
 List <FileHistoryEntry> ISessionAdapter.GetFileHistoryEntries(ReviewRevision revision)
 {
     if (FileHistory.TryGetValue(revision, out var history))
     {
         return(history);
     }
     else
     {
         return(new List <FileHistoryEntry>());
     }
 }
Example #5
0
        ReviewRevision ISessionAdapter.GetPreviousRevision(ReviewRevision revision)
        {
            Assert.That(revision, Is.AnyOf(Revisions.OfType <object>().ToArray()));

            if (revision.RevisionNumber == 1)
            {
                return(null);
            }

            return(Revisions.Single(x => x.RevisionNumber == revision.RevisionNumber - 1));
        }
Example #6
0
            public async Task <Paged <Item> > Execute(GetReviewList query)
            {
                var activeMergeRequest = await _repository.MergeRequests(query.Args);

                var projects = await Task.WhenAll(activeMergeRequest.Items.Select(x => x.ProjectId).Distinct().Select(async x => await _repository.Project(x)));

                var reviewIds = activeMergeRequest.Items.Select(x => new ReviewIdentifier(x.ProjectId, x.Id)).ToList();

                ReviewRevision revision = null;

                var reviewIdCriterion = reviewIds.Select(id => Restrictions.And(
                                                             Restrictions.Eq(Projections.Property(() => revision.ReviewId.ProjectId), id.ProjectId),
                                                             Restrictions.Eq(Projections.Property(() => revision.ReviewId.ReviewId), id.ReviewId)
                                                             )).Disjunction();

                Review review      = null;
                var    reviewerFor = _session.QueryOver <ReviewRevision>(() => revision)
                                     .Where(reviewIdCriterion)
                                     .JoinEntityAlias(() => review, () => revision.Id == review.RevisionId)
                                     .Where(() => review.UserId == _currentUser.Id)
                                     .Select(Projections.Distinct(Projections.Property(() => revision.ReviewId)))
                                     .List <ReviewIdentifier>();


                // todo: extend with reviewer-specific information

                var items = (from mr in activeMergeRequest.Items
                             join project in projects on mr.ProjectId equals project.Id
                             let reviewId = new ReviewIdentifier(mr.ProjectId, mr.Id)
                                            select new Item
                {
                    ReviewId = reviewId,
                    Author = mr.Author,
                    Title = mr.Title,
                    Project = $"{project.Namespace}/{project.Name}",
                    WebUrl = mr.WebUrl,
                    SourceBranch = mr.SourceBranch,
                    TargetBranch = mr.TargetBranch,
                    IsCreatedByMe = mr.Author.Username == _currentUser.UserName,
                    AmIReviewer = reviewerFor.Contains(reviewId)
                }
                             ).ToList();

                return(new Paged <Item>
                {
                    Items = items,
                    TotalItems = activeMergeRequest.TotalItems,
                    TotalPages = activeMergeRequest.TotalPages,
                    PerPage = activeMergeRequest.PerPage,
                    Page = activeMergeRequest.Page
                });
            }
Example #7
0
        public async Task <ReviewRevision> Create(ReviewIdentifier reviewId, int number, string baseCommit, string headCommit)
        {
            var revision = new ReviewRevision
            {
                Id             = GuidComb.Generate(),
                ReviewId       = reviewId,
                RevisionNumber = number,
                BaseCommit     = baseCommit,
                HeadCommit     = headCommit
            };

            return(revision);
        }
Example #8
0
        public ReviewRevision MarkRevision(PublishReview.RevisionCommits commits)
        {
            var revision = new ReviewRevision
            {
                BaseCommit     = commits.Base,
                HeadCommit     = commits.Head,
                ReviewId       = ReviewId,
                RevisionNumber = Revisions.Count + 1,
                Id             = Guid.NewGuid()
            };

            Revisions.Add(revision);

            return(revision);
        }
Example #9
0
        private static bool DeleteTag(RunArchiverVerb options, ReviewRevision revision, string tagName, GitLabApi gitLab)
        {
            if (options.DeleteTags)
            {
                try
                {
                    Console.WriteLine($"Deleting {tagName} from project {revision.ReviewId.ProjectId}");
                    gitLab.DeleteRef(revision.ReviewId.ProjectId, tagName).Wait();
                }
                catch (System.AggregateException)
                {
                    Console.WriteLine($"Failed to delete {tagName}");
                    return(false);
                }
            }
            else
            {
                Console.WriteLine($"Would delete {tagName} from project {revision.ReviewId.ProjectId}");
            }

            return(true);
        }
Example #10
0
 public Guid FileIdInRevision(ReviewRevision revision, string fileName)
 {
     return(FileHistory[revision].Single(x => x.FileName == fileName).FileId);
 }
Example #11
0
 private string FileNameInRevision(ReviewRevision revision, Guid fileId)
 {
     return(FileHistory[revision].Single(x => x.FileId == fileId).FileName);
 }
Example #12
0
            public async Task <Result> Execute(GetReviewStatus query)
            {
                var mergeRequest = await _repository.GetMergeRequestInfo(query.ReviewId.ProjectId, query.ReviewId.ReviewId);

                var latestRevision = await _session.Query <ReviewRevision>()
                                     .Where(x => x.ReviewId == query.ReviewId)
                                     .OrderByDescending(x => x.RevisionNumber)
                                     .FirstOrDefaultAsync();

                IList <FileStatus> fileStatuses;
                {
                    Review           review       = null;
                    ReviewRevision   revision     = null;
                    FileReview       file         = null;
                    FileStatus       dto          = null;
                    FileHistoryEntry historyEntry = null;

                    fileStatuses = await _session.QueryOver(() => review)
                                   .JoinEntityAlias(() => revision, () => revision.Id == review.RevisionId)
                                   .JoinAlias(() => review.Files, () => file)
                                   .JoinEntityAlias(() => historyEntry, () => historyEntry.RevisionId == revision.Id && historyEntry.FileId == file.FileId)
                                   .Where(() => revision.ReviewId == query.ReviewId)
                                   .Select(
                        Projections.Property(() => revision.RevisionNumber).WithAlias(() => dto.RevisionNumber),
                        Projections.Property(() => review.UserId).WithAlias(() => dto.ReviewedBy),
                        Projections.Property(() => historyEntry.FileName).WithAlias(() => dto.Path),
                        Projections.Property(() => file.Status).WithAlias(() => dto.Status)
                        )
                                   .TransformUsing(Transformers.AliasToBean <FileStatus>())
                                   .ListAsync <FileStatus>();
                }

                List <DiscussionItem> discussions;

                {
                    var q = from discussion in _session.Query <Discussion>()
                            join revision in _session.Query <ReviewRevision>() on discussion.RevisionId equals revision.Id
                            where revision.ReviewId == query.ReviewId
                            join review in _session.Query <Review>() on discussion.RootComment.PostedInReviewId equals review.Id
                            join author in _session.Query <ReviewUser>() on review.UserId equals author.Id
                            select new DiscussionItem()
                    {
                        Author = author.UserName,
                        State  = discussion.State
                    };

                    discussions = await q.ToListAsync();
                }

                return(new Result
                {
                    Title = mergeRequest.Title,
                    Description = mergeRequest.Description,
                    SourceBranch = mergeRequest.SourceBranch,
                    TargetBranch = mergeRequest.TargetBranch,
                    WebUrl = mergeRequest.WebUrl,
                    MergeRequestState = mergeRequest.State,
                    MergeStatus = mergeRequest.MergeStatus,

                    RevisionForCurrentHead = mergeRequest.HeadCommit == latestRevision?.HeadCommit,
                    LatestRevision = latestRevision?.RevisionNumber,
                    CurrentHead = mergeRequest.HeadCommit,
                    CurrentBase = mergeRequest.BaseCommit,
                    FileStatuses = fileStatuses,
                    FileSummary = fileStatuses
                                  .GroupBy(x => x.Path)
                                  .ToDictionary(x => x.Key, x => (object)new
                    {
                        ReviewedAt = x.Where(r => r.Status == FileReviewStatus.Reviewed).Select(r => r.RevisionNumber),
                        ReviewedBy = x.Where(r => r.Status == FileReviewStatus.Reviewed).Select(r => r.ReviewedBy)
                    }),
                    UnresolvedDiscussions = discussions.Count(x => x.State == CommentState.NeedsResolution),
                    ResolvedDiscussions = discussions.Count(x => x.State == CommentState.Resolved),
                    Discussions = discussions,
                    Author = mergeRequest.Author,
                });
            }