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}")); }
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."); } }
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); }