/// <summary>
        /// Compares IInternalCache objects
        /// </summary>
        internal IEnumerable <UserEvents.MergeRequestEvent> CheckForUpdates(
            IInternalCache oldDetails, IInternalCache newDetails)
        {
            TwoListDifference <MergeRequestWithProject> diff = getMergeRequestDiff(oldDetails, newDetails);

            return(getMergeRequestUpdates(diff, oldDetails, newDetails));
        }
예제 #2
0
        /// <summary>
        /// Calculate difference between two WorkflowDetails objects
        /// </summary>
        private TwoListDifference <MergeRequest> getMergeRequestDiff(string hostname,
                                                                     List <Project> enabledProjects, IWorkflowDetails oldDetails, IWorkflowDetails newDetails)
        {
            TwoListDifference <MergeRequest> diff = new TwoListDifference <MergeRequest>
            {
                FirstOnly  = new List <MergeRequest>(),
                SecondOnly = new List <MergeRequest>(),
                Common     = new List <MergeRequest>()
            };

            foreach (var project in enabledProjects)
            {
                ProjectKey key = new ProjectKey {
                    HostName = hostname, ProjectId = project.Id
                };
                List <MergeRequest> previouslyCachedMergeRequests = oldDetails.GetMergeRequests(key);
                List <MergeRequest> newCachedMergeRequests        = newDetails.GetMergeRequests(key);

                diff.FirstOnly.AddRange(previouslyCachedMergeRequests.Except(newCachedMergeRequests).ToList());
                diff.SecondOnly.AddRange(newCachedMergeRequests.Except(previouslyCachedMergeRequests).ToList());
                diff.Common.AddRange(previouslyCachedMergeRequests.Intersect(newCachedMergeRequests).ToList());
            }

            return(diff);
        }
