private IReadOnlyList <Node> GetTaskGraphNodes(ICakeContext context, ICakeTaskInfo task, IReadOnlyList <ICakeTaskInfo> tasks) { var taskDictionary = tasks.ToDictionary(); var nodes = new List <Node>(); var stack = new Stack <ICakeTaskInfo>(); stack.Push(task); while (stack.Count > 0) { var currentNode = stack.Pop(); context.Log.Write(Verbosity.Diagnostic, LogLevel.Debug, $"Creating Node for {currentNode.Name} which has {currentNode.Dependencies.Count} dependencies"); nodes.Add(new Node(currentNode.Name)); foreach (var dependencyName in currentNode.Dependencies) { var dependencyTask = TaskGraphGeneratorHelpers.GetTaskDependency(context, taskDictionary, dependencyName.Name); stack.Push(dependencyTask); context.Log.Write(Verbosity.Diagnostic, LogLevel.Debug, $"Creating Edge from {currentNode.Name} to {dependencyTask.Name}"); nodes.Add(new Node(Guid.NewGuid().ToString(), currentNode.Name, dependencyTask.Name)); } } return(nodes); }
private static IReadOnlyCollection <string> GetEdges(ICakeContext context, ICakeTaskInfo task, IReadOnlyList <ICakeTaskInfo> tasks) { var taskDictionary = tasks.ToDictionary(); var stack = new Stack <ICakeTaskInfo>(); stack.Push(task); var edges = new List <string>(); var visited = new HashSet <string>(); while (stack.Count > 0) { var currentNode = stack.Pop(); context.Log.Write(Verbosity.Diagnostic, LogLevel.Debug, $"Creating Node for {currentNode.Name} which has {currentNode.Dependencies.Count} dependencies"); foreach (var dependencyName in currentNode.Dependencies) { var dependencyTask = TaskGraphGeneratorHelpers.GetTaskDependency(context, taskDictionary, dependencyName.Name); if (visited.Contains(dependencyTask.Name, StringComparer.InvariantCultureIgnoreCase)) { continue; } visited.Add(dependencyTask.Name); stack.Push(dependencyTask); context.Log.Write(Verbosity.Diagnostic, LogLevel.Debug, $"Creating Edge from {currentNode.Name} to {dependencyTask.Name}"); var edge = $"{currentNode.Name}-->{dependencyTask.Name};"; edges.Add(edge); } } return(edges); }