public void FindNodesThatDependOn_ShouldFindAnyLevelDependency() { // Arrange using var dep2 = CreateProjectFile("dep2"); // dep1 depends on dep2 using var dep1 = CreateProjectFile("dep1", dep2); // root depends on dep1 using var projectThatChanged = CreateProjectFile("projectThatChanged", dep1); var graph = new ProjectGraph(projectThatChanged.Path); var dep2Node = graph.FindNodeByPath(dep2.Path); // Act var affected = graph.FindNodesThatDependOn(dep2Node).ToList(); // Assert Assert.Equal(2, affected.Count); var dep1Node = graph.FindNodeByPath(dep1.Path); var projectThatChangedNode = graph.FindNodeByPath(projectThatChanged.Path); Assert.Collection(affected, k => Assert.Equal(dep1Node, k), k => Assert.Equal(projectThatChangedNode, k) ); }
public static IEnumerable <ProjectGraphNode> FindNodesThatDependOn( this ProjectGraph graph, IEnumerable <ProjectGraphNode> targetNodes) { var added = new HashSet <string>(); foreach (var node in targetNodes) { foreach (var affected in graph.FindNodesThatDependOn(node).ToList()) { if (!added.Contains(affected.ProjectInstance.FullPath)) { added.Add(affected.ProjectInstance.FullPath); yield return(affected); } } } }
public void FindNodesThatDependOn_ShouldFindDependenciesForAllProjects() { // Arrange using var dep2 = CreateProjectFile("dep2"); // dep1 depends on dep2 using var dep1 = CreateProjectFile("dep1", dep2); // root depends on dep1 using var projectThatChanged = CreateProjectFile("projectThatChanged", dep1); // other dep using var dep3 = CreateProjectFile("dep3"); // other root depends on other dep using var otherProjectThatChanged = CreateProjectFile("otherProject", dep3); var graph = new ProjectGraph(new string[] { projectThatChanged.Path, otherProjectThatChanged.Path }); var dep2Node = graph.FindNodeByPath(dep2.Path); var dep3Node = graph.FindNodeByPath(dep3.Path); // Act var affected = graph.FindNodesThatDependOn(new[] { dep2Node, dep3Node, }).ToList(); // Assert Assert.Equal(3, affected.Count); var dep1Node = graph.FindNodeByPath(dep1.Path); var projectThatChangedNode = graph.FindNodeByPath(projectThatChanged.Path); var otherProjectThatChangedNode = graph.FindNodeByPath(otherProjectThatChanged.Path); Assert.Collection(affected, k => Assert.Equal(dep1Node, k), k => Assert.Equal(projectThatChangedNode, k), k => Assert.Equal(otherProjectThatChangedNode, k) ); }
public void FindNodesThatDependOn_ShouldFindFirstLevelDependency() { // Arrange using var dep1 = CreateProjectFile("dep1"); using var dep2 = CreateProjectFile("dep2"); // child depends on dep1 and dep2 using var child = CreateProjectFile("child", dep1, dep2); var graph = new ProjectGraph(child.Path); var dep1Node = graph.FindNodeByPath(dep1.Path); // Act var affected = graph.FindNodesThatDependOn(dep1Node).ToList(); // Assert Assert.Single(affected); Assert.Contains(affected, k => k.ProjectInstance.FullPath == child.Path); }
public static IEnumerable <ProjectGraphNode> FindNodesThatDependOn( this ProjectGraph graph, ProjectGraphNode targetNode) { var targetNodeIsKnown = false; foreach (var currentNode in graph.ProjectNodes) { // ignore the target node if (currentNode == targetNode) { targetNodeIsKnown = true; continue; } foreach (var dependency in currentNode.ProjectReferences) { // current project depends on targetNode if (dependency == targetNode) { // if targetNode changes, currentNode will be affected. yield return(currentNode); // since currentNode depends on targetNode, // we also need to check which projects the currentNode depends on // since they could be affected by the changes made on targetNode foreach (var childDep in graph.FindNodesThatDependOn(currentNode)) { yield return(childDep); } } } } if (!targetNodeIsKnown) { throw new InvalidOperationException($"Requested to find {targetNode.ProjectInstance.FullPath} but its not present in known projects"); } }