/// <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);
        }
Exemplo n.º 3
0
        /// <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);
        }
Exemplo n.º 5
0
        /// <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);
        }
Exemplo n.º 7
0
        /// <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);
        }