private ITaskItem[] GetRepositoryBuildOrder(IEnumerable <ArtifactInfo.Package> artifacts, IEnumerable <SolutionInfo> solutions) { var repositories = solutions.Select(s => { var repoName = Path.GetFileName(Path.GetDirectoryName(s.FullPath)); var repo = new Repository(repoName) { RootDir = Path.GetDirectoryName(s.FullPath) }; var packages = artifacts .Where(a => string.Equals(a.RepoName, repoName, StringComparison.OrdinalIgnoreCase)) .ToDictionary(p => p.PackageInfo.Id, p => p, StringComparer.OrdinalIgnoreCase); foreach (var proj in s.Projects) { IList <Project> projectGroup; if (packages.ContainsKey(proj.PackageId)) { // this project is a package producer and consumer packages.Remove(proj.PackageId); projectGroup = repo.Projects; } else { // this project is a package consumer projectGroup = repo.SupportProjects; } projectGroup.Add(new Project(proj.PackageId) { Repository = repo, PackageReferences = new HashSet <string>(proj .Frameworks .SelectMany(f => f.Dependencies.Keys) .Concat(proj.Tools.Select(t => t.Id)), StringComparer.OrdinalIgnoreCase), }); } foreach (var packageId in packages.Keys) { // these packages are produced from something besides a csproj. e.g. .Sources packages repo.Projects.Add(new Project(packageId) { Repository = repo }); } return(repo); }).ToList(); var graph = GraphBuilder.Generate(repositories, StartGraphAt, Log); var repositoriesWithOrder = new List <(ITaskItem repository, int order)>(); foreach (var repository in repositories) { var graphNodeRepository = graph.FirstOrDefault(g => g.Repository.Name == repository.Name); if (graphNodeRepository == null) { // StartGraphAt was specified so the graph is incomplete. continue; } var order = TopologicalSort.GetOrder(graphNodeRepository); var repositoryTaskItem = new TaskItem(repository.Name); repositoryTaskItem.SetMetadata("Order", order.ToString()); repositoryTaskItem.SetMetadata("RootPath", repository.RootDir); repositoriesWithOrder.Add((repositoryTaskItem, order)); } return(repositoriesWithOrder .OrderBy(r => r.order) .Select(r => r.repository) .ToArray()); }