From acc454bc36afd3244c7d22c26738d7fe61a80c3a Mon Sep 17 00:00:00 2001
From: Pranav K <prkrishn@hotmail.com>
Date: Mon, 3 Apr 2017 23:06:56 -0700
Subject: [PATCH] Include CLI tool references when calculating build dependency
 graph

---
 tools/BuildGraph/Project.cs    |  4 +++-
 tools/BuildGraph/Repository.cs | 36 +++++++++++++++++++---------------
 2 files changed, 23 insertions(+), 17 deletions(-)

diff --git a/tools/BuildGraph/Project.cs b/tools/BuildGraph/Project.cs
index 12d3da6fb4e..af8761e8292 100644
--- a/tools/BuildGraph/Project.cs
+++ b/tools/BuildGraph/Project.cs
@@ -14,8 +14,10 @@ namespace BuildGraph
 
         public string Name { get; }
 
+        public string Path { get; set; }
+
         public Repository Repository { get; set; }
 
-        public IList<string> PackageReferences { get; set; } = Array.Empty<string>();
+        public ISet<string> PackageReferences { get; } = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
     }
 }
\ No newline at end of file
diff --git a/tools/BuildGraph/Repository.cs b/tools/BuildGraph/Repository.cs
index 821ffc54c08..e8893d7ff87 100644
--- a/tools/BuildGraph/Repository.cs
+++ b/tools/BuildGraph/Repository.cs
@@ -61,37 +61,41 @@ namespace BuildGraph
             var srcDirectory = Path.Combine(repositoryPath, "src");
 
             var solutionFiles = Directory.EnumerateFiles(repositoryPath, "*.sln");
-            var knownProjects = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
             foreach (var file in solutionFiles)
             {
                 var spec = provider.GetDependencyGraphSpec(name, file);
-                foreach (var specProject in spec.Projects)
+                var projects = spec.Projects.OrderBy(p => p.RestoreMetadata.ProjectStyle == ProjectStyle.PackageReference ? 0 : 1);
+                foreach (var specProject in projects)
                 {
-                    if (!knownProjects.Add(specProject.FilePath) ||
-                        specProject.RestoreMetadata.ProjectStyle != ProjectStyle.PackageReference)
-                    {
-                        continue;
-                    }
-
                     var projectPath = Path.GetFullPath(specProject.FilePath);
 
-                    var project = new Project(specProject.Name)
-                    {
-                        PackageReferences = GetPackageReferences(specProject),
-                        Repository = repository,
-                    };
-
                     var projectGroup = projectPath.StartsWith(srcDirectory, StringComparison.OrdinalIgnoreCase) ?
                         repository.Projects :
                         repository.SupportProjects;
-                    projectGroup.Add(project);
+
+                    var project = projectGroup.FirstOrDefault(f => f.Path == specProject.FilePath);
+                    if (project == null)
+                    {
+                        project = new Project(specProject.Name)
+                        {
+                            Repository = repository,
+                            Path = specProject.FilePath,
+                        };
+
+                        projectGroup.Add(project);
+                    }
+
+                    foreach (var package in GetPackageReferences(specProject))
+                    {
+                        project.PackageReferences.Add(package);
+                    }
                 }
             }
 
             return repository;
         }
 
-        private static List<string> GetPackageReferences(NuGet.ProjectModel.PackageSpec specProject)
+        private static List<string> GetPackageReferences(PackageSpec specProject)
         {
             var allDependencies = Enumerable.Concat(
                 specProject.Dependencies,
-- 
GitLab