protected DeveloperKnowledge[] GetFolderLevelOweners(int depthToScanForReviewers, PullRequestContext pullRequestContext) { var pullRequestFiles = pullRequestContext.PullRequestFiles; var blameSnapshot = pullRequestContext.KnowledgeMap.BlameBasedKnowledgeMap.GetSnapshopOfPeriod(pullRequestContext.PullRequestPeriod.Id); var relatedFiles = new HashSet <string>(); foreach (var pullRequestFile in pullRequestFiles) { var canonicalPath = pullRequestContext.CanononicalPathMapper[pullRequestFile.FileName]; if (canonicalPath == null) { continue; } var actualPath = blameSnapshot.GetActualPath(canonicalPath); if (actualPath == null) { continue; } var neighbors = blameSnapshot.Trie.GetFileNeighbors(depthToScanForReviewers, actualPath); if (neighbors != null) { foreach (var neighbor in neighbors) { relatedFiles.Add(neighbor); } } } var developersKnowledge = new Dictionary <string, DeveloperKnowledge>(); foreach (var relatedFile in relatedFiles) { TimeMachine.AddFileOwnership(pullRequestContext.KnowledgeMap, blameSnapshot, developersKnowledge, relatedFile, pullRequestContext.CanononicalPathMapper); } var folderLevelKnowlegeables = developersKnowledge.Values.Where(q => pullRequestContext.AvailableDevelopers.Any(d => d.NormalizedName == q.DeveloperName)).ToArray(); foreach (var folderLevelKnowlegeable in folderLevelKnowlegeables) { folderLevelKnowlegeable.IsFolderLevel = true; } return(folderLevelKnowlegeables); }