예제 #3
0
        /// <summary>
        /// Process a timer event
        /// </summary>
        internal MergeRequestUpdates CheckForUpdates(string hostname, List <Project> enabledProjects,
                                                     IWorkflowDetails oldDetails, IWorkflowDetails newDetails)
        {
            TwoListDifference <MergeRequest> diff = getMergeRequestDiff(hostname, enabledProjects, oldDetails, newDetails);

            return(getMergeRequestUpdates(diff, oldDetails, newDetails));
        }
        /// <summary>
        /// Calculate difference between two IInternalCache objects
        /// </summary>
        private TwoListDifference <MergeRequestWithProject> getMergeRequestDiff(
            IInternalCache oldDetails, IInternalCache newDetails)
        {
            TwoListDifference <MergeRequestWithProject> diff = new TwoListDifference <MergeRequestWithProject>
                                                               (
                new List <MergeRequestWithProject>(),
                new List <MergeRequestWithProject>(),
                new List <Tuple <MergeRequestWithProject, MergeRequestWithProject> >()
                                                               );

            HashSet <ProjectKey> projectKeys = oldDetails.GetProjects().Concat(newDetails.GetProjects()).ToHashSet();

            foreach (ProjectKey projectKey in projectKeys)
            {
                MergeRequest[] previouslyCachedMergeRequests = oldDetails.GetMergeRequests(projectKey).ToArray();
                MergeRequest[] newCachedMergeRequests        = newDetails.GetMergeRequests(projectKey).ToArray();

                Array.Sort(previouslyCachedMergeRequests, (x, y) => x.Id.CompareTo(y.Id));
                Array.Sort(newCachedMergeRequests, (x, y) => x.Id.CompareTo(y.Id));

                int iPrevMR = 0, iNewMR = 0;
                while (iPrevMR < previouslyCachedMergeRequests.Count() && iNewMR < newCachedMergeRequests.Count())
                {
                    if (previouslyCachedMergeRequests[iPrevMR].Id < newCachedMergeRequests[iNewMR].Id)
                    {
                        diff.FirstOnly.Add(new MergeRequestWithProject(previouslyCachedMergeRequests[iPrevMR], projectKey));
                        ++iPrevMR;
                    }
                    else if (previouslyCachedMergeRequests[iPrevMR].Id == newCachedMergeRequests[iNewMR].Id)
                    {
                        diff.Common.Add(new Tuple <MergeRequestWithProject, MergeRequestWithProject>(
                                            new MergeRequestWithProject(previouslyCachedMergeRequests[iPrevMR], projectKey),
                                            new MergeRequestWithProject(newCachedMergeRequests[iNewMR], projectKey)));
                        ++iPrevMR;
                        ++iNewMR;
                    }
                    else
                    {
                        diff.SecondOnly.Add(new MergeRequestWithProject(newCachedMergeRequests[iNewMR], projectKey));
                        ++iNewMR;
                    }
                }

                while (iPrevMR < previouslyCachedMergeRequests.Count())
                {
                    diff.FirstOnly.Add(new MergeRequestWithProject(previouslyCachedMergeRequests[iPrevMR], projectKey));
                    ++iPrevMR;
                }

                while (iNewMR < newCachedMergeRequests.Count())
                {
                    diff.SecondOnly.Add(new MergeRequestWithProject(newCachedMergeRequests[iNewMR], projectKey));
                    ++iNewMR;
                }
            }

            return(diff);
        }
        /// <summary>
        /// Convert a difference between two states into a list of merge request updates splitted in new/updated/closed
        /// </summary>
        private IEnumerable <UserEvents.MergeRequestEvent> getMergeRequestUpdates(
            TwoListDifference <MergeRequestWithProject> diff, IInternalCache oldDetails, IInternalCache newDetails)
        {
            List <UserEvents.MergeRequestEvent> updates = new List <UserEvents.MergeRequestEvent>();

            foreach (MergeRequestWithProject mergeRequest in diff.SecondOnly)
            {
                FullMergeRequestKey fmk = new FullMergeRequestKey(mergeRequest.Project, mergeRequest.MergeRequest);

                updates.Add(new UserEvents.MergeRequestEvent(
                                fmk, UserEvents.MergeRequestEvent.Type.AddedMergeRequest, null));
            }

            foreach (MergeRequestWithProject mergeRequest in diff.FirstOnly)
            {
                FullMergeRequestKey fmk = new FullMergeRequestKey(mergeRequest.Project, mergeRequest.MergeRequest);

                updates.Add(new UserEvents.MergeRequestEvent(
                                fmk, UserEvents.MergeRequestEvent.Type.RemovedMergeRequest, null));
            }

            foreach (Tuple <MergeRequestWithProject, MergeRequestWithProject> mrPair in diff.Common)
            {
                MergeRequest mergeRequest1 = mrPair.Item1.MergeRequest;
                MergeRequest mergeRequest2 = mrPair.Item2.MergeRequest;
                Debug.Assert(mergeRequest1.Id == mergeRequest2.Id);

                MergeRequestKey mergeRequestKey = new MergeRequestKey(mrPair.Item2.Project, mergeRequest2.IId);

                IEnumerable <Version> oldVersions = oldDetails.GetVersions(mergeRequestKey);
                IEnumerable <Version> newVersions = newDetails.GetVersions(mergeRequestKey);

                bool labelsUpdated  = !Enumerable.SequenceEqual(mergeRequest1.Labels, mergeRequest2.Labels);
                bool commitsUpdated = newVersions.Count() > oldVersions.Count();

                MergeRequestApprovalConfiguration oldApprovals = oldDetails.GetApprovals(mergeRequestKey);
                MergeRequestApprovalConfiguration newApprovals = newDetails.GetApprovals(mergeRequestKey);
                bool detailsUpdated = areMergeRequestsDifferentInDetails(mergeRequest1, mergeRequest2) ||
                                      areApprovalsDifferent(oldApprovals, newApprovals);

                if (labelsUpdated || commitsUpdated || detailsUpdated)
                {
                    FullMergeRequestKey fmk = new FullMergeRequestKey(
                        mergeRequestKey.ProjectKey, mergeRequest2);

                    updates.Add(new UserEvents.MergeRequestEvent(
                                    fmk, UserEvents.MergeRequestEvent.Type.UpdatedMergeRequest,
                                    new UserEvents.MergeRequestEvent.UpdateScope(commitsUpdated, labelsUpdated, detailsUpdated)));
                }
            }

            return(updates);
        }
예제 #6
0
        /// <summary>
        /// Convert a difference between two states into a list of merge request updates splitted in new/updated/closed
        /// </summary>
        private MergeRequestUpdates getMergeRequestUpdates(
            TwoListDifference <MergeRequest> diff, IWorkflowDetails oldDetails, IWorkflowDetails newDetails)
        {
            MergeRequestUpdates updates = new MergeRequestUpdates
            {
                NewMergeRequests     = diff.SecondOnly,
                UpdatedMergeRequests = new List <MergeRequest>(), // will be filled in below
                ClosedMergeRequests  = diff.FirstOnly
            };

            foreach (MergeRequest mergeRequest in diff.Common)
            {
                DateTime previouslyCachedChangeTimestamp = oldDetails.GetLatestChangeTimestamp(mergeRequest.Id);
                DateTime newCachedChangeTimestamp        = newDetails.GetLatestChangeTimestamp(mergeRequest.Id);

                if (newCachedChangeTimestamp > previouslyCachedChangeTimestamp)
                {
                    updates.UpdatedMergeRequests.Add(mergeRequest);
                }
            }

            return(updates);
        }