Пример #1
0
        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);
        }
Пример #2
0
        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
            });
        }
Пример #3
0
        private void UpdateReviewBasedKnowledgeMap(KnowledgeDistributionMap knowledgeMap, PullRequest pullRequest)
        {
            AddProposedChangesToPrSubmitterKnowledge(pullRequest);

            ChangeThePastByRecommendingReviewers(knowledgeMap, pullRequest);

            UpdateReviewBasedKnowledgeMap(pullRequest);

            UpdatePullRequestEffortKnowledgeMap(PullRequestReviewComments.Where(q => q.PullRequestNumber == pullRequest.Number));
        }
Пример #4
0
        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);
                }
            }
        }
Пример #5
0
        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;
            }
        }
Пример #6
0
        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());
        }