/// Returns all the dependencies of a number of projects. static ProjectInstance[] getDependencies(ProjectInstance[] allInstances, ProjectInstance[] roots) { var allGuids = allInstances.ToDictionary(getProjectGuid); var todo = new Queue<Guid>(roots.Select(getProjectGuid)); var rootSet = new HashSet<Guid>(roots.Select(getProjectGuid)); var dependencies = new HashSet<Guid>(); while (todo.Count != 0) { var next = todo.Dequeue(); getDependentProjectGuids(allGuids[next]) .Where(g => !dependencies.Contains(g) && !rootSet.Contains(g) && allGuids.ContainsKey(g)) .ForEach(g => { todo.Enqueue(g); dependencies.Add(g); }); } return dependencies.Select(g => allGuids[g]).ToArray(); }
/// Returns all the affected projects of the given list of projects. /// Since the roots may refer to each other, the roots are included in the result set. static ProjectInstance[] getAffectedProjects(ProjectInstance[] allInstances, ProjectInstance[] roots) { var dependentMap = createDependentMap(allInstances); var allGuids = allInstances.ToDictionary(getProjectGuid); var rootGuids = roots.Select(getProjectGuid).ToArray(); var todo = new Queue<Guid>(rootGuids); var affected = new HashSet<Guid>(rootGuids); while (todo.Count != 0) { var next = todo.Dequeue(); HashSet<Guid> dependents = null; if (!dependentMap.TryGetValue(next, out dependents)) continue; dependents.ForEach(dep => { if (affected.Add(dep)) todo.Enqueue(dep); } ); } return affected.Select(g => allGuids[g]).ToArray(); }
void printSummary(SummaryLogger logger, ProjectInstance[] allProjects) { var results = logger.ProjectResults; var filenamesOfProjects = new HashSet<string>(allProjects.Select(pi => pi.FullPath)); // we must group by filename and not by project id, it seems that we get multiple results with different project ids for the same project. // and even that list may include projects that we did not actually build explicitly. var projectResults = results .GroupBy(result => result.Filename) .Select(rs => rs.Last()) .Where(rs => filenamesOfProjects.Contains(rs.Filename)) .ToArray(); var succeded = projectResults.Count(result => result.Succeeded); var failed = projectResults.Count(result => !result.Succeeded); coreToIDE(() => _pane.OutputString($"========== BuildOnSave: {succeded} succeeded, {failed} failed ==========\n")); }