private PullRequestContext GetPullRequestContext(PullRequest pullRequest, KnowledgeDistributionMap knowledgeMap) { var pullRequestFiles = PullRequestFilesDic.GetValueOrDefault(pullRequest.Number, new List <PullRequestFile>()).ToArray(); var period = GetPeriodOfPullRequest(pullRequest); var availableDevelopers = GetAvailableDevelopersOfPeriod(pullRequest) .ToArray(); var prSubmitter = UsernameRepository.GetByGitHubLogin(pullRequest.UserLogin); var pullRequestKnowledgeableDevelopers = GetPullRequestKnowledgeables(pullRequestFiles, knowledgeMap, period); var actualReviewers = GetKnowledgeOfActualReviewers(PullRequestReviewersDic.GetValueOrDefault(pullRequest.Number) ?? new List <string>(0), pullRequestKnowledgeableDevelopers); return(new PullRequestContext() { SelectedReviewersType = _selectedReviewersType, PRSubmitterNormalizedName = prSubmitter?.NormalizedName, ActualReviewers = actualReviewers.ToArray(), PullRequestFiles = pullRequestFiles, AvailableDevelopers = availableDevelopers, PullRequest = pullRequest, KnowledgeMap = knowledgeMap, CanononicalPathMapper = CanononicalPathMapper, PullRequestPeriod = period, Periods = this.PeriodsDic, Developers = new ReadOnlyDictionary <string, Developer>(DevelopersDic), Blames = BlameBasedKnowledgeMap.GetSnapshopOfPeriod(period.Id), PullRequestKnowledgeables = pullRequestKnowledgeableDevelopers }); }
private void UpdatePullRequestEffortKnowledgeMap(IEnumerable <PullRequestReviewerComment> pullRequestReviewComments) { foreach (var pullRequestReviewComment in pullRequestReviewComments) { PullRequestEffortKnowledgeMap.Add( CanononicalPathMapper.GetValueOrDefault(pullRequestReviewComment.Path), UsernameRepository.GetByGitHubLogin(pullRequestReviewComment.UserLogin), pullRequestReviewComment.CreatedAtDateTime); } }
private void AssignReviewerToPullRequest(string reviewerName, int prNumber, Dictionary <long, List <string> > prReviewers) { var prSubmitter = PullRequestsDic[prNumber].UserLogin; if (prSubmitter == reviewerName) { return; } if (!prReviewers.ContainsKey(prNumber)) { prReviewers[prNumber] = new List <string>(); } var reviewerNormalizedName = UsernameRepository.GetByGitHubLogin(reviewerName)?.NormalizedName; // Pull Request Reviewers and Comments contains duplicated items, So we need to check for it // https://api.github.com/repos/dotnet/coreclr/pulls/7886/reviews if (reviewerNormalizedName != null && !prReviewers[prNumber].Any(q => q == reviewerNormalizedName)) { prReviewers[prNumber].Add(reviewerNormalizedName); } }
private void AddProposedChangesToPrSubmitterKnowledge(PullRequest pullRequest) { // we assume the PR submitter is the dev who has modified the files // however it's not the case always. for example https://github.com/dotnet/coreclr/pull/1 // we assume all the proposed file changes are committed and owned by the main pull request's author // which may not be correct in rare scenarios if (pullRequest == null) { return; } var submitter = UsernameRepository.GetByGitHubLogin(pullRequest.UserLogin); // we have ignored mega developers if (submitter == null || _megaDevelopersSet.Contains(submitter.NormalizedName)) { return; } // some of the pull requests have no modified files // https://github.com/dotnet/coreclr/pull/13534 var pullRequestFiles = PullRequestFilesDic.GetValueOrDefault(pullRequest.Number, new List <PullRequestFile>()); var prSubmitter = submitter.NormalizedName; var period = GetPeriodOfPullRequest(pullRequest); foreach (var file in pullRequestFiles) { var canonicalPath = CanononicalPathMapper.GetValueOrDefault(file.FileName); AssignKnowledgeToDeveloper(new Commit { NormalizedAuthorName = prSubmitter, PeriodId = period.Id, Sha = pullRequest.MergeCommitSha, AuthorDateTime = pullRequest.MergedAtDateTime.Value }, file.ChangeKind, prSubmitter, period, canonicalPath); } }