Ejemplo n.º 1
0
        private async Task UpdatePullRequestDetails(IGitHubActor ghc, long forUserId, DataUpdater updater)
        {
            // Sadly, the PR info doesn't contain labels 😭
            var prResponse = await ghc.PullRequest(_repoFullName, _issueNumber, _prMetadata, RequestPriority.Interactive);

            if (prResponse.IsOk)
            {
                var pr = prResponse.Result;
                _prId                    = pr.Id; // Issues can become PRs
                _prHeadSha               = pr.Head.Sha;
                _prBaseBranch            = pr.Base.Ref;
                _prMergeableStateBlocked = pr.MergeableState == "blocked";

                await updater.UpdatePullRequests(_repoId, prResponse.Date, new[] { prResponse.Result });
            }
            _prMetadata = GitHubMetadata.FromResponse(prResponse);

            // Branch Protection
            if (_prMergeableStateBlocked && _prBaseBranch != null)
            {
                _grainFactory.GetGrain <IRepositoryActor>(_repoId).SyncProtectedBranch(_prBaseBranch, forUserId).LogFailure();
            }
        }
Ejemplo n.º 2
0
        private async Task LookupEventSourceDetails(IGitHubActor ghc, HashSet <gm.Account> accounts, IEnumerable <gm.IssueEvent> events)
        {
            string sourceUrl(gm.IssueEvent e)
            {
                return(e.Source?.Url ?? e.Source?.Issue?.Url);
            }

            var withSources = events.Where(x => sourceUrl(x) != null).ToArray();
            var sources     = withSources.Select(x => sourceUrl(x)).Distinct().ToArray();

            if (sources.Any())
            {
                var sourceLookups = sources
                                    .Select(x => {
                    var parts    = x.Split('/');
                    var numParts = parts.Length;
                    var repoName = parts[numParts - 4] + "/" + parts[numParts - 3];
                    var issueNum = int.Parse(parts[numParts - 1]);
                    return(new {
                        Id = x,
                        Task = ghc.Issue(repoName, issueNum, priority: RequestPriority.Interactive),
                    });
                })
                                    .ToDictionary(x => x.Id, x => x.Task);

                await Task.WhenAll(sourceLookups.Values);

                var prLookups = sourceLookups.Values
                                .Where(x => x.Result.Result.PullRequest != null)
                                .Select(x => {
                    var url      = x.Result.Result.PullRequest.Url;
                    var parts    = url.Split('/');
                    var numParts = parts.Length;
                    var repoName = parts[numParts - 4] + "/" + parts[numParts - 3];
                    var prNum    = int.Parse(parts[numParts - 1]);
                    return(new {
                        Id = url,
                        Task = ghc.PullRequest(repoName, prNum, priority: RequestPriority.Interactive),
                    });
                })
                                .ToDictionary(x => x.Id, x => x.Task);

                await Task.WhenAll(prLookups.Values);

                foreach (var item in withSources)
                {
                    var refIssue = sourceLookups[sourceUrl(item)].Result.Result;
                    accounts.Add(item.Source.Actor);
                    if (refIssue.Assignees.Any())
                    {
                        accounts.UnionWith(refIssue.Assignees);
                    }
                    accounts.Add(refIssue.ClosedBy);
                    accounts.Add(refIssue.User);

                    item.ExtensionDataDictionary["ship_issue_state"] = refIssue.State;
                    item.ExtensionDataDictionary["ship_issue_title"] = refIssue.Title;

                    if (refIssue.PullRequest != null)
                    {
                        item.ExtensionDataDictionary["ship_is_pull_request"] = true;

                        var pr = prLookups[refIssue.PullRequest.Url].Result.Result;
                        item.ExtensionDataDictionary["ship_pull_request_merged"] = pr.Merged;
                    }
                }
            }
        }