Example #1
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
            });
        }
Example #2
0
 private void UpdatePullRequestEffortKnowledgeMap(IEnumerable <PullRequestReviewerComment> pullRequestReviewComments)
 {
     foreach (var pullRequestReviewComment in pullRequestReviewComments)
     {
         PullRequestEffortKnowledgeMap.Add(
             CanononicalPathMapper.GetValueOrDefault(pullRequestReviewComment.Path),
             UsernameRepository.GetByGitHubLogin(pullRequestReviewComment.UserLogin),
             pullRequestReviewComment.CreatedAtDateTime);
     }
 }
Example #3
0
        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);
            }
        }
Example #4
0
        public unit_test_UsernameRepo()
        {
            //Setting up In memory dbs.
            userdb   = new SqliteConnection("DataSource=:memory:");
            passdb   = new SqliteConnection("DataSource=:memory:");
            walletdb = new SqliteConnection("DataSource=:memory:");
            userdb.Open();
            passdb.Open();
            walletdb.Open();

            var userbuild = new DbContextOptionsBuilder <UserModelContext>()
                            .UseSqlite(userdb).Options;

            var passbuild = new DbContextOptionsBuilder <PassModelContext>()
                            .UseSqlite(passdb).Options;

            var walletbuild = new DbContextOptionsBuilder <WalletContext>()
                              .UseSqlite(walletdb).Options;

            var userContext = new UserModelContext(userbuild);
            var passContext = new PassModelContext(passbuild);

            var walletContext = new WalletContext(walletbuild);

            //Drop and create
            userContext.Database.EnsureDeleted();
            userContext.Database.EnsureCreated();
            passContext.Database.EnsureDeleted();
            passContext.Database.EnsureCreated();
            walletContext.Database.EnsureDeleted();
            walletContext.Database.EnsureCreated();

            //Seeding data to test on
            SeedUsers.seedUsers(userContext, passContext, walletContext);

            _uut = new UsernameRepository(userContext);
        }
Example #5
0
        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);
            }
        }
Example #6
0
        public void Initiate(Data.Commit[] commits, CommitBlobBlame[] commitBlobBlames, Developer[] developers, DeveloperContribution[] developersContributions,
                             CommittedChange[] committedChanges, PullRequest[] pullRequests, PullRequestFile[] pullRequestFiles, IssueComment[] issueComments,
                             PullRequestReviewer[] pullRequestReviewers, PullRequestReviewerComment[] pullRequestReviewComments,
                             Dictionary <string, string> canononicalPathMapper, GitHubGitUser[] githubGitUsers, Period[] periods, int firstPeriod, string selectedReviewersType, int?minimumActualReviewersLength, IEnumerable <string> megaDevelopers)
        {
            _logger.LogInformation("{datetime}: Trying to initialize TimeMachine.", DateTime.Now);

            UsernameRepository        = new UsernameRepository(githubGitUsers, developers);
            DevelopersContributions   = developersContributions;
            PullRequestReviewComments = pullRequestReviewComments;
            CanononicalPathMapper     = canononicalPathMapper;

            _events = GetSortedEvents(commits, pullRequests);

            CommitsDic = commits.ToDictionary(q => q.Sha);
            PeriodsDic = periods.ToDictionary(q => q.Id);

            GetDevelopersContributions(developers, developersContributions);
            DevelopersDic = developers.ToDictionary(q => q.NormalizedName);

            PullRequestsDic = pullRequests.ToDictionary(q => q.Number);

            PullRequestEffortKnowledgeMap = new PullRequestEffortKnowledgeMap();
            BlameBasedKnowledgeMap        = GetBlameBasedKnowledgeMap(commitBlobBlames);
            CommittedChangesDic           = GetCommittedChangesDictionary(committedChanges);
            PullRequestFilesDic           = GetPullRequestFilesDictionary(pullRequestFiles);
            PullRequestReviewersDic       = GetPullRequestReviewersDictionary(pullRequestReviewers, pullRequestReviewComments, issueComments);

            _firstSimulationPeriod        = firstPeriod;
            _selectedReviewersType        = selectedReviewersType;
            _minimumActualReviewersLength = minimumActualReviewersLength ?? 0;

            _megaDevelopersSet = megaDevelopers.ToHashSet();

            _logger.LogInformation("{datetime}: TimeMachine is initialized.", DateTime.Now);
        }