/// <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)); }
/// <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); }
/// <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); }
/// <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); }