internal bool TryGetProjectFilter(out ProjectFilter projectFilter) { projectFilter = default; string language = null; if (Language != null && !ParseHelpers.TryParseLanguage(Language, out language)) { return(false); } if (Projects?.Any() == true && IgnoredProjects?.Any() == true) { Logger.WriteLine($"Cannot specify both '{ParameterNames.Projects}' and '{ParameterNames.IgnoredProjects}'.", Roslynator.Verbosity.Quiet); return(false); } projectFilter = new ProjectFilter(Projects, IgnoredProjects, language); return(true); }
private async Task <SummaryViewModel> GenerateSummary() { List <Project> projects = await ListProjectsAsync().OnAnyThread(); Logger.Info($"Retrieved {projects.Count} projects"); if (ProjectFilter.Any() || IgnoredProjects.Any()) { if (ProjectFilter.Any()) { projects.RemoveAll(project => !ProjectFilter.Contains(project.Key)); } projects.RemoveAll(project => IgnoredProjects.Contains(project.Key)); Logger.Info($"Filtered ignored projects, {projects.Count} remaining"); } List <User> users = await ListUsersAsync().OnAnyThread(); Logger.Info($"Retrieved {users.Count} users"); if (UserFilter.Any() || IgnoredUsers.Any()) { if (UserFilter.Any()) { users.RemoveAll(user => !UserFilter.Contains(user.Key !)); } users.RemoveAll(user => IgnoredUsers.Contains(user.Key)); Logger.Info($"Filtered ignored users, {users.Count} remaining"); } if (!projects.Any() || !users.Any()) { Logger.Warn("Nothing to do"); return(new SummaryViewModel()); } Dictionary <string, UserViewModel> userDetails = new Dictionary <string, UserViewModel>(); foreach (User user in users) { userDetails.Add(user.Key, new UserViewModel(user) { OverdueIssues = await GetOverdueIssuesForUserAsync(user.Key).OnAnyThread() }); } Dictionary <string, HashSet <User> > projectUserMappings = new Dictionary <string, HashSet <User> >(); // User => project foreach (Project project in projects) { foreach (User user in await GetUsersForProjectAsync(project.Key, users).OnAnyThread()) { projectUserMappings.GetOrCreate(project.Key, () => new HashSet <User>()).Add(user); } } foreach (Project project in new List <Project>(projects)) { if (!projectUserMappings.ContainsKey(project.Key) || projectUserMappings[project.Key].Count == 0) { Logger.Warn($"Ignoring project: {project.Key}, project has no users"); projects.Remove(project); } } Dictionary <string, ProjectViewModel> projectDetails = new Dictionary <string, ProjectViewModel>(); foreach (Project project in projects) { projectDetails.Add(project.Key, new ProjectViewModel(project)); } foreach (Issue issue in await GetUnassignedIssuesForProjectAsync(projects).OnAnyThread()) { foreach (User user in projectUserMappings[issue.Project]) { userDetails[user.Key].UnassignedIssues.Add(issue); } projectDetails[issue.Project].UnassignedIssues.Add(issue); } userDetails.RemoveIf(entry => !entry.Value.OverdueIssues.Any() && !entry.Value.UnassignedIssues.Any()); projectDetails.RemoveIf(entry => !entry.Value.UnassignedIssues.Any()); return(new SummaryViewModel() { Users = userDetails.Values.ToList(), Projects = projectDetails.Values.ToList() }); }
internal ImmutableHashSet <string> GetIgnoredProjectNames() { return((IgnoredProjects != null) ? IgnoredProjects.ToImmutableHashSet() : ImmutableHashSet <string> .Empty); }
public async Task ProcessAsync() { Require.NonNullNonEmpty(SonarUrl, "SonarUrl"); Require.NonNullNonEmpty(Token, "Token"); Require.NonNullNonEmpty(SmtpServer, "SmtpServer"); Require.NonNullNonEmpty(SmtpSenderAddress, "SmtpServerAddress"); if (SmtpUsername != null && SmtpPassword != null) { Require.NonNullNonEmpty(SmtpUsername, "SmtpUsername"); Require.NonNullNonEmpty(SmtpPassword, "SmtpPassword"); } Logger.Info($"Sonar URL: {SonarUrl}"); Logger.Info($"Max Issue Date: {MaxCreationDate}"); Logger.Info($"Project filter: {ProjectFilter.ToPrettyString()}, ignored projects: {IgnoredProjects.ToPrettyString()}"); Logger.Info($"User filter: {UserFilter.ToPrettyString()}, ignored users: {IgnoredUsers.ToPrettyString()}"); Logger.Info($"SMTP server: {SmtpServer} ({(SmtpSslEnabled ? "SSL enabled" : "SSL disabled")})"); Logger.Info($"SMTP sender address: {SmtpSenderAddress}"); Logger.Info($"SMTP authentication: {(SmtpUsername != null && SmtpPassword != null ? $"Yes (username: {SmtpUsername})" : "None")}"); Logger.Info($"Recipient filter: {RecipientFilter.ToPrettyString()}, ignored recipients: {IgnoredRecipients.ToPrettyString()}"); Logger.Info($"Summary recipients: {SummaryRecipients.ToPrettyString()}"); SummaryViewModel summary = await GenerateSummary().OnAnyThread(); Logger.Info($"Processing complete, {summary.NumberOfOverdueIssues} issues overdue, {summary.NumberOfUnassignedIssues} issues unassigned, {summary.Users.Count} users to notify, {summary.Projects.Count} projects to notify"); RazorLightEngine razor = new RazorLightEngineBuilder() .UseEmbeddedResourcesProject(typeof(Startup)) // exception without this (or another project type) .UseMemoryCachingProvider() .Build(); SmtpClient smtpClient = new SmtpClient(SmtpServer !); smtpClient.EnableSsl = SmtpSslEnabled; if (SmtpUsername != null && SmtpPassword != null) { smtpClient.Credentials = new NetworkCredential(SmtpUsername, SmtpPassword); } await NotifyUser(summary, razor, smtpClient).OnAnyThread(); await NotifySummary(summary, razor, smtpClient).OnAnyThread(); }