private static async Task RunAsync(string orgName, string outputFileName, string cacheLocation, string githubToken, string ospoToken, string policyRepo) { var isForExcel = outputFileName == null; var gitHubClient = await GitHubClientFactory.CreateAsync(githubToken); var ospoClient = await OspoClientFactory.CreateAsync(ospoToken); var cachedOrg = await CachedOrg.LoadAsync(gitHubClient, orgName, Console.Out, cacheLocation, forceUpdate : false); var userLinks = await MicrosoftUserLinks.LoadAsync(ospoClient); var context = new PolicyAnalysisContext(cachedOrg, userLinks); var violations = PolicyRunner.Run(context); SaveVioloations(orgName, outputFileName, isForExcel, violations); if (!string.IsNullOrEmpty(policyRepo)) { await FilePolicyViolationsAsync(gitHubClient, orgName, policyRepo, violations); } }
private static async Task RunAsync(string orgName, List <string> repoNames, List <string> teamNames, List <string> userNames, string outputFileName, string cacheLocation) { Console.WriteLine("Loading org data..."); var cachedOrg = await CachedOrg.LoadFromCacheAsync(orgName, cacheLocation); if (cachedOrg == null) { Console.Error.WriteLine("The org wasn't loaded yet or the cache isn't valid anymore."); return; } var repoFilter = CreateRepoFilter(cachedOrg, repoNames); var teamFilter = CreateTeamFilter(cachedOrg, teamNames); var userFilter = CreateUserFilter(cachedOrg, userNames); Console.WriteLine("Loading Microsoft links..."); var ospoClient = await OspoClientFactory.CreateAsync(); var links = await ospoClient.GetAllAsync(); Console.WriteLine("Computing result..."); var emailByUser = new Dictionary <CachedUser, string>(); var nameByUser = new Dictionary <CachedUser, string>(); var microsoftLink = links.ToDictionary(l => l.GitHubInfo.Login); foreach (var user in cachedOrg.Users) { emailByUser[user] = user.Email; nameByUser[user] = user.Name; if (microsoftLink.TryGetValue(user.Login, out var link)) { if (!string.IsNullOrEmpty(link.MicrosoftInfo.EmailAddress)) { emailByUser[user] = link.MicrosoftInfo.EmailAddress; } if (!string.IsNullOrEmpty(link.MicrosoftInfo.PreferredName)) { nameByUser[user] = link.MicrosoftInfo.PreferredName; } } } var isForExcel = outputFileName == null; var csvDocument = new CsvDocument("team", "repo", "user", "user-name", "user-email", "is-microsoft", "change", "repo-admins"); using (var writer = csvDocument.Append()) { foreach (var userAccess in cachedOrg.Collaborators) { var repo = userAccess.Repo; var user = userAccess.User; if (!repoFilter(repo) || !userFilter(user)) { continue; } foreach (var team in cachedOrg.Teams) { if (!teamFilter(team)) { continue; } var whatIfRemoved = userAccess.WhatIfRemovedFromTeam(team); var change = whatIfRemoved.ToString(); if (whatIfRemoved.IsUnchanged) { continue; } var isMicrosoft = microsoftLink.ContainsKey(user.Login) ? "Yes" : "No"; var repoAdmins = repo.GetAdministrators() .Select(u => (Email: emailByUser[u], Name: nameByUser[u])) .Where(t => !string.IsNullOrEmpty(t.Email)) .Select(t => $"{t.Name}<{t.Email}>"); var repoAdminList = string.Join("; ", repoAdmins); writer.WriteHyperlink(team.Url, team.Name, isForExcel); writer.WriteHyperlink(repo.Url, repo.Name, isForExcel); writer.WriteHyperlink(user.Url, user.Login, isForExcel); writer.Write(nameByUser[user]); writer.Write(emailByUser[user]); writer.Write(isMicrosoft); writer.Write(change); writer.Write(repoAdminList); writer.WriteLine(); } } } if (outputFileName != null) { csvDocument.Save(outputFileName); } else { csvDocument.ViewInExcel(); } }