Exemple #1
0
        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());
        }