Remove dead code and ensure source code is cloned when building on CI

This commit is contained in:
Nate McMaster 2017-09-18 12:39:27 -07:00
parent 4182b0b5d2
commit 4fa08287a2
6 changed files with 4 additions and 206 deletions

View File

@ -52,6 +52,7 @@
<PropertyGroup>
<!-- If there are duplicate properties, the properties which are defined later in the order would override the earlier ones -->
<RepositoryBuildArguments>$(RepositoryBuildArguments) /p:BuildNumber=$(BuildNumber) /p:Configuration=$(Configuration) /p:CommitHash=$(CommitHash)</RepositoryBuildArguments>
<RepositoryBuildArguments>$(RepositoryBuildArguments) /noconsolelogger '/l:RepoTasks.FlowLogger,$(MSBuildThisFileDirectory)tasks\bin\publish\RepoTasks.dll;Summary;FlowId=$(RepositoryToBuild)'</RepositoryBuildArguments>
<BuildArguments>$(_RepositoryBuildTargets) $(RepositoryBuildArguments)</BuildArguments>
<RepositoryArtifactsRoot>$(BuildRepositoryRoot)artifacts</RepositoryArtifactsRoot>

View File

@ -17,7 +17,7 @@
<_RepositoryBuildTargets Condition="'$(_RepositoryBuildTargets)'=='' AND '$(CompileOnly)'=='true'">/t:Package /t:VerifyPackages</_RepositoryBuildTargets>
<_RepositoryBuildTargets Condition="'$(_RepositoryBuildTargets)'==''">/t:Verify</_RepositoryBuildTargets>
<PrepareDependsOn>$(PrepareDependsOn);CleanUniverseArtifacts</PrepareDependsOn>
<PrepareDependsOn>$(PrepareDependsOn);CleanArtifacts;CleanUniverseArtifacts</PrepareDependsOn>
<CleanDependsOn>$(CleanDependsOn);CleanUniverseArtifacts</CleanDependsOn>
<BuildDependsOn>$(BuildDependsOn);BuildRepositories</BuildDependsOn>
</PropertyGroup>
@ -25,6 +25,7 @@
<Import Project="$(_RepositoryListToImport)" />
<Target Name="CleanUniverseArtifacts">
<RemoveDir Directories="$(_CloneRepositoryRoot)" Condition="Exists('$(_CloneRepositoryRoot)') AND '$(ClearRepositoryCloneRoot)' != 'false'" />
<RemoveDir Directories="$(RepositoryRoot)obj" Condition="Exists('$(RepositoryRoot)obj')" />
</Target>
@ -49,7 +50,7 @@
</ItemGroup>
</Target>
<Target Name="CloneRepositories" DependsOnTargets="_PrepareRepositories">
<Target Name="CloneRepositories" DependsOnTargets="_PrepareRepositories" Condition="'$(ClearRepositoryCloneRoot)' != 'false'">
<ItemGroup>
<_CloneRepositories Include="@(Repository);@(ShippedRepository)" />
<_CloneRepository Include="$(MSBuildProjectFullPath)">

View File

@ -1,30 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System.IO;
using NuGet.ProjectModel;
namespace RepoTools.BuildGraph
{
public class DependencyGraphSpecProvider
{
readonly string _packageSpecDirectory;
public DependencyGraphSpecProvider(string packageSpecDirectory)
{
_packageSpecDirectory = packageSpecDirectory;
}
public DependencyGraphSpec GetDependencyGraphSpec(string repositoryName, string solutionPath)
{
var outputFile = Path.Combine(_packageSpecDirectory, repositoryName, Path.GetFileName(solutionPath) + ".json");
if (!File.Exists(outputFile))
{
return null;
}
return DependencyGraphSpec.Load(outputFile);
}
}
}

View File

