public void ImportedFilePathIsFound() { var sample = ProjectSampleGenerator.GetProjectWithImportSample("SampleProject.csproj"); var projectFilePath = sample.ProjectFile.GetFullPath(Repository.BasePath); var importedPropsFilePath = Path.Combine(Repository.BasePath, sample.ImportedPropsFile.Name); Repository .WriteFile(sample.ProjectFile) .WriteFile(sample.ImportedPropsFile); var projectFile = new SlnFileWithPath(projectFilePath, new SlnFile(FileType.Project, ProjectId.CreateNewId())); var imports = ProjectImportsFinder.FindProjectImports(new[] { projectFile }); imports.Values.Should().BeEquivalentTo(new ImportedFile(importedPropsFilePath, new[] { projectFile }.ToImmutableList())); }
protected override async Task <Dictionary <string, SlnFile> > ProcessImpl( Task <Dictionary <string, SlnFile> > previousTask) { var fileDictObj = await previousTask; var fileDict = (Dictionary <string, SlnFile>)fileDictObj; var repoResult = GitRunner.FindRepository(_workingDirectory); if (!repoResult.foundRepo) { Logger.LogError("Unable to find Git repository located in {0}. Shutting down.", _workingDirectory); return(new Dictionary <string, SlnFile>()); } // validate the target branch if (!DiffHelper.HasBranch(repoResult.repo, _targetGitBranch)) { Logger.LogError("Current git repository doesn't have any branch named [{0}]. Shutting down.", _targetGitBranch); return(new Dictionary <string, SlnFile>()); } var repo = repoResult.repo; var affectedFiles = DiffHelper.ChangedFiles(repo, _targetGitBranch).ToList(); var projectFiles = fileDict.Where(x => x.Value.FileType == FileType.Project).ToList(); var projectFolders = projectFiles.ToLookup(x => Path.GetDirectoryName(x.Key), v => Tuple.Create(v.Key, v.Value)); var projectImports = ProjectImportsFinder.FindProjectImports(projectFiles.Select(pair => new SlnFileWithPath(pair.Key, pair.Value))); // filter out any files that aren't affected by the diff var newDict = new Dictionary <string, SlnFile>(); foreach (var file in affectedFiles) { Logger.LogDebug("Affected file: {0}", file); // this file is in the solution if (fileDict.ContainsKey(file)) { newDict[file] = fileDict[file]; } else { // special case - not all of the affected files were in the solution. // Check to see if these affected files are in the same folder as any of the projects var directoryName = Path.GetDirectoryName(file); if (TryFindSubFolder(projectFolders.Select(c => c.Key), directoryName, out var projectFolder)) { var affectedProjects = projectFolders[projectFolder]; foreach (var affectedProject in affectedProjects) { var project = affectedProject.Item2; var projectPath = affectedProject.Item1; Logger.LogInformation("Adding project {0} to the set of affected files because non-code file {1}, " + "found inside same directory [{2}], was modified.", projectPath, file, directoryName); newDict[projectPath] = project; } } } // special case - if affected file was imported to some projects, need to mark importing project as affected if (projectImports.ContainsKey(file)) { // Mark all dependant as affected foreach (var dependentProject in projectImports[file].DependantProjects) { newDict[dependentProject.Path] = dependentProject.File; } } } return(newDict); }