/// <inheritdoc /> public async Task <AutoMergeStatus> EvaluateFor(PullRequest pullRequest, CancellationToken cancellationToken) { if (pullRequest == null) { throw new ArgumentNullException(nameof(pullRequest)); } var labels = await gitHubManager.GetIssueLabels(pullRequest.Number).ConfigureAwait(false); var result = new AutoMergeStatus { RequiredProgress = 2, Progress = 2 }; foreach (var I in labels) { void CheckLabelDeny(string label) { if (I.Name == label) { --result.Progress; result.Notes.Add(stringLocalizer["LabelDeny", label]); } }; CheckLabelDeny("Work In Progress"); CheckLabelDeny("Do Not Merge"); } return(result); }
/// <inheritdoc /> public async Task <AutoMergeStatus> EvaluateFor(PullRequest pullRequest, CancellationToken cancellationToken) { if (pullRequest == null) { throw new ArgumentNullException(nameof(pullRequest)); } var setRequired = await dataStore.ReadData <RequireChangelogEntry>(pullRequest.Number.ToString(), cancellationToken).ConfigureAwait(false); if (!setRequired.Required.HasValue) { setRequired.Required = generalConfiguration.DefaultChangelogRequired; } var changelog = Changelog.GetChangelog(pullRequest, out bool malformed); var result = new AutoMergeStatus { FailStatusReport = true, RequiredProgress = 2, //setRequired.Required.Value || malformed ? 1 : 0, //TODO:maintainer_can_modify field Progress = (changelog != null ? 1 : 0) }; if (result.Progress < result.RequiredProgress || malformed) { result.Notes.Add(stringLocalizer[malformed ? "ChangelogMalformed" : "NeedsChangelog"]); } return(result); }
/// <inheritdoc /> public async Task <AutoMergeStatus> EvaluateFor(PullRequest pullRequest, CancellationToken cancellationToken) { if (pullRequest == null) { throw new ArgumentNullException(nameof(pullRequest)); } var required = await GetRequired(pullRequest, cancellationToken).ConfigureAwait(false); var changelog = Models.Changelog.GetChangelog(pullRequest, out bool malformed); var result = new AutoMergeStatus { FailStatusReport = true, RequiredProgress = (required.Required.HasValue && required.Required.Value) || malformed ? 1 : 0, //TODO:maintainer_can_modify field Progress = changelog != null ? 1 : 0 }; if (malformed) { result.Notes.Add(stringLocalizer["ChangelogMalformed"]); } else if (required.Required.HasValue) { if (!required.Required.Value) { result.Notes.Add(stringLocalizer["NoChangelogRequired"]); } else { result.Notes.Add(stringLocalizer["ChangelogRequested"]); } } else if (generalConfiguration.DefaultChangelogRequired) { result.Notes.Add(stringLocalizer["NeedsChangelog"]); } return(result); }
/// <inheritdoc /> public async Task <AutoMergeStatus> EvaluateFor(PullRequest pullRequest, CancellationToken cancellationToken) { var labelsTask = gitHubManager.GetIssueLabels(pullRequest.Number); var userGBP = await dataStore.ReadData <GoodBoyPointsEntry>(pullRequest.User.Login, cancellationToken).ConfigureAwait(false); var passed = userGBP.Points >= 0; var result = new AutoMergeStatus { FailStatusReport = true, Progress = userGBP.Points, RequiredProgress = 0 }; if (!passed) { result.Notes.Add(stringLocalizer["InsufficientGBP"]); } var newGBP = AdjustGBP(userGBP, await labelsTask.ConfigureAwait(false)); result.Notes.Add(stringLocalizer["GBPResult", newGBP.Points - userGBP.Points, newGBP.Points]); return(result); }
/// <inheritdoc /> public async Task <AutoMergeStatus> EvaluateFor(PullRequest pullRequest, CancellationToken cancellationToken) { if (pullRequest == null) { throw new ArgumentNullException(nameof(pullRequest)); } var signOff = await dataStore.ReadData <PullRequestSignOff>(pullRequest.Number.ToString(CultureInfo.InvariantCulture), cancellationToken).ConfigureAwait(false); var result = new AutoMergeStatus() { RequiredProgress = 1, Progress = signOff.AccessToken != null ? 1 : 0, MergerAccessToken = signOff.AccessToken }; if (signOff.AccessToken != null) { var user = await gitHubManager.GetUserLogin(signOff.AccessToken, cancellationToken).ConfigureAwait(false); result.Notes.Add(stringLocalizer["Signer", user.Login]); } return(result); }
/// <inheritdoc /> public async Task <AutoMergeStatus> EvaluateFor(PullRequest pullRequest, CancellationToken cancellationToken) { if (pullRequest == null) { throw new ArgumentNullException(nameof(pullRequest)); } var signOff = await dataStore.ReadData <PullRequestSignOffs>(SignOffDataKey, cancellationToken).ConfigureAwait(false); var result = new AutoMergeStatus() { RequiredProgress = 1 }; if (signOff.Entries.TryGetValue(pullRequest.Number, out List <string> signers) && signers.Count > 0) { result.Progress = signers.Count; result.Notes.AddRange(signers.Select(x => (string)stringLocalizer["Signer", x])); } else { result.Notes.Add(stringLocalizer["NoSignOffs"]); } return(result); }
/// <inheritdoc /> public async Task <AutoMergeStatus> EvaluateFor(PullRequest pullRequest, CancellationToken cancellationToken) { if (gitHubManager == null) { throw new InvalidOperationException("Configure() wasn't called!"); } var reviews = await gitHubManager.GetPullRequestReviews(pullRequest).ConfigureAwait(false); var approvers = new List <User>(); var critics = new List <User>(); var userCheckups = new Dictionary <string, Task <bool> >(); foreach (var I in reviews) { void CheckupUser() { if (!userCheckups.ContainsKey(I.User.Login)) { userCheckups.Add(I.User.Login, gitHubManager.UserHasWriteAccess(I.User)); } } if (I.State.Value == PullRequestReviewState.Approved) { critics.RemoveAll(x => x.Id == I.User.Id); approvers.Add(I.User); CheckupUser(); } else if (I.State.Value == PullRequestReviewState.ChangesRequested) { approvers.RemoveAll(x => x.Id == I.User.Id); critics.Add(I.User); CheckupUser(); } } var result = new AutoMergeStatus(); await Task.WhenAll(userCheckups.Select(x => x.Value)).ConfigureAwait(false); foreach (var I in approvers) { if (!userCheckups[I.Login].Result) { continue; } ++result.Progress; result.Notes.Add(stringLocalizer["ApprovedBy", I.Login]); } if (result.Progress == 0) { result.Notes.Add(stringLocalizer["NoApproval"]); } result.RequiredProgress = result.Progress; foreach (var I in critics) { if (!userCheckups[I.Login].Result) { continue; } ++result.RequiredProgress; result.Notes.Add(stringLocalizer["RequestedChanges", I.Login]); } result.RequiredProgress = Math.Max(result.RequiredProgress, 1); return(result); }