예제 #1
0
        private async Task <ActionResult <bool?> > SynchronizePullRequestAsync(string prUrl)
        {
            ConditionalValue <InProgressPullRequest> maybePr =
                await StateManager.TryGetStateAsync <InProgressPullRequest>(PullRequest);

            if (!maybePr.HasValue || maybePr.Value.Url != prUrl)
            {
                return(ActionResult.Create(
                           (bool?)null,
                           $"Not Applicable: Pull Request '{prUrl}' is not tracked by maestro anymore."));
            }

            (string targetRepository, string targetBranch) = await GetTargetAsync();

            IRemote darc = await DarcRemoteFactory.GetRemoteAsync(targetRepository, Logger);

            InProgressPullRequest pr = maybePr.Value;
            PrStatus status          = await darc.GetPullRequestStatusAsync(prUrl);

            ActionResult <bool?> checkPolicyResult = null;

            switch (status)
            {
            case PrStatus.Open:
                checkPolicyResult = await CheckMergePolicyAsync(prUrl, darc);

                if (checkPolicyResult.Result == true)
                {
                    goto case PrStatus.Merged;
                }

                if (checkPolicyResult.Result == false)
                {
                    return(ActionResult.Create((bool?)true, checkPolicyResult.Message));
                }

                return(ActionResult.Create((bool?)false, checkPolicyResult.Message));

            case PrStatus.Merged:
                await UpdateSubscriptionsForMergedPRAsync(pr.ContainedSubscriptions);

                goto case PrStatus.Closed;

            case PrStatus.Closed:
                await StateManager.RemoveStateAsync(PullRequest);

                break;

            default:
                Logger.LogError("Unknown pr status '{status}'", status);
                break;
            }

            if (checkPolicyResult != null)
            {
                return(ActionResult.Create((bool?)null, checkPolicyResult.Message));
            }

            return(ActionResult.Create((bool?)null, $"PR Has been manually {status}"));
        }
예제 #2
0
        private async Task <string> CheckMergePolicyAsyncImpl(string prUrl)
        {
            Subscription subscription = await Context.Subscriptions.FindAsync(SubscriptionId);

            if (subscription == null)
            {
                await Reminders.TryUnregisterReminderAsync(PullRequestCheck);

                await StateManager.TryRemoveStateAsync(PullRequest);

                return("Action Ignored: Subscription does not exist.");
            }

            ConditionalValue <InProgressPullRequest> maybePr =
                await StateManager.TryGetStateAsync <InProgressPullRequest>(PullRequest);

            if (!maybePr.HasValue)
            {
                return("Action Ignored: Pull Request not found.");
            }

            InProgressPullRequest pr = maybePr.Value;
            long installationId      = await Context.GetInstallationId(subscription.TargetRepository);

            IRemote darc = await DarcFactory.CreateAsync(pr.Url, installationId);

            SubscriptionPolicy policy = subscription.PolicyObject;
            PrStatus           status = await darc.GetPullRequestStatusAsync(pr.Url);

            switch (status)
            {
            case PrStatus.Open:
                string result = await CheckMergePolicyInternalAsync(darc, policy.MergePolicies, pr);

                if (result.StartsWith("Merged:"))
                {
                    subscription.LastAppliedBuildId = pr.BuildId;
                    await Context.SaveChangesAsync();

                    await StateManager.RemoveStateAsync(PullRequest);

                    return(result);
                }

                return(result);

            default:
                return("Action Ignored: Pull Request is not Open.");
            }
        }
예제 #3
0
        public async Task SynchronizeInProgressPRAsync()
        {
            Subscription subscription = await Context.Subscriptions.FindAsync(SubscriptionId);

            if (subscription == null)
            {
                await Reminders.TryUnregisterReminderAsync(PullRequestCheck);

                await StateManager.TryRemoveStateAsync(PullRequest);

                return;
            }

            ConditionalValue <InProgressPullRequest> maybePr =
                await StateManager.TryGetStateAsync <InProgressPullRequest>(PullRequest);

            if (maybePr.HasValue)
            {
                InProgressPullRequest pr = maybePr.Value;
                long installationId      = await Context.GetInstallationId(subscription.TargetRepository);

                IRemote darc = await DarcFactory.CreateAsync(pr.Url, installationId);

                MergePolicy policy = subscription.PolicyObject.MergePolicy;
                PrStatus    status = await darc.GetPullRequestStatusAsync(pr.Url);

                switch (status)
                {
                case PrStatus.Open:
                    switch (policy)
                    {
                    case MergePolicy.Never:
                        return;

                    case MergePolicy.BuildSucceeded:
                    case MergePolicy.UnitTestPassed:         // for now both of these cases are the same
                        if (await ShouldMergePrAsync(darc, pr.Url, policy))
                        {
                            await darc.MergePullRequestAsync(pr.Url);

                            goto merged;
                        }

                        return;

                    default:
                        Logger.LogError("Unknown merge policy '{policy}'", policy);
                        return;
                    }

                case PrStatus.Merged:
merged:
                    subscription.LastAppliedBuildId = pr.BuildId;
                    await Context.SaveChangesAsync();

                    goto case PrStatus.Closed;

                case PrStatus.Closed:
                    await StateManager.RemoveStateAsync(PullRequest);

                    break;

                default:
                    Logger.LogError("Unknown pr status '{status}'", status);
                    return;
                }
            }

            await Reminders.TryUnregisterReminderAsync(PullRequestCheck);
        }