public KnowledgeDistributionMap FlyInTime() { _logger.LogInformation("{datetime}: flying in time has started.", DateTime.Now); var knowledgeMap = new KnowledgeDistributionMap() { CommitBasedKnowledgeMap = CommitBasedKnowledgeMap, ReviewBasedKnowledgeMap = ReviewBasedKnowledgeMap, PullRequestSimulatedRecommendationMap = PullRequestSimulatedRecommendationDic, BlameBasedKnowledgeMap = BlameBasedKnowledgeMap, PullRequestEffortKnowledgeMap = PullRequestEffortKnowledgeMap }; foreach (var @event in _events) { if (@event is Commit) { _commit += 1; UpdateCommitBasedKnowledgeMap(@event as Commit); } else if (@event is PullRequest) { UpdateReviewBasedKnowledgeMap(knowledgeMap, @event as PullRequest); } } _logger.LogInformation("{datetime}: flying in time has finished.", DateTime.Now); return(knowledgeMap); }
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 UpdateReviewBasedKnowledgeMap(KnowledgeDistributionMap knowledgeMap, PullRequest pullRequest) { AddProposedChangesToPrSubmitterKnowledge(pullRequest); ChangeThePastByRecommendingReviewers(knowledgeMap, pullRequest); UpdateReviewBasedKnowledgeMap(pullRequest); UpdatePullRequestEffortKnowledgeMap(PullRequestReviewComments.Where(q => q.PullRequestNumber == pullRequest.Number)); }
public static void AddFileOwnership(KnowledgeDistributionMap knowledgeDistributionMap, BlameSnapshot blameSnapshot, Dictionary <string, DeveloperKnowledge> developersKnowledge, string filePath, Dictionary <string, string> canononicalPathMapper) { var canonicalPath = canononicalPathMapper[filePath]; CalculateModificationExpertise(); CalculateReviewExpertise(); void CalculateModificationExpertise() { var fileCommitsDetail = knowledgeDistributionMap.CommitBasedKnowledgeMap[canonicalPath]; if (fileCommitsDetail == null) { return; } foreach (var devCommitDetail in fileCommitsDetail.Values) { var devName = devCommitDetail.Developer.NormalizedName; var fileBlame = blameSnapshot[canonicalPath]?.GetValueOrDefault(devName, null); var totalAuditedLines = fileBlame != null ? fileBlame.TotalAuditedLines : 0; AddModificationOwnershipDetail(developersKnowledge, devCommitDetail, totalAuditedLines); } } void CalculateReviewExpertise() { var fileReviewDetails = knowledgeDistributionMap.ReviewBasedKnowledgeMap[canonicalPath]; if (fileReviewDetails == null) { return; } foreach (var devReviewDetail in fileReviewDetails.Values) { var devName = devReviewDetail.Developer.NormalizedName; AddReviewOwnershipDetail(developersKnowledge, devReviewDetail); } } }
private void ChangeThePastByRecommendingReviewers(KnowledgeDistributionMap knowledgeMap, PullRequest pullRequest) { if (KnowledgeShareStrategy != null) { var pullRequestContext = GetPullRequestContext(pullRequest, knowledgeMap); var periodOfPullRequest = GetPeriodOfPullRequest(pullRequest).Id; var shouldWeChangePast = periodOfPullRequest >= _firstSimulationPeriod && pullRequestContext.ActualReviewers.Length >= _minimumActualReviewersLength; PullRequestSimulatedRecommendationDic[pullRequest.Number] = KnowledgeShareStrategy.Recommend(pullRequestContext); PullRequestSimulatedRecommendationDic[pullRequest.Number].SelectedReviewers = shouldWeChangePast ? PullRequestSimulatedRecommendationDic[pullRequest.Number].SelectedReviewers : pullRequestContext.ActualReviewers.Select(q => q.DeveloperName).ToArray(); PullRequestSimulatedRecommendationDic[pullRequest.Number].IsSimulated = shouldWeChangePast; } }
private DeveloperKnowledge[] GetPullRequestKnowledgeables(PullRequestFile[] pullRequestFiles, KnowledgeDistributionMap knowledgeDistributionMap, Period period) { var developersKnowledge = new Dictionary <string, DeveloperKnowledge>(); var blameSnapshot = BlameBasedKnowledgeMap.GetSnapshopOfPeriod(period.Id); foreach (var file in pullRequestFiles) { AddFileOwnership(knowledgeDistributionMap, blameSnapshot, developersKnowledge, file.FileName, CanononicalPathMapper); } return(developersKnowledge.Values.ToArray()); }