public override async Task Check(Repository repo) { var message = UPDATE; var settings = RepoSettingsFor(repo.Name); var update = new RepoUpdate { Name = repo.Name, DefaultBranch = repo.DefaultBranch }; if (await ShouldSetStrict(settings, repo)) { if (!message.Equals(UPDATE)) { message += " and "; } message += "will remove strict reviewers"; update.UpdateStrictReviews = true; } if (await ShouldSetReviewers(settings, update, repo)) { if (!message.Equals(UPDATE)) { message += " and "; } message += "will set "; var changes = new List <string>(); if (update.UpdateReviewers) { changes.Add($"required reviewers to {settings.Reviewers}"); } if (update.UpdateRequireOwners) { changes.Add($"require codeowners to {settings.RequireCodeOwnerReviews}"); } if (update.UpdateDismissStale) { changes.Add($"dismiss state reviews to {settings.DismissStaleReviews}"); } message += string.Join(',', changes); } if (message.Equals(UPDATE)) { l($"[OK] {repo.Name} already has {repo.DefaultBranch} branch protection with the number of reviewers {settings.Reviewers}, {(settings.RequireStrictReviews ? "non-" : string.Empty)}strict and {(settings.RequireCodeOwnerReviews ? "should " : "shouldn\'t") }code owners reviews", 1); } else { l($"{message} on {repo.Name}", 1); Change.Add(update); } }
private async Task <bool> ShouldSetReviewers(IRepositorySettings settings, RepoUpdate update, Repository repo) { try { var requiredReviewers = await Client.Repository.Branch.GetBranchProtection(Config.Github.Org, repo.Name, repo.DefaultBranch); // If nothing is set up we'll get nulls back, and then we should just set everything up. if (requiredReviewers?.RequiredPullRequestReviews == null) { // We don't super need the excpetion here, but we need to set some values on the // update object. So we throw this exception and catch it below, and only set // the properties there. throw new Octokit.NotFoundException("not found", HttpStatusCode.NotFound); } // If we do have things setup, we should make sure they are setup the way we specified. else { // Does not have the required amount of reviewers? update.UpdateReviewers = requiredReviewers.RequiredPullRequestReviews.RequiredApprovingReviewCount < settings.Reviewers; // Is is set to stale? update.UpdateDismissStale = requiredReviewers.RequiredPullRequestReviews.DismissStaleReviews != settings.DismissStaleReviews; // Check if code owners are required to review a PR update.UpdateRequireOwners = requiredReviewers.RequiredPullRequestReviews.RequireCodeOwnerReviews != settings.RequireCodeOwnerReviews; } } catch (Octokit.NotFoundException) { // this usually means that it's a new repo, and we have to set it up update.UpdateDismissStale = true; update.UpdateRequireOwners = true; update.UpdateStrictReviews = true; update.UpdateReviewers = true; } return(update.UpdateReviewers || update.UpdateDismissStale || update.UpdateRequireOwners); }