コード例 #1
0
        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);
        }
コード例 #2
0
        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"
                        )
                },
            });
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        public Task <IReadOnlyList <IMergePolicy> > BuildMergePoliciesAsync(MergePolicyProperties properties, IPullRequest pr)
        {
            IReadOnlyList <IMergePolicy> policies = new List <IMergePolicy> {
                new NoRequestedChangesMergePolicy()
            };

            return(Task.FromResult(policies));
        }
コード例 #5
0
        public Task <IReadOnlyList <IMergePolicy> > BuildMergePoliciesAsync(MergePolicyProperties properties, IPullRequest pr)
        {
            IReadOnlyList <IMergePolicy> policies = new List <IMergePolicy> {
                new DontAutomergeDowngradesMergePolicy()
            };

            return(Task.FromResult(policies));
        }
コード例 #6
0
        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));
        }
コード例 #7
0
        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));
        }
コード例 #9
0
 public override Task EvaluateAsync(IMergePolicyEvaluationContext context, MergePolicyProperties properties)
 {
     context.Fail("Merge Policy Not Yet Implemented.");
     return(Task.CompletedTask);
 }
コード例 #10
0
        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.");
            }
        }
コード例 #11
0
        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);
        }
コード例 #12
0
 public override async Task EvaluateAsync(IMergePolicyEvaluationContext context, MergePolicyProperties properties)
 {
     EvaluateDowngrades(context);
     await Task.CompletedTask;
 }
コード例 #13
0
 public abstract Task EvaluateAsync(IMergePolicyEvaluationContext context, MergePolicyProperties properties);
コード例 #14
0
 public override async Task EvaluateAsync(IMergePolicyEvaluationContext context, MergePolicyProperties properties)
 {
     await EvaluateReviewAsync(context);
 }