public async Task <IReadOnlyList <IMergePolicy> > BuildMergePoliciesAsync(MergePolicyProperties properties, IPullRequest pr) { string prUrl = pr.Url; MergePolicyProperties standardProperties; if (prUrl.Contains("github.com")) { standardProperties = s_standardGitHubProperties; } else if (prUrl.Contains("dev.azure.com")) { standardProperties = s_standardAzureDevOpsProperties; } else { throw new NotImplementedException("Unknown pr repo url"); } var policies = new List <IMergePolicy>(); policies.AddRange(await new AllChecksSuccessfulMergePolicyBuilder().BuildMergePoliciesAsync(standardProperties, pr)); policies.AddRange(await new NoRequestedChangesMergePolicyBuilder().BuildMergePoliciesAsync(standardProperties, pr)); policies.AddRange(await new DontAutomergeDowngradesMergePolicyBuilder().BuildMergePoliciesAsync(standardProperties, pr)); return(policies); }
static StandardMergePolicyBuilder() { s_standardGitHubProperties = new MergePolicyProperties(new Dictionary <string, JToken> { { MergePolicyConstants.IgnoreChecksMergePolicyPropertyName, new JArray( "WIP", "license/cla", "auto-merge.config.enforce" ) }, }); s_standardAzureDevOpsProperties = new MergePolicyProperties(new Dictionary <string, JToken> { { MergePolicyConstants.IgnoreChecksMergePolicyPropertyName, new JArray( "Comment requirements", "Minimum number of reviewers", "auto-merge.config.enforce", "Work item linking" ) }, }); }
public override async Task EvaluateAsync( IMergePolicyEvaluationContext context, MergePolicyProperties properties) { var ignoreChecks = new HashSet <string>(properties.Get <string[]>("ignoreChecks") ?? Array.Empty <string>()); await EvaluateChecksAsync(context, ignoreChecks); }
public Task <IReadOnlyList <IMergePolicy> > BuildMergePoliciesAsync(MergePolicyProperties properties, IPullRequest pr) { IReadOnlyList <IMergePolicy> policies = new List <IMergePolicy> { new NoRequestedChangesMergePolicy() }; return(Task.FromResult(policies)); }
public Task <IReadOnlyList <IMergePolicy> > BuildMergePoliciesAsync(MergePolicyProperties properties, IPullRequest pr) { IReadOnlyList <IMergePolicy> policies = new List <IMergePolicy> { new DontAutomergeDowngradesMergePolicy() }; return(Task.FromResult(policies)); }
public Task <IReadOnlyList <IMergePolicy> > BuildMergePoliciesAsync(MergePolicyProperties properties, IPullRequest pr) { var ignoreChecks = new HashSet <string>(properties.Get <string[]>("ignoreChecks") ?? Array.Empty <string>()); IReadOnlyList <IMergePolicy> policies = new List <IMergePolicy> { new AllChecksSuccessfulMergePolicy(ignoreChecks) }; return(Task.FromResult(policies)); }
public override async Task EvaluateAsync( IMergePolicyEvaluationContext context, MergePolicyProperties properties) { var ignoreChecks = new HashSet <string>(properties.Get <string[]>("ignoreChecks") ?? Array.Empty <string>()); IEnumerable <Check> checks = await context.Darc.GetPullRequestChecksAsync(context.PullRequestUrl); IEnumerable <Check> notIgnoredChecks = checks.Where(c => !ignoreChecks.Contains(c.Name)); if (!notIgnoredChecks.Any()) { context.Fail("No un-ignored checks."); return; } ILookup <CheckState, Check> statuses = notIgnoredChecks.ToLookup( c => { // unify the check statuses to success, pending, and error switch (c.Status) { case CheckState.Success: case CheckState.Pending: return(c.Status); default: return(CheckState.Error); } }); string ListChecks(CheckState state) { return(string.Join(", ", statuses[state].Select(c => c.Name))); } if (statuses.Contains(CheckState.Error)) { context.Fail($"Unsuccessful checks: {ListChecks(CheckState.Error)}"); return; } if (statuses.Contains(CheckState.Pending)) { context.Pending($"Waiting on checks: {ListChecks(CheckState.Pending)}"); return; } context.Succeed($"Successful checks: {ListChecks(CheckState.Success)}"); }
public override async Task EvaluateAsync( IMergePolicyEvaluationContext context, MergePolicyProperties properties) { var requiredChecks = new HashSet <string>(properties.Get <List <string> >("checks")); Dictionary <string, Check> checks = (await context.Darc.GetPullRequestChecksAsync(context.PullRequestUrl)).ToDictionary(c => c.Name); var missingChecks = new List <string>(); var failedChecks = new List <Check>(); foreach (string requiredCheck in requiredChecks) { if (checks.TryGetValue(requiredCheck, out Check check)) { if (check.Status != CheckState.Success) { failedChecks.Add(check); } } else { missingChecks.Add(requiredCheck); } } if (missingChecks.Count < 1 && failedChecks.Count < 1) { context.Succeed("Required checks passed."); return; } var parts = new List <string>(); if (failedChecks.Any()) { parts.Add($"Unsuccessful checks: {string.Join(", ", failedChecks.Select(c => c.Name))}"); } if (missingChecks.Any()) { parts.Add($"Missing checks: {string.Join(", ", missingChecks)}"); } context.Fail(string.Join("; ", parts)); }
public override Task EvaluateAsync(IMergePolicyEvaluationContext context, MergePolicyProperties properties) { context.Fail("Merge Policy Not Yet Implemented."); return(Task.CompletedTask); }
public override async Task EvaluateAsync(IMergePolicyEvaluationContext context, MergePolicyProperties properties) { IEnumerable <Review> reviews = await context.Darc.GetPullRequestReviewsAsync(context.PullRequestUrl); if (reviews.Any(r => r.Status == ReviewState.ChangesRequested || r.Status == ReviewState.Rejected)) { context.Fail("There are reviews that have requested changes."); } else { context.Succeed("No reviews have requested changes."); } }
public override async Task EvaluateAsync(IMergePolicyEvaluationContext context, MergePolicyProperties properties) { HashSet <string> ignoredChecks = null; string prUrl = context.PullRequest.Url; if (prUrl.Contains("github.com")) { ignoredChecks = standardGithubIgnoredChecks; } else if (prUrl.Contains("dev.azure.com")) { ignoredChecks = standardAzureDevOpsIgnoredChecks; } else { throw new NotImplementedException("Unknown pr repo url"); } await AllChecksSuccessfulMergePolicy.EvaluateChecksAsync(context, ignoredChecks); await NoRequestedChangesMergePolicy.EvaluateReviewAsync(context); DontAutomergeDowngradesMergePolicy.EvaluateDowngrades(context); }
public override async Task EvaluateAsync(IMergePolicyEvaluationContext context, MergePolicyProperties properties) { EvaluateDowngrades(context); await Task.CompletedTask; }
public abstract Task EvaluateAsync(IMergePolicyEvaluationContext context, MergePolicyProperties properties);
public override async Task EvaluateAsync(IMergePolicyEvaluationContext context, MergePolicyProperties properties) { await EvaluateReviewAsync(context); }