@ -4,11 +4,7 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using NuGet.LibraryModel;
using NuGet.ProjectModel;
namespace RepoTools.BuildGraph
{
@ -30,105 +26,8 @@ namespace RepoTools.BuildGraph
public IEnumerable<Project> AllProjects => Projects.Concat(SupportProjects);
public static IList<Repository> ReadAllRepositories(IList<string> repositoryPaths, DependencyGraphSpecProvider provider)
{
var repositories = new Repository[repositoryPaths.Count];
Parallel.For(0, repositoryPaths.Count, new ParallelOptions { MaxDegreeOfParallelism = 6 }, i =>
{
var repositoryPath = repositoryPaths[i];
var repositoryName = Path.GetFileName(repositoryPath);
var repository = Read(provider, repositoryName, repositoryPath);
repositories[i] = repository;
});
return repositories;
}
public bool Equals(Repository other) => string.Equals(Name, other.Name, StringComparison.OrdinalIgnoreCase);
public override int GetHashCode() => StringComparer.OrdinalIgnoreCase.GetHashCode(Name);
private static Repository Read(DependencyGraphSpecProvider provider, string name, string repositoryPath)
{
var repository = new Repository(name);
ReadSharedSourceProjects(Path.Combine(repositoryPath, "shared"), repository, repository.Projects);
var srcDirectory = Path.GetFullPath(Path.Combine(repositoryPath, "src"))
.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
var solutionFiles = Directory.EnumerateFiles(repositoryPath, "*.sln");
foreach (var file in solutionFiles)
{
var spec = provider.GetDependencyGraphSpec(name, file);
if (spec == null)
{
continue;
}
var projects = spec.Projects.OrderBy(p => p.RestoreMetadata.ProjectStyle == ProjectStyle.PackageReference ? 0 : 1);
foreach (var specProject in projects)
{
var projectPath = Path.GetFullPath(specProject.FilePath)
.Replace(Path.AltDirectorySeparatorChar, Path.DirectorySeparatorChar);
var projectGroup = projectPath.StartsWith(srcDirectory, StringComparison.OrdinalIgnoreCase) ?
repository.Projects :
repository.SupportProjects;
var project = projectGroup.FirstOrDefault(f => f.Path == specProject.FilePath);
if (project == null)
{
project = new Project(specProject.Name)
{
Repository = repository,
Path = specProject.FilePath,
Version = specProject.Version?.ToString(),
};
projectGroup.Add(project);
}
foreach (var package in GetPackageReferences(specProject))
{
project.PackageReferences.Add(package);
}
}
}
return repository;
}
private static List<string> GetPackageReferences(PackageSpec specProject)
{
var allDependencies = Enumerable.Concat(
specProject.Dependencies,
specProject.TargetFrameworks.SelectMany(tfm => tfm.Dependencies))
.Distinct();
var packageReferences = allDependencies
.Where(d => d.LibraryRange.TypeConstraintAllows(LibraryDependencyTarget.Package))
.Select(d => d.Name)
.ToList();
return packageReferences;
}
private static void ReadSharedSourceProjects(string sharedSourceProjectsRoot, Repository repository, IList<Project> projects)
{
if (!Directory.Exists(sharedSourceProjectsRoot))
{
return;
}
foreach (var directory in new DirectoryInfo(sharedSourceProjectsRoot).EnumerateDirectories())
{
var project = new Project(directory.Name)
{
Repository = repository,
};
projects.Add(project);
}
}
}
}

View File

@ -1,71 +0,0 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
using System;
using System.Collections.Generic;
using System.Linq;
using RepoTools.BuildGraph;
using Microsoft.Build.Framework;
using Microsoft.Build.Utilities;
namespace RepoTasks
{
public class CalculateBuildGraph : Task
{
[Required]
public ITaskItem[] Repositories { get; set; }
/// <summary>
/// Directory that contains the package spec files.
/// </summary>
[Required]
public string PackageSpecsDirectory { get; set; }
/// <summary>
/// The repository at which to root the graph at
/// </summary>
public string StartGraphAt { get; set; }
[Output]
public ITaskItem[] RepositoriesToBuildInOrder { get; set; }
public override bool Execute()
{
var graphSpecProvider = new DependencyGraphSpecProvider(PackageSpecsDirectory.Trim());
var repositoryPaths = Repositories.Select(r => r.GetMetadata("RepositoryPath")).ToList();
var repositories = Repository.ReadAllRepositories(repositoryPaths, graphSpecProvider);
var graph = GraphBuilder.Generate(repositories, StartGraphAt, Log);
var repositoriesWithOrder = new List<(ITaskItem repository, int order)>();
foreach (var repositoryTaskItem in Repositories)
{
var repositoryName = repositoryTaskItem.ItemSpec;
var graphNodeRepository = graph.FirstOrDefault(g => g.Repository.Name == repositoryName);
if (graphNodeRepository == null)
{
// StartGraphAt was specified so the graph is incomplete.
continue;
}
var order = TopologicalSort.GetOrder(graphNodeRepository);
repositoryTaskItem.SetMetadata("Order", order.ToString());
repositoriesWithOrder.Add((repositoryTaskItem, order));
}
Log.LogMessage(MessageImportance.High, "Repository build order:");
foreach (var buildGroup in repositoriesWithOrder.GroupBy(r => r.order).OrderBy(g => g.Key))
{
var buildGroupRepos = buildGroup.Select(b => b.repository.ItemSpec);
Log.LogMessage(MessageImportance.High, $"{buildGroup.Key.ToString().PadLeft(2, ' ')}: {string.Join(", ", buildGroupRepos)}");
}
RepositoriesToBuildInOrder = repositoriesWithOrder
.OrderBy(r => r.order)
.Select(r => r.repository)
.ToArray();
return true;
}
}
}

View File

@ -3,8 +3,6 @@
<_RepoTaskAssembly>$(MSBuildThisFileDirectory)bin\publish\RepoTasks.dll</_RepoTaskAssembly>
</PropertyGroup>
<UsingTask TaskName="RepoTasks.CalculateBuildGraph" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.AnalyzeBuildGraph" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.GenerateLineup" AssemblyFile="$(_RepoTaskAssembly)" />
<UsingTask TaskName="RepoTasks.PinVersions" AssemblyFile="$(_RepoTaskAssembly)" />
</Project>