/// <summary> /// Process a timer event /// </summary> async private void onTimer(object sender, System.Timers.ElapsedEventArgs e) { string hostname = Workflow.State.HostName; List <Project> enabledProjects = Workflow.GetProjectsToUpdate(); IWorkflowDetails oldDetails = Cache.Details.Clone(); try { await Cache.UpdateAsync(); } catch (OperatorException ex) { ExceptionHandlers.Handle(ex, "Auto-update failed"); return; } MergeRequestUpdates updates = WorkflowDetailsChecker.CheckForUpdates(hostname, enabledProjects, oldDetails, Cache.Details); ProjectWatcher.ProcessUpdates(updates, Workflow.State.HostName, Cache.Details); Trace.TraceInformation( String.Format("[UpdateManager] Merge Request Updates: New {0}, Updated {1}, Closed {2}", updates.NewMergeRequests.Count, updates.UpdatedMergeRequests.Count, updates.ClosedMergeRequests.Count)); OnUpdate?.Invoke(updates); }
/// <summary> /// Convert passed updates to ProjectUpdates and notify subscribers /// </summary> internal void ProcessUpdates(MergeRequestUpdates updates, string hostname, IWorkflowDetails details) { List <ProjectUpdate> projectUpdates = new List <ProjectUpdate>(); projectUpdates.AddRange(getProjectUpdates(updates.NewMergeRequests, hostname, details)); projectUpdates.AddRange(getProjectUpdates(updates.UpdatedMergeRequests, hostname, details)); if (projectUpdates.Count > 0) { foreach (ProjectUpdate projectUpdate in projectUpdates) { Trace.TraceInformation( String.Format("[ProjectWatcher] Updating project: Host {0}, Name {1}, TimeStamp {2}", projectUpdate.HostName, projectUpdate.ProjectName, projectUpdate.Timestamp.ToLocalTime().ToString())); } OnProjectUpdate?.Invoke(projectUpdates); } }
/// <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); }