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);
        }
示例#2
0
        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()
            });
        }
示例#3
0
 internal ImmutableHashSet <string> GetIgnoredProjectNames()
 {
     return((IgnoredProjects != null)
         ? IgnoredProjects.ToImmutableHashSet()
         : ImmutableHashSet <string> .Empty);
 }
示例#4
0
        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();
        }