From 4bdf41f0590dc9a1c9dfbadeb76d952c1095ccd0 Mon Sep 17 00:00:00 2001 From: "N. Taylor Mullen" Date: Mon, 23 Apr 2018 14:25:33 -0700 Subject: [PATCH 001/192] Add support for VersionRange in VisualStudio restrictions. - Added tests as well. --- modules/KoreBuild.Tasks/Utilities/VsWhere.cs | 26 +++++++++- test/KoreBuild.Tasks.Tests/VSWhereTests.cs | 52 ++++++++++++++++++++ tools/KoreBuildSettings.cs | 1 + tools/korebuild.schema.json | 24 +++++++-- 4 files changed, 97 insertions(+), 6 deletions(-) diff --git a/modules/KoreBuild.Tasks/Utilities/VsWhere.cs b/modules/KoreBuild.Tasks/Utilities/VsWhere.cs index fbf8e3ef7..cbd84f86b 100644 --- a/modules/KoreBuild.Tasks/Utilities/VsWhere.cs +++ b/modules/KoreBuild.Tasks/Utilities/VsWhere.cs @@ -38,10 +38,10 @@ public static VsInstallation FindLatestCompatibleInstallation(KoreBuildSettings. args.Add("-prerelease"); } - if (!string.IsNullOrEmpty(toolset.MinVersion)) + if (TryGetVersion(toolset, out var version)) { args.Add("-version"); - args.Add(toolset.MinVersion); + args.Add(version); } if (toolset.RequiredWorkloads != null) @@ -56,6 +56,28 @@ public static VsInstallation FindLatestCompatibleInstallation(KoreBuildSettings. return GetInstallations(args, log).FirstOrDefault(); } + // Internal for testing + internal static bool TryGetVersion(KoreBuildSettings.VisualStudioToolset toolset, out string version) + { + if (!string.IsNullOrEmpty(toolset.VersionRange)) + { + // This is the same as MinVersion but the name indicates that a user can specify more than just + // a min version. For example: [15.0,16.0) will find versions 15.*. + version = toolset.VersionRange; + return true; + } + + if (!string.IsNullOrEmpty(toolset.MinVersion)) + { + // Here for back compatibility. + version = toolset.MinVersion; + return true; + } + + version = null; + return false; + } + private static VsInstallation[] GetInstallations(List args, TaskLoggingHelper log) { args.Add("-format"); diff --git a/test/KoreBuild.Tasks.Tests/VSWhereTests.cs b/test/KoreBuild.Tasks.Tests/VSWhereTests.cs index c37badcf0..a65ad1e3e 100644 --- a/test/KoreBuild.Tasks.Tests/VSWhereTests.cs +++ b/test/KoreBuild.Tasks.Tests/VSWhereTests.cs @@ -4,6 +4,7 @@ using System.IO; using System.Runtime.InteropServices; using BuildTools.Tasks.Tests; +using KoreBuild.Tasks.Utilities; using Xunit; using Xunit.Abstractions; @@ -18,6 +19,57 @@ public VSWhereTests(ITestOutputHelper output) _output = output; } + [Fact] + public void TryGetVersion_ReturnsFalseWhenNoVersionsProvided() + { + // Arrange + var toolset = new KoreBuildSettings.VisualStudioToolset(); + + // Act + var result = VsWhere.TryGetVersion(toolset, out var version); + + // Assert + Assert.False(result); + Assert.Null(version); + } + + [Fact] + public void TryGetVersion_PrioritizesVersionRangeOverMinRange() + { + // Arrange + var expectedVersion = "[15.0,16.0)"; + var toolset = new KoreBuildSettings.VisualStudioToolset() + { + VersionRange = expectedVersion, + MinVersion = "unexpected", + }; + + // Act + var result = VsWhere.TryGetVersion(toolset, out var version); + + // Assert + Assert.True(result); + Assert.Equal(expectedVersion, version); + } + + [Fact] + public void TryGetVersion_ReturnsVersionRange() + { + // Arrange + var expectedVersion = "[15.0,16.0)"; + var toolset = new KoreBuildSettings.VisualStudioToolset() + { + VersionRange = expectedVersion, + }; + + // Act + var result = VsWhere.TryGetVersion(toolset, out var version); + + // Assert + Assert.True(result); + Assert.Equal(expectedVersion, version); + } + [Fact] public void ItFindsVisualStudio() { diff --git a/tools/KoreBuildSettings.cs b/tools/KoreBuildSettings.cs index 201eccc54..3b83418b3 100644 --- a/tools/KoreBuildSettings.cs +++ b/tools/KoreBuildSettings.cs @@ -41,6 +41,7 @@ public class VisualStudioToolset : KoreBuildToolset { public bool IncludePrerelease { get; set; } = true; public string MinVersion { get; set; } + public string VersionRange { get; set; } public string[] RequiredWorkloads { get; set; } = Array.Empty(); } diff --git a/tools/korebuild.schema.json b/tools/korebuild.schema.json index 61477933d..c23ad4979 100644 --- a/tools/korebuild.schema.json +++ b/tools/korebuild.schema.json @@ -74,12 +74,28 @@ "items": { "type": "string" } - }, - "minVersion": { - "type": "string", - "description": "The minimum version of Visual Studio required." } } + }, + { + "oneOf": [ + { + "properties": { + "minVersion": { + "type": "string", + "description": "The minimum version of Visual Studio required." + } + } + }, + { + "properties": { + "versionRange": { + "type": "string", + "description": "The version range of Visual Studio required." + } + } + } + ] } ] } From 96a76518e20ec273f2f3daa56f4d13b439289468 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Tue, 24 Apr 2018 10:52:07 -0700 Subject: [PATCH 002/192] Run validate on all benchmarks (#654) --- files/KoreBuild/modules/vstest/module.targets | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/KoreBuild/modules/vstest/module.targets b/files/KoreBuild/modules/vstest/module.targets index d5aecd810..8e8c87462 100644 --- a/files/KoreBuild/modules/vstest/module.targets +++ b/files/KoreBuild/modules/vstest/module.targets @@ -115,10 +115,10 @@ Runs the VSTest on all projects in the ProjectsToTest itemgroup. Condition="'@(BenchmarksToValidate)' != ''" /> - + - + From c7245fe67fd98b8b13a8cb7f36deace10761b921 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 25 Apr 2018 09:19:26 -0700 Subject: [PATCH 003/192] Update SDK to 2.1.300-rc1-008662 --- files/KoreBuild/config/sdk.version | 2 +- files/KoreBuild/scripts/KoreBuild.psm1 | 1 - files/KoreBuild/scripts/invoke-repository-build.sh | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index cab5c4286..3599b7a92 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -2.1.300-preview2-008530 +2.1.300-rc1-008662 diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index 1a3cc5cd1..c0f3e1613 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -89,7 +89,6 @@ function Invoke-RepositoryBuild( $koreBuildVersion = Get-KoreBuildVersion $msBuildArguments = @" -/nologo /m /nodeReuse:false /p:KoreBuildVersion=$koreBuildVersion diff --git a/files/KoreBuild/scripts/invoke-repository-build.sh b/files/KoreBuild/scripts/invoke-repository-build.sh index af73c4045..e8a929ec1 100755 --- a/files/KoreBuild/scripts/invoke-repository-build.sh +++ b/files/KoreBuild/scripts/invoke-repository-build.sh @@ -83,7 +83,6 @@ fi korebuild_version="$(__get_korebuild_version)" cat > "$msbuild_response_file" < Date: Wed, 25 Apr 2018 15:44:51 -0700 Subject: [PATCH 004/192] Disable pulling from the dotnetcli CDN by default (#656) --- files/KoreBuild/scripts/KoreBuild.psm1 | 6 ++++-- files/KoreBuild/scripts/dotnet-install.ps1 | 9 ++++++++- files/KoreBuild/scripts/dotnet-install.sh | 9 +++++++++ files/KoreBuild/scripts/get-dotnet.sh | 2 ++ tools/KoreBuild.Console/Commands/InstallToolsCommand.cs | 5 ++++- 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index c0f3e1613..989628334 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -236,7 +236,8 @@ function Install-Tools( -InstallDir $installDir ` -AzureFeed $script:config.'dotnet.feed.cdn' ` -UncachedFeed $script:config.'dotnet.feed.uncached' ` - -FeedCredential $script:config.'dotnet.feed.credential' + -FeedCredential $script:config.'dotnet.feed.credential' ` + -NoCdn } else { Write-Host -ForegroundColor DarkGray ".NET Core SDK $version is already installed. Skipping installation." @@ -417,7 +418,8 @@ function __install_shared_runtime($installScript, $installDir, [string]$arch, [s -InstallDir $installDir ` -AzureFeed $script:config.'dotnet.feed.cdn' ` -UncachedFeed $script:config.'dotnet.feed.uncached' ` - -FeedCredential $script:config.'dotnet.feed.credential' + -FeedCredential $script:config.'dotnet.feed.credential' ` + -NoCdn } else { Write-Host -ForegroundColor DarkGray ".NET Core runtime $version is already installed. Skipping installation." diff --git a/files/KoreBuild/scripts/dotnet-install.ps1 b/files/KoreBuild/scripts/dotnet-install.ps1 index 8fb301408..0ff6bb22d 100644 --- a/files/KoreBuild/scripts/dotnet-install.ps1 +++ b/files/KoreBuild/scripts/dotnet-install.ps1 @@ -73,6 +73,8 @@ .PARAMETER SkipNonVersionedFiles Default: false Skips installing non-versioned files if they already exist, such as dotnet.exe. +.PARAMETER NoCdn + Disable downloading from the Azure CDN, and used the uncached feed directly. #> [cmdletbinding()] param( @@ -91,13 +93,18 @@ param( [string]$FeedCredential, [string]$ProxyAddress, [switch]$ProxyUseDefaultCredentials, - [switch]$SkipNonVersionedFiles + [switch]$SkipNonVersionedFiles, + [switch]$NoCdn ) Set-StrictMode -Version Latest $ErrorActionPreference="Stop" $ProgressPreference="SilentlyContinue" +if ($NoCdn) { + $AzureFeed = $UncachedFeed +} + $BinFolderRelativePath="" if ($SharedRuntime -and (-not $Runtime)) { diff --git a/files/KoreBuild/scripts/dotnet-install.sh b/files/KoreBuild/scripts/dotnet-install.sh index c7d9c6b55..796c4829c 100755 --- a/files/KoreBuild/scripts/dotnet-install.sh +++ b/files/KoreBuild/scripts/dotnet-install.sh @@ -783,6 +783,7 @@ install_dir="" architecture="" dry_run=false no_path=false +no_cdn=false azure_feed="https://dotnetcli.azureedge.net/dotnet" uncached_feed="https://dotnetcli.blob.core.windows.net/dotnet" feed_credential="" @@ -834,6 +835,9 @@ do --verbose|-[Vv]erbose) verbose=true ;; + --no-cdn|-[Nn]o[Cc]dn) + no_cdn=true + ;; --azure-feed|-[Aa]zure[Ff]eed) shift azure_feed="$1" @@ -895,6 +899,7 @@ do echo " --verbose,-Verbose Display diagnostics information." echo " --azure-feed,-AzureFeed Azure feed location. Defaults to $azure_feed, This parameter typically is not changed by the user." echo " --uncached-feed,-UncachedFeed Uncached feed location. This parameter typically is not changed by the user." + echo " --no-cdn,-NoCdn Disable downloading from the Azure CDN, and used the uncached feed directly." echo " --feed-credential,-FeedCredential Azure feed shared access token. This parameter typically is not specified." echo " --runtime-id Installs the .NET Tools for the given platform (use linux-x64 for portable linux)." echo " -RuntimeId" @@ -920,6 +925,10 @@ do shift done +if [ "$no_cdn" = true ]; then + azure_feed="$uncached_feed" +fi + check_min_reqs calculate_vars diff --git a/files/KoreBuild/scripts/get-dotnet.sh b/files/KoreBuild/scripts/get-dotnet.sh index 5f7eb6227..4b42080f0 100755 --- a/files/KoreBuild/scripts/get-dotnet.sh +++ b/files/KoreBuild/scripts/get-dotnet.sh @@ -24,6 +24,7 @@ __install_shared_runtime() { --skip-non-versioned-files \ --channel "$channel" \ --version "$version" \ + --no-cdn \ $verbose_flag return $? @@ -99,6 +100,7 @@ if [ ! -f "$install_dir/sdk/$version/dotnet.dll" ]; then --architecture x64 \ --channel "$channel" \ --version "$version" \ + --no-cdn \ $verbose_flag else echo -e "${GRAY}.NET Core SDK $version is already installed. Skipping installation.${RESET}" diff --git a/tools/KoreBuild.Console/Commands/InstallToolsCommand.cs b/tools/KoreBuild.Console/Commands/InstallToolsCommand.cs index df9f2885f..407d28d64 100644 --- a/tools/KoreBuild.Console/Commands/InstallToolsCommand.cs +++ b/tools/KoreBuild.Console/Commands/InstallToolsCommand.cs @@ -111,7 +111,10 @@ private void InstallCLI(string script, string installDir, string architecture, s "-Channel", channel, "-Version", version, "-Architecture", architecture, - "-InstallDir", installDir + "-InstallDir", installDir, + // workaround for https://github.com/dotnet/cli/issues/9143 + // disable the CDN, which has non-deterministic behavior when multiple builds of the same SDK version exist + "-NoCdn", }); var psi = new ProcessStartInfo From edf0705d014293c260de763543784330514db9a3 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 26 Apr 2018 12:51:28 -0700 Subject: [PATCH 005/192] Update to SDK 2.1.300-rc1-008669 --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 3599b7a92..4074d6938 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -2.1.300-rc1-008662 +2.1.300-rc1-008669 From ad420cfebecc838037207a9c1b34174ad27e80df Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 3 May 2018 11:39:59 -0700 Subject: [PATCH 006/192] Add a rule to verify NuGet package signing --- build/repo.targets | 12 +- build/tasks/RepoTasks.csproj | 2 + build/tasks/RepoTasks.tasks | 2 + .../SigningVerificationCompositeRule.cs | 4 +- .../console/PackageIssueFactory.cs | 9 ++ .../console/Rules/PackageSigningrule.cs | 71 +++++++++++ .../Rules/PackagSigningRuleTests.cs | 116 ++++++++++++++++++ ...gnRequestListsAllSignableFilesRuleTests.cs | 56 +++++---- .../Utilities/DisposableDirectory.cs | 35 ++++++ .../Utilities/SolutionDirectory.cs | 34 +++++ .../{ => Utilities}/TestLogger.cs | 2 +- ...elper.cs => TestPackageAnalysisContext.cs} | 52 ++++---- 12 files changed, 339 insertions(+), 56 deletions(-) create mode 100644 modules/NuGetPackageVerifier/console/Rules/PackageSigningrule.cs create mode 100644 test/NuGetPackageVerifier.Tests/Rules/PackagSigningRuleTests.cs rename test/NuGetPackageVerifier.Tests/{ => Rules}/SignRequestListsAllSignableFilesRuleTests.cs (52%) create mode 100644 test/NuGetPackageVerifier.Tests/Utilities/DisposableDirectory.cs create mode 100644 test/NuGetPackageVerifier.Tests/Utilities/SolutionDirectory.cs rename test/NuGetPackageVerifier.Tests/{ => Utilities}/TestLogger.cs (92%) rename test/NuGetPackageVerifier.Tests/Utilities/{TestHelper.cs => TestPackageAnalysisContext.cs} (60%) diff --git a/build/repo.targets b/build/repo.targets index 2fb41bb5f..52bdce920 100644 --- a/build/repo.targets +++ b/build/repo.targets @@ -1,6 +1,7 @@ + <_NuGetExeDownloadPath>$(IntermediateDir)nuget.exe <_KoreBuildIntermediateDir>$(IntermediateDir)korebuild\ <_KoreBuildIntermediateDir>$([MSBuild]::NormalizeDirectory($(_KoreBuildIntermediateDir))) <_KoreBuildOutDir>$(ArtifactsDir)korebuild\artifacts\$(Version)\ @@ -8,7 +9,7 @@ $(_KoreBuildOutDir)korebuild.$(Version).zip $(_ChannelOutDir)badge.svg $(_ChannelOutDir)latest.txt - $(PrepareDependsOn);SetTeamCityBuildNumberToVersion + $(PrepareDependsOn);SetTeamCityBuildNumberToVersion;DownloadNuGetExe @@ -24,7 +25,6 @@ - @@ -37,6 +37,12 @@ + + + + @@ -71,6 +77,8 @@ + + diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index 0d810d282..727eb1314 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -17,6 +17,8 @@ + + diff --git a/build/tasks/RepoTasks.tasks b/build/tasks/RepoTasks.tasks index f0ca0630a..507aa66fb 100644 --- a/build/tasks/RepoTasks.tasks +++ b/build/tasks/RepoTasks.tasks @@ -8,4 +8,6 @@ + + diff --git a/modules/NuGetPackageVerifier/console/CompositeRules/SigningVerificationCompositeRule.cs b/modules/NuGetPackageVerifier/console/CompositeRules/SigningVerificationCompositeRule.cs index 28375d3f8..c5d432fbf 100644 --- a/modules/NuGetPackageVerifier/console/CompositeRules/SigningVerificationCompositeRule.cs +++ b/modules/NuGetPackageVerifier/console/CompositeRules/SigningVerificationCompositeRule.cs @@ -1,7 +1,6 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// 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.Collections.Generic; namespace NuGetPackageVerifier.Rules { @@ -14,6 +13,7 @@ public class SigningVerificationCompositeRule : CompositeRule new AuthenticodeSigningRule(), new PowerShellScriptIsSignedRule(), new PackageOwnershipRule(), + new PackageSigningRule(), new PrereleaseDependenciesVersionRule(), }; } diff --git a/modules/NuGetPackageVerifier/console/PackageIssueFactory.cs b/modules/NuGetPackageVerifier/console/PackageIssueFactory.cs index ac493cfe0..87188e4ec 100644 --- a/modules/NuGetPackageVerifier/console/PackageIssueFactory.cs +++ b/modules/NuGetPackageVerifier/console/PackageIssueFactory.cs @@ -205,6 +205,15 @@ public static PackageVerifierIssue CopyrightIsIncorrect(string packageId, string PackageIssueLevel.Error); } + public static PackageVerifierIssue PackageSignVerificationFailed(string packageId, string issueText) + { + return new PackageVerifierIssue( + "PACKAGE_SIGN_VERIFICATION_FAILED", + packageId, + $"Sign verification for package {packageId} failed: {issueText}", + PackageIssueLevel.Error); + } + public static PackageVerifierIssue AuthorIsIncorrect(string packageId, string expectedAuthor, string actualAuthor) { return new PackageVerifierIssue("PACKAGE_AUTHOR_INCORRECT", packageId, string.Format( diff --git a/modules/NuGetPackageVerifier/console/Rules/PackageSigningrule.cs b/modules/NuGetPackageVerifier/console/Rules/PackageSigningrule.cs new file mode 100644 index 000000000..f7dd6488d --- /dev/null +++ b/modules/NuGetPackageVerifier/console/Rules/PackageSigningrule.cs @@ -0,0 +1,71 @@ +// 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.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; +using Microsoft.Extensions.CommandLineUtils; + +namespace NuGetPackageVerifier.Rules +{ + public class PackageSigningRule : IPackageVerifierRule + { + private readonly string _nuGetExePath; + + public PackageSigningRule() + : this(GetKorebuildNuGetPath()) + { + } + + public PackageSigningRule(string exePath) + { + if (!File.Exists(exePath)) + { + throw new ArgumentException($"NuGet.exe could not be located at {exePath}", nameof(exePath)); + } + + _nuGetExePath = exePath; + } + + private static string GetKorebuildNuGetPath() + { + // KoreBuild/nuget.exe + // KoreBuild/modules/NuGetPackageVerifier/ + return Path.Combine(AppContext.BaseDirectory, "..", "..", "nuget.exe"); + } + + public IEnumerable Validate(PackageAnalysisContext context) + { + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + throw new InvalidOperationException("Package sign verification is only supported on Windows machines"); + } + + var args = new[] + { + "verify", + "-NonInteractive", + "-All", + context.PackageFileInfo.FullName, + }; + + var psi = new ProcessStartInfo + { + FileName = _nuGetExePath, + Arguments = ArgumentEscaper.EscapeAndConcatenate(args), + RedirectStandardOutput = true, + }; + + var process = Process.Start(psi); + process.WaitForExit(); + + if (process.ExitCode != 0) + { + var issueText = process.StandardOutput.ReadToEnd(); + yield return PackageIssueFactory.PackageSignVerificationFailed(context.Metadata.Id, issueText); + } + } + } +} diff --git a/test/NuGetPackageVerifier.Tests/Rules/PackagSigningRuleTests.cs b/test/NuGetPackageVerifier.Tests/Rules/PackagSigningRuleTests.cs new file mode 100644 index 000000000..e3bd80e8e --- /dev/null +++ b/test/NuGetPackageVerifier.Tests/Rules/PackagSigningRuleTests.cs @@ -0,0 +1,116 @@ +// 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 System.Net.Http; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using NuGetPackageVerifier.Rules; +using NuGetPackageVerifier.Utilities; +using Xunit; +using Xunit.Abstractions; + +namespace NuGetPackageVerifier +{ + public class PackagSigningRuleTests + { + private readonly ITestOutputHelper _output; + + public PackagSigningRuleTests(ITestOutputHelper output) + { + _output = output; + } + + [Fact] + public void Validate_ReturnsErrorIssue_IfPackageNotSigned() + { + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + // PackageSign verification only works on desktop + return; + } + + // Arrange + var context = TestPackageAnalysisContext.CreateContext( + _output, + new[] { "lib/netstandard2.0/Test.dll", "tools/MyScript.psd1" }); + + using (context) + { + var rule = GetRule(); + + // Act + var issues = rule.Validate(context); + + // Assert + Assert.Collection( + issues, + issue => + { + Assert.Equal(TestPackageAnalysisContext.PackageId, issue.Instance); + Assert.Equal("PACKAGE_SIGN_VERIFICATION_FAILED", issue.IssueId); + Assert.Equal(PackageIssueLevel.Error, issue.Level); + Assert.StartsWith($"Sign verification for package {TestPackageAnalysisContext.PackageId} failed:", issue.Issue); + }); + } + } + + [Fact] + public async Task Validate_ReturnsEmpty() + { + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + // PackageSign verification only works on desktop + return; + } + + // Arrange + const string DownloadUri = "https://dotnet.myget.org/F/dotnet-core/api/v2/package/Microsoft.AspNetCore.All/2.1.0-rc1-30682"; + using (var disposableDirectory = new DisposableDirectory()) + { + var file = await DownloadFileAsync(DownloadUri, disposableDirectory.Path); + + var context = new PackageAnalysisContext + { + Logger = new TestLogger(_output), + PackageFileInfo = new FileInfo(file), + }; + + var rule = GetRule(); + + // Act + var issues = rule.Validate(context); + + // Assert + Assert.Empty(issues); + } + } + + private static PackageSigningRule GetRule() + { + var solutionDir = SolutionDirectory.GetSolutionRootDirectory(); + var nugetExe = Path.Combine(solutionDir, "obj", "nuget.exe"); + if (!File.Exists(nugetExe)) + { + throw new FileNotFoundException($"File {nugetExe} could not be found. Ensure build /t:Prepare is invoked from the root of this repository, before this test is executed."); + } + + return new PackageSigningRule(nugetExe); + } + + private async Task DownloadFileAsync(string downloadUri, string basePath) + { + var client = new HttpClient(); + var response = await client.GetAsync(downloadUri); + + var fileName = Path.GetRandomFileName(); + var filePath = Path.Combine(basePath, fileName); + using (var fileStream = File.Create(filePath)) + { + await response.Content.CopyToAsync(fileStream); + } + + return filePath; + } + } +} diff --git a/test/NuGetPackageVerifier.Tests/SignRequestListsAllSignableFilesRuleTests.cs b/test/NuGetPackageVerifier.Tests/Rules/SignRequestListsAllSignableFilesRuleTests.cs similarity index 52% rename from test/NuGetPackageVerifier.Tests/SignRequestListsAllSignableFilesRuleTests.cs rename to test/NuGetPackageVerifier.Tests/Rules/SignRequestListsAllSignableFilesRuleTests.cs index 821f6f9f2..48f189165 100644 --- a/test/NuGetPackageVerifier.Tests/SignRequestListsAllSignableFilesRuleTests.cs +++ b/test/NuGetPackageVerifier.Tests/Rules/SignRequestListsAllSignableFilesRuleTests.cs @@ -3,11 +3,11 @@ using System; using NuGetPackageVerifier.Rules; -using NuGetPackageVerifier.Tests.Utilities; +using NuGetPackageVerifier.Utilities; using Xunit; using Xunit.Abstractions; -namespace NuGetPackageVerifier.Tests +namespace NuGetPackageVerifier { public class SignRequestListsAllSignableFilesRuleTests { @@ -27,23 +27,27 @@ public void ItFailsWhenPackageContainsUnlistedFiles() "; - var context = TestHelper.CreateAnalysisContext(_output, - new[] { "lib/netstandard2.0/Test.dll", "tools/MyScript.psd1" }, - signRequest: signRequest); + var context = TestPackageAnalysisContext.CreateContext( + _output, + new[] { "lib/netstandard2.0/Test.dll", "tools/MyScript.psd1" }, + signRequest: signRequest); - var rule = new SignRequestListsAllSignableFiles(); + using (context) + { + var rule = new SignRequestListsAllSignableFiles(); - var errors = rule.Validate(context); + var errors = rule.Validate(context); - Assert.NotEmpty(errors); + Assert.NotEmpty(errors); - Assert.Contains(errors, e => - e.Instance.Equals("lib/netstandard2.0/Test.dll", StringComparison.Ordinal) - && e.IssueId.Equals("FILE_MISSING_FROM_SIGN_REQUEST", StringComparison.Ordinal)); + Assert.Contains(errors, e => + e.Instance.Equals("lib/netstandard2.0/Test.dll", StringComparison.Ordinal) && + e.IssueId.Equals("FILE_MISSING_FROM_SIGN_REQUEST", StringComparison.Ordinal)); - Assert.Contains(errors, e => - e.Instance.Equals("tools/MyScript.psd1", StringComparison.Ordinal) - && e.IssueId.Equals("FILE_MISSING_FROM_SIGN_REQUEST", StringComparison.Ordinal)); + Assert.Contains(errors, e => + e.Instance.Equals("tools/MyScript.psd1", StringComparison.Ordinal) && + e.IssueId.Equals("FILE_MISSING_FROM_SIGN_REQUEST", StringComparison.Ordinal)); + } } [Fact] @@ -57,15 +61,19 @@ public void DoesNotFailWhenSignRequestIncludesAllFiles() "; - var context = TestHelper.CreateAnalysisContext(_output, + var context = TestPackageAnalysisContext.CreateContext( + _output, new[] { "lib/netstandard2.0/Test.dll", "tools/MyScript.psd1" }, signRequest: signRequest); - var rule = new SignRequestListsAllSignableFiles(); + using (context) + { + var rule = new SignRequestListsAllSignableFiles(); - var errors = rule.Validate(context); + var errors = rule.Validate(context); - Assert.Empty(errors); + Assert.Empty(errors); + } } [Fact] @@ -79,15 +87,19 @@ public void DoesNotFailWhenSignRequestListsAllFiles() "; - var context = TestHelper.CreateAnalysisContext(_output, + var context = TestPackageAnalysisContext.CreateContext( + _output, new[] { "lib/netstandard2.0/Test.dll", "tools/MyScript.psd1" }, signRequest: signRequest); - var rule = new SignRequestListsAllSignableFiles(); + using (context) + { + var rule = new SignRequestListsAllSignableFiles(); - var errors = rule.Validate(context); + var errors = rule.Validate(context); - Assert.Empty(errors); + Assert.Empty(errors); + } } } } diff --git a/test/NuGetPackageVerifier.Tests/Utilities/DisposableDirectory.cs b/test/NuGetPackageVerifier.Tests/Utilities/DisposableDirectory.cs new file mode 100644 index 000000000..c3d21b2bc --- /dev/null +++ b/test/NuGetPackageVerifier.Tests/Utilities/DisposableDirectory.cs @@ -0,0 +1,35 @@ +// 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.IO; +using IOPath = System.IO.Path; + +namespace NuGetPackageVerifier.Utilities +{ + internal class DisposableDirectory : IDisposable + { + public DisposableDirectory() + { + Path = IOPath.Combine(AppContext.BaseDirectory, IOPath.GetRandomFileName()); + Directory.CreateDirectory(Path); + } + + public string Path { get; } + + public void Dispose() + { + try + { + if (Directory.Exists(Path)) + { + Directory.Delete(Path, recursive: true); + } + } + catch + { + // Don't throw if we fail to delete the test directory. + } + } + } +} diff --git a/test/NuGetPackageVerifier.Tests/Utilities/SolutionDirectory.cs b/test/NuGetPackageVerifier.Tests/Utilities/SolutionDirectory.cs new file mode 100644 index 000000000..d121cf5ba --- /dev/null +++ b/test/NuGetPackageVerifier.Tests/Utilities/SolutionDirectory.cs @@ -0,0 +1,34 @@ +// 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.IO; + +namespace NuGetPackageVerifier.Utilities +{ + internal static class SolutionDirectory + { + public static string GetSolutionRootDirectory() + { + const string SolutionFileName = "BuildTools.sln"; + var applicationBasePath = AppContext.BaseDirectory; + var directoryInfo = new DirectoryInfo(applicationBasePath); + + do + { + var projectFileInfo = new FileInfo(Path.Combine(directoryInfo.FullName, SolutionFileName)); + if (projectFileInfo.Exists) + { + return projectFileInfo.DirectoryName; + } + + directoryInfo = directoryInfo.Parent; + } + while (directoryInfo.Parent != null); + + throw new FileNotFoundException( + $"Solution file {SolutionFileName} could not be found in {applicationBasePath} or its parent directories.", + SolutionFileName); + } + } +} diff --git a/test/NuGetPackageVerifier.Tests/TestLogger.cs b/test/NuGetPackageVerifier.Tests/Utilities/TestLogger.cs similarity index 92% rename from test/NuGetPackageVerifier.Tests/TestLogger.cs rename to test/NuGetPackageVerifier.Tests/Utilities/TestLogger.cs index db9b2b702..7d9d60928 100644 --- a/test/NuGetPackageVerifier.Tests/TestLogger.cs +++ b/test/NuGetPackageVerifier.Tests/Utilities/TestLogger.cs @@ -4,7 +4,7 @@ using NuGetPackageVerifier.Logging; using Xunit.Abstractions; -namespace NuGetPackageVerifier.Tests.Utilities +namespace NuGetPackageVerifier.Utilities { internal class TestLogger : IPackageVerifierLogger { diff --git a/test/NuGetPackageVerifier.Tests/Utilities/TestHelper.cs b/test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs similarity index 60% rename from test/NuGetPackageVerifier.Tests/Utilities/TestHelper.cs rename to test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs index ba587c976..1274f53dc 100644 --- a/test/NuGetPackageVerifier.Tests/Utilities/TestHelper.cs +++ b/test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs @@ -1,32 +1,40 @@ // 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.IO; using NuGet.Packaging; using NuGet.Versioning; using NuGetPackageVerifier.Manifests; using Xunit.Abstractions; -namespace NuGetPackageVerifier.Tests.Utilities +namespace NuGetPackageVerifier.Utilities { - public class TestHelper + internal class TestPackageAnalysisContext : PackageAnalysisContext { - public static PackageAnalysisContext CreateAnalysisContext(ITestOutputHelper output, string[] emptyFiles, string version = "1.0.0", string signRequest = null) - { - const string packageId = "TestPackage"; - var basePath = Path.Combine(AppContext.BaseDirectory, Path.GetRandomFileName()); - var nupkgFileName = $"{packageId}.{version}.nupkg"; - var nupkgPath = Path.Combine(basePath, nupkgFileName); + public const string PackageId = "TestPackage"; + private readonly DisposableDirectory _disposableDirectory; - Directory.CreateDirectory(basePath); + private TestPackageAnalysisContext(DisposableDirectory disposableDirectory) + { + _disposableDirectory = disposableDirectory; + } + public static PackageAnalysisContext CreateContext( + ITestOutputHelper output, + string[] emptyFiles, + string version = "1.0.0", + string signRequest = null) + { + var disposableDirectory = new DisposableDirectory(); + var basePath = disposableDirectory.Path; + var nupkgFileName = $"{PackageId}.{version}.nupkg"; + var nupkgPath = Path.Combine(basePath, nupkgFileName); var builder = new PackageBuilder(); builder.Populate(new ManifestMetadata { - Id = packageId, + Id = PackageId, Version = new NuGetVersion(version), Authors = new[] { "Test" }, Description = "Test", @@ -34,7 +42,6 @@ public static PackageAnalysisContext CreateAnalysisContext(ITestOutputHelper out using (var nupkg = File.Create(nupkgPath)) { - foreach (var dest in emptyFiles) { var fileName = Path.GetFileName(dest); @@ -54,7 +61,7 @@ public static PackageAnalysisContext CreateAnalysisContext(ITestOutputHelper out packageSignRequest = signManifest.PackageSignRequests[nupkgPath]; } - var context = new TempPackageAnalysisContext(basePath) + var context = new TestPackageAnalysisContext(disposableDirectory) { Logger = new TestLogger(output), PackageFileInfo = new FileInfo(nupkgPath), @@ -65,23 +72,10 @@ public static PackageAnalysisContext CreateAnalysisContext(ITestOutputHelper out return context; } - private class TempPackageAnalysisContext : PackageAnalysisContext + public override void Dispose() { - private string _tempPath; - - public TempPackageAnalysisContext(string tempPath) - { - this._tempPath = tempPath; - } - - public override void Dispose() - { - base.Dispose(); - if (Directory.Exists(_tempPath)) - { - Directory.Delete(_tempPath, recursive: true); - } - } + base.Dispose(); + _disposableDirectory.Dispose(); } } } From bf7e5b4c1a57c7661b241c69e4bf6de0e33f82bd Mon Sep 17 00:00:00 2001 From: Pranav K Date: Thu, 3 May 2018 13:13:44 -0700 Subject: [PATCH 007/192] PR comments --- .../console/Rules/PackageSigningrule.cs | 2 +- .../NuGetPackageVerifier.Tests.csproj | 4 ++ .../Rules/PackagSigningRuleTests.cs | 44 ++++++------------ .../SignedNupkg.nupkg | Bin 0 -> 13506 bytes 4 files changed, 18 insertions(+), 32 deletions(-) create mode 100644 test/NuGetPackageVerifier.Tests/SignedNupkg.nupkg diff --git a/modules/NuGetPackageVerifier/console/Rules/PackageSigningrule.cs b/modules/NuGetPackageVerifier/console/Rules/PackageSigningrule.cs index f7dd6488d..00a41433b 100644 --- a/modules/NuGetPackageVerifier/console/Rules/PackageSigningrule.cs +++ b/modules/NuGetPackageVerifier/console/Rules/PackageSigningrule.cs @@ -59,7 +59,7 @@ public IEnumerable Validate(PackageAnalysisContext context }; var process = Process.Start(psi); - process.WaitForExit(); + process.WaitForExit(60 * 1000); if (process.ExitCode != 0) { diff --git a/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj b/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj index cfb147cfa..6d8450b89 100644 --- a/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj +++ b/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj @@ -14,4 +14,8 @@ + + + + diff --git a/test/NuGetPackageVerifier.Tests/Rules/PackagSigningRuleTests.cs b/test/NuGetPackageVerifier.Tests/Rules/PackagSigningRuleTests.cs index e3bd80e8e..c7328e8bc 100644 --- a/test/NuGetPackageVerifier.Tests/Rules/PackagSigningRuleTests.cs +++ b/test/NuGetPackageVerifier.Tests/Rules/PackagSigningRuleTests.cs @@ -1,6 +1,7 @@ // 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.IO; using System.Net.Http; using System.Runtime.InteropServices; @@ -56,7 +57,7 @@ public void Validate_ReturnsErrorIssue_IfPackageNotSigned() } [Fact] - public async Task Validate_ReturnsEmpty() + public void Validate_ReturnsEmpty() { if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { @@ -65,25 +66,21 @@ public async Task Validate_ReturnsEmpty() } // Arrange - const string DownloadUri = "https://dotnet.myget.org/F/dotnet-core/api/v2/package/Microsoft.AspNetCore.All/2.1.0-rc1-30682"; - using (var disposableDirectory = new DisposableDirectory()) + var signedNupkgFile = Path.Combine(AppContext.BaseDirectory, "SignedNupkg.nupkg"); + + var context = new PackageAnalysisContext { - var file = await DownloadFileAsync(DownloadUri, disposableDirectory.Path); + Logger = new TestLogger(_output), + PackageFileInfo = new FileInfo(signedNupkgFile), + }; - var context = new PackageAnalysisContext - { - Logger = new TestLogger(_output), - PackageFileInfo = new FileInfo(file), - }; + var rule = GetRule(); - var rule = GetRule(); + // Act + var issues = rule.Validate(context); - // Act - var issues = rule.Validate(context); - - // Assert - Assert.Empty(issues); - } + // Assert + Assert.Empty(issues); } private static PackageSigningRule GetRule() @@ -97,20 +94,5 @@ private static PackageSigningRule GetRule() return new PackageSigningRule(nugetExe); } - - private async Task DownloadFileAsync(string downloadUri, string basePath) - { - var client = new HttpClient(); - var response = await client.GetAsync(downloadUri); - - var fileName = Path.GetRandomFileName(); - var filePath = Path.Combine(basePath, fileName); - using (var fileStream = File.Create(filePath)) - { - await response.Content.CopyToAsync(fileStream); - } - - return filePath; - } } } diff --git a/test/NuGetPackageVerifier.Tests/SignedNupkg.nupkg b/test/NuGetPackageVerifier.Tests/SignedNupkg.nupkg new file mode 100644 index 0000000000000000000000000000000000000000..afcb98896c8f6288de2c4fb24e9f606ff73a0628 GIT binary patch literal 13506 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 Date: Fri, 4 May 2018 10:03:45 -0700 Subject: [PATCH 008/192] Remove dependency on Newtonsoft.Json from Internal.AspNetCore.Sdk --- .../BuildTools.Tasks/BuildTools.Tasks.csproj | 1 - .../BuildTools.Tasks/BuildTools.Tasks.props | 1 - modules/BuildTools.Tasks/CreateSourceLink.cs | 56 +++++++-- modules/BuildTools.Tasks/JsonPeek.cs | 96 --------------- .../Internal.AspNetCore.Sdk.csproj | 1 - test/BuildTools.Tasks.Tests/JsonPeekTests.cs | 111 ------------------ 6 files changed, 47 insertions(+), 219 deletions(-) delete mode 100644 modules/BuildTools.Tasks/JsonPeek.cs delete mode 100644 test/BuildTools.Tasks.Tests/JsonPeekTests.cs diff --git a/modules/BuildTools.Tasks/BuildTools.Tasks.csproj b/modules/BuildTools.Tasks/BuildTools.Tasks.csproj index a6eef1ec6..04b4be81a 100644 --- a/modules/BuildTools.Tasks/BuildTools.Tasks.csproj +++ b/modules/BuildTools.Tasks/BuildTools.Tasks.csproj @@ -19,7 +19,6 @@ - diff --git a/modules/BuildTools.Tasks/BuildTools.Tasks.props b/modules/BuildTools.Tasks/BuildTools.Tasks.props index 15bb0c635..8eb553e98 100644 --- a/modules/BuildTools.Tasks/BuildTools.Tasks.props +++ b/modules/BuildTools.Tasks/BuildTools.Tasks.props @@ -10,7 +10,6 @@ Condition="'$(MSBuildRuntimeType)' == 'Core'"/> - diff --git a/modules/BuildTools.Tasks/CreateSourceLink.cs b/modules/BuildTools.Tasks/CreateSourceLink.cs index e4b0a270c..2210078dc 100644 --- a/modules/BuildTools.Tasks/CreateSourceLink.cs +++ b/modules/BuildTools.Tasks/CreateSourceLink.cs @@ -2,11 +2,11 @@ // 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.IO; +using System.Text; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; namespace Microsoft.AspNetCore.BuildTools { @@ -51,20 +51,52 @@ public override bool Execute() SourceLinkRoot += '*'; var codeSource = ConvertUrl(); - var data = new JObject + + // TODO allow multiple. See https://github.com/aspnet/Universe/issues/858 + var mappings = new List { - ["documents"] = new JObject - { - [SourceLinkRoot] = codeSource - } + new Mapping { LocalPath = SourceLinkRoot, Url = codeSource }, }; - File.WriteAllText(DestinationFile, data.ToString(Formatting.None)); + GenerateSourceLink(DestinationFile, mappings); SourceLinkFile = DestinationFile; - return true; } + private static void GenerateSourceLink(string filePath, List mappings) + { + var data = new StringBuilder(); + data.Append("{\"documents\":{"); + + // not bullet-proof, but should be good enough for escaping paths + string JsonEscape(string str) + => str.Replace(@"\", @"\\").Replace("\"", "\\\""); + + var first = true; + foreach (var mapping in mappings) + { + if (first) + { + first = false; + } + else + { + data.Append(","); + } + + data + .Append('"') + .Append(JsonEscape(mapping.LocalPath)) + .Append("\":\"") + .Append(JsonEscape(mapping.Url)) + .Append('"'); + } + + data.Append("}}"); + + File.WriteAllText(filePath, data.ToString()); + } + private string ConvertUrl() { if (!OriginUrl.Contains("github.com")) @@ -82,5 +114,11 @@ private string ConvertUrl() return $"https://raw.githubusercontent.com/{repoName}/{Commit}/*"; } + + private struct Mapping + { + public string LocalPath; + public string Url; + } } } diff --git a/modules/BuildTools.Tasks/JsonPeek.cs b/modules/BuildTools.Tasks/JsonPeek.cs deleted file mode 100644 index 6be07255d..000000000 --- a/modules/BuildTools.Tasks/JsonPeek.cs +++ /dev/null @@ -1,96 +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.IO; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace Microsoft.AspNetCore.BuildTools -{ -#if SDK - public class Sdk_JsonPeek : Task -#elif BuildTools - public class JsonPeek : Task -#else -#error This must be built either for an SDK or for BuildTools -#endif - - { - /// - /// Specifies the JSONPath query. - /// - [Required] - public string Query { get; set; } - - /// - /// Specifies the JSON input as a file path. - /// - public string JsonInputPath { get; set; } - - /// - /// Specifies the JSON input as a string. - /// - public string JsonContent { get; set; } - - /// - /// Contains the results that are returned by this task. - /// - [Output] - public ITaskItem[] Result { get; set; } - - public override bool Execute() - { - // pre-set the result in case we exit early - Result = Array.Empty(); - - if (!string.IsNullOrEmpty(JsonInputPath) && !string.IsNullOrEmpty(JsonContent)) - { - Log.LogError($"Cannot specify both {nameof(JsonInputPath)} and {nameof(JsonContent)}."); - return false; - } - - try - { - JToken token; - if (!string.IsNullOrEmpty(JsonContent)) - { - token = JToken.Parse(JsonContent); - } - else - { - if (!File.Exists(JsonInputPath)) - { - Log.LogError("File does not exist: {path}", JsonInputPath); - return false; - } - - using (var stream = File.OpenRead(JsonInputPath)) - using (var reader = new StreamReader(stream)) - using (var json = new JsonTextReader(reader)) - { - token = JToken.ReadFrom(json); - } - } - - var results = new List(); - foreach (var result in token.SelectTokens(Query)) - { - var item = new TaskItem(result.ToString()); - item.SetMetadata("Type", result.Type.ToString()); - results.Add(item); - } - Result = results.ToArray(); - return true; - } - catch (JsonException ex) - { - Log.LogErrorFromException(ex, showStackTrace: false); - return false; - } - } - } -} diff --git a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj index d81582b83..489a5c805 100644 --- a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj +++ b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj @@ -23,7 +23,6 @@ - diff --git a/test/BuildTools.Tasks.Tests/JsonPeekTests.cs b/test/BuildTools.Tasks.Tests/JsonPeekTests.cs deleted file mode 100644 index 4f3cc5b42..000000000 --- a/test/BuildTools.Tasks.Tests/JsonPeekTests.cs +++ /dev/null @@ -1,111 +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.IO; -using Microsoft.AspNetCore.BuildTools; -using Xunit; - -namespace BuildTools.Tasks.Tests -{ - public class JsonPeekTests - { - [Fact] - public void CanReadJsonFile() - { - var filepath = Path.Combine(AppContext.BaseDirectory, "Resources", "sampledata.json"); - var task = new JsonPeek - { - BuildEngine = new MockEngine(), - JsonInputPath = filepath, - Query = "$.sdk.version" - }; - - Assert.True(task.Execute(), "Task should pass"); - var result = Assert.Single(task.Result); - Assert.Equal("1.2.3", result.ItemSpec); - Assert.Equal("String", result.GetMetadata("Type")); - } - - [Fact] - public void CanReadContent() - { - var filepath = Path.Combine(AppContext.BaseDirectory, "Resources", "sampledata.json"); - var content = File.ReadAllText(filepath); - var task = new JsonPeek - { - BuildEngine = new MockEngine(), - JsonContent = content, - Query = "$.runtimes[*].version" - }; - - Assert.True(task.Execute(), "Task should pass"); - Assert.Collection(task.Result, - i => Assert.Equal("1.0.0-beta", i.ItemSpec), - i => Assert.Equal("1.0.0-alpha", i.ItemSpec)); - } - - [Fact] - public void HandlesEmptyQuery() - { - var task = new JsonPeek - { - BuildEngine = new MockEngine(), - JsonContent = "{}", - Query = "$.dne.property.notthere" - }; - - Assert.True(task.Execute(), "Task should pass"); - Assert.Empty(task.Result); - } - - [Fact] - public void HandlesBadQuery() - { - var engine = new MockEngine { ContinueOnError = true }; - var task = new JsonPeek - { - BuildEngine = engine, - JsonContent = "{}", - Query = "this is bad JSONPath syntax" - }; - - Assert.False(task.Execute(), "Task should not pass"); - var error = Assert.Single(engine.Errors); - Assert.Contains("Unexpected character while parsing path", error.Message); - Assert.NotNull(task.Result); - } - - [Fact] - public void HandlesBadJson() - { - var engine = new MockEngine { ContinueOnError = true }; - var task = new JsonPeek - { - BuildEngine = engine, - JsonContent = "{ obj: }", - Query = "" - }; - - Assert.False(task.Execute(), "Task should not pass"); - var error = Assert.Single(engine.Errors); - Assert.Contains("Unexpected character encountered while parsing value", error.Message); - Assert.NotNull(task.Result); - } - - [Fact] - public void InvalidToSpecifyContentAndPath() - { - var task = new JsonPeek - { - BuildEngine = new MockEngine { ContinueOnError = true }, - JsonInputPath = Path.Combine(AppContext.BaseDirectory, "Resources", "sampledata.json"), - JsonContent = "{}", - Query = "" - }; - - Assert.False(task.Execute(), "Task should not pass"); - Assert.NotNull(task.Result); - } - } -} From 9c4fefdcd2b950f8b6da5aa3784fe200eb0664c2 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 7 May 2018 16:42:18 -0700 Subject: [PATCH 009/192] Add NGPV rule to assert repository metadata is set in all packages --- build/dependencies.props | 4 +- .../modules/sharedsources/module.targets | 8 +++- .../CompositeRules/DefaultCompositeRule.cs | 3 +- .../console/PackageIssueFactory.cs | 32 +++++++++++++++ .../console/Rules/PackageRepoMetadataRule.cs | 37 +++++++++++++++++ .../console/Rules/PackageSigningrule.cs | 15 +++++-- .../Rules/PackageRepoMetadataRuleTests.cs | 41 +++++++++++++++++++ ...uleTests.cs => PackageSigningRuleTests.cs} | 6 +-- .../Utilities/TestPackageAnalysisContext.cs | 36 ++++++++++++---- 9 files changed, 162 insertions(+), 20 deletions(-) create mode 100644 modules/NuGetPackageVerifier/console/Rules/PackageRepoMetadataRule.cs create mode 100644 test/NuGetPackageVerifier.Tests/Rules/PackageRepoMetadataRuleTests.cs rename test/NuGetPackageVerifier.Tests/Rules/{PackagSigningRuleTests.cs => PackageSigningRuleTests.cs} (95%) diff --git a/build/dependencies.props b/build/dependencies.props index 86e9f3c36..f39f3c3eb 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -10,8 +10,8 @@ 4.7.99 10.0.1 - 4.3.0 - 4.3.0 + 4.7.0-rtm.5148 + 4.7.0-rtm.5148 1.4.0 1.5.0 2.2.7 diff --git a/files/KoreBuild/modules/sharedsources/module.targets b/files/KoreBuild/modules/sharedsources/module.targets index 648feff3a..5fa6ce5c0 100644 --- a/files/KoreBuild/modules/sharedsources/module.targets +++ b/files/KoreBuild/modules/sharedsources/module.targets @@ -34,7 +34,13 @@ that matches "$(RepositoryRoot)/shared/*.Sources". - <_SharedSourcesPackageProperties>PackageOutputPath=$(BuildDir);RepositoryRoot=$(RepositoryRoot);ImportDirectoryBuildProps=false;BuildNumber=$(BuildNumber); + <_SharedSourcesPackageProperties> + PackageOutputPath=$(BuildDir); + RepositoryRoot=$(RepositoryRoot); + ImportDirectoryBuildProps=false; + BuildNumber=$(BuildNumber); + RepositoryCommit=$(RepositoryCommit) + diff --git a/modules/NuGetPackageVerifier/console/CompositeRules/DefaultCompositeRule.cs b/modules/NuGetPackageVerifier/console/CompositeRules/DefaultCompositeRule.cs index 621a9de09..605b6c4b5 100644 --- a/modules/NuGetPackageVerifier/console/CompositeRules/DefaultCompositeRule.cs +++ b/modules/NuGetPackageVerifier/console/CompositeRules/DefaultCompositeRule.cs @@ -1,8 +1,6 @@ // 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.Collections.Generic; - namespace NuGetPackageVerifier.Rules { public class DefaultCompositeRule : CompositeRule @@ -18,6 +16,7 @@ public class DefaultCompositeRule : CompositeRule new AssemblyHasServicingAttributeRule(), new AssemblyHasVersionAttributesRule(), new AssemblyStrongNameRule(), + new PackageRepoMetadataRule(), new PackageCopyrightRule(), new PackageAuthorRule(), new RequiredPackageMetadataRule(), diff --git a/modules/NuGetPackageVerifier/console/PackageIssueFactory.cs b/modules/NuGetPackageVerifier/console/PackageIssueFactory.cs index 87188e4ec..b05720d47 100644 --- a/modules/NuGetPackageVerifier/console/PackageIssueFactory.cs +++ b/modules/NuGetPackageVerifier/console/PackageIssueFactory.cs @@ -19,6 +19,38 @@ public static PackageVerifierIssue DotNetToolMustHaveManifest(string packageType ); } + public static PackageVerifierIssue PackageRepositoryMetadataMissing() + { + return new PackageVerifierIssue( + "PACKAGE_MISSING_REPO_METADATA", + "The package is missing metadata about the repository that produced this package.", + PackageIssueLevel.Warning); + } + + public static PackageVerifierIssue PackageRepositoryUrl() + { + return new PackageVerifierIssue( + "PACKAGE_MISSING_REPO_URL", + "The package is missing metadata about the repository url.", + PackageIssueLevel.Warning); + } + + public static PackageVerifierIssue PackageRepositoryType() + { + return new PackageVerifierIssue( + "PACKAGE_MISSING_REPO_TYPE", + "The package is missing metadata about the repository type.", + PackageIssueLevel.Warning); + } + + public static PackageVerifierIssue PackageRepositoryCommit() + { + return new PackageVerifierIssue( + "PACKAGE_MISSING_REPO_COMMIT", + "The package is missing metadata about the repository commit.", + PackageIssueLevel.Warning); + } + public static PackageVerifierIssue DotNetToolMissingEntryPoint(string manifestPath, string filePath) { return new PackageVerifierIssue( diff --git a/modules/NuGetPackageVerifier/console/Rules/PackageRepoMetadataRule.cs b/modules/NuGetPackageVerifier/console/Rules/PackageRepoMetadataRule.cs new file mode 100644 index 000000000..a86074aa5 --- /dev/null +++ b/modules/NuGetPackageVerifier/console/Rules/PackageRepoMetadataRule.cs @@ -0,0 +1,37 @@ +// 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.Collections.Generic; + +namespace NuGetPackageVerifier.Rules +{ + public class PackageRepoMetadataRule : IPackageVerifierRule + { + public IEnumerable Validate(PackageAnalysisContext context) + { + var repoMetadata = context.PackageReader.NuspecReader.GetRepositoryMetadata(); + + if (repoMetadata == null) + { + yield return PackageIssueFactory.PackageRepositoryMetadataMissing(); + } + else + { + if (string.IsNullOrEmpty(repoMetadata.Url)) + { + yield return PackageIssueFactory.PackageRepositoryUrl(); + } + + if (string.IsNullOrEmpty(repoMetadata.Type)) + { + yield return PackageIssueFactory.PackageRepositoryType(); + } + + if (string.IsNullOrEmpty(repoMetadata.Commit)) + { + yield return PackageIssueFactory.PackageRepositoryCommit(); + } + } + } + } +} diff --git a/modules/NuGetPackageVerifier/console/Rules/PackageSigningrule.cs b/modules/NuGetPackageVerifier/console/Rules/PackageSigningrule.cs index 00a41433b..d6ffccc13 100644 --- a/modules/NuGetPackageVerifier/console/Rules/PackageSigningrule.cs +++ b/modules/NuGetPackageVerifier/console/Rules/PackageSigningrule.cs @@ -5,6 +5,7 @@ using System.Collections.Generic; using System.Diagnostics; using System.IO; +using System.Linq; using System.Runtime.InteropServices; using Microsoft.Extensions.CommandLineUtils; @@ -31,9 +32,17 @@ public PackageSigningRule(string exePath) private static string GetKorebuildNuGetPath() { - // KoreBuild/nuget.exe - // KoreBuild/modules/NuGetPackageVerifier/ - return Path.Combine(AppContext.BaseDirectory, "..", "..", "nuget.exe"); + var searchPaths = new[] + { + // KoreBuild/nuget.exe + // KoreBuild/modules/NuGetPackageVerifier/ + Path.Combine(AppContext.BaseDirectory, "..", "..", "nuget.exe"), + + // obj/nuget.exe in local build root + Path.Combine(AppContext.BaseDirectory, "..", "..", "..", "..", "..", "..", "obj", "nuget.exe"), + }; + + return searchPaths.First(File.Exists); } public IEnumerable Validate(PackageAnalysisContext context) diff --git a/test/NuGetPackageVerifier.Tests/Rules/PackageRepoMetadataRuleTests.cs b/test/NuGetPackageVerifier.Tests/Rules/PackageRepoMetadataRuleTests.cs new file mode 100644 index 000000000..b882d80fc --- /dev/null +++ b/test/NuGetPackageVerifier.Tests/Rules/PackageRepoMetadataRuleTests.cs @@ -0,0 +1,41 @@ +// 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 NuGet.Packaging; +using NuGet.Packaging.Core; +using NuGetPackageVerifier.Rules; +using NuGetPackageVerifier.Utilities; +using Xunit; +using Xunit.Abstractions; + +namespace NuGetPackageVerifier +{ + public class PackageRepoMetadataRuleTests + { + private readonly ITestOutputHelper _output; + + public PackageRepoMetadataRuleTests(ITestOutputHelper output) + { + _output = output; + } + + [Fact] + public void ItWarnsAboutMissingMetadata() + { + var metadata = new ManifestMetadata + { + Repository = new RepositoryMetadata { }, + }; + + var rule = new PackageRepoMetadataRule(); + + using (var context = TestPackageAnalysisContext.Create(_output, metadata)) + { + Assert.Contains(rule.Validate(context), r => string.Equals(r.IssueId, "PACKAGE_MISSING_REPO_TYPE", StringComparison.Ordinal)); + Assert.Contains(rule.Validate(context), r => string.Equals(r.IssueId, "PACKAGE_MISSING_REPO_URL", StringComparison.Ordinal)); + Assert.Contains(rule.Validate(context), r => string.Equals(r.IssueId, "PACKAGE_MISSING_REPO_COMMIT", StringComparison.Ordinal)); + } + } + } +} diff --git a/test/NuGetPackageVerifier.Tests/Rules/PackagSigningRuleTests.cs b/test/NuGetPackageVerifier.Tests/Rules/PackageSigningRuleTests.cs similarity index 95% rename from test/NuGetPackageVerifier.Tests/Rules/PackagSigningRuleTests.cs rename to test/NuGetPackageVerifier.Tests/Rules/PackageSigningRuleTests.cs index c7328e8bc..f8ef79bde 100644 --- a/test/NuGetPackageVerifier.Tests/Rules/PackagSigningRuleTests.cs +++ b/test/NuGetPackageVerifier.Tests/Rules/PackageSigningRuleTests.cs @@ -3,9 +3,7 @@ using System; using System.IO; -using System.Net.Http; using System.Runtime.InteropServices; -using System.Threading.Tasks; using NuGetPackageVerifier.Rules; using NuGetPackageVerifier.Utilities; using Xunit; @@ -13,11 +11,11 @@ namespace NuGetPackageVerifier { - public class PackagSigningRuleTests + public class PackageSigningRuleTests { private readonly ITestOutputHelper _output; - public PackagSigningRuleTests(ITestOutputHelper output) + public PackageSigningRuleTests(ITestOutputHelper output) { _output = output; } diff --git a/test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs b/test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs index 1274f53dc..71bf30ebe 100644 --- a/test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs +++ b/test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs @@ -2,6 +2,7 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System.IO; +using System.Linq; using NuGet.Packaging; using NuGet.Versioning; using NuGetPackageVerifier.Manifests; @@ -24,21 +25,40 @@ public static PackageAnalysisContext CreateContext( string[] emptyFiles, string version = "1.0.0", string signRequest = null) + { + return Create(output, + new ManifestMetadata + { + Id = PackageId, + Version = new NuGetVersion(version), + }, + emptyFiles, + signRequest); + } + + public static PackageAnalysisContext Create( + ITestOutputHelper output, + ManifestMetadata metadata, + string[] emptyFiles = null, + string signRequest = null) { var disposableDirectory = new DisposableDirectory(); var basePath = disposableDirectory.Path; - var nupkgFileName = $"{PackageId}.{version}.nupkg"; + var nupkgFileName = $"{PackageId}.{metadata.Version}.nupkg"; var nupkgPath = Path.Combine(basePath, nupkgFileName); + // set required metadata + metadata.Id = metadata.Id ?? "Test"; + metadata.Version = metadata.Version ?? new NuGetVersion("1.0.0"); + metadata.Authors = metadata.Authors.Any() ? metadata.Authors : new[] { "test" }; + metadata.Description = metadata.Description ?? "Description"; + + // prevent PackageException for packages with no dependencies or content + emptyFiles = emptyFiles ?? new[] { "_._" }; + var builder = new PackageBuilder(); - builder.Populate(new ManifestMetadata - { - Id = PackageId, - Version = new NuGetVersion(version), - Authors = new[] { "Test" }, - Description = "Test", - }); + builder.Populate(metadata); using (var nupkg = File.Create(nupkgPath)) { From f7d3b632cc681f7c8adca1cfb1199466f1c0872e Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 15 May 2018 13:49:37 -0700 Subject: [PATCH 010/192] Add VSTS build definition --- .vsts-pipelines/builds/AspNet-BuildTools.yml | 43 +++++++++++++++++++ files/KoreBuild/modules/vstest/module.targets | 2 +- 2 files changed, 44 insertions(+), 1 deletion(-) create mode 100644 .vsts-pipelines/builds/AspNet-BuildTools.yml diff --git a/.vsts-pipelines/builds/AspNet-BuildTools.yml b/.vsts-pipelines/builds/AspNet-BuildTools.yml new file mode 100644 index 000000000..81d96fcc4 --- /dev/null +++ b/.vsts-pipelines/builds/AspNet-BuildTools.yml @@ -0,0 +1,43 @@ +trigger: +- dev +- release/* + +phases: +- phase: Windows + queue: + name: Hosted VS2017 + demands: cmd + steps: + - script: build.cmd -ci + - task: PublishTestResults@2 + condition: always() + inputs: + testRunner: vstest + testResultsFiles: 'artifacts/logs/**/*.trx' + + +- phase: macOS + queue: + name: Hosted macOS Preview + demands: agent.os -equals Darwin + steps: + - script: ./build.sh --ci + - task: PublishTestResults@2 + condition: always() + inputs: + testRunner: vstest + testResultsFiles: 'artifacts/logs/**/*.trx' + + +- phase: Linux + queue: + name: Hosted Linux Preview + demands: agent.os -equals Linux + steps: + - script: ./build.sh --ci + - task: PublishTestResults@2 + condition: always() + inputs: + testRunner: vstest + testResultsFiles: 'artifacts/logs/**/*.trx' + diff --git a/files/KoreBuild/modules/vstest/module.targets b/files/KoreBuild/modules/vstest/module.targets index 8e8c87462..79970f082 100644 --- a/files/KoreBuild/modules/vstest/module.targets +++ b/files/KoreBuild/modules/vstest/module.targets @@ -65,7 +65,7 @@ Runs the VSTest on all projects in the ProjectsToTest itemgroup. $(LogOutputDir)$(TestGroupName)-$(TargetFramework)-$(BuildNumber).trx - trx;LogFileName=$(TrxFile) + trx;LogFileName=$(TrxFile) $(LogOutputDir)$(TestGroupName)-$(TargetFramework)-$(BuildNumber).diag - <_AspNetToolsSdkPath>$(MSBuildThisFileDirectory)src\Internal.AspNetCore.Sdk - $(_AspNetToolsSdkPath)\build\Internal.AspNetCore.Sdk.targets - $(_AspNetToolsSdkPath)\buildMultiTargeting\Internal.AspNetCore.Sdk.targets false false false @@ -19,8 +15,6 @@ true - - https://github.com/aspnet/BuildTools git diff --git a/build/sdk.props b/build/sdk.props new file mode 100644 index 000000000..c98a76a23 --- /dev/null +++ b/build/sdk.props @@ -0,0 +1,3 @@ + + + diff --git a/build/sdk.targets b/build/sdk.targets new file mode 100644 index 000000000..3695d4330 --- /dev/null +++ b/build/sdk.targets @@ -0,0 +1,3 @@ + + + diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index 727eb1314..ac2564647 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -1,10 +1,11 @@ - - + + netcoreapp2.0 $(DefineConstants);BuildTools $(NoWarn);NU1603 + RepoTasks @@ -21,6 +22,5 @@ - - + diff --git a/docs/Sdk.md b/docs/Sdk.md new file mode 100644 index 000000000..2cbca9efc --- /dev/null +++ b/docs/Sdk.md @@ -0,0 +1,31 @@ +The Internal ASP.NET Core SDK +============================= + +The internal ASP.NET Core SDK provides features essential to producing ASP.NET Core itself. +It is not indended for general consumption beyond the ASP.NET Core team. + +## How to use it + +1. Change the first line of your .csproj files to + +```xml + +``` + +2. Add this to your NuGet.config +```xml + + + + + +``` + +3. Add a global.json file to your project with contents like this: +```json +{ + "msbuild-sdks": { + "Internal.AspNetCore.Sdk": "2.2.0-preview1-1234" + } +} +``` diff --git a/files/KoreBuild/KoreBuild.sh b/files/KoreBuild/KoreBuild.sh index 296293545..c3bf8f6a1 100755 --- a/files/KoreBuild/KoreBuild.sh +++ b/files/KoreBuild/KoreBuild.sh @@ -19,18 +19,27 @@ set_korebuildsettings() { if [ "$ci" = true ]; then - dot_net_home="$repo_path/.dotnet" - export CI=true export DOTNET_CLI_TELEMETRY_OPTOUT=true export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true + export HOME="$repo_path/.build/home" + export TEMP="$repo_path/.build/tmp" + export TMP="$TEMP" export NUGET_SHOW_STACK=true - export NUGET_PACKAGES="$repo_path/.nuget/packages" + export NUGET_PACKAGES="$repo_path/.build/.nuget/packages" + dot_net_home="$repo_path/.build/.dotnet" export DOTNET_HOME="$dot_net_home" export MSBUILDDEBUGPATH="$repo_path/artifacts/logs" + mkdir -p "$TMP" + mkdir -p "$HOME" + mkdir -p "$dot_net_home" + else + if [[ -z $NUGET_PACKAGES ]]; then + export NUGET_PACKAGES="$HOME/.nuget/packages" + fi fi - export DOTNET_ROOT="$DOTNET_HOME" + export DOTNET_ROOT="$dot_net_home" return 0 } @@ -100,6 +109,18 @@ __install_tools() { "$__korebuild_dir/scripts/get-dotnet.sh" $verbose_flag "$install_dir" \ || return 1 + # This is a workaround for https://github.com/Microsoft/msbuild/issues/2914. + # Currently, the only way to configure the NuGetSdkResolver is with NuGet.config, which is not generally used in aspnet org projects. + # This project is restored so that it pre-populates the NuGet cache with SDK packages. + local restorerfile="$__korebuild_dir/modules/BundledPackages/BundledPackageRestorer.csproj" + local restorerfilelock="$NUGET_PACKAGES/internal.aspnetcore.sdk/$(__get_korebuild_version)/korebuild.sentinel" + if [[ -e "$restorerfile" ]] && [[ ! -e "$restorerfilelock" ]]; then + mkdir -p "$(dirname $restorerfilelock)" + touch "$restorerfilelock" + __exec dotnet msbuild -restore -t:noop -v:m "$restorerfile" + fi + # end workaround + # Set environment variables export PATH="$install_dir:$PATH" } diff --git a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets index 58deb5cdc..30046917f 100644 --- a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets +++ b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets @@ -15,7 +15,7 @@ Workaround for design time builds on projects using Internal.AspNetCore.Sdk that have not yet been restored. IncludeSymbols and IncludeSource are off by default but are enabled in Internal.AspNetCore.Sdk. --> - <_ReferencesInternalAspNetCoreSdk>@(PackageReference->AnyHaveMetadataValue('Identity', 'Internal.AspNetCore.Sdk')) + <_ReferencesInternalAspNetCoreSdk Condition="'$(_ReferencesInternalAspNetCoreSdk)' == ''">@(PackageReference->AnyHaveMetadataValue('Identity', 'Internal.AspNetCore.Sdk')) true true diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index 1692f6a6f..ba626469c 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -242,6 +242,18 @@ function Install-Tools( else { Write-Host -ForegroundColor DarkGray ".NET Core SDK $version is already installed. Skipping installation." } + + # This is a workaround for https://github.com/Microsoft/msbuild/issues/2914. + # Currently, the only way to configure the NuGetSdkResolver is with NuGet.config, which is not generally used in aspnet org projects. + # This project is restored so that it pre-populates the NuGet cache with SDK packages. + $restorerfile = "$PSScriptRoot/../modules/BundledPackages/BundledPackageRestorer.csproj" + $restorerfilelock="$env:NUGET_PACKAGES/internal.aspnetcore.sdk/$(Get-KoreBuildVersion)/korebuild.sentinel" + if ((Test-Path $restorerfile) -and -not (Test-Path $restorerfilelock)) { + mkdir -p $(Split-Path -Parent $restorerfilelock) -ea ignore | Out-Null + New-Item -ItemType File $restorerfilelock -ea ignore | Out-Null + __exec $global:dotnet msbuild -restore '-t:noop' '-v:m' "$restorerfile" + } + # end workaround } <# @@ -321,6 +333,13 @@ function Set-KoreBuildSettings( $env:NUGET_PACKAGES = Join-Paths $RepoPath ('.nuget', 'packages') $env:MSBUILDDEBUGPATH = Join-Paths $RepoPath ('artifacts', 'logs') } + else { + if (-not $env:NUGET_PACKAGES) { + $env:NUGET_PACKAGES = Join-Paths $env:USERPROFILE ('.nuget', 'packages') + } + } + + $env:NUGET_PACKAGES = $env:NUGET_PACKAGES.TrimEnd('\') + '\' $arch = __get_dotnet_arch $env:DOTNET_ROOT = if ($IS_WINDOWS) { Join-Path $DotNetHome $arch } else { $DotNetHome } @@ -362,7 +381,17 @@ function Invoke-KoreBuildCommand( $sdkVersion = __get_dotnet_sdk_version $korebuildVersion = Get-KoreBuildVersion if ($sdkVersion -ne 'latest') { - "{ `"sdk`": { `n`"version`": `"$sdkVersion`" },`n`"msbuild-sdks`": {`n`"Microsoft.DotNet.GlobalTools.Sdk`": `"$korebuildVersion`"}`n }" | Out-File (Join-Path $global:KoreBuildSettings.RepoPath 'global.json') -Encoding ascii + @" +{ + `"sdk`": { + `"version`": `"$sdkVersion`" + }, + `"msbuild-sdks`": { + `"Microsoft.DotNet.GlobalTools.Sdk`": `"$korebuildVersion`", + `"Internal.AspNetCore.Sdk`": `"$korebuildVersion`" + } +} +"@ | Out-File (Join-Path $global:KoreBuildSettings.RepoPath 'global.json') -Encoding ascii } else { Write-Verbose "Skipping global.json generation because the `$sdkVersion = $sdkVersion" diff --git a/files/KoreBuild/scripts/dotnet-install.sh b/files/KoreBuild/scripts/dotnet-install.sh index 796c4829c..021fdc8da 100755 --- a/files/KoreBuild/scripts/dotnet-install.sh +++ b/files/KoreBuild/scripts/dotnet-install.sh @@ -577,6 +577,7 @@ copy_files_or_dirs_from_list() { local target="$out_path/$path" if [ "$override" = true ] || (! ([ -d "$target" ] || [ -e "$target" ])); then mkdir -p "$out_path/$(dirname "$path")" + say_verbose "Copying '$out_path/$path' => '$target'" cp -R $override_switch "$root_path/$path" "$target" fi done diff --git a/files/KoreBuild/scripts/invoke-repository-build.sh b/files/KoreBuild/scripts/invoke-repository-build.sh index d694c7310..4663d823d 100755 --- a/files/KoreBuild/scripts/invoke-repository-build.sh +++ b/files/KoreBuild/scripts/invoke-repository-build.sh @@ -66,7 +66,8 @@ if [ "$sdk_version" != 'latest' ]; then \"version\": \"${sdk_version}\" }, \"msbuild-sdks\": { - \"Microsoft.DotNet.GlobalTools.Sdk\": \"${korebuild_version}\" + \"Microsoft.DotNet.GlobalTools.Sdk\": \"${korebuild_version}\", + \"Internal.AspNetCore.Sdk\": \"${korebuild_version}\" } }" > "$repo_path/global.json" else diff --git a/modules/BuildTools.Tasks/BuildTools.Tasks.csproj b/modules/BuildTools.Tasks/BuildTools.Tasks.csproj index 04b4be81a..a0a31dff6 100644 --- a/modules/BuildTools.Tasks/BuildTools.Tasks.csproj +++ b/modules/BuildTools.Tasks/BuildTools.Tasks.csproj @@ -1,4 +1,5 @@ - + + $(DefineConstants);BuildTools @@ -23,4 +24,5 @@ + diff --git a/modules/BundledPackages/BundledPackages.proj b/modules/BundledPackages/BundledPackages.proj index 3c641f5c3..280b42a22 100644 --- a/modules/BundledPackages/BundledPackages.proj +++ b/modules/BundledPackages/BundledPackages.proj @@ -25,23 +25,21 @@ + netcoreapp2.0 true - - - - + ]]> - + diff --git a/modules/BundledPackages/module.props b/modules/BundledPackages/module.props deleted file mode 100644 index 731ee6deb..000000000 --- a/modules/BundledPackages/module.props +++ /dev/null @@ -1,6 +0,0 @@ - - - $(MSBuildThisFileDirectory) - $(SolutionProperties);KoreBuildBundledPackageFolder=$(KoreBuildBundledPackageFolder) - - diff --git a/modules/BundledPackages/module.targets b/modules/BundledPackages/module.targets deleted file mode 100644 index 7d240ae57..000000000 --- a/modules/BundledPackages/module.targets +++ /dev/null @@ -1,24 +0,0 @@ - - - - - <_BundledRestoreSentinel>$(MSBuildThisFileDirectory)restore.sentinel - <_ShouldRunBundledRestore Condition="Exists('$(_BundledRestoreSentinel)')">false - - - - - - - diff --git a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj index d7e4bb7ef..4d9a86ec5 100644 --- a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj +++ b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj @@ -1,4 +1,5 @@ - + + netcoreapp2.0 @@ -27,4 +28,5 @@ + diff --git a/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj b/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj index bbdf960df..813f67dfa 100644 --- a/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj +++ b/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj @@ -1,4 +1,5 @@ - + + Verifies Asp.Net Core NuGet packages. @@ -21,4 +22,5 @@ + diff --git a/modules/NuGetPackageVerifier/msbuild/NuGetPackageVerifier.Task.csproj b/modules/NuGetPackageVerifier/msbuild/NuGetPackageVerifier.Task.csproj index 57f046b09..e2121900f 100644 --- a/modules/NuGetPackageVerifier/msbuild/NuGetPackageVerifier.Task.csproj +++ b/modules/NuGetPackageVerifier/msbuild/NuGetPackageVerifier.Task.csproj @@ -1,4 +1,5 @@ - + + netcoreapp2.0 @@ -15,4 +16,5 @@ + diff --git a/src/ApiCheck.Console/ApiCheck.Console.csproj b/src/ApiCheck.Console/ApiCheck.Console.csproj index 614dd088c..357b7b4ff 100644 --- a/src/ApiCheck.Console/ApiCheck.Console.csproj +++ b/src/ApiCheck.Console/ApiCheck.Console.csproj @@ -1,4 +1,5 @@ - + + netcoreapp2.1;net46 @@ -45,4 +46,6 @@ + + diff --git a/src/ApiCheck.Task/ApiCheck.Task.csproj b/src/ApiCheck.Task/ApiCheck.Task.csproj index d05c4b8a6..406c5cb4f 100644 --- a/src/ApiCheck.Task/ApiCheck.Task.csproj +++ b/src/ApiCheck.Task/ApiCheck.Task.csproj @@ -1,4 +1,5 @@ - + + netstandard2.0 @@ -15,4 +16,6 @@ + + diff --git a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj index 489a5c805..a2c47eee4 100644 --- a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj +++ b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj @@ -1,4 +1,5 @@ - + + Internal.AspNetCore.Sdk @@ -39,8 +40,25 @@ + + + + + $(ApiCheckPackageVersion) + $(MicrosoftBuildPackageVersion) + $(JsonInMSBuildVersion) + + +]]> + + + + + $(NuspecProperties);id=$(PackageId) + $(NuspecProperties);bundledVersionFile=$(IntermediateOutputPath)BundledVersions.props $(NuspecProperties);apicheckVersion=$(ApiCheckPackageVersion) $(NuspecProperties);config=$(Configuration) $(NuspecProperties);version=$(PackageVersion) @@ -49,4 +67,5 @@ + diff --git a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec index 6aa71c90d..928111f5b 100644 --- a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec +++ b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec @@ -18,5 +18,8 @@ + + + diff --git a/src/Internal.AspNetCore.Sdk/build/Git.targets b/src/Internal.AspNetCore.Sdk/build/Git.targets index f3277dfc3..5f7a9778c 100644 --- a/src/Internal.AspNetCore.Sdk/build/Git.targets +++ b/src/Internal.AspNetCore.Sdk/build/Git.targets @@ -20,7 +20,7 @@ Only set this in CI builds, otherwise it will mess up the debugger. --> - /_/ + /_/ $(DeterministicSourceRoot) $([MSBuild]::NormalizeDirectory($(RepositoryRoot))) diff --git a/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets b/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets new file mode 100644 index 000000000..cdf79ebaf --- /dev/null +++ b/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets @@ -0,0 +1,25 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + + + + + + + + + + + + + + + + diff --git a/src/Internal.AspNetCore.Sdk/sdk/Sdk.props b/src/Internal.AspNetCore.Sdk/sdk/Sdk.props new file mode 100644 index 000000000..525a2b1e0 --- /dev/null +++ b/src/Internal.AspNetCore.Sdk/sdk/Sdk.props @@ -0,0 +1,22 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + <_ReferencesInternalAspNetCoreSdk>true + + + true + + + true + + + true + + + + + + + + diff --git a/src/Internal.AspNetCore.Sdk/sdk/Sdk.targets b/src/Internal.AspNetCore.Sdk/sdk/Sdk.targets new file mode 100644 index 000000000..d497b714d --- /dev/null +++ b/src/Internal.AspNetCore.Sdk/sdk/Sdk.targets @@ -0,0 +1,18 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + + + + + + + + + + + diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj index 6da26e79d..1e777ef24 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj @@ -1,5 +1,5 @@ - - + + Internal.AspNetCore.SiteExtension.Sdk netcoreapp2.0;net46 @@ -28,4 +28,5 @@ + diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/HostingStartup.csproj b/src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/HostingStartup.csproj index 3a388ccf5..c3d5947eb 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/HostingStartup.csproj +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/HostingStartup.csproj @@ -1,4 +1,5 @@ - + + netcoreapp2.2 @@ -9,4 +10,6 @@ + + diff --git a/src/Microsoft.DotNet.GlobalTools.Sdk/Microsoft.DotNet.GlobalTools.Sdk.csproj b/src/Microsoft.DotNet.GlobalTools.Sdk/Microsoft.DotNet.GlobalTools.Sdk.csproj index 20b344df2..e290ab1e4 100644 --- a/src/Microsoft.DotNet.GlobalTools.Sdk/Microsoft.DotNet.GlobalTools.Sdk.csproj +++ b/src/Microsoft.DotNet.GlobalTools.Sdk/Microsoft.DotNet.GlobalTools.Sdk.csproj @@ -1,6 +1,5 @@  - - + netcoreapp2.0 @@ -20,7 +19,7 @@ - + diff --git a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.props b/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.props deleted file mode 100644 index b74410de9..000000000 --- a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.props +++ /dev/null @@ -1,10 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - - - - - diff --git a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.targets b/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.targets index ad2e4c0b1..2a9fad1ed 100644 --- a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.targets +++ b/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.targets @@ -22,6 +22,10 @@ $(RuntimeIdentifiers);$(GeneratedShimRuntimeIdentifiers) + + + + - $(KoreBuildVersion) - diff --git a/testassets/SimpleRepo/build/tasks/RepoTasks.csproj b/testassets/SimpleRepo/build/tasks/RepoTasks.csproj index c027d89b1..1cc26fa5d 100644 --- a/testassets/SimpleRepo/build/tasks/RepoTasks.csproj +++ b/testassets/SimpleRepo/build/tasks/RepoTasks.csproj @@ -1,10 +1,8 @@ - - + - netcoreapp2.0 + RepoTasks - diff --git a/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj b/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj index 00ba4e965..5c1a65a6a 100644 --- a/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj +++ b/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj @@ -1,4 +1,4 @@ - + diff --git a/testassets/SimpleRepo/src/Directory.Build.targets b/testassets/SimpleRepo/src/Directory.Build.targets deleted file mode 100644 index 828353c1a..000000000 --- a/testassets/SimpleRepo/src/Directory.Build.targets +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - publishDir=$(PublishDir); - version=$(PackageVersion); - targetframework=$(TargetFramework); - - - - diff --git a/testassets/SimpleRepo/src/Simple.CliTool/DotnetToolSettings.xml b/testassets/SimpleRepo/src/Simple.CliTool/DotnetToolSettings.xml deleted file mode 100644 index bd60230a3..000000000 --- a/testassets/SimpleRepo/src/Simple.CliTool/DotnetToolSettings.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj b/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj index f3624745f..8ce877e9f 100644 --- a/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj +++ b/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj @@ -1,4 +1,4 @@ - + netcoreapp2.1 @@ -6,21 +6,21 @@ DotnetTool cowsay Simple.CliTool + true TestCert - $(MSBuildProjectName).nuspec - + - tools/any/any/$(TargetFileName) + tools/any/$(TargetFramework)/$(TargetFileName) - tools/any/any/Newtonsoft.Json.dll + tools/any/$(TargetFramework)/Newtonsoft.Json.dll diff --git a/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.nuspec b/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.nuspec deleted file mode 100644 index cca06268d..000000000 --- a/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.nuspec +++ /dev/null @@ -1,17 +0,0 @@ - - - - Simple.CliTool - $version$ - Microsoft - Test - - - - - - - - - - diff --git a/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj b/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj index 864030fdb..90776f448 100644 --- a/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj +++ b/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj @@ -1,12 +1,8 @@ - + netstandard2.0;net461 TestCert - - - - diff --git a/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj b/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj index 23ec73b0d..1350729d6 100644 --- a/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj +++ b/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj @@ -1,10 +1,8 @@ - + netcoreapp2.0;net461 netcoreapp2.0 - - false diff --git a/tools/KoreBuild.Console/KoreBuild.Console.csproj b/tools/KoreBuild.Console/KoreBuild.Console.csproj index 52a3f5605..ab68455aa 100644 --- a/tools/KoreBuild.Console/KoreBuild.Console.csproj +++ b/tools/KoreBuild.Console/KoreBuild.Console.csproj @@ -1,4 +1,5 @@ - + + Exe @@ -13,4 +14,5 @@ + From 1d9d3534bf509767331d0c1003224799e66f4c2e Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 5 Jun 2018 17:44:40 -0700 Subject: [PATCH 024/192] Create a class library for consumers to implement manifest-driven code signing (#683) Currently, code signing is done by folder location and convention. This is fragile and causes tight coupling between the code building outputs and the signing tools. This change introduces a set of abstractions for working with the signrequest.xml file. Sign tool implementers can read this file and use it to drive code signing implementations. --- BuildTools.sln | 7 + docs/Signing.md | 57 +++--- .../KoreBuild.Tasks/GenerateSignRequests.cs | 145 +++++++++------ .../Internal/SignRequestCollection.cs | 23 --- .../SignRequestCollectionXmlWriter.cs | 104 ----------- .../Internal/SignRequestItem.cs | 57 ------ .../KoreBuild.Tasks/KoreBuild.Tasks.csproj | 6 +- .../console/Manifests/PackageSignRequest.cs | 13 -- .../console/Manifests/SignRequestManifest.cs | 55 ------ .../NuGetPackageVerifier.Console.csproj | 4 + .../console/PackageAnalysisContext.cs | 4 +- .../NuGetPackageVerifier/console/Program.cs | 16 +- .../Rules/SignRequestListsAllSignableFiles.cs | 20 +- ...al.AspNetCore.CodeSign.Abstractions.csproj | 8 + .../SignRequestCollection.cs | 36 ++++ .../SignRequestItem.cs | 172 ++++++++++++++++++ .../SignRequestItemType.cs | 44 +++++ .../SignRequestManifestXmlReader.cs | 124 +++++++++++++ .../SignRequestManifestXmlWriter.cs | 117 ++++++++++++ .../XmlElementNames.cs | 19 ++ .../Internal.AspNetCore.Sdk.props | 6 + .../SimpleRepoTests.cs | 6 +- .../GenerateSignRequestsTests.cs | 31 +++- test/KoreBuild.Tasks.Tests/MockTaskItem.cs | 65 +++++++ ...gnRequestListsAllSignableFilesRuleTests.cs | 12 +- .../Utilities/TestPackageAnalysisContext.cs | 8 +- 26 files changed, 776 insertions(+), 383 deletions(-) delete mode 100644 modules/KoreBuild.Tasks/Internal/SignRequestCollection.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/SignRequestCollectionXmlWriter.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/SignRequestItem.cs delete mode 100644 modules/NuGetPackageVerifier/console/Manifests/PackageSignRequest.cs delete mode 100644 modules/NuGetPackageVerifier/console/Manifests/SignRequestManifest.cs create mode 100644 src/Internal.AspNetCore.CodeSign.Abstractions/Internal.AspNetCore.CodeSign.Abstractions.csproj create mode 100644 src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestCollection.cs create mode 100644 src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItem.cs create mode 100644 src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItemType.cs create mode 100644 src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlReader.cs create mode 100644 src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlWriter.cs create mode 100644 src/Internal.AspNetCore.CodeSign.Abstractions/XmlElementNames.cs create mode 100644 test/KoreBuild.Tasks.Tests/MockTaskItem.cs diff --git a/BuildTools.sln b/BuildTools.sln index b3d131404..6d51ed21e 100644 --- a/BuildTools.sln +++ b/BuildTools.sln @@ -94,6 +94,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetPackageVerifier.Tests" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.DotNet.GlobalTools.Sdk", "src\Microsoft.DotNet.GlobalTools.Sdk\Microsoft.DotNet.GlobalTools.Sdk.csproj", "{449E2FD8-AE30-4C4E-8FC2-E797B99CF339}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Internal.AspNetCore.CodeSign.Abstractions", "src\Internal.AspNetCore.CodeSign.Abstractions\Internal.AspNetCore.CodeSign.Abstractions.csproj", "{CF3B27B5-5E04-4456-A852-DDFFF7BC3C38}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -172,6 +174,10 @@ Global {449E2FD8-AE30-4C4E-8FC2-E797B99CF339}.Debug|Any CPU.Build.0 = Debug|Any CPU {449E2FD8-AE30-4C4E-8FC2-E797B99CF339}.Release|Any CPU.ActiveCfg = Release|Any CPU {449E2FD8-AE30-4C4E-8FC2-E797B99CF339}.Release|Any CPU.Build.0 = Release|Any CPU + {CF3B27B5-5E04-4456-A852-DDFFF7BC3C38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {CF3B27B5-5E04-4456-A852-DDFFF7BC3C38}.Debug|Any CPU.Build.0 = Debug|Any CPU + {CF3B27B5-5E04-4456-A852-DDFFF7BC3C38}.Release|Any CPU.ActiveCfg = Release|Any CPU + {CF3B27B5-5E04-4456-A852-DDFFF7BC3C38}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -196,6 +202,7 @@ Global {418F99A5-5EC4-4895-B8EB-7F8BBA241DB2} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76} {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} {449E2FD8-AE30-4C4E-8FC2-E797B99CF339} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76} + {CF3B27B5-5E04-4456-A852-DDFFF7BC3C38} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {1B8809C8-A6C3-4761-BC91-B12841F49AE1} diff --git a/docs/Signing.md b/docs/Signing.md index 527a8bbd7..013aa4c8a 100644 --- a/docs/Signing.md +++ b/docs/Signing.md @@ -6,20 +6,23 @@ and information about the strongname or certificate that should be used. ## Format -The signing request manifest supports three element types. A minimal example looks like this. See [Elements](#Elements) below for details +The signing request manifest supports multiple element types. Each element represents a specific kind of action to take on a file. A minimal example looks like this. See [Elements](#Elements) below for details ```xml - + - - + + - + + + + ``` @@ -60,7 +63,7 @@ This will generate a signing request like this: ```xml - + ``` @@ -79,9 +82,9 @@ This will generate a signing request like this: ```xml - + - + ``` @@ -108,14 +111,18 @@ Sometimes other signable assemblies end up in a nupkg. Signing for these file ty ```xml - - + + + + + - + - + ``` @@ -154,28 +161,34 @@ Root element. No options. A file to be signed. -**Path** - file path, relative to the file path. If nested in a ``, is relative to the organization within the container +**Path** - file path. If nested in a parent element, is relative to the organization within the containing package. +If not, this is relative to the XML file. **Certificate** - the name of the certificate to use **StrongName** - for assemblies only. This is used to strong name assemblies that were delay signed in public. -#### `Container` +#### `Nupkg` + +A NuGet package to be signed. Nested elements can be added for `` and ``. + +**Path** - file path to the container + +**Certificate** - the name of the certificate to use + +#### `Vsix` -A container is an archive file, installer, or some kind of bundle that can be signed, or that has files that can be signed -inside it. Nested elements can be added for `` and ``. +A vsix package to be signed. Nested elements can be added for `` and ``. **Path** - file path to the container **Certificate** - the name of the certificate to use -**Type** - The type of the container. Instructs the consumer how to extract the container. Example values: +#### `Zip` + +A zip which contains elements to be signed. Nested elements can be added for `` and ``. - - zip - - tar.gz - - vsix - - nupkg - - msi +**Path** - file path to the zip #### `ExcludedFile` diff --git a/modules/KoreBuild.Tasks/GenerateSignRequests.cs b/modules/KoreBuild.Tasks/GenerateSignRequests.cs index a4e024f7c..247846c29 100644 --- a/modules/KoreBuild.Tasks/GenerateSignRequests.cs +++ b/modules/KoreBuild.Tasks/GenerateSignRequests.cs @@ -4,6 +4,7 @@ using System; using System.Collections.Generic; using System.IO; +using Microsoft.AspNetCore.BuildTools.CodeSign; using Microsoft.Build.Framework; namespace KoreBuild.Tasks @@ -16,6 +17,10 @@ namespace KoreBuild.Tasks /// public class GenerateSignRequest : Microsoft.Build.Utilities.Task { + // well-known metadata on items set by the MSBuild engine + private const string ProjectDirMetadataName = "DefiningProjectDirectory"; + private const string ProjectFileMetadataName = "DefiningProjectFullPath"; + /// /// Files or containers of files that should be signed. /// Required metadata 'Certificate' or 'StrongName'. Both can be specified. @@ -46,8 +51,8 @@ public class GenerateSignRequest : Microsoft.Build.Utilities.Task public override bool Execute() { - OutputPath = OutputPath.Replace('\\', '/'); - BasePath = BasePath.Replace('\\', '/'); + OutputPath = NormalizePath(OutputPath); + BasePath = NormalizePath(BasePath); return Execute(() => { @@ -60,7 +65,7 @@ internal bool Execute(Func writerFactory) { var signRequestCollection = new SignRequestCollection(); - var containers = new Dictionary(StringComparer.OrdinalIgnoreCase); + var containers = new Dictionary(StringComparer.OrdinalIgnoreCase); var isContainer = new bool[Requests.Length]; for (var i = 0; i < Requests.Length; i++) { @@ -68,25 +73,31 @@ internal bool Execute(Func writerFactory) if (bool.TryParse(item.GetMetadata("IsContainer"), out var isc) && isc) { isContainer[i] = true; - var type = item.GetMetadata("Type"); - if (string.IsNullOrEmpty(type)) - { - type = GetKnownContainerTypes(item); - } + var itemType = string.IsNullOrEmpty(item.GetMetadata("Type")) + ? Path.GetExtension(item.ItemSpec) + : item.GetMetadata("Type"); + + var type = SignRequestItem.GetTypeFromFileExtension(itemType); + var normalizedPath = GetRelativePath(BasePath, item.ItemSpec); + SignRequestItem container; - if (string.IsNullOrEmpty(type)) + switch (type) { - Log.LogError($"Unknown container type for signed file request:'{item.ItemSpec}'. Signing request container must specify the metadata 'Type'."); - continue; + case SignRequestItemType.Zip: + container = SignRequestItem.CreateZip(normalizedPath); + break; + case SignRequestItemType.Nupkg: + container = SignRequestItem.CreateNugetPackage(normalizedPath, item.GetMetadata("Certificate")); + break; + case SignRequestItemType.Vsix: + container = SignRequestItem.CreateVsix(normalizedPath, item.GetMetadata("Certificate")); + break; + default: + Log.LogError( + $"Unknown container type for signed file request:'{item.ItemSpec}'. Signing request container must specify the metadata 'Type'."); + continue; } - var normalizedPath = NormalizePath(BasePath, item.ItemSpec); - var container = new SignRequestItem.Container( - normalizedPath, - type, - item.GetMetadata("Certificate"), - item.GetMetadata("StrongName")); - containers[item.ItemSpec] = container; signRequestCollection.Add(container); } @@ -100,27 +111,37 @@ internal bool Execute(Func writerFactory) } var item = Requests[i]; - var normalizedPath = NormalizePath(BasePath, item.ItemSpec); + var normalizedPath = GetRelativePath(BasePath, item.ItemSpec); var containerPath = item.GetMetadata("Container"); if (!string.IsNullOrEmpty(containerPath)) { if (!containers.TryGetValue(containerPath, out var container)) { - Log.LogError($"Signing request item '{item.ItemSpec}' specifies an unknown container '{containerPath}'."); + Log.LogError( + $"Signing request item '{item.ItemSpec}' specifies an unknown container '{containerPath}'."); + continue; + } + + var itemPath = GetPathWithinContainer(item); + + if (string.IsNullOrEmpty(itemPath)) + { + Log.LogError(null, null, null, item.GetMetadata(ProjectFileMetadataName), 0, 0, 0, 0, + message: $"Could not identify the path for the signable file {item.ItemSpec}"); continue; } - var packagePath = item.GetMetadata("PackagePath"); - normalizedPath = string.IsNullOrEmpty(packagePath) ? normalizedPath : packagePath.Replace('\\', '/'); - var file = new SignRequestItem.File(normalizedPath, + + normalizedPath = NormalizePath(itemPath); + var file = SignRequestItem.CreateFile(normalizedPath, item.GetMetadata("Certificate"), item.GetMetadata("StrongName")); - container.AddItem(file); + container.AddChild(file); } else { - var file = new SignRequestItem.File(normalizedPath, - item.GetMetadata("Certificate"), - item.GetMetadata("StrongName")); + var file = SignRequestItem.CreateFile(normalizedPath, + item.GetMetadata("Certificate"), + item.GetMetadata("StrongName")); signRequestCollection.Add(file); } } @@ -129,25 +150,33 @@ internal bool Execute(Func writerFactory) { foreach (var item in Exclusions) { - var normalizedPath = NormalizePath(BasePath, item.ItemSpec); + var normalizedPath = GetRelativePath(BasePath, item.ItemSpec); var containerPath = item.GetMetadata("Container"); if (!string.IsNullOrEmpty(containerPath)) { if (!containers.TryGetValue(containerPath, out var container)) { - Log.LogError($"Exclusion item '{item.ItemSpec}' specifies an unknown container '{containerPath}'."); + Log.LogError( + $"Exclusion item '{item.ItemSpec}' specifies an unknown container '{containerPath}'."); + continue; + } + + var itemPath = GetPathWithinContainer(item); + if (string.IsNullOrEmpty(itemPath)) + { + Log.LogError(null, null, null, item.GetMetadata(ProjectFileMetadataName), 0, 0, 0, 0, + message: $"Could not identify the path for the signable file {item.ItemSpec}"); continue; } - var packagePath = item.GetMetadata("PackagePath"); - normalizedPath = string.IsNullOrEmpty(packagePath) ? normalizedPath : packagePath.Replace('\\', '/'); - var file = new SignRequestItem.Exclusion(normalizedPath); - container.AddItem(file); + normalizedPath = NormalizePath(itemPath); + var file = SignRequestItem.CreateExclusion(normalizedPath); + container.AddChild(file); } else { - var file = new SignRequestItem.Exclusion(normalizedPath); + var file = SignRequestItem.CreateExclusion(normalizedPath); signRequestCollection.Add(file); } } @@ -159,7 +188,7 @@ internal bool Execute(Func writerFactory) } using (var stream = writerFactory()) - using (var writer = new SignRequestCollectionXmlWriter(stream)) + using (var writer = new SignRequestManifestXmlWriter(stream)) { writer.Write(signRequestCollection); } @@ -169,36 +198,32 @@ internal bool Execute(Func writerFactory) return !Log.HasLoggedErrors; } - private static string GetKnownContainerTypes(ITaskItem item) + private static string GetPathWithinContainer(ITaskItem item) { - string type = null; - - switch (Path.GetExtension(item.ItemSpec).ToLowerInvariant()) + // always prefer an explicit package path + var itemPath = item.GetMetadata("PackagePath"); + if (string.IsNullOrEmpty(itemPath)) { - case ".nupkg": - type = "nupkg"; - break; - case ".zip": - type = "zip"; - break; - case ".tar.gz": - case ".tgz": - type = "tar.gz"; - break; - case ".vsix": - type = "vsix"; - break; - case ".msi": - type = "msi"; - break; + // allow defining SignedPackageFile using just ItemSpec + var projectDir = item.GetMetadata(ProjectDirMetadataName); + if (!string.IsNullOrEmpty(projectDir)) + { + // users will typically write items with relative itemspecs, but we can't get the original item spec. + // Infer the original item spec by getting the path relative to the project directory + return Path.GetRelativePath(projectDir, item.ItemSpec); + } } - return type; + return itemPath; } - private static string NormalizePath(string basePath, string path) - { - return Path.GetRelativePath(basePath, path).Replace('\\', '/'); - } + private static string GetRelativePath(string basePath, string path) + => NormalizePath(Path.GetRelativePath(basePath, path)); + + private static string NormalizePath(string path) + => string.IsNullOrEmpty(path) + ? path + : path.Replace('\\', '/'); + } } diff --git a/modules/KoreBuild.Tasks/Internal/SignRequestCollection.cs b/modules/KoreBuild.Tasks/Internal/SignRequestCollection.cs deleted file mode 100644 index 2ece50b90..000000000 --- a/modules/KoreBuild.Tasks/Internal/SignRequestCollection.cs +++ /dev/null @@ -1,23 +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; -using System.Collections.Generic; - -namespace KoreBuild.Tasks -{ - internal class SignRequestCollection : IEnumerable - { - private SortedDictionary _items = new SortedDictionary(StringComparer.Ordinal); - - public IEnumerator GetEnumerator() => _items.Values.GetEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() => _items.Values.GetEnumerator(); - - public void Add(SignRequestItem item) - { - _items.Add(item.Path, item); - } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/SignRequestCollectionXmlWriter.cs b/modules/KoreBuild.Tasks/Internal/SignRequestCollectionXmlWriter.cs deleted file mode 100644 index 8f470f4fa..000000000 --- a/modules/KoreBuild.Tasks/Internal/SignRequestCollectionXmlWriter.cs +++ /dev/null @@ -1,104 +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.IO; -using System.Text; -using System.Xml; -using System.Xml.Linq; - -namespace KoreBuild.Tasks -{ - internal class SignRequestCollectionXmlWriter : IDisposable - { - private readonly TextWriter output; - private readonly XDocument document; - - public SignRequestCollectionXmlWriter(TextWriter output) - { - this.output = output; - document = new XDocument(new XElement("SignRequest")); - } - - public void Save() - { - var settings = new XmlWriterSettings - { - Encoding = Encoding.UTF8, - OmitXmlDeclaration = true, - Indent = true, - NewLineChars = "\r\n", - NewLineHandling = NewLineHandling.Replace, - }; - - using (var writer = XmlWriter.Create(output, settings)) - { - document.Save(writer); - } - } - - public void Write(SignRequestCollection signRequestCollection) - { - var node = document.Root; - foreach (var request in signRequestCollection) - { - AddRequest(node, request); - } - } - - private static void AddRequest(XElement parent, SignRequestItem item) - { - var path = new XAttribute("Path", item.Path); - switch (item) - { - case SignRequestItem.Container c: - var container = new XElement("Container", - path, - new XAttribute("Type", c.Type)); - - if (!string.IsNullOrEmpty(c.Certificate)) - { - container.Add(new XAttribute("Certificate", c.Certificate)); - } - - if (!string.IsNullOrEmpty(c.StrongName)) - { - container.Add(new XAttribute("StrongName", c.StrongName)); - } - - parent.Add(container); - - foreach (var i in c.Items) - { - AddRequest(container, i); - } - - break; - case SignRequestItem.Exclusion e: - parent.Add(new XElement("ExcludedFile", path)); - break; - case SignRequestItem.File f: - var file = new XElement("File", path); - - if (!string.IsNullOrEmpty(f.Certificate)) - { - file.Add(new XAttribute("Certificate", f.Certificate)); - } - - if (!string.IsNullOrEmpty(f.StrongName)) - { - file.Add(new XAttribute("StrongName", f.StrongName)); - } - - parent.Add(file); - break; - throw new InvalidOperationException("Unrecognized sign request item"); - } - } - - public void Dispose() - { - Save(); - } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/SignRequestItem.cs b/modules/KoreBuild.Tasks/Internal/SignRequestItem.cs deleted file mode 100644 index 754bf952a..000000000 --- a/modules/KoreBuild.Tasks/Internal/SignRequestItem.cs +++ /dev/null @@ -1,57 +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; - -namespace KoreBuild.Tasks -{ - internal abstract class SignRequestItem - { - public SignRequestItem(string path) - { - Path = path ?? throw new ArgumentNullException(nameof(path)); - } - - public string Path { get; } - - public class Exclusion : SignRequestItem - { - public Exclusion(string path) : base(path) - { - } - } - - public class File : SignRequestItem - { - public File(string path, string certificate, string strongName) : base(path) - { - Certificate = certificate; - StrongName = strongName; - } - - public string Certificate { get; } - public string StrongName { get; } - } - - public class Container : File - { - private readonly SignRequestCollection _items = new SignRequestCollection(); - - public Container(string path, string type, string certificate, string strongName) : base(path, certificate, strongName) - { - Type = type ?? throw new ArgumentNullException(nameof(type)); - } - - public IEnumerable Items => _items; - - public string Type { get; } - - public Container AddItem(SignRequestItem item) - { - _items.Add(item); - return this; - } - } - } -} diff --git a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj index 4d9a86ec5..bfb1f7096 100644 --- a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj +++ b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj @@ -5,7 +5,6 @@ netcoreapp2.0 Internal.AspNetCore.KoreBuild.Tasks - @@ -15,7 +14,6 @@ - @@ -28,5 +26,9 @@ + + + + diff --git a/modules/NuGetPackageVerifier/console/Manifests/PackageSignRequest.cs b/modules/NuGetPackageVerifier/console/Manifests/PackageSignRequest.cs deleted file mode 100644 index 776e9d7f7..000000000 --- a/modules/NuGetPackageVerifier/console/Manifests/PackageSignRequest.cs +++ /dev/null @@ -1,13 +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.Collections.Generic; - -namespace NuGetPackageVerifier.Manifests -{ - public class PackageSignRequest - { - public ISet FilesExcludedFromSigning { get; set; } - public ISet FilesToSign { get; set; } - } -} diff --git a/modules/NuGetPackageVerifier/console/Manifests/SignRequestManifest.cs b/modules/NuGetPackageVerifier/console/Manifests/SignRequestManifest.cs deleted file mode 100644 index 39ff486ba..000000000 --- a/modules/NuGetPackageVerifier/console/Manifests/SignRequestManifest.cs +++ /dev/null @@ -1,55 +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.IO; -using System.Linq; -using System.Xml.Linq; - -namespace NuGetPackageVerifier.Manifests -{ - public class SignRequestManifest - { - /// - /// Represents all signing requests in the sign request manifest that are for nupkg files. - /// - public IReadOnlyDictionary PackageSignRequests { get; private set; } - - public static SignRequestManifest Parse(string filePath) - { - using (var reader = File.OpenText(filePath)) - { - return Parse(reader, Path.GetDirectoryName(filePath)); - } - } - - public static SignRequestManifest Parse(TextReader reader, string manifestBasePath) - { - var doc = XDocument.Load(reader); - var requests = new Dictionary(StringComparer.OrdinalIgnoreCase); - var manifest = new SignRequestManifest { PackageSignRequests = requests }; - - var nupkgContainers = doc.Root - .Elements("Container") - .Where(c => "nupkg".Equals(c.Attribute("Type")?.Value, StringComparison.Ordinal)); - - foreach (var container in nupkgContainers) - { - var request = new PackageSignRequest - { - FilesToSign = container.Elements("File").Select(GetPath).ToHashSet(StringComparer.Ordinal), - FilesExcludedFromSigning = container.Elements("ExcludedFile").Select(GetPath).ToHashSet(StringComparer.Ordinal), - }; - - var path = new FileInfo(Path.Combine(manifestBasePath, GetPath(container))).FullName; - - requests.Add(path, request); - } - - return manifest; - } - - private static string GetPath(XElement element) => element.Attribute("Path")?.Value; - } -} diff --git a/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj b/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj index 813f67dfa..c83a782e9 100644 --- a/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj +++ b/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj @@ -20,6 +20,10 @@ + + + + diff --git a/modules/NuGetPackageVerifier/console/PackageAnalysisContext.cs b/modules/NuGetPackageVerifier/console/PackageAnalysisContext.cs index 004892512..04a40078c 100644 --- a/modules/NuGetPackageVerifier/console/PackageAnalysisContext.cs +++ b/modules/NuGetPackageVerifier/console/PackageAnalysisContext.cs @@ -4,9 +4,9 @@ using System; using System.Collections.Generic; using System.IO; +using Microsoft.AspNetCore.BuildTools.CodeSign; using NuGet.Packaging; using NuGetPackageVerifier.Logging; -using NuGetPackageVerifier.Manifests; namespace NuGetPackageVerifier { @@ -15,7 +15,7 @@ public class PackageAnalysisContext : IDisposable private PackageArchiveReader _reader; public FileInfo PackageFileInfo { get; set; } - public PackageSignRequest SignRequest { get; set; } + public SignRequestItem SignRequest { get; set; } public IPackageMetadata Metadata { get; set; } public PackageVerifierOptions Options { get; set; } public IPackageVerifierLogger Logger { get; set; } diff --git a/modules/NuGetPackageVerifier/console/Program.cs b/modules/NuGetPackageVerifier/console/Program.cs index 38d973bfe..d9e2d888b 100644 --- a/modules/NuGetPackageVerifier/console/Program.cs +++ b/modules/NuGetPackageVerifier/console/Program.cs @@ -6,11 +6,11 @@ using System.Diagnostics; using System.IO; using System.Linq; +using Microsoft.AspNetCore.BuildTools.CodeSign; using Microsoft.Extensions.CommandLineUtils; using Newtonsoft.Json; using NuGet.Packaging; using NuGetPackageVerifier.Logging; -using NuGetPackageVerifier.Manifests; namespace NuGetPackageVerifier { @@ -72,7 +72,7 @@ public static int Main(string[] args) var signRequestManifest = signRequest.HasValue() - ? SignRequestManifest.Parse(signRequest.Value()) + ? SignRequestManifestXmlReader.Load(signRequest.Value()) : default; logger.LogNormal("Read {0} package set(s) from {1}", packageSets.Count, ruleFile.Value()); @@ -93,7 +93,7 @@ public static int Main(string[] args) private static int Execute( IDictionary packageSets, IEnumerable nupkgs, - SignRequestManifest signRequestManifest, + SignRequestCollection signRequestManifest, List excludedRuleNames, IPackageVerifierLogger logger, IgnoreAssistanceMode ignoreAssistanceMode) @@ -185,8 +185,9 @@ private static int Execute( var package = packagePair.Key; logger.LogInfo("Analyzing {0} ({1})", package.Id, package.Version); - PackageSignRequest signRequest = null; - signRequestManifest?.PackageSignRequests.TryGetValue(packagePair.Value.FullName, out signRequest); + var signRequest = signRequestManifest? + .FirstOrDefault(i => i.ItemType == SignRequestItemType.Nupkg + && string.Equals(packagePair.Value.FullName, Path.Combine(signRequestManifest.BasePath, i.Path), StringComparison.OrdinalIgnoreCase)); List issues; using (var context = new PackageAnalysisContext @@ -250,8 +251,9 @@ private static int Execute( { logger.LogInfo("Analyzing {0} ({1})", unlistedPackage.Id, unlistedPackage.Version); - PackageSignRequest signRequest = null; - signRequestManifest?.PackageSignRequests.TryGetValue(packages[unlistedPackage].FullName, out signRequest); + var signRequest = signRequestManifest? + .FirstOrDefault(i => i.ItemType== SignRequestItemType.Nupkg + && string.Equals(packages[unlistedPackage].FullName, Path.Combine(signRequestManifest.BasePath, i.Path), StringComparison.OrdinalIgnoreCase)); List issues; PackageVerifierOptions packageOptions = null; diff --git a/modules/NuGetPackageVerifier/console/Rules/SignRequestListsAllSignableFiles.cs b/modules/NuGetPackageVerifier/console/Rules/SignRequestListsAllSignableFiles.cs index ba5672079..c305e487e 100644 --- a/modules/NuGetPackageVerifier/console/Rules/SignRequestListsAllSignableFiles.cs +++ b/modules/NuGetPackageVerifier/console/Rules/SignRequestListsAllSignableFiles.cs @@ -1,26 +1,15 @@ // 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.IO; +using System.Linq; +using Microsoft.AspNetCore.BuildTools.CodeSign; using NuGetPackageVerifier.Logging; namespace NuGetPackageVerifier.Rules { public class SignRequestListsAllSignableFiles : IPackageVerifierRule { - private static readonly HashSet SignableExtensions = new HashSet(StringComparer.OrdinalIgnoreCase) - { - ".dll", - ".exe", - ".ps1", - ".psd1", - ".psm1", - ".psc1", - ".ps1xml", - }; - public IEnumerable Validate(PackageAnalysisContext context) { if (context.SignRequest == null) @@ -31,13 +20,12 @@ public IEnumerable Validate(PackageAnalysisContext context foreach (var file in context.PackageReader.GetFiles()) { - var ext = Path.GetExtension(file); - if (!SignableExtensions.Contains(ext)) + if (!SignRequestItem.IsFileTypeSignable(file)) { continue; } - if (!context.SignRequest.FilesToSign.Contains(file) && !context.SignRequest.FilesExcludedFromSigning.Contains(file)) + if (!context.SignRequest.Children.Any(f => string.Equals(f.Path,file))) { yield return PackageIssueFactory.SignRequestMissingPackageFile(context.Metadata.Id, file); } diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/Internal.AspNetCore.CodeSign.Abstractions.csproj b/src/Internal.AspNetCore.CodeSign.Abstractions/Internal.AspNetCore.CodeSign.Abstractions.csproj new file mode 100644 index 000000000..e14a59d88 --- /dev/null +++ b/src/Internal.AspNetCore.CodeSign.Abstractions/Internal.AspNetCore.CodeSign.Abstractions.csproj @@ -0,0 +1,8 @@ + + + netstandard2.0 + Microsoft.AspNetCore.BuildTools.CodeSign + Provides abstractions for working with signrequest.xml + true + + \ No newline at end of file diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestCollection.cs b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestCollection.cs new file mode 100644 index 000000000..e35385d7d --- /dev/null +++ b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestCollection.cs @@ -0,0 +1,36 @@ +// 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; +using System.Collections.Generic; + +namespace Microsoft.AspNetCore.BuildTools.CodeSign +{ + /// + /// A collection of sign request items. + /// + public class SignRequestCollection : IEnumerable + { + private readonly SortedDictionary _items = new SortedDictionary(StringComparer.Ordinal); + + /// + public IEnumerator GetEnumerator() => _items.Values.GetEnumerator(); + + IEnumerator IEnumerable.GetEnumerator() => _items.Values.GetEnumerator(); + + /// + /// The base path for files in the collection. + /// + public string BasePath { get; set; } + + /// + /// Add an item to the collection. + /// + /// The item + public void Add(SignRequestItem item) + { + _items.Add(item.Path, item); + } + } +} diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItem.cs b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItem.cs new file mode 100644 index 000000000..3b6c3046e --- /dev/null +++ b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItem.cs @@ -0,0 +1,172 @@ +// 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; + +namespace Microsoft.AspNetCore.BuildTools.CodeSign +{ + /// + /// Represents a file that should be signed. + /// + public class SignRequestItem + { + private static readonly Dictionary FileExtensionMapping = + new Dictionary(StringComparer.OrdinalIgnoreCase) + { + ["zip"] = SignRequestItemType.Zip, + ["mpack"] = SignRequestItemType.Zip, + ["vsix"] = SignRequestItemType.Vsix, + ["nupkg"] = SignRequestItemType.Nupkg, + ["dll"] = SignRequestItemType.File, + ["exe"] = SignRequestItemType.File, + ["ps1"] = SignRequestItemType.File, + ["psd1"] = SignRequestItemType.File, + ["psm1"] = SignRequestItemType.File, + ["psc1"] = SignRequestItemType.File, + ["ps1xml"] = SignRequestItemType.File, + }; + + private readonly SignRequestCollection _children = new SignRequestCollection(); + + /// + /// Create an exclusion to signing. + /// + /// + /// + public static SignRequestItem CreateExclusion(string path) + => new SignRequestItem(path, SignRequestItemType.Exclusion); + + /// + /// A zip archive file. + /// + /// + /// + public static SignRequestItem CreateZip(string path) + => new SignRequestItem(path, SignRequestItemType.Zip); + + /// + /// A binary (.exe, .dll) to be signed. + /// + /// + /// + /// + /// + public static SignRequestItem CreateFile(string path, string certificateName, string strongName) + => new SignRequestItem(path, SignRequestItemType.File) + { + Certificate = certificateName, + StrongName = strongName, + }; + + /// + /// A .nupkg to be signed. + /// + /// + /// + /// + public static SignRequestItem CreateNugetPackage(string path, string certificateName) + => new SignRequestItem(path, SignRequestItemType.Nupkg) + { + Certificate = certificateName, + }; + + /// + /// A .vsix to be signed. + /// + /// + /// + /// + public static SignRequestItem CreateVsix(string path, string certificateName) + => new SignRequestItem(path, SignRequestItemType.Vsix) + { + Certificate = certificateName, + }; + + /// + /// Determines if a file is signable based on the file extension + /// + /// The file extension (beginning with a dot). + /// True if the path can be code-signed. + public static bool IsFileTypeSignable(string filePath) + => GetTypeFromFileExtension(System.IO.Path.GetExtension(filePath).TrimStart('.')) != SignRequestItemType.Unknown; + + /// + /// Get an item type based on its file extension. + /// + /// + /// + public static SignRequestItemType GetTypeFromFileExtension(string fileExtension) + { + if (FileExtensionMapping.TryGetValue(fileExtension.TrimStart('.'), out var type)) + { + return type; + } + + return SignRequestItemType.Unknown; + } + + /// + /// Initialize an instance of + /// + /// + /// + internal SignRequestItem(string path, SignRequestItemType itemType) + { + Path = path ?? throw new ArgumentNullException(nameof(path)); + ItemType = itemType; + } + + /// + /// The file path. Should be relative to the manifest or container. + /// + public string Path { get; } + + /// + /// The type of the item. + /// + public SignRequestItemType ItemType { get; } + + /// + /// The name of the code signing certificate to use. + /// + public string Certificate { get; internal set; } + + /// + /// The name of the strong name key to use (for .NET assemblies only). + /// + public string StrongName { get; internal set; } + + /// + /// Excluded from code signing. + /// + public bool Excluded => ItemType == SignRequestItemType.Exclusion; + + /// + /// True for item types which can contain children, such as .zip or .nupkg files. + /// + public bool CanContainChildren + => ItemType == SignRequestItemType.Nupkg + || ItemType == SignRequestItemType.Zip + || ItemType == SignRequestItemType.Vsix; + + /// + /// Children of the sign request item. + /// + public IEnumerable Children => _children; + + /// + /// Add a child type. + /// + /// + public void AddChild(SignRequestItem item) + { + if (!CanContainChildren) + { + throw new InvalidOperationException("Cannot add a child to items which do not allow nested files"); + } + + _children.Add(item); + } + } +} diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItemType.cs b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItemType.cs new file mode 100644 index 000000000..b5d411504 --- /dev/null +++ b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItemType.cs @@ -0,0 +1,44 @@ +// 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. + +namespace Microsoft.AspNetCore.BuildTools.CodeSign +{ + /// + /// The type of the sign request item. + /// + public enum SignRequestItemType + { + /// + /// An unknown sign request item type. + /// + Unknown = -1, + + /// + /// A file that should be excluded from signing. + /// + /// In some cases, it can be useful to explicitly define files to be ignored by code-signing. + /// + /// + Exclusion, + + /// + /// A .zip archive + /// + Zip, + + /// + /// A NuGet package + /// + Nupkg, + + /// + /// A Visual Studio extension installer file + /// + Vsix, + + /// + /// A signable binary or powershell script. + /// + File, + } +} diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlReader.cs b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlReader.cs new file mode 100644 index 000000000..59bb48511 --- /dev/null +++ b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlReader.cs @@ -0,0 +1,124 @@ +// 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 System.Xml; +using System.Xml.Linq; + +namespace Microsoft.AspNetCore.BuildTools.CodeSign +{ + /// + /// Reads a sign request manifest xml fil. + /// + public class SignRequestManifestXmlReader + { + private readonly TextReader _reader; + private readonly string _manifestBasePath; + + /// + /// Load the sign request xml file. + /// + /// + /// + public static SignRequestCollection Load(string filePath) + { + using (var reader = File.OpenText(filePath)) + { + return Load(reader, Path.GetDirectoryName(filePath)); + } + } + + /// + /// Read the sign request xml using a given base path. + /// + /// + /// + /// + public static SignRequestCollection Load(TextReader reader, string manifestBasePath) + { + return new SignRequestManifestXmlReader(reader, manifestBasePath).Read(); + } + + private SignRequestManifestXmlReader(TextReader reader, string manifestBasePath) + { + _reader = reader; + _manifestBasePath = manifestBasePath; + } + + private SignRequestCollection Read() + { + var doc = XDocument.Load(_reader); + + var collection = new SignRequestCollection + { + BasePath = _manifestBasePath + }; + + foreach (var element in doc.Root.Elements()) + { + collection.Add(ReadElement(element)); + } + + return collection; + } + + private SignRequestItem ReadElement(XElement element) + { + switch (element.Name.ToString()) + { + case "Nupkg": + return ReadNupkg(element); + case "Vsix": + return ReadVsix(element); + case "Zip": + return ReadZip(element); + case "File": + return ReadFile(element); + case "ExcludedFile": + return ReadExclusion(element); + default: + IXmlLineInfo lineInfo = element; + throw new InvalidDataException($"Unrecognized element type {element.Name} on line {lineInfo.LineNumber}"); + } + } + + private static SignRequestItem ReadExclusion(XElement element) + => SignRequestItem.CreateExclusion(GetPath(element)); + + private static SignRequestItem ReadFile(XElement element) + => SignRequestItem.CreateFile(GetPath(element), GetCertificate(element), GetStrongName(element)); + + private SignRequestItem ReadNupkg(XElement element) + { + var package = SignRequestItem.CreateNugetPackage(GetPath(element), GetCertificate(element)); + AddChildren(element, package); + return package; + } + + private SignRequestItem ReadVsix(XElement element) + { + var vsix = SignRequestItem.CreateVsix(GetPath(element), GetCertificate(element)); + AddChildren(element, vsix); + return vsix; + } + + private SignRequestItem ReadZip(XElement element) + { + var zip = SignRequestItem.CreateZip(GetPath(element)); + AddChildren(element, zip); + return zip; + } + + private void AddChildren(XElement element, SignRequestItem package) + { + foreach (var child in element.Elements()) + { + package.AddChild(ReadElement(child)); + } + } + + private static string GetStrongName(XElement element) => element.Attribute(XmlElementNames.StrongName)?.Value; + private static string GetCertificate(XElement element) => element.Attribute(XmlElementNames.Certificate)?.Value; + private static string GetPath(XElement element) => element.Attribute(XmlElementNames.Path)?.Value; + } +} diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlWriter.cs b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlWriter.cs new file mode 100644 index 000000000..86902213f --- /dev/null +++ b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlWriter.cs @@ -0,0 +1,117 @@ +// 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.IO; +using System.Text; +using System.Xml; +using System.Xml.Linq; + +namespace Microsoft.AspNetCore.BuildTools.CodeSign +{ + /// + /// Saves a to an xml file. + /// + public class SignRequestManifestXmlWriter : IDisposable + { + private readonly TextWriter _output; + private readonly XDocument _document; + + /// + /// Initalize an instance of + /// + /// + public SignRequestManifestXmlWriter(TextWriter output) + { + _output = output; + _document = new XDocument(new XElement("SignRequest")); + } + + /// + /// Add the collection to the output file + /// + /// + public void Write(SignRequestCollection signRequestCollection) + { + var node = _document.Root; + foreach (var request in signRequestCollection) + { + AddRequest(node, request); + } + } + + private static void AddRequest(XElement parent, SignRequestItem item) + { + var path = new XAttribute(XmlElementNames.Path, item.Path); + switch (item.ItemType) + { + case SignRequestItemType.Zip: + AddContainer(parent, item, XmlElementNames.Zip); + break; + case SignRequestItemType.Nupkg: + AddContainer(parent, item, XmlElementNames.Nupkg); + break; + case SignRequestItemType.Vsix: + AddContainer(parent, item, XmlElementNames.Vsix); + break; + case SignRequestItemType.Exclusion: + parent.Add(new XElement(XmlElementNames.ExcludedFile, path)); + break; + case SignRequestItemType.File: + var file = new XElement(XmlElementNames.File, path); + + if (!string.IsNullOrEmpty(item.Certificate)) + { + file.Add(new XAttribute(XmlElementNames.Certificate, item.Certificate)); + } + + if (!string.IsNullOrEmpty(item.StrongName)) + { + file.Add(new XAttribute(XmlElementNames.StrongName, item.StrongName)); + } + + parent.Add(file); + break; + default: + throw new InvalidOperationException("Unrecognized sign request item"); + } + } + + private static void AddContainer(XElement parent, SignRequestItem item, string elementType) + { + var container = new XElement(elementType, new XAttribute(XmlElementNames.Path, item.Path)); + + if (!string.IsNullOrEmpty(item.Certificate)) + { + container.Add(new XAttribute(XmlElementNames.Certificate, item.Certificate)); + } + + parent.Add(container); + + foreach (var i in item.Children) + { + AddRequest(container, i); + } + } + + private void Save() + { + var settings = new XmlWriterSettings + { + Encoding = Encoding.UTF8, + OmitXmlDeclaration = true, + Indent = true, + NewLineChars = "\r\n", + NewLineHandling = NewLineHandling.Replace, + }; + + using (var writer = XmlWriter.Create(_output, settings)) + { + _document.Save(writer); + } + } + + /// + public void Dispose() => Save(); + } +} diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/XmlElementNames.cs b/src/Internal.AspNetCore.CodeSign.Abstractions/XmlElementNames.cs new file mode 100644 index 000000000..2c2b22cda --- /dev/null +++ b/src/Internal.AspNetCore.CodeSign.Abstractions/XmlElementNames.cs @@ -0,0 +1,19 @@ +// 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.Xml.Linq; + +namespace Microsoft.AspNetCore.BuildTools.CodeSign +{ + internal static class XmlElementNames + { + public static readonly string StrongName = "StrongName"; + public static readonly string Certificate = "Certificate"; + public static readonly string Path = "Path"; + public static readonly string File = "File"; + public static readonly string ExcludedFile = "ExcludedFile"; + public static readonly string Vsix = "Vsix"; + public static readonly string Nupkg = "Nupkg"; + public static readonly string Zip = "Zip"; + } +} diff --git a/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.props b/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.props index be237e451..4ff5a44c1 100644 --- a/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.props +++ b/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.props @@ -4,6 +4,12 @@ for use outside of Microsoft. --> + + + false + + + diff --git a/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs b/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs index ed837a34e..5187ca160 100644 --- a/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs +++ b/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs @@ -65,12 +65,11 @@ public void FullBuildCompletes() var sign = XDocument.Load(signRequest); var excluded = Assert.Single(sign.Descendants("ExcludedFile")); Assert.Equal("build/Simple.Sources.1.0.0-beta-0001.nupkg", excluded.Attribute("Path")?.Value); - Assert.Collection(sign.Descendants("Container"), + Assert.Collection(sign.Descendants("Nupkg"), pkg => { Assert.Equal("build/Simple.CliTool.1.0.0-beta-0001.nupkg", pkg.Attribute("Path")?.Value); Assert.Null(pkg.Attribute("Certificate")); - Assert.Equal("nupkg", pkg.Attribute("Type")?.Value); Assert.Collection(pkg.Descendants("File"), a => { @@ -91,7 +90,6 @@ public void FullBuildCompletes() { Assert.Equal("build/Simple.Lib.1.0.0-beta-0001.nupkg", pkg.Attribute("Path")?.Value); Assert.Null(pkg.Attribute("Certificate")); - Assert.Equal("nupkg", pkg.Attribute("Type")?.Value); Assert.Collection(pkg.Descendants("File"), a => { @@ -108,8 +106,6 @@ public void FullBuildCompletes() { Assert.Equal("build/Simple.Lib.1.0.0-beta-0001.symbols.nupkg", pkg.Attribute("Path")?.Value); Assert.Null(pkg.Attribute("Certificate")); - Assert.Equal("nupkg", pkg.Attribute("Type")?.Value); - Assert.Equal("nupkg", pkg.Attribute("Type")?.Value); Assert.Collection(pkg.Descendants("File"), a => { diff --git a/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs b/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs index b6ba22796..e36d32ce5 100644 --- a/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs +++ b/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs @@ -3,9 +3,11 @@ using System; using System.Collections; +using System.Collections.Generic; using System.IO; using System.Text; using BuildTools.Tasks.Tests; +using Microsoft.Build.Framework; using Microsoft.Build.Utilities; using Xunit; using Xunit.Abstractions; @@ -25,7 +27,7 @@ public GenerateSignRequestTests(ITestOutputHelper output) public void ItCreatesSignRequest() { var nupkgPath = Path.Combine(AppContext.BaseDirectory, "build", "MyLib.nupkg"); - var requests = new[] + var requests = new ITaskItem[] { new TaskItem(Path.Combine(AppContext.BaseDirectory, "build", "ZZApp.vsix"), new Hashtable @@ -37,7 +39,7 @@ public void ItCreatesSignRequest() new Hashtable { ["IsContainer"] = "true", - ["Type"] = "zip", + ["Type"] = "nupkg", }), new TaskItem(Path.Combine(AppContext.BaseDirectory, "MyLib.dll"), new Hashtable @@ -52,16 +54,29 @@ public void ItCreatesSignRequest() { ["Certificate"] = "Cert1", }), + new MockTaskItem(Path.Combine("C:\\MyProject", "lib", "net461", "MyLib.dll")) + { + ["Container"] = nupkgPath, + ["DefiningProjectDirectory"] = "C:\\MyProject", + ["DefiningProjectFullPath"] = "C:\\MyProject\\MyProject.csproj", + ["Certificate"] = "Cert1", + }, }; - var exclusions = new[] + var exclusions = new ITaskItem[] { new TaskItem(Path.Combine(AppContext.BaseDirectory, "NotMyLib.dll"), new Hashtable { ["PackagePath"] = "lib/NotMyLib.dll", ["Container"] = nupkgPath, - }) + }), + new MockTaskItem(Path.Combine("C:\\MyProject", "tool", "net461", "NotMyLib.dll")) + { + ["Container"] = nupkgPath, + ["DefiningProjectDirectory"] = "C:\\MyProject", + ["DefiningProjectFullPath"] = "C:\\MyProject\\MyProject.csproj", + }, }; var task = new GenerateSignRequest @@ -78,11 +93,13 @@ public void ItCreatesSignRequest() var expected = $@" - + + - - + + + ".Replace('`', '"'); _output.WriteLine(sb.ToString()); diff --git a/test/KoreBuild.Tasks.Tests/MockTaskItem.cs b/test/KoreBuild.Tasks.Tests/MockTaskItem.cs new file mode 100644 index 000000000..3b750d4be --- /dev/null +++ b/test/KoreBuild.Tasks.Tests/MockTaskItem.cs @@ -0,0 +1,65 @@ +// 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; +using System.Collections.Generic; +using Microsoft.Build.Framework; + +namespace KoreBuild.Tasks.Tests +{ + internal class MockTaskItem : ITaskItem + { + private Dictionary _metadata = new Dictionary(StringComparer.OrdinalIgnoreCase); + + public MockTaskItem(string itemSpec) + { + ItemSpec = itemSpec; + } + + public string this[string index] + { + get => GetMetadata(index); + set => SetMetadata(index, value); + } + + public string ItemSpec { get; set; } + + public ICollection MetadataNames => _metadata.Keys; + + public int MetadataCount => _metadata.Count; + + public IDictionary CloneCustomMetadata() + { + return new Dictionary(_metadata); + } + + public void CopyMetadataTo(ITaskItem destinationItem) + { + destinationItem.ItemSpec = ItemSpec; + foreach (var item in _metadata) + { + destinationItem.SetMetadata(item.Key, item.Value); + } + } + + public string GetMetadata(string metadataName) + { + _metadata.TryGetValue(metadataName, out var retVal); + return retVal; + } + + public void RemoveMetadata(string metadataName) + { + if (_metadata.ContainsKey(metadataName)) + { + _metadata.Remove(metadataName); + } + } + + public void SetMetadata(string metadataName, string metadataValue) + { + _metadata[metadataName] = metadataValue; + } + } +} diff --git a/test/NuGetPackageVerifier.Tests/Rules/SignRequestListsAllSignableFilesRuleTests.cs b/test/NuGetPackageVerifier.Tests/Rules/SignRequestListsAllSignableFilesRuleTests.cs index 48f189165..b728d3526 100644 --- a/test/NuGetPackageVerifier.Tests/Rules/SignRequestListsAllSignableFilesRuleTests.cs +++ b/test/NuGetPackageVerifier.Tests/Rules/SignRequestListsAllSignableFilesRuleTests.cs @@ -23,8 +23,8 @@ public void ItFailsWhenPackageContainsUnlistedFiles() { var signRequest = @" - - + + "; var context = TestPackageAnalysisContext.CreateContext( @@ -55,10 +55,10 @@ public void DoesNotFailWhenSignRequestIncludesAllFiles() { var signRequest = @" - + - + "; var context = TestPackageAnalysisContext.CreateContext( @@ -81,10 +81,10 @@ public void DoesNotFailWhenSignRequestListsAllFiles() { var signRequest = @" - + - + "; var context = TestPackageAnalysisContext.CreateContext( diff --git a/test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs b/test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs index 71bf30ebe..73abaf6c9 100644 --- a/test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs +++ b/test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs @@ -3,9 +3,9 @@ using System.IO; using System.Linq; +using Microsoft.AspNetCore.BuildTools.CodeSign; using NuGet.Packaging; using NuGet.Versioning; -using NuGetPackageVerifier.Manifests; using Xunit.Abstractions; namespace NuGetPackageVerifier.Utilities @@ -72,13 +72,13 @@ public static PackageAnalysisContext Create( builder.Save(nupkg); } - PackageSignRequest packageSignRequest = null; + SignRequestItem packageSignRequest = null; if (signRequest != null) { var reader = new StringReader(signRequest); - var signManifest = SignRequestManifest.Parse(reader, basePath); - packageSignRequest = signManifest.PackageSignRequests[nupkgPath]; + var signManifest = SignRequestManifestXmlReader.Load(reader, basePath); + packageSignRequest = signManifest.First(f => f.Path == nupkgFileName); } var context = new TestPackageAnalysisContext(disposableDirectory) From eb03a85df116d82ef68311c1fb8d04c17c78d911 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 5 Jun 2018 17:47:54 -0700 Subject: [PATCH 025/192] Fix for ambiguous argument in PowerShell 4 --- files/KoreBuild/scripts/KoreBuild.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index ba626469c..9b21977b5 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -249,8 +249,8 @@ function Install-Tools( $restorerfile = "$PSScriptRoot/../modules/BundledPackages/BundledPackageRestorer.csproj" $restorerfilelock="$env:NUGET_PACKAGES/internal.aspnetcore.sdk/$(Get-KoreBuildVersion)/korebuild.sentinel" if ((Test-Path $restorerfile) -and -not (Test-Path $restorerfilelock)) { - mkdir -p $(Split-Path -Parent $restorerfilelock) -ea ignore | Out-Null - New-Item -ItemType File $restorerfilelock -ea ignore | Out-Null + New-Item -ItemType Directory $(Split-Path -Parent $restorerfilelock) -ErrorAction Ignore | Out-Null + New-Item -ItemType File $restorerfilelock -ErrorAction Ignore | Out-Null __exec $global:dotnet msbuild -restore '-t:noop' '-v:m' "$restorerfile" } # end workaround From 5daeb3f7fccdba36c5c35a54879ea0d486d360a1 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 5 Jun 2018 18:06:12 -0700 Subject: [PATCH 026/192] Improve support for generating the sign request for DotNetCli tool packages --- modules/KoreBuild.Tasks/GenerateSignRequests.cs | 5 +++++ .../Microsoft.DotNetTool.ShimGeneration.targets | 11 +++++++++++ .../KoreBuild.FunctionalTests/SimpleRepoTests.cs | 16 +++++++++++++--- .../GenerateSignRequestsTests.cs | 9 +++++++++ .../src/Simple.CliTool/Simple.CliTool.csproj | 12 ++++-------- 5 files changed, 42 insertions(+), 11 deletions(-) diff --git a/modules/KoreBuild.Tasks/GenerateSignRequests.cs b/modules/KoreBuild.Tasks/GenerateSignRequests.cs index 247846c29..555051987 100644 --- a/modules/KoreBuild.Tasks/GenerateSignRequests.cs +++ b/modules/KoreBuild.Tasks/GenerateSignRequests.cs @@ -214,6 +214,11 @@ private static string GetPathWithinContainer(ITaskItem item) } } + if (itemPath.EndsWith('/') || itemPath.EndsWith('\\')) + { + return Path.Combine(itemPath, Path.GetFileName(item.ItemSpec)); + } + return itemPath; } diff --git a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.targets b/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.targets index 2a9fad1ed..cd2229856 100644 --- a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.targets +++ b/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.targets @@ -3,6 +3,7 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) $(TargetsForTfmSpecificContentInPackage);GetDotNetToolShimPackageContent + $(GetSignedPackageFilesDependsOn);_GetSignedPackageFilesForGeneratedShims @@ -26,6 +27,15 @@ + + + + + tools/$(TargetFramework)/any/$(TargetFileName) + + + + - - tools/any/$(TargetFramework)/$(TargetFileName) - - - - tools/any/$(TargetFramework)/Newtonsoft.Json.dll + + tools/$(TargetFramework)/any/ From 4513b38b34cc0fd84343f21a448d61cc9b5fd924 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 5 Jun 2018 18:12:37 -0700 Subject: [PATCH 027/192] Fix warning about duplicate imports in pre-restore --- modules/BundledPackages/BundledPackages.proj | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/modules/BundledPackages/BundledPackages.proj b/modules/BundledPackages/BundledPackages.proj index 280b42a22..ad2adb960 100644 --- a/modules/BundledPackages/BundledPackages.proj +++ b/modules/BundledPackages/BundledPackages.proj @@ -22,8 +22,7 @@ --> - + From d2459fa8e9aa75c4376ea99888b589cd9f06e76e Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 5 Jun 2018 18:27:03 -0700 Subject: [PATCH 028/192] Fix bug in matching sign request items to the package file --- modules/NuGetPackageVerifier/console/Program.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/modules/NuGetPackageVerifier/console/Program.cs b/modules/NuGetPackageVerifier/console/Program.cs index d9e2d888b..c3ef984f4 100644 --- a/modules/NuGetPackageVerifier/console/Program.cs +++ b/modules/NuGetPackageVerifier/console/Program.cs @@ -187,7 +187,7 @@ private static int Execute( var signRequest = signRequestManifest? .FirstOrDefault(i => i.ItemType == SignRequestItemType.Nupkg - && string.Equals(packagePair.Value.FullName, Path.Combine(signRequestManifest.BasePath, i.Path), StringComparison.OrdinalIgnoreCase)); + && string.Equals(packagePair.Value.FullName, Path.Combine(signRequestManifest.BasePath, i.Path.Replace('/', Path.DirectorySeparatorChar)), StringComparison.OrdinalIgnoreCase)); List issues; using (var context = new PackageAnalysisContext @@ -252,8 +252,8 @@ private static int Execute( logger.LogInfo("Analyzing {0} ({1})", unlistedPackage.Id, unlistedPackage.Version); var signRequest = signRequestManifest? - .FirstOrDefault(i => i.ItemType== SignRequestItemType.Nupkg - && string.Equals(packages[unlistedPackage].FullName, Path.Combine(signRequestManifest.BasePath, i.Path), StringComparison.OrdinalIgnoreCase)); + .FirstOrDefault(i => i.ItemType == SignRequestItemType.Nupkg + && string.Equals(packages[unlistedPackage].FullName, Path.Combine(signRequestManifest.BasePath, i.Path.Replace('/', Path.DirectorySeparatorChar)), StringComparison.OrdinalIgnoreCase)); List issues; PackageVerifierOptions packageOptions = null; From 0008f13fb61b9b0dd98baf51a09098baa0cda28b Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 5 Jun 2018 20:02:39 -0700 Subject: [PATCH 029/192] Fix issues in generating sign request with DotNetTool packages --- modules/KoreBuild.Tasks/GenerateSignRequests.cs | 13 +++++++------ .../{AssemblyHelpers.cs => ExtensionMethods.cs} | 9 +++++++-- ...emblyHasNeutralResourcesLanguageAttributeRule.cs | 5 +++++ .../Rules/AssemblyHasServicingAttributeRule.cs | 5 +++++ .../console/Rules/AssemblyStrongNameRule.cs | 5 +++++ .../GenerateSignRequestsTests.cs | 6 ++---- 6 files changed, 31 insertions(+), 12 deletions(-) rename modules/NuGetPackageVerifier/console/{AssemblyHelpers.cs => ExtensionMethods.cs} (77%) diff --git a/modules/KoreBuild.Tasks/GenerateSignRequests.cs b/modules/KoreBuild.Tasks/GenerateSignRequests.cs index 555051987..cee8b9177 100644 --- a/modules/KoreBuild.Tasks/GenerateSignRequests.cs +++ b/modules/KoreBuild.Tasks/GenerateSignRequests.cs @@ -18,8 +18,7 @@ namespace KoreBuild.Tasks public class GenerateSignRequest : Microsoft.Build.Utilities.Task { // well-known metadata on items set by the MSBuild engine - private const string ProjectDirMetadataName = "DefiningProjectDirectory"; - private const string ProjectFileMetadataName = "DefiningProjectFullPath"; + private const string ProjectFileMetadataName = "MSBuildSourceProjectFile"; /// /// Files or containers of files that should be signed. @@ -198,19 +197,21 @@ internal bool Execute(Func writerFactory) return !Log.HasLoggedErrors; } - private static string GetPathWithinContainer(ITaskItem item) + private string GetPathWithinContainer(ITaskItem item) { // always prefer an explicit package path var itemPath = item.GetMetadata("PackagePath"); if (string.IsNullOrEmpty(itemPath)) { // allow defining SignedPackageFile using just ItemSpec - var projectDir = item.GetMetadata(ProjectDirMetadataName); - if (!string.IsNullOrEmpty(projectDir)) + var projectFile = item.GetMetadata(ProjectFileMetadataName); + if (!string.IsNullOrEmpty(projectFile)) { // users will typically write items with relative itemspecs, but we can't get the original item spec. // Infer the original item spec by getting the path relative to the project directory - return Path.GetRelativePath(projectDir, item.ItemSpec); + return Path.IsPathRooted(item.ItemSpec) && !string.IsNullOrEmpty(projectFile) + ? Path.GetRelativePath(Path.GetDirectoryName(projectFile), item.ItemSpec) + : item.ItemSpec; } } diff --git a/modules/NuGetPackageVerifier/console/AssemblyHelpers.cs b/modules/NuGetPackageVerifier/console/ExtensionMethods.cs similarity index 77% rename from modules/NuGetPackageVerifier/console/AssemblyHelpers.cs rename to modules/NuGetPackageVerifier/console/ExtensionMethods.cs index b801a3b89..c81eea64c 100644 --- a/modules/NuGetPackageVerifier/console/AssemblyHelpers.cs +++ b/modules/NuGetPackageVerifier/console/ExtensionMethods.cs @@ -3,11 +3,13 @@ using System; using System.IO; +using System.Linq; using System.Runtime.Loader; +using NuGet.Packaging; namespace NuGetPackageVerifier { - public class AssemblyHelpers + public static class AssemblyHelpers { public static bool IsAssemblyManaged(string assemblyPath) { @@ -31,5 +33,8 @@ public static bool IsAssemblyManaged(string assemblyPath) } return false; } + + public static bool IsDotNetToolPackage(this IPackageMetadata metadata) + => metadata.PackageTypes.Count() > 0 && metadata.PackageTypes.All(p => p == Constants.DotNetTool); } -} \ No newline at end of file +} diff --git a/modules/NuGetPackageVerifier/console/Rules/AssemblyHasNeutralResourcesLanguageAttributeRule.cs b/modules/NuGetPackageVerifier/console/Rules/AssemblyHasNeutralResourcesLanguageAttributeRule.cs index d032fd188..0165b3ad7 100644 --- a/modules/NuGetPackageVerifier/console/Rules/AssemblyHasNeutralResourcesLanguageAttributeRule.cs +++ b/modules/NuGetPackageVerifier/console/Rules/AssemblyHasNeutralResourcesLanguageAttributeRule.cs @@ -14,6 +14,11 @@ public class AssemblyHasNeutralResourcesLanguageAttributeRule : IPackageVerifier { public IEnumerable Validate(PackageAnalysisContext context) { + if (context.Metadata.IsDotNetToolPackage()) + { + yield break; + } + AssemblyAttributesDataHelper.SetAssemblyAttributesData(context); foreach (var assemblyData in context.AssemblyData) { diff --git a/modules/NuGetPackageVerifier/console/Rules/AssemblyHasServicingAttributeRule.cs b/modules/NuGetPackageVerifier/console/Rules/AssemblyHasServicingAttributeRule.cs index 87bd5f688..e1fd1ee3e 100644 --- a/modules/NuGetPackageVerifier/console/Rules/AssemblyHasServicingAttributeRule.cs +++ b/modules/NuGetPackageVerifier/console/Rules/AssemblyHasServicingAttributeRule.cs @@ -13,6 +13,11 @@ public class AssemblyHasServicingAttributeRule : IPackageVerifierRule { public IEnumerable Validate(PackageAnalysisContext context) { + if (context.Metadata.IsDotNetToolPackage()) + { + yield break; + } + AssemblyAttributesDataHelper.SetAssemblyAttributesData(context); foreach (var assemblyData in context.AssemblyData) { diff --git a/modules/NuGetPackageVerifier/console/Rules/AssemblyStrongNameRule.cs b/modules/NuGetPackageVerifier/console/Rules/AssemblyStrongNameRule.cs index b444e3677..afa288b65 100644 --- a/modules/NuGetPackageVerifier/console/Rules/AssemblyStrongNameRule.cs +++ b/modules/NuGetPackageVerifier/console/Rules/AssemblyStrongNameRule.cs @@ -16,6 +16,11 @@ public class AssemblyStrongNameRule : IPackageVerifierRule public IEnumerable Validate(PackageAnalysisContext context) { + if (context.Metadata.IsDotNetToolPackage()) + { + yield break; + } + foreach (var currentFile in context.PackageReader.GetFiles()) { var extension = Path.GetExtension(currentFile); diff --git a/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs b/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs index 841e81731..055ae0b71 100644 --- a/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs +++ b/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs @@ -65,8 +65,7 @@ public void ItCreatesSignRequest() new MockTaskItem(Path.Combine("C:\\MyProject", "lib", "net461", "MyLib.dll")) { ["Container"] = nupkgPath, - ["DefiningProjectDirectory"] = "C:\\MyProject", - ["DefiningProjectFullPath"] = "C:\\MyProject\\MyProject.csproj", + ["MSBuildSourceProjectFile"] = "C:\\MyProject\\MyProject.csproj", ["Certificate"] = "Cert1", }, }; @@ -82,8 +81,7 @@ public void ItCreatesSignRequest() new MockTaskItem(Path.Combine("C:\\MyProject", "tool", "net461", "NotMyLib.dll")) { ["Container"] = nupkgPath, - ["DefiningProjectDirectory"] = "C:\\MyProject", - ["DefiningProjectFullPath"] = "C:\\MyProject\\MyProject.csproj", + ["MSBuildSourceProjectFile"] = "C:\\MyProject\\MyProject.csproj", }, }; From d9f07c7f313a0af1d49f003f5424b4dbbdd3e09f Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 5 Jun 2018 21:54:56 -0700 Subject: [PATCH 030/192] Provide better error messages when duplicate sign request data is present --- .../solutionbuild/Project.Inspection.targets | 9 +++- .../KoreBuild.Tasks/GenerateSignRequests.cs | 46 +++++++++++++++---- .../SignRequestCollection.cs | 7 +++ .../SignRequestItem.cs | 7 +++ .../Internal.AspNetCore.Sdk.props | 3 ++ 5 files changed, 61 insertions(+), 11 deletions(-) diff --git a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets index 30046917f..4c6ee1a29 100644 --- a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets +++ b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets @@ -115,15 +115,20 @@ Items: Condition=" '$(TargetFramework)' != '' " DependsOnTargets="BuiltProjectOutputGroup;SatelliteDllsProjectOutputGroup"> + + <_PackageBasePath>$(BuildOutputTargetFolder.TrimEnd('/')) + <_PackageBasePath>$(_PackageBasePath.TrimEnd('\')) + + - $(BuildOutputTargetFolder)/$(TargetFramework)/%(BuiltProjectOutputGroupOutput.FileName)%(BuiltProjectOutputGroupOutput.Extension) + $(_PackageBasePath)/$(TargetFramework)/%(BuiltProjectOutputGroupOutput.FileName)%(BuiltProjectOutputGroupOutput.Extension) $(AssemblySigningCertName) $(AssemblySigningStrongName) - $(BuildOutputTargetFolder)/$(TargetFramework)/%(SatelliteDllsProjectOutputGroupOutput.FileName)%(SatelliteDllsProjectOutputGroupOutput.Extension) + $(_PackageBasePath)/$(TargetFramework)/%(SatelliteDllsProjectOutputGroupOutput.FileName)%(SatelliteDllsProjectOutputGroupOutput.Extension) $(AssemblySigningCertName) $(AssemblySigningStrongName) diff --git a/modules/KoreBuild.Tasks/GenerateSignRequests.cs b/modules/KoreBuild.Tasks/GenerateSignRequests.cs index cee8b9177..e07e56a2d 100644 --- a/modules/KoreBuild.Tasks/GenerateSignRequests.cs +++ b/modules/KoreBuild.Tasks/GenerateSignRequests.cs @@ -98,6 +98,12 @@ internal bool Execute(Func writerFactory) } containers[item.ItemSpec] = container; + if (signRequestCollection.ContainsItemForPath(container.Path)) + { + Log.LogError( + $"Duplicate sign request for {container.ItemType} '{container.Path}'"); + continue; + } signRequestCollection.Add(container); } } @@ -134,6 +140,12 @@ internal bool Execute(Func writerFactory) var file = SignRequestItem.CreateFile(normalizedPath, item.GetMetadata("Certificate"), item.GetMetadata("StrongName")); + + if (container.ContainsChildPath(file.Path)) + { + Log.LogError($"Duplicate sign request for file '{file.Path}' inside '{container.Path}'"); + continue; + } container.AddChild(file); } else @@ -141,6 +153,14 @@ internal bool Execute(Func writerFactory) var file = SignRequestItem.CreateFile(normalizedPath, item.GetMetadata("Certificate"), item.GetMetadata("StrongName")); + + if (signRequestCollection.ContainsItemForPath(file.Path)) + { + Log.LogError( + $"Duplicate sign request for file '{file.Path}'"); + continue; + } + signRequestCollection.Add(file); } } @@ -165,17 +185,28 @@ internal bool Execute(Func writerFactory) if (string.IsNullOrEmpty(itemPath)) { Log.LogError(null, null, null, item.GetMetadata(ProjectFileMetadataName), 0, 0, 0, 0, - message: $"Could not identify the path for the signable file {item.ItemSpec}"); + message: $"Could not identify the path for signing exclusion {item.ItemSpec}"); continue; } normalizedPath = NormalizePath(itemPath); var file = SignRequestItem.CreateExclusion(normalizedPath); + + if (container.ContainsChildPath(file.Path)) + { + // ignore duplicate exclusions + continue; + } container.AddChild(file); } else { var file = SignRequestItem.CreateExclusion(normalizedPath); + if (signRequestCollection.ContainsItemForPath(file.Path)) + { + // ignore duplicate exclusions + continue; + } signRequestCollection.Add(file); } } @@ -205,14 +236,11 @@ private string GetPathWithinContainer(ITaskItem item) { // allow defining SignedPackageFile using just ItemSpec var projectFile = item.GetMetadata(ProjectFileMetadataName); - if (!string.IsNullOrEmpty(projectFile)) - { - // users will typically write items with relative itemspecs, but we can't get the original item spec. - // Infer the original item spec by getting the path relative to the project directory - return Path.IsPathRooted(item.ItemSpec) && !string.IsNullOrEmpty(projectFile) - ? Path.GetRelativePath(Path.GetDirectoryName(projectFile), item.ItemSpec) - : item.ItemSpec; - } + // users will typically write items with relative itemspecs, but we can't get the original item spec. + // Infer the original item spec by getting the path relative to the project directory + return Path.IsPathRooted(item.ItemSpec) && !string.IsNullOrEmpty(projectFile) + ? Path.GetRelativePath(Path.GetDirectoryName(projectFile), item.ItemSpec) + : item.ItemSpec; } if (itemPath.EndsWith('/') || itemPath.EndsWith('\\')) diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestCollection.cs b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestCollection.cs index e35385d7d..a02d43bc1 100644 --- a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestCollection.cs +++ b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestCollection.cs @@ -32,5 +32,12 @@ public void Add(SignRequestItem item) { _items.Add(item.Path, item); } + + /// + /// Determines if the collection already contains an entry for a given path. + /// + /// + /// + public bool ContainsItemForPath(string path) => _items.ContainsKey(path); } } diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItem.cs b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItem.cs index 3b6c3046e..fc04d8ed8 100644 --- a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItem.cs +++ b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItem.cs @@ -168,5 +168,12 @@ public void AddChild(SignRequestItem item) _children.Add(item); } + + /// + /// Checks if a child already exists at a given path. + /// + /// + /// + public bool ContainsChildPath(string path) => _children.ContainsItemForPath(path); } } diff --git a/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.props b/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.props index 4ff5a44c1..17b7dea67 100644 --- a/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.props +++ b/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.props @@ -8,6 +8,9 @@ for use outside of Microsoft. false + + false + From e0fba782e62bd3b650f409e5337cbbe8b2202248 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 6 Jun 2018 09:12:36 -0700 Subject: [PATCH 031/192] Fix tests on *nix --- .../KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs b/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs index 055ae0b71..3e247d64d 100644 --- a/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs +++ b/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs @@ -5,6 +5,7 @@ using System.Collections; using System.Collections.Generic; using System.IO; +using System.Runtime.InteropServices; using System.Text; using BuildTools.Tasks.Tests; using Microsoft.Build.Framework; @@ -26,6 +27,7 @@ public GenerateSignRequestTests(ITestOutputHelper output) [Fact] public void ItCreatesSignRequest() { + var rootDir = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "C:/" : "/"; var nupkgPath = Path.Combine(AppContext.BaseDirectory, "build", "MyLib.nupkg"); var requests = new ITaskItem[] { @@ -62,10 +64,10 @@ public void ItCreatesSignRequest() { ["Certificate"] = "Cert1", }), - new MockTaskItem(Path.Combine("C:\\MyProject", "lib", "net461", "MyLib.dll")) + new MockTaskItem(Path.Combine(rootDir + "MyProject", "lib", "net461", "MyLib.dll")) { ["Container"] = nupkgPath, - ["MSBuildSourceProjectFile"] = "C:\\MyProject\\MyProject.csproj", + ["MSBuildSourceProjectFile"] = rootDir + "MyProject/MyProject.csproj", ["Certificate"] = "Cert1", }, }; @@ -78,10 +80,10 @@ public void ItCreatesSignRequest() ["PackagePath"] = "lib/NotMyLib.dll", ["Container"] = nupkgPath, }), - new MockTaskItem(Path.Combine("C:\\MyProject", "tool", "net461", "NotMyLib.dll")) + new MockTaskItem(Path.Combine(rootDir + "MyProject", "tool", "net461", "NotMyLib.dll")) { ["Container"] = nupkgPath, - ["MSBuildSourceProjectFile"] = "C:\\MyProject\\MyProject.csproj", + ["MSBuildSourceProjectFile"] = rootDir + "MyProject/MyProject.csproj", }, }; From d59abab75e1f1fd8b7ac7f60ff989c76102ab128 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 6 Jun 2018 09:17:50 -0700 Subject: [PATCH 032/192] Remove appveyor badge [ci skip] --- README.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/README.md b/README.md index 71a2332bd..1a50358a9 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,6 @@ Build Tools =========== -[![AppVeyor build status][appveyor-badge]](https://ci.appveyor.com/project/aspnetci/buildtools/branch/dev) - -[appveyor-badge]: https://img.shields.io/appveyor/ci/aspnetci/buildtools/dev.svg?label=appveyor&style=flat-square - Utilities used in the build system for projects that are used with ASP.NET Core and Entity Framework Core. This project is part of ASP.NET Core. You can find samples, documentation and getting started instructions for ASP.NET Core at the [Home](https://github.com/aspnet/home) repo. From 76985d5cc0bf3f707570bdc7714a16f5ead4d256 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 6 Jun 2018 09:45:41 -0700 Subject: [PATCH 033/192] Automatically set build number from VSTS environment variables --- files/KoreBuild/KoreBuild.Common.props | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/files/KoreBuild/KoreBuild.Common.props b/files/KoreBuild/KoreBuild.Common.props index 5f93d2a46..86c61f831 100644 --- a/files/KoreBuild/KoreBuild.Common.props +++ b/files/KoreBuild/KoreBuild.Common.props @@ -42,12 +42,17 @@ Default layout and configuration. - + - $(BUILD_NUMBER) + $(BUILD_NUMBER) + + $(BUILD_BUILDNUMBER) From 19de84393e58d955b63078025b0ac9bc57dd2df9 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 6 Jun 2018 11:04:49 -0700 Subject: [PATCH 034/192] Fix #685 - fix incorrect reference to dotnet in powershell --- files/KoreBuild/KoreBuild.sh | 6 +++--- files/KoreBuild/scripts/KoreBuild.psm1 | 7 ++++++- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/files/KoreBuild/KoreBuild.sh b/files/KoreBuild/KoreBuild.sh index c3bf8f6a1..7815b92b7 100755 --- a/files/KoreBuild/KoreBuild.sh +++ b/files/KoreBuild/KoreBuild.sh @@ -109,6 +109,9 @@ __install_tools() { "$__korebuild_dir/scripts/get-dotnet.sh" $verbose_flag "$install_dir" \ || return 1 + # Set environment variables + export PATH="$install_dir:$PATH" + # This is a workaround for https://github.com/Microsoft/msbuild/issues/2914. # Currently, the only way to configure the NuGetSdkResolver is with NuGet.config, which is not generally used in aspnet org projects. # This project is restored so that it pre-populates the NuGet cache with SDK packages. @@ -120,9 +123,6 @@ __install_tools() { __exec dotnet msbuild -restore -t:noop -v:m "$restorerfile" fi # end workaround - - # Set environment variables - export PATH="$install_dir:$PATH" } __show_version_info() { diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index 9b21977b5..73fbcda99 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -273,7 +273,12 @@ function Ensure-Dotnet() { function Get-DotnetMajorVersion() { if (Get-Variable "dotnet" -Scope Global -ErrorAction SilentlyContinue) { - $infoOutput = dotnet --version + $infoOutput = & $global:dotnet --version + + if (-not $infoOutput) { + Write-Verbose 'Could not determine the version of dotnet from `dotnet --version`' + return 0 + } $version = $infoOutput.SubString(0, $infoOutput.IndexOf('.')) $versionInt = [convert]::ToInt32($version, 10) From be7505b4ec9a86f112c2d21a20206ca11d3f39c5 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 6 Jun 2018 13:48:28 -0700 Subject: [PATCH 035/192] Fix for unbounded variable in bash --- files/KoreBuild/KoreBuild.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/KoreBuild.sh b/files/KoreBuild/KoreBuild.sh index 7815b92b7..fe3ace918 100755 --- a/files/KoreBuild/KoreBuild.sh +++ b/files/KoreBuild/KoreBuild.sh @@ -34,7 +34,7 @@ set_korebuildsettings() { mkdir -p "$HOME" mkdir -p "$dot_net_home" else - if [[ -z $NUGET_PACKAGES ]]; then + if [[ -z "${NUGET_PACKAGES:-}" ]]; then export NUGET_PACKAGES="$HOME/.nuget/packages" fi fi From b7f685c48e9d4264159f38c434f0904aed2249a6 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 7 Jun 2018 10:33:36 -0700 Subject: [PATCH 036/192] Create project-ci.yml --- .vsts-pipelines/templates/project-ci.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 .vsts-pipelines/templates/project-ci.yml diff --git a/.vsts-pipelines/templates/project-ci.yml b/.vsts-pipelines/templates/project-ci.yml new file mode 100644 index 000000000..1ff8c8e9b --- /dev/null +++ b/.vsts-pipelines/templates/project-ci.yml @@ -0,0 +1,10 @@ +phases: +- template: phases/default-build.yml + parameters: + agentOs: macOS +- template: phases/default-build.yml + parameters: + agentOs: Windows +- template: phases/default-build.yml + parameters: + agentOs: Linux From 73f09c256e2a54270951562ecc0ef4a953926c36 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 7 Jun 2018 11:27:49 -0700 Subject: [PATCH 037/192] Add a task for merging XML files into one document --- .../BuildTools.Tasks/Utilities/FileHelpers.cs | 8 +- .../KoreBuild.Tasks/GenerateSignRequests.cs | 9 +- .../KoreBuild.Tasks/KoreBuild.Tasks.csproj | 3 +- modules/KoreBuild.Tasks/MergeXmlFiles.cs | 79 ++++++++++++++++ modules/KoreBuild.Tasks/module.props | 1 + .../CheckPackageReferenceTests.cs | 93 ++++++++----------- .../MergeXmlFilesTests.cs | 64 +++++++++++++ test/KoreBuild.Tasks.Tests/TaskTestBase.cs | 31 +++++++ 8 files changed, 226 insertions(+), 62 deletions(-) create mode 100644 modules/KoreBuild.Tasks/MergeXmlFiles.cs create mode 100644 test/KoreBuild.Tasks.Tests/MergeXmlFilesTests.cs create mode 100644 test/KoreBuild.Tasks.Tests/TaskTestBase.cs diff --git a/modules/BuildTools.Tasks/Utilities/FileHelpers.cs b/modules/BuildTools.Tasks/Utilities/FileHelpers.cs index fba111114..a61f8c1fc 100644 --- a/modules/BuildTools.Tasks/Utilities/FileHelpers.cs +++ b/modules/BuildTools.Tasks/Utilities/FileHelpers.cs @@ -1,6 +1,7 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// 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.IO; namespace Microsoft.AspNetCore.BuildTools.Utilities @@ -15,5 +16,10 @@ public static string EnsureTrailingSlash(string path) public static bool HasTrailingSlash(string path) => !string.IsNullOrEmpty(path) && (path[path.Length - 1] == Path.DirectorySeparatorChar || path[path.Length - 1] == Path.AltDirectorySeparatorChar); + + public static string NormalizePath(string path) + => string.IsNullOrEmpty(path) + ? path + : path.Replace('\\', '/'); } } diff --git a/modules/KoreBuild.Tasks/GenerateSignRequests.cs b/modules/KoreBuild.Tasks/GenerateSignRequests.cs index e07e56a2d..21f6f27f3 100644 --- a/modules/KoreBuild.Tasks/GenerateSignRequests.cs +++ b/modules/KoreBuild.Tasks/GenerateSignRequests.cs @@ -1,4 +1,4 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// 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; @@ -6,6 +6,7 @@ using System.IO; using Microsoft.AspNetCore.BuildTools.CodeSign; using Microsoft.Build.Framework; +using static Microsoft.AspNetCore.BuildTools.Utilities.FileHelpers; namespace KoreBuild.Tasks { @@ -253,11 +254,5 @@ private string GetPathWithinContainer(ITaskItem item) private static string GetRelativePath(string basePath, string path) => NormalizePath(Path.GetRelativePath(basePath, path)); - - private static string NormalizePath(string path) - => string.IsNullOrEmpty(path) - ? path - : path.Replace('\\', '/'); - } } diff --git a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj index bfb1f7096..53672724d 100644 --- a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj +++ b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj @@ -1,4 +1,4 @@ - + @@ -10,6 +10,7 @@ + diff --git a/modules/KoreBuild.Tasks/MergeXmlFiles.cs b/modules/KoreBuild.Tasks/MergeXmlFiles.cs new file mode 100644 index 000000000..f2a01345c --- /dev/null +++ b/modules/KoreBuild.Tasks/MergeXmlFiles.cs @@ -0,0 +1,79 @@ +// 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.IO; +using System.Text; +using System.Xml; +using System.Xml.Linq; +using Microsoft.AspNetCore.BuildTools.Utilities; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; + +namespace KoreBuild.Tasks +{ + public class MergeXmlFiles : Task + { + [Required] + public string OutputPath { get; set; } + + [Required] + public ITaskItem[] Files { get; set; } + + public override bool Execute() + { + if (Files == null || Files.Length == 0) + { + Log.LogError("No files could be found to merge"); + return false; + } + + OutputPath = FileHelpers.NormalizePath(OutputPath); + Directory.CreateDirectory(Path.GetDirectoryName(OutputPath)); + + if (Files.Length == 1) + { + File.Copy(Files[0].ItemSpec, OutputPath); + return true; + } + + return Execute(() => File.CreateText(OutputPath)); + } + + protected internal bool Execute(Func writerFactory) + { + var newDoc = XDocument.Load(Files[0].ItemSpec, LoadOptions.PreserveWhitespace); + + for (var i = 1; i < Files.Length; i++) + { + var next = XDocument.Load(Files[i].ItemSpec, LoadOptions.PreserveWhitespace); + if (newDoc.Root.Name != next.Root.Name) + { + Log.LogError($"Can only merge documents with the same root element. {Files[0].ItemSpec} has <{newDoc.Root.Name}> but {Files[i].ItemSpec} has <{next.Root.Name}>"); + continue; + } + + newDoc.Root.Add(next.Root.DescendantNodes()); + + foreach (var attr in next.Root.Attributes()) + { + newDoc.Root.SetAttributeValue(attr.Name, attr.Value); + } + } + + var settings = new XmlWriterSettings + { + OmitXmlDeclaration = true, + Encoding = Encoding.UTF8, + }; + + using (var writer = writerFactory()) + using (var xmlWriter = XmlWriter.Create(writer, settings)) + { + newDoc.Save(xmlWriter); + } + + return !Log.HasLoggedErrors; + } + } +} diff --git a/modules/KoreBuild.Tasks/module.props b/modules/KoreBuild.Tasks/module.props index 07d9c58f4..4cdacdb2b 100644 --- a/modules/KoreBuild.Tasks/module.props +++ b/modules/KoreBuild.Tasks/module.props @@ -15,6 +15,7 @@ + diff --git a/test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs b/test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs index c27d15a90..6a9a0ef24 100644 --- a/test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs +++ b/test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs @@ -1,38 +1,25 @@ // 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.IO; using BuildTools.Tasks.Tests; using Microsoft.Build.Utilities; +using System.IO; using Xunit; using Xunit.Abstractions; namespace KoreBuild.Tasks.Tests { [Collection(nameof(MSBuildTestCollection))] - public class CheckPackageReferenceTests : IDisposable + public class CheckPackageReferenceTests : TaskTestBase { - private readonly string _tempDir; - private readonly MockEngine _engine; - - public CheckPackageReferenceTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) - { - _tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - Directory.CreateDirectory(_tempDir); - _engine = new MockEngine(output); - fixture.InitializeEnvironment(output); - } - - public void Dispose() + public CheckPackageReferenceTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) : base(output, fixture) { - Directory.Delete(_tempDir, recursive: true); } [Fact] public void PassesWhenAllRequirementsAreSatisifed() { - var depsProps = Path.Combine(_tempDir, "dependencies.props"); + var depsProps = Path.Combine(TempDir, "dependencies.props"); File.WriteAllText(depsProps, $@" @@ -41,7 +28,7 @@ public void PassesWhenAllRequirementsAreSatisifed() ".Replace('`', '"')); - var csproj = Path.Combine(_tempDir, "Test.csproj"); + var csproj = Path.Combine(TempDir, "Test.csproj"); File.WriteAllText(csproj, $@" @@ -53,10 +40,10 @@ public void PassesWhenAllRequirementsAreSatisifed() ".Replace('`', '"')); - _engine.ContinueOnError = true; + MockEngine.ContinueOnError = true; var task = new CheckPackageReferences { - BuildEngine = _engine, + BuildEngine = MockEngine, DependenciesFile = depsProps, Projects = new[] { new TaskItem(csproj) } }; @@ -67,14 +54,14 @@ public void PassesWhenAllRequirementsAreSatisifed() [Fact] public void IgnoresUpdateAndRemoveItems() { - var depsProps = Path.Combine(_tempDir, "dependencies.props"); + var depsProps = Path.Combine(TempDir, "dependencies.props"); File.WriteAllText(depsProps, $@" ".Replace('`', '"')); - var csproj = Path.Combine(_tempDir, "Test.csproj"); + var csproj = Path.Combine(TempDir, "Test.csproj"); File.WriteAllText(csproj, $@" @@ -84,10 +71,10 @@ public void IgnoresUpdateAndRemoveItems() ".Replace('`', '"')); - _engine.ContinueOnError = true; + MockEngine.ContinueOnError = true; var task = new CheckPackageReferences { - BuildEngine = _engine, + BuildEngine = MockEngine, DependenciesFile = depsProps, Projects = new[] { new TaskItem(csproj) } }; @@ -98,7 +85,7 @@ public void IgnoresUpdateAndRemoveItems() [Fact] public void FailsWhenDependenciesHasNoPropGroup() { - var depsFile = Path.Combine(_tempDir, "deps.props"); + var depsFile = Path.Combine(TempDir, "deps.props"); File.WriteAllText(depsFile, $@" @@ -107,23 +94,23 @@ public void FailsWhenDependenciesHasNoPropGroup() ".Replace('`', '"')); - _engine.ContinueOnError = true; + MockEngine.ContinueOnError = true; var task = new CheckPackageReferences { - BuildEngine = _engine, + BuildEngine = MockEngine, Projects = new[] { new TaskItem(depsFile) }, DependenciesFile = depsFile, }; Assert.True(task.Execute(), "Task is expected to pass"); - Assert.NotEmpty(_engine.Warnings); - Assert.Contains(_engine.Warnings, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefPropertyGroupNotFound); + Assert.NotEmpty(MockEngine.Warnings); + Assert.Contains(MockEngine.Warnings, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefPropertyGroupNotFound); } [Fact] public void FailsWhenVariableIsNotInDependenciesPropsFile() { - var depsProps = Path.Combine(_tempDir, "dependencies.props"); + var depsProps = Path.Combine(TempDir, "dependencies.props"); File.WriteAllText(depsProps, $@" @@ -131,7 +118,7 @@ public void FailsWhenVariableIsNotInDependenciesPropsFile() ".Replace('`', '"')); - var csproj = Path.Combine(_tempDir, "Test.csproj"); + var csproj = Path.Combine(TempDir, "Test.csproj"); File.WriteAllText(csproj, $@" @@ -140,23 +127,23 @@ public void FailsWhenVariableIsNotInDependenciesPropsFile() ".Replace('`', '"')); - _engine.ContinueOnError = true; + MockEngine.ContinueOnError = true; var task = new CheckPackageReferences { - BuildEngine = _engine, + BuildEngine = MockEngine, Projects = new[] { new TaskItem(csproj) }, DependenciesFile = depsProps, }; Assert.False(task.Execute(), "Task is expected to fail"); - Assert.NotEmpty(_engine.Errors); - Assert.Contains(_engine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.VariableNotFoundInDependenciesPropsFile); + Assert.NotEmpty(MockEngine.Errors); + Assert.Contains(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.VariableNotFoundInDependenciesPropsFile); } [Fact] public void FailsWhenPackageVersionFloat() { - var depsProps = Path.Combine(_tempDir, "dependencies.props"); + var depsProps = Path.Combine(TempDir, "dependencies.props"); File.WriteAllText(depsProps, $@" @@ -165,7 +152,7 @@ public void FailsWhenPackageVersionFloat() ".Replace('`', '"')); - var csproj = Path.Combine(_tempDir, "Test.csproj"); + var csproj = Path.Combine(TempDir, "Test.csproj"); File.WriteAllText(csproj, $@" @@ -174,23 +161,23 @@ public void FailsWhenPackageVersionFloat() ".Replace('`', '"')); - _engine.ContinueOnError = true; + MockEngine.ContinueOnError = true; var task = new CheckPackageReferences { - BuildEngine = _engine, + BuildEngine = MockEngine, Projects = new[] { new TaskItem(csproj) }, DependenciesFile = depsProps, }; Assert.False(task.Execute(), "Task is expected to fail"); - Assert.NotEmpty(_engine.Errors); - Assert.Contains(_engine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefHasFloatingVersion); + Assert.NotEmpty(MockEngine.Errors); + Assert.Contains(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefHasFloatingVersion); } [Fact] public void FailsWhenPackageVersionIsInvalid() { - var depsProps = Path.Combine(_tempDir, "dependencies.props"); + var depsProps = Path.Combine(TempDir, "dependencies.props"); File.WriteAllText(depsProps, $@" @@ -199,7 +186,7 @@ public void FailsWhenPackageVersionIsInvalid() ".Replace('`', '"')); - var csproj = Path.Combine(_tempDir, "Test.csproj"); + var csproj = Path.Combine(TempDir, "Test.csproj"); File.WriteAllText(csproj, $@" @@ -208,17 +195,17 @@ public void FailsWhenPackageVersionIsInvalid() ".Replace('`', '"')); - _engine.ContinueOnError = true; + MockEngine.ContinueOnError = true; var task = new CheckPackageReferences { - BuildEngine = _engine, + BuildEngine = MockEngine, Projects = new[] { new TaskItem(csproj) }, DependenciesFile = depsProps, }; Assert.False(task.Execute(), "Task is expected to fail"); - Assert.NotEmpty(_engine.Errors); - Assert.Contains(_engine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.InvalidPackageVersion); + Assert.NotEmpty(MockEngine.Errors); + Assert.Contains(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.InvalidPackageVersion); } [Theory] @@ -228,14 +215,14 @@ public void FailsWhenPackageVersionIsInvalid() [InlineData("$(Prefix)-1.0.0")] public void FailsWhenPackagesReferenceVersionDoesNotCompletelyUseVariables(string version) { - var depsProps = Path.Combine(_tempDir, "dependencies.props"); + var depsProps = Path.Combine(TempDir, "dependencies.props"); File.WriteAllText(depsProps, $@" ".Replace('`', '"')); - var csproj = Path.Combine(_tempDir, "Test.csproj"); + var csproj = Path.Combine(TempDir, "Test.csproj"); File.WriteAllText(csproj, $@" @@ -244,17 +231,17 @@ public void FailsWhenPackagesReferenceVersionDoesNotCompletelyUseVariables(strin ".Replace('`', '"')); - _engine.ContinueOnError = true; + MockEngine.ContinueOnError = true; var task = new CheckPackageReferences { - BuildEngine = _engine, + BuildEngine = MockEngine, Projects = new[] { new TaskItem(csproj) }, DependenciesFile = depsProps, }; Assert.False(task.Execute(), "Task is expected to fail"); - Assert.NotEmpty(_engine.Errors); - var error = Assert.Single(_engine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefHasLiteralVersion); + Assert.NotEmpty(MockEngine.Errors); + var error = Assert.Single(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefHasLiteralVersion); Assert.Equal(4, error.LineNumber); } } diff --git a/test/KoreBuild.Tasks.Tests/MergeXmlFilesTests.cs b/test/KoreBuild.Tasks.Tests/MergeXmlFilesTests.cs new file mode 100644 index 000000000..abf51b645 --- /dev/null +++ b/test/KoreBuild.Tasks.Tests/MergeXmlFilesTests.cs @@ -0,0 +1,64 @@ +// 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 System.Text; +using BuildTools.Tasks.Tests; +using Microsoft.Build.Utilities; +using Xunit; +using Xunit.Abstractions; + +namespace KoreBuild.Tasks.Tests +{ + [Collection(nameof(MSBuildTestCollection))] + public class MergeXmlFilesTests : TaskTestBase + { + public MergeXmlFilesTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) : base(output, fixture) + { + } + + [Fact] + public void ItMergesXmlFiles() + { + var items = new[] + { + new TaskItem(Path.Combine(TempDir, "file1.xml")), + new TaskItem(Path.Combine(TempDir, "file2.xml")), + }; + File.WriteAllText(items[0].ItemSpec, ""); + File.WriteAllText(items[1].ItemSpec, ""); + + var sb = new StringBuilder(); + + var task = new MergeXmlFiles + { + BuildEngine = MockEngine, + Files = items, + }; + Assert.True(task.Execute(() => new StringWriter(sb)), "Task should pass"); + + Assert.Equal("", sb.ToString()); + } + + [Fact] + public void ItFailsIfRootNodeIsDifferent() + { + var items = new[] + { + new TaskItem(Path.Combine(TempDir, "file3.xml")), + new TaskItem(Path.Combine(TempDir, "file4.xml")), + }; + File.WriteAllText(items[0].ItemSpec, ""); + File.WriteAllText(items[1].ItemSpec, ""); + + var sb = new StringBuilder(); + + var task = new MergeXmlFiles + { + BuildEngine = new MockEngine(Output) { ContinueOnError = true }, + Files = items, + }; + Assert.False(task.Execute(() => new StringWriter(sb)), "Task should fail"); + } + } +} diff --git a/test/KoreBuild.Tasks.Tests/TaskTestBase.cs b/test/KoreBuild.Tasks.Tests/TaskTestBase.cs new file mode 100644 index 000000000..4b1f2c646 --- /dev/null +++ b/test/KoreBuild.Tasks.Tests/TaskTestBase.cs @@ -0,0 +1,31 @@ +// 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 BuildTools.Tasks.Tests; +using System; +using System.IO; +using Xunit.Abstractions; + +namespace KoreBuild.Tasks.Tests +{ + public abstract class TaskTestBase : IDisposable + { + protected string TempDir { get; } + protected MockEngine MockEngine { get; } + protected ITestOutputHelper Output { get; } + + protected TaskTestBase(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) + { + TempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + Directory.CreateDirectory(TempDir); + MockEngine = new MockEngine(output); + fixture.InitializeEnvironment(output); + Output = output; + } + + public void Dispose() + { + Directory.Delete(TempDir, recursive: true); + } + } +} From 13b85a32c7aa9d62f6f3cc211c5c7c566d16b3dd Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 7 Jun 2018 12:17:34 -0700 Subject: [PATCH 038/192] Normalize slashes when computing package path in sign requests --- modules/KoreBuild.Tasks/GenerateSignRequests.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/KoreBuild.Tasks/GenerateSignRequests.cs b/modules/KoreBuild.Tasks/GenerateSignRequests.cs index 21f6f27f3..787dd6330 100644 --- a/modules/KoreBuild.Tasks/GenerateSignRequests.cs +++ b/modules/KoreBuild.Tasks/GenerateSignRequests.cs @@ -232,7 +232,7 @@ internal bool Execute(Func writerFactory) private string GetPathWithinContainer(ITaskItem item) { // always prefer an explicit package path - var itemPath = item.GetMetadata("PackagePath"); + var itemPath = NormalizePath(item.GetMetadata("PackagePath")); if (string.IsNullOrEmpty(itemPath)) { // allow defining SignedPackageFile using just ItemSpec @@ -244,7 +244,7 @@ private string GetPathWithinContainer(ITaskItem item) : item.ItemSpec; } - if (itemPath.EndsWith('/') || itemPath.EndsWith('\\')) + if (itemPath.EndsWith('/')) { return Path.Combine(itemPath, Path.GetFileName(item.ItemSpec)); } From a6182ab8bc841c9dc7adfe71c1861dad41798c8e Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 8 Jun 2018 16:09:39 -0700 Subject: [PATCH 039/192] Don't run test projects when DisableDefaultTargets == true --- files/KoreBuild/modules/vstest/module.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/modules/vstest/module.targets b/files/KoreBuild/modules/vstest/module.targets index 79970f082..cdef08084 100644 --- a/files/KoreBuild/modules/vstest/module.targets +++ b/files/KoreBuild/modules/vstest/module.targets @@ -19,7 +19,7 @@ Runs the VSTest on all projects in the ProjectsToTest itemgroup. ################################################################### --> - $(TestDependsOn);TestProjects;ValidateBenchmarks + $(TestDependsOn);TestProjects;ValidateBenchmarks false true From d7fb2f0a63fbc33e8fe2bdb8f4ef63c1aea6d6ce Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 8 Jun 2018 16:31:55 -0700 Subject: [PATCH 040/192] Update dotnet-install.{sh,ps1} scripts to support alpine --- files/KoreBuild/scripts/dotnet-install.ps1 | 7 ++ files/KoreBuild/scripts/dotnet-install.sh | 102 ++++++++++++------- modules/NuGetPackageVerifier/module.props.in | 2 +- 3 files changed, 73 insertions(+), 38 deletions(-) diff --git a/files/KoreBuild/scripts/dotnet-install.ps1 b/files/KoreBuild/scripts/dotnet-install.ps1 index 0ff6bb22d..0d093e226 100644 --- a/files/KoreBuild/scripts/dotnet-install.ps1 +++ b/files/KoreBuild/scripts/dotnet-install.ps1 @@ -535,6 +535,7 @@ else { throw "Invalid value for `$Runtime" } +# Check if the SDK version is already installed. $isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $SpecificVersion if ($isAssetInstalled) { Say "$assetName version $SpecificVersion is already installed." @@ -574,6 +575,12 @@ catch { Say "Extracting zip from $DownloadLink" Extract-Dotnet-Package -ZipPath $ZipPath -OutPath $InstallRoot +# Check if the SDK version is now installed; if not, fail the installation. +$isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $SpecificVersion +if (!$isAssetInstalled) { + throw "$assetName version $SpecificVersion failed to install with an unknown error." +} + Remove-Item $ZipPath Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot -BinFolderRelativePath $BinFolderRelativePath diff --git a/files/KoreBuild/scripts/dotnet-install.sh b/files/KoreBuild/scripts/dotnet-install.sh index 021fdc8da..e5197c869 100755 --- a/files/KoreBuild/scripts/dotnet-install.sh +++ b/files/KoreBuild/scripts/dotnet-install.sh @@ -79,6 +79,10 @@ get_legacy_os_name_from_platform() { echo "fedora.23" return 0 ;; + "fedora.27") + echo "fedora.27" + return 0 + ;; "fedora.24") echo "fedora.24" return 0 @@ -91,6 +95,10 @@ get_legacy_os_name_from_platform() { echo "opensuse.42.1" return 0 ;; + "opensuse.42.3") + echo "opensuse.42.3" + return 0 + ;; "rhel.7"*) echo "rhel" return 0 @@ -107,6 +115,10 @@ get_legacy_os_name_from_platform() { echo "ubuntu.16.10" return 0 ;; + "ubuntu.18.04") + echo "ubuntu.18.04" + return 0 + ;; "alpine.3.4.3") echo "alpine" return 0 @@ -124,10 +136,6 @@ get_linux_platform_name() { else if [ -e /etc/os-release ]; then . /etc/os-release - if [[ $ID == "alpine" ]]; then - # remove the last version digit - VERSION_ID=${VERSION_ID%.*} - fi echo "$ID.$VERSION_ID" return 0 elif [ -e /etc/redhat-release ]; then @@ -139,7 +147,7 @@ get_linux_platform_name() { fi fi - say_verbose "Linux specific platform name and version could not be detected: $ID.$VERSION_ID" + say_verbose "Linux specific platform name and version could not be detected: UName = $uname" return 1 } @@ -154,16 +162,19 @@ get_current_os_name() { local linux_platform_name linux_platform_name="$(get_linux_platform_name)" || { echo "linux" && return 0 ; } - if [[ $linux_platform_name == "rhel.6" || $linux_platform_name == "alpine.3.6" ]]; then + if [[ $linux_platform_name == "rhel.6" ]]; then echo $linux_platform_name return 0 + elif [[ $linux_platform_name == alpine* ]]; then + echo "linux-musl" + return 0 else echo "linux" return 0 fi fi - say_err "OS name could not be detected: $ID.$VERSION_ID" + say_err "OS name could not be detected: UName = $uname" return 1 } @@ -188,7 +199,7 @@ get_legacy_os_name() { fi fi - say_verbose "Distribution specific OS name and version could not be detected: $ID.$VERSION_ID" + say_verbose "Distribution specific OS name and version could not be detected: UName = $uname" return 1 } @@ -218,8 +229,6 @@ check_min_reqs() { check_pre_reqs() { eval $invocation - local failing=false; - if [ "${DOTNET_INSTALL_SKIP_PREREQS:-}" = "1" ]; then return 0 fi @@ -235,14 +244,10 @@ check_pre_reqs() { local librarypath=${LD_LIBRARY_PATH:-} LDCONFIG_COMMAND="$LDCONFIG_COMMAND -NXv ${librarypath//:/ }" - [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep libunwind)" ] && say_err "Unable to locate libunwind. Install libunwind to continue" && failing=true - [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep libssl)" ] && say_err "Unable to locate libssl. Install libssl to continue" && failing=true - [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep libicu)" ] && say_err "Unable to locate libicu. Install libicu to continue" && failing=true - [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep -F libcurl.so)" ] && say_err "Unable to locate libcurl. Install libcurl to continue" && failing=true - fi - - if [ "$failing" = true ]; then - return 1 + [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep libunwind)" ] && say_warning "Unable to locate libunwind. Probable prerequisite missing; please install libunwind." + [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep libssl)" ] && say_warning "Unable to locate libssl. Probable prerequisite missing; please install libssl." + [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep libicu)" ] && say_warning "Unable to locate libicu. Probable prerequisite missing; please install libicu." + [ -z "$($LDCONFIG_COMMAND 2>/dev/null | grep -F libcurl.so)" ] && say_warning "Unable to locate libcurl. Probable prerequisite missing; please install libcurl." fi return 0 @@ -300,7 +305,21 @@ combine_paths() { get_machine_architecture() { eval $invocation - # Currently the only one supported + if command -v uname > /dev/null; then + CPUName=$(uname -m) + case $CPUName in + armv7l) + echo "arm" + return 0 + ;; + aarch64) + echo "arm64" + return 0 + ;; + esac + fi + + # Always default to 'x64' echo "x64" return 0 } @@ -320,9 +339,13 @@ get_normalized_architecture_from_architecture() { echo "x64" return 0 ;; - x86) - say_err "Architecture \`x86\` currently not supported" - return 1 + arm) + echo "arm" + return 0 + ;; + arm64) + echo "arm64" + return 0 ;; esac @@ -570,14 +593,21 @@ copy_files_or_dirs_from_list() { local root_path="$(remove_trailing_slash "$1")" local out_path="$(remove_trailing_slash "$2")" local override="$3" - local override_switch=$(if [ "$override" = false ]; then printf -- "-n"; fi) + local osname="$(get_current_os_name)" + local override_switch=$( + if [ "$override" = false ]; then + if [[ "$osname" == "linux-musl" ]]; then + printf -- "-u"; + else + printf -- "-n"; + fi + fi) cat | uniq | while read -r file_path; do local path="$(remove_beginning_slash "${file_path#$root_path}")" local target="$out_path/$path" if [ "$override" = true ] || (! ([ -d "$target" ] || [ -e "$target" ])); then mkdir -p "$out_path/$(dirname "$path")" - say_verbose "Copying '$out_path/$path' => '$target'" cp -R $override_switch "$root_path/$path" "$target" fi done @@ -598,7 +628,7 @@ extract_dotnet_package() { tar -xzf "$zip_path" -C "$temp_out_path" > /dev/null || failed=true local folders_with_version_regex='^.*/[0-9]+\.[0-9]+[^/]+/' - find "$temp_out_path" -type f | grep -Eo "$folders_with_version_regex" | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" false + find "$temp_out_path" -type f | grep -Eo "$folders_with_version_regex" | sort | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" false find "$temp_out_path" -type f | grep -Ev "$folders_with_version_regex" | copy_files_or_dirs_from_list "$temp_out_path" "$out_path" "$override_non_versioned_files" rm -rf "$temp_out_path" @@ -618,16 +648,6 @@ download() { local remote_path="$1" local out_path="${2:-}" - if [[ "$remote_path" != "http"* ]]; then - say_verbose "Copying from $remote_path" - if [ ! -z "$out_path" ]; then - cp "$remote_path" "$out_path" - else - cat "$remote_path" - fi - return 0 - fi - local failed=false if machine_has "curl"; then downloadcurl "$remote_path" "$out_path" || failed=true @@ -734,6 +754,7 @@ install_dotnet() { return 1 fi + # Check if the SDK version is already installed. if is_dotnet_package_installed "$install_root" "$asset_relative_path" "$specific_version"; then say "$asset_name version $specific_version is already installed." return 0 @@ -771,6 +792,12 @@ install_dotnet() { say "Extracting zip from $download_link" extract_dotnet_package "$zip_path" "$install_root" + # Check if the SDK version is now installed; if not, fail the installation. + if ! is_dotnet_package_installed "$install_root" "$asset_relative_path" "$specific_version"; then + say_err "$asset_name version $specific_version failed to install with an unknown error." + return 1 + fi + return 0 } @@ -867,7 +894,7 @@ do echo "$script_name is a simple command line interface for obtaining dotnet cli." echo "" echo "Options:" - echo " -c,--channel Download from the CHANNEL specified, Defaults to \`$channel\`." + echo " -c,--channel Download from the channel specified, Defaults to \`$channel\`." echo " -Channel" echo " Possible values:" echo " - Current - most current release" @@ -886,8 +913,9 @@ do echo " examples: 2.0.0-preview2-006120; 1.1.0" echo " -i,--install-dir Install under specified location (see Install Location below)" echo " -InstallDir" - echo " --architecture Architecture of .NET Tools. Currently only x64 is supported." + echo " --architecture Architecture of dotnet binaries to be installed, Defaults to \`$architecture\`." echo " --arch,-Architecture,-Arch" + echo " Possible values: x64, arm, and arm64" echo " --runtime Installs a shared runtime only, without the SDK." echo " -Runtime" echo " Possible values:" diff --git a/modules/NuGetPackageVerifier/module.props.in b/modules/NuGetPackageVerifier/module.props.in index c7d5abac3..9546259b9 100644 --- a/modules/NuGetPackageVerifier/module.props.in +++ b/modules/NuGetPackageVerifier/module.props.in @@ -1,5 +1,5 @@ - + From a82be527e14e9308ebeda5c12d68dc3e0998f8df Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 8 Jun 2018 17:04:09 -0700 Subject: [PATCH 041/192] Synchronize updates to dotnet-install scripts from dotnet/cli --- files/KoreBuild/scripts/dotnet-install.ps1 | 4 ++-- files/KoreBuild/scripts/dotnet-install.sh | 7 ++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/files/KoreBuild/scripts/dotnet-install.ps1 b/files/KoreBuild/scripts/dotnet-install.ps1 index 0d093e226..14ebe11af 100644 --- a/files/KoreBuild/scripts/dotnet-install.ps1 +++ b/files/KoreBuild/scripts/dotnet-install.ps1 @@ -74,7 +74,7 @@ Default: false Skips installing non-versioned files if they already exist, such as dotnet.exe. .PARAMETER NoCdn - Disable downloading from the Azure CDN, and used the uncached feed directly. + Disable downloading from the Azure CDN, and use the uncached feed directly. #> [cmdletbinding()] param( @@ -468,7 +468,7 @@ function Extract-Dotnet-Package([string]$ZipPath, [string]$OutPath) { } function DownloadFile([Uri]$Uri, [string]$OutPath) { - if ($Uri -like "file://*") { + if ($Uri -notlike "http*") { Say-Verbose "Copying file from $Uri to $OutPath" Copy-Item $Uri.AbsolutePath $OutPath return diff --git a/files/KoreBuild/scripts/dotnet-install.sh b/files/KoreBuild/scripts/dotnet-install.sh index e5197c869..6dda76038 100755 --- a/files/KoreBuild/scripts/dotnet-install.sh +++ b/files/KoreBuild/scripts/dotnet-install.sh @@ -648,6 +648,11 @@ download() { local remote_path="$1" local out_path="${2:-}" + if [[ "$remote_path" != "http"* ]]; then + cp "$remote_path" "$out_path" + return $? + fi + local failed=false if machine_has "curl"; then downloadcurl "$remote_path" "$out_path" || failed=true @@ -928,7 +933,7 @@ do echo " --verbose,-Verbose Display diagnostics information." echo " --azure-feed,-AzureFeed Azure feed location. Defaults to $azure_feed, This parameter typically is not changed by the user." echo " --uncached-feed,-UncachedFeed Uncached feed location. This parameter typically is not changed by the user." - echo " --no-cdn,-NoCdn Disable downloading from the Azure CDN, and used the uncached feed directly." + echo " --no-cdn,-NoCdn Disable downloading from the Azure CDN, and use the uncached feed directly." echo " --feed-credential,-FeedCredential Azure feed shared access token. This parameter typically is not specified." echo " --runtime-id Installs the .NET Tools for the given platform (use linux-x64 for portable linux)." echo " -RuntimeId" From 4e6fd4b21a51260ce9bf21244f66717a724dcb1c Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 8 Jun 2018 21:09:17 -0700 Subject: [PATCH 042/192] Don't override $HOME This causes issues with default keychain in macOS. When this is overridden, the X509Store cannot open with an error: Interop+AppleCrypto+AppleCommonCryptoCryptographicException: A default keychain could not be found. Apparently, the keychain functionality in macOS requires $HOME be set to the actual home directory for the current user. --- files/KoreBuild/KoreBuild.sh | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/files/KoreBuild/KoreBuild.sh b/files/KoreBuild/KoreBuild.sh index fe3ace918..c2a978884 100755 --- a/files/KoreBuild/KoreBuild.sh +++ b/files/KoreBuild/KoreBuild.sh @@ -17,12 +17,15 @@ set_korebuildsettings() { [ -z "${dot_net_home:-}" ] && dot_net_home="$HOME/.dotnet" [ -z "${tools_source:-}" ] && tools_source="$default_tools_source" + # This is required for NuGet and MSBuild + if [[ -z "${HOME:-}" ]]; then + export HOME="$repo_path/.build/home" + fi if [ "$ci" = true ]; then export CI=true export DOTNET_CLI_TELEMETRY_OPTOUT=true export DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true - export HOME="$repo_path/.build/home" export TEMP="$repo_path/.build/tmp" export TMP="$TEMP" export NUGET_SHOW_STACK=true From 596d40f67cbe774675e73c39d463b628bf453531 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 11 Jun 2018 10:25:26 -0700 Subject: [PATCH 043/192] Revert changes to HostingStartup.csproj --- .../content/HostingStartup/HostingStartup.csproj | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/HostingStartup.csproj b/src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/HostingStartup.csproj index c3d5947eb..50fa2c0ae 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/HostingStartup.csproj +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/HostingStartup.csproj @@ -1,5 +1,4 @@ - - + netcoreapp2.2 @@ -11,5 +10,4 @@ - From e8de7bd1751edc2ca4d39ad53bff22c293e3f218 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Mon, 11 Jun 2018 15:25:09 -0700 Subject: [PATCH 044/192] Set dotnet home env --- .vsts-pipelines/templates/phases/default-build.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.vsts-pipelines/templates/phases/default-build.yml b/.vsts-pipelines/templates/phases/default-build.yml index ca0de4ee5..f06f9352d 100644 --- a/.vsts-pipelines/templates/phases/default-build.yml +++ b/.vsts-pipelines/templates/phases/default-build.yml @@ -28,6 +28,7 @@ phases: name: Hosted VS2017 variables: BuildScriptArgs: ${{ parameters.buildArgs }} + DOTNET_HOME: $(Agent.WorkFolder)\.dotnet steps: - checkout: self clean: true From cd9efd5b43df7cfab45517688eac2ca72313b009 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 11 Jun 2018 16:37:49 -0700 Subject: [PATCH 045/192] Fix DOTNET_HOME for x-plat builds --- .vsts-pipelines/templates/phases/default-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vsts-pipelines/templates/phases/default-build.yml b/.vsts-pipelines/templates/phases/default-build.yml index f06f9352d..ea70e7764 100644 --- a/.vsts-pipelines/templates/phases/default-build.yml +++ b/.vsts-pipelines/templates/phases/default-build.yml @@ -28,7 +28,7 @@ phases: name: Hosted VS2017 variables: BuildScriptArgs: ${{ parameters.buildArgs }} - DOTNET_HOME: $(Agent.WorkFolder)\.dotnet + DOTNET_HOME: $(Agent.WorkFolder)/.dotnet steps: - checkout: self clean: true From b19e903e946579cd9482089bce7d917e8bacd765 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Wed, 13 Jun 2018 13:51:37 -0700 Subject: [PATCH 046/192] Adds command to install toolsets (#690) --- build/tasks/RepoTasks.csproj | 1 + docs/KoreBuild.md | 1 + modules/KoreBuild.Tasks/DownloadFile.cs | 63 +------ modules/KoreBuild.Tasks/GetToolsets.cs | 4 +- modules/KoreBuild.Tasks/InstallToolsets.cs | 175 ++++++++++++++++++ .../Utilities/DownloadFileHelper.cs | 76 ++++++++ .../Utilities/VsInstallerHelper.cs | 71 +++++++ modules/KoreBuild.Tasks/Utilities/VsWhere.cs | 16 ++ modules/KoreBuild.Tasks/module.props | 1 + modules/KoreBuild.Tasks/module.targets | 15 +- .../InstallToolsetsTests.cs | 54 ++++++ .../Commands/InstallToolsetsCommand.cs | 74 ++++++++ .../KoreBuild.Console/Commands/RootCommand.cs | 9 + tools/KoreBuild.Console/Program.cs | 2 +- 14 files changed, 498 insertions(+), 64 deletions(-) create mode 100644 modules/KoreBuild.Tasks/InstallToolsets.cs create mode 100644 modules/KoreBuild.Tasks/Utilities/DownloadFileHelper.cs create mode 100644 modules/KoreBuild.Tasks/Utilities/VsInstallerHelper.cs create mode 100644 test/KoreBuild.Tasks.Tests/InstallToolsetsTests.cs create mode 100644 tools/KoreBuild.Console/Commands/InstallToolsetsCommand.cs diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index ac2564647..30b9fcdc2 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -20,6 +20,7 @@ + diff --git a/docs/KoreBuild.md b/docs/KoreBuild.md index 666380cb8..b0ceeabbc 100644 --- a/docs/KoreBuild.md +++ b/docs/KoreBuild.md @@ -13,6 +13,7 @@ Previously repositories were runable in only one way, by doing `.\build.cmd`. Bu Command | Purpose | Example ----------------------|------------------------------------------------------------------|---------- install-tools | Installs dotnet, CLI and Shared runtimes. | .\run.ps1 install-tools +install vs | Installs/Updates VS components | .\run.ps1 install vs --quiet --product Enterprise docker-build | Runs the build inside docker. | .\run.ps1 docker-build {jessie\|winservercore} /t:SomeTarget /p:Parameters default-build | Runs install-tools followed by msbuild (like build.cmd used to). | .\run.ps1 default-build /t:SomeTarget /p:Parameters msbuild | Runs the build normally. | .\run.ps1 msbuild /t:SomeTarget /p:Parameters diff --git a/modules/KoreBuild.Tasks/DownloadFile.cs b/modules/KoreBuild.Tasks/DownloadFile.cs index cf0be8e50..041039cf8 100644 --- a/modules/KoreBuild.Tasks/DownloadFile.cs +++ b/modules/KoreBuild.Tasks/DownloadFile.cs @@ -1,11 +1,9 @@ // 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.IO; -using System.Net.Http; using System.Threading; using System.Threading.Tasks; +using KoreBuild.Tasks.Utilities; using Microsoft.Build.Framework; namespace KoreBuild.Tasks @@ -43,64 +41,9 @@ public class DownloadFile : Microsoft.Build.Utilities.Task, ICancelableTask public override bool Execute() => ExecuteAsync().Result; - public async Task ExecuteAsync() + public Task ExecuteAsync() { - if (File.Exists(DestinationPath) && !Overwrite) - { - return true; - } - - const string FileUriProtocol = "file://"; - - if (Uri.StartsWith(FileUriProtocol, StringComparison.OrdinalIgnoreCase)) - { - var filePath = Uri.Substring(FileUriProtocol.Length); - Log.LogMessage($"Copying '{filePath}' to '{DestinationPath}'"); - File.Copy(filePath, DestinationPath); - } - else - { - Log.LogMessage($"Downloading '{Uri}' to '{DestinationPath}'"); - - using (var httpClient = new HttpClient - { - // Timeout if no response starts in 2 minutes - Timeout = TimeSpan.FromMinutes(2), - }) - { - try - { - var response = await httpClient.GetAsync(Uri, _cts.Token); - response.EnsureSuccessStatusCode(); - _cts.Token.ThrowIfCancellationRequested(); - - Directory.CreateDirectory(Path.GetDirectoryName(DestinationPath)); - - using (var outStream = File.Create(DestinationPath)) - { - var responseStream = response.Content.ReadAsStreamAsync(); - var finished = await Task.WhenAny(responseStream, Task.Delay(TimeSpan.FromSeconds(TimeoutSeconds))); - - if (!ReferenceEquals(responseStream, finished)) - { - throw new TimeoutException($"Download failed to complete in {TimeoutSeconds} seconds."); - } - - responseStream.Result.CopyTo(outStream); - } - } - catch (Exception ex) - { - Log.LogError($"Downloading '{Uri}' failed."); - Log.LogErrorFromException(ex, showStackTrace: true); - - File.Delete(DestinationPath); - return false; - } - } - } - - return !Log.HasLoggedErrors; + return DownloadFileHelper.DownloadFileAsync(Uri, DestinationPath, Overwrite, _cts.Token, TimeoutSeconds, Log); } } } diff --git a/modules/KoreBuild.Tasks/GetToolsets.cs b/modules/KoreBuild.Tasks/GetToolsets.cs index 9a5b11d96..aab039817 100644 --- a/modules/KoreBuild.Tasks/GetToolsets.cs +++ b/modules/KoreBuild.Tasks/GetToolsets.cs @@ -97,8 +97,8 @@ private void GetVisualStudio(KoreBuildSettings.VisualStudioToolset vsToolset) { if (vsToolset.Required != KoreBuildSettings.RequiredPlatforms.None) { - Log.LogError($"Could not find an installation of Visual Studio that satisifies the specified requirements in {ConfigFile}. " + - "See https://docs.microsoft.com/en-us/visualstudio/install/workload-component-id-vs-community for more details on any missing components."); + Log.LogError($"Could not find an installation of Visual Studio that satisifies the specified requirements in {ConfigFile}" + + "Execute run.ps1 install vs to update or install the current vs installation."); } return; } diff --git a/modules/KoreBuild.Tasks/InstallToolsets.cs b/modules/KoreBuild.Tasks/InstallToolsets.cs new file mode 100644 index 000000000..079751513 --- /dev/null +++ b/modules/KoreBuild.Tasks/InstallToolsets.cs @@ -0,0 +1,175 @@ +// 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.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; +using System.Threading.Tasks; +using KoreBuild.Tasks.Utilities; +using Microsoft.Build.Framework; +using Microsoft.Extensions.CommandLineUtils; + +namespace KoreBuild.Tasks +{ + /// + /// Installs toolset information as listed in korebuild.json + /// + public class InstallToolsets : Microsoft.Build.Utilities.Task + { + /// + /// The path to the korebuild.json file. + /// + [Required] + public string ConfigFile { get; set; } + + /// + /// Whether to install toolsets with or without user interation. + /// It will default prompting users to confirm and see installation steps. + /// + public bool QuietVSInstallation { get; set; } + + /// + /// Whether to upgrade existing toolsets. + /// It will default to only adding tools that were not previously installed. + /// + public bool UpgradeVSInstallation { get; set; } + + /// + /// Specifies what version of VS to install. + /// Defaults to Enterprise. + /// + public string VSProductVersionType { get; set; } = "Enterprise"; + + public override bool Execute() + { + return ExecuteAsync().GetAwaiter().GetResult(); + } + + public async Task ExecuteAsync() + { + if (!File.Exists(ConfigFile)) + { + Log.LogError($"Could not load the korebuild config file from '{ConfigFile}'"); + return false; + } + + var settings = KoreBuildSettings.Load(ConfigFile); + + if (settings?.Toolsets == null) + { + Log.LogMessage(MessageImportance.Normal, "No recognized toolsets specified."); + return true; + } + + foreach (var toolset in settings.Toolsets) + { + switch (toolset) + { + case KoreBuildSettings.VisualStudioToolset vs: + await InstallVsComponents(vs); + break; + // TODO support NodeJSToolset + default: + Log.LogWarning("Toolset checks not implemented for " + toolset.GetType().Name); + break; + } + } + + return !Log.HasLoggedErrors; + } + + private async Task InstallVsComponents(KoreBuildSettings.VisualStudioToolset vsToolset) + { + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + if ((vsToolset.Required & ~KoreBuildSettings.RequiredPlatforms.Windows) != 0) + { + Log.LogError("Visual Studio is not available on non-Windows. Change korebuild.json to 'required: [\"windows\"]'."); + } + else + { + Log.LogMessage(MessageImportance.Low, "Skipping Visual Studio verification on non-Windows platforms."); + } + return; + } + + // Update the vs installation based on the product version specified. + var vs = VsWhere.FindLatestInstallation(includePrerelease: true, vsProductVersion: VSProductVersionType, log: Log); + + if (vs != null) + { + Log.LogMessage($"Found vs installation located at {vs.InstallationPath}"); + } + else + { + Log.LogMessage($"No vs installation found."); + } + + var vsExePath = await VsInstallerHelper.DownloadVsExe(Log, VSProductVersionType); + var vsJsonFilePath = VsInstallerHelper.CreateVsFileFromRequiredToolset(vsToolset, Log, VSProductVersionType); + + var args = GetVisualStudioArgs(vs, vsJsonFilePath); + + StartVsExe(vsExePath, args); + + // Cleanup temp files created. + try + { + File.Delete(vsExePath); + File.Delete(vsJsonFilePath); + } + catch (IOException ioe) + { + Log.LogWarning($"Could not delete vs installation files in temp directory: {ioe.Message}."); + } + + return; + } + + private string GetVisualStudioArgs(VsInstallation vs, string vsJsonFilePath) + { + var args = new List(); + + if (vs != null) + { + if (UpgradeVSInstallation) + { + args.Add("upgrade"); + } + else + { + args.Add("modify"); + } + args.Add("--installPath"); + args.Add($"{vs.InstallationPath}"); + } + + args.Add("--in"); + args.Add($"{vsJsonFilePath}"); + args.Add("--wait"); + args.Add("--norestart"); + + if (QuietVSInstallation) + { + args.Add("--quiet"); + } + return ArgumentEscaper.EscapeAndConcatenate(args); + } + + private void StartVsExe(string vsExePath, string args) + { + var psi = new ProcessStartInfo + { + FileName = vsExePath, + Arguments = args + }; + + Log.LogMessage($"Calling: {psi.FileName} {psi.Arguments}"); + + var process = Process.Start(psi); + + process.WaitForExit(); + } + } +} diff --git a/modules/KoreBuild.Tasks/Utilities/DownloadFileHelper.cs b/modules/KoreBuild.Tasks/Utilities/DownloadFileHelper.cs new file mode 100644 index 000000000..3d1bebae5 --- /dev/null +++ b/modules/KoreBuild.Tasks/Utilities/DownloadFileHelper.cs @@ -0,0 +1,76 @@ +// 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.IO; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Build.Utilities; +using Task = System.Threading.Tasks.Task; + +namespace KoreBuild.Tasks.Utilities +{ + public class DownloadFileHelper + { + public static async Task DownloadFileAsync(string uri, string destinationPath, bool overwrite, CancellationToken cancellationToken, int timeoutSeconds, TaskLoggingHelper log) + { + if (File.Exists(destinationPath) && !overwrite) + { + return true; + } + + const string FileuriProtocol = "file://"; + + if (uri.StartsWith(FileuriProtocol, StringComparison.OrdinalIgnoreCase)) + { + var filePath = uri.Substring(FileuriProtocol.Length); + log.LogMessage($"Copying '{filePath}' to '{destinationPath}'"); + File.Copy(filePath, destinationPath); + } + else + { + log.LogMessage($"Downloading '{uri}' to '{destinationPath}'"); + + using (var httpClient = new HttpClient + { + // Timeout if no response starts in 2 minutes + Timeout = TimeSpan.FromMinutes(2), + }) + { + try + { + var response = await httpClient.GetAsync(uri, cancellationToken); + response.EnsureSuccessStatusCode(); + cancellationToken.ThrowIfCancellationRequested(); + + Directory.CreateDirectory(Path.GetDirectoryName(destinationPath)); + + using (var outStream = File.Create(destinationPath)) + { + var responseStream = response.Content.ReadAsStreamAsync(); + var finished = await Task.WhenAny(responseStream, Task.Delay(TimeSpan.FromSeconds(timeoutSeconds))); + + if (!ReferenceEquals(responseStream, finished)) + { + throw new TimeoutException($"Download failed to complete in {timeoutSeconds} seconds."); + } + + responseStream.Result.CopyTo(outStream); + } + } + catch (Exception ex) + { + log.LogError($"Downloading '{uri}' failed."); + log.LogErrorFromException(ex, showStackTrace: true); + + File.Delete(destinationPath); + return false; + } + } + } + + return !log.HasLoggedErrors; + } + } +} diff --git a/modules/KoreBuild.Tasks/Utilities/VsInstallerHelper.cs b/modules/KoreBuild.Tasks/Utilities/VsInstallerHelper.cs new file mode 100644 index 000000000..bdb1b6ef4 --- /dev/null +++ b/modules/KoreBuild.Tasks/Utilities/VsInstallerHelper.cs @@ -0,0 +1,71 @@ +// 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.Collections.Generic; +using System.IO; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Build.Utilities; +using Newtonsoft.Json; + +namespace KoreBuild.Tasks.Utilities +{ + internal class VsInstallerHelper + { + public static async Task DownloadVsExe(TaskLoggingHelper log, string vsProductType) + { + var exeName = $"vs_{vsProductType}.exe"; + var tempPath = Path.Combine(Path.GetTempPath(), exeName); + + await DownloadFileHelper.DownloadFileAsync(uri: $"https://aka.ms/vs/15/release/{exeName}", + destinationPath: tempPath, + overwrite: true, + cancellationToken: new CancellationToken(), + timeoutSeconds: 60 * 15, + log); + + log.LogMessage($"Downloaded visual studio exe to {tempPath}."); + + return tempPath; + } + + private class VsJsonFile + { + [JsonProperty(PropertyName = "channelUri")] + public string ChannelUri { get; set; } + [JsonProperty(PropertyName = "channelId")] + public string ChannelId { get; set; } + [JsonProperty(PropertyName = "productId")] + public string ProductId { get; set; } + [JsonProperty(PropertyName = "includeRecommended")] + public bool IncludeRecommended { get; set; } + [JsonProperty(PropertyName = "addProductLang")] + public List AddProductLang { get; set; } + [JsonProperty(PropertyName = "add")] + public List Add { get; set; } + } + + public static string CreateVsFileFromRequiredToolset(KoreBuildSettings.VisualStudioToolset vsToolset, TaskLoggingHelper log, string vsProductType) + { + var vsFile = new VsJsonFile + { + ChannelUri = "https://aka.ms/vs/15/release/channel", + ChannelId = "VisualStudio.15.Release", + ProductId = $"Microsoft.VisualStudio.Product.{vsProductType}", + IncludeRecommended = false, + AddProductLang = new List + { + "en-US" + }, + Add = new List(vsToolset.RequiredWorkloads) + }; + + var tempFile = Path.Combine(Path.GetTempPath(), $"vs_{vsProductType}.json"); + + var json = JsonConvert.SerializeObject(vsFile); + File.WriteAllText(tempFile, json); + + return tempFile; + } + } +} diff --git a/modules/KoreBuild.Tasks/Utilities/VsWhere.cs b/modules/KoreBuild.Tasks/Utilities/VsWhere.cs index cbd84f86b..f3fdb2df5 100644 --- a/modules/KoreBuild.Tasks/Utilities/VsWhere.cs +++ b/modules/KoreBuild.Tasks/Utilities/VsWhere.cs @@ -29,6 +29,22 @@ public static VsInstallation FindLatestInstallation(bool includePrerelease, Task return GetInstallations(args, log).FirstOrDefault(); } + public static VsInstallation FindLatestInstallation(bool includePrerelease, string vsProductVersion, TaskLoggingHelper log) + { + var args = new List + { + "-latest", + }; + if (includePrerelease) + { + args.Add("-prerelease"); + } + args.Add("-products"); + args.Add($"Microsoft.VisualStudio.Product.{vsProductVersion}"); + + return GetInstallations(args, log).FirstOrDefault(); + } + public static VsInstallation FindLatestCompatibleInstallation(KoreBuildSettings.VisualStudioToolset toolset, TaskLoggingHelper log) { var args = new List { "-latest" }; diff --git a/modules/KoreBuild.Tasks/module.props b/modules/KoreBuild.Tasks/module.props index 4cdacdb2b..aee577344 100644 --- a/modules/KoreBuild.Tasks/module.props +++ b/modules/KoreBuild.Tasks/module.props @@ -15,6 +15,7 @@ + diff --git a/modules/KoreBuild.Tasks/module.targets b/modules/KoreBuild.Tasks/module.targets index 50be9de00..e33c391e0 100644 --- a/modules/KoreBuild.Tasks/module.targets +++ b/modules/KoreBuild.Tasks/module.targets @@ -50,7 +50,6 @@ Downloads and extracts .NET Core shared runtimes and SDKs. InstallScript="$(_DotNetInstall)"/> - + + + + + + + $(NoWarn);NU5105 + + false From 892a6953cef40b2e51ce384e95e1c3ab312b92d3 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 30 Jul 2018 14:08:51 -0700 Subject: [PATCH 070/192] Opt-out of NU5105 for build-tools packages too --- Directory.Build.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index 08010baa1..8034eaf41 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -9,7 +9,7 @@ false false - $(NoWarn);NU1603 + $(NoWarn);NU1603;NU5105 false true true From 45c32b4f020e14a9295be31866051a18d293309d Mon Sep 17 00:00:00 2001 From: Andrew Stanton-Nurse Date: Fri, 10 Aug 2018 08:02:28 -0700 Subject: [PATCH 071/192] fix #725 by making internal sdk detection more resilient (#726) --- .../modules/solutionbuild/Project.Inspection.targets | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets index 4c6ee1a29..096c06772 100644 --- a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets +++ b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets @@ -10,12 +10,16 @@ $(PackageVersion.Substring(0, $(PackageVersion.IndexOf('+')))) $(PackageOutputPath)$(PackageId).$(NormalizedPackageVersion).nupkg $(PackageOutputPath)$(PackageId).$(NormalizedPackageVersion).symbols.nupkg + + + <_ReferencesInternalAspNetCoreSdk Condition="'$(_ReferencesInternalAspNetCoreSdk)' == ''">@(PackageReference->AnyHaveMetadataValue('Identity', 'Internal.AspNetCore.Sdk')) + + <_ReferencesInternalAspNetCoreSdk Condition="'$(_ReferencesInternalAspNetCoreSdk)' == ''">false - <_ReferencesInternalAspNetCoreSdk Condition="'$(_ReferencesInternalAspNetCoreSdk)' == ''">@(PackageReference->AnyHaveMetadataValue('Identity', 'Internal.AspNetCore.Sdk')) true true From af4b785bfec5b5e5b7a2d74971bed0d372d1b37d Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 13 Aug 2018 11:09:38 -0700 Subject: [PATCH 072/192] Update branch PR bot to only push --force when creating a new PR (#735) This will no longer overwrite changes maintainers may push to the bot's PR to resolve conflicts. --- scripts/GitHubMergeBranches.ps1 | 50 +++++++++++++++++++++++++++------ 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/scripts/GitHubMergeBranches.ps1 b/scripts/GitHubMergeBranches.ps1 index b987f327c..3bde4e3b6 100755 --- a/scripts/GitHubMergeBranches.ps1 +++ b/scripts/GitHubMergeBranches.ps1 @@ -173,12 +173,12 @@ try { Write-Host -ForegroundColor Yellow 'Skipping PR generation because it appears this PR would only contain automated commits by aspnetci' exit 0 } - + $authors = $authors | % { "* @$_" } - $prComment = "This PR merges commits made on $HeadBranch by the following committers:`n`n$($authors -join "`n")" + $committersList = "This PR merges commits made on $HeadBranch by the following committers:`n`n$($authors -join "`n")" - Write-Host $prComment + Write-Host $committersList $mergeBranchName = "merge/$HeadBranch-to-$BaseBranch" Invoke-Block { & git checkout -B $mergeBranchName } @@ -228,10 +228,6 @@ try { } } - if ($PSCmdlet.ShouldProcess("Update remote branch $mergeBranchName on $remoteName")) { - Invoke-Block { & git push --force $remoteName "${mergeBranchName}:${mergeBranchName}" } - } - $query = 'query ($repoOwner: String!, $repoName: String!, $baseRefName: String!) { repository(owner: $repoOwner, name: $repoName) { pullRequests(baseRefName: $baseRefName, states: OPEN, first: 100) { @@ -272,8 +268,29 @@ try { | select -First 1 if ($matchingPr) { + $prUpdatedSuccess = $false + + try { + if ($PSCmdlet.ShouldProcess("Update remote branch $mergeBranchName on $remoteName")) { + Invoke-Block { & git push $remoteName "${mergeBranchName}:${mergeBranchName}" } + } + $prUpdatedSuccess = $true + } + catch { + Write-Warning "Failed to update existing PR" + } + + $prMessage = if ($prUpdatedSuccess) { + "This pull request has been updated.`n`n$committersList" + } else { + @" +:x: Uh oh, this pull request could not be updated automatically. New commits were pushed to $HeadBranch, but I could not automatically push those to $mergeBranchName to update this PR. +You may need to fix this problem by merging branches with this PR. Contact ASP.NET Core Engineering if you are not sure what to do about this. +"@ + } + $data = @{ - body = "This pull request has been updated.`n`n$prComment" + body = $prMessage } $prNumber = $matchingPr.number @@ -288,6 +305,13 @@ try { } } else { + # Use --force because the merge branch may have been used for a previous PR. + # This should only happen if there is no existing PR for the merge + + if ($PSCmdlet.ShouldProcess("Force updating remote branch $mergeBranchName on $remoteName")) { + Invoke-Block { & git push --force $remoteName "${mergeBranchName}:${mergeBranchName}" } + } + $previewHeaders = @{ # Required while this api is in preview: https://developer.github.com/v3/pulls/#create-a-pull-request Accept = 'application/vnd.github.symmetra-preview+json' @@ -299,7 +323,7 @@ I detected changes in the $HeadBranch branch which have not been merged yet to $ I'm a robot and am configured to help you automatically keep $BaseBranch up to date, so I've opened this PR. -$prComment +$committersList ## Instructions for merging @@ -317,7 +341,15 @@ git merge ${mergeBranchName} git push `````` +## Instructions for resolving conflicts + :warning: If there are merge conflicts, you will need to resolve them manually before merging. +You can do this [using GitHub](https://help.github.com/articles/resolving-a-merge-conflict-on-github/) +or using the [command line](https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/). + +Maintainers of this repo have permission to the branch '$mergeBranchName' on https://github.com/$prOwnerName/$RepoName. +You can push changes to this branch to resolve conflicts or other issues in this pull request. The bot will attempt +to update this branch as more changes are discovered on $HeadBranch. Please contact ASP.NET Core Engineering if you have questions or issues. Also, if this PR was generated incorrectly, help us fix it. See https://github.com/aspnet/BuildTools/blob/master/scripts/GitHubMergeBranches.ps1. From 9390d293dd1fe822bbbf0d15f0e8d2f75bb61dfe Mon Sep 17 00:00:00 2001 From: Andrew Stanton-Nurse Date: Wed, 15 Aug 2018 18:35:45 -0700 Subject: [PATCH 073/192] fix #737: allow nuspec properties to be overridden (#738) --- .../build/Common.props | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/Internal.AspNetCore.Sdk/build/Common.props b/src/Internal.AspNetCore.Sdk/build/Common.props index 2639594ab..4b71d4cb5 100644 --- a/src/Internal.AspNetCore.Sdk/build/Common.props +++ b/src/Internal.AspNetCore.Sdk/build/Common.props @@ -10,16 +10,16 @@ Usage: this should be imported once via NuGet at the top of the file. - Microsoft - Microsoft Corporation. - © Microsoft Corporation. All rights reserved. - true - en-US - https://raw.githubusercontent.com/aspnet/Home/2.0.0/LICENSE.txt - https://go.microsoft.com/fwlink/?LinkID=288859 - https://asp.net - true - true + Microsoft + Microsoft Corporation. + © Microsoft Corporation. All rights reserved. + true + en-US + https://raw.githubusercontent.com/aspnet/Home/2.0.0/LICENSE.txt + https://go.microsoft.com/fwlink/?LinkID=288859 + https://asp.net + true + true true 7.2 From 226c8adaefd0d19db0d9d11d911ba7d95644b224 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 16 Aug 2018 18:07:50 -0700 Subject: [PATCH 074/192] Revert "Update the SDK to 2.1.400" This reverts commit 72492a41765010d653863d2d5caa00b9e1318712. --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index bd206f49f..915f0831c 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -2.1.400 +2.1.302 From b6fa17ad3e0f689915f140db692e8e2fea558fc7 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 17 Aug 2018 10:35:59 -0700 Subject: [PATCH 075/192] Update the SDK to 2.1.400 This reverts commit 226c8adaefd0d19db0d9d11d911ba7d95644b224. --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 915f0831c..bd206f49f 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -2.1.302 +2.1.400 From 5ee70fd42f8c40d857f1d964329166c7e04a0391 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 20 Aug 2018 08:21:48 -0700 Subject: [PATCH 076/192] Move GitHubMergeBranches.ps1 to dotnet/arcade See https://github.com/dotnet/arcade/pull/483 --- .../builds/pr-generator-branch-merge.yml | 31 -- scripts/GitHubMergeBranches.ps1 | 377 ------------------ 2 files changed, 408 deletions(-) delete mode 100644 .vsts-pipelines/builds/pr-generator-branch-merge.yml delete mode 100755 scripts/GitHubMergeBranches.ps1 diff --git a/.vsts-pipelines/builds/pr-generator-branch-merge.yml b/.vsts-pipelines/builds/pr-generator-branch-merge.yml deleted file mode 100644 index 623362b8f..000000000 --- a/.vsts-pipelines/builds/pr-generator-branch-merge.yml +++ /dev/null @@ -1,31 +0,0 @@ -resources: -- repo: self - clean: true -queue: Hosted -steps: -- task: PowerShell@1 - displayName: Run Script - inputs: - scriptType: inlineScript - arguments: '-ScriptFileName "$(ScriptFileName)" -Arguments "$(Arguments)" -Secrets @{"BotAccount-dotnet-maestro-bot-PAT"="$(BotAccount-dotnet-maestro-bot-PAT)"}' - failOnStandardError: false - inlineScript: | - param( - [string]$ScriptFileName, - [string]$Arguments, - [hashtable]$Secrets) - - $Arguments = Invoke-Expression "`"$Arguments`"" - $Secrets = @{} - $pwd = Get-Location - try { - Invoke-Expression "& `"$pwd\$ScriptFileName`" $Arguments" - if ($LASTEXITCODE -ne 0) { - throw "Script returned exit code $LASTEXITCODE" - } - } catch { - write-error $_ - exit 1 - } - - diff --git a/scripts/GitHubMergeBranches.ps1 b/scripts/GitHubMergeBranches.ps1 deleted file mode 100755 index 3bde4e3b6..000000000 --- a/scripts/GitHubMergeBranches.ps1 +++ /dev/null @@ -1,377 +0,0 @@ -#!/usr/bin/env pwsh -c - -<# -.DESCRIPTION -Creates a GitHub pull request to merge a head branch into a base branch -.PARAMETER RepoOwner -The GitHub repository owner. -.PARAMETER RepoName -The GitHub repository name. -.PARAMETER BaseBranch -The base branch -- the target branch for the PR -.PARAMETER HeadBranch -The current branch -.PARAMETER Username -The GitHub username -.PARAMETER AuthToken -A personal access token -.PARAMETER Fork -Make PR from a fork -#> -[CmdletBinding(SupportsShouldProcess = $true)] -param( - [Alias('o')] - [Parameter(Mandatory = $true)] - $RepoOwner, - - [Alias('n')] - [Parameter(Mandatory = $true)] - $RepoName, - - [Alias('b')] - [Parameter(Mandatory = $true)] - $BaseBranch, - - [Alias('h')] - [Parameter(Mandatory = $true)] - $HeadBranch, - - [Parameter(Mandatory = $true)] - [Alias('a')] - $AuthToken, - - [Alias('u')] - $Username, - - [switch]$Fork -) - -$ErrorActionPreference = 'stop' -Set-StrictMode -Version 1 -[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 - -if ($Fork -and (-not $Username)) { - throw 'You must specify -Username if you also specify -Fork' -} - -# Workaround for quirk in how dotnet-maestro-bot triggers this script -if ($RepoName -like "$RepoOwner/*") { - $RepoName = $RepoName.Substring("$RepoOwner/".Length) -} - -$headers = @{ - Authorization = "bearer $AuthToken" -} - -[hashtable] $script:emails = @{} - -function Invoke-Block([scriptblock]$cmd) { - $cmd | Out-String | Write-Verbose - & $cmd - - # Need to check both of these cases for errors as they represent different items - # - $?: did the powershell script block throw an error - # - $lastexitcode: did a windows command executed by the script block end in error - if ((-not $?) -or ($lastexitcode -ne 0)) { - if ($error -ne $null) { - Write-Warning $error[0] - } - throw "Command failed to execute: $cmd" - } -} - -function GetCommiterGitHubName($sha) { - $email = & git show -s --format='%ce' $sha - $key = 'committer' - - # Exclude noreply@github.com - these map to https://github.com/web-flow, which is the user account - # added as the 'committer' when users commit via the GitHub web UI on their own PRs - if ((-not $email) -or ($email -eq 'noreply@github.com')) { - $key = 'author' - $email = & git show -s --format='%ae' $sha - } - - if ($email -like '*@users.noreply.github.com') { - return $email -replace '@users.noreply.github.com', '' - } - elseif ($script:emails[$email]) { - return $script:emails[$email] - } - else { - Write-Verbose "Attempting to find GitHub username for $email" - try { - $resp = Invoke-RestMethod -Method GET -Headers $headers ` - "https://api.github.com/repos/$RepoOwner/$RepoName/commits/$sha" - $resp | Write-Verbose - - $script:emails[$email] = $resp.$key.login - return $resp.$key.login - } - catch { - Write-Warning "Failed to find github user for $email. $_" - } - } - return $null -} - -function RepoExists($owner, $name) { - try { - $resp = Invoke-RestMethod -Headers $headers "https://api.github.com/repos/$owner/$name" - $resp | Write-Verbose - return ($resp -ne $null) - } - catch { - return $false - } -} - -$workDir = "$PSScriptRoot/obj/$repoName" -New-Item "$PSScriptRoot/obj/" -ItemType Directory -ErrorAction Ignore | Out-Null - -$fetch = $true -if (-not (Test-Path $workDir)) { - $fetch = $false - Invoke-Block { & git clone "https://github.com/$RepoOwner/$RepoName.git" $workDir ` - --quiet ` - --no-tags ` - --branch $BaseBranch - } -} - -# see https://git-scm.com/docs/pretty-formats -$formatString = '%h %cn <%ce>: %s (%cr)' - -Push-Location $workDir -try { - if ($fetch) { - Invoke-Block { & git fetch --quiet origin } - Invoke-Block { & git checkout --quiet $BaseBranch } - Invoke-Block { & git reset --hard origin/$BaseBranch } - } - - Write-Host -f Magenta "${BaseBranch}:`t`t$(& git log --format=$formatString -1 HEAD)" - - Invoke-Block { & git checkout --quiet $HeadBranch } - Invoke-Block { & git reset --quiet --hard origin/$HeadBranch } - - Write-Host -f Magenta "${HeadBranch}:`t$(& git log --format=$formatString -1 HEAD)" - - [string[]] $commitsToMerge = & git rev-list "$BaseBranch..$HeadBranch" # find all commits which will be merged - - if (-not $commitsToMerge) { - Write-Warning "There were no commits to be merged from $HeadBranch into $BaseBranch" - exit 0 - } - - $authors = $commitsToMerge ` - | % { Write-Host -f Cyan "Merging:`t$(git log --format=$formatString -1 $_)"; $_ } ` - | % { GetCommiterGitHubName $_ } ` - | ? { $_ -ne $null } ` - | select -Unique - - if ((($authors | measure).Count -eq 1) -and ($authors | select -first 1) -eq 'aspnetci') { - Write-Host -ForegroundColor Yellow 'Skipping PR generation because it appears this PR would only contain automated commits by aspnetci' - exit 0 - } - - $authors = $authors | % { "* @$_" } - - $committersList = "This PR merges commits made on $HeadBranch by the following committers:`n`n$($authors -join "`n")" - - Write-Host $committersList - - $mergeBranchName = "merge/$HeadBranch-to-$BaseBranch" - Invoke-Block { & git checkout -B $mergeBranchName } - - $remoteName = 'origin' - $prOwnerName = $RepoOwner - - if ($Fork) { - $remoteName = 'fork' - - try { - # remove remote if it already exists and re-confgure - Invoke-Block { & git remote remove fork } - } - catch { } - - Invoke-Block { & git remote add fork "https://${Username}:${AuthToken}@github.com/${Username}/${RepoName}.git" } - $prOwnerName = $Username - - if (-not (RepoExists $Username $RepoName)) { - if ($PSCmdlet.ShouldProcess("Creating fork ${Username}/${RepoName}")) { - - Write-Host -ForegroundColor Yellow "Creating a fork ${Username}/${RepoName}" - - $resp = Invoke-RestMethod -Method Post -Headers $Headers ` - "https://api.github.com/repos/$RepoOwner/$RepoName/forks" - $resp | Write-Verbose - - $retries = 10 - $repoCreated = $false - do { - $retries -= 1 - if (RepoExists $Username $RepoName) { - # Fork creation is an async operation. Wait a minute to give GitHub more time to finish fork creation - Start-Sleep -Seconds 90 - $repoCreated = $true - break - } - Write-Host "Repo ${Username}/${RepoName} does not exist yet. Waiting to check again..." - Start-Sleep -Seconds 30 - } while ($retries -gt 0) - - if (-not $repoCreated) { - throw "Could not create a fork for ${Username}/${RepoName}" - } - } - } - } - - $query = 'query ($repoOwner: String!, $repoName: String!, $baseRefName: String!) { - repository(owner: $repoOwner, name: $repoName) { - pullRequests(baseRefName: $baseRefName, states: OPEN, first: 100) { - totalCount - nodes { - number - headRef { - name - repository { - name - owner { - login - } - } - } - } - } - } - }' - - $data = @{ - query = $query - variables = @{ - repoOwner = $RepoOwner - repoName = $RepoName - baseRefName = $BaseBranch - } - } - - $resp = Invoke-RestMethod -Method Post ` - -Headers $headers ` - https://api.github.com/graphql ` - -Body ($data | ConvertTo-Json) - $resp | Write-Verbose - - $matchingPr = $resp.data.repository.pullRequests.nodes ` - | ? { $_.headRef.name -eq $mergeBranchName -and $_.headRef.repository.owner.login -eq $prOwnerName } ` - | select -First 1 - - if ($matchingPr) { - $prUpdatedSuccess = $false - - try { - if ($PSCmdlet.ShouldProcess("Update remote branch $mergeBranchName on $remoteName")) { - Invoke-Block { & git push $remoteName "${mergeBranchName}:${mergeBranchName}" } - } - $prUpdatedSuccess = $true - } - catch { - Write-Warning "Failed to update existing PR" - } - - $prMessage = if ($prUpdatedSuccess) { - "This pull request has been updated.`n`n$committersList" - } else { - @" -:x: Uh oh, this pull request could not be updated automatically. New commits were pushed to $HeadBranch, but I could not automatically push those to $mergeBranchName to update this PR. -You may need to fix this problem by merging branches with this PR. Contact ASP.NET Core Engineering if you are not sure what to do about this. -"@ - } - - $data = @{ - body = $prMessage - } - - $prNumber = $matchingPr.number - $prUrl = "https://github.com/$RepoOwner/$RepoName/pull/$prNumber" - - if ($PSCmdlet.ShouldProcess("Update $prUrl")) { - $resp = Invoke-RestMethod -Method Post -Headers $headers ` - "https://api.github.com/repos/$RepoOwner/$RepoName/issues/$prNumber/comments" ` - -Body ($data | ConvertTo-Json) - $resp | Write-Verbose - Write-Host -f green "Updated pull request $url" - } - } - else { - # Use --force because the merge branch may have been used for a previous PR. - # This should only happen if there is no existing PR for the merge - - if ($PSCmdlet.ShouldProcess("Force updating remote branch $mergeBranchName on $remoteName")) { - Invoke-Block { & git push --force $remoteName "${mergeBranchName}:${mergeBranchName}" } - } - - $previewHeaders = @{ - # Required while this api is in preview: https://developer.github.com/v3/pulls/#create-a-pull-request - Accept = 'application/vnd.github.symmetra-preview+json' - Authorization = "bearer $AuthToken" - } - - $prBody = @" -I detected changes in the $HeadBranch branch which have not been merged yet to $BaseBranch. -I'm a robot and am configured to help you automatically keep $BaseBranch up to date, so -I've opened this PR. - -$committersList - -## Instructions for merging - -This PR will not be auto-merged. When pull request checks pass, please complete this PR -by creating a merge commit, *not* a squash or rebase commit. - -merge button instructions - -You can also do this on command line: -`````` -git checkout $BaseBranch -git pull -git fetch --force https://github.com/$prOwnerName/$RepoName ${mergeBranchName}:${mergeBranchName} -git merge ${mergeBranchName} -git push -`````` - -## Instructions for resolving conflicts - -:warning: If there are merge conflicts, you will need to resolve them manually before merging. -You can do this [using GitHub](https://help.github.com/articles/resolving-a-merge-conflict-on-github/) -or using the [command line](https://help.github.com/articles/resolving-a-merge-conflict-using-the-command-line/). - -Maintainers of this repo have permission to the branch '$mergeBranchName' on https://github.com/$prOwnerName/$RepoName. -You can push changes to this branch to resolve conflicts or other issues in this pull request. The bot will attempt -to update this branch as more changes are discovered on $HeadBranch. - -Please contact ASP.NET Core Engineering if you have questions or issues. -Also, if this PR was generated incorrectly, help us fix it. See https://github.com/aspnet/BuildTools/blob/master/scripts/GitHubMergeBranches.ps1. -"@ - - $data = @{ - title = "[automated] Merge branch '$HeadBranch' => '$BaseBranch'" - head = "${prOwnerName}:${mergeBranchName}" - base = $BaseBranch - body = $prBody - maintainer_can_modify = $true - } - - if ($PSCmdlet.ShouldProcess("Create PR from ${prOwnerName}:${mergeBranchName} to $BaseBranch on $Reponame")) { - $resp = Invoke-RestMethod -Method POST -Headers $previewHeaders ` - https://api.github.com/repos/$RepoOwner/$RepoName/pulls ` - -Body ($data | ConvertTo-Json) - $resp | Write-Verbose - Write-Host -f green "Created pull request https://github.com/$RepoOwner/$RepoName/pull/$($resp.number)" - } - } -} -finally { - Pop-Location -} From c8d0cc52cd1abb697be24e288ffd54f8fae8bf17 Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Tue, 21 Aug 2018 14:27:22 -0700 Subject: [PATCH 077/192] Enable JUnit test lightup in VSTS (#743) Part of https://github.com/aspnet/SignalR/issues/2830 --- .vsts-pipelines/templates/phases/default-build.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.vsts-pipelines/templates/phases/default-build.yml b/.vsts-pipelines/templates/phases/default-build.yml index 6027710fb..68041c682 100644 --- a/.vsts-pipelines/templates/phases/default-build.yml +++ b/.vsts-pipelines/templates/phases/default-build.yml @@ -90,6 +90,12 @@ phases: inputs: testRunner: vstest testResultsFiles: 'artifacts/logs/**/*.trx' + - task: PublishTestResults@2 + displayName: Publish junit test results + condition: always() + inputs: + testRunner: junit + testResultsFiles: 'artifacts/logs/**/*.junit.xml' - ${{ if eq(parameters.artifacts.publish, 'true') }}: - task: PublishBuildArtifacts@1 displayName: Upload artifacts From 9403d762aafc1bd7db556824560f0f204d6fface Mon Sep 17 00:00:00 2001 From: David Fowler Date: Tue, 4 Sep 2018 23:02:40 -0700 Subject: [PATCH 078/192] Update run.sh (#748) Found this while trying to make a minimal docker dev env for ASP.NET Core --- scripts/bootstrapper/run.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/scripts/bootstrapper/run.sh b/scripts/bootstrapper/run.sh index 61f7a5338..4c1fed564 100755 --- a/scripts/bootstrapper/run.sh +++ b/scripts/bootstrapper/run.sh @@ -220,7 +220,7 @@ if [ -f "$config_file" ]; then config_channel="$(jq -r 'select(.channel!=null) | .channel' "$config_file")" config_tools_source="$(jq -r 'select(.toolsSource!=null) | .toolsSource' "$config_file")" else - _error "$config_file contains invalid JSON." + __error "$config_file contains invalid JSON." exit 1 fi elif __machine_has python ; then @@ -228,7 +228,7 @@ if [ -f "$config_file" ]; then config_channel="$(python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['channel'] if 'channel' in obj else '')")" config_tools_source="$(python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['toolsSource'] if 'toolsSource' in obj else '')")" else - _error "$config_file contains invalid JSON." + __error "$config_file contains invalid JSON." exit 1 fi elif __machine_has python3 ; then @@ -236,11 +236,11 @@ if [ -f "$config_file" ]; then config_channel="$(python3 -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['channel'] if 'channel' in obj else '')")" config_tools_source="$(python3 -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['toolsSource'] if 'toolsSource' in obj else '')")" else - _error "$config_file contains invalid JSON." + __error "$config_file contains invalid JSON." exit 1 fi else - _error 'Missing required command: jq or python. Could not parse the JSON file.' + __error 'Missing required command: jq or python. Could not parse the JSON file.' exit 1 fi From c5b00c1559d9f6453a5aeaf253aec10060e3aee4 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 7 Sep 2018 09:16:39 -0700 Subject: [PATCH 079/192] Obsolete Microsoft.DotNet.GlobalTools.Sdk --- .../Internal.AspNetCore.Sdk.nuspec | 1 - .../build/DotNetTool.targets | 28 +++++ .../build/Internal.AspNetCore.Sdk.targets | 4 + src/Internal.AspNetCore.Sdk/sdk/Sdk.targets | 4 - ...icrosoft.DotNetTool.ShimGeneration.targets | 118 ------------------ .../sdk/Sdk.targets | 6 +- 6 files changed, 35 insertions(+), 126 deletions(-) create mode 100644 src/Internal.AspNetCore.Sdk/build/DotNetTool.targets delete mode 100644 src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.targets diff --git a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec index 9db68d94d..0ed5b6d42 100644 --- a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec +++ b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec @@ -19,7 +19,6 @@ - diff --git a/src/Internal.AspNetCore.Sdk/build/DotNetTool.targets b/src/Internal.AspNetCore.Sdk/build/DotNetTool.targets new file mode 100644 index 000000000..cf5384a1f --- /dev/null +++ b/src/Internal.AspNetCore.Sdk/build/DotNetTool.targets @@ -0,0 +1,28 @@ + + + + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + $(GetSignedPackageFilesDependsOn);_GetSignedPackageFilesForGeneratedShims + + + + + win-x86;win-x64 + $(RuntimeIdentifiers);$(PackAsToolShimRuntimeIdentifiers) + + + + + <_ShimRids Include="$(PackAsToolShimRuntimeIdentifiers)" /> + + tools/$(TargetFramework)/any/shims/%(_ShimRids.Identity)/ + + + tools/$(TargetFramework)/any/$(TargetFileName) + + + + + diff --git a/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets b/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets index 79f7e8b8e..cbdf11f71 100644 --- a/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets +++ b/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets @@ -9,6 +9,10 @@ for use outside of Microsoft. + + diff --git a/src/Internal.AspNetCore.Sdk/sdk/Sdk.targets b/src/Internal.AspNetCore.Sdk/sdk/Sdk.targets index d497b714d..d6f742aeb 100644 --- a/src/Internal.AspNetCore.Sdk/sdk/Sdk.targets +++ b/src/Internal.AspNetCore.Sdk/sdk/Sdk.targets @@ -11,8 +11,4 @@ - - diff --git a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.targets b/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.targets deleted file mode 100644 index cd2229856..000000000 --- a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Microsoft.DotNetTool.ShimGeneration.targets +++ /dev/null @@ -1,118 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - $(TargetsForTfmSpecificContentInPackage);GetDotNetToolShimPackageContent - $(GetSignedPackageFilesDependsOn);_GetSignedPackageFilesForGeneratedShims - - - - - $(RuntimeFrameworkVersion) - - - win-x86;win-x64 - - - $(RuntimeIdentifiers);$(GeneratedShimRuntimeIdentifiers) - - - - - - - - - - - tools/$(TargetFramework)/any/$(TargetFileName) - - - - - - - - - - - - - - - - - - <_NormalizedPackageVersion>$(PackageVersion) - <_NormalizedPackageVersion Condition="$(_NormalizedPackageVersion.Contains('+'))">$(_NormalizedPackageVersion.Substring($(_NormalizedPackageVersion.IndexOf('+')))) - - - - <_ShimRids Remove="@(_ShimRids)" /> - <_ShimRids Include="$(GeneratedShimRuntimeIdentifiers)" AppHostFileName="$(AssemblyName)" /> - <_ShimRids Update="%(_ShimRids.Identity)" AppHostFileName="$(AssemblyName).exe" Condition="$([System.String]::new('%(_ShimRids.Identity)').StartsWith('win'))" /> - - - %(_ShimRids.Identity) - $(IntermediateOutputPath)shims/%(_ShimRids.Identity)/ - tools/$(TargetFramework)/any/shims/%(_ShimRids.Identity)/ - .store/$(PackageId.ToLowerInvariant())/$(_NormalizedPackageVersion)/$(PackageId.ToLowerInvariant())/$(_NormalizedPackageVersion)/tools/$(TargetFramework)/any/$(TargetFileName) - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.targets b/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.targets index 534ae715c..2159b5343 100644 --- a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.targets +++ b/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.targets @@ -4,7 +4,7 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - + + + From a8440f3d72838765cf4010c7bf834276c1a43542 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 7 Sep 2018 09:33:11 -0700 Subject: [PATCH 080/192] Remove support for GenerateToolShims=true --- src/Internal.AspNetCore.Sdk/build/DotNetTool.targets | 8 -------- .../build/Internal.AspNetCore.Sdk.targets | 2 +- src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.props | 3 +++ src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.targets | 2 +- test.ps1 | 1 + 5 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/Internal.AspNetCore.Sdk/build/DotNetTool.targets b/src/Internal.AspNetCore.Sdk/build/DotNetTool.targets index cf5384a1f..33ac97621 100644 --- a/src/Internal.AspNetCore.Sdk/build/DotNetTool.targets +++ b/src/Internal.AspNetCore.Sdk/build/DotNetTool.targets @@ -5,14 +5,6 @@ $(GetSignedPackageFilesDependsOn);_GetSignedPackageFilesForGeneratedShims - - - win-x86;win-x64 - $(RuntimeIdentifiers);$(PackAsToolShimRuntimeIdentifiers) - - <_ShimRids Include="$(PackAsToolShimRuntimeIdentifiers)" /> diff --git a/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets b/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets index cbdf11f71..67c0d9b6a 100644 --- a/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets +++ b/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets @@ -11,7 +11,7 @@ for use outside of Microsoft. + Condition="'$(PackAsTool)' == 'true' AND '$(TargetFramework)' != ''" /> diff --git a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.props b/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.props index 7bc91e443..2d455bed4 100644 --- a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.props +++ b/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.props @@ -1,2 +1,5 @@  + + win-x86;win-x64 + diff --git a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.targets b/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.targets index 2159b5343..345d35bb9 100644 --- a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.targets +++ b/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.targets @@ -5,6 +5,6 @@ - + diff --git a/test.ps1 b/test.ps1 index f5d7de316..ee9f90aa5 100755 --- a/test.ps1 +++ b/test.ps1 @@ -38,6 +38,7 @@ $Arguments += , "/p:DotNetRestoreSources=$packageDir" foreach ($pkg in @( "Internal.AspNetCore.Sdk", "Internal.AspNetCore.SiteExtension.Sdk", + "Microsoft.DotNet.GlobalTools.Sdk", "Microsoft.AspNetCore.BuildTools.ApiCheck")) { $pkgRoot = "${env:USERPROFILE}/.nuget/packages/$pkg/$toolsVersion/" From 2315030c7f3de2af0f16cf64502321937b6c4315 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 7 Sep 2018 09:40:52 -0700 Subject: [PATCH 081/192] Fix broken CLI tool tests --- .../src/GlobalConsoleTool/GlobalConsoleTool.csproj | 2 +- testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj b/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj index 0ac01c8c4..840fe1182 100644 --- a/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj +++ b/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj @@ -4,7 +4,7 @@ Exe netcoreapp2.1 true - true + win-x64;win-x86 diff --git a/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj b/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj index 09cc68bfe..f41c8b9df 100644 --- a/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj +++ b/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj @@ -7,7 +7,7 @@ cowsay Simple.CliTool true - true + win-x64;win-x86 TestCert MyPackageSigningCert From 730dc1470fcda5bb71ffff8271fa094c94a91e4a Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 7 Sep 2018 10:08:19 -0700 Subject: [PATCH 082/192] Attempt to reduce verbosity of TeamCity XML report parser (#754) --- files/KoreBuild/modules/vstest/module.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/modules/vstest/module.targets b/files/KoreBuild/modules/vstest/module.targets index 657ea4bd7..574e72302 100644 --- a/files/KoreBuild/modules/vstest/module.targets +++ b/files/KoreBuild/modules/vstest/module.targets @@ -102,7 +102,7 @@ Runs the VSTest on all projects in the ProjectsToTest itemgroup. - From 913614bf989c4ac88734c7ddb24e02b4f4934225 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 7 Sep 2018 10:30:36 -0700 Subject: [PATCH 083/192] Remove obsolete MSBuild tasks Downloading files and file hashing tasks are built-in as of MSBuild 15.8 --- build/repo.targets | 5 +- build/tasks/RepoTasks.csproj | 3 - build/tasks/RepoTasks.tasks | 2 - modules/KoreBuild.Tasks/ComputeChecksum.cs | 37 --------- modules/KoreBuild.Tasks/DownloadFile.cs | 49 ----------- modules/KoreBuild.Tasks/VerifyChecksum.cs | 44 ---------- modules/KoreBuild.Tasks/module.props | 3 - test/KoreBuild.Tasks.Tests/ChecksumTests.cs | 66 --------------- .../DownloadFileTests.cs | 81 ------------------- 9 files changed, 3 insertions(+), 287 deletions(-) delete mode 100644 modules/KoreBuild.Tasks/ComputeChecksum.cs delete mode 100644 modules/KoreBuild.Tasks/DownloadFile.cs delete mode 100644 modules/KoreBuild.Tasks/VerifyChecksum.cs delete mode 100644 test/KoreBuild.Tasks.Tests/ChecksumTests.cs delete mode 100644 test/KoreBuild.Tasks.Tests/DownloadFileTests.cs diff --git a/build/repo.targets b/build/repo.targets index c994b36de..4a9c40189 100644 --- a/build/repo.targets +++ b/build/repo.targets @@ -47,8 +47,9 @@ + SourceUrl="https://dist.nuget.org/win-x86-commandline/v4.6.2/nuget.exe" + DestinationFolder="$(IntermediateDir)" + Condition="!Exists($(_NuGetExeDownloadPath))" /> diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index 02ed987c5..81af5527a 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -18,9 +18,6 @@ - - - diff --git a/build/tasks/RepoTasks.tasks b/build/tasks/RepoTasks.tasks index 507aa66fb..f0ca0630a 100644 --- a/build/tasks/RepoTasks.tasks +++ b/build/tasks/RepoTasks.tasks @@ -8,6 +8,4 @@ - - diff --git a/modules/KoreBuild.Tasks/ComputeChecksum.cs b/modules/KoreBuild.Tasks/ComputeChecksum.cs deleted file mode 100644 index 45f37f4bb..000000000 --- a/modules/KoreBuild.Tasks/ComputeChecksum.cs +++ /dev/null @@ -1,37 +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 Microsoft.Build.Framework; - -namespace KoreBuild.Tasks -{ - /// - /// Computes the checksum for a single file. - /// - public class ComputeChecksum : Microsoft.Build.Utilities.Task - { - /// - /// The file path. - /// - [Required] - public string File { get; set; } - - /// - /// The algorithm. Allowed values: SHA256, SHA384, SHA512. - /// - public string Algorithm { get; set; } = "SHA256"; - - /// - /// The hash. - /// - [Output] - public string Hash { get; set; } - - public override bool Execute() - { - Hash = HashHelper.GetFileHash(Algorithm, File); - - return true; - } - } -} diff --git a/modules/KoreBuild.Tasks/DownloadFile.cs b/modules/KoreBuild.Tasks/DownloadFile.cs deleted file mode 100644 index 041039cf8..000000000 --- a/modules/KoreBuild.Tasks/DownloadFile.cs +++ /dev/null @@ -1,49 +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.Threading; -using System.Threading.Tasks; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Framework; - -namespace KoreBuild.Tasks -{ - /// - /// Downloads a file. - /// - public class DownloadFile : Microsoft.Build.Utilities.Task, ICancelableTask - { - private readonly CancellationTokenSource _cts = new CancellationTokenSource(); - - /// - /// The file to download. Can be prefixed with file:// for local file paths. - /// - [Required] - public string Uri { get; set; } - - /// - /// Destination for the downloaded file. If the file already exists, it is not re-downloaded unless is true. - /// - [Required] - public string DestinationPath { get; set; } - - /// - /// Should be overwritten. When true, the file is always re-downloaded. - /// - public bool Overwrite { get; set; } - - /// - /// The maximum amount of time to allow for downloading the file. Defaults to 15 minutes. - /// - public int TimeoutSeconds { get; set; } = 60 * 15; - - public void Cancel() => _cts.Cancel(); - - public override bool Execute() => ExecuteAsync().Result; - - public Task ExecuteAsync() - { - return DownloadFileHelper.DownloadFileAsync(Uri, DestinationPath, Overwrite, _cts.Token, TimeoutSeconds, Log); - } - } -} diff --git a/modules/KoreBuild.Tasks/VerifyChecksum.cs b/modules/KoreBuild.Tasks/VerifyChecksum.cs deleted file mode 100644 index 3cb7d48c7..000000000 --- a/modules/KoreBuild.Tasks/VerifyChecksum.cs +++ /dev/null @@ -1,44 +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 Microsoft.Build.Framework; - -namespace KoreBuild.Tasks -{ - /// - /// Verify the checksum for a single file. - /// - public class VerifyChecksum : Microsoft.Build.Utilities.Task - { - /// - /// The file path. - /// - [Required] - public string File { get; set; } - - /// - /// The algorithm. Allowed values: SHA256, SHA384, SHA512. - /// - public string Algorithm { get; set; } = "SHA256"; - - /// - /// The hash. - /// - [Required] - public string Hash { get; set; } - - public override bool Execute() - { - var actualHash = HashHelper.GetFileHash(Algorithm, File); - - if (!actualHash.Equals(Hash, StringComparison.OrdinalIgnoreCase)) - { - Log.LogError($"Checksum mismatch. Expected {File} to have {Algorithm} checksum of {Hash}, but it was {actualHash}"); - return false; - } - - return true; - } - } -} diff --git a/modules/KoreBuild.Tasks/module.props b/modules/KoreBuild.Tasks/module.props index aee577344..4ca3374ee 100644 --- a/modules/KoreBuild.Tasks/module.props +++ b/modules/KoreBuild.Tasks/module.props @@ -4,9 +4,7 @@ - - @@ -20,7 +18,6 @@ - $(KOREBUILD_DOTNET_ARCH) diff --git a/test/KoreBuild.Tasks.Tests/ChecksumTests.cs b/test/KoreBuild.Tasks.Tests/ChecksumTests.cs deleted file mode 100644 index ddef3ff31..000000000 --- a/test/KoreBuild.Tasks.Tests/ChecksumTests.cs +++ /dev/null @@ -1,66 +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.IO; -using BuildTools.Tasks.Tests; -using Microsoft.Build.Utilities; -using Xunit; - -namespace KoreBuild.Tasks.Tests -{ - public class ChecksumTests - { - [Theory] - [InlineData("SHA256", "BCFAF334240356E1B97824A866F643B1ADA3C16AA0B5B2BFA8390D8BB54A244C")] - [InlineData("sha256", "BCFAF334240356E1B97824A866F643B1ADA3C16AA0B5B2BFA8390D8BB54A244C")] - [InlineData("SHA384", "5520B01FDE8A8A7EA38DCADFBF3CFAB2818FA0D5A8A16CB11A2FC7F5C9F1497F7B3C528FDB8CE10AA293A4E5FF32297F")] - [InlineData("SHA512", "7774962C97EAC52B45291E1410F06AC6EFF6AF9ED38A57E2CEB720650282E46CFE512FAAD68AD9C45B74ED1B7E460198E0B00D5C9EF0404FF76B12F8AD2D329F")] - public void ComputesFileChecksum(string algoritm, string hash) - { - var task = new ComputeChecksum - { - File = Path.Combine(AppContext.BaseDirectory, "TestResources", "lorem.bin"), - BuildEngine = new MockEngine(), - Algorithm = algoritm, - }; - Assert.True(task.Execute(), "Task should pass"); - Assert.Equal(hash, task.Hash); - } - - [Theory] - [InlineData("SHA256", "C442A45BB8D0938AFB2B5B0AA61C3ADA1B346F668A42879B1E653042433FAFCB")] - [InlineData("SHA384", "F79223FF5E4A392AA01EC8BDF825C3B7F7941F9C5F7CF2A11BC61A8A5D0AF8182BAFC3FBFDACD83AE7A8A8EDF10B0255")] - [InlineData("SHA512", "F923D2DA8F21B67FF4040FE9C5D00B0E891064E7B1DE47B54C9DA86DAAF215EFC64E282056027BEC2E75A83DE9FA6FFE6CA60F0141E19254B25CAE79C2694777")] - public void VerifyFileChecksum_Fails(string algoritm, string hash) - { - var task = new VerifyChecksum - { - File = Path.Combine(AppContext.BaseDirectory, "TestResources", "lorem.bin"), - BuildEngine = new MockEngine { ContinueOnError = true }, - Algorithm = algoritm, - Hash = hash, - }; - - Assert.False(task.Execute(), "Task should fail"); - } - - [Theory] - [InlineData("SHA256", "BCFAF334240356E1B97824A866F643B1ADA3C16AA0B5B2BFA8390D8BB54A244C")] - [InlineData("sha256", "bcfaf334240356e1b97824a866f643b1ada3c16aa0b5b2bfa8390d8bb54a244c")] - [InlineData("SHA384", "5520B01FDE8A8A7EA38DCADFBF3CFAB2818FA0D5A8A16CB11A2FC7F5C9F1497F7B3C528FDB8CE10AA293A4E5FF32297F")] - [InlineData("SHA512", "7774962C97EAC52B45291E1410F06AC6EFF6AF9ED38A57E2CEB720650282E46CFE512FAAD68AD9C45B74ED1B7E460198E0B00D5C9EF0404FF76B12F8AD2D329F")] - public void VerifyFileChecksum_Pass(string algoritm, string hash) - { - var task = new VerifyChecksum - { - File = Path.Combine(AppContext.BaseDirectory, "TestResources", "lorem.bin"), - BuildEngine = new MockEngine(), - Algorithm = algoritm, - Hash = hash, - }; - - Assert.True(task.Execute(), "Task should pass"); - } - } -} diff --git a/test/KoreBuild.Tasks.Tests/DownloadFileTests.cs b/test/KoreBuild.Tasks.Tests/DownloadFileTests.cs deleted file mode 100644 index ec741500a..000000000 --- a/test/KoreBuild.Tasks.Tests/DownloadFileTests.cs +++ /dev/null @@ -1,81 +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.IO; -using BuildTools.Tasks.Tests; -using Xunit; -using Xunit.Abstractions; -using Task = System.Threading.Tasks.Task; - -namespace KoreBuild.Tasks.Tests -{ - public class DownloadFileTests - { - private readonly ITestOutputHelper _output; - - public DownloadFileTests(ITestOutputHelper output) - { - _output = output; - } - - [Fact] - public async Task ItDownloadAFile() - { - var expectedPath = Path.Combine(AppContext.BaseDirectory, "microsoft.com.2.html"); - var task = new DownloadFile - { - Uri = "http://example.org/index.html", - DestinationPath = expectedPath, - BuildEngine = new MockEngine(_output), - }; - - if (File.Exists(expectedPath)) - { - File.Delete(expectedPath); - } - - Assert.True(await task.ExecuteAsync(), "Task should pass"); - Assert.True(File.Exists(expectedPath), "The file should exist"); - } - - [Fact] - public async Task ItDoesNotRedownloadDownloadAFileThatExists() - { - var expectedPath = Path.Combine(AppContext.BaseDirectory, "microsoft.com.1.html"); - var task = new DownloadFile - { - Uri = "http://example.org/index.html", - DestinationPath = expectedPath, - BuildEngine = new MockEngine(_output), - }; - - const string placeholder = "Dummy content"; - File.WriteAllText(expectedPath, placeholder); - - Assert.True(await task.ExecuteAsync(), "Task should pass"); - - Assert.Equal(placeholder, File.ReadAllText(expectedPath)); - - task.Overwrite = true; - - Assert.True(await task.ExecuteAsync(), "Task should pass"); - Assert.NotEqual(placeholder, File.ReadAllText(expectedPath)); - } - - [Fact] - public async Task ItFailsForFilesThatDoNotExist() - { - var engine = new MockEngine(_output) { ContinueOnError = true }; - var task = new DownloadFile - { - Uri = "http://localhost/this/file/does/not/exist", - DestinationPath = Path.Combine(AppContext.BaseDirectory, "dummy.txt"), - BuildEngine = engine, - }; - - Assert.False(await task.ExecuteAsync(), "Task should fail"); - Assert.NotEmpty(engine.Errors); - } - } -} From f33ea497d840eb47f330d4afcbf033a2e89bb346 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 7 Sep 2018 10:43:14 -0700 Subject: [PATCH 084/192] Remove sign request generation and validation This is anticipation of Arcade convergence. We already stopped using signrequest.xml in other parts of the stack. New tools replace this functionality * SignCheck does a better job of validating that packages are actually signed * SignTool does a dry run of signing on local builds and takes care of signing vsix/jar/nupkgs --- BuildTools.sln | 7 - docs/Signing.md | 100 +------ .../KoreBuild.Tasks/GenerateSignRequests.cs | 258 ------------------ .../KoreBuild.Tasks/KoreBuild.Tasks.csproj | 4 - modules/KoreBuild.Tasks/module.props | 1 - modules/KoreBuild.Tasks/module.targets | 52 +--- .../CompositeRules/DefaultCompositeRule.cs | 1 - .../NuGetPackageVerifier.Console.csproj | 4 - .../console/PackageAnalysisContext.cs | 2 - .../console/PackageIssueFactory.cs | 9 - .../NuGetPackageVerifier/console/Program.cs | 21 +- .../Rules/SignRequestListsAllSignableFiles.cs | 35 --- modules/NuGetPackageVerifier/module.targets | 6 - .../msbuild/VerifyPackages.cs | 14 - ...al.AspNetCore.CodeSign.Abstractions.csproj | 8 - .../SignRequestCollection.cs | 43 --- .../SignRequestItem.cs | 179 ------------ .../SignRequestItemType.cs | 44 --- .../SignRequestManifestXmlReader.cs | 124 --------- .../SignRequestManifestXmlWriter.cs | 117 -------- .../XmlElementNames.cs | 19 -- .../SimpleRepoTests.cs | 71 ----- .../GenerateSignRequestsTests.cs | 118 -------- ...gnRequestListsAllSignableFilesRuleTests.cs | 105 ------- .../Utilities/TestPackageAnalysisContext.cs | 20 +- 25 files changed, 11 insertions(+), 1351 deletions(-) delete mode 100644 modules/KoreBuild.Tasks/GenerateSignRequests.cs delete mode 100644 modules/NuGetPackageVerifier/console/Rules/SignRequestListsAllSignableFiles.cs delete mode 100644 src/Internal.AspNetCore.CodeSign.Abstractions/Internal.AspNetCore.CodeSign.Abstractions.csproj delete mode 100644 src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestCollection.cs delete mode 100644 src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItem.cs delete mode 100644 src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItemType.cs delete mode 100644 src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlReader.cs delete mode 100644 src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlWriter.cs delete mode 100644 src/Internal.AspNetCore.CodeSign.Abstractions/XmlElementNames.cs delete mode 100644 test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs delete mode 100644 test/NuGetPackageVerifier.Tests/Rules/SignRequestListsAllSignableFilesRuleTests.cs diff --git a/BuildTools.sln b/BuildTools.sln index 6d51ed21e..b3d131404 100644 --- a/BuildTools.sln +++ b/BuildTools.sln @@ -94,8 +94,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetPackageVerifier.Tests" EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.DotNet.GlobalTools.Sdk", "src\Microsoft.DotNet.GlobalTools.Sdk\Microsoft.DotNet.GlobalTools.Sdk.csproj", "{449E2FD8-AE30-4C4E-8FC2-E797B99CF339}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Internal.AspNetCore.CodeSign.Abstractions", "src\Internal.AspNetCore.CodeSign.Abstractions\Internal.AspNetCore.CodeSign.Abstractions.csproj", "{CF3B27B5-5E04-4456-A852-DDFFF7BC3C38}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -174,10 +172,6 @@ Global {449E2FD8-AE30-4C4E-8FC2-E797B99CF339}.Debug|Any CPU.Build.0 = Debug|Any CPU {449E2FD8-AE30-4C4E-8FC2-E797B99CF339}.Release|Any CPU.ActiveCfg = Release|Any CPU {449E2FD8-AE30-4C4E-8FC2-E797B99CF339}.Release|Any CPU.Build.0 = Release|Any CPU - {CF3B27B5-5E04-4456-A852-DDFFF7BC3C38}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {CF3B27B5-5E04-4456-A852-DDFFF7BC3C38}.Debug|Any CPU.Build.0 = Debug|Any CPU - {CF3B27B5-5E04-4456-A852-DDFFF7BC3C38}.Release|Any CPU.ActiveCfg = Release|Any CPU - {CF3B27B5-5E04-4456-A852-DDFFF7BC3C38}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -202,7 +196,6 @@ Global {418F99A5-5EC4-4895-B8EB-7F8BBA241DB2} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76} {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} {449E2FD8-AE30-4C4E-8FC2-E797B99CF339} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76} - {CF3B27B5-5E04-4456-A852-DDFFF7BC3C38} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {1B8809C8-A6C3-4761-BC91-B12841F49AE1} diff --git a/docs/Signing.md b/docs/Signing.md index 013aa4c8a..d29769185 100644 --- a/docs/Signing.md +++ b/docs/Signing.md @@ -1,30 +1,7 @@ Signing ======= -KoreBuild supports generating a signing request manfiest. This includes a list of all files that should be signed -and information about the strongname or certificate that should be used. - -## Format - -The signing request manifest supports multiple element types. Each element represents a specific kind of action to take on a file. A minimal example looks like this. See [Elements](#Elements) below for details - -```xml - - - - - - - - - - - - - - - -``` +KoreBuild supports code signing files and using MSBuild to configure the list of files which are code-signed. ## Config via csproj @@ -41,14 +18,6 @@ To sign assemblies, set the AssemblySigningCertName and AssemblySigningStrongNam ``` -This will generate a signing request like this: - -```xml - - - -``` - ### NuGet packages To sign NuGet packages, set the PackageSigningCertName property in the \*.csproj that produces the nupkg. @@ -59,14 +28,6 @@ To sign NuGet packages, set the PackageSigningCertName property in the \*.csproj ``` -This will generate a signing request like this: - -```xml - - - -``` - ### NuGet packages with assemblies For assemblies that ship in a NuGet package, you can specify multiple properties. @@ -78,16 +39,6 @@ For assemblies that ship in a NuGet package, you can specify multiple properties ``` -This will generate a signing request like this: - -```xml - - - - - -``` - ### Projects using nuspec When creating a NuGet package via nuspec + csproj, KoreBuild cannot detect which assemblies @@ -128,7 +79,7 @@ Sometimes other signable assemblies end up in a nupkg. Signing for these file ty ### Disabling signing -You can disable sign request generation on an MSBuild project by setting DisableCodeSigning. +You can disable sign request generation on an MSBuild project by setting DisableCodeSigning, or for an entire repo (via repo.props). ```xml @@ -150,50 +101,3 @@ these elements to the `build/repo.props` file. (See also [KoreBuild.md](./KoreBu ``` - -## Elements - -#### `SigningRequest` - -Root element. No options. - -#### `File` - -A file to be signed. - -**Path** - file path. If nested in a parent element, is relative to the organization within the containing package. -If not, this is relative to the XML file. - -**Certificate** - the name of the certificate to use - -**StrongName** - for assemblies only. This is used to strong name assemblies that were delay signed in public. - -#### `Nupkg` - -A NuGet package to be signed. Nested elements can be added for `` and ``. - -**Path** - file path to the container - -**Certificate** - the name of the certificate to use - -#### `Vsix` - -A vsix package to be signed. Nested elements can be added for `` and ``. - -**Path** - file path to the container - -**Certificate** - the name of the certificate to use - -#### `Zip` - -A zip which contains elements to be signed. Nested elements can be added for `` and ``. - -**Path** - file path to the zip - -#### `ExcludedFile` - -This is useful when you want to exclude files within a container from being signed, but want to assert that -all files in a container are accounted for. - -**Path** - file path to a file to be ignored by the signing tool - diff --git a/modules/KoreBuild.Tasks/GenerateSignRequests.cs b/modules/KoreBuild.Tasks/GenerateSignRequests.cs deleted file mode 100644 index 787dd6330..000000000 --- a/modules/KoreBuild.Tasks/GenerateSignRequests.cs +++ /dev/null @@ -1,258 +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.IO; -using Microsoft.AspNetCore.BuildTools.CodeSign; -using Microsoft.Build.Framework; -using static Microsoft.AspNetCore.BuildTools.Utilities.FileHelpers; - -namespace KoreBuild.Tasks -{ - /// - /// Generates an XML document that can be passed to a tool for signing. - /// - /// The items are expected to be files. - /// - /// - public class GenerateSignRequest : Microsoft.Build.Utilities.Task - { - // well-known metadata on items set by the MSBuild engine - private const string ProjectFileMetadataName = "MSBuildSourceProjectFile"; - - /// - /// Files or containers of files that should be signed. - /// Required metadata 'Certificate' or 'StrongName'. Both can be specified. - /// Optional metadata: 'IsContainer'. Set this to true for files that can be extract and have inner parts signed. For example, nupkg and vsix files. - /// - [Required] - public ITaskItem[] Requests { get; set; } - - /// - /// Items that should explicitly be marked as 'excluded' in the sign request. - /// Only files in listed as a request item will be signed, but excluded files can be - /// added as well so tests can validate that all files in a container are accounted for. - /// - public ITaskItem[] Exclusions { get; set; } - - /// - /// The folder that conatins all items. The sign request file paths will be normalized to this path. - /// - [Required] - public string BasePath { get; set; } - - /// - /// The output path of the sign request file. - /// - [Required] - [Output] - public string OutputPath { get; set; } - - public override bool Execute() - { - OutputPath = NormalizePath(OutputPath); - BasePath = NormalizePath(BasePath); - - return Execute(() => - { - Directory.CreateDirectory(Path.GetDirectoryName(OutputPath)); - return File.CreateText(OutputPath); - }); - } - - internal bool Execute(Func writerFactory) - { - var signRequestCollection = new SignRequestCollection(); - - var containers = new Dictionary(StringComparer.OrdinalIgnoreCase); - var isContainer = new bool[Requests.Length]; - for (var i = 0; i < Requests.Length; i++) - { - var item = Requests[i]; - if (bool.TryParse(item.GetMetadata("IsContainer"), out var isc) && isc) - { - isContainer[i] = true; - var itemType = string.IsNullOrEmpty(item.GetMetadata("Type")) - ? Path.GetExtension(item.ItemSpec) - : item.GetMetadata("Type"); - - var type = SignRequestItem.GetTypeFromFileExtension(itemType); - var normalizedPath = GetRelativePath(BasePath, item.ItemSpec); - SignRequestItem container; - - switch (type) - { - case SignRequestItemType.Zip: - container = SignRequestItem.CreateZip(normalizedPath); - break; - case SignRequestItemType.Nupkg: - container = SignRequestItem.CreateNugetPackage(normalizedPath, item.GetMetadata("Certificate")); - break; - case SignRequestItemType.Vsix: - container = SignRequestItem.CreateVsix(normalizedPath, item.GetMetadata("Certificate")); - break; - default: - Log.LogError( - $"Unknown container type for signed file request:'{item.ItemSpec}'. Signing request container must specify the metadata 'Type'."); - continue; - } - - containers[item.ItemSpec] = container; - if (signRequestCollection.ContainsItemForPath(container.Path)) - { - Log.LogError( - $"Duplicate sign request for {container.ItemType} '{container.Path}'"); - continue; - } - signRequestCollection.Add(container); - } - } - - for (var i = 0; i < Requests.Length; i++) - { - if (isContainer[i]) - { - continue; - } - - var item = Requests[i]; - var normalizedPath = GetRelativePath(BasePath, item.ItemSpec); - var containerPath = item.GetMetadata("Container"); - if (!string.IsNullOrEmpty(containerPath)) - { - if (!containers.TryGetValue(containerPath, out var container)) - { - Log.LogError( - $"Signing request item '{item.ItemSpec}' specifies an unknown container '{containerPath}'."); - continue; - } - - var itemPath = GetPathWithinContainer(item); - - if (string.IsNullOrEmpty(itemPath)) - { - Log.LogError(null, null, null, item.GetMetadata(ProjectFileMetadataName), 0, 0, 0, 0, - message: $"Could not identify the path for the signable file {item.ItemSpec}"); - continue; - } - - normalizedPath = NormalizePath(itemPath); - var file = SignRequestItem.CreateFile(normalizedPath, - item.GetMetadata("Certificate"), - item.GetMetadata("StrongName")); - - if (container.ContainsChildPath(file.Path)) - { - Log.LogError($"Duplicate sign request for file '{file.Path}' inside '{container.Path}'"); - continue; - } - container.AddChild(file); - } - else - { - var file = SignRequestItem.CreateFile(normalizedPath, - item.GetMetadata("Certificate"), - item.GetMetadata("StrongName")); - - if (signRequestCollection.ContainsItemForPath(file.Path)) - { - Log.LogError( - $"Duplicate sign request for file '{file.Path}'"); - continue; - } - - signRequestCollection.Add(file); - } - } - - if (Exclusions != null) - { - foreach (var item in Exclusions) - { - var normalizedPath = GetRelativePath(BasePath, item.ItemSpec); - - var containerPath = item.GetMetadata("Container"); - if (!string.IsNullOrEmpty(containerPath)) - { - if (!containers.TryGetValue(containerPath, out var container)) - { - Log.LogError( - $"Exclusion item '{item.ItemSpec}' specifies an unknown container '{containerPath}'."); - continue; - } - - var itemPath = GetPathWithinContainer(item); - if (string.IsNullOrEmpty(itemPath)) - { - Log.LogError(null, null, null, item.GetMetadata(ProjectFileMetadataName), 0, 0, 0, 0, - message: $"Could not identify the path for signing exclusion {item.ItemSpec}"); - continue; - } - - normalizedPath = NormalizePath(itemPath); - var file = SignRequestItem.CreateExclusion(normalizedPath); - - if (container.ContainsChildPath(file.Path)) - { - // ignore duplicate exclusions - continue; - } - container.AddChild(file); - } - else - { - var file = SignRequestItem.CreateExclusion(normalizedPath); - if (signRequestCollection.ContainsItemForPath(file.Path)) - { - // ignore duplicate exclusions - continue; - } - signRequestCollection.Add(file); - } - } - } - - if (Log.HasLoggedErrors) - { - return false; - } - - using (var stream = writerFactory()) - using (var writer = new SignRequestManifestXmlWriter(stream)) - { - writer.Write(signRequestCollection); - } - - Log.LogMessage($"Generated bill of materials in {OutputPath}"); - - return !Log.HasLoggedErrors; - } - - private string GetPathWithinContainer(ITaskItem item) - { - // always prefer an explicit package path - var itemPath = NormalizePath(item.GetMetadata("PackagePath")); - if (string.IsNullOrEmpty(itemPath)) - { - // allow defining SignedPackageFile using just ItemSpec - var projectFile = item.GetMetadata(ProjectFileMetadataName); - // users will typically write items with relative itemspecs, but we can't get the original item spec. - // Infer the original item spec by getting the path relative to the project directory - return Path.IsPathRooted(item.ItemSpec) && !string.IsNullOrEmpty(projectFile) - ? Path.GetRelativePath(Path.GetDirectoryName(projectFile), item.ItemSpec) - : item.ItemSpec; - } - - if (itemPath.EndsWith('/')) - { - return Path.Combine(itemPath, Path.GetFileName(item.ItemSpec)); - } - - return itemPath; - } - - private static string GetRelativePath(string basePath, string path) - => NormalizePath(Path.GetRelativePath(basePath, path)); - } -} diff --git a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj index a4481f63f..703ce4646 100644 --- a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj +++ b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj @@ -27,9 +27,5 @@ - - - - diff --git a/modules/KoreBuild.Tasks/module.props b/modules/KoreBuild.Tasks/module.props index 4ca3374ee..4b07d040b 100644 --- a/modules/KoreBuild.Tasks/module.props +++ b/modules/KoreBuild.Tasks/module.props @@ -10,7 +10,6 @@ - diff --git a/modules/KoreBuild.Tasks/module.targets b/modules/KoreBuild.Tasks/module.targets index e33c391e0..8947d8fb5 100644 --- a/modules/KoreBuild.Tasks/module.targets +++ b/modules/KoreBuild.Tasks/module.targets @@ -3,14 +3,10 @@ GetToolsets;$(PrepareDependsOn) InstallDotNet;CheckPackageReferences;$(RestoreDependsOn) - $(PackageDependsOn);GenerateSignRequest - - true false $(RepositoryRoot)korebuild.json $(RepositoryRoot)build\dependencies.props - $(ArtifactsDir)signrequest.xml + Condition="'$(DisableCodeSigning)' != 'true' AND '$(SkipArtifactVerification)' != 'true'"> - <_ExpectedFileToSign Remove="@(_ExpectedFileToSign)" /> - <_ExpectedFileToSign Include="@(ArtifactInfo)" /> - <_ExpectedFileToSign Remove="@(FilesToSign);@(FilesToExcludeFromSigning);$(SignRequestOutputPath)" /> <_FilesToSignMissingConfig Remove="@(_FilesToSignMissingConfig)" /> <_FilesToSignMissingConfig Include="@(FilesToSign)" Condition=" '%(FilesToSign.Certificate)' == '' AND '%(FilesToSign.StrongName)' == '' AND '%(FilesToSign.IsContainer)' != 'true' " /> - - <_SigningErrorMessage Condition=" @(_ExpectedFileToSign->Count()) != 0 "> -Could not determine signing information for all ArtifactInfo items. -Fix this error by adding these items to FilesToSign or FilesToExcludeFromSigning: - - @(_ExpectedFileToSign, '%0A - ') - - - - - <_SigningErrorMessage Condition=" @(_FilesToSignMissingConfig->Count()) != 0 "> The following FilesToSign did not specify a Certificate or StrongName to use. @@ -202,34 +182,4 @@ The following FilesToSign did not specify a Certificate or StrongName to use. Condition=" @(_FilesToSignMissingConfig->Count()) != 0 " /> - - - - XmlFile - noship - - - - - - - - diff --git a/modules/NuGetPackageVerifier/console/CompositeRules/DefaultCompositeRule.cs b/modules/NuGetPackageVerifier/console/CompositeRules/DefaultCompositeRule.cs index bd4eea4b4..bf2ae18a2 100644 --- a/modules/NuGetPackageVerifier/console/CompositeRules/DefaultCompositeRule.cs +++ b/modules/NuGetPackageVerifier/console/CompositeRules/DefaultCompositeRule.cs @@ -30,7 +30,6 @@ public class DefaultCompositeRule : CompositeRule new PrereleaseDependenciesVersionRule(), new PackageVersionMatchesAssemblyVersionRule(), new BuildItemsRule(), - new SignRequestListsAllSignableFiles(), }; } } diff --git a/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj b/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj index 66d0d81fb..7c4b1a633 100644 --- a/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj +++ b/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj @@ -19,10 +19,6 @@ - - - - diff --git a/modules/NuGetPackageVerifier/console/PackageAnalysisContext.cs b/modules/NuGetPackageVerifier/console/PackageAnalysisContext.cs index 04a40078c..02ee7decc 100644 --- a/modules/NuGetPackageVerifier/console/PackageAnalysisContext.cs +++ b/modules/NuGetPackageVerifier/console/PackageAnalysisContext.cs @@ -4,7 +4,6 @@ using System; using System.Collections.Generic; using System.IO; -using Microsoft.AspNetCore.BuildTools.CodeSign; using NuGet.Packaging; using NuGetPackageVerifier.Logging; @@ -15,7 +14,6 @@ public class PackageAnalysisContext : IDisposable private PackageArchiveReader _reader; public FileInfo PackageFileInfo { get; set; } - public SignRequestItem SignRequest { get; set; } public IPackageMetadata Metadata { get; set; } public PackageVerifierOptions Options { get; set; } public IPackageVerifierLogger Logger { get; set; } diff --git a/modules/NuGetPackageVerifier/console/PackageIssueFactory.cs b/modules/NuGetPackageVerifier/console/PackageIssueFactory.cs index 5fa04a77c..bc1ae3387 100644 --- a/modules/NuGetPackageVerifier/console/PackageIssueFactory.cs +++ b/modules/NuGetPackageVerifier/console/PackageIssueFactory.cs @@ -69,15 +69,6 @@ public static PackageVerifierIssue DotNetToolMalformedManifest(string manifestPa ); } - public static PackageVerifierIssue SignRequestMissingPackageFile(string id, string filePath) - { - return new PackageVerifierIssue( - "FILE_MISSING_FROM_SIGN_REQUEST", - filePath, - string.Format("The sign request for package {0} does not specify what to do with signable file {1}", id, filePath), - PackageIssueLevel.Error); - } - public static PackageVerifierIssue PackageTypeMissing(string packageType) { return new PackageVerifierIssue( diff --git a/modules/NuGetPackageVerifier/console/Program.cs b/modules/NuGetPackageVerifier/console/Program.cs index c3ef984f4..80417a1b5 100644 --- a/modules/NuGetPackageVerifier/console/Program.cs +++ b/modules/NuGetPackageVerifier/console/Program.cs @@ -6,7 +6,6 @@ using System.Diagnostics; using System.IO; using System.Linq; -using Microsoft.AspNetCore.BuildTools.CodeSign; using Microsoft.Extensions.CommandLineUtils; using Newtonsoft.Json; using NuGet.Packaging; @@ -71,16 +70,17 @@ public static int Main(string[] args) }); - var signRequestManifest = signRequest.HasValue() - ? SignRequestManifestXmlReader.Load(signRequest.Value()) - : default; + if (signRequest.HasValue()) + { + Console.WriteLine("The --sign-request parameter is obsolete and will be ignored. It will be removed in a future version"); + } logger.LogNormal("Read {0} package set(s) from {1}", packageSets.Count, ruleFile.Value()); var nupkgs = new DirectoryInfo(packageDirectory.Value).EnumerateFiles("*.nupkg", SearchOption.TopDirectoryOnly) .Where(p => !p.Name.EndsWith(".symbols.nupkg")) .ToArray(); logger.LogNormal("Found {0} packages in {1}", nupkgs.Length, packageDirectory.Value); - var exitCode = Execute(packageSets, nupkgs, signRequestManifest, excludedRules.Values, logger, ignoreAssistanceMode); + var exitCode = Execute(packageSets, nupkgs, excludedRules.Values, logger, ignoreAssistanceMode); totalTimeStopWatch.Stop(); logger.LogNormal("Total took {0}ms", totalTimeStopWatch.ElapsedMilliseconds); @@ -93,7 +93,6 @@ public static int Main(string[] args) private static int Execute( IDictionary packageSets, IEnumerable nupkgs, - SignRequestCollection signRequestManifest, List excludedRuleNames, IPackageVerifierLogger logger, IgnoreAssistanceMode ignoreAssistanceMode) @@ -185,10 +184,6 @@ private static int Execute( var package = packagePair.Key; logger.LogInfo("Analyzing {0} ({1})", package.Id, package.Version); - var signRequest = signRequestManifest? - .FirstOrDefault(i => i.ItemType == SignRequestItemType.Nupkg - && string.Equals(packagePair.Value.FullName, Path.Combine(signRequestManifest.BasePath, i.Path.Replace('/', Path.DirectorySeparatorChar)), StringComparison.OrdinalIgnoreCase)); - List issues; using (var context = new PackageAnalysisContext { @@ -196,7 +191,6 @@ private static int Execute( Metadata = package, Logger = logger, Options = packageInfo.Value, - SignRequest = signRequest, }) { issues = analyzer.AnalyzePackage(context).ToList(); @@ -251,10 +245,6 @@ private static int Execute( { logger.LogInfo("Analyzing {0} ({1})", unlistedPackage.Id, unlistedPackage.Version); - var signRequest = signRequestManifest? - .FirstOrDefault(i => i.ItemType == SignRequestItemType.Nupkg - && string.Equals(packages[unlistedPackage].FullName, Path.Combine(signRequestManifest.BasePath, i.Path.Replace('/', Path.DirectorySeparatorChar)), StringComparison.OrdinalIgnoreCase)); - List issues; PackageVerifierOptions packageOptions = null; defaultPackageSet?.Packages?.TryGetValue(unlistedPackage.Id, out packageOptions); @@ -264,7 +254,6 @@ private static int Execute( PackageFileInfo = packages[unlistedPackage], Metadata = unlistedPackage, Logger = logger, - SignRequest = signRequest, Options = packageOptions, }) { diff --git a/modules/NuGetPackageVerifier/console/Rules/SignRequestListsAllSignableFiles.cs b/modules/NuGetPackageVerifier/console/Rules/SignRequestListsAllSignableFiles.cs deleted file mode 100644 index c305e487e..000000000 --- a/modules/NuGetPackageVerifier/console/Rules/SignRequestListsAllSignableFiles.cs +++ /dev/null @@ -1,35 +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.Collections.Generic; -using System.Linq; -using Microsoft.AspNetCore.BuildTools.CodeSign; -using NuGetPackageVerifier.Logging; - -namespace NuGetPackageVerifier.Rules -{ - public class SignRequestListsAllSignableFiles : IPackageVerifierRule - { - public IEnumerable Validate(PackageAnalysisContext context) - { - if (context.SignRequest == null) - { - context.Logger.Log(LogLevel.Info, "Skipping signing rule request verification for " + context.PackageFileInfo.FullName); - yield break; - } - - foreach (var file in context.PackageReader.GetFiles()) - { - if (!SignRequestItem.IsFileTypeSignable(file)) - { - continue; - } - - if (!context.SignRequest.Children.Any(f => string.Equals(f.Path,file))) - { - yield return PackageIssueFactory.SignRequestMissingPackageFile(context.Metadata.Id, file); - } - } - } - } -} diff --git a/modules/NuGetPackageVerifier/module.targets b/modules/NuGetPackageVerifier/module.targets index 8dbf82ec9..f92366ba8 100644 --- a/modules/NuGetPackageVerifier/module.targets +++ b/modules/NuGetPackageVerifier/module.targets @@ -25,18 +25,12 @@ repository root. - - <_VerifierSignRequestPath /> - <_VerifierSignRequestPath Condition=" '$(GenerateSignRequest)' == 'true' ">$(SignRequestOutputPath) - - diff --git a/modules/NuGetPackageVerifier/msbuild/VerifyPackages.cs b/modules/NuGetPackageVerifier/msbuild/VerifyPackages.cs index 4130e4ecb..a5d189891 100644 --- a/modules/NuGetPackageVerifier/msbuild/VerifyPackages.cs +++ b/modules/NuGetPackageVerifier/msbuild/VerifyPackages.cs @@ -27,8 +27,6 @@ public class VerifyPackages : MSBuildTask public string[] ExcludedRules { get; set; } - public string SignRequestManifest { get; set; } - public override bool Execute() { if (string.IsNullOrEmpty(RuleFile) || !File.Exists(RuleFile)) @@ -59,18 +57,6 @@ public override bool Execute() ArtifactDirectory, }; - if (!string.IsNullOrEmpty(SignRequestManifest)) - { - if (!File.Exists(SignRequestManifest)) - { - Log.LogError($"SignRequestManifest file {SignRequestManifest} does not exist."); - return false; - } - - arguments.Add("--sign-request"); - arguments.Add(SignRequestManifest); - } - foreach (var rule in ExcludedRules ?? Enumerable.Empty()) { arguments.Add("--excluded-rule"); diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/Internal.AspNetCore.CodeSign.Abstractions.csproj b/src/Internal.AspNetCore.CodeSign.Abstractions/Internal.AspNetCore.CodeSign.Abstractions.csproj deleted file mode 100644 index e14a59d88..000000000 --- a/src/Internal.AspNetCore.CodeSign.Abstractions/Internal.AspNetCore.CodeSign.Abstractions.csproj +++ /dev/null @@ -1,8 +0,0 @@ - - - netstandard2.0 - Microsoft.AspNetCore.BuildTools.CodeSign - Provides abstractions for working with signrequest.xml - true - - \ No newline at end of file diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestCollection.cs b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestCollection.cs deleted file mode 100644 index a02d43bc1..000000000 --- a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestCollection.cs +++ /dev/null @@ -1,43 +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; -using System.Collections.Generic; - -namespace Microsoft.AspNetCore.BuildTools.CodeSign -{ - /// - /// A collection of sign request items. - /// - public class SignRequestCollection : IEnumerable - { - private readonly SortedDictionary _items = new SortedDictionary(StringComparer.Ordinal); - - /// - public IEnumerator GetEnumerator() => _items.Values.GetEnumerator(); - - IEnumerator IEnumerable.GetEnumerator() => _items.Values.GetEnumerator(); - - /// - /// The base path for files in the collection. - /// - public string BasePath { get; set; } - - /// - /// Add an item to the collection. - /// - /// The item - public void Add(SignRequestItem item) - { - _items.Add(item.Path, item); - } - - /// - /// Determines if the collection already contains an entry for a given path. - /// - /// - /// - public bool ContainsItemForPath(string path) => _items.ContainsKey(path); - } -} diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItem.cs b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItem.cs deleted file mode 100644 index fc04d8ed8..000000000 --- a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItem.cs +++ /dev/null @@ -1,179 +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; - -namespace Microsoft.AspNetCore.BuildTools.CodeSign -{ - /// - /// Represents a file that should be signed. - /// - public class SignRequestItem - { - private static readonly Dictionary FileExtensionMapping = - new Dictionary(StringComparer.OrdinalIgnoreCase) - { - ["zip"] = SignRequestItemType.Zip, - ["mpack"] = SignRequestItemType.Zip, - ["vsix"] = SignRequestItemType.Vsix, - ["nupkg"] = SignRequestItemType.Nupkg, - ["dll"] = SignRequestItemType.File, - ["exe"] = SignRequestItemType.File, - ["ps1"] = SignRequestItemType.File, - ["psd1"] = SignRequestItemType.File, - ["psm1"] = SignRequestItemType.File, - ["psc1"] = SignRequestItemType.File, - ["ps1xml"] = SignRequestItemType.File, - }; - - private readonly SignRequestCollection _children = new SignRequestCollection(); - - /// - /// Create an exclusion to signing. - /// - /// - /// - public static SignRequestItem CreateExclusion(string path) - => new SignRequestItem(path, SignRequestItemType.Exclusion); - - /// - /// A zip archive file. - /// - /// - /// - public static SignRequestItem CreateZip(string path) - => new SignRequestItem(path, SignRequestItemType.Zip); - - /// - /// A binary (.exe, .dll) to be signed. - /// - /// - /// - /// - /// - public static SignRequestItem CreateFile(string path, string certificateName, string strongName) - => new SignRequestItem(path, SignRequestItemType.File) - { - Certificate = certificateName, - StrongName = strongName, - }; - - /// - /// A .nupkg to be signed. - /// - /// - /// - /// - public static SignRequestItem CreateNugetPackage(string path, string certificateName) - => new SignRequestItem(path, SignRequestItemType.Nupkg) - { - Certificate = certificateName, - }; - - /// - /// A .vsix to be signed. - /// - /// - /// - /// - public static SignRequestItem CreateVsix(string path, string certificateName) - => new SignRequestItem(path, SignRequestItemType.Vsix) - { - Certificate = certificateName, - }; - - /// - /// Determines if a file is signable based on the file extension - /// - /// The file extension (beginning with a dot). - /// True if the path can be code-signed. - public static bool IsFileTypeSignable(string filePath) - => GetTypeFromFileExtension(System.IO.Path.GetExtension(filePath).TrimStart('.')) != SignRequestItemType.Unknown; - - /// - /// Get an item type based on its file extension. - /// - /// - /// - public static SignRequestItemType GetTypeFromFileExtension(string fileExtension) - { - if (FileExtensionMapping.TryGetValue(fileExtension.TrimStart('.'), out var type)) - { - return type; - } - - return SignRequestItemType.Unknown; - } - - /// - /// Initialize an instance of - /// - /// - /// - internal SignRequestItem(string path, SignRequestItemType itemType) - { - Path = path ?? throw new ArgumentNullException(nameof(path)); - ItemType = itemType; - } - - /// - /// The file path. Should be relative to the manifest or container. - /// - public string Path { get; } - - /// - /// The type of the item. - /// - public SignRequestItemType ItemType { get; } - - /// - /// The name of the code signing certificate to use. - /// - public string Certificate { get; internal set; } - - /// - /// The name of the strong name key to use (for .NET assemblies only). - /// - public string StrongName { get; internal set; } - - /// - /// Excluded from code signing. - /// - public bool Excluded => ItemType == SignRequestItemType.Exclusion; - - /// - /// True for item types which can contain children, such as .zip or .nupkg files. - /// - public bool CanContainChildren - => ItemType == SignRequestItemType.Nupkg - || ItemType == SignRequestItemType.Zip - || ItemType == SignRequestItemType.Vsix; - - /// - /// Children of the sign request item. - /// - public IEnumerable Children => _children; - - /// - /// Add a child type. - /// - /// - public void AddChild(SignRequestItem item) - { - if (!CanContainChildren) - { - throw new InvalidOperationException("Cannot add a child to items which do not allow nested files"); - } - - _children.Add(item); - } - - /// - /// Checks if a child already exists at a given path. - /// - /// - /// - public bool ContainsChildPath(string path) => _children.ContainsItemForPath(path); - } -} diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItemType.cs b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItemType.cs deleted file mode 100644 index b5d411504..000000000 --- a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestItemType.cs +++ /dev/null @@ -1,44 +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. - -namespace Microsoft.AspNetCore.BuildTools.CodeSign -{ - /// - /// The type of the sign request item. - /// - public enum SignRequestItemType - { - /// - /// An unknown sign request item type. - /// - Unknown = -1, - - /// - /// A file that should be excluded from signing. - /// - /// In some cases, it can be useful to explicitly define files to be ignored by code-signing. - /// - /// - Exclusion, - - /// - /// A .zip archive - /// - Zip, - - /// - /// A NuGet package - /// - Nupkg, - - /// - /// A Visual Studio extension installer file - /// - Vsix, - - /// - /// A signable binary or powershell script. - /// - File, - } -} diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlReader.cs b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlReader.cs deleted file mode 100644 index 59bb48511..000000000 --- a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlReader.cs +++ /dev/null @@ -1,124 +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 System.Xml; -using System.Xml.Linq; - -namespace Microsoft.AspNetCore.BuildTools.CodeSign -{ - /// - /// Reads a sign request manifest xml fil. - /// - public class SignRequestManifestXmlReader - { - private readonly TextReader _reader; - private readonly string _manifestBasePath; - - /// - /// Load the sign request xml file. - /// - /// - /// - public static SignRequestCollection Load(string filePath) - { - using (var reader = File.OpenText(filePath)) - { - return Load(reader, Path.GetDirectoryName(filePath)); - } - } - - /// - /// Read the sign request xml using a given base path. - /// - /// - /// - /// - public static SignRequestCollection Load(TextReader reader, string manifestBasePath) - { - return new SignRequestManifestXmlReader(reader, manifestBasePath).Read(); - } - - private SignRequestManifestXmlReader(TextReader reader, string manifestBasePath) - { - _reader = reader; - _manifestBasePath = manifestBasePath; - } - - private SignRequestCollection Read() - { - var doc = XDocument.Load(_reader); - - var collection = new SignRequestCollection - { - BasePath = _manifestBasePath - }; - - foreach (var element in doc.Root.Elements()) - { - collection.Add(ReadElement(element)); - } - - return collection; - } - - private SignRequestItem ReadElement(XElement element) - { - switch (element.Name.ToString()) - { - case "Nupkg": - return ReadNupkg(element); - case "Vsix": - return ReadVsix(element); - case "Zip": - return ReadZip(element); - case "File": - return ReadFile(element); - case "ExcludedFile": - return ReadExclusion(element); - default: - IXmlLineInfo lineInfo = element; - throw new InvalidDataException($"Unrecognized element type {element.Name} on line {lineInfo.LineNumber}"); - } - } - - private static SignRequestItem ReadExclusion(XElement element) - => SignRequestItem.CreateExclusion(GetPath(element)); - - private static SignRequestItem ReadFile(XElement element) - => SignRequestItem.CreateFile(GetPath(element), GetCertificate(element), GetStrongName(element)); - - private SignRequestItem ReadNupkg(XElement element) - { - var package = SignRequestItem.CreateNugetPackage(GetPath(element), GetCertificate(element)); - AddChildren(element, package); - return package; - } - - private SignRequestItem ReadVsix(XElement element) - { - var vsix = SignRequestItem.CreateVsix(GetPath(element), GetCertificate(element)); - AddChildren(element, vsix); - return vsix; - } - - private SignRequestItem ReadZip(XElement element) - { - var zip = SignRequestItem.CreateZip(GetPath(element)); - AddChildren(element, zip); - return zip; - } - - private void AddChildren(XElement element, SignRequestItem package) - { - foreach (var child in element.Elements()) - { - package.AddChild(ReadElement(child)); - } - } - - private static string GetStrongName(XElement element) => element.Attribute(XmlElementNames.StrongName)?.Value; - private static string GetCertificate(XElement element) => element.Attribute(XmlElementNames.Certificate)?.Value; - private static string GetPath(XElement element) => element.Attribute(XmlElementNames.Path)?.Value; - } -} diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlWriter.cs b/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlWriter.cs deleted file mode 100644 index 86902213f..000000000 --- a/src/Internal.AspNetCore.CodeSign.Abstractions/SignRequestManifestXmlWriter.cs +++ /dev/null @@ -1,117 +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.IO; -using System.Text; -using System.Xml; -using System.Xml.Linq; - -namespace Microsoft.AspNetCore.BuildTools.CodeSign -{ - /// - /// Saves a to an xml file. - /// - public class SignRequestManifestXmlWriter : IDisposable - { - private readonly TextWriter _output; - private readonly XDocument _document; - - /// - /// Initalize an instance of - /// - /// - public SignRequestManifestXmlWriter(TextWriter output) - { - _output = output; - _document = new XDocument(new XElement("SignRequest")); - } - - /// - /// Add the collection to the output file - /// - /// - public void Write(SignRequestCollection signRequestCollection) - { - var node = _document.Root; - foreach (var request in signRequestCollection) - { - AddRequest(node, request); - } - } - - private static void AddRequest(XElement parent, SignRequestItem item) - { - var path = new XAttribute(XmlElementNames.Path, item.Path); - switch (item.ItemType) - { - case SignRequestItemType.Zip: - AddContainer(parent, item, XmlElementNames.Zip); - break; - case SignRequestItemType.Nupkg: - AddContainer(parent, item, XmlElementNames.Nupkg); - break; - case SignRequestItemType.Vsix: - AddContainer(parent, item, XmlElementNames.Vsix); - break; - case SignRequestItemType.Exclusion: - parent.Add(new XElement(XmlElementNames.ExcludedFile, path)); - break; - case SignRequestItemType.File: - var file = new XElement(XmlElementNames.File, path); - - if (!string.IsNullOrEmpty(item.Certificate)) - { - file.Add(new XAttribute(XmlElementNames.Certificate, item.Certificate)); - } - - if (!string.IsNullOrEmpty(item.StrongName)) - { - file.Add(new XAttribute(XmlElementNames.StrongName, item.StrongName)); - } - - parent.Add(file); - break; - default: - throw new InvalidOperationException("Unrecognized sign request item"); - } - } - - private static void AddContainer(XElement parent, SignRequestItem item, string elementType) - { - var container = new XElement(elementType, new XAttribute(XmlElementNames.Path, item.Path)); - - if (!string.IsNullOrEmpty(item.Certificate)) - { - container.Add(new XAttribute(XmlElementNames.Certificate, item.Certificate)); - } - - parent.Add(container); - - foreach (var i in item.Children) - { - AddRequest(container, i); - } - } - - private void Save() - { - var settings = new XmlWriterSettings - { - Encoding = Encoding.UTF8, - OmitXmlDeclaration = true, - Indent = true, - NewLineChars = "\r\n", - NewLineHandling = NewLineHandling.Replace, - }; - - using (var writer = XmlWriter.Create(_output, settings)) - { - _document.Save(writer); - } - } - - /// - public void Dispose() => Save(); - } -} diff --git a/src/Internal.AspNetCore.CodeSign.Abstractions/XmlElementNames.cs b/src/Internal.AspNetCore.CodeSign.Abstractions/XmlElementNames.cs deleted file mode 100644 index 2c2b22cda..000000000 --- a/src/Internal.AspNetCore.CodeSign.Abstractions/XmlElementNames.cs +++ /dev/null @@ -1,19 +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.Xml.Linq; - -namespace Microsoft.AspNetCore.BuildTools.CodeSign -{ - internal static class XmlElementNames - { - public static readonly string StrongName = "StrongName"; - public static readonly string Certificate = "Certificate"; - public static readonly string Path = "Path"; - public static readonly string File = "File"; - public static readonly string ExcludedFile = "ExcludedFile"; - public static readonly string Vsix = "Vsix"; - public static readonly string Nupkg = "Nupkg"; - public static readonly string Zip = "Zip"; - } -} diff --git a/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs b/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs index 46ce02d5d..ef4a019be 100644 --- a/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs +++ b/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs @@ -57,77 +57,6 @@ public void FullBuildCompletes() Assert.True(File.Exists(Path.Combine(app.WorkingDirectory, "obj", "tmp-nuget", "Simple.CliTool.1.0.0-beta-0001.nupkg")), "Build done a test push of all the packages"); Assert.True(File.Exists(Path.Combine(app.WorkingDirectory, "obj", "tmp-nuget", "Simple.Lib.1.0.0-beta-0001.nupkg")), "Build done a test push of all the packages"); Assert.True(File.Exists(Path.Combine(app.WorkingDirectory, "obj", "tmp-nuget", "Simple.Sources.1.0.0-beta-0001.nupkg")), "Build done a test push of all the packages"); - - // /t:GenerateSigningRequest - var signRequest = Path.Combine(app.WorkingDirectory, "artifacts", "signrequest.xml"); - Assert.True(File.Exists(signRequest), "Sign requests should have been generated"); - - var sign = XDocument.Load(signRequest); - var excluded = Assert.Single(sign.Descendants("ExcludedFile")); - Assert.Equal("build/Simple.Sources.1.0.0-beta-0001.nupkg", excluded.Attribute("Path")?.Value); - Assert.Collection(sign.Descendants("Nupkg"), - pkg => - { - Assert.Equal("build/Simple.CliTool.1.0.0-beta-0001.nupkg", pkg.Attribute("Path")?.Value); - Assert.Equal("MyPackageSigningCert", pkg.Attribute("Certificate")?.Value); - Assert.Collection(pkg.Descendants("File"), - a => - { - Assert.Equal("tools/netcoreapp2.1/any/Newtonsoft.Json.dll", a.Attribute("Path")?.Value); - Assert.Equal("Test3rdPartyCert", a.Attribute("Certificate")?.Value); - }, - a => - { - Assert.Equal("tools/netcoreapp2.1/any/cowsay.dll", a.Attribute("Path")?.Value); - Assert.Equal("TestCert", a.Attribute("Certificate")?.Value); - }, - a => - { - Assert.Equal("tools/netcoreapp2.1/any/shims/win-x64/cowsay.exe", a.Attribute("Path")?.Value); - Assert.Equal("TestCert", a.Attribute("Certificate")?.Value); - }, - a => - { - Assert.Equal("tools/netcoreapp2.1/any/shims/win-x86/cowsay.exe", a.Attribute("Path")?.Value); - Assert.Equal("TestCert", a.Attribute("Certificate")?.Value); - }); - }, - pkg => - { - Assert.Equal("build/Simple.CliTool.1.0.0-beta-0001.symbols.nupkg", pkg.Attribute("Path")?.Value); - }, - pkg => - { - Assert.Equal("build/Simple.Lib.1.0.0-beta-0001.nupkg", pkg.Attribute("Path")?.Value); - Assert.Null(pkg.Attribute("Certificate")); - Assert.Collection(pkg.Descendants("File"), - a => - { - Assert.Equal("lib/net461/Simple.Lib.dll", a.Attribute("Path")?.Value); - Assert.Equal("TestCert", a.Attribute("Certificate")?.Value); - }, - a => - { - Assert.Equal("lib/netstandard2.0/Simple.Lib.dll", a.Attribute("Path")?.Value); - Assert.Equal("TestCert", a.Attribute("Certificate")?.Value); - }); - }, - pkg => - { - Assert.Equal("build/Simple.Lib.1.0.0-beta-0001.symbols.nupkg", pkg.Attribute("Path")?.Value); - Assert.Null(pkg.Attribute("Certificate")); - Assert.Collection(pkg.Descendants("File"), - a => - { - Assert.Equal("lib/net461/Simple.Lib.dll", a.Attribute("Path")?.Value); - Assert.Equal("TestCert", a.Attribute("Certificate")?.Value); - }, - a => - { - Assert.Equal("lib/netstandard2.0/Simple.Lib.dll", a.Attribute("Path")?.Value); - Assert.Equal("TestCert", a.Attribute("Certificate")?.Value); - }); - }); } [Fact] diff --git a/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs b/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs deleted file mode 100644 index 3e247d64d..000000000 --- a/test/KoreBuild.Tasks.Tests/GenerateSignRequestsTests.cs +++ /dev/null @@ -1,118 +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; -using System.Collections.Generic; -using System.IO; -using System.Runtime.InteropServices; -using System.Text; -using BuildTools.Tasks.Tests; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using Xunit; -using Xunit.Abstractions; - -namespace KoreBuild.Tasks.Tests -{ - public class GenerateSignRequestTests - { - private readonly ITestOutputHelper _output; - - public GenerateSignRequestTests(ITestOutputHelper output) - { - _output = output; - } - - [Fact] - public void ItCreatesSignRequest() - { - var rootDir = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? "C:/" : "/"; - var nupkgPath = Path.Combine(AppContext.BaseDirectory, "build", "MyLib.nupkg"); - var requests = new ITaskItem[] - { - new TaskItem(Path.Combine(AppContext.BaseDirectory, "build", "ZZApp.vsix"), - new Hashtable - { - ["IsContainer"] = "true", - ["Certificate"] = "Cert4", - }), - new TaskItem(nupkgPath, - new Hashtable - { - ["IsContainer"] = "true", - ["Type"] = "nupkg", - }), - new TaskItem(Path.Combine(AppContext.BaseDirectory, "MyLib.dll"), - new Hashtable - { - ["Container"] = nupkgPath, - ["PackagePath"] = "lib/netstandard2.0/MyLib.dll", - ["Certificate"] = "Cert1", - ["StrongName"] = "Key1", - }), - new TaskItem(Path.Combine(AppContext.BaseDirectory, "MyRefLib.dll"), - new Hashtable - { - ["Container"] = nupkgPath, - ["PackagePath"] = "ref/netstandard2.0/", - ["Certificate"] = "Cert1", - ["StrongName"] = "Key1", - }), - new TaskItem(Path.Combine(AppContext.BaseDirectory, "build", "MyLib.dll"), - new Hashtable - { - ["Certificate"] = "Cert1", - }), - new MockTaskItem(Path.Combine(rootDir + "MyProject", "lib", "net461", "MyLib.dll")) - { - ["Container"] = nupkgPath, - ["MSBuildSourceProjectFile"] = rootDir + "MyProject/MyProject.csproj", - ["Certificate"] = "Cert1", - }, - }; - - var exclusions = new ITaskItem[] - { - new TaskItem(Path.Combine(AppContext.BaseDirectory, "NotMyLib.dll"), - new Hashtable - { - ["PackagePath"] = "lib/NotMyLib.dll", - ["Container"] = nupkgPath, - }), - new MockTaskItem(Path.Combine(rootDir + "MyProject", "tool", "net461", "NotMyLib.dll")) - { - ["Container"] = nupkgPath, - ["MSBuildSourceProjectFile"] = rootDir + "MyProject/MyProject.csproj", - }, - }; - - var task = new GenerateSignRequest - { - Requests = requests, - BasePath = AppContext.BaseDirectory, - Exclusions = exclusions, - BuildEngine = new MockEngine(_output), - }; - - var sb = new StringBuilder(); - - Assert.True(task.Execute(() => new StringWriter(sb)), "Task should pass"); - - var expected = $@" - - - - - - - - - -".Replace('`', '"'); - _output.WriteLine(sb.ToString()); - - Assert.Equal(expected, sb.ToString(), ignoreLineEndingDifferences: true, ignoreWhiteSpaceDifferences: true); - } - } -} diff --git a/test/NuGetPackageVerifier.Tests/Rules/SignRequestListsAllSignableFilesRuleTests.cs b/test/NuGetPackageVerifier.Tests/Rules/SignRequestListsAllSignableFilesRuleTests.cs deleted file mode 100644 index b728d3526..000000000 --- a/test/NuGetPackageVerifier.Tests/Rules/SignRequestListsAllSignableFilesRuleTests.cs +++ /dev/null @@ -1,105 +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 NuGetPackageVerifier.Rules; -using NuGetPackageVerifier.Utilities; -using Xunit; -using Xunit.Abstractions; - -namespace NuGetPackageVerifier -{ - public class SignRequestListsAllSignableFilesRuleTests - { - private readonly ITestOutputHelper _output; - - public SignRequestListsAllSignableFilesRuleTests(ITestOutputHelper output) - { - _output = output; - } - - [Fact] - public void ItFailsWhenPackageContainsUnlistedFiles() - { - var signRequest = @" - - - -"; - - var context = TestPackageAnalysisContext.CreateContext( - _output, - new[] { "lib/netstandard2.0/Test.dll", "tools/MyScript.psd1" }, - signRequest: signRequest); - - using (context) - { - var rule = new SignRequestListsAllSignableFiles(); - - var errors = rule.Validate(context); - - Assert.NotEmpty(errors); - - Assert.Contains(errors, e => - e.Instance.Equals("lib/netstandard2.0/Test.dll", StringComparison.Ordinal) && - e.IssueId.Equals("FILE_MISSING_FROM_SIGN_REQUEST", StringComparison.Ordinal)); - - Assert.Contains(errors, e => - e.Instance.Equals("tools/MyScript.psd1", StringComparison.Ordinal) && - e.IssueId.Equals("FILE_MISSING_FROM_SIGN_REQUEST", StringComparison.Ordinal)); - } - } - - [Fact] - public void DoesNotFailWhenSignRequestIncludesAllFiles() - { - var signRequest = @" - - - - - -"; - - var context = TestPackageAnalysisContext.CreateContext( - _output, - new[] { "lib/netstandard2.0/Test.dll", "tools/MyScript.psd1" }, - signRequest: signRequest); - - using (context) - { - var rule = new SignRequestListsAllSignableFiles(); - - var errors = rule.Validate(context); - - Assert.Empty(errors); - } - } - - [Fact] - public void DoesNotFailWhenSignRequestListsAllFiles() - { - var signRequest = @" - - - - - -"; - - var context = TestPackageAnalysisContext.CreateContext( - _output, - new[] { "lib/netstandard2.0/Test.dll", "tools/MyScript.psd1" }, - signRequest: signRequest); - - using (context) - { - var rule = new SignRequestListsAllSignableFiles(); - - var errors = rule.Validate(context); - - Assert.Empty(errors); - } - } - } -} diff --git a/test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs b/test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs index 73abaf6c9..d9386d28a 100644 --- a/test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs +++ b/test/NuGetPackageVerifier.Tests/Utilities/TestPackageAnalysisContext.cs @@ -3,7 +3,6 @@ using System.IO; using System.Linq; -using Microsoft.AspNetCore.BuildTools.CodeSign; using NuGet.Packaging; using NuGet.Versioning; using Xunit.Abstractions; @@ -23,8 +22,7 @@ private TestPackageAnalysisContext(DisposableDirectory disposableDirectory) public static PackageAnalysisContext CreateContext( ITestOutputHelper output, string[] emptyFiles, - string version = "1.0.0", - string signRequest = null) + string version = "1.0.0") { return Create(output, new ManifestMetadata @@ -32,15 +30,13 @@ public static PackageAnalysisContext CreateContext( Id = PackageId, Version = new NuGetVersion(version), }, - emptyFiles, - signRequest); + emptyFiles); } public static PackageAnalysisContext Create( ITestOutputHelper output, ManifestMetadata metadata, - string[] emptyFiles = null, - string signRequest = null) + string[] emptyFiles = null) { var disposableDirectory = new DisposableDirectory(); var basePath = disposableDirectory.Path; @@ -72,20 +68,10 @@ public static PackageAnalysisContext Create( builder.Save(nupkg); } - SignRequestItem packageSignRequest = null; - - if (signRequest != null) - { - var reader = new StringReader(signRequest); - var signManifest = SignRequestManifestXmlReader.Load(reader, basePath); - packageSignRequest = signManifest.First(f => f.Path == nupkgFileName); - } - var context = new TestPackageAnalysisContext(disposableDirectory) { Logger = new TestLogger(output), PackageFileInfo = new FileInfo(nupkgPath), - SignRequest = packageSignRequest, Metadata = builder, }; From 1752a1e5094d5439de770a88b88ef28c38c5c38c Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 7 Sep 2018 11:06:39 -0700 Subject: [PATCH 085/192] Remove MergeXmlFiles task This task is no longer in use and not supported --- modules/KoreBuild.Tasks/MergeXmlFiles.cs | 79 ------------------- modules/KoreBuild.Tasks/module.props | 1 - .../MergeXmlFilesTests.cs | 64 --------------- 3 files changed, 144 deletions(-) delete mode 100644 modules/KoreBuild.Tasks/MergeXmlFiles.cs delete mode 100644 test/KoreBuild.Tasks.Tests/MergeXmlFilesTests.cs diff --git a/modules/KoreBuild.Tasks/MergeXmlFiles.cs b/modules/KoreBuild.Tasks/MergeXmlFiles.cs deleted file mode 100644 index f2a01345c..000000000 --- a/modules/KoreBuild.Tasks/MergeXmlFiles.cs +++ /dev/null @@ -1,79 +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.IO; -using System.Text; -using System.Xml; -using System.Xml.Linq; -using Microsoft.AspNetCore.BuildTools.Utilities; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace KoreBuild.Tasks -{ - public class MergeXmlFiles : Task - { - [Required] - public string OutputPath { get; set; } - - [Required] - public ITaskItem[] Files { get; set; } - - public override bool Execute() - { - if (Files == null || Files.Length == 0) - { - Log.LogError("No files could be found to merge"); - return false; - } - - OutputPath = FileHelpers.NormalizePath(OutputPath); - Directory.CreateDirectory(Path.GetDirectoryName(OutputPath)); - - if (Files.Length == 1) - { - File.Copy(Files[0].ItemSpec, OutputPath); - return true; - } - - return Execute(() => File.CreateText(OutputPath)); - } - - protected internal bool Execute(Func writerFactory) - { - var newDoc = XDocument.Load(Files[0].ItemSpec, LoadOptions.PreserveWhitespace); - - for (var i = 1; i < Files.Length; i++) - { - var next = XDocument.Load(Files[i].ItemSpec, LoadOptions.PreserveWhitespace); - if (newDoc.Root.Name != next.Root.Name) - { - Log.LogError($"Can only merge documents with the same root element. {Files[0].ItemSpec} has <{newDoc.Root.Name}> but {Files[i].ItemSpec} has <{next.Root.Name}>"); - continue; - } - - newDoc.Root.Add(next.Root.DescendantNodes()); - - foreach (var attr in next.Root.Attributes()) - { - newDoc.Root.SetAttributeValue(attr.Name, attr.Value); - } - } - - var settings = new XmlWriterSettings - { - OmitXmlDeclaration = true, - Encoding = Encoding.UTF8, - }; - - using (var writer = writerFactory()) - using (var xmlWriter = XmlWriter.Create(writer, settings)) - { - newDoc.Save(xmlWriter); - } - - return !Log.HasLoggedErrors; - } - } -} diff --git a/modules/KoreBuild.Tasks/module.props b/modules/KoreBuild.Tasks/module.props index 4b07d040b..76af3e126 100644 --- a/modules/KoreBuild.Tasks/module.props +++ b/modules/KoreBuild.Tasks/module.props @@ -13,7 +13,6 @@ - diff --git a/test/KoreBuild.Tasks.Tests/MergeXmlFilesTests.cs b/test/KoreBuild.Tasks.Tests/MergeXmlFilesTests.cs deleted file mode 100644 index abf51b645..000000000 --- a/test/KoreBuild.Tasks.Tests/MergeXmlFilesTests.cs +++ /dev/null @@ -1,64 +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 System.Text; -using BuildTools.Tasks.Tests; -using Microsoft.Build.Utilities; -using Xunit; -using Xunit.Abstractions; - -namespace KoreBuild.Tasks.Tests -{ - [Collection(nameof(MSBuildTestCollection))] - public class MergeXmlFilesTests : TaskTestBase - { - public MergeXmlFilesTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) : base(output, fixture) - { - } - - [Fact] - public void ItMergesXmlFiles() - { - var items = new[] - { - new TaskItem(Path.Combine(TempDir, "file1.xml")), - new TaskItem(Path.Combine(TempDir, "file2.xml")), - }; - File.WriteAllText(items[0].ItemSpec, ""); - File.WriteAllText(items[1].ItemSpec, ""); - - var sb = new StringBuilder(); - - var task = new MergeXmlFiles - { - BuildEngine = MockEngine, - Files = items, - }; - Assert.True(task.Execute(() => new StringWriter(sb)), "Task should pass"); - - Assert.Equal("", sb.ToString()); - } - - [Fact] - public void ItFailsIfRootNodeIsDifferent() - { - var items = new[] - { - new TaskItem(Path.Combine(TempDir, "file3.xml")), - new TaskItem(Path.Combine(TempDir, "file4.xml")), - }; - File.WriteAllText(items[0].ItemSpec, ""); - File.WriteAllText(items[1].ItemSpec, ""); - - var sb = new StringBuilder(); - - var task = new MergeXmlFiles - { - BuildEngine = new MockEngine(Output) { ContinueOnError = true }, - Files = items, - }; - Assert.False(task.Execute(() => new StringWriter(sb)), "Task should fail"); - } - } -} From 078918eb5c1f176ee1da351c584fb4a4d7491aa0 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 7 Sep 2018 11:07:31 -0700 Subject: [PATCH 086/192] Delete Microsoft.DotNet.GlobalTools.Sdk --- BuildTools.sln | 7 --- files/KoreBuild/scripts/KoreBuild.psm1 | 1 - .../scripts/invoke-repository-build.sh | 1 - modules/BundledPackages/BundledPackages.proj | 2 - .../Microsoft.DotNet.GlobalTools.Sdk.csproj | 26 ----------- .../Microsoft.DotNet.GlobalTools.Sdk.nuspec | 19 -------- .../README.md | 43 ------------------- src/Microsoft.DotNet.GlobalTools.Sdk/_._ | 0 .../sdk/Sdk.props | 5 --- .../sdk/Sdk.targets | 10 ----- test.ps1 | 1 - .../Utilities/RepoTestFixture.cs | 1 - 12 files changed, 116 deletions(-) delete mode 100644 src/Microsoft.DotNet.GlobalTools.Sdk/Microsoft.DotNet.GlobalTools.Sdk.csproj delete mode 100644 src/Microsoft.DotNet.GlobalTools.Sdk/Microsoft.DotNet.GlobalTools.Sdk.nuspec delete mode 100644 src/Microsoft.DotNet.GlobalTools.Sdk/README.md delete mode 100644 src/Microsoft.DotNet.GlobalTools.Sdk/_._ delete mode 100644 src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.props delete mode 100644 src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.targets diff --git a/BuildTools.sln b/BuildTools.sln index b3d131404..cd528bb4b 100644 --- a/BuildTools.sln +++ b/BuildTools.sln @@ -92,8 +92,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Internal.AspNetCore.SiteExt EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetPackageVerifier.Tests", "test\NuGetPackageVerifier.Tests\NuGetPackageVerifier.Tests.csproj", "{439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}" EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.DotNet.GlobalTools.Sdk", "src\Microsoft.DotNet.GlobalTools.Sdk\Microsoft.DotNet.GlobalTools.Sdk.csproj", "{449E2FD8-AE30-4C4E-8FC2-E797B99CF339}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -168,10 +166,6 @@ Global {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Debug|Any CPU.Build.0 = Debug|Any CPU {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Release|Any CPU.ActiveCfg = Release|Any CPU {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Release|Any CPU.Build.0 = Release|Any CPU - {449E2FD8-AE30-4C4E-8FC2-E797B99CF339}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {449E2FD8-AE30-4C4E-8FC2-E797B99CF339}.Debug|Any CPU.Build.0 = Debug|Any CPU - {449E2FD8-AE30-4C4E-8FC2-E797B99CF339}.Release|Any CPU.ActiveCfg = Release|Any CPU - {449E2FD8-AE30-4C4E-8FC2-E797B99CF339}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -195,7 +189,6 @@ Global {605F0478-A9D2-4A8A-BB38-9D5DC132FBB5} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} {418F99A5-5EC4-4895-B8EB-7F8BBA241DB2} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76} {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} - {449E2FD8-AE30-4C4E-8FC2-E797B99CF339} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {1B8809C8-A6C3-4761-BC91-B12841F49AE1} diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index f574136f9..024fad7a1 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -374,7 +374,6 @@ function Invoke-KoreBuildCommand( `"version`": `"$sdkVersion`" }, `"msbuild-sdks`": { - `"Microsoft.DotNet.GlobalTools.Sdk`": `"$korebuildVersion`", `"Internal.AspNetCore.Sdk`": `"$korebuildVersion`" } } diff --git a/files/KoreBuild/scripts/invoke-repository-build.sh b/files/KoreBuild/scripts/invoke-repository-build.sh index 4663d823d..e978380ec 100755 --- a/files/KoreBuild/scripts/invoke-repository-build.sh +++ b/files/KoreBuild/scripts/invoke-repository-build.sh @@ -66,7 +66,6 @@ if [ "$sdk_version" != 'latest' ]; then \"version\": \"${sdk_version}\" }, \"msbuild-sdks\": { - \"Microsoft.DotNet.GlobalTools.Sdk\": \"${korebuild_version}\", \"Internal.AspNetCore.Sdk\": \"${korebuild_version}\" } }" > "$repo_path/global.json" diff --git a/modules/BundledPackages/BundledPackages.proj b/modules/BundledPackages/BundledPackages.proj index 7a20e51a0..a84a06e85 100644 --- a/modules/BundledPackages/BundledPackages.proj +++ b/modules/BundledPackages/BundledPackages.proj @@ -5,7 +5,6 @@ - - diff --git a/src/Microsoft.DotNet.GlobalTools.Sdk/Microsoft.DotNet.GlobalTools.Sdk.csproj b/src/Microsoft.DotNet.GlobalTools.Sdk/Microsoft.DotNet.GlobalTools.Sdk.csproj deleted file mode 100644 index f740db844..000000000 --- a/src/Microsoft.DotNet.GlobalTools.Sdk/Microsoft.DotNet.GlobalTools.Sdk.csproj +++ /dev/null @@ -1,26 +0,0 @@ - - - - - netcoreapp2.1 - $(MSBuildThisFileDirectory)$(MSBuildProjectName).nuspec - false - true - false - false - false - - - - - $(NuspecProperties);id=$(PackageId) - $(NuspecProperties);version=$(PackageVersion) - $(NuspecProperties);copyright=$(Copyright) - - - - - - - - diff --git a/src/Microsoft.DotNet.GlobalTools.Sdk/Microsoft.DotNet.GlobalTools.Sdk.nuspec b/src/Microsoft.DotNet.GlobalTools.Sdk/Microsoft.DotNet.GlobalTools.Sdk.nuspec deleted file mode 100644 index ed9dcdc83..000000000 --- a/src/Microsoft.DotNet.GlobalTools.Sdk/Microsoft.DotNet.GlobalTools.Sdk.nuspec +++ /dev/null @@ -1,19 +0,0 @@ - - - - $id$ - $version$ - Microsoft - false - Provides additional support to .NET Core teams producing global CLI tools. This package is only intended for internal Microsoft use. - $copyright$ - - - - - - - - - - diff --git a/src/Microsoft.DotNet.GlobalTools.Sdk/README.md b/src/Microsoft.DotNet.GlobalTools.Sdk/README.md deleted file mode 100644 index 2a271c322..000000000 --- a/src/Microsoft.DotNet.GlobalTools.Sdk/README.md +++ /dev/null @@ -1,43 +0,0 @@ -Microsoft.DotNet.GlobalTools.Sdk -================================ - -Provides additional support to .NET Core teams producing global CLI tools. This package is only intended for internal Microsoft use. - -## Usage -Projects that need to bundle and sign the global CLI tool shim should add this to their .csproj file. This will include files in the .nupkg. - -```xml - - - - - - - true - true - - -``` - -```js -// in global.json -{ - "msbuild-sdks": { - "Microsoft.DotNet.GlobalTools.Sdk": "2.1.0-rtm-12345" - } -} -``` - -### Additional options - -#### `GenerateToolShims` (property) - -A boolean flag. When `true`, tool shims will be generated for each RID listed in `GeneratedShimRuntimeIdentifiers` and included in the .nupkg. - -Default value = `false` - -#### `GeneratedShimRuntimeIdentifiers` (property) - -A semi-colon separate list of RIDs for which to generate and pack the shim. - -Default value = `win-x86;win-x64` diff --git a/src/Microsoft.DotNet.GlobalTools.Sdk/_._ b/src/Microsoft.DotNet.GlobalTools.Sdk/_._ deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.props b/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.props deleted file mode 100644 index 2d455bed4..000000000 --- a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.props +++ /dev/null @@ -1,5 +0,0 @@ - - - win-x86;win-x64 - - diff --git a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.targets b/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.targets deleted file mode 100644 index 345d35bb9..000000000 --- a/src/Microsoft.DotNet.GlobalTools.Sdk/sdk/Sdk.targets +++ /dev/null @@ -1,10 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - - - - - diff --git a/test.ps1 b/test.ps1 index ee9f90aa5..f5d7de316 100755 --- a/test.ps1 +++ b/test.ps1 @@ -38,7 +38,6 @@ $Arguments += , "/p:DotNetRestoreSources=$packageDir" foreach ($pkg in @( "Internal.AspNetCore.Sdk", "Internal.AspNetCore.SiteExtension.Sdk", - "Microsoft.DotNet.GlobalTools.Sdk", "Microsoft.AspNetCore.BuildTools.ApiCheck")) { $pkgRoot = "${env:USERPROFILE}/.nuget/packages/$pkg/$toolsVersion/" diff --git a/test/KoreBuild.FunctionalTests/Utilities/RepoTestFixture.cs b/test/KoreBuild.FunctionalTests/Utilities/RepoTestFixture.cs index 3a62e7d8e..ea5edaff7 100644 --- a/test/KoreBuild.FunctionalTests/Utilities/RepoTestFixture.cs +++ b/test/KoreBuild.FunctionalTests/Utilities/RepoTestFixture.cs @@ -17,7 +17,6 @@ public class RepoTestFixture : IDisposable "Internal.AspNetCore.Sdk", "Internal.AspNetCore.SiteExtension.Sdk", "Microsoft.AspNetCore.BuildTools.ApiCheck", - "Microsoft.DotNet.GlobalTools.Sdk", }; private static readonly string _solutionDir; From d2408c7c7f349e70dea569e911da947c8307c10e Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Wed, 5 Sep 2018 15:15:03 -0700 Subject: [PATCH 087/192] dotnet-install use a lockfile --- files/KoreBuild/scripts/dotnet-install.ps1 | 85 +++++++++++++--------- files/KoreBuild/scripts/dotnet-install.sh | 21 +++++- 2 files changed, 71 insertions(+), 35 deletions(-) diff --git a/files/KoreBuild/scripts/dotnet-install.ps1 b/files/KoreBuild/scripts/dotnet-install.ps1 index 14ebe11af..2b014076d 100644 --- a/files/KoreBuild/scripts/dotnet-install.ps1 +++ b/files/KoreBuild/scripts/dotnet-install.ps1 @@ -192,7 +192,6 @@ function GetHTTPResponse([Uri] $Uri) { Invoke-With-Retry( { - $HttpClient = $null try { @@ -248,7 +247,6 @@ function GetHTTPResponse([Uri] $Uri) }) } - function Get-Latest-Version-Info([string]$AzureFeed, [string]$Channel, [bool]$Coherent) { Say-Invocation $MyInvocation @@ -286,7 +284,6 @@ function Get-Latest-Version-Info([string]$AzureFeed, [string]$Channel, [bool]$Co return $VersionInfo } - function Get-Specific-Version-From-Version([string]$AzureFeed, [string]$Channel, [string]$Version) { Say-Invocation $MyInvocation @@ -544,46 +541,66 @@ if ($isAssetInstalled) { } New-Item -ItemType Directory -Force -Path $InstallRoot | Out-Null +$lockFile = Join-Path $InstallRoot "dotnetinstall.lock" -$installDrive = $((Get-Item $InstallRoot).PSDrive.Name); -$free = Get-CimInstance -Class win32_logicaldisk | where Deviceid -eq "${installDrive}:" -if ($free.Freespace / 1MB -le 100 ) { - Say "There is not enough disk space on drive ${installDrive}:" - exit 0 +$waitTime = 0 +while((Test-Path $lockFile) -and ($waitTime -lt 120)) +{ + Say "Another installation of .NET Core is in process. Waiting for that installation to complete..." + Start-Sleep -Seconds 10 + $waitTime += 10 } -$ZipPath = [System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName()) -Say-Verbose "Zip path: $ZipPath" -Say "Downloading link: $DownloadLink" -try { - DownloadFile -Uri $DownloadLink -OutPath $ZipPath +if($waitTime -gt 120) +{ + throw "Timed out waiting for $lockFile to be removed." } -catch { - Say "Cannot download: $DownloadLink" - if ($LegacyDownloadLink) { - $DownloadLink = $LegacyDownloadLink - $ZipPath = [System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName()) - Say-Verbose "Legacy zip path: $ZipPath" - Say "Downloading legacy link: $DownloadLink" + +New-Item -ItemType file $lockFile +try{ + $installDrive = $((Get-Item $InstallRoot).PSDrive.Name); + $free = Get-CimInstance -Class win32_logicaldisk | where Deviceid -eq "${installDrive}:" + if ($free.Freespace / 1MB -le 100 ) { + Say "There is not enough disk space on drive ${installDrive}:" + exit 0 + } + + $ZipPath = [System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName()) + Say-Verbose "Zip path: $ZipPath" + Say "Downloading link: $DownloadLink" + try { DownloadFile -Uri $DownloadLink -OutPath $ZipPath } - else { - throw "Could not download $assetName version $SpecificVersion" + catch { + Say "Cannot download: $DownloadLink" + if ($LegacyDownloadLink) { + $DownloadLink = $LegacyDownloadLink + $ZipPath = [System.IO.Path]::combine([System.IO.Path]::GetTempPath(), [System.IO.Path]::GetRandomFileName()) + Say-Verbose "Legacy zip path: $ZipPath" + Say "Downloading legacy link: $DownloadLink" + DownloadFile -Uri $DownloadLink -OutPath $ZipPath + } + else { + throw "Could not download $assetName version $SpecificVersion" + } } -} -Say "Extracting zip from $DownloadLink" -Extract-Dotnet-Package -ZipPath $ZipPath -OutPath $InstallRoot + Say "Extracting zip from $DownloadLink" + Extract-Dotnet-Package -ZipPath $ZipPath -OutPath $InstallRoot -# Check if the SDK version is now installed; if not, fail the installation. -$isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $SpecificVersion -if (!$isAssetInstalled) { - throw "$assetName version $SpecificVersion failed to install with an unknown error." -} + # Check if the SDK version is now installed; if not, fail the installation. + $isAssetInstalled = Is-Dotnet-Package-Installed -InstallRoot $InstallRoot -RelativePathToPackage $dotnetPackageRelativePath -SpecificVersion $SpecificVersion + if (!$isAssetInstalled) { + throw "$assetName version $SpecificVersion failed to install with an unknown error." + } -Remove-Item $ZipPath + Remove-Item $ZipPath -Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot -BinFolderRelativePath $BinFolderRelativePath + Prepend-Sdk-InstallRoot-To-Path -InstallRoot $InstallRoot -BinFolderRelativePath $BinFolderRelativePath -Say "Installation finished" -exit 0 + Say "Installation finished" + exit 0 +} +finally{ + Remove-Item -Path $lockFile +} diff --git a/files/KoreBuild/scripts/dotnet-install.sh b/files/KoreBuild/scripts/dotnet-install.sh index 6dda76038..549b85f02 100755 --- a/files/KoreBuild/scripts/dotnet-install.sh +++ b/files/KoreBuild/scripts/dotnet-install.sh @@ -210,7 +210,6 @@ machine_has() { return $? } - check_min_reqs() { local hasMinimum=false if machine_has "curl"; then @@ -766,6 +765,26 @@ install_dotnet() { fi mkdir -p "$install_root" + + lockFile="$install_root/dotnetinstall.lock" + waitTime=0 + while [ -f "$lockFile" ] && [ $waitTime -lt 120 ] + do + say "Another installation of .NET Core is in process. Waiting for that installation to complete..." + sleep 10 + let "waitTime += 10" + done + + if [ $waitTime -ge 120 ]; then + say_err "Timed out waiting for $lockFile to be removed." + exit 1 + fi + touch $lockFile + function finish { + rm $lockFile + } + trap finish EXIT + zip_path="$(mktemp "$temporary_file_template")" say_verbose "Zip path: $zip_path" From 0743ba80227b69b785b28360bd73d1289d358423 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Mon, 10 Sep 2018 16:21:19 -0700 Subject: [PATCH 088/192] Use real TC statuses --- modules/NuGetPackageVerifier/console/Logging/TeamCityLogger.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/NuGetPackageVerifier/console/Logging/TeamCityLogger.cs b/modules/NuGetPackageVerifier/console/Logging/TeamCityLogger.cs index bc4d5d530..c1f0ce0f7 100644 --- a/modules/NuGetPackageVerifier/console/Logging/TeamCityLogger.cs +++ b/modules/NuGetPackageVerifier/console/Logging/TeamCityLogger.cs @@ -34,7 +34,7 @@ public void Log(LogLevel logLevel, string message) status = "NORMAL"; break; default: - status = "INFORMATION"; + status = "NORMAL"; break; } From ddfecdfc6e8e4859db5a0daea578070b862aac65 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Tue, 11 Sep 2018 14:44:45 -0700 Subject: [PATCH 089/192] Fix lockfile on windows --- files/KoreBuild/scripts/dotnet-install.ps1 | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/files/KoreBuild/scripts/dotnet-install.ps1 b/files/KoreBuild/scripts/dotnet-install.ps1 index 2b014076d..c75037465 100644 --- a/files/KoreBuild/scripts/dotnet-install.ps1 +++ b/files/KoreBuild/scripts/dotnet-install.ps1 @@ -544,19 +544,25 @@ New-Item -ItemType Directory -Force -Path $InstallRoot | Out-Null $lockFile = Join-Path $InstallRoot "dotnetinstall.lock" $waitTime = 0 -while((Test-Path $lockFile) -and ($waitTime -lt 120)) -{ - Say "Another installation of .NET Core is in process. Waiting for that installation to complete..." - Start-Sleep -Seconds 10 - $waitTime += 10 +$success = $false +$maxWait = 120 +while (($waitTime -lt $maxWait) -and ($success -eq $false)) { + try{ + New-Item -ItemType file $lockFile -ErrorAction Stop + $success = $true + } + catch{ + Say "Another installation of .NET Core is in process. Waiting for that installation to complete..." + Start-Sleep -Seconds 10 + $waitTime += 10 + } } -if($waitTime -gt 120) +if($waitTime -ge $maxWait) { throw "Timed out waiting for $lockFile to be removed." } -New-Item -ItemType file $lockFile try{ $installDrive = $((Get-Item $InstallRoot).PSDrive.Name); $free = Get-CimInstance -Class win32_logicaldisk | where Deviceid -eq "${installDrive}:" From ad5e3fc53442741a0dd49bce437d2ac72f4b5800 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Tue, 18 Sep 2018 16:37:08 -0700 Subject: [PATCH 090/192] Make lockfile creation atomic in .sh (#762) Make lockfile creation atomic in .sh --- files/KoreBuild/scripts/dotnet-install.sh | 24 ++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/files/KoreBuild/scripts/dotnet-install.sh b/files/KoreBuild/scripts/dotnet-install.sh index 549b85f02..7da42e81d 100755 --- a/files/KoreBuild/scripts/dotnet-install.sh +++ b/files/KoreBuild/scripts/dotnet-install.sh @@ -600,7 +600,8 @@ copy_files_or_dirs_from_list() { else printf -- "-n"; fi - fi) + fi + ) cat | uniq | while read -r file_path; do local path="$(remove_beginning_slash "${file_path#$root_path}")" @@ -768,22 +769,23 @@ install_dotnet() { lockFile="$install_root/dotnetinstall.lock" waitTime=0 - while [ -f "$lockFile" ] && [ $waitTime -lt 120 ] + + # Does a lock file with our PID exist? + while [ -e ${lockFile} ] && kill -0 `cat ${lockFile}` do + say "Another installation of .NET Core is in process. Waiting for that installation to complete..." sleep 10 let "waitTime += 10" + if [ $waitTime -gt 120 ]; then + say_err "Timed out waiting for $lockFile to be removed." + exit 1 + fi done - if [ $waitTime -ge 120 ]; then - say_err "Timed out waiting for $lockFile to be removed." - exit 1 - fi - touch $lockFile - function finish { - rm $lockFile - } - trap finish EXIT + # make sure the lockfile is removed when we exit and then claim it + trap "rm -f ${lockFile}; exit" INT TERM EXIT + echo $$ > ${lockFile} zip_path="$(mktemp "$temporary_file_template")" say_verbose "Zip path: $zip_path" From 3066ae0a230870ea07e3f132605b5e5493f8bbd4 Mon Sep 17 00:00:00 2001 From: dotnet-maestro-bot Date: Wed, 19 Sep 2018 15:14:58 -0700 Subject: [PATCH 091/192] Make lockfile creation atomic in .sh (#762) (#764) Make lockfile creation atomic in .sh --- files/KoreBuild/scripts/dotnet-install.sh | 24 ++++++++++++----------- 1 file changed, 13 insertions(+), 11 deletions(-) diff --git a/files/KoreBuild/scripts/dotnet-install.sh b/files/KoreBuild/scripts/dotnet-install.sh index 549b85f02..7da42e81d 100755 --- a/files/KoreBuild/scripts/dotnet-install.sh +++ b/files/KoreBuild/scripts/dotnet-install.sh @@ -600,7 +600,8 @@ copy_files_or_dirs_from_list() { else printf -- "-n"; fi - fi) + fi + ) cat | uniq | while read -r file_path; do local path="$(remove_beginning_slash "${file_path#$root_path}")" @@ -768,22 +769,23 @@ install_dotnet() { lockFile="$install_root/dotnetinstall.lock" waitTime=0 - while [ -f "$lockFile" ] && [ $waitTime -lt 120 ] + + # Does a lock file with our PID exist? + while [ -e ${lockFile} ] && kill -0 `cat ${lockFile}` do + say "Another installation of .NET Core is in process. Waiting for that installation to complete..." sleep 10 let "waitTime += 10" + if [ $waitTime -gt 120 ]; then + say_err "Timed out waiting for $lockFile to be removed." + exit 1 + fi done - if [ $waitTime -ge 120 ]; then - say_err "Timed out waiting for $lockFile to be removed." - exit 1 - fi - touch $lockFile - function finish { - rm $lockFile - } - trap finish EXIT + # make sure the lockfile is removed when we exit and then claim it + trap "rm -f ${lockFile}; exit" INT TERM EXIT + echo $$ > ${lockFile} zip_path="$(mktemp "$temporary_file_template")" say_verbose "Zip path: $zip_path" From eb5a274c4ae3d407791404ce7e80d31286313f1a Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 28 Sep 2018 12:02:40 -0700 Subject: [PATCH 092/192] Implement MicroBuild code signing (#766) This transforms MSBuild items (see docs/Signing.md) into a manifest which is then invoked by the Roslyn sign tool. In environments with MicroBuild enabled, this will run code signing. In local developer builds, this tool will do a dry run that validates the assemblies in .nupkgs are account file in the sign data --- build/dependencies.props | 2 + build/sources.props | 1 + docs/Signing.md | 23 +++-- files/KoreBuild/KoreBuild.Common.props | 6 ++ .../solutionbuild/Project.Inspection.targets | 20 +++-- modules/KoreBuild.Tasks/CodeSign.targets | 48 ++++++++++ .../GenerateSignToolDataFile.cs | 87 +++++++++++++++++++ .../KoreBuild.Tasks/GetPathToFullMSBuild.cs | 42 +++++++++ .../KoreBuild.Tasks/KoreBuild.Tasks.csproj | 5 ++ modules/KoreBuild.Tasks/Utilities/VsWhere.cs | 3 + modules/KoreBuild.Tasks/module.props | 2 + modules/KoreBuild.Tasks/module.targets | 2 + .../Internal.AspNetCore.Sdk.csproj | 2 + .../Internal.AspNetCore.Sdk.nuspec | 1 + .../build/Common.props | 10 +++ .../build/DotNetTool.targets | 2 +- .../sdk/DefaultItems.targets | 8 ++ 17 files changed, 252 insertions(+), 12 deletions(-) create mode 100644 modules/KoreBuild.Tasks/CodeSign.targets create mode 100644 modules/KoreBuild.Tasks/GenerateSignToolDataFile.cs create mode 100644 modules/KoreBuild.Tasks/GetPathToFullMSBuild.cs diff --git a/build/dependencies.props b/build/dependencies.props index 361efe067..a00b4c493 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -1,6 +1,7 @@ 1.5.1 + 0.2.0 2.0.0 2.1.0 15.6.1 @@ -11,6 +12,7 @@ 10.0.1 4.7.0-rtm.5148 4.7.0-rtm.5148 + 1.0.0-beta2-63206-01 1.4.0 1.5.0 2.2.7 diff --git a/build/sources.props b/build/sources.props index 28f0c4e92..affdd8b44 100644 --- a/build/sources.props +++ b/build/sources.props @@ -8,6 +8,7 @@ https://dotnet.myget.org/F/dotnet-core/api/v3/index.json; https://dotnet.myget.org/F/nuget-build/api/v3/index.json; https://dotnet.myget.org/F/msbuild/api/v3/index.json; + https://dotnet.myget.org/F/roslyn-tools/api/v3/index.json; https://api.nuget.org/v3/index.json; diff --git a/docs/Signing.md b/docs/Signing.md index d29769185..8a949e32e 100644 --- a/docs/Signing.md +++ b/docs/Signing.md @@ -24,7 +24,7 @@ To sign NuGet packages, set the PackageSigningCertName property in the \*.csproj ```xml - NuGetCert + MyNuGetCert ``` @@ -35,10 +35,23 @@ For assemblies that ship in a NuGet package, you can specify multiple properties ```xml MyCert - NuGetCert + MyNuGetCert ``` +### Recommended cert names for Microsoft projects + +The following certificate names should be used for Microsoft projects. These MSBuild properties are also available by using Internal.AspNetCore.SDK. + +```xml + Microsoft400 + 3PartySHA2 + Microsoft400 + NuGet + VsixSHA2 + MicrosoftJAR +``` + ### Projects using nuspec When creating a NuGet package via nuspec + csproj, KoreBuild cannot detect which assemblies @@ -70,7 +83,7 @@ Sometimes other signable assemblies end up in a nupkg. Signing for these file ty PackagePath="tasks/net461/$(TargetFileName)" Visible="false" /> - + @@ -95,9 +108,9 @@ these elements to the `build/repo.props` file. (See also [KoreBuild.md](./KoreBu ```xml - + - + ``` diff --git a/files/KoreBuild/KoreBuild.Common.props b/files/KoreBuild/KoreBuild.Common.props index 114199ad8..2fc5d3c80 100644 --- a/files/KoreBuild/KoreBuild.Common.props +++ b/files/KoreBuild/KoreBuild.Common.props @@ -39,6 +39,12 @@ Default layout and configuration. $(ArtifactsDir)build\ $(ArtifactsDir)logs\ $([MSBuild]::NormalizeDirectory('$(RepositoryRoot)'))obj\ + + $(NUGET_PACKAGES) + $(USERPROFILE)\.nuget\packages\ + $(HOME)\.nuget\packages\ + $(RepositoryRoot)\.nuget\packages\ + $([MSBuild]::NormalizeDirectory('$(NuGetPackageRoot)')) diff --git a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets index 4c6ee1a29..b8083db75 100644 --- a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets +++ b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets @@ -20,6 +20,14 @@ true + + + + + + + + NuGetPackage @@ -32,7 +40,7 @@ $(RepositoryUrl) $(PackageArtifactCategory) $(PackageSigningCertName) - true + true false true @@ -49,27 +57,27 @@ $(RepositoryUrl) $(PackageArtifactCategory) $(PackageSigningCertName) - true + true false true - + true $(FullPackageOutputPath) - + false $(FullPackageOutputPath) - + true $(SymbolsPackageOutputPath) - + false $(SymbolsPackageOutputPath) diff --git a/modules/KoreBuild.Tasks/CodeSign.targets b/modules/KoreBuild.Tasks/CodeSign.targets new file mode 100644 index 000000000..f78d7fe6e --- /dev/null +++ b/modules/KoreBuild.Tasks/CodeSign.targets @@ -0,0 +1,48 @@ + + + $(MSBuildThisFileDirectory)SignTool\SignTool.exe + true + + <_IntermediateSignToolDataFile>$(IntermediateDir)SignToolData.g.json + + + true + + + $(_IntermediateSignToolDataFile) + + + $(RepositoryRoot) + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/modules/KoreBuild.Tasks/GenerateSignToolDataFile.cs b/modules/KoreBuild.Tasks/GenerateSignToolDataFile.cs new file mode 100644 index 000000000..118c8c55d --- /dev/null +++ b/modules/KoreBuild.Tasks/GenerateSignToolDataFile.cs @@ -0,0 +1,87 @@ +// 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.Collections.Generic; +using System.IO; +using System.Linq; +using Microsoft.Build.Framework; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace KoreBuild.Tasks +{ + /// + /// Generates a signdata.json file for the Roslyn SignTool to execute + /// + public class GenerateSignToolDataFile : Microsoft.Build.Utilities.Task + { + [Required] + public ITaskItem[] Files { get; set; } + public ITaskItem[] Exclusions { get; set; } + + /// + /// The path to SignData.json file + /// + [Required] + public string OutputPath { get; set; } + + public override bool Execute() + { + OutputPath = OutputPath.Replace('\\', '/'); + + var data = new JObject(); + var signData = new JArray(); + data["sign"] = signData; + + if (Files != null) + { + foreach (var certificateGroup in Files.GroupBy(i => (Certificate: i.GetMetadata("Certificate"), StrongName: i.GetMetadata("StrongName")))) + { + var values = new HashSet(); + foreach (var item in certificateGroup) + { + values.Add(item.ItemSpec); + } + + var certName = string.IsNullOrEmpty(certificateGroup.Key.Certificate) + ? null // needs to be null, not an empty string, + : certificateGroup.Key.Certificate; + + var strongName = string.IsNullOrEmpty(certificateGroup.Key.StrongName) + ? null // needs to be null, not an empty string, + : certificateGroup.Key.StrongName; + + signData.Add(new JObject + { + ["certificate"] = certName, + ["strongName"] = strongName, + ["values"] = new JArray(values), + }); + } + } + + if (Exclusions != null) + { + var exclusions = new HashSet(); + foreach (var item in Exclusions) + { + exclusions.Add(Path.GetFileName(item.ItemSpec)); + } + + data["exclude"] = new JArray(exclusions); + } + + Directory.CreateDirectory(Path.GetDirectoryName(OutputPath)); + + Log.LogMessage("Generating sign data in {0}", OutputPath); + + using (var file = File.CreateText(OutputPath)) + using (var jsonWriter = new JsonTextWriter(file) { Formatting = Formatting.Indented }) + { + data.WriteTo(jsonWriter); + } + + return !Log.HasLoggedErrors; + } + } +} diff --git a/modules/KoreBuild.Tasks/GetPathToFullMSBuild.cs b/modules/KoreBuild.Tasks/GetPathToFullMSBuild.cs new file mode 100644 index 000000000..639ef90c8 --- /dev/null +++ b/modules/KoreBuild.Tasks/GetPathToFullMSBuild.cs @@ -0,0 +1,42 @@ +// 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.Runtime.InteropServices; +using KoreBuild.Tasks.Utilities; +using Microsoft.Build.Framework; + +namespace KoreBuild.Tasks +{ + /// + /// Finds toolset information as listed in korebuild.json + /// + public class GetPathToFullMSBuild : Microsoft.Build.Utilities.Task + { + /// + /// The path to MSBuild.exe (x86). + /// + [Output] + public string MSBuildx86Path { get; set; } + + public override bool Execute() + { + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + Log.LogError("Full MSBuild is not available on non-Windows."); + return false; + } + + var vs = VsWhere.FindLatestInstallation(includePrerelease: true, Log); + + if (vs == null) + { + Log.LogError($"Could not find an installation of Visual Studio."); + return false; + } + + MSBuildx86Path = vs.GetMSBuildx86SubPath(); + + return !Log.HasLoggedErrors; + } + } +} diff --git a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj index 703ce4646..ec84152cb 100644 --- a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj +++ b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj @@ -4,7 +4,9 @@ netcoreapp2.1 Internal.AspNetCore.KoreBuild.Tasks + $(NuGetPackageRoot)roslyntools.signtool\$(RoslynToolsSignToolPackageVersion)\ + @@ -13,8 +15,10 @@ + + @@ -25,6 +29,7 @@ + diff --git a/modules/KoreBuild.Tasks/Utilities/VsWhere.cs b/modules/KoreBuild.Tasks/Utilities/VsWhere.cs index f3fdb2df5..f58d20fac 100644 --- a/modules/KoreBuild.Tasks/Utilities/VsWhere.cs +++ b/modules/KoreBuild.Tasks/Utilities/VsWhere.cs @@ -26,6 +26,9 @@ public static VsInstallation FindLatestInstallation(bool includePrerelease, Task args.Add("-prerelease"); } + args.Add("-products"); + args.Add("*"); + return GetInstallations(args, log).FirstOrDefault(); } diff --git a/modules/KoreBuild.Tasks/module.props b/modules/KoreBuild.Tasks/module.props index 76af3e126..20d2b5ddc 100644 --- a/modules/KoreBuild.Tasks/module.props +++ b/modules/KoreBuild.Tasks/module.props @@ -10,6 +10,8 @@ + + diff --git a/modules/KoreBuild.Tasks/module.targets b/modules/KoreBuild.Tasks/module.targets index 8947d8fb5..2d77d2dc9 100644 --- a/modules/KoreBuild.Tasks/module.targets +++ b/modules/KoreBuild.Tasks/module.targets @@ -1,5 +1,7 @@ + + GetToolsets;$(PrepareDependsOn) InstallDotNet;CheckPackageReferences;$(RestoreDependsOn) diff --git a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj index ec211e93f..c14d288ce 100644 --- a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj +++ b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj @@ -46,6 +46,7 @@ $(ApiCheckPackageVersion) + $(MicroBuildCorePackageVersion) $(MicrosoftBuildPackageVersion) $(JsonInMSBuildVersion) @@ -60,6 +61,7 @@ $(NuspecProperties);id=$(PackageId) $(NuspecProperties);bundledVersionFile=$(IntermediateOutputPath)BundledVersions.props $(NuspecProperties);apicheckVersion=$(ApiCheckPackageVersion) + $(NuspecProperties);microbuildVersion=$(MicroBuildCorePackageVersion) $(NuspecProperties);config=$(Configuration) $(NuspecProperties);version=$(PackageVersion) $(NuspecProperties);description=$(Description) diff --git a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec index 0ed5b6d42..d68478f37 100644 --- a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec +++ b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec @@ -9,6 +9,7 @@ $copyright$ + diff --git a/src/Internal.AspNetCore.Sdk/build/Common.props b/src/Internal.AspNetCore.Sdk/build/Common.props index 2639594ab..90d6be466 100644 --- a/src/Internal.AspNetCore.Sdk/build/Common.props +++ b/src/Internal.AspNetCore.Sdk/build/Common.props @@ -28,6 +28,16 @@ Usage: this should be imported once via NuGet at the top of the file. true + + + Microsoft400 + 3PartySHA2 + Microsoft400 + NuGet + VsixSHA2 + MicrosoftJAR + + diff --git a/src/Internal.AspNetCore.Sdk/build/DotNetTool.targets b/src/Internal.AspNetCore.Sdk/build/DotNetTool.targets index 33ac97621..52afbb07d 100644 --- a/src/Internal.AspNetCore.Sdk/build/DotNetTool.targets +++ b/src/Internal.AspNetCore.Sdk/build/DotNetTool.targets @@ -8,7 +8,7 @@ <_ShimRids Include="$(PackAsToolShimRuntimeIdentifiers)" /> - + tools/$(TargetFramework)/any/shims/%(_ShimRids.Identity)/ diff --git a/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets b/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets index cdf79ebaf..8d9134f16 100644 --- a/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets +++ b/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets @@ -12,6 +12,14 @@ Publish="false" /> + + + + From 8302f5532084e49a127ea7f349fb14ccc61bf6d5 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 28 Sep 2018 12:46:36 -0700 Subject: [PATCH 093/192] Fixup a few minor bugs in microbuild codesigning --- .../modules/solutionbuild/Project.Inspection.targets | 3 ++- modules/BundledPackages/BundledPackages.proj | 1 + test.ps1 | 4 +++- 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets index b8083db75..ace45445d 100644 --- a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets +++ b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets @@ -126,9 +126,10 @@ Items: <_PackageBasePath>$(BuildOutputTargetFolder.TrimEnd('/')) <_PackageBasePath>$(_PackageBasePath.TrimEnd('\')) + <_IsTestProject Condition=" '$(IsTestProject)' == 'true' OR ('$(IsTestProject)' == '' AND @(PackageReference->WithMetadataValue('Identity', 'Microsoft.NET.Test.Sdk')->Count()) != 0)">true - + $(_PackageBasePath)/$(TargetFramework)/%(BuiltProjectOutputGroupOutput.FileName)%(BuiltProjectOutputGroupOutput.Extension) $(AssemblySigningCertName) diff --git a/modules/BundledPackages/BundledPackages.proj b/modules/BundledPackages/BundledPackages.proj index a84a06e85..3bf89a9f2 100644 --- a/modules/BundledPackages/BundledPackages.proj +++ b/modules/BundledPackages/BundledPackages.proj @@ -25,6 +25,7 @@ + true netcoreapp2.1 true diff --git a/test.ps1 b/test.ps1 index f5d7de316..4058f420e 100755 --- a/test.ps1 +++ b/test.ps1 @@ -7,6 +7,7 @@ param( [string]$RepoPath, [switch]$NoBuild = $false, [switch]$CI = $false, + [switch]$NoReinstall = $false, [Parameter(ValueFromRemainingArguments = $true)] [string[]]$Arguments ) @@ -46,5 +47,6 @@ foreach ($pkg in @( } } +$Reinstall = -not $NoReinstall -& .\scripts\bootstrapper\run.ps1 -Update -Reinstall -Command $Command -Path $RepoPath -ToolsSource $toolsSource -Ci:$CI @Arguments +& .\scripts\bootstrapper\run.ps1 -Update -Reinstall:$Reinstall -Command $Command -Path $RepoPath -ToolsSource $toolsSource -Ci:$CI @Arguments From 51fa917a4f9840f6de5ad384a2a3c80abb0fe2d5 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 28 Sep 2018 13:52:08 -0700 Subject: [PATCH 094/192] fix: package warmup could not find MicroBuild.Core 0.2.0 --- modules/BundledPackages/BundledPackages.proj | 3 +++ 1 file changed, 3 insertions(+) diff --git a/modules/BundledPackages/BundledPackages.proj b/modules/BundledPackages/BundledPackages.proj index 3bf89a9f2..85eb71899 100644 --- a/modules/BundledPackages/BundledPackages.proj +++ b/modules/BundledPackages/BundledPackages.proj @@ -1,5 +1,7 @@ + + @@ -38,6 +40,7 @@ + From 9311e5121a44493b17e1e62b93f9ddeb8b2b849f Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 28 Sep 2018 16:39:49 -0700 Subject: [PATCH 095/192] Only run benchmark validation for runnable benchmark projects --- files/KoreBuild/modules/vstest/module.targets | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/files/KoreBuild/modules/vstest/module.targets b/files/KoreBuild/modules/vstest/module.targets index 574e72302..d01b5949e 100644 --- a/files/KoreBuild/modules/vstest/module.targets +++ b/files/KoreBuild/modules/vstest/module.targets @@ -118,7 +118,10 @@ Runs the VSTest on all projects in the ProjectsToTest itemgroup. - + + From bc090922b53724d88ad8fe347b21c32aad7dd62d Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 28 Sep 2018 16:46:50 -0700 Subject: [PATCH 096/192] fix: make the signtool intermediate output unique per repo --- modules/KoreBuild.Tasks/CodeSign.targets | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/KoreBuild.Tasks/CodeSign.targets b/modules/KoreBuild.Tasks/CodeSign.targets index f78d7fe6e..27aa645c0 100644 --- a/modules/KoreBuild.Tasks/CodeSign.targets +++ b/modules/KoreBuild.Tasks/CodeSign.targets @@ -37,6 +37,8 @@ + + From a1532444e6ac2cef83c8758c601ed0c079dd3d9b Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 28 Sep 2018 17:03:57 -0700 Subject: [PATCH 097/192] Backport bug in bootstrappers --- docs/KoreBuild.md | 4 ++-- scripts/bootstrapper/run.ps1 | 6 +++--- scripts/bootstrapper/run.sh | 10 +++++----- tools/korebuild.schema.json | 4 ++-- 4 files changed, 12 insertions(+), 12 deletions(-) diff --git a/docs/KoreBuild.md b/docs/KoreBuild.md index b0ceeabbc..9191faa2d 100644 --- a/docs/KoreBuild.md +++ b/docs/KoreBuild.md @@ -42,10 +42,10 @@ Example: { // add this for editor auto-completion :) - "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/dev/tools/korebuild.schema.json", + "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/master/tools/korebuild.schema.json", // specifies the channel used to update KoreBuild to new versions when you attempt to upgrade KoreBuild - "channel": "dev", + "channel": "master", "toolsets": { // All toolsets listed in this section are treated as required toolsets diff --git a/scripts/bootstrapper/run.ps1 b/scripts/bootstrapper/run.ps1 index 3b2738246..34604c717 100755 --- a/scripts/bootstrapper/run.ps1 +++ b/scripts/bootstrapper/run.ps1 @@ -52,8 +52,8 @@ in the file are overridden by command line parameters. Example config file: ```json { - "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/dev/tools/korebuild.schema.json", - "channel": "dev", + "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/master/tools/korebuild.schema.json", + "channel": "master", "toolsSource": "https://aspnetcore.blob.core.windows.net/buildtools" } ``` @@ -192,7 +192,7 @@ if (!$DotNetHome) { else { Join-Path $PSScriptRoot '.dotnet'} } -if (!$Channel) { $Channel = 'dev' } +if (!$Channel) { $Channel = 'master' } if (!$ToolsSource) { $ToolsSource = 'https://aspnetcore.blob.core.windows.net/buildtools' } # Execute diff --git a/scripts/bootstrapper/run.sh b/scripts/bootstrapper/run.sh index 02aac1587..4c1fed564 100755 --- a/scripts/bootstrapper/run.sh +++ b/scripts/bootstrapper/run.sh @@ -220,7 +220,7 @@ if [ -f "$config_file" ]; then config_channel="$(jq -r 'select(.channel!=null) | .channel' "$config_file")" config_tools_source="$(jq -r 'select(.toolsSource!=null) | .toolsSource' "$config_file")" else - _error "$config_file contains invalid JSON." + __error "$config_file contains invalid JSON." exit 1 fi elif __machine_has python ; then @@ -228,7 +228,7 @@ if [ -f "$config_file" ]; then config_channel="$(python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['channel'] if 'channel' in obj else '')")" config_tools_source="$(python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['toolsSource'] if 'toolsSource' in obj else '')")" else - _error "$config_file contains invalid JSON." + __error "$config_file contains invalid JSON." exit 1 fi elif __machine_has python3 ; then @@ -236,11 +236,11 @@ if [ -f "$config_file" ]; then config_channel="$(python3 -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['channel'] if 'channel' in obj else '')")" config_tools_source="$(python3 -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['toolsSource'] if 'toolsSource' in obj else '')")" else - _error "$config_file contains invalid JSON." + __error "$config_file contains invalid JSON." exit 1 fi else - _error 'Missing required command: jq or python. Could not parse the JSON file.' + __error 'Missing required command: jq or python. Could not parse the JSON file.' exit 1 fi @@ -248,7 +248,7 @@ if [ -f "$config_file" ]; then [ ! -z "${config_tools_source:-}" ] && tools_source="$config_tools_source" fi -[ -z "$channel" ] && channel='dev' +[ -z "$channel" ] && channel='master' [ -z "$tools_source" ] && tools_source='https://aspnetcore.blob.core.windows.net/buildtools' get_korebuild diff --git a/tools/korebuild.schema.json b/tools/korebuild.schema.json index d5cebaa8e..3725deafc 100644 --- a/tools/korebuild.schema.json +++ b/tools/korebuild.schema.json @@ -109,9 +109,9 @@ "channel": { "description": "The channel of KoreBuild used to select a version when korebuild-lock.txt is not present.", "type": "string", - "default": "dev", + "default": "master", "enum": [ - "dev", + "master", "release/2.2", "release/2.1", "release/2.0" From 43faa29f679f47b88689d645b39e6be5e0055d70 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 28 Sep 2018 17:04:38 -0700 Subject: [PATCH 098/192] Honor DisableCodeSigning in default SignPackageFiles collection --- files/KoreBuild/modules/sharedsources/sharedsources.csproj | 2 +- .../KoreBuild/modules/solutionbuild/Project.Inspection.targets | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/files/KoreBuild/modules/sharedsources/sharedsources.csproj b/files/KoreBuild/modules/sharedsources/sharedsources.csproj index 594e5a973..bb0104ed5 100644 --- a/files/KoreBuild/modules/sharedsources/sharedsources.csproj +++ b/files/KoreBuild/modules/sharedsources/sharedsources.csproj @@ -73,7 +73,7 @@ $(PackageArtifactCategory) true $(PackageSigningCertName) - true + true diff --git a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets index ace45445d..c80a0a1c7 100644 --- a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets +++ b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets @@ -120,7 +120,7 @@ Items: From b4d9869fc1acead6346a1067d1642544d0c389ff Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 1 Oct 2018 10:08:51 -0700 Subject: [PATCH 099/192] Remove MicroBuild.Core as a dependency of Internal.AspNetCore.Sdk (#771) Most microbuild tasks do not support .NET Core, so this causes task assembly load issues. We don't really need MicroBuild.Core in the project context. We just need it restored to disk for CI builds. This should still put the package in the cache without causing task assembly load errors. --- modules/BundledPackages/BundledPackages.proj | 5 ++++- .../Internal.AspNetCore.Sdk.csproj | 2 -- .../Internal.AspNetCore.Sdk.nuspec | 1 - src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets | 8 -------- 4 files changed, 4 insertions(+), 12 deletions(-) diff --git a/modules/BundledPackages/BundledPackages.proj b/modules/BundledPackages/BundledPackages.proj index 85eb71899..f441d127c 100644 --- a/modules/BundledPackages/BundledPackages.proj +++ b/modules/BundledPackages/BundledPackages.proj @@ -27,11 +27,14 @@ - true netcoreapp2.1 true + + + + ]]> diff --git a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj index c14d288ce..ec211e93f 100644 --- a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj +++ b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj @@ -46,7 +46,6 @@ $(ApiCheckPackageVersion) - $(MicroBuildCorePackageVersion) $(MicrosoftBuildPackageVersion) $(JsonInMSBuildVersion) @@ -61,7 +60,6 @@ $(NuspecProperties);id=$(PackageId) $(NuspecProperties);bundledVersionFile=$(IntermediateOutputPath)BundledVersions.props $(NuspecProperties);apicheckVersion=$(ApiCheckPackageVersion) - $(NuspecProperties);microbuildVersion=$(MicroBuildCorePackageVersion) $(NuspecProperties);config=$(Configuration) $(NuspecProperties);version=$(PackageVersion) $(NuspecProperties);description=$(Description) diff --git a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec index d68478f37..0ed5b6d42 100644 --- a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec +++ b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec @@ -9,7 +9,6 @@ $copyright$ - diff --git a/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets b/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets index 8d9134f16..cdf79ebaf 100644 --- a/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets +++ b/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets @@ -12,14 +12,6 @@ Publish="false" /> - - - - From 37f226a35c8b98792ee117edd3b888a22e417bc6 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 1 Oct 2018 11:27:49 -0700 Subject: [PATCH 100/192] Update to Roslyn signtool 1.0.0-beta3.18501.1 (#773) --- build/dependencies.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/dependencies.props b/build/dependencies.props index a00b4c493..670c5aea9 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -12,7 +12,7 @@ 10.0.1 4.7.0-rtm.5148 4.7.0-rtm.5148 - 1.0.0-beta2-63206-01 + 1.0.0-beta3.18501.1 1.4.0 1.5.0 2.2.7 From bef6cfb0e08b8fa1c94b83e3fab483a169b29cb3 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 1 Oct 2018 16:17:39 -0700 Subject: [PATCH 101/192] Collect ExcludePackageFileFromSigning items from the inner build (#774) SignedPackageFiles could be defined per TFM, but ExcludePackageFileFromSigning could not. This adds a target so ExcludePackageFileFromSigning items which are defined per-TFM are collected by signing-config generation. --- .../solutionbuild/Project.Inspection.targets | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets index c80a0a1c7..48e833aab 100644 --- a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets +++ b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets @@ -1,7 +1,7 @@ @@ -85,6 +85,43 @@ + + + + + _GetPackageFilesExcludedFromSigning + + + + + + + <_TargetFrameworks Remove="@(_TargetFrameworks)" /> + <_TargetFrameworks Include="$(TargetFrameworks)" /> + + + + + + + + + - $(_SolutionWasBuilt) + $(SolutionProperties);PackageOutputPath=$(BuildDir); + $(PackProperties);NoBuild=true;BuildProjectReferences=false + RemoveProperties="$(_BuildPropertiesToRemove)" /> @@ -150,7 +151,7 @@ Executes /t:Pack on all projects matching src/*/*.csproj. Condition="@(ProjectsToPack->Count()) != 0" Properties="$(SolutionProperties);EnableApiCheck=false;NoBuild=true;RepositoryRoot=$(RepositoryRoot);PackageOutputPath=$(BuildDir);CustomAfterMicrosoftCommonTargets=$(_InspectionTargetsFile);CustomAfterMicrosoftCommonCrossTargetingTargets=$(_InspectionTargetsFile)" BuildInParallel="$(BuildInParallel)" - RemoveProperties="$(_BuildPropertiesToRemove);PackageNoBuild"> + RemoveProperties="$(_BuildPropertiesToRemove)"> diff --git a/test.ps1 b/test.ps1 index 4058f420e..340e666af 100755 --- a/test.ps1 +++ b/test.ps1 @@ -1,5 +1,5 @@ #requires -version 4 -[CmdletBinding(PositionalBinding = $true)] +[CmdletBinding(PositionalBinding = $false)] param( [Parameter()] [string]$Command = 'default-build', From 20538607213e0d70ee0b3ae39c35e6d55cec8eda Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 4 Oct 2018 10:18:57 -0700 Subject: [PATCH 104/192] Minor tweaks to settings for code signing and .symbols.nupkg generation (#779) * Remove workaround for NuGet/Home#4276 - do not disable symbols generation just because custom nuspec is used * Less-verbose console output from SignTool.exe --- .../solutionbuild/Project.Inspection.targets | 2 +- modules/KoreBuild.Tasks/CodeSign.targets | 18 +++++++++++++----- .../build/Common.targets | 5 ----- 3 files changed, 14 insertions(+), 11 deletions(-) diff --git a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets index 48e833aab..2945b5294 100644 --- a/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets +++ b/files/KoreBuild/modules/solutionbuild/Project.Inspection.targets @@ -28,7 +28,7 @@ - + NuGetPackage $(PackageId) diff --git a/modules/KoreBuild.Tasks/CodeSign.targets b/modules/KoreBuild.Tasks/CodeSign.targets index 27aa645c0..6dfd655af 100644 --- a/modules/KoreBuild.Tasks/CodeSign.targets +++ b/modules/KoreBuild.Tasks/CodeSign.targets @@ -13,15 +13,16 @@ $(RepositoryRoot) + + + true + false - - - @@ -33,7 +34,7 @@ - + @@ -44,7 +45,14 @@ - + + <_SignToolMessage>Running SignTool + <_SignToolMessage Condition=" '$(SignToolDryRun)' == 'true' ">$(_SignToolMessage) (dry-run) + + + + + diff --git a/src/Internal.AspNetCore.Sdk/build/Common.targets b/src/Internal.AspNetCore.Sdk/build/Common.targets index 5649610af..afb5caf4c 100644 --- a/src/Internal.AspNetCore.Sdk/build/Common.targets +++ b/src/Internal.AspNetCore.Sdk/build/Common.targets @@ -15,11 +15,6 @@ For single-tfm projects, this will be imported from build/Internal.AspNetCore.Sd $(NoWarn);NU5105 - - - false - - $(GenerateNuspecDependsOn);_EnsureDebugTypeIsPortable $(TargetsForTfmSpecificBuildOutput);_EnsureDebugTypeIsPortable From e71842910b793e5ab55d9dc448a53ae777ff8a87 Mon Sep 17 00:00:00 2001 From: Javier Calvarro Nelson Date: Thu, 4 Oct 2018 12:34:42 -0700 Subject: [PATCH 105/192] Update api check to target netcoreapp2.2 (#780) * Update api check to target netcoreapp2.2 --- src/ApiCheck.Console/ApiCheck.Console.csproj | 2 +- src/ApiCheck.Console/ApiListingGenerator.cs | 2 +- src/ApiCheck.Console/Loader/AssemblyLoader.cs | 6 +++--- src/ApiCheck.Console/Loader/CoreClrAssemblyLoader.cs | 4 ++-- .../Microsoft.AspNetCore.BuildTools.ApiCheck.nuspec | 4 ++-- src/ApiCheck.Task/ApiCheckTasksBase.cs | 2 +- test/ApiCheck.Test/ApiCheck.Test.csproj | 6 +++--- test/ApiCheck.Test/ApiListingComparerTests.cs | 2 +- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/ApiCheck.Console/ApiCheck.Console.csproj b/src/ApiCheck.Console/ApiCheck.Console.csproj index 357b7b4ff..2888b9c73 100644 --- a/src/ApiCheck.Console/ApiCheck.Console.csproj +++ b/src/ApiCheck.Console/ApiCheck.Console.csproj @@ -2,7 +2,7 @@ - netcoreapp2.1;net46 + netcoreapp2.2;net46 Microsoft.AspNetCore.BuildTools.ApiCheck ApiCheck Microsoft.AspNetCore.BuildTools.ApiCheck diff --git a/src/ApiCheck.Console/ApiListingGenerator.cs b/src/ApiCheck.Console/ApiListingGenerator.cs index 04d76225e..ef8a43ab7 100644 --- a/src/ApiCheck.Console/ApiListingGenerator.cs +++ b/src/ApiCheck.Console/ApiListingGenerator.cs @@ -39,7 +39,7 @@ public static JObject GenerateApiListingReport(Assembly assembly, IEnumerable type.GetTypeInfo())) diff --git a/src/ApiCheck.Console/Loader/AssemblyLoader.cs b/src/ApiCheck.Console/Loader/AssemblyLoader.cs index 90b3ab8f9..bef4cbf1e 100644 --- a/src/ApiCheck.Console/Loader/AssemblyLoader.cs +++ b/src/ApiCheck.Console/Loader/AssemblyLoader.cs @@ -1,11 +1,11 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// 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. #if NET46 using System.IO; #endif using System.Reflection; -#if NETCOREAPP2_1 +#if NETCOREAPP2_2 using NuGet.ProjectModel; using ApiCheck.NuGet; #endif @@ -19,7 +19,7 @@ public static Assembly LoadAssembly( string assetsJson, string framework) { -#if NETCOREAPP2_1 +#if NETCOREAPP2_2 var lockFile = new LockFileFormat().Read(assetsJson); var graph = PackageGraph.Create(lockFile, framework); var loader = new CoreClrAssemblyLoader(graph, assemblyPath); diff --git a/src/ApiCheck.Console/Loader/CoreClrAssemblyLoader.cs b/src/ApiCheck.Console/Loader/CoreClrAssemblyLoader.cs index 87aed447f..0cfe8960b 100644 --- a/src/ApiCheck.Console/Loader/CoreClrAssemblyLoader.cs +++ b/src/ApiCheck.Console/Loader/CoreClrAssemblyLoader.cs @@ -1,7 +1,7 @@ -// Copyright (c) .NET Foundation. All rights reserved. +// 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. -#if NETCOREAPP2_1 +#if NETCOREAPP2_2 using System; using System.Collections.Generic; diff --git a/src/ApiCheck.Console/Microsoft.AspNetCore.BuildTools.ApiCheck.nuspec b/src/ApiCheck.Console/Microsoft.AspNetCore.BuildTools.ApiCheck.nuspec index 9d49b2da3..fe020e4d0 100644 --- a/src/ApiCheck.Console/Microsoft.AspNetCore.BuildTools.ApiCheck.nuspec +++ b/src/ApiCheck.Console/Microsoft.AspNetCore.BuildTools.ApiCheck.nuspec @@ -1,4 +1,4 @@ - + $id$ @@ -12,7 +12,7 @@ - + diff --git a/src/ApiCheck.Task/ApiCheckTasksBase.cs b/src/ApiCheck.Task/ApiCheckTasksBase.cs index a80e95e87..9ba9ff420 100644 --- a/src/ApiCheck.Task/ApiCheckTasksBase.cs +++ b/src/ApiCheck.Task/ApiCheckTasksBase.cs @@ -129,7 +129,7 @@ protected string GenerateCommandLineCommands(string command) if (!Framework.StartsWith("net4", StringComparison.OrdinalIgnoreCase)) { var taskAssemblyFolder = Path.GetDirectoryName(GetType().GetTypeInfo().Assembly.Location); - var toolPath = Path.Combine(taskAssemblyFolder, "..", "netcoreapp2.1", ApiCheckToolName + ".dll"); + var toolPath = Path.Combine(taskAssemblyFolder, "..", "netcoreapp2.2", ApiCheckToolName + ".dll"); arguments = $@"""{Path.GetFullPath(toolPath)}"" "; } diff --git a/test/ApiCheck.Test/ApiCheck.Test.csproj b/test/ApiCheck.Test/ApiCheck.Test.csproj index cec3773b8..f5469e4f4 100644 --- a/test/ApiCheck.Test/ApiCheck.Test.csproj +++ b/test/ApiCheck.Test/ApiCheck.Test.csproj @@ -1,9 +1,9 @@ - + - netcoreapp2.1;net461 - netcoreapp2.1 + netcoreapp2.2 + $(TargetFrameworks);net461 diff --git a/test/ApiCheck.Test/ApiListingComparerTests.cs b/test/ApiCheck.Test/ApiListingComparerTests.cs index 663448a9e..3bd7f09ea 100644 --- a/test/ApiCheck.Test/ApiListingComparerTests.cs +++ b/test/ApiCheck.Test/ApiListingComparerTests.cs @@ -22,7 +22,7 @@ public class ApiListingComparerTests ti => (ti as TypeInfo)?.Namespace?.StartsWith("ComparisonScenarios") == false }; -#if NETCOREAPP2_1 // Reflection does not provide a hook to enumerate forwarded types in .NET Framework. +#if NETCOREAPP2_2 // Reflection does not provide a hook to enumerate forwarded types in .NET Framework. [Fact] public void Compare_AllowsTypeToBeForwarded() { From 7c9fc51314be6aa1b4f5044e12cd7c7def4f64c1 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 4 Oct 2018 13:03:11 -0700 Subject: [PATCH 106/192] Skip implicit PackageRef to ApiCheck if implicit refs are disabled (#782) --- modules/BundledPackages/BundledPackages.proj | 5 +++++ src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/BundledPackages/BundledPackages.proj b/modules/BundledPackages/BundledPackages.proj index f441d127c..471175cff 100644 --- a/modules/BundledPackages/BundledPackages.proj +++ b/modules/BundledPackages/BundledPackages.proj @@ -24,6 +24,11 @@ + + false + false + + diff --git a/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets b/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets index cdf79ebaf..0ff4609aa 100644 --- a/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets +++ b/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets @@ -4,7 +4,7 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - + Date: Thu, 4 Oct 2018 14:46:21 -0700 Subject: [PATCH 107/192] Show more output from signtool on CI builds --- modules/KoreBuild.Tasks/CodeSign.targets | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modules/KoreBuild.Tasks/CodeSign.targets b/modules/KoreBuild.Tasks/CodeSign.targets index 6dfd655af..d979d4761 100644 --- a/modules/KoreBuild.Tasks/CodeSign.targets +++ b/modules/KoreBuild.Tasks/CodeSign.targets @@ -48,11 +48,16 @@ <_SignToolMessage>Running SignTool <_SignToolMessage Condition=" '$(SignToolDryRun)' == 'true' ">$(_SignToolMessage) (dry-run) + <_SignToolOutputImportance>Normal + <_SignToolOutputImportance Condition="'$(CI)' == 'true'">High - + From 208a52c594f241ed1ba0d4549673266dbbbf323a Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Wed, 10 Oct 2018 17:09:09 -0700 Subject: [PATCH 108/192] Collect test logs in VSTS (#790) --- .vsts-pipelines/templates/phases/default-build.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.vsts-pipelines/templates/phases/default-build.yml b/.vsts-pipelines/templates/phases/default-build.yml index 68041c682..b42ecd353 100644 --- a/.vsts-pipelines/templates/phases/default-build.yml +++ b/.vsts-pipelines/templates/phases/default-build.yml @@ -48,7 +48,7 @@ parameters: # matrix: {} - don't define an empty object default because there is no way in template expression yet to check "if isEmpty(parameters.matrix)" artifacts: publish: true - path: 'artifacts/build/' # TODO: this is going to change when we converge with dotnet/arcade tooling + path: 'artifacts/' # TODO: this is going to change when we converge with dotnet/arcade tooling phases: - phase: ${{ coalesce(parameters.phaseName, parameters.agentOs) }} @@ -70,6 +70,7 @@ phases: demands: ${{ parameters.demands }} variables: AgentOsName: ${{ parameters.agentOs }} + ASPNETCORE_TEST_LOG_DIR: ${{ parameters.artifacts.path }}/logs/testlogs DOTNET_HOME: $(Agent.WorkFolder)/.dotnet BuildScriptArgs: ${{ parameters.buildArgs }} BuildConfiguration: ${{ parameters.configuration }} From 17ee7986dbe75408d9e4efd94eab1003adcc3ad7 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 16 Oct 2018 12:21:40 -0700 Subject: [PATCH 109/192] Replace RoslynSign tool with Arcade signtool (#788) This replaces the Roslyn sign tool (configured via .json file) with the Arcade signtool task (configured via MSBuild items) --- build/dependencies.props | 4 +- build/sources.props | 5 +- modules/KoreBuild.Tasks/CodeSign.targets | 72 +++++++-------- .../GenerateSignToolDataFile.cs | 87 ------------------- .../KoreBuild.Tasks/KoreBuild.Tasks.csproj | 23 ++++- modules/KoreBuild.Tasks/module.props | 3 +- 6 files changed, 58 insertions(+), 136 deletions(-) delete mode 100644 modules/KoreBuild.Tasks/GenerateSignToolDataFile.cs diff --git a/build/dependencies.props b/build/dependencies.props index 08f21073d..3ba2a5579 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -1,8 +1,9 @@ 1.5.1 - 0.2.0 + 0.3.0 2.0.0 + 1.0.0-beta.18515.2 15.6.1 4.4.0 0.10.0-beta6 @@ -11,7 +12,6 @@ 10.0.1 4.7.0-rtm.5148 4.7.0-rtm.5148 - 1.0.0-beta3.18501.1 1.4.0 1.5.0 2.2.7 diff --git a/build/sources.props b/build/sources.props index affdd8b44..c648b2764 100644 --- a/build/sources.props +++ b/build/sources.props @@ -5,10 +5,7 @@ $(DotNetRestoreSources) $(RestoreSources); - https://dotnet.myget.org/F/dotnet-core/api/v3/index.json; - https://dotnet.myget.org/F/nuget-build/api/v3/index.json; - https://dotnet.myget.org/F/msbuild/api/v3/index.json; - https://dotnet.myget.org/F/roslyn-tools/api/v3/index.json; + https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json; https://api.nuget.org/v3/index.json; diff --git a/modules/KoreBuild.Tasks/CodeSign.targets b/modules/KoreBuild.Tasks/CodeSign.targets index d979d4761..92d5839bc 100644 --- a/modules/KoreBuild.Tasks/CodeSign.targets +++ b/modules/KoreBuild.Tasks/CodeSign.targets @@ -1,15 +1,8 @@ - - $(MSBuildThisFileDirectory)SignTool\SignTool.exe - true - - <_IntermediateSignToolDataFile>$(IntermediateDir)SignToolData.g.json + - - true - - - $(_IntermediateSignToolDataFile) + + true $(RepositoryRoot) @@ -17,9 +10,13 @@ true false + + + false + true - @@ -27,37 +24,34 @@ - - - - - - - - - - - - + + <_FileSignInfo Remove="@(_FileSignInfo)" /> + <_ItemsToSign Remove="@(_ItemsToSign)" /> + + + <_FileSignInfo Include="%(FilesToSign.FileName)%(FilesToSign.Extension)" CertificateName="%(FilesToSign.Certificate)" /> + <_FileSignInfo Include="%(FilesToExcludeFromSigning.FileName)%(FilesToExcludeFromSigning.Extension)" CertificateName="None" /> + + + <_ItemsToSign Include="%(FilesToSign.Identity)" Condition=" '%(FilesToSign.Container)' == '' " /> - - <_SignToolMessage>Running SignTool - <_SignToolMessage Condition=" '$(SignToolDryRun)' == 'true' ">$(_SignToolMessage) (dry-run) - <_SignToolOutputImportance>Normal - <_SignToolOutputImportance Condition="'$(CI)' == 'true'">High - - - - - + diff --git a/modules/KoreBuild.Tasks/GenerateSignToolDataFile.cs b/modules/KoreBuild.Tasks/GenerateSignToolDataFile.cs deleted file mode 100644 index 118c8c55d..000000000 --- a/modules/KoreBuild.Tasks/GenerateSignToolDataFile.cs +++ /dev/null @@ -1,87 +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.Collections.Generic; -using System.IO; -using System.Linq; -using Microsoft.Build.Framework; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace KoreBuild.Tasks -{ - /// - /// Generates a signdata.json file for the Roslyn SignTool to execute - /// - public class GenerateSignToolDataFile : Microsoft.Build.Utilities.Task - { - [Required] - public ITaskItem[] Files { get; set; } - public ITaskItem[] Exclusions { get; set; } - - /// - /// The path to SignData.json file - /// - [Required] - public string OutputPath { get; set; } - - public override bool Execute() - { - OutputPath = OutputPath.Replace('\\', '/'); - - var data = new JObject(); - var signData = new JArray(); - data["sign"] = signData; - - if (Files != null) - { - foreach (var certificateGroup in Files.GroupBy(i => (Certificate: i.GetMetadata("Certificate"), StrongName: i.GetMetadata("StrongName")))) - { - var values = new HashSet(); - foreach (var item in certificateGroup) - { - values.Add(item.ItemSpec); - } - - var certName = string.IsNullOrEmpty(certificateGroup.Key.Certificate) - ? null // needs to be null, not an empty string, - : certificateGroup.Key.Certificate; - - var strongName = string.IsNullOrEmpty(certificateGroup.Key.StrongName) - ? null // needs to be null, not an empty string, - : certificateGroup.Key.StrongName; - - signData.Add(new JObject - { - ["certificate"] = certName, - ["strongName"] = strongName, - ["values"] = new JArray(values), - }); - } - } - - if (Exclusions != null) - { - var exclusions = new HashSet(); - foreach (var item in Exclusions) - { - exclusions.Add(Path.GetFileName(item.ItemSpec)); - } - - data["exclude"] = new JArray(exclusions); - } - - Directory.CreateDirectory(Path.GetDirectoryName(OutputPath)); - - Log.LogMessage("Generating sign data in {0}", OutputPath); - - using (var file = File.CreateText(OutputPath)) - using (var jsonWriter = new JsonTextWriter(file) { Formatting = Formatting.Indented }) - { - data.WriteTo(jsonWriter); - } - - return !Log.HasLoggedErrors; - } - } -} diff --git a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj index ec84152cb..3115b43f9 100644 --- a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj +++ b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj @@ -4,7 +4,7 @@ netcoreapp2.1 Internal.AspNetCore.KoreBuild.Tasks - $(NuGetPackageRoot)roslyntools.signtool\$(RoslynToolsSignToolPackageVersion)\ + $(NuGetPackageRoot)/microsoft.dotnet.signtool/$(MicrosoftDotNetSignToolPackageVersion)/ @@ -15,7 +15,8 @@ - + + @@ -29,8 +30,24 @@ - + + + + + + + $(MicroBuildCorePackageVersion) + + +]]> + + + + + + diff --git a/modules/KoreBuild.Tasks/module.props b/modules/KoreBuild.Tasks/module.props index 20d2b5ddc..2d3b898cc 100644 --- a/modules/KoreBuild.Tasks/module.props +++ b/modules/KoreBuild.Tasks/module.props @@ -1,4 +1,6 @@ + + $(MSBuildThisFileDirectory)Internal.AspNetCore.KoreBuild.Tasks.dll @@ -10,7 +12,6 @@ - From eebe76094b789cc4c641a1120a75195d58bf087c Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 17 Oct 2018 10:49:27 -0700 Subject: [PATCH 110/192] Fix whitespace in package descriptions with link to source --- src/Internal.AspNetCore.Sdk/build/Git.targets | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Internal.AspNetCore.Sdk/build/Git.targets b/src/Internal.AspNetCore.Sdk/build/Git.targets index 9c65f5c9f..49e8ec45c 100644 --- a/src/Internal.AspNetCore.Sdk/build/Git.targets +++ b/src/Internal.AspNetCore.Sdk/build/Git.targets @@ -140,8 +140,8 @@ Generates an assembly attribute with commit hash Condition="'$(GenerateRepositoryCommitUrlInDescription)' == 'true' AND '$(RepositoryUrl)' !='' AND '$(RepositoryCommit)' != ''"> $(PackageDescription) -This package was built from the source at: -$(RepositoryUrl)/tree/$(RepositoryCommit) + +This package was built from the source code at $(RepositoryUrl)/tree/$(RepositoryCommit) From 306702a12c9ed38996835b1e5192b97f1f325ed6 Mon Sep 17 00:00:00 2001 From: dotnet-maestro-bot Date: Wed, 17 Oct 2018 14:17:32 -0700 Subject: [PATCH 111/192] Update test log dir (#806) (#807) * Update test log dir * fixup --- .vsts-pipelines/templates/phases/default-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vsts-pipelines/templates/phases/default-build.yml b/.vsts-pipelines/templates/phases/default-build.yml index cd9eefffb..b14f4a647 100644 --- a/.vsts-pipelines/templates/phases/default-build.yml +++ b/.vsts-pipelines/templates/phases/default-build.yml @@ -75,7 +75,7 @@ phases: demands: ${{ parameters.demands }} variables: AgentOsName: ${{ parameters.agentOs }} - ASPNETCORE_TEST_LOG_DIR: ${{ format('{0}/logs/testlogs', parameters.artifacts.path) }} + ASPNETCORE_TEST_LOG_DIR: $(Build.SourcesDirectory)/artifacts/logs/testlogs DOTNET_HOME: $(Agent.WorkFolder)/.dotnet BuildScriptArgs: ${{ parameters.buildArgs }} BuildConfiguration: ${{ parameters.configuration }} From f4082c290c6c7610e7cb9d787072004453fc175f Mon Sep 17 00:00:00 2001 From: dotnet-maestro-bot Date: Wed, 17 Oct 2018 14:44:40 -0700 Subject: [PATCH 112/192] Update test log dir (#806) (#807) (#809) * Update test log dir * fixup --- .vsts-pipelines/templates/phases/default-build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.vsts-pipelines/templates/phases/default-build.yml b/.vsts-pipelines/templates/phases/default-build.yml index cd9eefffb..b14f4a647 100644 --- a/.vsts-pipelines/templates/phases/default-build.yml +++ b/.vsts-pipelines/templates/phases/default-build.yml @@ -75,7 +75,7 @@ phases: demands: ${{ parameters.demands }} variables: AgentOsName: ${{ parameters.agentOs }} - ASPNETCORE_TEST_LOG_DIR: ${{ format('{0}/logs/testlogs', parameters.artifacts.path) }} + ASPNETCORE_TEST_LOG_DIR: $(Build.SourcesDirectory)/artifacts/logs/testlogs DOTNET_HOME: $(Agent.WorkFolder)/.dotnet BuildScriptArgs: ${{ parameters.buildArgs }} BuildConfiguration: ${{ parameters.configuration }} From 69ec8b84497e9e5d78c81f0e628384d1f46c1928 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 19 Oct 2018 10:10:47 -0700 Subject: [PATCH 113/192] Code sign .Sources packages and add signing cert names as properties into KoreBuild --- files/KoreBuild/KoreBuild.Common.props | 10 ++++++++++ .../modules/sharedsources/sharedsources.csproj | 7 +++++++ src/Internal.AspNetCore.Sdk/build/Common.props | 2 +- 3 files changed, 18 insertions(+), 1 deletion(-) diff --git a/files/KoreBuild/KoreBuild.Common.props b/files/KoreBuild/KoreBuild.Common.props index 2fc5d3c80..653e60582 100644 --- a/files/KoreBuild/KoreBuild.Common.props +++ b/files/KoreBuild/KoreBuild.Common.props @@ -47,6 +47,16 @@ Default layout and configuration. $([MSBuild]::NormalizeDirectory('$(NuGetPackageRoot)')) + + + Microsoft400 + 3PartySHA2 + Microsoft400 + NuGet + VsixSHA2 + MicrosoftJAR + + + $(NoWarn);NU5105 + + + + + NuGet diff --git a/src/Internal.AspNetCore.Sdk/build/Common.props b/src/Internal.AspNetCore.Sdk/build/Common.props index bc1a2ec33..fe971de28 100644 --- a/src/Internal.AspNetCore.Sdk/build/Common.props +++ b/src/Internal.AspNetCore.Sdk/build/Common.props @@ -29,7 +29,7 @@ Usage: this should be imported once via NuGet at the top of the file. - + Microsoft400 3PartySHA2 Microsoft400 From 72ba316025aca165c09cb97b407965d944bad93f Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 19 Oct 2018 10:48:51 -0700 Subject: [PATCH 114/192] Upgrade SDK to 2.2.100-preview3-009430 --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index f6b95e879..aebf02c41 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -2.2.100-preview2-009404 +2.2.100-preview3-009430 From 84a1c04b13bd7127728fee91989db8f2f58c8781 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 19 Oct 2018 17:04:00 -0700 Subject: [PATCH 115/192] Honor signing settings for shared source projects (#822) --- files/KoreBuild/modules/sharedsources/module.targets | 10 +++++++--- modules/KoreBuild.Tasks/CodeSign.targets | 2 +- modules/KoreBuild.Tasks/module.props | 5 +++++ 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/files/KoreBuild/modules/sharedsources/module.targets b/files/KoreBuild/modules/sharedsources/module.targets index 5fa6ce5c0..370e1517c 100644 --- a/files/KoreBuild/modules/sharedsources/module.targets +++ b/files/KoreBuild/modules/sharedsources/module.targets @@ -26,10 +26,14 @@ that matches "$(RepositoryRoot)/shared/*.Sources". Properties="$(_SharedSourcesPackageProperties);NuspecBasePath=$([MSBuild]::NormalizeDirectory('%(SharedSourceDirectories.Identity)'));PackageId=%(FileName)%(Extension)" Condition="@(SharedSourceDirectories->Count()) != 0" BuildInParallel="true"> - - - + + + + + + + diff --git a/modules/KoreBuild.Tasks/CodeSign.targets b/modules/KoreBuild.Tasks/CodeSign.targets index 92d5839bc..ace523a98 100644 --- a/modules/KoreBuild.Tasks/CodeSign.targets +++ b/modules/KoreBuild.Tasks/CodeSign.targets @@ -18,7 +18,7 @@ + DependsOnTargets="$(CodeSignDependsOn)"> diff --git a/modules/KoreBuild.Tasks/module.props b/modules/KoreBuild.Tasks/module.props index 2d3b898cc..87d34041c 100644 --- a/modules/KoreBuild.Tasks/module.props +++ b/modules/KoreBuild.Tasks/module.props @@ -3,6 +3,11 @@ $(MSBuildThisFileDirectory)Internal.AspNetCore.KoreBuild.Tasks.dll + + + GetArtifactInfo; + $(CodeSignDependsOn) + From a0c32c96c1f6fee4173b492ec46e538fde78fce0 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 24 Oct 2018 11:35:06 -0700 Subject: [PATCH 116/192] Update SDK to 3.0.100-alpha1-009701 (#786) --- build/dependencies.props | 8 ++++---- build/sources.props | 2 ++ build/tasks/RepoTasks.csproj | 2 +- files/KoreBuild/config/sdk.version | 2 +- .../msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props | 2 +- modules/BuildTools.Tasks/BuildTools.Tasks.csproj | 2 +- modules/BuildTools.Tasks/FindUnusedReferences.cs | 2 +- modules/BuildTools.Tasks/GetDotNetHost.cs | 2 +- modules/BuildTools.Tasks/GetOSPlatform.cs | 2 +- modules/BuildTools.Tasks/ZipArchive.cs | 2 +- modules/BundledPackages/BundledPackages.proj | 2 +- .../KoreBuild.Tasks/Internal/SimplePackageInstaller.cs | 5 +++-- modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj | 2 +- .../msbuild/NuGetPackageVerifier.Task.csproj | 2 +- src/ApiCheck.Console/ApiCheck.Console.csproj | 2 +- src/ApiCheck.Console/ApiListingGenerator.cs | 2 +- src/ApiCheck.Console/Loader/AssemblyLoader.cs | 4 ++-- src/ApiCheck.Console/Loader/CoreClrAssemblyLoader.cs | 2 +- .../Loader/FullFrameworkAssemblyLoader.cs | 4 ++-- .../Microsoft.AspNetCore.BuildTools.ApiCheck.nuspec | 2 +- src/ApiCheck.Task/ApiCheckTasksBase.cs | 2 +- .../Internal.AspNetCore.Sdk.csproj | 2 +- .../Internal.AspNetCore.Sdk.nuspec | 2 +- src/Internal.AspNetCore.Sdk/build/Common.props | 2 +- .../Internal.AspNetCore.SiteExtension.Sdk.csproj | 2 +- .../Internal.AspNetCore.SiteExtension.Sdk.nuspec | 2 +- .../build/Internal.AspNetCore.SiteExtension.Sdk.props | 2 +- test/ApiCheck.Test/ApiCheck.Test.csproj | 2 +- test/ApiCheck.Test/ApiListingComparerTests.cs | 2 +- test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj | 2 +- .../KoreBuild.FunctionalTests.csproj | 2 +- test/KoreBuild.FunctionalTests/SimpleRepoTests.cs | 4 ++-- test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj | 2 +- .../NuGetPackageVerifier.Tests.csproj | 2 +- .../src/BadConsole/BadConsole.csproj | 2 +- .../src/GlobalConsoleTool/GlobalConsoleTool.csproj | 2 +- testassets/SimpleRepo/NuGetPackageVerifier.json | 2 +- testassets/SimpleRepo/build/tasks/RepoTasks.csproj | 2 +- .../SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj | 2 +- .../SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj | 2 +- testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj | 4 ++-- tools/KoreBuild.Console/KoreBuild.Console.csproj | 2 +- 42 files changed, 52 insertions(+), 49 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 3ba2a5579..47631220a 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -12,7 +12,7 @@ 10.0.1 4.7.0-rtm.5148 4.7.0-rtm.5148 - 1.4.0 + 1.5.0 1.5.0 2.2.7 2.3.1 @@ -20,18 +20,18 @@ - 15.6.82 + 15.9.19 $(MicrosoftBuildPackageVersion) $(MicrosoftBuildPackageVersion) $(MicrosoftBuildPackageVersion) 9.0.1 - 4.7.0-netcore.2.1.preview2.5133 + 4.9.0-preview3.5473 diff --git a/build/sources.props b/build/sources.props index c648b2764..dd9e03c79 100644 --- a/build/sources.props +++ b/build/sources.props @@ -6,6 +6,8 @@ $(RestoreSources); https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json; + https://dotnet.myget.org/F/msbuild/api/v3/index.json; + https://dotnet.myget.org/F/nuget-build/api/v3/index.json; https://api.nuget.org/v3/index.json; diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index 81af5527a..c5f2da824 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -2,7 +2,7 @@ - netcoreapp2.1 + netcoreapp3.0 $(DefineConstants);BuildTools $(NoWarn);NU1603 RepoTasks diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index aebf02c41..b41ef48b1 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -2.2.100-preview3-009430 +3.0.100-alpha1-009701 \ No newline at end of file diff --git a/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props b/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props index 19eb74a37..af90e39f6 100644 --- a/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props +++ b/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props @@ -5,7 +5,7 @@ true true - + library true <_BuildTasksPrefix>Sdk_ - <_BuildToolsAssemblyTfm Condition="'$(MSBuildRuntimeType)' == 'Core'">netcoreapp2.1 + <_BuildToolsAssemblyTfm Condition="'$(MSBuildRuntimeType)' == 'Core'">netcoreapp3.0 <_BuildToolsAssemblyTfm Condition="'$(MSBuildRuntimeType)' != 'Core'">net46 <_BuildToolsAssembly>$(MSBuildThisFileDirectory)..\tools\$(_BuildToolsAssemblyTfm)\Internal.AspNetCore.Sdk.dll diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj index 366a29c2f..4170683c2 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj @@ -2,7 +2,7 @@ Internal.AspNetCore.SiteExtension.Sdk - netcoreapp2.1;net46 + netcoreapp3.0;net46 false Build targets and extensions to Microsoft.NET.Sdk. This package is intended for Microsoft use only. $(MSBuildThisFileDirectory)$(MSBuildProjectName).nuspec diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec index a6552123b..dff041805 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec @@ -10,7 +10,7 @@ - + diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props index d1c6e62fe..7d7ccfee1 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props @@ -4,7 +4,7 @@ --> - netcoreapp2.1 + netcoreapp3.0 net46 $(MSBuildThisFileDirectory)..\tools\$(TaskFolder)\Internal.AspNetCore.SiteExtension.Sdk.dll diff --git a/test/ApiCheck.Test/ApiCheck.Test.csproj b/test/ApiCheck.Test/ApiCheck.Test.csproj index f5469e4f4..441e64089 100644 --- a/test/ApiCheck.Test/ApiCheck.Test.csproj +++ b/test/ApiCheck.Test/ApiCheck.Test.csproj @@ -2,7 +2,7 @@ - netcoreapp2.2 + netcoreapp3.0 $(TargetFrameworks);net461 diff --git a/test/ApiCheck.Test/ApiListingComparerTests.cs b/test/ApiCheck.Test/ApiListingComparerTests.cs index 3bd7f09ea..eec3c2d9f 100644 --- a/test/ApiCheck.Test/ApiListingComparerTests.cs +++ b/test/ApiCheck.Test/ApiListingComparerTests.cs @@ -22,7 +22,7 @@ public class ApiListingComparerTests ti => (ti as TypeInfo)?.Namespace?.StartsWith("ComparisonScenarios") == false }; -#if NETCOREAPP2_2 // Reflection does not provide a hook to enumerate forwarded types in .NET Framework. +#if NETCOREAPP3_0 // Reflection does not provide a hook to enumerate forwarded types in .NET Framework. [Fact] public void Compare_AllowsTypeToBeForwarded() { diff --git a/test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj b/test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj index 7bc350487..11354bcbc 100644 --- a/test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj +++ b/test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj @@ -2,7 +2,7 @@ - netcoreapp2.1 + netcoreapp3.0 diff --git a/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj b/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj index f195fc750..533f5457d 100644 --- a/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj +++ b/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj @@ -2,7 +2,7 @@ - netcoreapp2.1 + netcoreapp3.0 diff --git a/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs b/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs index ef4a019be..945f8abfa 100644 --- a/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs +++ b/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs @@ -79,10 +79,10 @@ public void BuildOfGlobalCliToolIncludesShims() _output.WriteLine("pkg: " + file); } - var winx86 = Assert.Single(files, f => f.StartsWith("tools/netcoreapp2.1/any/shims/win-x86/")); + var winx86 = Assert.Single(files, f => f.StartsWith("tools/netcoreapp3.0/any/shims/win-x86/")); Assert.Equal("GlobalConsoleTool.exe", Path.GetFileName(winx86)); - var winx64 = Assert.Single(files, f => f.StartsWith("tools/netcoreapp2.1/any/shims/win-x64/")); + var winx64 = Assert.Single(files, f => f.StartsWith("tools/netcoreapp3.0/any/shims/win-x64/")); Assert.Equal("GlobalConsoleTool.exe", Path.GetFileName(winx64)); } diff --git a/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj b/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj index de4d75728..a0cfe0a82 100644 --- a/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj +++ b/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj @@ -2,7 +2,7 @@ - netcoreapp2.1 + netcoreapp3.0 diff --git a/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj b/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj index 5595eb9a2..7f462181e 100644 --- a/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj +++ b/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj @@ -2,7 +2,7 @@ - netcoreapp2.1 + netcoreapp3.0 diff --git a/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj b/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj index 9dca0062a..497bf8488 100644 --- a/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj +++ b/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.1 + netcoreapp3.0 diff --git a/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj b/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj index 840fe1182..06d3435d3 100644 --- a/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj +++ b/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.1 + netcoreapp3.0 true win-x64;win-x86 diff --git a/testassets/SimpleRepo/NuGetPackageVerifier.json b/testassets/SimpleRepo/NuGetPackageVerifier.json index d2794bf11..4f744e663 100644 --- a/testassets/SimpleRepo/NuGetPackageVerifier.json +++ b/testassets/SimpleRepo/NuGetPackageVerifier.json @@ -8,7 +8,7 @@ "Simple.CliTool": { "Exclusions": { "VERSION_INFORMATIONALVERSION": { - "tools/netcoreapp2.1/any/Newtonsoft.Json.dll": "Example exclusion" + "tools/netcoreapp3.0/any/Newtonsoft.Json.dll": "Example exclusion" } } } diff --git a/testassets/SimpleRepo/build/tasks/RepoTasks.csproj b/testassets/SimpleRepo/build/tasks/RepoTasks.csproj index 42af64eb5..cdea37999 100644 --- a/testassets/SimpleRepo/build/tasks/RepoTasks.csproj +++ b/testassets/SimpleRepo/build/tasks/RepoTasks.csproj @@ -1,7 +1,7 @@ - netcoreapp2.1 + netcoreapp3.0 RepoTasks diff --git a/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj b/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj index 62535a12f..852793c1f 100644 --- a/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj +++ b/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj @@ -6,7 +6,7 @@ Exe - netcoreapp2.1 + netcoreapp3.0 diff --git a/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj b/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj index f41c8b9df..8de1419f3 100644 --- a/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj +++ b/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj @@ -1,7 +1,7 @@ - netcoreapp2.1 + netcoreapp3.0 exe DotnetTool cowsay diff --git a/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj b/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj index ba23d109a..f68591deb 100644 --- a/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj +++ b/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj @@ -1,8 +1,8 @@ - netcoreapp2.1;net461 - netcoreapp2.1 + netcoreapp3.0;net461 + netcoreapp3.0 diff --git a/tools/KoreBuild.Console/KoreBuild.Console.csproj b/tools/KoreBuild.Console/KoreBuild.Console.csproj index dc3338b03..83f28c5d4 100644 --- a/tools/KoreBuild.Console/KoreBuild.Console.csproj +++ b/tools/KoreBuild.Console/KoreBuild.Console.csproj @@ -3,7 +3,7 @@ Exe - netcoreapp2.1 + netcoreapp3.0 From 1f58b55905daba775cf5d9588698e6e5fdfc2de5 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 24 Oct 2018 15:56:18 -0700 Subject: [PATCH 117/192] Revert "Update SDK to 3.0.100-alpha1-009701" (#824) This reverts commit a0c32c96c1f6fee4173b492ec46e538fde78fce0 because it causes the aspnetcore build to fail. cref dotnet/sdk#2620 --- build/dependencies.props | 8 ++++---- build/sources.props | 2 -- build/tasks/RepoTasks.csproj | 2 +- files/KoreBuild/config/sdk.version | 2 +- .../msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props | 2 +- modules/BuildTools.Tasks/BuildTools.Tasks.csproj | 2 +- modules/BuildTools.Tasks/FindUnusedReferences.cs | 2 +- modules/BuildTools.Tasks/GetDotNetHost.cs | 2 +- modules/BuildTools.Tasks/GetOSPlatform.cs | 2 +- modules/BuildTools.Tasks/ZipArchive.cs | 2 +- modules/BundledPackages/BundledPackages.proj | 2 +- .../KoreBuild.Tasks/Internal/SimplePackageInstaller.cs | 5 ++--- modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj | 2 +- .../msbuild/NuGetPackageVerifier.Task.csproj | 2 +- src/ApiCheck.Console/ApiCheck.Console.csproj | 2 +- src/ApiCheck.Console/ApiListingGenerator.cs | 2 +- src/ApiCheck.Console/Loader/AssemblyLoader.cs | 4 ++-- src/ApiCheck.Console/Loader/CoreClrAssemblyLoader.cs | 2 +- .../Loader/FullFrameworkAssemblyLoader.cs | 4 ++-- .../Microsoft.AspNetCore.BuildTools.ApiCheck.nuspec | 2 +- src/ApiCheck.Task/ApiCheckTasksBase.cs | 2 +- .../Internal.AspNetCore.Sdk.csproj | 2 +- .../Internal.AspNetCore.Sdk.nuspec | 2 +- src/Internal.AspNetCore.Sdk/build/Common.props | 2 +- .../Internal.AspNetCore.SiteExtension.Sdk.csproj | 2 +- .../Internal.AspNetCore.SiteExtension.Sdk.nuspec | 2 +- .../build/Internal.AspNetCore.SiteExtension.Sdk.props | 2 +- test/ApiCheck.Test/ApiCheck.Test.csproj | 2 +- test/ApiCheck.Test/ApiListingComparerTests.cs | 2 +- test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj | 2 +- .../KoreBuild.FunctionalTests.csproj | 2 +- test/KoreBuild.FunctionalTests/SimpleRepoTests.cs | 4 ++-- test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj | 2 +- .../NuGetPackageVerifier.Tests.csproj | 2 +- .../src/BadConsole/BadConsole.csproj | 2 +- .../src/GlobalConsoleTool/GlobalConsoleTool.csproj | 2 +- testassets/SimpleRepo/NuGetPackageVerifier.json | 2 +- testassets/SimpleRepo/build/tasks/RepoTasks.csproj | 2 +- .../SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj | 2 +- .../SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj | 2 +- testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj | 4 ++-- tools/KoreBuild.Console/KoreBuild.Console.csproj | 2 +- 42 files changed, 49 insertions(+), 52 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 47631220a..3ba2a5579 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -12,7 +12,7 @@ 10.0.1 4.7.0-rtm.5148 4.7.0-rtm.5148 - 1.5.0 + 1.4.0 1.5.0 2.2.7 2.3.1 @@ -20,18 +20,18 @@ - 15.9.19 + 15.6.82 $(MicrosoftBuildPackageVersion) $(MicrosoftBuildPackageVersion) $(MicrosoftBuildPackageVersion) 9.0.1 - 4.9.0-preview3.5473 + 4.7.0-netcore.2.1.preview2.5133 diff --git a/build/sources.props b/build/sources.props index dd9e03c79..c648b2764 100644 --- a/build/sources.props +++ b/build/sources.props @@ -6,8 +6,6 @@ $(RestoreSources); https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json; - https://dotnet.myget.org/F/msbuild/api/v3/index.json; - https://dotnet.myget.org/F/nuget-build/api/v3/index.json; https://api.nuget.org/v3/index.json; diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index c5f2da824..81af5527a 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -2,7 +2,7 @@ - netcoreapp3.0 + netcoreapp2.1 $(DefineConstants);BuildTools $(NoWarn);NU1603 RepoTasks diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index b41ef48b1..aebf02c41 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-alpha1-009701 \ No newline at end of file +2.2.100-preview3-009430 diff --git a/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props b/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props index af90e39f6..19eb74a37 100644 --- a/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props +++ b/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props @@ -5,7 +5,7 @@ true true - + library true <_BuildTasksPrefix>Sdk_ - <_BuildToolsAssemblyTfm Condition="'$(MSBuildRuntimeType)' == 'Core'">netcoreapp3.0 + <_BuildToolsAssemblyTfm Condition="'$(MSBuildRuntimeType)' == 'Core'">netcoreapp2.1 <_BuildToolsAssemblyTfm Condition="'$(MSBuildRuntimeType)' != 'Core'">net46 <_BuildToolsAssembly>$(MSBuildThisFileDirectory)..\tools\$(_BuildToolsAssemblyTfm)\Internal.AspNetCore.Sdk.dll diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj index 4170683c2..366a29c2f 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj @@ -2,7 +2,7 @@ Internal.AspNetCore.SiteExtension.Sdk - netcoreapp3.0;net46 + netcoreapp2.1;net46 false Build targets and extensions to Microsoft.NET.Sdk. This package is intended for Microsoft use only. $(MSBuildThisFileDirectory)$(MSBuildProjectName).nuspec diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec index dff041805..a6552123b 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec @@ -10,7 +10,7 @@ - + diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props index 7d7ccfee1..d1c6e62fe 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props @@ -4,7 +4,7 @@ --> - netcoreapp3.0 + netcoreapp2.1 net46 $(MSBuildThisFileDirectory)..\tools\$(TaskFolder)\Internal.AspNetCore.SiteExtension.Sdk.dll diff --git a/test/ApiCheck.Test/ApiCheck.Test.csproj b/test/ApiCheck.Test/ApiCheck.Test.csproj index 441e64089..f5469e4f4 100644 --- a/test/ApiCheck.Test/ApiCheck.Test.csproj +++ b/test/ApiCheck.Test/ApiCheck.Test.csproj @@ -2,7 +2,7 @@ - netcoreapp3.0 + netcoreapp2.2 $(TargetFrameworks);net461 diff --git a/test/ApiCheck.Test/ApiListingComparerTests.cs b/test/ApiCheck.Test/ApiListingComparerTests.cs index eec3c2d9f..3bd7f09ea 100644 --- a/test/ApiCheck.Test/ApiListingComparerTests.cs +++ b/test/ApiCheck.Test/ApiListingComparerTests.cs @@ -22,7 +22,7 @@ public class ApiListingComparerTests ti => (ti as TypeInfo)?.Namespace?.StartsWith("ComparisonScenarios") == false }; -#if NETCOREAPP3_0 // Reflection does not provide a hook to enumerate forwarded types in .NET Framework. +#if NETCOREAPP2_2 // Reflection does not provide a hook to enumerate forwarded types in .NET Framework. [Fact] public void Compare_AllowsTypeToBeForwarded() { diff --git a/test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj b/test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj index 11354bcbc..7bc350487 100644 --- a/test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj +++ b/test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj @@ -2,7 +2,7 @@ - netcoreapp3.0 + netcoreapp2.1 diff --git a/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj b/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj index 533f5457d..f195fc750 100644 --- a/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj +++ b/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj @@ -2,7 +2,7 @@ - netcoreapp3.0 + netcoreapp2.1 diff --git a/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs b/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs index 945f8abfa..ef4a019be 100644 --- a/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs +++ b/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs @@ -79,10 +79,10 @@ public void BuildOfGlobalCliToolIncludesShims() _output.WriteLine("pkg: " + file); } - var winx86 = Assert.Single(files, f => f.StartsWith("tools/netcoreapp3.0/any/shims/win-x86/")); + var winx86 = Assert.Single(files, f => f.StartsWith("tools/netcoreapp2.1/any/shims/win-x86/")); Assert.Equal("GlobalConsoleTool.exe", Path.GetFileName(winx86)); - var winx64 = Assert.Single(files, f => f.StartsWith("tools/netcoreapp3.0/any/shims/win-x64/")); + var winx64 = Assert.Single(files, f => f.StartsWith("tools/netcoreapp2.1/any/shims/win-x64/")); Assert.Equal("GlobalConsoleTool.exe", Path.GetFileName(winx64)); } diff --git a/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj b/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj index a0cfe0a82..de4d75728 100644 --- a/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj +++ b/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj @@ -2,7 +2,7 @@ - netcoreapp3.0 + netcoreapp2.1 diff --git a/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj b/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj index 7f462181e..5595eb9a2 100644 --- a/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj +++ b/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj @@ -2,7 +2,7 @@ - netcoreapp3.0 + netcoreapp2.1 diff --git a/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj b/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj index 497bf8488..9dca0062a 100644 --- a/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj +++ b/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.0 + netcoreapp2.1 diff --git a/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj b/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj index 06d3435d3..840fe1182 100644 --- a/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj +++ b/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp3.0 + netcoreapp2.1 true win-x64;win-x86 diff --git a/testassets/SimpleRepo/NuGetPackageVerifier.json b/testassets/SimpleRepo/NuGetPackageVerifier.json index 4f744e663..d2794bf11 100644 --- a/testassets/SimpleRepo/NuGetPackageVerifier.json +++ b/testassets/SimpleRepo/NuGetPackageVerifier.json @@ -8,7 +8,7 @@ "Simple.CliTool": { "Exclusions": { "VERSION_INFORMATIONALVERSION": { - "tools/netcoreapp3.0/any/Newtonsoft.Json.dll": "Example exclusion" + "tools/netcoreapp2.1/any/Newtonsoft.Json.dll": "Example exclusion" } } } diff --git a/testassets/SimpleRepo/build/tasks/RepoTasks.csproj b/testassets/SimpleRepo/build/tasks/RepoTasks.csproj index cdea37999..42af64eb5 100644 --- a/testassets/SimpleRepo/build/tasks/RepoTasks.csproj +++ b/testassets/SimpleRepo/build/tasks/RepoTasks.csproj @@ -1,7 +1,7 @@ - netcoreapp3.0 + netcoreapp2.1 RepoTasks diff --git a/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj b/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj index 852793c1f..62535a12f 100644 --- a/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj +++ b/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj @@ -6,7 +6,7 @@ Exe - netcoreapp3.0 + netcoreapp2.1 diff --git a/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj b/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj index 8de1419f3..f41c8b9df 100644 --- a/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj +++ b/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj @@ -1,7 +1,7 @@ - netcoreapp3.0 + netcoreapp2.1 exe DotnetTool cowsay diff --git a/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj b/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj index f68591deb..ba23d109a 100644 --- a/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj +++ b/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj @@ -1,8 +1,8 @@ - netcoreapp3.0;net461 - netcoreapp3.0 + netcoreapp2.1;net461 + netcoreapp2.1 diff --git a/tools/KoreBuild.Console/KoreBuild.Console.csproj b/tools/KoreBuild.Console/KoreBuild.Console.csproj index 83f28c5d4..dc3338b03 100644 --- a/tools/KoreBuild.Console/KoreBuild.Console.csproj +++ b/tools/KoreBuild.Console/KoreBuild.Console.csproj @@ -3,7 +3,7 @@ Exe - netcoreapp3.0 + netcoreapp2.1 From d3fd31bc75010d3b5ee4cb9b55ebd383b0cd628c Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 29 Oct 2018 09:13:42 -0700 Subject: [PATCH 118/192] Update SDK to 2.2.100-rtm-009571 (#835) --- build/sources.props | 1 + files/KoreBuild/config/sdk.version | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/build/sources.props b/build/sources.props index c648b2764..47b89fc15 100644 --- a/build/sources.props +++ b/build/sources.props @@ -6,6 +6,7 @@ $(RestoreSources); https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json; + https://dotnetfeed.blob.core.windows.net/orchestrated-release-2-2/20181029-01/final/index.json; https://api.nuget.org/v3/index.json; diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index aebf02c41..4cb70d18e 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -2.2.100-preview3-009430 +2.2.100-rtm-009571 From 1f1bbd1a38ec97acd322933661cf8ef257b4a496 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 30 Oct 2018 16:58:17 -0700 Subject: [PATCH 119/192] Update SDK to 3.0.100-alpha1-009708 --- build/dependencies.props | 6 +++--- build/sources.props | 3 ++- build/tasks/RepoTasks.csproj | 2 +- files/KoreBuild/config/sdk.version | 2 +- .../KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props | 2 +- modules/BuildTools.Tasks/BuildTools.Tasks.csproj | 2 +- modules/BuildTools.Tasks/FindUnusedReferences.cs | 2 +- modules/BuildTools.Tasks/GetDotNetHost.cs | 2 +- modules/BuildTools.Tasks/GetOSPlatform.cs | 2 +- modules/BuildTools.Tasks/ZipArchive.cs | 2 +- modules/BundledPackages/BundledPackages.proj | 2 +- modules/KoreBuild.Tasks/Internal/SimplePackageInstaller.cs | 5 +++-- modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj | 2 +- .../msbuild/NuGetPackageVerifier.Task.csproj | 2 +- src/ApiCheck.Console/ApiCheck.Console.csproj | 2 +- src/ApiCheck.Console/ApiListingGenerator.cs | 2 +- src/ApiCheck.Console/Loader/AssemblyLoader.cs | 4 ++-- src/ApiCheck.Console/Loader/CoreClrAssemblyLoader.cs | 2 +- src/ApiCheck.Console/Loader/FullFrameworkAssemblyLoader.cs | 4 ++-- .../Microsoft.AspNetCore.BuildTools.ApiCheck.nuspec | 2 +- src/ApiCheck.Task/ApiCheckTasksBase.cs | 2 +- src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj | 2 +- src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec | 2 +- src/Internal.AspNetCore.Sdk/build/Common.props | 2 +- .../Internal.AspNetCore.SiteExtension.Sdk.csproj | 2 +- .../Internal.AspNetCore.SiteExtension.Sdk.nuspec | 2 +- .../build/Internal.AspNetCore.SiteExtension.Sdk.props | 2 +- test/ApiCheck.Test/ApiCheck.Test.csproj | 2 +- test/ApiCheck.Test/ApiListingComparerTests.cs | 2 +- test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj | 2 +- .../KoreBuild.FunctionalTests.csproj | 2 +- test/KoreBuild.FunctionalTests/SimpleRepoTests.cs | 4 ++-- test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj | 2 +- .../NuGetPackageVerifier.Tests.csproj | 2 +- .../src/BadConsole/BadConsole.csproj | 2 +- .../src/GlobalConsoleTool/GlobalConsoleTool.csproj | 2 +- testassets/SimpleRepo/NuGetPackageVerifier.json | 2 +- testassets/SimpleRepo/build/tasks/RepoTasks.csproj | 2 +- .../SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj | 2 +- .../SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj | 2 +- testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj | 4 ++-- tools/KoreBuild.Console/KoreBuild.Console.csproj | 2 +- 42 files changed, 51 insertions(+), 49 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 56b8b718e..bf1e66d73 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -19,18 +19,18 @@ - 15.8.166 + 15.9.19 $(MicrosoftBuildPackageVersion) $(MicrosoftBuildPackageVersion) $(MicrosoftBuildPackageVersion) 9.0.1 - 4.7.0-netcore.2.1.preview2.5133 + 4.9.0-preview3.5473 diff --git a/build/sources.props b/build/sources.props index 47b89fc15..dd9e03c79 100644 --- a/build/sources.props +++ b/build/sources.props @@ -6,7 +6,8 @@ $(RestoreSources); https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json; - https://dotnetfeed.blob.core.windows.net/orchestrated-release-2-2/20181029-01/final/index.json; + https://dotnet.myget.org/F/msbuild/api/v3/index.json; + https://dotnet.myget.org/F/nuget-build/api/v3/index.json; https://api.nuget.org/v3/index.json; diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index 81af5527a..c5f2da824 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -2,7 +2,7 @@ - netcoreapp2.1 + netcoreapp3.0 $(DefineConstants);BuildTools $(NoWarn);NU1603 RepoTasks diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 4cb70d18e..eaa5658ba 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -2.2.100-rtm-009571 +3.0.100-alpha1-009708 diff --git a/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props b/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props index 3c253874f..3fad2d83d 100644 --- a/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props +++ b/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props @@ -5,7 +5,7 @@ true true - + library true <_BuildTasksPrefix>Sdk_ - <_BuildToolsAssemblyTfm Condition="'$(MSBuildRuntimeType)' == 'Core'">netcoreapp2.1 + <_BuildToolsAssemblyTfm Condition="'$(MSBuildRuntimeType)' == 'Core'">netcoreapp3.0 <_BuildToolsAssemblyTfm Condition="'$(MSBuildRuntimeType)' != 'Core'">net46 <_BuildToolsAssembly>$(MSBuildThisFileDirectory)..\tools\$(_BuildToolsAssemblyTfm)\Internal.AspNetCore.Sdk.dll diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj index 366a29c2f..4170683c2 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj @@ -2,7 +2,7 @@ Internal.AspNetCore.SiteExtension.Sdk - netcoreapp2.1;net46 + netcoreapp3.0;net46 false Build targets and extensions to Microsoft.NET.Sdk. This package is intended for Microsoft use only. $(MSBuildThisFileDirectory)$(MSBuildProjectName).nuspec diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec index a6552123b..dff041805 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec @@ -10,7 +10,7 @@ - + diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props index d1c6e62fe..7d7ccfee1 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props @@ -4,7 +4,7 @@ --> - netcoreapp2.1 + netcoreapp3.0 net46 $(MSBuildThisFileDirectory)..\tools\$(TaskFolder)\Internal.AspNetCore.SiteExtension.Sdk.dll diff --git a/test/ApiCheck.Test/ApiCheck.Test.csproj b/test/ApiCheck.Test/ApiCheck.Test.csproj index f5469e4f4..441e64089 100644 --- a/test/ApiCheck.Test/ApiCheck.Test.csproj +++ b/test/ApiCheck.Test/ApiCheck.Test.csproj @@ -2,7 +2,7 @@ - netcoreapp2.2 + netcoreapp3.0 $(TargetFrameworks);net461 diff --git a/test/ApiCheck.Test/ApiListingComparerTests.cs b/test/ApiCheck.Test/ApiListingComparerTests.cs index 3bd7f09ea..eec3c2d9f 100644 --- a/test/ApiCheck.Test/ApiListingComparerTests.cs +++ b/test/ApiCheck.Test/ApiListingComparerTests.cs @@ -22,7 +22,7 @@ public class ApiListingComparerTests ti => (ti as TypeInfo)?.Namespace?.StartsWith("ComparisonScenarios") == false }; -#if NETCOREAPP2_2 // Reflection does not provide a hook to enumerate forwarded types in .NET Framework. +#if NETCOREAPP3_0 // Reflection does not provide a hook to enumerate forwarded types in .NET Framework. [Fact] public void Compare_AllowsTypeToBeForwarded() { diff --git a/test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj b/test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj index 7bc350487..11354bcbc 100644 --- a/test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj +++ b/test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj @@ -2,7 +2,7 @@ - netcoreapp2.1 + netcoreapp3.0 diff --git a/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj b/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj index f195fc750..533f5457d 100644 --- a/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj +++ b/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj @@ -2,7 +2,7 @@ - netcoreapp2.1 + netcoreapp3.0 diff --git a/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs b/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs index ef4a019be..945f8abfa 100644 --- a/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs +++ b/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs @@ -79,10 +79,10 @@ public void BuildOfGlobalCliToolIncludesShims() _output.WriteLine("pkg: " + file); } - var winx86 = Assert.Single(files, f => f.StartsWith("tools/netcoreapp2.1/any/shims/win-x86/")); + var winx86 = Assert.Single(files, f => f.StartsWith("tools/netcoreapp3.0/any/shims/win-x86/")); Assert.Equal("GlobalConsoleTool.exe", Path.GetFileName(winx86)); - var winx64 = Assert.Single(files, f => f.StartsWith("tools/netcoreapp2.1/any/shims/win-x64/")); + var winx64 = Assert.Single(files, f => f.StartsWith("tools/netcoreapp3.0/any/shims/win-x64/")); Assert.Equal("GlobalConsoleTool.exe", Path.GetFileName(winx64)); } diff --git a/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj b/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj index de4d75728..a0cfe0a82 100644 --- a/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj +++ b/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj @@ -2,7 +2,7 @@ - netcoreapp2.1 + netcoreapp3.0 diff --git a/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj b/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj index 5595eb9a2..7f462181e 100644 --- a/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj +++ b/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj @@ -2,7 +2,7 @@ - netcoreapp2.1 + netcoreapp3.0 diff --git a/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj b/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj index 9dca0062a..497bf8488 100644 --- a/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj +++ b/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.1 + netcoreapp3.0 diff --git a/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj b/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj index 840fe1182..06d3435d3 100644 --- a/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj +++ b/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj @@ -2,7 +2,7 @@ Exe - netcoreapp2.1 + netcoreapp3.0 true win-x64;win-x86 diff --git a/testassets/SimpleRepo/NuGetPackageVerifier.json b/testassets/SimpleRepo/NuGetPackageVerifier.json index d2794bf11..4f744e663 100644 --- a/testassets/SimpleRepo/NuGetPackageVerifier.json +++ b/testassets/SimpleRepo/NuGetPackageVerifier.json @@ -8,7 +8,7 @@ "Simple.CliTool": { "Exclusions": { "VERSION_INFORMATIONALVERSION": { - "tools/netcoreapp2.1/any/Newtonsoft.Json.dll": "Example exclusion" + "tools/netcoreapp3.0/any/Newtonsoft.Json.dll": "Example exclusion" } } } diff --git a/testassets/SimpleRepo/build/tasks/RepoTasks.csproj b/testassets/SimpleRepo/build/tasks/RepoTasks.csproj index 42af64eb5..cdea37999 100644 --- a/testassets/SimpleRepo/build/tasks/RepoTasks.csproj +++ b/testassets/SimpleRepo/build/tasks/RepoTasks.csproj @@ -1,7 +1,7 @@ - netcoreapp2.1 + netcoreapp3.0 RepoTasks diff --git a/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj b/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj index 62535a12f..852793c1f 100644 --- a/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj +++ b/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj @@ -6,7 +6,7 @@ Exe - netcoreapp2.1 + netcoreapp3.0 diff --git a/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj b/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj index f41c8b9df..8de1419f3 100644 --- a/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj +++ b/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj @@ -1,7 +1,7 @@ - netcoreapp2.1 + netcoreapp3.0 exe DotnetTool cowsay diff --git a/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj b/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj index ba23d109a..f68591deb 100644 --- a/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj +++ b/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj @@ -1,8 +1,8 @@ - netcoreapp2.1;net461 - netcoreapp2.1 + netcoreapp3.0;net461 + netcoreapp3.0 diff --git a/tools/KoreBuild.Console/KoreBuild.Console.csproj b/tools/KoreBuild.Console/KoreBuild.Console.csproj index dc3338b03..83f28c5d4 100644 --- a/tools/KoreBuild.Console/KoreBuild.Console.csproj +++ b/tools/KoreBuild.Console/KoreBuild.Console.csproj @@ -3,7 +3,7 @@ Exe - netcoreapp2.1 + netcoreapp3.0 From fbd6da7e4dc130cb73a3b8583a326ac1338ca0cf Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 31 Oct 2018 23:09:12 -0700 Subject: [PATCH 120/192] Don't automatically run SetTeamCityBuildNumberToVersion --- files/KoreBuild/modules/teamcity/module.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/modules/teamcity/module.targets b/files/KoreBuild/modules/teamcity/module.targets index 2b002e94a..0a3c73c06 100644 --- a/files/KoreBuild/modules/teamcity/module.targets +++ b/files/KoreBuild/modules/teamcity/module.targets @@ -1,4 +1,4 @@ - + From 028ef37154ea949029f005e12955a7b4aee6120a Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 1 Nov 2018 13:28:18 -0700 Subject: [PATCH 121/192] Update SDK to 2.2.100-rtm-009578 (#847) --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 4cb70d18e..4aa47c3c8 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -2.2.100-rtm-009571 +2.2.100-rtm-009578 From 1200bfd0536079172dd439e08ec7829a50e9e379 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 1 Nov 2018 13:56:27 -0700 Subject: [PATCH 122/192] Update SDK to 3.0.100-preview-009718 --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index eaa5658ba..22eb3a3c8 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-alpha1-009708 +3.0.100-preview-009718 From cb7e000dfefd70e681ed3d214992176305a443e1 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 1 Nov 2018 23:55:12 -0700 Subject: [PATCH 123/192] Update SDK to 3.0.100-preview-009722 (#850) --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 22eb3a3c8..90ee2a971 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview-009718 +3.0.100-preview-009722 From 1e83b27eca20a61970b1b490a6ee25bad417f4b9 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Sun, 4 Nov 2018 17:48:58 -0800 Subject: [PATCH 124/192] Update SDK to 3.0.100-preview-009728 --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 90ee2a971..e294cc6bd 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview-009722 +3.0.100-preview-009728 From 441ab54fb0ef4a93ad9a842bfd2173a09a64b6c2 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 5 Nov 2018 16:25:23 -0800 Subject: [PATCH 125/192] Update SDK to 3.0.100-preview-009730 (#855) --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index e294cc6bd..9b9a55722 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview-009728 +3.0.100-preview-009730 From 70e6d3e55b187d83d4d21ae303e1358bb8315354 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Fri, 9 Nov 2018 09:00:27 -0800 Subject: [PATCH 126/192] Exclude corehost from runtime store (#863) --- .../build/Internal.AspNetCore.SiteExtension.Sdk.targets | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets index 7f505fb4f..46e8ab01d 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets @@ -36,6 +36,7 @@ + @@ -60,7 +61,7 @@ + Properties="PublishDir=%(_HostingStartupPackageReference.WorkingDirectory)\p;HostingStartupPackageName=%(_HostingStartupPackageReference.Identity);HostingStartupPackageVersion=%(_HostingStartupPackageReference.Version);RuntimeFrameworkVersion=$(HostingStartupRuntimeFrameworkVersion);MicrosoftAspNetCoreAppPackageVersion=$(MicrosoftAspNetCoreAppPackageVersion);NoBuild=false" /> From 75dc930e39876ad3a29b1442749e8e13c43269e1 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Mon, 12 Nov 2018 17:47:43 -0800 Subject: [PATCH 127/192] Add TFM to runtime store manifest (#870) --- ...ernal.AspNetCore.SiteExtension.Sdk.targets | 29 +++++++++++-------- 1 file changed, 17 insertions(+), 12 deletions(-) diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets index 46e8ab01d..a083bd8c4 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets @@ -14,6 +14,22 @@ <_BasePackagePath>content\additionaldeps\ <_RuntimeStoreManifestFile>$(_DepsOutputDirectory)\rs.csproj <_RuntimeStoreOutput>$(_DepsOutputDirectory)\rs\ + + + + 99.9 + netcoreapp3.0 + + + + + + + + + ]]> + @@ -33,21 +49,10 @@ TrimmedDepsFile="$(_DepsOutputDirectory)%(HostingStartupPackageReference.Identity)\%(HostingStartupPackageReference.Identity).deps.json" PackagePath="$(_BasePackagePath)%(HostingStartupPackageReference.Identity)\shared\Microsoft.AspNetCore.App\$(MicrosoftAspNetCoreAppPackageVersion)\" /> - - - - - - - - - - - - + From 1a067f52393b75ab1b585f6c57d006248e152918 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Wed, 14 Nov 2018 08:34:09 -0800 Subject: [PATCH 128/192] Don't use apphost when building runtime store deps file (#874) --- .../build/Internal.AspNetCore.SiteExtension.Sdk.targets | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets index a083bd8c4..b1cc2f2d4 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets @@ -9,7 +9,7 @@ <_TemplatesDirectory>$(MSBuildThisFileDirectory)..\content\ - <_DepsOutputDirectory>$(MSBuildProjectDirectory)\$(BaseIntermediateOutputPath) + <_DepsOutputDirectory>$(RepositoryRoot)\obj\lse\ <_WorkingDirectory>$(_DepsOutputDirectory)\depswork <_BasePackagePath>content\additionaldeps\ <_RuntimeStoreManifestFile>$(_DepsOutputDirectory)\rs.csproj @@ -50,6 +50,7 @@ PackagePath="$(_BasePackagePath)%(HostingStartupPackageReference.Identity)\shared\Microsoft.AspNetCore.App\$(MicrosoftAspNetCoreAppPackageVersion)\" /> + @@ -62,11 +63,11 @@ + Properties="HostingStartupPackageName=%(_HostingStartupPackageReference.Identity);HostingStartupPackageVersion=%(_HostingStartupPackageReference.Version);RuntimeFrameworkVersion=$(HostingStartupRuntimeFrameworkVersion);MicrosoftAspNetCoreAppPackageVersion=$(MicrosoftAspNetCoreAppPackageVersion);UseAppHost=false;NoBuild=false" /> + Properties="PublishDir=%(_HostingStartupPackageReference.WorkingDirectory)\p;HostingStartupPackageName=%(_HostingStartupPackageReference.Identity);HostingStartupPackageVersion=%(_HostingStartupPackageReference.Version);RuntimeFrameworkVersion=$(HostingStartupRuntimeFrameworkVersion);MicrosoftAspNetCoreAppPackageVersion=$(MicrosoftAspNetCoreAppPackageVersion);UseAppHost=false;NoBuild=false" /> From 07ca548548a53e0226eef75eab29a67b0ed7c342 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 14 Nov 2018 09:15:20 -0800 Subject: [PATCH 129/192] Return signing metadata about signable package contents when producing a servicing build (#876) --- files/KoreBuild/Project.Inspection.targets | 5 ++++- version.props | 4 ++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/files/KoreBuild/Project.Inspection.targets b/files/KoreBuild/Project.Inspection.targets index 2945b5294..663b5e03c 100644 --- a/files/KoreBuild/Project.Inspection.targets +++ b/files/KoreBuild/Project.Inspection.targets @@ -61,7 +61,10 @@ false true - + + + + true $(FullPackageOutputPath) diff --git a/version.props b/version.props index f25f39b9a..9d7388a06 100644 --- a/version.props +++ b/version.props @@ -1,8 +1,8 @@ release/2.2 - 2.2.0 - preview2 + 2.2.1 + build t000 $(VersionSuffix)-$(BuildNumber) From 576bd9858150e9aec1c3527dc68ebe9f69d55b5a Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Wed, 14 Nov 2018 09:57:59 -0800 Subject: [PATCH 130/192] Updating SDK to 3.0.100-preview-009750 --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 9b9a55722..c4267acea 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview-009730 +3.0.100-preview-009750 From 9be7d79a8f7e0668f66e584aca1e962f45975511 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 16 Nov 2018 17:31:27 -0800 Subject: [PATCH 131/192] Set IncludeSymbols=false for .Sources packages --- files/KoreBuild/modules/sharedsources/sharedsources.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/files/KoreBuild/modules/sharedsources/sharedsources.csproj b/files/KoreBuild/modules/sharedsources/sharedsources.csproj index 815b97e70..ad47abc14 100644 --- a/files/KoreBuild/modules/sharedsources/sharedsources.csproj +++ b/files/KoreBuild/modules/sharedsources/sharedsources.csproj @@ -35,6 +35,7 @@ $(ProjectDirName) $(PackageId) false + false contentFiles true $(DefaultExcludeItems);$(BaseOutputPath);$(BaseIntermediateOutputPath); From 51159bec310fa2a14a4933fbd4892c9fa9fef599 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Tue, 20 Nov 2018 09:27:31 -0800 Subject: [PATCH 132/192] Updating SDK to 3.0.100-preview-009752 (#878) Updating SDK to 3.0.100-preview-009752 --- Directory.Build.props | 4 + build/dependencies.props | 3 +- build/sources.props | 1 + build/tasks/RepoTasks.csproj | 2 +- docs/Signing.md | 2 +- files/KoreBuild/config/sdk.version | 2 +- .../KoreBuild.RepoTasks.Sdk/Sdk/Sdk.targets | 1 - .../BuildTools.Tasks/BuildTools.Tasks.csproj | 4 +- modules/BuildTools.Tasks/RunDotNet.cs | 2 +- modules/BuildTools.Tasks/ZipArchive.cs | 2 +- modules/BuildTools.Tasks/module.props | 2 +- modules/Directory.Build.props | 1 - .../KoreBuild.Tasks/CheckPackageReferences.cs | 150 --------- .../GenerateDependenciesPropsFile.cs | 158 ---------- .../GeneratePackageVersionPropsFile.cs | 91 ------ .../ProjectModel/DotNetCliReferenceInfo.cs | 24 -- .../ProjectModel/PackageReferenceInfo.cs | 30 -- .../ProjectModel/ProjectFrameworkInfo.cs | 22 -- .../Internal/ProjectModel/ProjectInfo.cs | 45 --- .../ProjectModel/ProjectInfoFactory.cs | 166 ---------- .../Internal/ProjectModel/SolutionInfo.cs | 26 -- .../ProjectModel/SolutionInfoFactory.cs | 73 ----- .../KoreBuild.Tasks/KoreBuild.Tasks.csproj | 1 - .../KoreBuild.Tasks/UpgradeDependencies.cs | 276 ----------------- .../Utilities/DependencyVersionsFile.cs | 235 -------------- .../Utilities/PackageVersionVariable.cs | 56 ---- modules/KoreBuild.Tasks/module.props | 3 - modules/KoreBuild.Tasks/module.targets | 79 +---- .../Utilities/DotNetMuxer.cs | 2 +- src/ApiCheck.Console/ApiCheck.Console.csproj | 2 +- src/ApiCheck.Console/Loader/AssemblyLoader.cs | 2 +- ...soft.AspNetCore.BuildTools.ApiCheck.nuspec | 2 +- src/ApiCheck.Task/ApiCheckTasksBase.cs | 2 +- .../Internal.AspNetCore.Sdk.csproj | 4 +- .../Internal.AspNetCore.Sdk.nuspec | 2 +- .../build/Common.props | 2 +- .../sdk/DefaultItems.targets | 1 - ...ternal.AspNetCore.SiteExtension.Sdk.csproj | 2 +- ...ternal.AspNetCore.SiteExtension.Sdk.nuspec | 2 +- ...nternal.AspNetCore.SiteExtension.Sdk.props | 2 +- test/ApiCheck.Test/ApiCheck.Test.csproj | 2 +- .../CheckPackageReferenceTests.cs | 288 ------------------ .../DependencyVersionsFileTests.cs | 117 ------- .../GenerateDependenciesPropsFileTests.cs | 151 --------- .../GeneratePackageVersionPropsFileTests.cs | 116 ------- .../SolutionInfoFactoryTests.cs | 96 ------ .../UpgradeDependenciesTests.cs | 254 --------------- testassets/SimpleRepo/build/repo.targets | 2 +- .../src/Simple.Lib/Simple.Lib.csproj | 7 +- .../test/Simple.Test/Simple.Test.csproj | 2 +- .../Commands/DependenciesGenerateCommand.cs | 76 ----- .../Commands/DependenciesUpgradeCommand.cs | 99 ------ .../KoreBuild.Console/Commands/RootCommand.cs | 17 +- 53 files changed, 38 insertions(+), 2675 deletions(-) delete mode 100644 modules/KoreBuild.Tasks/CheckPackageReferences.cs delete mode 100644 modules/KoreBuild.Tasks/GenerateDependenciesPropsFile.cs delete mode 100644 modules/KoreBuild.Tasks/GeneratePackageVersionPropsFile.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/DotNetCliReferenceInfo.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/PackageReferenceInfo.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectFrameworkInfo.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfo.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfoFactory.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfo.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfoFactory.cs delete mode 100644 modules/KoreBuild.Tasks/UpgradeDependencies.cs delete mode 100644 modules/KoreBuild.Tasks/Utilities/DependencyVersionsFile.cs delete mode 100644 modules/KoreBuild.Tasks/Utilities/PackageVersionVariable.cs delete mode 100644 test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs delete mode 100644 test/KoreBuild.Tasks.Tests/DependencyVersionsFileTests.cs delete mode 100644 test/KoreBuild.Tasks.Tests/GenerateDependenciesPropsFileTests.cs delete mode 100644 test/KoreBuild.Tasks.Tests/GeneratePackageVersionPropsFileTests.cs delete mode 100644 test/KoreBuild.Tasks.Tests/SolutionInfoFactoryTests.cs delete mode 100644 test/KoreBuild.Tasks.Tests/UpgradeDependenciesTests.cs delete mode 100644 tools/KoreBuild.Console/Commands/DependenciesGenerateCommand.cs delete mode 100644 tools/KoreBuild.Console/Commands/DependenciesUpgradeCommand.cs diff --git a/Directory.Build.props b/Directory.Build.props index 7a110d176..97842faa0 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -20,4 +20,8 @@ $(MSBuildThisFileDirectory) + + + + diff --git a/build/dependencies.props b/build/dependencies.props index 1cea1a5f2..4c0960bdd 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -5,6 +5,7 @@ 2.0.0 1.0.0-beta.18559.6 1.0.0-beta.18559.6 + 1.0.0-alpha-004 15.9.0 0.10.0-beta6 4.7.99 @@ -24,7 +25,7 @@ as long as the version we compile for is binary compatible with what the .NET Core SDK uses. --> - 15.9.19 + 16.0.0-preview.225 $(MicrosoftBuildPackageVersion) $(MicrosoftBuildPackageVersion) $(MicrosoftBuildPackageVersion) diff --git a/build/sources.props b/build/sources.props index dd9e03c79..42c8d8d6a 100644 --- a/build/sources.props +++ b/build/sources.props @@ -9,6 +9,7 @@ https://dotnet.myget.org/F/msbuild/api/v3/index.json; https://dotnet.myget.org/F/nuget-build/api/v3/index.json; https://api.nuget.org/v3/index.json; + https://dotnet.myget.org/F/roslyn-tools/api/v3/index.json; diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index 95cf0c2ce..9930faffd 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -3,7 +3,7 @@ netcoreapp3.0 - net46 + net472 $(DefineConstants);BuildTools $(NoWarn);NU1603 RepoTasks diff --git a/docs/Signing.md b/docs/Signing.md index f5e14c4d6..57bc1a59b 100644 --- a/docs/Signing.md +++ b/docs/Signing.md @@ -80,7 +80,7 @@ Sometimes other signable assemblies end up in a nupkg. Signing for these file ty + PackagePath="tasks/net472/$(TargetFileName)" Visible="false" /> diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index c4267acea..6629fc309 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview-009750 +3.0.100-preview-009752 diff --git a/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.targets b/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.targets index 309a7411d..116e21e3c 100644 --- a/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.targets +++ b/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.targets @@ -17,7 +17,6 @@ - diff --git a/modules/BuildTools.Tasks/BuildTools.Tasks.csproj b/modules/BuildTools.Tasks/BuildTools.Tasks.csproj index 35fd0d86e..563c2a0b6 100644 --- a/modules/BuildTools.Tasks/BuildTools.Tasks.csproj +++ b/modules/BuildTools.Tasks/BuildTools.Tasks.csproj @@ -4,7 +4,7 @@ $(DefineConstants);BuildTools MSBuild tasks. This package is intended for Microsoft use only - netcoreapp3.0;net46 + netcoreapp3.0;net472 Microsoft.AspNetCore.BuildTools Internal.AspNetCore.BuildTools.Tasks @@ -19,7 +19,7 @@ - + diff --git a/modules/BuildTools.Tasks/RunDotNet.cs b/modules/BuildTools.Tasks/RunDotNet.cs index 7c939e2f5..808862453 100644 --- a/modules/BuildTools.Tasks/RunDotNet.cs +++ b/modules/BuildTools.Tasks/RunDotNet.cs @@ -21,7 +21,7 @@ public class RunDotNet protected override string ToolName => "dotnet"; protected override string GenerateFullPathToTool() -#if NET46 +#if NET472 => "dotnet"; #else => DotNetMuxer.MuxerPathOrDefault(); diff --git a/modules/BuildTools.Tasks/ZipArchive.cs b/modules/BuildTools.Tasks/ZipArchive.cs index 7755c1eea..cf8462f67 100644 --- a/modules/BuildTools.Tasks/ZipArchive.cs +++ b/modules/BuildTools.Tasks/ZipArchive.cs @@ -88,7 +88,7 @@ public override bool Execute() } var entry = zip.CreateEntryFromFile(file.ItemSpec, entryName); -#if NET46 +#if NET472 #elif NETCOREAPP3_0 || NETSTANDARD2_0 if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { diff --git a/modules/BuildTools.Tasks/module.props b/modules/BuildTools.Tasks/module.props index 2dc157151..863bf8a34 100644 --- a/modules/BuildTools.Tasks/module.props +++ b/modules/BuildTools.Tasks/module.props @@ -2,7 +2,7 @@ <_BuildToolsAssembly Condition="'$(MSBuildRuntimeType)' == 'core' ">$(MSBuildThisFileDirectory)netcoreapp3.0\Internal.AspNetCore.BuildTools.Tasks.dll - <_BuildToolsAssembly Condition="'$(MSBuildRuntimeType)' != 'core' ">$(MSBuildThisFileDirectory)net46\Internal.AspNetCore.BuildTools.Tasks.dll + <_BuildToolsAssembly Condition="'$(MSBuildRuntimeType)' != 'core' ">$(MSBuildThisFileDirectory)net472\Internal.AspNetCore.BuildTools.Tasks.dll <_BuildTasksPrefix> diff --git a/modules/Directory.Build.props b/modules/Directory.Build.props index efd803f2d..3d7bd8623 100644 --- a/modules/Directory.Build.props +++ b/modules/Directory.Build.props @@ -4,5 +4,4 @@ false - diff --git a/modules/KoreBuild.Tasks/CheckPackageReferences.cs b/modules/KoreBuild.Tasks/CheckPackageReferences.cs deleted file mode 100644 index c99d5dd26..000000000 --- a/modules/KoreBuild.Tasks/CheckPackageReferences.cs +++ /dev/null @@ -1,150 +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.Collections.Generic; -using System.IO; -using System.Linq; -using KoreBuild.Tasks.ProjectModel; -using KoreBuild.Tasks.Utilities; -using Microsoft.AspNetCore.BuildTools; -using Microsoft.Build.Construction; -using Microsoft.Build.Exceptions; -using Microsoft.Build.Framework; -using NuGet.Versioning; - -namespace KoreBuild.Tasks -{ - /// - /// Ensures MSBuild files use PackageReference responsibly. - /// - public class CheckPackageReferences : Microsoft.Build.Utilities.Task - { - /// - /// The solutions of csproj files to check. - /// - [Required] - public ITaskItem[] Projects { get; set; } - - /// - /// The file that contains the PropertyGroup of versions - /// - [Required] - public string DependenciesFile { get; set; } - - public string[] Properties { get; set; } - - public override bool Execute() - { - if (Projects == null || Projects.Length == 0) - { - Log.LogMessage(MessageImportance.Low, "No projects or solutions were found. Skipping PackageReference validation."); - return true; - } - - if (!File.Exists(DependenciesFile)) - { - Log.LogKoreBuildError(KoreBuildErrors.DependenciesFileDoesNotExist, $"Expected the dependencies file to exist at {DependenciesFile}"); - return false; - } - - if (!DependencyVersionsFile.TryLoad(DependenciesFile, out var depsFile)) - { - Log.LogError($"Could not load the dependencies file from {DependenciesFile}"); - return false; - } - - if (!depsFile.HasVersionsPropertyGroup) - { - Log.LogKoreBuildWarning(KoreBuildErrors.PackageRefPropertyGroupNotFound, $"No PropertyGroup with Label=\"{DependencyVersionsFile.PackageVersionsLabel}\" or Label=\"{DependencyVersionsFile.AutoPackageVersionsLabel}\" could be found in {DependenciesFile}"); - } - - foreach (var proj in Projects) - { - var ext = Path.GetExtension(proj.ItemSpec); - if (ext == ".sln") - { - var solutionProps = MSBuildListSplitter.GetNamedProperties(Properties); - var projectFiles = Projects.SelectMany(p => SolutionInfoFactory.GetProjects(p, solutionProps)).Distinct(); - foreach (var project in projectFiles) - { - VerifyPackageReferences(project, depsFile.VersionVariables); - } - } - else - { - VerifyPackageReferences(proj.ItemSpec, depsFile.VersionVariables); - } - } - - return !Log.HasLoggedErrors; - } - - private void VerifyPackageReferences(string filePath, IReadOnlyDictionary versionVariables) - { - ProjectRootElement doc; - try - { - doc = ProjectRootElement.Open(filePath); - } - catch (InvalidProjectFileException ex) - { - Log.LogError(null, null, null, filePath, 0, 0, 0, 0, message: "Invalid project file: " + ex.Message); - return; - } - - var packageReferences = doc.Items.Where(i => i.ItemType == "PackageReference"); - foreach (var pkgRef in packageReferences) - { - var id = pkgRef.Include; - - if (string.IsNullOrEmpty(id)) - { - // this node is an Update or Remove node - continue; - } - - var versionMetadata = pkgRef.Metadata.LastOrDefault(m => m.Name == "Version"); - var versionRaw = versionMetadata?.Value; - if (versionMetadata == null || string.IsNullOrEmpty(versionRaw)) - { - Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.PackageReferenceDoesNotHaveVersion, $"PackageReference to {id} does not define a Version"); - continue; - } - - var versionIsVariable = - versionRaw != null - && versionRaw.Length > 3 - && versionRaw[0] == '$' - && versionRaw[1] == '(' - && versionRaw[versionRaw.Length - 1] == ')' - && versionRaw.IndexOf(')') == versionRaw.Length - 1; - - if (!versionIsVariable) - { - Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.PackageRefHasLiteralVersion, "PackageReference must use an MSBuild variable to set the version."); - continue; - } - - var versionVarName = versionRaw.Substring(2, versionRaw.Length - 3); - - if (!versionVariables.TryGetValue(versionVarName, out var variable)) - { - Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.VariableNotFoundInDependenciesPropsFile, $"The variable {versionRaw} could not be found in {DependenciesFile}"); - continue; - } - - var versionValue = variable.Version; - if (!VersionRange.TryParse(versionValue, out var nugetVersion)) - { - Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.InvalidPackageVersion, $"PackageReference to {id} has an invalid version identifier: '{versionValue}'"); - continue; - } - - if (nugetVersion.IsFloating) - { - Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.PackageRefHasFloatingVersion, $"PackageReference to {id} uses a floating version: '{versionValue}'"); - } - } - } - } -} diff --git a/modules/KoreBuild.Tasks/GenerateDependenciesPropsFile.cs b/modules/KoreBuild.Tasks/GenerateDependenciesPropsFile.cs deleted file mode 100644 index 149fc5b8d..000000000 --- a/modules/KoreBuild.Tasks/GenerateDependenciesPropsFile.cs +++ /dev/null @@ -1,158 +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; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using KoreBuild.Tasks.ProjectModel; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Construction; -using Microsoft.Build.Evaluation; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace KoreBuild.Tasks -{ - /// - /// Generates the build/dependencies.props file base on your current project, - /// and updates all PackageReferences in and to use MSBuild variables. - /// - public class GenerateDependenciesPropsFile : Microsoft.Build.Utilities.Task, ICancelableTask - { - private readonly CancellationTokenSource _cts = new CancellationTokenSource(); - - /// - /// The projects to update - /// - [Required] - public ITaskItem[] Projects { get; set; } - - /// - /// other files to update that may have PackageReferences in them - /// - public ITaskItem[] OtherImports { get; set; } - - /// - /// Location of the dependenices.props file - /// - [Required] - public string DependenciesFile { get; set; } - - /// - /// Additional properties to use when evaluating the projects - /// - public string[] Properties { get; set; } - - public void Cancel() - { - _cts.Cancel(); - } - - public override bool Execute() - { - var unifiedPackageList = new Dictionary(StringComparer.OrdinalIgnoreCase); - - var projects = new ProjectInfoFactory(Log).CreateMany(Projects, Properties, false, _cts.Token); - var packageRefs = projects.SelectMany(p => p.Frameworks).SelectMany(f => f.Dependencies); - - foreach (var packageRef in packageRefs) - { - if (packageRef.Value.IsImplicitlyDefined) - { - // skip PackageReferences added by the SDK - continue; - } - - if (packageRef.Value.NoWarn.Contains(KoreBuildErrors.Prefix + KoreBuildErrors.ConflictingPackageReferenceVersions)) - { - // Make it possible to suppress version conflicts while generating this file. - continue; - } - - if (unifiedPackageList.TryGetValue(packageRef.Value.Id, out var other)) - { - if (other.Version != packageRef.Value.Version) - { - Log.LogKoreBuildError(KoreBuildErrors.ConflictingPackageReferenceVersions, $"Conflicting dependency versions for {packageRef.Value.Id}: {other.Project.FileName} references '{other.Version}' but {packageRef.Value.Project.FileName} references '{packageRef.Value.Version}'"); - } - } - else - { - unifiedPackageList.Add(packageRef.Value.Id, packageRef.Value); - Log.LogMessage(MessageImportance.Low, $"Found {packageRef.Value.Id} = {packageRef.Value.Version}"); - } - } - - if (Log.HasLoggedErrors) - { - return false; - } - - var items = unifiedPackageList.Values.Select(p => new TaskItem(p.Id, new Hashtable { ["Version"] = p.Version })).ToArray(); - - var task = new GeneratePackageVersionPropsFile - { - AddOverrideImport = true, - SuppressVariableLabels = true, - Packages = items, - BuildEngine = BuildEngine, - HostObject = HostObject, - OutputPath = DependenciesFile, - }; - - if (!task.Execute()) - { - return false; - } - - var otherImports = OtherImports != null - ? OtherImports.Select(p => p.ItemSpec) - : Array.Empty(); - - foreach (var proj in projects.Select(p => p.FullPath).Concat(otherImports)) - { - var project = ProjectRootElement.Open(proj, ProjectCollection.GlobalProjectCollection, preserveFormatting: true); - var changed = false; - foreach (var item in project.Items.Where(i => i.ItemType == "PackageReference")) - { - var noWarn = item.Metadata.FirstOrDefault(m => m.Name == "NoWarn"); - if (noWarn != null && noWarn.Value.Contains(KoreBuildErrors.Prefix + KoreBuildErrors.ConflictingPackageReferenceVersions)) - { - continue; - } - - var versionMetadata = item.Metadata.LastOrDefault(p => p.Name == "Version"); - if (versionMetadata != null && versionMetadata.Value.StartsWith("$(")) - { - continue; - } - changed = true; - - var varName = $"$({DependencyVersionsFile.GetVariableName(item.Include)})"; - if (versionMetadata == null) - { - item.AddMetadata("Version", varName, expressAsAttribute: true); - } - else - { - versionMetadata.Value = varName; - } - } - - if (changed) - { - Log.LogMessage(MessageImportance.High, $"Updated {proj}"); - project.Save(proj); - } - else - { - Log.LogMessage(MessageImportance.Normal, $"Skipping {proj}. Already up to date."); - } - } - - return !Log.HasLoggedErrors; - } - } -} diff --git a/modules/KoreBuild.Tasks/GeneratePackageVersionPropsFile.cs b/modules/KoreBuild.Tasks/GeneratePackageVersionPropsFile.cs deleted file mode 100644 index 38c34cf15..000000000 --- a/modules/KoreBuild.Tasks/GeneratePackageVersionPropsFile.cs +++ /dev/null @@ -1,91 +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.IO; -using System.Text; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace KoreBuild.Tasks -{ - public class GeneratePackageVersionPropsFile : Task - { - [Required] - public ITaskItem[] Packages { get; set; } - - [Required] - public string OutputPath { get; set; } - - public bool AddOverrideImport { get; set; } - - public string[] AdditionalImports { get; set; } - - public bool SuppressVariableLabels { get; set; } - - public override bool Execute() - { - OutputPath = OutputPath.Replace('\\', '/'); - Directory.CreateDirectory(Path.GetDirectoryName(OutputPath)); - - DependencyVersionsFile depsFile; - if (File.Exists(OutputPath)) - { - if (!DependencyVersionsFile.TryLoad(OutputPath, out depsFile)) - { - depsFile = DependencyVersionsFile.Create(AddOverrideImport, AdditionalImports); - Log.LogWarning($"Could not load the existing deps file from {OutputPath}. This file will be overwritten."); - } - } - else - { - depsFile = DependencyVersionsFile.Create(AddOverrideImport, AdditionalImports); - } - - var varNames = new HashSet(); - foreach (var pkg in Packages) - { - var packageVersion = pkg.GetMetadata("Version"); - - if (string.IsNullOrEmpty(packageVersion)) - { - Log.LogError("Package {0} is missing the Version metadata", pkg.ItemSpec); - continue; - } - - string packageVarName; - if (!string.IsNullOrEmpty(pkg.GetMetadata("VariableName"))) - { - packageVarName = pkg.GetMetadata("VariableName"); - if (!packageVarName.EndsWith("Version", StringComparison.Ordinal)) - { - Log.LogError("VariableName for {0} must end in 'Version'", pkg.ItemSpec); - continue; - } - } - else - { - packageVarName = DependencyVersionsFile.GetVariableName(pkg.ItemSpec); - } - - if (varNames.Contains(packageVarName)) - { - Log.LogError("Multiple packages would produce {0} in the generated dependencies.props file. Set VariableName to differentiate the packages manually", packageVarName); - continue; - } - - var item = depsFile.Update(packageVarName, packageVersion); - if (!SuppressVariableLabels) - { - item.SetLabel(pkg.ItemSpec); - } - } - - depsFile.Save(OutputPath); - Log.LogMessage(MessageImportance.Normal, $"Generated {OutputPath}"); - return !Log.HasLoggedErrors; - } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/DotNetCliReferenceInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/DotNetCliReferenceInfo.cs deleted file mode 100644 index d4a9712fd..000000000 --- a/modules/KoreBuild.Tasks/Internal/ProjectModel/DotNetCliReferenceInfo.cs +++ /dev/null @@ -1,24 +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; - -namespace KoreBuild.Tasks.ProjectModel -{ - internal class DotNetCliReferenceInfo - { - public DotNetCliReferenceInfo(string id, string version) - { - if (string.IsNullOrEmpty(id)) - { - throw new ArgumentException(nameof(id)); - } - - Id = id; - Version = version; - } - - public string Id { get; } - public string Version { get; } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/PackageReferenceInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/PackageReferenceInfo.cs deleted file mode 100644 index 63a9edde8..000000000 --- a/modules/KoreBuild.Tasks/Internal/ProjectModel/PackageReferenceInfo.cs +++ /dev/null @@ -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; -using System.Collections.Generic; - -namespace KoreBuild.Tasks.ProjectModel -{ - internal class PackageReferenceInfo - { - public PackageReferenceInfo(string id, string version, bool isImplicitlyDefined, IReadOnlyList noWarn) - { - if (string.IsNullOrEmpty(id)) - { - throw new ArgumentException(nameof(id)); - } - - Id = id; - Version = version; - IsImplicitlyDefined = isImplicitlyDefined; - NoWarn = noWarn; - } - - public string Id { get; } - public string Version { get; } - public bool IsImplicitlyDefined { get; } - public IReadOnlyList NoWarn { get; } - public ProjectInfo Project { get; internal set; } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectFrameworkInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectFrameworkInfo.cs deleted file mode 100644 index ee0f9d3db..000000000 --- a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectFrameworkInfo.cs +++ /dev/null @@ -1,22 +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 NuGet.Frameworks; - -namespace KoreBuild.Tasks.ProjectModel -{ - internal class ProjectFrameworkInfo - { - public ProjectFrameworkInfo(NuGetFramework targetFramework, IReadOnlyDictionary dependencies) - { - TargetFramework = targetFramework ?? throw new ArgumentNullException(nameof(targetFramework)); - Dependencies = dependencies ?? throw new ArgumentNullException(nameof(dependencies)); - } - - public NuGetFramework TargetFramework { get; } - public IReadOnlyDictionary Dependencies { get; } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfo.cs deleted file mode 100644 index 95dc0780f..000000000 --- a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfo.cs +++ /dev/null @@ -1,45 +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.IO; -using System.Linq; - -namespace KoreBuild.Tasks.ProjectModel -{ - internal class ProjectInfo - { - public ProjectInfo(string fullPath, - string projectExtensionsPath, - IReadOnlyList frameworks, - IReadOnlyList tools) - { - if (!Path.IsPathRooted(fullPath)) - { - throw new ArgumentException("Path must be absolute", nameof(fullPath)); - } - - Frameworks = frameworks ?? throw new ArgumentNullException(nameof(frameworks)); - Tools = tools ?? throw new ArgumentNullException(nameof(tools)); - - FullPath = fullPath; - FileName = Path.GetFileName(fullPath); - Directory = Path.GetDirectoryName(FullPath); - ProjectExtensionsPath = projectExtensionsPath ?? Path.Combine(Directory, "obj"); - - foreach (var dep in frameworks.SelectMany(f => f.Dependencies)) - { - dep.Value.Project = this; - } - } - - public string FullPath { get; } - public string FileName { get; } - public string ProjectExtensionsPath { get; } - public string Directory { get; } - - public IReadOnlyList Frameworks { get; } - public IReadOnlyList Tools { get; } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfoFactory.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfoFactory.cs deleted file mode 100644 index 65e5879dc..000000000 --- a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfoFactory.cs +++ /dev/null @@ -1,166 +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.Concurrent; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.BuildTools; -using Microsoft.Build.Construction; -using Microsoft.Build.Evaluation; -using Microsoft.Build.Execution; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using NuGet.Frameworks; - -namespace KoreBuild.Tasks.ProjectModel -{ - internal class ProjectInfoFactory - { - private readonly TaskLoggingHelper _logger; - - public ProjectInfoFactory(TaskLoggingHelper logger) - { - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - } - - public IReadOnlyList CreateMany(ITaskItem[] projectItems, string[] properties, bool policyDesignBuild, CancellationToken token) - { - if (projectItems == null) - { - return Array.Empty(); - } - - var cts = new CancellationTokenSource(); - token.Register(() => cts.Cancel()); - var solutionProps = MSBuildListSplitter.GetNamedProperties(properties); - var projectFiles = projectItems.SelectMany(p => SolutionInfoFactory.GetProjects(p, solutionProps)).Distinct(); - var projects = new ConcurrentBag(); - var stop = Stopwatch.StartNew(); - - Parallel.ForEach(projectFiles, projectFile => - { - if (cts.Token.IsCancellationRequested) - { - return; - } - - try - { - projects.Add(Create(projectFile, policyDesignBuild)); - } - catch (Exception ex) - { - _logger.LogErrorFromException(ex); - cts.Cancel(); - } - }); - - stop.Stop(); - _logger.LogMessage(MessageImportance.Low, $"Finished design-time build in {stop.ElapsedMilliseconds}ms"); - return projects.ToArray(); - } - - public ProjectInfo Create(string path, bool policyDesignBuild) - { - var project = GetProject(path, ProjectCollection.GlobalProjectCollection, policyDesignBuild); - var instance = project.CreateProjectInstance(ProjectInstanceSettings.ImmutableWithFastItemLookup); - var projExtPath = instance.GetPropertyValue("MSBuildProjectExtensionsPath"); - - var targetFrameworks = instance.GetPropertyValue("TargetFrameworks"); - var targetFramework = instance.GetPropertyValue("TargetFramework"); - - var frameworks = new List(); - if (!string.IsNullOrEmpty(targetFrameworks) && string.IsNullOrEmpty(targetFramework)) - { - // multi targeting - foreach (var tfm in targetFrameworks.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) - { - project.SetGlobalProperty("TargetFramework", tfm); - var innerBuild = project.CreateProjectInstance(ProjectInstanceSettings.ImmutableWithFastItemLookup); - - var tfmInfo = new ProjectFrameworkInfo(NuGetFramework.Parse(tfm), GetDependencies(innerBuild)); - - frameworks.Add(tfmInfo); - } - - project.RemoveGlobalProperty("TargetFramework"); - } - else if (!string.IsNullOrEmpty(targetFramework)) - { - var tfmInfo = new ProjectFrameworkInfo(NuGetFramework.Parse(targetFramework), GetDependencies(instance)); - - frameworks.Add(tfmInfo); - } - - var projectDir = Path.GetDirectoryName(path); - - var tools = GetTools(instance).ToArray(); - - return new ProjectInfo(path, projExtPath, frameworks, tools); - } - - private static Project GetProject(string path, ProjectCollection projectCollection, bool policyDesignBuild) - { - var projects = projectCollection.GetLoadedProjects(path); - foreach (var proj in projects) - { - if (proj.GetPropertyValue("DesignTimeBuild") == "true") - { - return proj; - } - } - var xml = ProjectRootElement.Open(path, projectCollection); - var globalProps = new Dictionary() - { - ["DesignTimeBuild"] = "true", - }; - if (policyDesignBuild) - { - globalProps["PolicyDesignTimeBuild"] = "true"; - } - var project = new Project(xml, - globalProps, - toolsVersion: "15.0", - projectCollection: projectCollection) - { - IsBuildEnabled = false - }; - return project; - } - - private IReadOnlyDictionary GetDependencies(ProjectInstance project) - { - var references = new Dictionary(StringComparer.OrdinalIgnoreCase); - foreach (var item in project.GetItems("PackageReference")) - { - bool.TryParse(item.GetMetadataValue("IsImplicitlyDefined"), out var isImplicit); - var noWarn = item.GetMetadataValue("NoWarn"); - IReadOnlyList noWarnItems = string.IsNullOrEmpty(noWarn) - ? Array.Empty() - : noWarn.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); - - var info = new PackageReferenceInfo(item.EvaluatedInclude, item.GetMetadataValue("Version"), isImplicit, noWarnItems); - - if (references.ContainsKey(info.Id)) - { - _logger.LogKoreBuildWarning(project.ProjectFileLocation.File, KoreBuildErrors.DuplicatePackageReference, $"Found a duplicate PackageReference for {info.Id}. Restore results may be unpredictable."); - } - - references[info.Id] = info; - } - - return references; - } - - private static IEnumerable GetTools(ProjectInstance project) - { - return project.GetItems("DotNetCliToolReference").Select(item => - new DotNetCliReferenceInfo(item.EvaluatedInclude, item.GetMetadataValue("Version"))); - } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfo.cs deleted file mode 100644 index d968438cb..000000000 --- a/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfo.cs +++ /dev/null @@ -1,26 +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; - -namespace KoreBuild.Tasks.ProjectModel -{ - internal class SolutionInfo - { - public SolutionInfo(string fullPath, IReadOnlyList projects) - { - if (string.IsNullOrEmpty(fullPath)) - { - throw new ArgumentException(nameof(fullPath)); - } - - FullPath = fullPath; - Projects = projects ?? throw new ArgumentNullException(nameof(projects)); - } - - public string FullPath { get; } - - public IReadOnlyList Projects { get; } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfoFactory.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfoFactory.cs deleted file mode 100644 index 18d2a2550..000000000 --- a/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfoFactory.cs +++ /dev/null @@ -1,73 +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.IO; -using System.Linq; -using Microsoft.AspNetCore.BuildTools; -using Microsoft.Build.Construction; -using Microsoft.Build.Framework; - -namespace KoreBuild.Tasks.ProjectModel -{ - internal class SolutionInfoFactory - { - public static SolutionInfo Create(string filePath, string configName) - { - var sln = SolutionFile.Parse(filePath); - - if (string.IsNullOrEmpty(configName)) - { - configName = sln.GetDefaultConfigurationName(); - } - - var projects = new List(); - - var config = sln.SolutionConfigurations.FirstOrDefault(c => c.ConfigurationName == configName); - if (config == null) - { - throw new InvalidOperationException($"A solution configuration by the name of '{configName}' was not found in '{filePath}'"); - } - - foreach (var project in sln.ProjectsInOrder - .Where(p => - p.ProjectType == SolutionProjectType.KnownToBeMSBuildFormat // skips solution folders - && p.ProjectConfigurations.TryGetValue(config.FullName, out var projectConfig) - && projectConfig.IncludeInBuild)) - { - projects.Add(project.AbsolutePath.Replace('\\', '/')); - } - - return new SolutionInfo(filePath, projects.ToArray()); - } - - public static IEnumerable GetProjects(ITaskItem projectOrSolution, IDictionary solutionProperties) - { - var projectFilePath = projectOrSolution.ItemSpec.Replace('\\', '/'); - - if (Path.GetExtension(projectFilePath).Equals(".sln", StringComparison.OrdinalIgnoreCase)) - { - // prefer the AdditionalProperties metadata as this is what the MSBuild task will use when building solutions - var props = MSBuildListSplitter.GetNamedProperties(projectOrSolution.GetMetadata("AdditionalProperties")); - props.TryGetValue("Configuration", out var config); - - if (config == null) - { - solutionProperties.TryGetValue("Configuration", out config); - } - - var sln = Create(projectFilePath, config); - - foreach (var project in sln.Projects) - { - yield return project; - } - } - else - { - yield return Path.GetFullPath(projectFilePath); - } - } - } -} diff --git a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj index 0c42f0032..d238ad4b4 100644 --- a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj +++ b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj @@ -22,7 +22,6 @@ - diff --git a/modules/KoreBuild.Tasks/UpgradeDependencies.cs b/modules/KoreBuild.Tasks/UpgradeDependencies.cs deleted file mode 100644 index 4e5ca9006..000000000 --- a/modules/KoreBuild.Tasks/UpgradeDependencies.cs +++ /dev/null @@ -1,276 +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.IO; -using System.Linq; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; -using System.Xml; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Construction; -using Microsoft.Build.Evaluation; -using Microsoft.Build.Framework; -using NuGet.Build; -using NuGet.Configuration; -using NuGet.Packaging; -using NuGet.Packaging.Core; -using NuGet.Protocol; -using NuGet.Protocol.Core.Types; -using NuGet.Versioning; - -namespace KoreBuild.Tasks -{ - /// - /// Uses a remote package to update the version variables in the local dependencies.props file - /// - public class UpgradeDependencies : Microsoft.Build.Utilities.Task, ICancelableTask - { - private CancellationTokenSource _cts = new CancellationTokenSource(); - - /// - /// The lineup package ID of the nupkg that contains the master dependencies.props files that will be used to upgrade versions - /// - [Required] - public string LineupPackageId { get; set; } - - /// - /// The version of the lineup package. If empty, this will attempt to pull the latest - /// - public string LineupPackageVersion { get; set; } - - /// - /// The dependencies.props file to use versions from - /// - public string LineupDependenciesFile { get; set; } - - /// - /// The NuGet feed containing the lineup package - /// - [Required] - public string LineupPackageRestoreSource { get; set; } - - /// - /// The dependencies.props file to update - /// - [Required] - public string DependenciesFile { get; set; } - - public void Cancel() - { - _cts.Cancel(); - } - - public override bool Execute() - { - return ExecuteAsync().GetAwaiter().GetResult(); - } - - public async Task ExecuteAsync() - { - if (!DependencyVersionsFile.TryLoad(DependenciesFile, out var localVersionsFile)) - { - Log.LogError($"Could not load file from {DependenciesFile}"); - return false; - } - - if (!localVersionsFile.HasVersionsPropertyGroup) - { - Log.LogKoreBuildWarning(KoreBuildErrors.PackageRefPropertyGroupNotFound, $"No PropertyGroup with Label=\"{DependencyVersionsFile.PackageVersionsLabel}\" could be found in {DependenciesFile}"); - } - - if (localVersionsFile.VersionVariables.Count == 0) - { - Log.LogMessage(MessageImportance.High, $"No version variables could be found in {DependenciesFile}"); - return true; - } - - - var tmpNupkgPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - var logger = new MSBuildLogger(Log); - - try - { - var remoteDepsVersionFile = await TryDownloadLineupDepsFile() ?? await TryDownloadLineupPackage(logger, tmpNupkgPath); - - if (remoteDepsVersionFile == null) - { - return false; - } - - var updateCount = UpdateDependencies(localVersionsFile, remoteDepsVersionFile); - - if (updateCount > 0) - { - Log.LogMessage($"Finished updating {updateCount} version variables in {DependenciesFile}"); - localVersionsFile.Save(DependenciesFile); - } - else - { - Log.LogMessage($"Versions in {DependenciesFile} are already up to date"); - } - - return !Log.HasLoggedErrors; - } - finally - { - if (File.Exists(tmpNupkgPath)) - { - File.Delete(tmpNupkgPath); - } - } - } - - private async Task TryDownloadLineupDepsFile() - { - if (string.IsNullOrEmpty(LineupDependenciesFile)) - { - return null; - } - - var path = LineupDependenciesFile; - string text; - if (path.StartsWith("http")) - { - using (var client = new HttpClient()) - { - text = await client.GetStringAsync(path); - } - } - else - { - text = File.ReadAllText(path); - } - - - using (var stringReader = new StringReader(text)) - using (var reader = new XmlTextReader(stringReader)) - { - var project = new Project(ProjectRootElement.Create(reader)); - return DependencyVersionsFile.LoadFromProject(project); - } - } - - private async Task TryDownloadLineupPackage(MSBuildLogger logger, string tmpNupkgPath) - { - VersionRange versionRange; - - if (string.IsNullOrEmpty(LineupPackageVersion)) - { - versionRange = VersionRange.AllFloating; - } - else if (!VersionRange.TryParse(LineupPackageVersion, out versionRange)) - { - Log.LogError($"{LineupPackageVersion} is not a valid NuGet package version"); - return null; - } - - var packageVersion = await GetPackageVersion(versionRange); - if (packageVersion == null) - { - Log.LogError($"Could not find a version of {LineupPackageId} in the version range {versionRange}."); - return null; - } - - var packageId = new PackageIdentity(LineupPackageId, packageVersion); - - var request = new PackageDownloadRequest - { - Identity = packageId, - OutputPath = tmpNupkgPath, - Sources = new[] { LineupPackageRestoreSource }, - }; - - var result = await new PackageDownloader(logger).DownloadPackagesAsync(new[] { request }, TimeSpan.FromSeconds(60), _cts.Token); - - if (!result) - { - Log.LogError("Could not download the lineup package"); - return null; - } - - using (var nupkgReader = new PackageArchiveReader(tmpNupkgPath)) - using (var stream = nupkgReader.GetStream("build/dependencies.props")) - using (var reader = new XmlTextReader(stream)) - { - var projectRoot = ProjectRootElement.Create(reader); - return DependencyVersionsFile.Load(projectRoot); - } - } - - private int UpdateDependencies(DependencyVersionsFile localVersionsFile, DependencyVersionsFile remoteDepsVersionFile) - { - var updateCount = 0; - foreach (var localVariable in localVersionsFile.VersionVariables.Values.Where(v => !v.IsReadOnly)) - { - string remoteVariableVersion; - // special case any package bundled in KoreBuild - if (!string.IsNullOrEmpty(KoreBuildVersion.Current) && localVariable.Name == "InternalAspNetCoreSdkPackageVersion") - { - remoteVariableVersion = KoreBuildVersion.Current; - Log.LogMessage(MessageImportance.Low, "Setting InternalAspNetCoreSdkPackageVersion to the current version of KoreBuild"); - } - else - { - if (remoteDepsVersionFile.VersionVariables.TryGetValue(localVariable.Name, out var remoteVariable)) - { - remoteVariableVersion = remoteVariable.Version; - } - else - { - Log.LogKoreBuildWarning( - DependenciesFile, KoreBuildErrors.PackageVersionNotFoundInLineup, - $"A new version variable for {localVariable.Name} could not be found in {LineupPackageId}. This might be an unsupported external dependency."); - continue; - } - } - - - if (remoteVariableVersion != localVariable.Version) - { - updateCount++; - localVersionsFile.Update(localVariable.Name, remoteVariableVersion); - } - } - - return updateCount; - } - - private async Task GetPackageVersion(VersionRange range) - { - if (!range.IsFloating) - { - return range.MinVersion; - } - - using (var cacheContext = new SourceCacheContext()) - { - var log = new MSBuildLogger(Log); - var defaultSettings = Settings.LoadDefaultSettings(root: null, configFileName: null, machineWideSettings: null); - var sourceProvider = new CachingSourceProvider(new PackageSourceProvider(defaultSettings)); - - var repo = sourceProvider.CreateRepository(new PackageSource(LineupPackageRestoreSource)); - - var metadata = await repo.GetResourceAsync(); - if (!await metadata.Exists(LineupPackageId, cacheContext, log, _cts.Token)) - { - Log.LogError($"Package {LineupPackageId} is not available on '{repo}'"); - return null; - } - - try - { - var versions = await metadata.GetVersions(LineupPackageId, includePrerelease: true, includeUnlisted: false, sourceCacheContext: cacheContext, log: log, token: _cts.Token); - - return range.FindBestMatch(versions); - } - catch (Exception ex) - { - Log.LogError($"Unexpected error while fetching versions from {repo.PackageSource.Source}: " + ex.Message); - return null; - } - } - } - } -} diff --git a/modules/KoreBuild.Tasks/Utilities/DependencyVersionsFile.cs b/modules/KoreBuild.Tasks/Utilities/DependencyVersionsFile.cs deleted file mode 100644 index 2b50a02b1..000000000 --- a/modules/KoreBuild.Tasks/Utilities/DependencyVersionsFile.cs +++ /dev/null @@ -1,235 +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 System.Text; -using Microsoft.Build.Construction; -using Microsoft.Build.Evaluation; - -namespace KoreBuild.Tasks.Utilities -{ - public class DependencyVersionsFile - { - public const string PackageVersionsLabel = "Package Versions"; - - public const string AutoPackageVersionsLabel = "Package Versions: Auto"; - public const string PinnedPackageVersionsLabel = "Package Versions: Pinned"; - - private readonly Dictionary _versionVariables - = new Dictionary(StringComparer.OrdinalIgnoreCase); - - //private readonly SortedDictionary _versionElements - // = new SortedDictionary(StringComparer.OrdinalIgnoreCase); - - private readonly ProjectRootElement _document; - private ProjectPropertyGroupElement _autoPackageVersions; - private ProjectPropertyGroupElement _pinnedPackageVersions; - - private DependencyVersionsFile(ProjectRootElement xDocument) - { - _document = xDocument; - } - - public static string GetVariableName(string packageId) - { - var sb = new StringBuilder(); - var first = true; - foreach (var ch in packageId) - { - if (!char.IsLetterOrDigit(ch)) - { - first = true; - continue; - } - - if (first) - { - first = false; - sb.Append(char.ToUpperInvariant(ch)); - } - else - { - sb.Append(ch); - } - } - sb.Append("PackageVersion"); - return sb.ToString(); - } - - - public static DependencyVersionsFile Create(bool addOverrideImport, string[] additionalImports = null) - { - var projectRoot = ProjectRootElement.Create(NewProjectFileOptions.None); - - projectRoot.AddPropertyGroup().AddProperty("MSBuildAllProjects", "$(MSBuildAllProjects);$(MSBuildThisFileFullPath)"); - - var autoPackageVersions = projectRoot.AddPropertyGroup(); - autoPackageVersions.Label = AutoPackageVersionsLabel; - - if (additionalImports != null) - { - foreach (var item in additionalImports) - { - var import = projectRoot.AddImport(item); - import.Condition = $"Exists('{item}')"; - } - } - - if (addOverrideImport) - { - var import = projectRoot.AddImport("$(DotNetPackageVersionPropsPath)"); - import.Condition = " '$(DotNetPackageVersionPropsPath)' != '' "; - } - - var pinnedPackageVersions = projectRoot.AddPropertyGroup(); - pinnedPackageVersions.Label = PinnedPackageVersionsLabel; - - return new DependencyVersionsFile(projectRoot) - { - _autoPackageVersions = autoPackageVersions, - _pinnedPackageVersions = pinnedPackageVersions, - }; - } - - public static bool TryLoad(string sourceFile, out DependencyVersionsFile file) - { - try - { - file = Load(sourceFile); - return true; - } - catch - { - file = null; - return false; - } - } - - public static DependencyVersionsFile Load(string sourceFile) - { - var project = ProjectRootElement.Open(sourceFile, ProjectCollection.GlobalProjectCollection, preserveFormatting: true); - return Load(project); - } - - public static DependencyVersionsFile Load(ProjectRootElement document) - { - var file = new DependencyVersionsFile(document); - - var propGroups = file._document.PropertyGroups; - - var listPropertyGroups = new List(); - - foreach (var propGroup in propGroups) - { - var attr = propGroup.Label; - if (attr != null && attr.StartsWith(PackageVersionsLabel, StringComparison.OrdinalIgnoreCase)) - { - file.HasVersionsPropertyGroup = true; - listPropertyGroups.Add(propGroup); - } - } - - foreach (var group in listPropertyGroups) - { - var isReadOnly = string.Equals(group.Label, PinnedPackageVersionsLabel, StringComparison.OrdinalIgnoreCase); - if (isReadOnly) - { - file._pinnedPackageVersions = group; - } - else - { - file._autoPackageVersions = group; - } - - foreach (var child in group.Properties) - { - var variable = new PackageVersionVariable(child, isReadOnly); - file._versionVariables[variable.Name] = variable; - } - } - - file.EnsureGroupsCreated(); - return file; - } - - private void EnsureGroupsCreated() - { - if (_autoPackageVersions == null) - { - _autoPackageVersions = _document.AddPropertyGroup(); - _autoPackageVersions.Label = AutoPackageVersionsLabel; - } - - if (_pinnedPackageVersions == null) - { - _pinnedPackageVersions = _document.AddPropertyGroup(); - _pinnedPackageVersions.Label = PinnedPackageVersionsLabel; - } - } - - public static DependencyVersionsFile LoadFromProject(Project project) - { - var file = new DependencyVersionsFile(ProjectRootElement.Create(NewProjectFileOptions.None)); - - foreach (var property in project.AllEvaluatedProperties.Where(p => p.Xml != null)) - { - var group = (ProjectPropertyGroupElement)property.Xml.Parent; - var isReadOnly = string.Equals(group.Label, PinnedPackageVersionsLabel, StringComparison.OrdinalIgnoreCase); - - var variable = new PackageVersionVariable(property.Xml, property.EvaluatedValue?.Trim(), isReadOnly); - file._versionVariables[property.Name] = variable; - } - - file.EnsureGroupsCreated(); - - return file; - } - - public bool HasVersionsPropertyGroup { get; private set; } - - // copying is required so calling .Set while iterating on this doesn't raise an InvalidOperationException - public IReadOnlyDictionary VersionVariables - => new Dictionary(_versionVariables, StringComparer.OrdinalIgnoreCase); - - public PackageVersionVariable Update(string variableName, string version) - { - if (!_versionVariables.TryGetValue(variableName, out var variable)) - { - var element = _document.CreatePropertyElement(variableName); - variable = new PackageVersionVariable(element, version, isReadOnly: false); - _versionVariables[variableName] = variable; - variable.AddToGroup(_autoPackageVersions); - } - - variable.UpdateVersion(version); - return variable; - } - - public PackageVersionVariable AddPinnedVariable(string variableName, string version) - { - if (_versionVariables.ContainsKey(variableName)) - { - throw new InvalidOperationException("Key already exists: " + variableName); - } - - var element = _document.CreatePropertyElement(variableName); - var variable = new PackageVersionVariable(element, version, isReadOnly: true); - _versionVariables.Add(variableName, variable); - variable.AddToGroup(_pinnedPackageVersions); - return variable; - } - - public void Save(string filePath) - { - _autoPackageVersions.RemoveAllChildren(); - foreach (var item in _versionVariables.Values.Where(v => !v.IsReadOnly).OrderBy(v => v.Name)) - { - item.AddToGroup(_autoPackageVersions); - } - - _document.Save(filePath, Encoding.UTF8); - } - } -} diff --git a/modules/KoreBuild.Tasks/Utilities/PackageVersionVariable.cs b/modules/KoreBuild.Tasks/Utilities/PackageVersionVariable.cs deleted file mode 100644 index 4131e2113..000000000 --- a/modules/KoreBuild.Tasks/Utilities/PackageVersionVariable.cs +++ /dev/null @@ -1,56 +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 Microsoft.Build.Construction; - -namespace KoreBuild.Tasks.Utilities -{ - public class PackageVersionVariable - { - private readonly ProjectPropertyElement _element; - - public PackageVersionVariable(ProjectPropertyElement element, bool isReadOnly) - : this(element, element.Value?.Trim(), isReadOnly) - { - } - - public PackageVersionVariable(ProjectPropertyElement element, string version, bool isReadOnly) - { - _element = element ?? throw new ArgumentNullException(nameof(element)); - IsReadOnly = isReadOnly; - Name = element.Name.ToString(); - Version = version ?? string.Empty; - } - - public string Name { get; } - - public string Version - { - get => _element.Value; - private set => _element.Value = value; - } - - public bool IsReadOnly { get; private set; } - - public void UpdateVersion(string version) - { - if (IsReadOnly) - { - throw new InvalidOperationException("You cannot updated a pinned package version variable automatically"); - } - - Version = version; - } - - public void AddToGroup(ProjectPropertyGroupElement group) - { - group.AppendChild(_element); - } - - public void SetLabel(string label) - { - _element.Label = label; - } - } -} diff --git a/modules/KoreBuild.Tasks/module.props b/modules/KoreBuild.Tasks/module.props index 87d34041c..8684f3a7d 100644 --- a/modules/KoreBuild.Tasks/module.props +++ b/modules/KoreBuild.Tasks/module.props @@ -10,12 +10,10 @@ - - @@ -23,7 +21,6 @@ - $(KOREBUILD_DOTNET_ARCH) diff --git a/modules/KoreBuild.Tasks/module.targets b/modules/KoreBuild.Tasks/module.targets index f907ece4e..d64c117c0 100644 --- a/modules/KoreBuild.Tasks/module.targets +++ b/modules/KoreBuild.Tasks/module.targets @@ -3,7 +3,7 @@ GetToolsets;$(PrepareDependsOn) - InstallDotNet;CheckPackageReferences;$(RestoreDependsOn) + InstallDotNet;$(RestoreDependsOn) false $(RepositoryRoot)korebuild.json @@ -47,62 +47,6 @@ Downloads and extracts .NET Core shared runtimes and SDKs. InstallScript="$(_DotNetInstall)"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj index 4170683c2..af941212e 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj @@ -2,7 +2,7 @@ Internal.AspNetCore.SiteExtension.Sdk - netcoreapp3.0;net46 + netcoreapp3.0;net472 false Build targets and extensions to Microsoft.NET.Sdk. This package is intended for Microsoft use only. $(MSBuildThisFileDirectory)$(MSBuildProjectName).nuspec diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec index dff041805..b3a3793ad 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec @@ -11,7 +11,7 @@ - + diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props index 7d7ccfee1..f135ea01f 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props @@ -5,7 +5,7 @@ netcoreapp3.0 - net46 + net472 $(MSBuildThisFileDirectory)..\tools\$(TaskFolder)\Internal.AspNetCore.SiteExtension.Sdk.dll diff --git a/test/ApiCheck.Test/ApiCheck.Test.csproj b/test/ApiCheck.Test/ApiCheck.Test.csproj index 441e64089..25a4991b1 100644 --- a/test/ApiCheck.Test/ApiCheck.Test.csproj +++ b/test/ApiCheck.Test/ApiCheck.Test.csproj @@ -3,7 +3,7 @@ netcoreapp3.0 - $(TargetFrameworks);net461 + $(TargetFrameworks);net472 diff --git a/test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs b/test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs deleted file mode 100644 index a83450ff5..000000000 --- a/test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs +++ /dev/null @@ -1,288 +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 BuildTools.Tasks.Tests; -using Microsoft.Build.Utilities; -using System.IO; -using Xunit; -using Xunit.Abstractions; - -namespace KoreBuild.Tasks.Tests -{ - [Collection(nameof(MSBuildTestCollection))] - public class CheckPackageReferenceTests : TaskTestBase - { - public CheckPackageReferenceTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) : base(output, fixture) - { - } - - [Fact] - public void ItAllowsPinnedAndUnpinnedVersions() - { - var depsProps = Path.Combine(TempDir, "dependencies.props"); - File.WriteAllText(depsProps, $@" - - - 1.0.0 - - - - - - 1.0.0 - - -".Replace('`', '"')); - - var csproj = Path.Combine(TempDir, "Test.csproj"); - File.WriteAllText(csproj, $@" - - - - - $(BaseLinePackageVersion) - - - -".Replace('`', '"')); - - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - DependenciesFile = depsProps, - Projects = new[] { new TaskItem(csproj) } - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - } - - [Fact] - public void PassesWhenAllRequirementsAreSatisifed() - { - var depsProps = Path.Combine(TempDir, "dependencies.props"); - File.WriteAllText(depsProps, $@" - - - 1.0.0 - - -".Replace('`', '"')); - - var csproj = Path.Combine(TempDir, "Test.csproj"); - File.WriteAllText(csproj, $@" - - - - - $(AspNetCorePackageVersion) - - - -".Replace('`', '"')); - - MockEngine.ContinueOnError = true; - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - DependenciesFile = depsProps, - Projects = new[] { new TaskItem(csproj) } - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - } - - [Fact] - public void IgnoresUpdateAndRemoveItems() - { - var depsProps = Path.Combine(TempDir, "dependencies.props"); - File.WriteAllText(depsProps, $@" - - - -".Replace('`', '"')); - - var csproj = Path.Combine(TempDir, "Test.csproj"); - File.WriteAllText(csproj, $@" - - - - - - -".Replace('`', '"')); - - MockEngine.ContinueOnError = true; - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - DependenciesFile = depsProps, - Projects = new[] { new TaskItem(csproj) } - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - } - - [Fact] - public void FailsWhenDependenciesHasNoPropGroup() - { - var depsFile = Path.Combine(TempDir, "deps.props"); - File.WriteAllText(depsFile, $@" - - - 1.0.0 - - -".Replace('`', '"')); - - MockEngine.ContinueOnError = true; - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - Projects = new[] { new TaskItem(depsFile) }, - DependenciesFile = depsFile, - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - Assert.NotEmpty(MockEngine.Warnings); - Assert.Contains(MockEngine.Warnings, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefPropertyGroupNotFound); - } - - [Fact] - public void FailsWhenVariableIsNotInDependenciesPropsFile() - { - var depsProps = Path.Combine(TempDir, "dependencies.props"); - File.WriteAllText(depsProps, $@" - - - - -".Replace('`', '"')); - - var csproj = Path.Combine(TempDir, "Test.csproj"); - File.WriteAllText(csproj, $@" - - - - - -".Replace('`', '"')); - - MockEngine.ContinueOnError = true; - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - Projects = new[] { new TaskItem(csproj) }, - DependenciesFile = depsProps, - }; - - Assert.False(task.Execute(), "Task is expected to fail"); - Assert.NotEmpty(MockEngine.Errors); - Assert.Contains(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.VariableNotFoundInDependenciesPropsFile); - } - - [Fact] - public void FailsWhenPackageVersionFloat() - { - var depsProps = Path.Combine(TempDir, "dependencies.props"); - File.WriteAllText(depsProps, $@" - - - 1.0.0-* - - -".Replace('`', '"')); - - var csproj = Path.Combine(TempDir, "Test.csproj"); - File.WriteAllText(csproj, $@" - - - - - -".Replace('`', '"')); - - MockEngine.ContinueOnError = true; - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - Projects = new[] { new TaskItem(csproj) }, - DependenciesFile = depsProps, - }; - - Assert.False(task.Execute(), "Task is expected to fail"); - Assert.NotEmpty(MockEngine.Errors); - Assert.Contains(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefHasFloatingVersion); - } - - [Fact] - public void FailsWhenPackageVersionIsInvalid() - { - var depsProps = Path.Combine(TempDir, "dependencies.props"); - File.WriteAllText(depsProps, $@" - - - 1 - - -".Replace('`', '"')); - - var csproj = Path.Combine(TempDir, "Test.csproj"); - File.WriteAllText(csproj, $@" - - - - - -".Replace('`', '"')); - - MockEngine.ContinueOnError = true; - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - Projects = new[] { new TaskItem(csproj) }, - DependenciesFile = depsProps, - }; - - Assert.False(task.Execute(), "Task is expected to fail"); - Assert.NotEmpty(MockEngine.Errors); - Assert.Contains(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.InvalidPackageVersion); - } - - [Theory] - [InlineData("1.0.0")] - [InlineData("1.0.0-$(Suffix)")] - [InlineData("$(Prefix)-1.0.0-$(Suffix)")] - [InlineData("$(Prefix)-1.0.0")] - public void FailsWhenPackagesReferenceVersionDoesNotCompletelyUseVariables(string version) - { - var depsProps = Path.Combine(TempDir, "dependencies.props"); - File.WriteAllText(depsProps, $@" - - - -".Replace('`', '"')); - - var csproj = Path.Combine(TempDir, "Test.csproj"); - File.WriteAllText(csproj, $@" - - - - - -".Replace('`', '"')); - - MockEngine.ContinueOnError = true; - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - Projects = new[] { new TaskItem(csproj) }, - DependenciesFile = depsProps, - }; - - Assert.False(task.Execute(), "Task is expected to fail"); - Assert.NotEmpty(MockEngine.Errors); - var error = Assert.Single(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefHasLiteralVersion); - Assert.Equal(4, error.LineNumber); - } - } -} diff --git a/test/KoreBuild.Tasks.Tests/DependencyVersionsFileTests.cs b/test/KoreBuild.Tasks.Tests/DependencyVersionsFileTests.cs deleted file mode 100644 index 8b030706f..000000000 --- a/test/KoreBuild.Tasks.Tests/DependencyVersionsFileTests.cs +++ /dev/null @@ -1,117 +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; -using System.IO; -using System.Linq; -using BuildTools.Tasks.Tests; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Construction; -using Microsoft.Build.Utilities; -using Xunit; -using Xunit.Abstractions; - -namespace KoreBuild.Tasks.Tests -{ - [Collection(nameof(MSBuildTestCollection))] - public class DependencyVersionsFileTests : IDisposable - { - private readonly string _tempFile; - private readonly ITestOutputHelper _output; - - public DependencyVersionsFileTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) - { - _output = output; - fixture.InitializeEnvironment(output); - _tempFile = Path.Combine(AppContext.BaseDirectory, Path.GetRandomFileName()); - } - - public void Dispose() - { - if (File.Exists(_tempFile)) - { - File.Delete(_tempFile); - } - } - - [Fact] - public void ItSortsVariablesAlphabetically() - { - var depsFile = DependencyVersionsFile.Create(addOverrideImport: true); - depsFile.Update("XyzPackageVersion", "123"); - depsFile.Update("AbcPackageVersion", "456"); - depsFile.Save(_tempFile); - - var project = ProjectRootElement.Open(_tempFile); - _output.WriteLine(File.ReadAllText(_tempFile)); - - var versions = Assert.Single(project.PropertyGroups, p => p.Label == DependencyVersionsFile.AutoPackageVersionsLabel); - Assert.Collection(versions.Properties, - v => Assert.Equal("AbcPackageVersion", v.Name), - v => Assert.Equal("XyzPackageVersion", v.Name)); - } - - [Fact] - public void SetIsCaseInsensitive() - { - var depsFile = DependencyVersionsFile.Create(addOverrideImport: true); - depsFile.Update("XunitRunnerVisualStudioVersion", "2.3.0"); - depsFile.Update("XunitRunnerVisualstudioVersion", "2.4.0"); - depsFile.Save(_tempFile); - - var project = ProjectRootElement.Open(_tempFile); - _output.WriteLine(File.ReadAllText(_tempFile)); - - var versions = Assert.Single(project.PropertyGroups, p => p.Label == DependencyVersionsFile.AutoPackageVersionsLabel); - var prop = Assert.Single(versions.Properties); - Assert.Equal("XunitRunnerVisualStudioVersion", prop.Name); - Assert.Equal("2.4.0", prop.Value); - } - - [Theory] - [InlineData("Microsoft.Data.Sqlite", "MicrosoftDataSqlitePackageVersion")] - [InlineData("SQLitePCLRaw.bundle_green", "SQLitePCLRawBundleGreenPackageVersion")] - [InlineData("runtime.win-x64.Microsoft.NETCore", "RuntimeWinX64MicrosoftNETCorePackageVersion")] - public void GeneratesVariableName(string id, string varName) - { - Assert.Equal(varName, DependencyVersionsFile.GetVariableName(id)); - } - - [Fact] - public void AdditionalImportsAreAdded_WithOverrideImportFalse() - { - // Arrange - var path = "obj/test.props"; - var depsFile = DependencyVersionsFile.Create(addOverrideImport: false, additionalImports: new[] { path }); - depsFile.Save(_tempFile); - - // Act - var project = ProjectRootElement.Open(_tempFile); - _output.WriteLine(File.ReadAllText(_tempFile)); - - // Assert - var import = Assert.Single(project.Imports); - Assert.Equal(path, import.Project); - } - - [Fact] - public void AdditionalImportsAreAdded_WithOverrideImportTrue() - { - // Arrange - var path = "obj/external.props"; - var depsFile = DependencyVersionsFile.Create(addOverrideImport: true, additionalImports: new[] { path }); - depsFile.Save(_tempFile); - - // Act - var project = ProjectRootElement.Open(_tempFile); - _output.WriteLine(File.ReadAllText(_tempFile)); - - // Assert - Assert.Collection( - project.Imports, - import => Assert.Equal(path, import.Project), - import => Assert.Equal("$(DotNetPackageVersionPropsPath)", import.Project)); - } - } -} diff --git a/test/KoreBuild.Tasks.Tests/GenerateDependenciesPropsFileTests.cs b/test/KoreBuild.Tasks.Tests/GenerateDependenciesPropsFileTests.cs deleted file mode 100644 index 0748aec14..000000000 --- a/test/KoreBuild.Tasks.Tests/GenerateDependenciesPropsFileTests.cs +++ /dev/null @@ -1,151 +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; -using System.IO; -using BuildTools.Tasks.Tests; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Construction; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using Xunit; -using Xunit.Abstractions; - -namespace KoreBuild.Tasks.Tests -{ - [Collection(nameof(MSBuildTestCollection))] - public class GenerateDependenciesPropsFileTests : IDisposable - { - private readonly ITestOutputHelper _output; - private readonly string _tempDir; - - public GenerateDependenciesPropsFileTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) - { - _output = output; - _tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - Directory.CreateDirectory(_tempDir); - fixture.InitializeEnvironment(output); - } - - [Fact] - public void GeneratesVariableName() - { - var generatedFile = Path.Combine(_tempDir, "deps.props"); - var csproj = Path.Combine(_tempDir, "test.csproj"); - CreateProject(csproj, "1.2.3"); - - var task = new GenerateDependenciesPropsFile - { - BuildEngine = new MockEngine(_output), - DependenciesFile = generatedFile, - Projects = new[] { new TaskItem(csproj) }, - Properties = Array.Empty(), - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - var depsFile = ProjectRootElement.Open(generatedFile); - _output.WriteLine(File.ReadAllText(generatedFile)); - var pg = Assert.Single(depsFile.PropertyGroups, p => p.Label == DependencyVersionsFile.AutoPackageVersionsLabel); - var prop = Assert.Single(pg.Properties, p => p.Name == "MyDependencyPackageVersion"); - Assert.Equal("1.2.3", prop.Value); - } - - [Fact] - public void IgnoresImplicitlyDefinedVariables() - { - var generatedFile = Path.Combine(_tempDir, "deps.props"); - var csproj = Path.Combine(_tempDir, "test.csproj"); - File.WriteAllText(csproj, $@" - - - netstandard2.0 - -".Replace('`', '"')); - - var task = new GenerateDependenciesPropsFile - { - BuildEngine = new MockEngine(_output), - DependenciesFile = generatedFile, - Projects = new[] { new TaskItem(csproj) }, - Properties = Array.Empty(), - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - var depsFile = ProjectRootElement.Open(generatedFile); - _output.WriteLine(File.ReadAllText(generatedFile)); - var pg = Assert.Single(depsFile.PropertyGroups, p => p.Label == DependencyVersionsFile.AutoPackageVersionsLabel); - Assert.Empty(pg.Properties); - } - - [Fact] - public void FailsWhenConflictingVersions() - { - var generatedFile = Path.Combine(_tempDir, "deps.props"); - var csproj1 = Path.Combine(_tempDir, "test1.csproj"); - var csproj2 = Path.Combine(_tempDir, "test2.csproj"); - CreateProject(csproj1, "1.2.3"); - CreateProject(csproj2, "4.5.6"); - - var engine = new MockEngine(_output) { ContinueOnError = true }; - var task = new GenerateDependenciesPropsFile - { - BuildEngine = engine, - DependenciesFile = generatedFile, - Projects = new[] { new TaskItem(csproj1), new TaskItem(csproj2) }, - Properties = Array.Empty(), - }; - - Assert.False(task.Execute(), "Task is expected to fail"); - Assert.Single(engine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.ConflictingPackageReferenceVersions); - } - - [Fact] - public void DoesNotFailWhenConflictingVersionsAreSuppressed() - { - var generatedFile = Path.Combine(_tempDir, "deps.props"); - var csproj1 = Path.Combine(_tempDir, "test1.csproj"); - var csproj2 = Path.Combine(_tempDir, "test2.csproj"); - CreateProject(csproj1, "1.2.3"); - - File.WriteAllText(csproj2, $@" - - - netstandard2.0 - - - - -".Replace('`', '"')); - - var task = new GenerateDependenciesPropsFile - { - BuildEngine = new MockEngine(_output), - DependenciesFile = generatedFile, - Projects = new[] { new TaskItem(csproj1), new TaskItem(csproj2) }, - Properties = Array.Empty(), - }; - - Assert.True(task.Execute(), "Task is expected to oass"); - } - - private static void CreateProject(string csprojFilePath, string version) - { - File.WriteAllText(csprojFilePath, $@" - - - netstandard2.0 - - - - -".Replace('`', '"')); - } - - - public void Dispose() - { - Directory.Delete(_tempDir, recursive: true); - } - } -} diff --git a/test/KoreBuild.Tasks.Tests/GeneratePackageVersionPropsFileTests.cs b/test/KoreBuild.Tasks.Tests/GeneratePackageVersionPropsFileTests.cs deleted file mode 100644 index 86c731b8c..000000000 --- a/test/KoreBuild.Tasks.Tests/GeneratePackageVersionPropsFileTests.cs +++ /dev/null @@ -1,116 +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; -using System.IO; -using BuildTools.Tasks.Tests; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Construction; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using Xunit; -using Xunit.Abstractions; - -namespace KoreBuild.Tasks.Tests -{ - [Collection(nameof(MSBuildTestCollection))] - public class GeneratePackageVersionPropsFileTests : IDisposable - { - private readonly ITestOutputHelper _output; - private readonly string _tempFile; - - public GeneratePackageVersionPropsFileTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) - { - _output = output; - _tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - fixture.InitializeEnvironment(output); - } - - [Fact] - public void GeneratesFile() - { - var engine = new MockEngine(_output); - var task = new GeneratePackageVersionPropsFile - { - BuildEngine = engine, - Packages = new[] - { - // Order is important. These are intentionally reverse sorted to ensure the generated file sorts properties by prop name - new TaskItem("Newtonsoft.Json", new Hashtable{["Version"] = "10.0.3", ["VariableName"] = "JsonNetVersion"}), - new TaskItem("Microsoft.Azure", new Hashtable{["Version"] = "1.2.0"}), - new TaskItem("Another.Package", new Hashtable{["Version"] = "0.0.1", ["TargetFramework"] = "netstandard1.0"}), - }, - OutputPath = _tempFile, - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - - var project = ProjectRootElement.Open(_tempFile); - _output.WriteLine(File.ReadAllText(_tempFile)); - - Assert.Empty(project.Imports); - Assert.Empty(project.ImportGroups); - - var defaultPropGroup = Assert.Single(project.PropertyGroups, pg => string.IsNullOrEmpty(pg.Label)); - var allProjectsProp = Assert.Single(defaultPropGroup.Properties); - Assert.Equal("MSBuildAllProjects", allProjectsProp.Name); - Assert.Empty(allProjectsProp.Condition); - Assert.Equal("$(MSBuildAllProjects);$(MSBuildThisFileFullPath)", allProjectsProp.Value); - - var versions = Assert.Single(project.PropertyGroups, pg => pg.Label == DependencyVersionsFile.AutoPackageVersionsLabel); - - // Order is important. These should be sorted. - Assert.Collection(versions.Properties, - p => - { - Assert.Equal("AnotherPackagePackageVersion", p.Name); - Assert.Equal("Another.Package", p.Label); - Assert.Equal("0.0.1", p.Value); - Assert.Empty(p.Condition); - }, - p => - { - Assert.Equal("JsonNetVersion", p.Name); - Assert.Equal("Newtonsoft.Json", p.Label); - Assert.Equal("10.0.3", p.Value); - Assert.Empty(p.Condition); - }, - p => - { - Assert.Equal("MicrosoftAzurePackageVersion", p.Name); - Assert.Equal("Microsoft.Azure", p.Label); - Assert.Equal("1.2.0", p.Value); - Assert.Empty(p.Condition); - }); - } - - [Fact] - public void GeneratesImport() - { - var task = new GeneratePackageVersionPropsFile - { - BuildEngine = new MockEngine(_output), - Packages = Array.Empty(), - AddOverrideImport = true, - OutputPath = _tempFile, - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - var project = ProjectRootElement.Open(_tempFile); - _output.WriteLine(File.ReadAllText(_tempFile)); - - var import = Assert.Single(project.Imports); - Assert.Equal("$(DotNetPackageVersionPropsPath)", import.Project); - Assert.Equal(" '$(DotNetPackageVersionPropsPath)' != '' ", import.Condition); - } - - public void Dispose() - { - if (File.Exists(_tempFile)) - { - File.Delete(_tempFile); - } - } - } -} diff --git a/test/KoreBuild.Tasks.Tests/SolutionInfoFactoryTests.cs b/test/KoreBuild.Tasks.Tests/SolutionInfoFactoryTests.cs deleted file mode 100644 index f2eaad004..000000000 --- a/test/KoreBuild.Tasks.Tests/SolutionInfoFactoryTests.cs +++ /dev/null @@ -1,96 +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.IO; -using KoreBuild.Tasks.ProjectModel; -using Xunit; - -namespace KoreBuild.Tasks.Tests -{ - public class SolutionInfoFactoryTests : IDisposable - { - private readonly string _slnFile; - - public SolutionInfoFactoryTests() - { - _slnFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - } - - [Theory] - [InlineData("", new[] { "ClassLib1", "VsixProject" })] - [InlineData("Debug", new[] { "ClassLib1", "VsixProject" })] - [InlineData("DebugNoVSIX", new[] { "ClassLib1" })] - public void FindsProjectsByDefaultConfiguration(string config, string[] projects) - { - File.WriteAllText(_slnFile, @" -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26124.0 -MinimumVisualStudioVersion = 15.0.26124.0 -Project(`{2150E333-8FDC-42A3-9474-1A3956D46DE8}`) = `src`, `src`, `{6BC8A037-601B-412E-B394-92F55C01C7A6}` -EndProject -Project(`{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}`) = `ClassLib1`, `src\ClassLib1\ClassLib1.csproj`, `{89EF0B05-98D4-4C4D-8870-718571091F79}` -EndProject -Project(`{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}`) = `VsixProject`, `src\VsixProject\VsixProject.csproj`, `{86986537-8DF5-423F-A3A8-0CA568A9FFC4}` -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - DebugNoVSIX|Any CPU = DebugNoVSIX|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {89EF0B05-98D4-4C4D-8870-718571091F79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {89EF0B05-98D4-4C4D-8870-718571091F79}.Debug|Any CPU.Build.0 = Debug|Any CPU - {86986537-8DF5-423F-A3A8-0CA568A9FFC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {86986537-8DF5-423F-A3A8-0CA568A9FFC4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {89EF0B05-98D4-4C4D-8870-718571091F79}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {89EF0B05-98D4-4C4D-8870-718571091F79}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {86986537-8DF5-423F-A3A8-0CA568A9FFC4}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {89EF0B05-98D4-4C4D-8870-718571091F79} = {6BC8A037-601B-412E-B394-92F55C01C7A6} - {86986537-8DF5-423F-A3A8-0CA568A9FFC4} = {6BC8A037-601B-412E-B394-92F55C01C7A6} - EndGlobalSection -EndGlobal -".Replace('`', '"')); - - var solution = SolutionInfoFactory.Create(_slnFile, config); - Assert.Equal(projects.Length, solution.Projects.Count); - Assert.All(projects, expected => Assert.Contains(solution.Projects, proj => Path.GetFileNameWithoutExtension(proj) == expected)); - } - - [Fact] - public void ThrowsForBadConfigName() - { - File.WriteAllText(_slnFile, @" -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26124.0 -MinimumVisualStudioVersion = 15.0.26124.0 -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal -".Replace('`', '"')); - - Assert.Throws(() => SolutionInfoFactory.Create(_slnFile, "Release")); - } - - public void Dispose() - { - try - { - File.Delete(_slnFile); - } - catch { } - } - } -} diff --git a/test/KoreBuild.Tasks.Tests/UpgradeDependenciesTests.cs b/test/KoreBuild.Tasks.Tests/UpgradeDependenciesTests.cs deleted file mode 100644 index 3de7997f3..000000000 --- a/test/KoreBuild.Tasks.Tests/UpgradeDependenciesTests.cs +++ /dev/null @@ -1,254 +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.IO; -using System.Threading.Tasks; -using BuildTools.Tasks.Tests; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Construction; -using Microsoft.Build.Evaluation; -using NuGet.Packaging; -using NuGet.Packaging.Core; -using NuGet.Versioning; -using Xunit; -using Xunit.Abstractions; - -namespace KoreBuild.Tasks.Tests -{ - [Collection(nameof(MSBuildTestCollection))] - public class UpgradeDependenciesTests : IDisposable - { - private readonly string _tempDir; - private readonly ITestOutputHelper _output; - - public UpgradeDependenciesTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) - { - fixture.InitializeEnvironment(output); - _tempDir = Path.Combine(AppContext.BaseDirectory, Path.GetRandomFileName()); - Directory.CreateDirectory(_tempDir); - _output = output; - } - - [Fact] - public async Task WarnsWhenVariableIsNotInPackage() - { - // arrange - var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); - var lineupPackagePath = CreateLineup(packageId); - var depsFilePath = CreateProjectDepsFile(new VersionVariable("PackageVersionVar", "1.0.0")); - var engine = new MockEngine(_output); - - // act - var task = new UpgradeDependencies - { - BuildEngine = engine, - DependenciesFile = depsFilePath, - LineupPackageId = packageId.Id, - LineupPackageRestoreSource = _tempDir, - }; - - // assert - Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); - var warning = Assert.Single(engine.Warnings); - Assert.Equal(KoreBuildErrors.Prefix + KoreBuildErrors.PackageVersionNotFoundInLineup, warning.Code); - - var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); - Assert.Equal("1.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); - } - - [Fact] - public async Task ModifiesVariableValue() - { - // arrange - var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); - var lineupPackagePath = CreateLineup(packageId, new VersionVariable("PackageVersionVar", "2.0.0")); - var depsFilePath = CreateProjectDepsFile(new VersionVariable("PackageVersionVar", "1.0.0")); - - // act - var task = new UpgradeDependencies - { - BuildEngine = new MockEngine(_output), - DependenciesFile = depsFilePath, - LineupPackageId = packageId.Id, - LineupPackageRestoreSource = _tempDir, - }; - - // assert - Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); - var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); - Assert.Equal("2.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); - Assert.False(modifiedDepsFile.VersionVariables["PackageVersionVar"].IsReadOnly); - } - - - [Fact] - public async Task DoesNotModifyPinnedVariableValue() - { - // arrange - var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); - var lineupPackagePath = CreateLineup(packageId, new VersionVariable("PackageVersionVar", "2.0.0")); - var depsFilePath = CreateProjectDepsFile(new VersionVariable("PackageVersionVar", "1.0.0") { IsReadOnly = true }); - - // act - var task = new UpgradeDependencies - { - BuildEngine = new MockEngine(_output), - DependenciesFile = depsFilePath, - LineupPackageId = packageId.Id, - LineupPackageRestoreSource = _tempDir, - }; - - // assert - Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); - _output.WriteLine(File.ReadAllText(depsFilePath)); - var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); - Assert.Equal("1.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); - Assert.True(modifiedDepsFile.VersionVariables["PackageVersionVar"].IsReadOnly); - } - - - [Fact] - public async Task ModifiesVariableValueUsingDepsFile() - { - // arrange - var depsFilePath = CreateProjectDepsFile(new VersionVariable("PackageVersionVar", "1.0.0")); - var updatedDepsFilePath = CreateProjectDepsFile(Path.Combine(_tempDir, "dependencies.props"), new VersionVariable("PackageVersionVar", "2.0.0")); - - // act - var task = new UpgradeDependencies - { - BuildEngine = new MockEngine(_output), - DependenciesFile = depsFilePath, - LineupDependenciesFile = updatedDepsFilePath - }; - - // assert - Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); - var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); - Assert.Equal("2.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); - } - - [Fact] - public async Task SnapsInternalAspNetCoreSdkToBuildTools() - { - // arrange - var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); - var lineupPackagePath = CreateLineup(packageId, new VersionVariable("InternalAspNetCoreSdkPackageVersion", "2.0.0")); - var depsFilePath = CreateProjectDepsFile(new VersionVariable("InternalAspNetCoreSdkPackageVersion", "1.0.0")); - - // act - var task = new UpgradeDependencies - { - BuildEngine = new MockEngine(_output), - DependenciesFile = depsFilePath, - LineupPackageId = packageId.Id, - LineupPackageRestoreSource = _tempDir, - }; - - // assert - Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); - var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); - Assert.Equal(KoreBuildVersion.Current, modifiedDepsFile.VersionVariables["InternalAspNetCoreSdkPackageVersion"].Version); - } - - [Fact] - public async Task DoesNotModifiesFileIfNoChanges() - { - // arrange - var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); - var pkg = new VersionVariable("PackageVersionVar", "1.0.0"); - var lineupPackagePath = CreateLineup(packageId, pkg); - var depsFilePath = CreateProjectDepsFile(pkg); - var created = File.GetLastWriteTime(depsFilePath); - - // act - var task = new UpgradeDependencies - { - BuildEngine = new MockEngine(_output), - DependenciesFile = depsFilePath, - LineupPackageId = packageId.Id, - LineupPackageRestoreSource = _tempDir, - }; - - // assert - Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); - var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); - Assert.Equal("1.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); - Assert.Equal(created, File.GetLastWriteTime(depsFilePath)); - } - - private string CreateProjectDepsFile(params VersionVariable[] variables) - { - return CreateProjectDepsFile(Path.Combine(_tempDir, "projectdeps.props"), variables); - } - - private string CreateProjectDepsFile(string depsFilePath, params VersionVariable[] variables) - { - var proj = ProjectRootElement.Create(NewProjectFileOptions.None); - var originalDepsFile = DependencyVersionsFile.Load(proj); - foreach (var item in variables) - { - if (item.IsReadOnly) - { - originalDepsFile.AddPinnedVariable(item.Name, item.Version); - } - else - { - originalDepsFile.Update(item.Name, item.Version); - } - } - originalDepsFile.Save(depsFilePath); - return depsFilePath; - } - - private string CreateLineup(PackageIdentity identity, params VersionVariable[] variables) - { - var output = Path.Combine(_tempDir, $"{identity.Id}.{identity.Version}.nupkg"); - - var proj = ProjectRootElement.Create(NewProjectFileOptions.None); - var depsFiles = DependencyVersionsFile.Load(proj); - foreach (var item in variables) - { - depsFiles.Update(item.Name, item.Version); - } - depsFiles.Save(Path.Combine(_tempDir, "dependencies.props")); - - var builder = new PackageBuilder - { - Id = identity.Id, - Version = identity.Version, - Owners = { "Test" }, - Authors = { "Test" }, - Description = "Test lineup package" - }; - - builder.AddFiles(_tempDir, "dependencies.props", "build/dependencies.props"); - - using (var stream = File.Create(output)) - { - builder.Save(stream); - } - - return output; - } - - public void Dispose() - { - Directory.Delete(_tempDir, recursive: true); - } - - private struct VersionVariable - { - public string Name; - public string Version; - internal bool IsReadOnly; - - public VersionVariable(string varName, string version) : this() - { - this.Name = varName; - this.Version = version; - } - } - } -} diff --git a/testassets/SimpleRepo/build/repo.targets b/testassets/SimpleRepo/build/repo.targets index c7f3af77e..ab5c77a87 100644 --- a/testassets/SimpleRepo/build/repo.targets +++ b/testassets/SimpleRepo/build/repo.targets @@ -2,7 +2,7 @@ $(PrepareDependsOn);Greet $(PackageDependsOn);PackLineup - $(VerifyDependsOn);TestNuGetPush;UpgradeDependencies + $(VerifyDependsOn);TestNuGetPush Sample.Lineup $(Version) diff --git a/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj b/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj index 90776f448..9859ce949 100644 --- a/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj +++ b/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj @@ -1,8 +1,11 @@ - - netstandard2.0;net461 + netstandard2.0;net472 TestCert + + + + diff --git a/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj b/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj index f68591deb..10929c713 100644 --- a/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj +++ b/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj @@ -1,7 +1,7 @@ - netcoreapp3.0;net461 + netcoreapp3.0;net472 netcoreapp3.0 diff --git a/tools/KoreBuild.Console/Commands/DependenciesGenerateCommand.cs b/tools/KoreBuild.Console/Commands/DependenciesGenerateCommand.cs deleted file mode 100644 index 274de1c7f..000000000 --- a/tools/KoreBuild.Console/Commands/DependenciesGenerateCommand.cs +++ /dev/null @@ -1,76 +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.Collections.Generic; -using System.IO; -using Microsoft.Extensions.CommandLineUtils; - -namespace KoreBuild.Console.Commands -{ - internal class DependenciesGenerateCommand : SubCommandBase - { - private CommandOption _configOpt; - private CommandOption _fileOpt; - - public DependenciesGenerateCommand(CommandContext context) : base(context) - { - } - - public override void Configure(CommandLineApplication application) - { - application.Description = "Generates a build/dependencies.props file and updates csproj files to use variables"; - application.ExtendedHelpText = @" -MORE INFO: - - This command will generate a dependencies.props file and adjust all PackageReference's in csproj files - to use the MSBuild variables it generates. - - Example output: - - - - 1.0.0 - - -"; - - _configOpt = application.Option("-c|--configuration ", "The MSBuild configuration. Defaults to 'Debug'.", CommandOptionType.SingleValue); - _fileOpt = application.Option("--deps-file ", "The dependencies.props file to upgrade.", CommandOptionType.SingleValue); - - base.Configure(application); - } - - protected override int Execute() - { - var args = new List - { - "msbuild", - Path.Combine(Context.KoreBuildDir, "KoreBuild.proj"), - "-t:GenerateDependenciesPropsFile", - }; - - if (_configOpt.HasValue()) - { - args.Add("-p:Configuration=" + _configOpt.Value()); - } - - if (_fileOpt.HasValue()) - { - var filePath = _fileOpt.Value(); - if (!Path.IsPathRooted(filePath)) - { - filePath = Path.GetFullPath(filePath); - } - - args.Add("-p:DependencyVersionsFile=" + filePath); - } - - if (Reporter.IsVerbose) - { - args.Add("-v:n"); - } - - return RunDotnet(args, Context.RepoPath); - } - } -} diff --git a/tools/KoreBuild.Console/Commands/DependenciesUpgradeCommand.cs b/tools/KoreBuild.Console/Commands/DependenciesUpgradeCommand.cs deleted file mode 100644 index b830e71a5..000000000 --- a/tools/KoreBuild.Console/Commands/DependenciesUpgradeCommand.cs +++ /dev/null @@ -1,99 +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.Collections.Generic; -using System.IO; -using Microsoft.Extensions.CommandLineUtils; - -namespace KoreBuild.Console.Commands -{ - internal class DependenciesUpgradeCommand : SubCommandBase - { - private CommandOption _sourceOpt; - private CommandOption _packageIdOpt; - private CommandOption _packageVersionOpt; - private CommandOption _sourceDeps; - private CommandOption _fileOpt; - - public DependenciesUpgradeCommand(CommandContext context) : base(context) - { - } - - public override void Configure(CommandLineApplication application) - { - application.Description = "Upgrades the build/dependencies.props file to the latest package versions"; - application.ExtendedHelpText = @" -MORE INFO: - - The upgrade uses a 'lineup' package as the source of information about which versions to use. - - A lineup package is simply a nuget package that contains a file in build/dependencies.props. - Just like the version of the file in this local repo, this file is an MSBuild project file - with a list of MSBuild variables. Example: - - - - 1.0.0 - - -"; - - _sourceOpt = application.Option("-s|--source ", - "Specifies a NuGet package source to use to upgrade dependencies to the latest lineup package.", CommandOptionType.SingleValue); - _packageIdOpt = application.Option("--id ", "Specifies the lineup package id to use.", CommandOptionType.SingleValue); - _packageVersionOpt = application.Option("--version ", "Specifies the lineup package version to use.", CommandOptionType.SingleValue); - _sourceDeps = application.Option("--source-deps ", "The dependencies.props file to use as a source of versions.", CommandOptionType.SingleValue); - _fileOpt = application.Option("--deps-file ", "The dependencies.props file to upgrade.", CommandOptionType.SingleValue); - - base.Configure(application); - } - - protected override int Execute() - { - var args = new List - { - "msbuild", - Path.Combine(Context.KoreBuildDir, "KoreBuild.proj"), - "-t:UpgradeDependencies", - }; - - if (_sourceOpt.HasValue()) - { - args.Add("-p:LineupPackageRestoreSource=" + _sourceOpt.Value()); - } - - if (_packageIdOpt.HasValue()) - { - args.Add("-p:LineupPackageId=" + _packageIdOpt.Value()); - } - - if (_packageVersionOpt.HasValue()) - { - args.Add("-p:LineupPackageVersion=" + _packageVersionOpt.Value()); - } - - if (_sourceDeps.HasValue()) - { - args.Add("-p:LineupDependenciesFile=" + _sourceDeps.Value()); - } - - if (_fileOpt.HasValue()) - { - var filePath = _fileOpt.Value(); - if (!Path.IsPathRooted(filePath)) - { - filePath = Path.GetFullPath(filePath); - } - - args.Add("-p:DependencyVersionsFile=" + filePath); - } - - if (Reporter.IsVerbose) - { - args.Add("-v:n"); - } - - return RunDotnet(args, Context.RepoPath); - } - } -} diff --git a/tools/KoreBuild.Console/Commands/RootCommand.cs b/tools/KoreBuild.Console/Commands/RootCommand.cs index 6477f7e23..013868cbf 100644 --- a/tools/KoreBuild.Console/Commands/RootCommand.cs +++ b/tools/KoreBuild.Console/Commands/RootCommand.cs @@ -15,7 +15,8 @@ public override void Configure(CommandLineApplication application) application.FullName = "korebuild"; application.Command("install-tools", new InstallToolsCommand(context).Configure, throwOnUnexpectedArg: false); - application.Command("install", c => { + application.Command("install", c => + { c.HelpOption("-h|--help"); c.Command("vs", new InstallToolsetsCommand(context).Configure, throwOnUnexpectedArg: false); c.OnExecute(() => @@ -27,25 +28,11 @@ public override void Configure(CommandLineApplication application) application.Command("msbuild", new MSBuildCommand(context).Configure, throwOnUnexpectedArg: false); application.Command("docker-build", new DockerBuildCommand(context).Configure, throwOnUnexpectedArg: false); - // Commands that upgrade things - application.Command("upgrade", c => - { - c.HelpOption("-h|--help"); - c.Command("deps", new DependenciesUpgradeCommand(context).Configure, throwOnUnexpectedArg: false); - - c.OnExecute(() => - { - c.ShowHelp(); - return 2; - }); - }); - // Commands that generate code and files application.Command("generate", c => { c.HelpOption("-h|--help"); - c.Command("deps", new DependenciesGenerateCommand(context).Configure, throwOnUnexpectedArg: false); c.Command("api-baselines", new ApiBaselinesGenerateCommand(context).Configure, throwOnUnexpectedArg: false); c.OnExecute(() => From bce891d561b281a6de8f5872d60ac1abeccb0a69 Mon Sep 17 00:00:00 2001 From: Doug Bunting Date: Tue, 20 Nov 2018 09:30:59 -0800 Subject: [PATCH 133/192] Move to latest reference assembly archive - should get Razor building on Linux and MacOS again --- files/KoreBuild/KoreBuild.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/KoreBuild.sh b/files/KoreBuild/KoreBuild.sh index c8c39e5d7..a2d7e824a 100755 --- a/files/KoreBuild/KoreBuild.sh +++ b/files/KoreBuild/KoreBuild.sh @@ -106,7 +106,7 @@ __install_tools() { local tools_source=$1 local install_dir=$2 local tools_home="$install_dir/buildtools" - local netfx_version='4.6.1' + local netfx_version='4.7.2' verbose_flag='' [ "$verbose" = true ] && verbose_flag='--verbose' From 9de81a1b21ae00a292f6b5fb660857b75bb4ff74 Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Tue, 20 Nov 2018 11:50:18 -0800 Subject: [PATCH 134/192] Revert "Updating SDK to 3.0.100-preview-009752 (#878)" This reverts commit 51159bec310fa2a14a4933fbd4892c9fa9fef599. --- Directory.Build.props | 4 - build/dependencies.props | 3 +- build/sources.props | 1 - build/tasks/RepoTasks.csproj | 2 +- docs/Signing.md | 2 +- files/KoreBuild/config/sdk.version | 2 +- .../KoreBuild.RepoTasks.Sdk/Sdk/Sdk.targets | 1 + .../BuildTools.Tasks/BuildTools.Tasks.csproj | 4 +- modules/BuildTools.Tasks/RunDotNet.cs | 2 +- modules/BuildTools.Tasks/ZipArchive.cs | 2 +- modules/BuildTools.Tasks/module.props | 2 +- modules/Directory.Build.props | 1 + .../KoreBuild.Tasks/CheckPackageReferences.cs | 150 +++++++++ .../GenerateDependenciesPropsFile.cs | 158 ++++++++++ .../GeneratePackageVersionPropsFile.cs | 91 ++++++ .../ProjectModel/DotNetCliReferenceInfo.cs | 24 ++ .../ProjectModel/PackageReferenceInfo.cs | 30 ++ .../ProjectModel/ProjectFrameworkInfo.cs | 22 ++ .../Internal/ProjectModel/ProjectInfo.cs | 45 +++ .../ProjectModel/ProjectInfoFactory.cs | 166 ++++++++++ .../Internal/ProjectModel/SolutionInfo.cs | 26 ++ .../ProjectModel/SolutionInfoFactory.cs | 73 +++++ .../KoreBuild.Tasks/KoreBuild.Tasks.csproj | 1 + .../KoreBuild.Tasks/UpgradeDependencies.cs | 276 +++++++++++++++++ .../Utilities/DependencyVersionsFile.cs | 235 ++++++++++++++ .../Utilities/PackageVersionVariable.cs | 56 ++++ modules/KoreBuild.Tasks/module.props | 3 + modules/KoreBuild.Tasks/module.targets | 79 ++++- .../Utilities/DotNetMuxer.cs | 2 +- src/ApiCheck.Console/ApiCheck.Console.csproj | 2 +- src/ApiCheck.Console/Loader/AssemblyLoader.cs | 2 +- ...soft.AspNetCore.BuildTools.ApiCheck.nuspec | 2 +- src/ApiCheck.Task/ApiCheckTasksBase.cs | 2 +- .../Internal.AspNetCore.Sdk.csproj | 4 +- .../Internal.AspNetCore.Sdk.nuspec | 2 +- .../build/Common.props | 2 +- .../sdk/DefaultItems.targets | 1 + ...ternal.AspNetCore.SiteExtension.Sdk.csproj | 2 +- ...ternal.AspNetCore.SiteExtension.Sdk.nuspec | 2 +- ...nternal.AspNetCore.SiteExtension.Sdk.props | 2 +- test/ApiCheck.Test/ApiCheck.Test.csproj | 2 +- .../CheckPackageReferenceTests.cs | 288 ++++++++++++++++++ .../DependencyVersionsFileTests.cs | 117 +++++++ .../GenerateDependenciesPropsFileTests.cs | 151 +++++++++ .../GeneratePackageVersionPropsFileTests.cs | 116 +++++++ .../SolutionInfoFactoryTests.cs | 96 ++++++ .../UpgradeDependenciesTests.cs | 254 +++++++++++++++ testassets/SimpleRepo/build/repo.targets | 2 +- .../src/Simple.Lib/Simple.Lib.csproj | 7 +- .../test/Simple.Test/Simple.Test.csproj | 2 +- .../Commands/DependenciesGenerateCommand.cs | 76 +++++ .../Commands/DependenciesUpgradeCommand.cs | 99 ++++++ .../KoreBuild.Console/Commands/RootCommand.cs | 17 +- 53 files changed, 2675 insertions(+), 38 deletions(-) create mode 100644 modules/KoreBuild.Tasks/CheckPackageReferences.cs create mode 100644 modules/KoreBuild.Tasks/GenerateDependenciesPropsFile.cs create mode 100644 modules/KoreBuild.Tasks/GeneratePackageVersionPropsFile.cs create mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/DotNetCliReferenceInfo.cs create mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/PackageReferenceInfo.cs create mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectFrameworkInfo.cs create mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfo.cs create mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfoFactory.cs create mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfo.cs create mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfoFactory.cs create mode 100644 modules/KoreBuild.Tasks/UpgradeDependencies.cs create mode 100644 modules/KoreBuild.Tasks/Utilities/DependencyVersionsFile.cs create mode 100644 modules/KoreBuild.Tasks/Utilities/PackageVersionVariable.cs create mode 100644 test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs create mode 100644 test/KoreBuild.Tasks.Tests/DependencyVersionsFileTests.cs create mode 100644 test/KoreBuild.Tasks.Tests/GenerateDependenciesPropsFileTests.cs create mode 100644 test/KoreBuild.Tasks.Tests/GeneratePackageVersionPropsFileTests.cs create mode 100644 test/KoreBuild.Tasks.Tests/SolutionInfoFactoryTests.cs create mode 100644 test/KoreBuild.Tasks.Tests/UpgradeDependenciesTests.cs create mode 100644 tools/KoreBuild.Console/Commands/DependenciesGenerateCommand.cs create mode 100644 tools/KoreBuild.Console/Commands/DependenciesUpgradeCommand.cs diff --git a/Directory.Build.props b/Directory.Build.props index 97842faa0..7a110d176 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -20,8 +20,4 @@ $(MSBuildThisFileDirectory) - - - - diff --git a/build/dependencies.props b/build/dependencies.props index 4c0960bdd..1cea1a5f2 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -5,7 +5,6 @@ 2.0.0 1.0.0-beta.18559.6 1.0.0-beta.18559.6 - 1.0.0-alpha-004 15.9.0 0.10.0-beta6 4.7.99 @@ -25,7 +24,7 @@ as long as the version we compile for is binary compatible with what the .NET Core SDK uses. --> - 16.0.0-preview.225 + 15.9.19 $(MicrosoftBuildPackageVersion) $(MicrosoftBuildPackageVersion) $(MicrosoftBuildPackageVersion) diff --git a/build/sources.props b/build/sources.props index 42c8d8d6a..dd9e03c79 100644 --- a/build/sources.props +++ b/build/sources.props @@ -9,7 +9,6 @@ https://dotnet.myget.org/F/msbuild/api/v3/index.json; https://dotnet.myget.org/F/nuget-build/api/v3/index.json; https://api.nuget.org/v3/index.json; - https://dotnet.myget.org/F/roslyn-tools/api/v3/index.json; diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index 9930faffd..95cf0c2ce 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -3,7 +3,7 @@ netcoreapp3.0 - net472 + net46 $(DefineConstants);BuildTools $(NoWarn);NU1603 RepoTasks diff --git a/docs/Signing.md b/docs/Signing.md index 57bc1a59b..f5e14c4d6 100644 --- a/docs/Signing.md +++ b/docs/Signing.md @@ -80,7 +80,7 @@ Sometimes other signable assemblies end up in a nupkg. Signing for these file ty + PackagePath="tasks/net461/$(TargetFileName)" Visible="false" /> diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 6629fc309..c4267acea 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview-009752 +3.0.100-preview-009750 diff --git a/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.targets b/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.targets index 116e21e3c..309a7411d 100644 --- a/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.targets +++ b/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.targets @@ -17,6 +17,7 @@ + diff --git a/modules/BuildTools.Tasks/BuildTools.Tasks.csproj b/modules/BuildTools.Tasks/BuildTools.Tasks.csproj index 563c2a0b6..35fd0d86e 100644 --- a/modules/BuildTools.Tasks/BuildTools.Tasks.csproj +++ b/modules/BuildTools.Tasks/BuildTools.Tasks.csproj @@ -4,7 +4,7 @@ $(DefineConstants);BuildTools MSBuild tasks. This package is intended for Microsoft use only - netcoreapp3.0;net472 + netcoreapp3.0;net46 Microsoft.AspNetCore.BuildTools Internal.AspNetCore.BuildTools.Tasks @@ -19,7 +19,7 @@ - + diff --git a/modules/BuildTools.Tasks/RunDotNet.cs b/modules/BuildTools.Tasks/RunDotNet.cs index 808862453..7c939e2f5 100644 --- a/modules/BuildTools.Tasks/RunDotNet.cs +++ b/modules/BuildTools.Tasks/RunDotNet.cs @@ -21,7 +21,7 @@ public class RunDotNet protected override string ToolName => "dotnet"; protected override string GenerateFullPathToTool() -#if NET472 +#if NET46 => "dotnet"; #else => DotNetMuxer.MuxerPathOrDefault(); diff --git a/modules/BuildTools.Tasks/ZipArchive.cs b/modules/BuildTools.Tasks/ZipArchive.cs index cf8462f67..7755c1eea 100644 --- a/modules/BuildTools.Tasks/ZipArchive.cs +++ b/modules/BuildTools.Tasks/ZipArchive.cs @@ -88,7 +88,7 @@ public override bool Execute() } var entry = zip.CreateEntryFromFile(file.ItemSpec, entryName); -#if NET472 +#if NET46 #elif NETCOREAPP3_0 || NETSTANDARD2_0 if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { diff --git a/modules/BuildTools.Tasks/module.props b/modules/BuildTools.Tasks/module.props index 863bf8a34..2dc157151 100644 --- a/modules/BuildTools.Tasks/module.props +++ b/modules/BuildTools.Tasks/module.props @@ -2,7 +2,7 @@ <_BuildToolsAssembly Condition="'$(MSBuildRuntimeType)' == 'core' ">$(MSBuildThisFileDirectory)netcoreapp3.0\Internal.AspNetCore.BuildTools.Tasks.dll - <_BuildToolsAssembly Condition="'$(MSBuildRuntimeType)' != 'core' ">$(MSBuildThisFileDirectory)net472\Internal.AspNetCore.BuildTools.Tasks.dll + <_BuildToolsAssembly Condition="'$(MSBuildRuntimeType)' != 'core' ">$(MSBuildThisFileDirectory)net46\Internal.AspNetCore.BuildTools.Tasks.dll <_BuildTasksPrefix> diff --git a/modules/Directory.Build.props b/modules/Directory.Build.props index 3d7bd8623..efd803f2d 100644 --- a/modules/Directory.Build.props +++ b/modules/Directory.Build.props @@ -4,4 +4,5 @@ false + diff --git a/modules/KoreBuild.Tasks/CheckPackageReferences.cs b/modules/KoreBuild.Tasks/CheckPackageReferences.cs new file mode 100644 index 000000000..c99d5dd26 --- /dev/null +++ b/modules/KoreBuild.Tasks/CheckPackageReferences.cs @@ -0,0 +1,150 @@ +// 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.Collections.Generic; +using System.IO; +using System.Linq; +using KoreBuild.Tasks.ProjectModel; +using KoreBuild.Tasks.Utilities; +using Microsoft.AspNetCore.BuildTools; +using Microsoft.Build.Construction; +using Microsoft.Build.Exceptions; +using Microsoft.Build.Framework; +using NuGet.Versioning; + +namespace KoreBuild.Tasks +{ + /// + /// Ensures MSBuild files use PackageReference responsibly. + /// + public class CheckPackageReferences : Microsoft.Build.Utilities.Task + { + /// + /// The solutions of csproj files to check. + /// + [Required] + public ITaskItem[] Projects { get; set; } + + /// + /// The file that contains the PropertyGroup of versions + /// + [Required] + public string DependenciesFile { get; set; } + + public string[] Properties { get; set; } + + public override bool Execute() + { + if (Projects == null || Projects.Length == 0) + { + Log.LogMessage(MessageImportance.Low, "No projects or solutions were found. Skipping PackageReference validation."); + return true; + } + + if (!File.Exists(DependenciesFile)) + { + Log.LogKoreBuildError(KoreBuildErrors.DependenciesFileDoesNotExist, $"Expected the dependencies file to exist at {DependenciesFile}"); + return false; + } + + if (!DependencyVersionsFile.TryLoad(DependenciesFile, out var depsFile)) + { + Log.LogError($"Could not load the dependencies file from {DependenciesFile}"); + return false; + } + + if (!depsFile.HasVersionsPropertyGroup) + { + Log.LogKoreBuildWarning(KoreBuildErrors.PackageRefPropertyGroupNotFound, $"No PropertyGroup with Label=\"{DependencyVersionsFile.PackageVersionsLabel}\" or Label=\"{DependencyVersionsFile.AutoPackageVersionsLabel}\" could be found in {DependenciesFile}"); + } + + foreach (var proj in Projects) + { + var ext = Path.GetExtension(proj.ItemSpec); + if (ext == ".sln") + { + var solutionProps = MSBuildListSplitter.GetNamedProperties(Properties); + var projectFiles = Projects.SelectMany(p => SolutionInfoFactory.GetProjects(p, solutionProps)).Distinct(); + foreach (var project in projectFiles) + { + VerifyPackageReferences(project, depsFile.VersionVariables); + } + } + else + { + VerifyPackageReferences(proj.ItemSpec, depsFile.VersionVariables); + } + } + + return !Log.HasLoggedErrors; + } + + private void VerifyPackageReferences(string filePath, IReadOnlyDictionary versionVariables) + { + ProjectRootElement doc; + try + { + doc = ProjectRootElement.Open(filePath); + } + catch (InvalidProjectFileException ex) + { + Log.LogError(null, null, null, filePath, 0, 0, 0, 0, message: "Invalid project file: " + ex.Message); + return; + } + + var packageReferences = doc.Items.Where(i => i.ItemType == "PackageReference"); + foreach (var pkgRef in packageReferences) + { + var id = pkgRef.Include; + + if (string.IsNullOrEmpty(id)) + { + // this node is an Update or Remove node + continue; + } + + var versionMetadata = pkgRef.Metadata.LastOrDefault(m => m.Name == "Version"); + var versionRaw = versionMetadata?.Value; + if (versionMetadata == null || string.IsNullOrEmpty(versionRaw)) + { + Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.PackageReferenceDoesNotHaveVersion, $"PackageReference to {id} does not define a Version"); + continue; + } + + var versionIsVariable = + versionRaw != null + && versionRaw.Length > 3 + && versionRaw[0] == '$' + && versionRaw[1] == '(' + && versionRaw[versionRaw.Length - 1] == ')' + && versionRaw.IndexOf(')') == versionRaw.Length - 1; + + if (!versionIsVariable) + { + Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.PackageRefHasLiteralVersion, "PackageReference must use an MSBuild variable to set the version."); + continue; + } + + var versionVarName = versionRaw.Substring(2, versionRaw.Length - 3); + + if (!versionVariables.TryGetValue(versionVarName, out var variable)) + { + Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.VariableNotFoundInDependenciesPropsFile, $"The variable {versionRaw} could not be found in {DependenciesFile}"); + continue; + } + + var versionValue = variable.Version; + if (!VersionRange.TryParse(versionValue, out var nugetVersion)) + { + Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.InvalidPackageVersion, $"PackageReference to {id} has an invalid version identifier: '{versionValue}'"); + continue; + } + + if (nugetVersion.IsFloating) + { + Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.PackageRefHasFloatingVersion, $"PackageReference to {id} uses a floating version: '{versionValue}'"); + } + } + } + } +} diff --git a/modules/KoreBuild.Tasks/GenerateDependenciesPropsFile.cs b/modules/KoreBuild.Tasks/GenerateDependenciesPropsFile.cs new file mode 100644 index 000000000..149fc5b8d --- /dev/null +++ b/modules/KoreBuild.Tasks/GenerateDependenciesPropsFile.cs @@ -0,0 +1,158 @@ +// 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; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using KoreBuild.Tasks.ProjectModel; +using KoreBuild.Tasks.Utilities; +using Microsoft.Build.Construction; +using Microsoft.Build.Evaluation; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; + +namespace KoreBuild.Tasks +{ + /// + /// Generates the build/dependencies.props file base on your current project, + /// and updates all PackageReferences in and to use MSBuild variables. + /// + public class GenerateDependenciesPropsFile : Microsoft.Build.Utilities.Task, ICancelableTask + { + private readonly CancellationTokenSource _cts = new CancellationTokenSource(); + + /// + /// The projects to update + /// + [Required] + public ITaskItem[] Projects { get; set; } + + /// + /// other files to update that may have PackageReferences in them + /// + public ITaskItem[] OtherImports { get; set; } + + /// + /// Location of the dependenices.props file + /// + [Required] + public string DependenciesFile { get; set; } + + /// + /// Additional properties to use when evaluating the projects + /// + public string[] Properties { get; set; } + + public void Cancel() + { + _cts.Cancel(); + } + + public override bool Execute() + { + var unifiedPackageList = new Dictionary(StringComparer.OrdinalIgnoreCase); + + var projects = new ProjectInfoFactory(Log).CreateMany(Projects, Properties, false, _cts.Token); + var packageRefs = projects.SelectMany(p => p.Frameworks).SelectMany(f => f.Dependencies); + + foreach (var packageRef in packageRefs) + { + if (packageRef.Value.IsImplicitlyDefined) + { + // skip PackageReferences added by the SDK + continue; + } + + if (packageRef.Value.NoWarn.Contains(KoreBuildErrors.Prefix + KoreBuildErrors.ConflictingPackageReferenceVersions)) + { + // Make it possible to suppress version conflicts while generating this file. + continue; + } + + if (unifiedPackageList.TryGetValue(packageRef.Value.Id, out var other)) + { + if (other.Version != packageRef.Value.Version) + { + Log.LogKoreBuildError(KoreBuildErrors.ConflictingPackageReferenceVersions, $"Conflicting dependency versions for {packageRef.Value.Id}: {other.Project.FileName} references '{other.Version}' but {packageRef.Value.Project.FileName} references '{packageRef.Value.Version}'"); + } + } + else + { + unifiedPackageList.Add(packageRef.Value.Id, packageRef.Value); + Log.LogMessage(MessageImportance.Low, $"Found {packageRef.Value.Id} = {packageRef.Value.Version}"); + } + } + + if (Log.HasLoggedErrors) + { + return false; + } + + var items = unifiedPackageList.Values.Select(p => new TaskItem(p.Id, new Hashtable { ["Version"] = p.Version })).ToArray(); + + var task = new GeneratePackageVersionPropsFile + { + AddOverrideImport = true, + SuppressVariableLabels = true, + Packages = items, + BuildEngine = BuildEngine, + HostObject = HostObject, + OutputPath = DependenciesFile, + }; + + if (!task.Execute()) + { + return false; + } + + var otherImports = OtherImports != null + ? OtherImports.Select(p => p.ItemSpec) + : Array.Empty(); + + foreach (var proj in projects.Select(p => p.FullPath).Concat(otherImports)) + { + var project = ProjectRootElement.Open(proj, ProjectCollection.GlobalProjectCollection, preserveFormatting: true); + var changed = false; + foreach (var item in project.Items.Where(i => i.ItemType == "PackageReference")) + { + var noWarn = item.Metadata.FirstOrDefault(m => m.Name == "NoWarn"); + if (noWarn != null && noWarn.Value.Contains(KoreBuildErrors.Prefix + KoreBuildErrors.ConflictingPackageReferenceVersions)) + { + continue; + } + + var versionMetadata = item.Metadata.LastOrDefault(p => p.Name == "Version"); + if (versionMetadata != null && versionMetadata.Value.StartsWith("$(")) + { + continue; + } + changed = true; + + var varName = $"$({DependencyVersionsFile.GetVariableName(item.Include)})"; + if (versionMetadata == null) + { + item.AddMetadata("Version", varName, expressAsAttribute: true); + } + else + { + versionMetadata.Value = varName; + } + } + + if (changed) + { + Log.LogMessage(MessageImportance.High, $"Updated {proj}"); + project.Save(proj); + } + else + { + Log.LogMessage(MessageImportance.Normal, $"Skipping {proj}. Already up to date."); + } + } + + return !Log.HasLoggedErrors; + } + } +} diff --git a/modules/KoreBuild.Tasks/GeneratePackageVersionPropsFile.cs b/modules/KoreBuild.Tasks/GeneratePackageVersionPropsFile.cs new file mode 100644 index 000000000..38c34cf15 --- /dev/null +++ b/modules/KoreBuild.Tasks/GeneratePackageVersionPropsFile.cs @@ -0,0 +1,91 @@ +// 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.IO; +using System.Text; +using KoreBuild.Tasks.Utilities; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; + +namespace KoreBuild.Tasks +{ + public class GeneratePackageVersionPropsFile : Task + { + [Required] + public ITaskItem[] Packages { get; set; } + + [Required] + public string OutputPath { get; set; } + + public bool AddOverrideImport { get; set; } + + public string[] AdditionalImports { get; set; } + + public bool SuppressVariableLabels { get; set; } + + public override bool Execute() + { + OutputPath = OutputPath.Replace('\\', '/'); + Directory.CreateDirectory(Path.GetDirectoryName(OutputPath)); + + DependencyVersionsFile depsFile; + if (File.Exists(OutputPath)) + { + if (!DependencyVersionsFile.TryLoad(OutputPath, out depsFile)) + { + depsFile = DependencyVersionsFile.Create(AddOverrideImport, AdditionalImports); + Log.LogWarning($"Could not load the existing deps file from {OutputPath}. This file will be overwritten."); + } + } + else + { + depsFile = DependencyVersionsFile.Create(AddOverrideImport, AdditionalImports); + } + + var varNames = new HashSet(); + foreach (var pkg in Packages) + { + var packageVersion = pkg.GetMetadata("Version"); + + if (string.IsNullOrEmpty(packageVersion)) + { + Log.LogError("Package {0} is missing the Version metadata", pkg.ItemSpec); + continue; + } + + string packageVarName; + if (!string.IsNullOrEmpty(pkg.GetMetadata("VariableName"))) + { + packageVarName = pkg.GetMetadata("VariableName"); + if (!packageVarName.EndsWith("Version", StringComparison.Ordinal)) + { + Log.LogError("VariableName for {0} must end in 'Version'", pkg.ItemSpec); + continue; + } + } + else + { + packageVarName = DependencyVersionsFile.GetVariableName(pkg.ItemSpec); + } + + if (varNames.Contains(packageVarName)) + { + Log.LogError("Multiple packages would produce {0} in the generated dependencies.props file. Set VariableName to differentiate the packages manually", packageVarName); + continue; + } + + var item = depsFile.Update(packageVarName, packageVersion); + if (!SuppressVariableLabels) + { + item.SetLabel(pkg.ItemSpec); + } + } + + depsFile.Save(OutputPath); + Log.LogMessage(MessageImportance.Normal, $"Generated {OutputPath}"); + return !Log.HasLoggedErrors; + } + } +} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/DotNetCliReferenceInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/DotNetCliReferenceInfo.cs new file mode 100644 index 000000000..d4a9712fd --- /dev/null +++ b/modules/KoreBuild.Tasks/Internal/ProjectModel/DotNetCliReferenceInfo.cs @@ -0,0 +1,24 @@ +// 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; + +namespace KoreBuild.Tasks.ProjectModel +{ + internal class DotNetCliReferenceInfo + { + public DotNetCliReferenceInfo(string id, string version) + { + if (string.IsNullOrEmpty(id)) + { + throw new ArgumentException(nameof(id)); + } + + Id = id; + Version = version; + } + + public string Id { get; } + public string Version { get; } + } +} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/PackageReferenceInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/PackageReferenceInfo.cs new file mode 100644 index 000000000..63a9edde8 --- /dev/null +++ b/modules/KoreBuild.Tasks/Internal/ProjectModel/PackageReferenceInfo.cs @@ -0,0 +1,30 @@ +// 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; + +namespace KoreBuild.Tasks.ProjectModel +{ + internal class PackageReferenceInfo + { + public PackageReferenceInfo(string id, string version, bool isImplicitlyDefined, IReadOnlyList noWarn) + { + if (string.IsNullOrEmpty(id)) + { + throw new ArgumentException(nameof(id)); + } + + Id = id; + Version = version; + IsImplicitlyDefined = isImplicitlyDefined; + NoWarn = noWarn; + } + + public string Id { get; } + public string Version { get; } + public bool IsImplicitlyDefined { get; } + public IReadOnlyList NoWarn { get; } + public ProjectInfo Project { get; internal set; } + } +} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectFrameworkInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectFrameworkInfo.cs new file mode 100644 index 000000000..ee0f9d3db --- /dev/null +++ b/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectFrameworkInfo.cs @@ -0,0 +1,22 @@ +// 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 NuGet.Frameworks; + +namespace KoreBuild.Tasks.ProjectModel +{ + internal class ProjectFrameworkInfo + { + public ProjectFrameworkInfo(NuGetFramework targetFramework, IReadOnlyDictionary dependencies) + { + TargetFramework = targetFramework ?? throw new ArgumentNullException(nameof(targetFramework)); + Dependencies = dependencies ?? throw new ArgumentNullException(nameof(dependencies)); + } + + public NuGetFramework TargetFramework { get; } + public IReadOnlyDictionary Dependencies { get; } + } +} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfo.cs new file mode 100644 index 000000000..95dc0780f --- /dev/null +++ b/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfo.cs @@ -0,0 +1,45 @@ +// 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.IO; +using System.Linq; + +namespace KoreBuild.Tasks.ProjectModel +{ + internal class ProjectInfo + { + public ProjectInfo(string fullPath, + string projectExtensionsPath, + IReadOnlyList frameworks, + IReadOnlyList tools) + { + if (!Path.IsPathRooted(fullPath)) + { + throw new ArgumentException("Path must be absolute", nameof(fullPath)); + } + + Frameworks = frameworks ?? throw new ArgumentNullException(nameof(frameworks)); + Tools = tools ?? throw new ArgumentNullException(nameof(tools)); + + FullPath = fullPath; + FileName = Path.GetFileName(fullPath); + Directory = Path.GetDirectoryName(FullPath); + ProjectExtensionsPath = projectExtensionsPath ?? Path.Combine(Directory, "obj"); + + foreach (var dep in frameworks.SelectMany(f => f.Dependencies)) + { + dep.Value.Project = this; + } + } + + public string FullPath { get; } + public string FileName { get; } + public string ProjectExtensionsPath { get; } + public string Directory { get; } + + public IReadOnlyList Frameworks { get; } + public IReadOnlyList Tools { get; } + } +} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfoFactory.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfoFactory.cs new file mode 100644 index 000000000..65e5879dc --- /dev/null +++ b/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfoFactory.cs @@ -0,0 +1,166 @@ +// 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.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.BuildTools; +using Microsoft.Build.Construction; +using Microsoft.Build.Evaluation; +using Microsoft.Build.Execution; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using NuGet.Frameworks; + +namespace KoreBuild.Tasks.ProjectModel +{ + internal class ProjectInfoFactory + { + private readonly TaskLoggingHelper _logger; + + public ProjectInfoFactory(TaskLoggingHelper logger) + { + _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + } + + public IReadOnlyList CreateMany(ITaskItem[] projectItems, string[] properties, bool policyDesignBuild, CancellationToken token) + { + if (projectItems == null) + { + return Array.Empty(); + } + + var cts = new CancellationTokenSource(); + token.Register(() => cts.Cancel()); + var solutionProps = MSBuildListSplitter.GetNamedProperties(properties); + var projectFiles = projectItems.SelectMany(p => SolutionInfoFactory.GetProjects(p, solutionProps)).Distinct(); + var projects = new ConcurrentBag(); + var stop = Stopwatch.StartNew(); + + Parallel.ForEach(projectFiles, projectFile => + { + if (cts.Token.IsCancellationRequested) + { + return; + } + + try + { + projects.Add(Create(projectFile, policyDesignBuild)); + } + catch (Exception ex) + { + _logger.LogErrorFromException(ex); + cts.Cancel(); + } + }); + + stop.Stop(); + _logger.LogMessage(MessageImportance.Low, $"Finished design-time build in {stop.ElapsedMilliseconds}ms"); + return projects.ToArray(); + } + + public ProjectInfo Create(string path, bool policyDesignBuild) + { + var project = GetProject(path, ProjectCollection.GlobalProjectCollection, policyDesignBuild); + var instance = project.CreateProjectInstance(ProjectInstanceSettings.ImmutableWithFastItemLookup); + var projExtPath = instance.GetPropertyValue("MSBuildProjectExtensionsPath"); + + var targetFrameworks = instance.GetPropertyValue("TargetFrameworks"); + var targetFramework = instance.GetPropertyValue("TargetFramework"); + + var frameworks = new List(); + if (!string.IsNullOrEmpty(targetFrameworks) && string.IsNullOrEmpty(targetFramework)) + { + // multi targeting + foreach (var tfm in targetFrameworks.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) + { + project.SetGlobalProperty("TargetFramework", tfm); + var innerBuild = project.CreateProjectInstance(ProjectInstanceSettings.ImmutableWithFastItemLookup); + + var tfmInfo = new ProjectFrameworkInfo(NuGetFramework.Parse(tfm), GetDependencies(innerBuild)); + + frameworks.Add(tfmInfo); + } + + project.RemoveGlobalProperty("TargetFramework"); + } + else if (!string.IsNullOrEmpty(targetFramework)) + { + var tfmInfo = new ProjectFrameworkInfo(NuGetFramework.Parse(targetFramework), GetDependencies(instance)); + + frameworks.Add(tfmInfo); + } + + var projectDir = Path.GetDirectoryName(path); + + var tools = GetTools(instance).ToArray(); + + return new ProjectInfo(path, projExtPath, frameworks, tools); + } + + private static Project GetProject(string path, ProjectCollection projectCollection, bool policyDesignBuild) + { + var projects = projectCollection.GetLoadedProjects(path); + foreach (var proj in projects) + { + if (proj.GetPropertyValue("DesignTimeBuild") == "true") + { + return proj; + } + } + var xml = ProjectRootElement.Open(path, projectCollection); + var globalProps = new Dictionary() + { + ["DesignTimeBuild"] = "true", + }; + if (policyDesignBuild) + { + globalProps["PolicyDesignTimeBuild"] = "true"; + } + var project = new Project(xml, + globalProps, + toolsVersion: "15.0", + projectCollection: projectCollection) + { + IsBuildEnabled = false + }; + return project; + } + + private IReadOnlyDictionary GetDependencies(ProjectInstance project) + { + var references = new Dictionary(StringComparer.OrdinalIgnoreCase); + foreach (var item in project.GetItems("PackageReference")) + { + bool.TryParse(item.GetMetadataValue("IsImplicitlyDefined"), out var isImplicit); + var noWarn = item.GetMetadataValue("NoWarn"); + IReadOnlyList noWarnItems = string.IsNullOrEmpty(noWarn) + ? Array.Empty() + : noWarn.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); + + var info = new PackageReferenceInfo(item.EvaluatedInclude, item.GetMetadataValue("Version"), isImplicit, noWarnItems); + + if (references.ContainsKey(info.Id)) + { + _logger.LogKoreBuildWarning(project.ProjectFileLocation.File, KoreBuildErrors.DuplicatePackageReference, $"Found a duplicate PackageReference for {info.Id}. Restore results may be unpredictable."); + } + + references[info.Id] = info; + } + + return references; + } + + private static IEnumerable GetTools(ProjectInstance project) + { + return project.GetItems("DotNetCliToolReference").Select(item => + new DotNetCliReferenceInfo(item.EvaluatedInclude, item.GetMetadataValue("Version"))); + } + } +} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfo.cs new file mode 100644 index 000000000..d968438cb --- /dev/null +++ b/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfo.cs @@ -0,0 +1,26 @@ +// 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; + +namespace KoreBuild.Tasks.ProjectModel +{ + internal class SolutionInfo + { + public SolutionInfo(string fullPath, IReadOnlyList projects) + { + if (string.IsNullOrEmpty(fullPath)) + { + throw new ArgumentException(nameof(fullPath)); + } + + FullPath = fullPath; + Projects = projects ?? throw new ArgumentNullException(nameof(projects)); + } + + public string FullPath { get; } + + public IReadOnlyList Projects { get; } + } +} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfoFactory.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfoFactory.cs new file mode 100644 index 000000000..18d2a2550 --- /dev/null +++ b/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfoFactory.cs @@ -0,0 +1,73 @@ +// 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.IO; +using System.Linq; +using Microsoft.AspNetCore.BuildTools; +using Microsoft.Build.Construction; +using Microsoft.Build.Framework; + +namespace KoreBuild.Tasks.ProjectModel +{ + internal class SolutionInfoFactory + { + public static SolutionInfo Create(string filePath, string configName) + { + var sln = SolutionFile.Parse(filePath); + + if (string.IsNullOrEmpty(configName)) + { + configName = sln.GetDefaultConfigurationName(); + } + + var projects = new List(); + + var config = sln.SolutionConfigurations.FirstOrDefault(c => c.ConfigurationName == configName); + if (config == null) + { + throw new InvalidOperationException($"A solution configuration by the name of '{configName}' was not found in '{filePath}'"); + } + + foreach (var project in sln.ProjectsInOrder + .Where(p => + p.ProjectType == SolutionProjectType.KnownToBeMSBuildFormat // skips solution folders + && p.ProjectConfigurations.TryGetValue(config.FullName, out var projectConfig) + && projectConfig.IncludeInBuild)) + { + projects.Add(project.AbsolutePath.Replace('\\', '/')); + } + + return new SolutionInfo(filePath, projects.ToArray()); + } + + public static IEnumerable GetProjects(ITaskItem projectOrSolution, IDictionary solutionProperties) + { + var projectFilePath = projectOrSolution.ItemSpec.Replace('\\', '/'); + + if (Path.GetExtension(projectFilePath).Equals(".sln", StringComparison.OrdinalIgnoreCase)) + { + // prefer the AdditionalProperties metadata as this is what the MSBuild task will use when building solutions + var props = MSBuildListSplitter.GetNamedProperties(projectOrSolution.GetMetadata("AdditionalProperties")); + props.TryGetValue("Configuration", out var config); + + if (config == null) + { + solutionProperties.TryGetValue("Configuration", out config); + } + + var sln = Create(projectFilePath, config); + + foreach (var project in sln.Projects) + { + yield return project; + } + } + else + { + yield return Path.GetFullPath(projectFilePath); + } + } + } +} diff --git a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj index d238ad4b4..0c42f0032 100644 --- a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj +++ b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj @@ -22,6 +22,7 @@ + diff --git a/modules/KoreBuild.Tasks/UpgradeDependencies.cs b/modules/KoreBuild.Tasks/UpgradeDependencies.cs new file mode 100644 index 000000000..4e5ca9006 --- /dev/null +++ b/modules/KoreBuild.Tasks/UpgradeDependencies.cs @@ -0,0 +1,276 @@ +// 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.IO; +using System.Linq; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using System.Xml; +using KoreBuild.Tasks.Utilities; +using Microsoft.Build.Construction; +using Microsoft.Build.Evaluation; +using Microsoft.Build.Framework; +using NuGet.Build; +using NuGet.Configuration; +using NuGet.Packaging; +using NuGet.Packaging.Core; +using NuGet.Protocol; +using NuGet.Protocol.Core.Types; +using NuGet.Versioning; + +namespace KoreBuild.Tasks +{ + /// + /// Uses a remote package to update the version variables in the local dependencies.props file + /// + public class UpgradeDependencies : Microsoft.Build.Utilities.Task, ICancelableTask + { + private CancellationTokenSource _cts = new CancellationTokenSource(); + + /// + /// The lineup package ID of the nupkg that contains the master dependencies.props files that will be used to upgrade versions + /// + [Required] + public string LineupPackageId { get; set; } + + /// + /// The version of the lineup package. If empty, this will attempt to pull the latest + /// + public string LineupPackageVersion { get; set; } + + /// + /// The dependencies.props file to use versions from + /// + public string LineupDependenciesFile { get; set; } + + /// + /// The NuGet feed containing the lineup package + /// + [Required] + public string LineupPackageRestoreSource { get; set; } + + /// + /// The dependencies.props file to update + /// + [Required] + public string DependenciesFile { get; set; } + + public void Cancel() + { + _cts.Cancel(); + } + + public override bool Execute() + { + return ExecuteAsync().GetAwaiter().GetResult(); + } + + public async Task ExecuteAsync() + { + if (!DependencyVersionsFile.TryLoad(DependenciesFile, out var localVersionsFile)) + { + Log.LogError($"Could not load file from {DependenciesFile}"); + return false; + } + + if (!localVersionsFile.HasVersionsPropertyGroup) + { + Log.LogKoreBuildWarning(KoreBuildErrors.PackageRefPropertyGroupNotFound, $"No PropertyGroup with Label=\"{DependencyVersionsFile.PackageVersionsLabel}\" could be found in {DependenciesFile}"); + } + + if (localVersionsFile.VersionVariables.Count == 0) + { + Log.LogMessage(MessageImportance.High, $"No version variables could be found in {DependenciesFile}"); + return true; + } + + + var tmpNupkgPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + var logger = new MSBuildLogger(Log); + + try + { + var remoteDepsVersionFile = await TryDownloadLineupDepsFile() ?? await TryDownloadLineupPackage(logger, tmpNupkgPath); + + if (remoteDepsVersionFile == null) + { + return false; + } + + var updateCount = UpdateDependencies(localVersionsFile, remoteDepsVersionFile); + + if (updateCount > 0) + { + Log.LogMessage($"Finished updating {updateCount} version variables in {DependenciesFile}"); + localVersionsFile.Save(DependenciesFile); + } + else + { + Log.LogMessage($"Versions in {DependenciesFile} are already up to date"); + } + + return !Log.HasLoggedErrors; + } + finally + { + if (File.Exists(tmpNupkgPath)) + { + File.Delete(tmpNupkgPath); + } + } + } + + private async Task TryDownloadLineupDepsFile() + { + if (string.IsNullOrEmpty(LineupDependenciesFile)) + { + return null; + } + + var path = LineupDependenciesFile; + string text; + if (path.StartsWith("http")) + { + using (var client = new HttpClient()) + { + text = await client.GetStringAsync(path); + } + } + else + { + text = File.ReadAllText(path); + } + + + using (var stringReader = new StringReader(text)) + using (var reader = new XmlTextReader(stringReader)) + { + var project = new Project(ProjectRootElement.Create(reader)); + return DependencyVersionsFile.LoadFromProject(project); + } + } + + private async Task TryDownloadLineupPackage(MSBuildLogger logger, string tmpNupkgPath) + { + VersionRange versionRange; + + if (string.IsNullOrEmpty(LineupPackageVersion)) + { + versionRange = VersionRange.AllFloating; + } + else if (!VersionRange.TryParse(LineupPackageVersion, out versionRange)) + { + Log.LogError($"{LineupPackageVersion} is not a valid NuGet package version"); + return null; + } + + var packageVersion = await GetPackageVersion(versionRange); + if (packageVersion == null) + { + Log.LogError($"Could not find a version of {LineupPackageId} in the version range {versionRange}."); + return null; + } + + var packageId = new PackageIdentity(LineupPackageId, packageVersion); + + var request = new PackageDownloadRequest + { + Identity = packageId, + OutputPath = tmpNupkgPath, + Sources = new[] { LineupPackageRestoreSource }, + }; + + var result = await new PackageDownloader(logger).DownloadPackagesAsync(new[] { request }, TimeSpan.FromSeconds(60), _cts.Token); + + if (!result) + { + Log.LogError("Could not download the lineup package"); + return null; + } + + using (var nupkgReader = new PackageArchiveReader(tmpNupkgPath)) + using (var stream = nupkgReader.GetStream("build/dependencies.props")) + using (var reader = new XmlTextReader(stream)) + { + var projectRoot = ProjectRootElement.Create(reader); + return DependencyVersionsFile.Load(projectRoot); + } + } + + private int UpdateDependencies(DependencyVersionsFile localVersionsFile, DependencyVersionsFile remoteDepsVersionFile) + { + var updateCount = 0; + foreach (var localVariable in localVersionsFile.VersionVariables.Values.Where(v => !v.IsReadOnly)) + { + string remoteVariableVersion; + // special case any package bundled in KoreBuild + if (!string.IsNullOrEmpty(KoreBuildVersion.Current) && localVariable.Name == "InternalAspNetCoreSdkPackageVersion") + { + remoteVariableVersion = KoreBuildVersion.Current; + Log.LogMessage(MessageImportance.Low, "Setting InternalAspNetCoreSdkPackageVersion to the current version of KoreBuild"); + } + else + { + if (remoteDepsVersionFile.VersionVariables.TryGetValue(localVariable.Name, out var remoteVariable)) + { + remoteVariableVersion = remoteVariable.Version; + } + else + { + Log.LogKoreBuildWarning( + DependenciesFile, KoreBuildErrors.PackageVersionNotFoundInLineup, + $"A new version variable for {localVariable.Name} could not be found in {LineupPackageId}. This might be an unsupported external dependency."); + continue; + } + } + + + if (remoteVariableVersion != localVariable.Version) + { + updateCount++; + localVersionsFile.Update(localVariable.Name, remoteVariableVersion); + } + } + + return updateCount; + } + + private async Task GetPackageVersion(VersionRange range) + { + if (!range.IsFloating) + { + return range.MinVersion; + } + + using (var cacheContext = new SourceCacheContext()) + { + var log = new MSBuildLogger(Log); + var defaultSettings = Settings.LoadDefaultSettings(root: null, configFileName: null, machineWideSettings: null); + var sourceProvider = new CachingSourceProvider(new PackageSourceProvider(defaultSettings)); + + var repo = sourceProvider.CreateRepository(new PackageSource(LineupPackageRestoreSource)); + + var metadata = await repo.GetResourceAsync(); + if (!await metadata.Exists(LineupPackageId, cacheContext, log, _cts.Token)) + { + Log.LogError($"Package {LineupPackageId} is not available on '{repo}'"); + return null; + } + + try + { + var versions = await metadata.GetVersions(LineupPackageId, includePrerelease: true, includeUnlisted: false, sourceCacheContext: cacheContext, log: log, token: _cts.Token); + + return range.FindBestMatch(versions); + } + catch (Exception ex) + { + Log.LogError($"Unexpected error while fetching versions from {repo.PackageSource.Source}: " + ex.Message); + return null; + } + } + } + } +} diff --git a/modules/KoreBuild.Tasks/Utilities/DependencyVersionsFile.cs b/modules/KoreBuild.Tasks/Utilities/DependencyVersionsFile.cs new file mode 100644 index 000000000..2b50a02b1 --- /dev/null +++ b/modules/KoreBuild.Tasks/Utilities/DependencyVersionsFile.cs @@ -0,0 +1,235 @@ +// 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 System.Text; +using Microsoft.Build.Construction; +using Microsoft.Build.Evaluation; + +namespace KoreBuild.Tasks.Utilities +{ + public class DependencyVersionsFile + { + public const string PackageVersionsLabel = "Package Versions"; + + public const string AutoPackageVersionsLabel = "Package Versions: Auto"; + public const string PinnedPackageVersionsLabel = "Package Versions: Pinned"; + + private readonly Dictionary _versionVariables + = new Dictionary(StringComparer.OrdinalIgnoreCase); + + //private readonly SortedDictionary _versionElements + // = new SortedDictionary(StringComparer.OrdinalIgnoreCase); + + private readonly ProjectRootElement _document; + private ProjectPropertyGroupElement _autoPackageVersions; + private ProjectPropertyGroupElement _pinnedPackageVersions; + + private DependencyVersionsFile(ProjectRootElement xDocument) + { + _document = xDocument; + } + + public static string GetVariableName(string packageId) + { + var sb = new StringBuilder(); + var first = true; + foreach (var ch in packageId) + { + if (!char.IsLetterOrDigit(ch)) + { + first = true; + continue; + } + + if (first) + { + first = false; + sb.Append(char.ToUpperInvariant(ch)); + } + else + { + sb.Append(ch); + } + } + sb.Append("PackageVersion"); + return sb.ToString(); + } + + + public static DependencyVersionsFile Create(bool addOverrideImport, string[] additionalImports = null) + { + var projectRoot = ProjectRootElement.Create(NewProjectFileOptions.None); + + projectRoot.AddPropertyGroup().AddProperty("MSBuildAllProjects", "$(MSBuildAllProjects);$(MSBuildThisFileFullPath)"); + + var autoPackageVersions = projectRoot.AddPropertyGroup(); + autoPackageVersions.Label = AutoPackageVersionsLabel; + + if (additionalImports != null) + { + foreach (var item in additionalImports) + { + var import = projectRoot.AddImport(item); + import.Condition = $"Exists('{item}')"; + } + } + + if (addOverrideImport) + { + var import = projectRoot.AddImport("$(DotNetPackageVersionPropsPath)"); + import.Condition = " '$(DotNetPackageVersionPropsPath)' != '' "; + } + + var pinnedPackageVersions = projectRoot.AddPropertyGroup(); + pinnedPackageVersions.Label = PinnedPackageVersionsLabel; + + return new DependencyVersionsFile(projectRoot) + { + _autoPackageVersions = autoPackageVersions, + _pinnedPackageVersions = pinnedPackageVersions, + }; + } + + public static bool TryLoad(string sourceFile, out DependencyVersionsFile file) + { + try + { + file = Load(sourceFile); + return true; + } + catch + { + file = null; + return false; + } + } + + public static DependencyVersionsFile Load(string sourceFile) + { + var project = ProjectRootElement.Open(sourceFile, ProjectCollection.GlobalProjectCollection, preserveFormatting: true); + return Load(project); + } + + public static DependencyVersionsFile Load(ProjectRootElement document) + { + var file = new DependencyVersionsFile(document); + + var propGroups = file._document.PropertyGroups; + + var listPropertyGroups = new List(); + + foreach (var propGroup in propGroups) + { + var attr = propGroup.Label; + if (attr != null && attr.StartsWith(PackageVersionsLabel, StringComparison.OrdinalIgnoreCase)) + { + file.HasVersionsPropertyGroup = true; + listPropertyGroups.Add(propGroup); + } + } + + foreach (var group in listPropertyGroups) + { + var isReadOnly = string.Equals(group.Label, PinnedPackageVersionsLabel, StringComparison.OrdinalIgnoreCase); + if (isReadOnly) + { + file._pinnedPackageVersions = group; + } + else + { + file._autoPackageVersions = group; + } + + foreach (var child in group.Properties) + { + var variable = new PackageVersionVariable(child, isReadOnly); + file._versionVariables[variable.Name] = variable; + } + } + + file.EnsureGroupsCreated(); + return file; + } + + private void EnsureGroupsCreated() + { + if (_autoPackageVersions == null) + { + _autoPackageVersions = _document.AddPropertyGroup(); + _autoPackageVersions.Label = AutoPackageVersionsLabel; + } + + if (_pinnedPackageVersions == null) + { + _pinnedPackageVersions = _document.AddPropertyGroup(); + _pinnedPackageVersions.Label = PinnedPackageVersionsLabel; + } + } + + public static DependencyVersionsFile LoadFromProject(Project project) + { + var file = new DependencyVersionsFile(ProjectRootElement.Create(NewProjectFileOptions.None)); + + foreach (var property in project.AllEvaluatedProperties.Where(p => p.Xml != null)) + { + var group = (ProjectPropertyGroupElement)property.Xml.Parent; + var isReadOnly = string.Equals(group.Label, PinnedPackageVersionsLabel, StringComparison.OrdinalIgnoreCase); + + var variable = new PackageVersionVariable(property.Xml, property.EvaluatedValue?.Trim(), isReadOnly); + file._versionVariables[property.Name] = variable; + } + + file.EnsureGroupsCreated(); + + return file; + } + + public bool HasVersionsPropertyGroup { get; private set; } + + // copying is required so calling .Set while iterating on this doesn't raise an InvalidOperationException + public IReadOnlyDictionary VersionVariables + => new Dictionary(_versionVariables, StringComparer.OrdinalIgnoreCase); + + public PackageVersionVariable Update(string variableName, string version) + { + if (!_versionVariables.TryGetValue(variableName, out var variable)) + { + var element = _document.CreatePropertyElement(variableName); + variable = new PackageVersionVariable(element, version, isReadOnly: false); + _versionVariables[variableName] = variable; + variable.AddToGroup(_autoPackageVersions); + } + + variable.UpdateVersion(version); + return variable; + } + + public PackageVersionVariable AddPinnedVariable(string variableName, string version) + { + if (_versionVariables.ContainsKey(variableName)) + { + throw new InvalidOperationException("Key already exists: " + variableName); + } + + var element = _document.CreatePropertyElement(variableName); + var variable = new PackageVersionVariable(element, version, isReadOnly: true); + _versionVariables.Add(variableName, variable); + variable.AddToGroup(_pinnedPackageVersions); + return variable; + } + + public void Save(string filePath) + { + _autoPackageVersions.RemoveAllChildren(); + foreach (var item in _versionVariables.Values.Where(v => !v.IsReadOnly).OrderBy(v => v.Name)) + { + item.AddToGroup(_autoPackageVersions); + } + + _document.Save(filePath, Encoding.UTF8); + } + } +} diff --git a/modules/KoreBuild.Tasks/Utilities/PackageVersionVariable.cs b/modules/KoreBuild.Tasks/Utilities/PackageVersionVariable.cs new file mode 100644 index 000000000..4131e2113 --- /dev/null +++ b/modules/KoreBuild.Tasks/Utilities/PackageVersionVariable.cs @@ -0,0 +1,56 @@ +// 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 Microsoft.Build.Construction; + +namespace KoreBuild.Tasks.Utilities +{ + public class PackageVersionVariable + { + private readonly ProjectPropertyElement _element; + + public PackageVersionVariable(ProjectPropertyElement element, bool isReadOnly) + : this(element, element.Value?.Trim(), isReadOnly) + { + } + + public PackageVersionVariable(ProjectPropertyElement element, string version, bool isReadOnly) + { + _element = element ?? throw new ArgumentNullException(nameof(element)); + IsReadOnly = isReadOnly; + Name = element.Name.ToString(); + Version = version ?? string.Empty; + } + + public string Name { get; } + + public string Version + { + get => _element.Value; + private set => _element.Value = value; + } + + public bool IsReadOnly { get; private set; } + + public void UpdateVersion(string version) + { + if (IsReadOnly) + { + throw new InvalidOperationException("You cannot updated a pinned package version variable automatically"); + } + + Version = version; + } + + public void AddToGroup(ProjectPropertyGroupElement group) + { + group.AppendChild(_element); + } + + public void SetLabel(string label) + { + _element.Label = label; + } + } +} diff --git a/modules/KoreBuild.Tasks/module.props b/modules/KoreBuild.Tasks/module.props index 8684f3a7d..87d34041c 100644 --- a/modules/KoreBuild.Tasks/module.props +++ b/modules/KoreBuild.Tasks/module.props @@ -10,10 +10,12 @@ + + @@ -21,6 +23,7 @@ + $(KOREBUILD_DOTNET_ARCH) diff --git a/modules/KoreBuild.Tasks/module.targets b/modules/KoreBuild.Tasks/module.targets index d64c117c0..f907ece4e 100644 --- a/modules/KoreBuild.Tasks/module.targets +++ b/modules/KoreBuild.Tasks/module.targets @@ -3,7 +3,7 @@ GetToolsets;$(PrepareDependsOn) - InstallDotNet;$(RestoreDependsOn) + InstallDotNet;CheckPackageReferences;$(RestoreDependsOn) false $(RepositoryRoot)korebuild.json @@ -47,6 +47,62 @@ Downloads and extracts .NET Core shared runtimes and SDKs. InstallScript="$(_DotNetInstall)"/> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj index af941212e..4170683c2 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj @@ -2,7 +2,7 @@ Internal.AspNetCore.SiteExtension.Sdk - netcoreapp3.0;net472 + netcoreapp3.0;net46 false Build targets and extensions to Microsoft.NET.Sdk. This package is intended for Microsoft use only. $(MSBuildThisFileDirectory)$(MSBuildProjectName).nuspec diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec index b3a3793ad..dff041805 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec @@ -11,7 +11,7 @@ - + diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props index f135ea01f..7d7ccfee1 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props @@ -5,7 +5,7 @@ netcoreapp3.0 - net472 + net46 $(MSBuildThisFileDirectory)..\tools\$(TaskFolder)\Internal.AspNetCore.SiteExtension.Sdk.dll diff --git a/test/ApiCheck.Test/ApiCheck.Test.csproj b/test/ApiCheck.Test/ApiCheck.Test.csproj index 25a4991b1..441e64089 100644 --- a/test/ApiCheck.Test/ApiCheck.Test.csproj +++ b/test/ApiCheck.Test/ApiCheck.Test.csproj @@ -3,7 +3,7 @@ netcoreapp3.0 - $(TargetFrameworks);net472 + $(TargetFrameworks);net461 diff --git a/test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs b/test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs new file mode 100644 index 000000000..a83450ff5 --- /dev/null +++ b/test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs @@ -0,0 +1,288 @@ +// 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 BuildTools.Tasks.Tests; +using Microsoft.Build.Utilities; +using System.IO; +using Xunit; +using Xunit.Abstractions; + +namespace KoreBuild.Tasks.Tests +{ + [Collection(nameof(MSBuildTestCollection))] + public class CheckPackageReferenceTests : TaskTestBase + { + public CheckPackageReferenceTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) : base(output, fixture) + { + } + + [Fact] + public void ItAllowsPinnedAndUnpinnedVersions() + { + var depsProps = Path.Combine(TempDir, "dependencies.props"); + File.WriteAllText(depsProps, $@" + + + 1.0.0 + + + + + + 1.0.0 + + +".Replace('`', '"')); + + var csproj = Path.Combine(TempDir, "Test.csproj"); + File.WriteAllText(csproj, $@" + + + + + $(BaseLinePackageVersion) + + + +".Replace('`', '"')); + + var task = new CheckPackageReferences + { + BuildEngine = MockEngine, + DependenciesFile = depsProps, + Projects = new[] { new TaskItem(csproj) } + }; + + Assert.True(task.Execute(), "Task is expected to pass"); + } + + [Fact] + public void PassesWhenAllRequirementsAreSatisifed() + { + var depsProps = Path.Combine(TempDir, "dependencies.props"); + File.WriteAllText(depsProps, $@" + + + 1.0.0 + + +".Replace('`', '"')); + + var csproj = Path.Combine(TempDir, "Test.csproj"); + File.WriteAllText(csproj, $@" + + + + + $(AspNetCorePackageVersion) + + + +".Replace('`', '"')); + + MockEngine.ContinueOnError = true; + var task = new CheckPackageReferences + { + BuildEngine = MockEngine, + DependenciesFile = depsProps, + Projects = new[] { new TaskItem(csproj) } + }; + + Assert.True(task.Execute(), "Task is expected to pass"); + } + + [Fact] + public void IgnoresUpdateAndRemoveItems() + { + var depsProps = Path.Combine(TempDir, "dependencies.props"); + File.WriteAllText(depsProps, $@" + + + +".Replace('`', '"')); + + var csproj = Path.Combine(TempDir, "Test.csproj"); + File.WriteAllText(csproj, $@" + + + + + + +".Replace('`', '"')); + + MockEngine.ContinueOnError = true; + var task = new CheckPackageReferences + { + BuildEngine = MockEngine, + DependenciesFile = depsProps, + Projects = new[] { new TaskItem(csproj) } + }; + + Assert.True(task.Execute(), "Task is expected to pass"); + } + + [Fact] + public void FailsWhenDependenciesHasNoPropGroup() + { + var depsFile = Path.Combine(TempDir, "deps.props"); + File.WriteAllText(depsFile, $@" + + + 1.0.0 + + +".Replace('`', '"')); + + MockEngine.ContinueOnError = true; + var task = new CheckPackageReferences + { + BuildEngine = MockEngine, + Projects = new[] { new TaskItem(depsFile) }, + DependenciesFile = depsFile, + }; + + Assert.True(task.Execute(), "Task is expected to pass"); + Assert.NotEmpty(MockEngine.Warnings); + Assert.Contains(MockEngine.Warnings, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefPropertyGroupNotFound); + } + + [Fact] + public void FailsWhenVariableIsNotInDependenciesPropsFile() + { + var depsProps = Path.Combine(TempDir, "dependencies.props"); + File.WriteAllText(depsProps, $@" + + + + +".Replace('`', '"')); + + var csproj = Path.Combine(TempDir, "Test.csproj"); + File.WriteAllText(csproj, $@" + + + + + +".Replace('`', '"')); + + MockEngine.ContinueOnError = true; + var task = new CheckPackageReferences + { + BuildEngine = MockEngine, + Projects = new[] { new TaskItem(csproj) }, + DependenciesFile = depsProps, + }; + + Assert.False(task.Execute(), "Task is expected to fail"); + Assert.NotEmpty(MockEngine.Errors); + Assert.Contains(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.VariableNotFoundInDependenciesPropsFile); + } + + [Fact] + public void FailsWhenPackageVersionFloat() + { + var depsProps = Path.Combine(TempDir, "dependencies.props"); + File.WriteAllText(depsProps, $@" + + + 1.0.0-* + + +".Replace('`', '"')); + + var csproj = Path.Combine(TempDir, "Test.csproj"); + File.WriteAllText(csproj, $@" + + + + + +".Replace('`', '"')); + + MockEngine.ContinueOnError = true; + var task = new CheckPackageReferences + { + BuildEngine = MockEngine, + Projects = new[] { new TaskItem(csproj) }, + DependenciesFile = depsProps, + }; + + Assert.False(task.Execute(), "Task is expected to fail"); + Assert.NotEmpty(MockEngine.Errors); + Assert.Contains(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefHasFloatingVersion); + } + + [Fact] + public void FailsWhenPackageVersionIsInvalid() + { + var depsProps = Path.Combine(TempDir, "dependencies.props"); + File.WriteAllText(depsProps, $@" + + + 1 + + +".Replace('`', '"')); + + var csproj = Path.Combine(TempDir, "Test.csproj"); + File.WriteAllText(csproj, $@" + + + + + +".Replace('`', '"')); + + MockEngine.ContinueOnError = true; + var task = new CheckPackageReferences + { + BuildEngine = MockEngine, + Projects = new[] { new TaskItem(csproj) }, + DependenciesFile = depsProps, + }; + + Assert.False(task.Execute(), "Task is expected to fail"); + Assert.NotEmpty(MockEngine.Errors); + Assert.Contains(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.InvalidPackageVersion); + } + + [Theory] + [InlineData("1.0.0")] + [InlineData("1.0.0-$(Suffix)")] + [InlineData("$(Prefix)-1.0.0-$(Suffix)")] + [InlineData("$(Prefix)-1.0.0")] + public void FailsWhenPackagesReferenceVersionDoesNotCompletelyUseVariables(string version) + { + var depsProps = Path.Combine(TempDir, "dependencies.props"); + File.WriteAllText(depsProps, $@" + + + +".Replace('`', '"')); + + var csproj = Path.Combine(TempDir, "Test.csproj"); + File.WriteAllText(csproj, $@" + + + + + +".Replace('`', '"')); + + MockEngine.ContinueOnError = true; + var task = new CheckPackageReferences + { + BuildEngine = MockEngine, + Projects = new[] { new TaskItem(csproj) }, + DependenciesFile = depsProps, + }; + + Assert.False(task.Execute(), "Task is expected to fail"); + Assert.NotEmpty(MockEngine.Errors); + var error = Assert.Single(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefHasLiteralVersion); + Assert.Equal(4, error.LineNumber); + } + } +} diff --git a/test/KoreBuild.Tasks.Tests/DependencyVersionsFileTests.cs b/test/KoreBuild.Tasks.Tests/DependencyVersionsFileTests.cs new file mode 100644 index 000000000..8b030706f --- /dev/null +++ b/test/KoreBuild.Tasks.Tests/DependencyVersionsFileTests.cs @@ -0,0 +1,117 @@ +// 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; +using System.IO; +using System.Linq; +using BuildTools.Tasks.Tests; +using KoreBuild.Tasks.Utilities; +using Microsoft.Build.Construction; +using Microsoft.Build.Utilities; +using Xunit; +using Xunit.Abstractions; + +namespace KoreBuild.Tasks.Tests +{ + [Collection(nameof(MSBuildTestCollection))] + public class DependencyVersionsFileTests : IDisposable + { + private readonly string _tempFile; + private readonly ITestOutputHelper _output; + + public DependencyVersionsFileTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) + { + _output = output; + fixture.InitializeEnvironment(output); + _tempFile = Path.Combine(AppContext.BaseDirectory, Path.GetRandomFileName()); + } + + public void Dispose() + { + if (File.Exists(_tempFile)) + { + File.Delete(_tempFile); + } + } + + [Fact] + public void ItSortsVariablesAlphabetically() + { + var depsFile = DependencyVersionsFile.Create(addOverrideImport: true); + depsFile.Update("XyzPackageVersion", "123"); + depsFile.Update("AbcPackageVersion", "456"); + depsFile.Save(_tempFile); + + var project = ProjectRootElement.Open(_tempFile); + _output.WriteLine(File.ReadAllText(_tempFile)); + + var versions = Assert.Single(project.PropertyGroups, p => p.Label == DependencyVersionsFile.AutoPackageVersionsLabel); + Assert.Collection(versions.Properties, + v => Assert.Equal("AbcPackageVersion", v.Name), + v => Assert.Equal("XyzPackageVersion", v.Name)); + } + + [Fact] + public void SetIsCaseInsensitive() + { + var depsFile = DependencyVersionsFile.Create(addOverrideImport: true); + depsFile.Update("XunitRunnerVisualStudioVersion", "2.3.0"); + depsFile.Update("XunitRunnerVisualstudioVersion", "2.4.0"); + depsFile.Save(_tempFile); + + var project = ProjectRootElement.Open(_tempFile); + _output.WriteLine(File.ReadAllText(_tempFile)); + + var versions = Assert.Single(project.PropertyGroups, p => p.Label == DependencyVersionsFile.AutoPackageVersionsLabel); + var prop = Assert.Single(versions.Properties); + Assert.Equal("XunitRunnerVisualStudioVersion", prop.Name); + Assert.Equal("2.4.0", prop.Value); + } + + [Theory] + [InlineData("Microsoft.Data.Sqlite", "MicrosoftDataSqlitePackageVersion")] + [InlineData("SQLitePCLRaw.bundle_green", "SQLitePCLRawBundleGreenPackageVersion")] + [InlineData("runtime.win-x64.Microsoft.NETCore", "RuntimeWinX64MicrosoftNETCorePackageVersion")] + public void GeneratesVariableName(string id, string varName) + { + Assert.Equal(varName, DependencyVersionsFile.GetVariableName(id)); + } + + [Fact] + public void AdditionalImportsAreAdded_WithOverrideImportFalse() + { + // Arrange + var path = "obj/test.props"; + var depsFile = DependencyVersionsFile.Create(addOverrideImport: false, additionalImports: new[] { path }); + depsFile.Save(_tempFile); + + // Act + var project = ProjectRootElement.Open(_tempFile); + _output.WriteLine(File.ReadAllText(_tempFile)); + + // Assert + var import = Assert.Single(project.Imports); + Assert.Equal(path, import.Project); + } + + [Fact] + public void AdditionalImportsAreAdded_WithOverrideImportTrue() + { + // Arrange + var path = "obj/external.props"; + var depsFile = DependencyVersionsFile.Create(addOverrideImport: true, additionalImports: new[] { path }); + depsFile.Save(_tempFile); + + // Act + var project = ProjectRootElement.Open(_tempFile); + _output.WriteLine(File.ReadAllText(_tempFile)); + + // Assert + Assert.Collection( + project.Imports, + import => Assert.Equal(path, import.Project), + import => Assert.Equal("$(DotNetPackageVersionPropsPath)", import.Project)); + } + } +} diff --git a/test/KoreBuild.Tasks.Tests/GenerateDependenciesPropsFileTests.cs b/test/KoreBuild.Tasks.Tests/GenerateDependenciesPropsFileTests.cs new file mode 100644 index 000000000..0748aec14 --- /dev/null +++ b/test/KoreBuild.Tasks.Tests/GenerateDependenciesPropsFileTests.cs @@ -0,0 +1,151 @@ +// 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; +using System.IO; +using BuildTools.Tasks.Tests; +using KoreBuild.Tasks.Utilities; +using Microsoft.Build.Construction; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using Xunit; +using Xunit.Abstractions; + +namespace KoreBuild.Tasks.Tests +{ + [Collection(nameof(MSBuildTestCollection))] + public class GenerateDependenciesPropsFileTests : IDisposable + { + private readonly ITestOutputHelper _output; + private readonly string _tempDir; + + public GenerateDependenciesPropsFileTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) + { + _output = output; + _tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + Directory.CreateDirectory(_tempDir); + fixture.InitializeEnvironment(output); + } + + [Fact] + public void GeneratesVariableName() + { + var generatedFile = Path.Combine(_tempDir, "deps.props"); + var csproj = Path.Combine(_tempDir, "test.csproj"); + CreateProject(csproj, "1.2.3"); + + var task = new GenerateDependenciesPropsFile + { + BuildEngine = new MockEngine(_output), + DependenciesFile = generatedFile, + Projects = new[] { new TaskItem(csproj) }, + Properties = Array.Empty(), + }; + + Assert.True(task.Execute(), "Task is expected to pass"); + var depsFile = ProjectRootElement.Open(generatedFile); + _output.WriteLine(File.ReadAllText(generatedFile)); + var pg = Assert.Single(depsFile.PropertyGroups, p => p.Label == DependencyVersionsFile.AutoPackageVersionsLabel); + var prop = Assert.Single(pg.Properties, p => p.Name == "MyDependencyPackageVersion"); + Assert.Equal("1.2.3", prop.Value); + } + + [Fact] + public void IgnoresImplicitlyDefinedVariables() + { + var generatedFile = Path.Combine(_tempDir, "deps.props"); + var csproj = Path.Combine(_tempDir, "test.csproj"); + File.WriteAllText(csproj, $@" + + + netstandard2.0 + +".Replace('`', '"')); + + var task = new GenerateDependenciesPropsFile + { + BuildEngine = new MockEngine(_output), + DependenciesFile = generatedFile, + Projects = new[] { new TaskItem(csproj) }, + Properties = Array.Empty(), + }; + + Assert.True(task.Execute(), "Task is expected to pass"); + var depsFile = ProjectRootElement.Open(generatedFile); + _output.WriteLine(File.ReadAllText(generatedFile)); + var pg = Assert.Single(depsFile.PropertyGroups, p => p.Label == DependencyVersionsFile.AutoPackageVersionsLabel); + Assert.Empty(pg.Properties); + } + + [Fact] + public void FailsWhenConflictingVersions() + { + var generatedFile = Path.Combine(_tempDir, "deps.props"); + var csproj1 = Path.Combine(_tempDir, "test1.csproj"); + var csproj2 = Path.Combine(_tempDir, "test2.csproj"); + CreateProject(csproj1, "1.2.3"); + CreateProject(csproj2, "4.5.6"); + + var engine = new MockEngine(_output) { ContinueOnError = true }; + var task = new GenerateDependenciesPropsFile + { + BuildEngine = engine, + DependenciesFile = generatedFile, + Projects = new[] { new TaskItem(csproj1), new TaskItem(csproj2) }, + Properties = Array.Empty(), + }; + + Assert.False(task.Execute(), "Task is expected to fail"); + Assert.Single(engine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.ConflictingPackageReferenceVersions); + } + + [Fact] + public void DoesNotFailWhenConflictingVersionsAreSuppressed() + { + var generatedFile = Path.Combine(_tempDir, "deps.props"); + var csproj1 = Path.Combine(_tempDir, "test1.csproj"); + var csproj2 = Path.Combine(_tempDir, "test2.csproj"); + CreateProject(csproj1, "1.2.3"); + + File.WriteAllText(csproj2, $@" + + + netstandard2.0 + + + + +".Replace('`', '"')); + + var task = new GenerateDependenciesPropsFile + { + BuildEngine = new MockEngine(_output), + DependenciesFile = generatedFile, + Projects = new[] { new TaskItem(csproj1), new TaskItem(csproj2) }, + Properties = Array.Empty(), + }; + + Assert.True(task.Execute(), "Task is expected to oass"); + } + + private static void CreateProject(string csprojFilePath, string version) + { + File.WriteAllText(csprojFilePath, $@" + + + netstandard2.0 + + + + +".Replace('`', '"')); + } + + + public void Dispose() + { + Directory.Delete(_tempDir, recursive: true); + } + } +} diff --git a/test/KoreBuild.Tasks.Tests/GeneratePackageVersionPropsFileTests.cs b/test/KoreBuild.Tasks.Tests/GeneratePackageVersionPropsFileTests.cs new file mode 100644 index 000000000..86c731b8c --- /dev/null +++ b/test/KoreBuild.Tasks.Tests/GeneratePackageVersionPropsFileTests.cs @@ -0,0 +1,116 @@ +// 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; +using System.IO; +using BuildTools.Tasks.Tests; +using KoreBuild.Tasks.Utilities; +using Microsoft.Build.Construction; +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using Xunit; +using Xunit.Abstractions; + +namespace KoreBuild.Tasks.Tests +{ + [Collection(nameof(MSBuildTestCollection))] + public class GeneratePackageVersionPropsFileTests : IDisposable + { + private readonly ITestOutputHelper _output; + private readonly string _tempFile; + + public GeneratePackageVersionPropsFileTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) + { + _output = output; + _tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + fixture.InitializeEnvironment(output); + } + + [Fact] + public void GeneratesFile() + { + var engine = new MockEngine(_output); + var task = new GeneratePackageVersionPropsFile + { + BuildEngine = engine, + Packages = new[] + { + // Order is important. These are intentionally reverse sorted to ensure the generated file sorts properties by prop name + new TaskItem("Newtonsoft.Json", new Hashtable{["Version"] = "10.0.3", ["VariableName"] = "JsonNetVersion"}), + new TaskItem("Microsoft.Azure", new Hashtable{["Version"] = "1.2.0"}), + new TaskItem("Another.Package", new Hashtable{["Version"] = "0.0.1", ["TargetFramework"] = "netstandard1.0"}), + }, + OutputPath = _tempFile, + }; + + Assert.True(task.Execute(), "Task is expected to pass"); + + var project = ProjectRootElement.Open(_tempFile); + _output.WriteLine(File.ReadAllText(_tempFile)); + + Assert.Empty(project.Imports); + Assert.Empty(project.ImportGroups); + + var defaultPropGroup = Assert.Single(project.PropertyGroups, pg => string.IsNullOrEmpty(pg.Label)); + var allProjectsProp = Assert.Single(defaultPropGroup.Properties); + Assert.Equal("MSBuildAllProjects", allProjectsProp.Name); + Assert.Empty(allProjectsProp.Condition); + Assert.Equal("$(MSBuildAllProjects);$(MSBuildThisFileFullPath)", allProjectsProp.Value); + + var versions = Assert.Single(project.PropertyGroups, pg => pg.Label == DependencyVersionsFile.AutoPackageVersionsLabel); + + // Order is important. These should be sorted. + Assert.Collection(versions.Properties, + p => + { + Assert.Equal("AnotherPackagePackageVersion", p.Name); + Assert.Equal("Another.Package", p.Label); + Assert.Equal("0.0.1", p.Value); + Assert.Empty(p.Condition); + }, + p => + { + Assert.Equal("JsonNetVersion", p.Name); + Assert.Equal("Newtonsoft.Json", p.Label); + Assert.Equal("10.0.3", p.Value); + Assert.Empty(p.Condition); + }, + p => + { + Assert.Equal("MicrosoftAzurePackageVersion", p.Name); + Assert.Equal("Microsoft.Azure", p.Label); + Assert.Equal("1.2.0", p.Value); + Assert.Empty(p.Condition); + }); + } + + [Fact] + public void GeneratesImport() + { + var task = new GeneratePackageVersionPropsFile + { + BuildEngine = new MockEngine(_output), + Packages = Array.Empty(), + AddOverrideImport = true, + OutputPath = _tempFile, + }; + + Assert.True(task.Execute(), "Task is expected to pass"); + var project = ProjectRootElement.Open(_tempFile); + _output.WriteLine(File.ReadAllText(_tempFile)); + + var import = Assert.Single(project.Imports); + Assert.Equal("$(DotNetPackageVersionPropsPath)", import.Project); + Assert.Equal(" '$(DotNetPackageVersionPropsPath)' != '' ", import.Condition); + } + + public void Dispose() + { + if (File.Exists(_tempFile)) + { + File.Delete(_tempFile); + } + } + } +} diff --git a/test/KoreBuild.Tasks.Tests/SolutionInfoFactoryTests.cs b/test/KoreBuild.Tasks.Tests/SolutionInfoFactoryTests.cs new file mode 100644 index 000000000..f2eaad004 --- /dev/null +++ b/test/KoreBuild.Tasks.Tests/SolutionInfoFactoryTests.cs @@ -0,0 +1,96 @@ +// 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.IO; +using KoreBuild.Tasks.ProjectModel; +using Xunit; + +namespace KoreBuild.Tasks.Tests +{ + public class SolutionInfoFactoryTests : IDisposable + { + private readonly string _slnFile; + + public SolutionInfoFactoryTests() + { + _slnFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); + } + + [Theory] + [InlineData("", new[] { "ClassLib1", "VsixProject" })] + [InlineData("Debug", new[] { "ClassLib1", "VsixProject" })] + [InlineData("DebugNoVSIX", new[] { "ClassLib1" })] + public void FindsProjectsByDefaultConfiguration(string config, string[] projects) + { + File.WriteAllText(_slnFile, @" +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26124.0 +MinimumVisualStudioVersion = 15.0.26124.0 +Project(`{2150E333-8FDC-42A3-9474-1A3956D46DE8}`) = `src`, `src`, `{6BC8A037-601B-412E-B394-92F55C01C7A6}` +EndProject +Project(`{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}`) = `ClassLib1`, `src\ClassLib1\ClassLib1.csproj`, `{89EF0B05-98D4-4C4D-8870-718571091F79}` +EndProject +Project(`{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}`) = `VsixProject`, `src\VsixProject\VsixProject.csproj`, `{86986537-8DF5-423F-A3A8-0CA568A9FFC4}` +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + DebugNoVSIX|Any CPU = DebugNoVSIX|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {89EF0B05-98D4-4C4D-8870-718571091F79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {89EF0B05-98D4-4C4D-8870-718571091F79}.Debug|Any CPU.Build.0 = Debug|Any CPU + {86986537-8DF5-423F-A3A8-0CA568A9FFC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {86986537-8DF5-423F-A3A8-0CA568A9FFC4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {89EF0B05-98D4-4C4D-8870-718571091F79}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU + {89EF0B05-98D4-4C4D-8870-718571091F79}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU + {86986537-8DF5-423F-A3A8-0CA568A9FFC4}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {89EF0B05-98D4-4C4D-8870-718571091F79} = {6BC8A037-601B-412E-B394-92F55C01C7A6} + {86986537-8DF5-423F-A3A8-0CA568A9FFC4} = {6BC8A037-601B-412E-B394-92F55C01C7A6} + EndGlobalSection +EndGlobal +".Replace('`', '"')); + + var solution = SolutionInfoFactory.Create(_slnFile, config); + Assert.Equal(projects.Length, solution.Projects.Count); + Assert.All(projects, expected => Assert.Contains(solution.Projects, proj => Path.GetFileNameWithoutExtension(proj) == expected)); + } + + [Fact] + public void ThrowsForBadConfigName() + { + File.WriteAllText(_slnFile, @" +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26124.0 +MinimumVisualStudioVersion = 15.0.26124.0 +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal +".Replace('`', '"')); + + Assert.Throws(() => SolutionInfoFactory.Create(_slnFile, "Release")); + } + + public void Dispose() + { + try + { + File.Delete(_slnFile); + } + catch { } + } + } +} diff --git a/test/KoreBuild.Tasks.Tests/UpgradeDependenciesTests.cs b/test/KoreBuild.Tasks.Tests/UpgradeDependenciesTests.cs new file mode 100644 index 000000000..3de7997f3 --- /dev/null +++ b/test/KoreBuild.Tasks.Tests/UpgradeDependenciesTests.cs @@ -0,0 +1,254 @@ +// 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.IO; +using System.Threading.Tasks; +using BuildTools.Tasks.Tests; +using KoreBuild.Tasks.Utilities; +using Microsoft.Build.Construction; +using Microsoft.Build.Evaluation; +using NuGet.Packaging; +using NuGet.Packaging.Core; +using NuGet.Versioning; +using Xunit; +using Xunit.Abstractions; + +namespace KoreBuild.Tasks.Tests +{ + [Collection(nameof(MSBuildTestCollection))] + public class UpgradeDependenciesTests : IDisposable + { + private readonly string _tempDir; + private readonly ITestOutputHelper _output; + + public UpgradeDependenciesTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) + { + fixture.InitializeEnvironment(output); + _tempDir = Path.Combine(AppContext.BaseDirectory, Path.GetRandomFileName()); + Directory.CreateDirectory(_tempDir); + _output = output; + } + + [Fact] + public async Task WarnsWhenVariableIsNotInPackage() + { + // arrange + var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); + var lineupPackagePath = CreateLineup(packageId); + var depsFilePath = CreateProjectDepsFile(new VersionVariable("PackageVersionVar", "1.0.0")); + var engine = new MockEngine(_output); + + // act + var task = new UpgradeDependencies + { + BuildEngine = engine, + DependenciesFile = depsFilePath, + LineupPackageId = packageId.Id, + LineupPackageRestoreSource = _tempDir, + }; + + // assert + Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); + var warning = Assert.Single(engine.Warnings); + Assert.Equal(KoreBuildErrors.Prefix + KoreBuildErrors.PackageVersionNotFoundInLineup, warning.Code); + + var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); + Assert.Equal("1.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); + } + + [Fact] + public async Task ModifiesVariableValue() + { + // arrange + var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); + var lineupPackagePath = CreateLineup(packageId, new VersionVariable("PackageVersionVar", "2.0.0")); + var depsFilePath = CreateProjectDepsFile(new VersionVariable("PackageVersionVar", "1.0.0")); + + // act + var task = new UpgradeDependencies + { + BuildEngine = new MockEngine(_output), + DependenciesFile = depsFilePath, + LineupPackageId = packageId.Id, + LineupPackageRestoreSource = _tempDir, + }; + + // assert + Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); + var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); + Assert.Equal("2.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); + Assert.False(modifiedDepsFile.VersionVariables["PackageVersionVar"].IsReadOnly); + } + + + [Fact] + public async Task DoesNotModifyPinnedVariableValue() + { + // arrange + var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); + var lineupPackagePath = CreateLineup(packageId, new VersionVariable("PackageVersionVar", "2.0.0")); + var depsFilePath = CreateProjectDepsFile(new VersionVariable("PackageVersionVar", "1.0.0") { IsReadOnly = true }); + + // act + var task = new UpgradeDependencies + { + BuildEngine = new MockEngine(_output), + DependenciesFile = depsFilePath, + LineupPackageId = packageId.Id, + LineupPackageRestoreSource = _tempDir, + }; + + // assert + Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); + _output.WriteLine(File.ReadAllText(depsFilePath)); + var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); + Assert.Equal("1.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); + Assert.True(modifiedDepsFile.VersionVariables["PackageVersionVar"].IsReadOnly); + } + + + [Fact] + public async Task ModifiesVariableValueUsingDepsFile() + { + // arrange + var depsFilePath = CreateProjectDepsFile(new VersionVariable("PackageVersionVar", "1.0.0")); + var updatedDepsFilePath = CreateProjectDepsFile(Path.Combine(_tempDir, "dependencies.props"), new VersionVariable("PackageVersionVar", "2.0.0")); + + // act + var task = new UpgradeDependencies + { + BuildEngine = new MockEngine(_output), + DependenciesFile = depsFilePath, + LineupDependenciesFile = updatedDepsFilePath + }; + + // assert + Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); + var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); + Assert.Equal("2.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); + } + + [Fact] + public async Task SnapsInternalAspNetCoreSdkToBuildTools() + { + // arrange + var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); + var lineupPackagePath = CreateLineup(packageId, new VersionVariable("InternalAspNetCoreSdkPackageVersion", "2.0.0")); + var depsFilePath = CreateProjectDepsFile(new VersionVariable("InternalAspNetCoreSdkPackageVersion", "1.0.0")); + + // act + var task = new UpgradeDependencies + { + BuildEngine = new MockEngine(_output), + DependenciesFile = depsFilePath, + LineupPackageId = packageId.Id, + LineupPackageRestoreSource = _tempDir, + }; + + // assert + Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); + var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); + Assert.Equal(KoreBuildVersion.Current, modifiedDepsFile.VersionVariables["InternalAspNetCoreSdkPackageVersion"].Version); + } + + [Fact] + public async Task DoesNotModifiesFileIfNoChanges() + { + // arrange + var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); + var pkg = new VersionVariable("PackageVersionVar", "1.0.0"); + var lineupPackagePath = CreateLineup(packageId, pkg); + var depsFilePath = CreateProjectDepsFile(pkg); + var created = File.GetLastWriteTime(depsFilePath); + + // act + var task = new UpgradeDependencies + { + BuildEngine = new MockEngine(_output), + DependenciesFile = depsFilePath, + LineupPackageId = packageId.Id, + LineupPackageRestoreSource = _tempDir, + }; + + // assert + Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); + var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); + Assert.Equal("1.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); + Assert.Equal(created, File.GetLastWriteTime(depsFilePath)); + } + + private string CreateProjectDepsFile(params VersionVariable[] variables) + { + return CreateProjectDepsFile(Path.Combine(_tempDir, "projectdeps.props"), variables); + } + + private string CreateProjectDepsFile(string depsFilePath, params VersionVariable[] variables) + { + var proj = ProjectRootElement.Create(NewProjectFileOptions.None); + var originalDepsFile = DependencyVersionsFile.Load(proj); + foreach (var item in variables) + { + if (item.IsReadOnly) + { + originalDepsFile.AddPinnedVariable(item.Name, item.Version); + } + else + { + originalDepsFile.Update(item.Name, item.Version); + } + } + originalDepsFile.Save(depsFilePath); + return depsFilePath; + } + + private string CreateLineup(PackageIdentity identity, params VersionVariable[] variables) + { + var output = Path.Combine(_tempDir, $"{identity.Id}.{identity.Version}.nupkg"); + + var proj = ProjectRootElement.Create(NewProjectFileOptions.None); + var depsFiles = DependencyVersionsFile.Load(proj); + foreach (var item in variables) + { + depsFiles.Update(item.Name, item.Version); + } + depsFiles.Save(Path.Combine(_tempDir, "dependencies.props")); + + var builder = new PackageBuilder + { + Id = identity.Id, + Version = identity.Version, + Owners = { "Test" }, + Authors = { "Test" }, + Description = "Test lineup package" + }; + + builder.AddFiles(_tempDir, "dependencies.props", "build/dependencies.props"); + + using (var stream = File.Create(output)) + { + builder.Save(stream); + } + + return output; + } + + public void Dispose() + { + Directory.Delete(_tempDir, recursive: true); + } + + private struct VersionVariable + { + public string Name; + public string Version; + internal bool IsReadOnly; + + public VersionVariable(string varName, string version) : this() + { + this.Name = varName; + this.Version = version; + } + } + } +} diff --git a/testassets/SimpleRepo/build/repo.targets b/testassets/SimpleRepo/build/repo.targets index ab5c77a87..c7f3af77e 100644 --- a/testassets/SimpleRepo/build/repo.targets +++ b/testassets/SimpleRepo/build/repo.targets @@ -2,7 +2,7 @@ $(PrepareDependsOn);Greet $(PackageDependsOn);PackLineup - $(VerifyDependsOn);TestNuGetPush + $(VerifyDependsOn);TestNuGetPush;UpgradeDependencies Sample.Lineup $(Version) diff --git a/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj b/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj index 9859ce949..90776f448 100644 --- a/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj +++ b/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj @@ -1,11 +1,8 @@ + - netstandard2.0;net472 + netstandard2.0;net461 TestCert - - - - diff --git a/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj b/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj index 10929c713..f68591deb 100644 --- a/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj +++ b/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj @@ -1,7 +1,7 @@ - netcoreapp3.0;net472 + netcoreapp3.0;net461 netcoreapp3.0 diff --git a/tools/KoreBuild.Console/Commands/DependenciesGenerateCommand.cs b/tools/KoreBuild.Console/Commands/DependenciesGenerateCommand.cs new file mode 100644 index 000000000..274de1c7f --- /dev/null +++ b/tools/KoreBuild.Console/Commands/DependenciesGenerateCommand.cs @@ -0,0 +1,76 @@ +// 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.Collections.Generic; +using System.IO; +using Microsoft.Extensions.CommandLineUtils; + +namespace KoreBuild.Console.Commands +{ + internal class DependenciesGenerateCommand : SubCommandBase + { + private CommandOption _configOpt; + private CommandOption _fileOpt; + + public DependenciesGenerateCommand(CommandContext context) : base(context) + { + } + + public override void Configure(CommandLineApplication application) + { + application.Description = "Generates a build/dependencies.props file and updates csproj files to use variables"; + application.ExtendedHelpText = @" +MORE INFO: + + This command will generate a dependencies.props file and adjust all PackageReference's in csproj files + to use the MSBuild variables it generates. + + Example output: + + + + 1.0.0 + + +"; + + _configOpt = application.Option("-c|--configuration ", "The MSBuild configuration. Defaults to 'Debug'.", CommandOptionType.SingleValue); + _fileOpt = application.Option("--deps-file ", "The dependencies.props file to upgrade.", CommandOptionType.SingleValue); + + base.Configure(application); + } + + protected override int Execute() + { + var args = new List + { + "msbuild", + Path.Combine(Context.KoreBuildDir, "KoreBuild.proj"), + "-t:GenerateDependenciesPropsFile", + }; + + if (_configOpt.HasValue()) + { + args.Add("-p:Configuration=" + _configOpt.Value()); + } + + if (_fileOpt.HasValue()) + { + var filePath = _fileOpt.Value(); + if (!Path.IsPathRooted(filePath)) + { + filePath = Path.GetFullPath(filePath); + } + + args.Add("-p:DependencyVersionsFile=" + filePath); + } + + if (Reporter.IsVerbose) + { + args.Add("-v:n"); + } + + return RunDotnet(args, Context.RepoPath); + } + } +} diff --git a/tools/KoreBuild.Console/Commands/DependenciesUpgradeCommand.cs b/tools/KoreBuild.Console/Commands/DependenciesUpgradeCommand.cs new file mode 100644 index 000000000..b830e71a5 --- /dev/null +++ b/tools/KoreBuild.Console/Commands/DependenciesUpgradeCommand.cs @@ -0,0 +1,99 @@ +// 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.Collections.Generic; +using System.IO; +using Microsoft.Extensions.CommandLineUtils; + +namespace KoreBuild.Console.Commands +{ + internal class DependenciesUpgradeCommand : SubCommandBase + { + private CommandOption _sourceOpt; + private CommandOption _packageIdOpt; + private CommandOption _packageVersionOpt; + private CommandOption _sourceDeps; + private CommandOption _fileOpt; + + public DependenciesUpgradeCommand(CommandContext context) : base(context) + { + } + + public override void Configure(CommandLineApplication application) + { + application.Description = "Upgrades the build/dependencies.props file to the latest package versions"; + application.ExtendedHelpText = @" +MORE INFO: + + The upgrade uses a 'lineup' package as the source of information about which versions to use. + + A lineup package is simply a nuget package that contains a file in build/dependencies.props. + Just like the version of the file in this local repo, this file is an MSBuild project file + with a list of MSBuild variables. Example: + + + + 1.0.0 + + +"; + + _sourceOpt = application.Option("-s|--source ", + "Specifies a NuGet package source to use to upgrade dependencies to the latest lineup package.", CommandOptionType.SingleValue); + _packageIdOpt = application.Option("--id ", "Specifies the lineup package id to use.", CommandOptionType.SingleValue); + _packageVersionOpt = application.Option("--version ", "Specifies the lineup package version to use.", CommandOptionType.SingleValue); + _sourceDeps = application.Option("--source-deps ", "The dependencies.props file to use as a source of versions.", CommandOptionType.SingleValue); + _fileOpt = application.Option("--deps-file ", "The dependencies.props file to upgrade.", CommandOptionType.SingleValue); + + base.Configure(application); + } + + protected override int Execute() + { + var args = new List + { + "msbuild", + Path.Combine(Context.KoreBuildDir, "KoreBuild.proj"), + "-t:UpgradeDependencies", + }; + + if (_sourceOpt.HasValue()) + { + args.Add("-p:LineupPackageRestoreSource=" + _sourceOpt.Value()); + } + + if (_packageIdOpt.HasValue()) + { + args.Add("-p:LineupPackageId=" + _packageIdOpt.Value()); + } + + if (_packageVersionOpt.HasValue()) + { + args.Add("-p:LineupPackageVersion=" + _packageVersionOpt.Value()); + } + + if (_sourceDeps.HasValue()) + { + args.Add("-p:LineupDependenciesFile=" + _sourceDeps.Value()); + } + + if (_fileOpt.HasValue()) + { + var filePath = _fileOpt.Value(); + if (!Path.IsPathRooted(filePath)) + { + filePath = Path.GetFullPath(filePath); + } + + args.Add("-p:DependencyVersionsFile=" + filePath); + } + + if (Reporter.IsVerbose) + { + args.Add("-v:n"); + } + + return RunDotnet(args, Context.RepoPath); + } + } +} diff --git a/tools/KoreBuild.Console/Commands/RootCommand.cs b/tools/KoreBuild.Console/Commands/RootCommand.cs index 013868cbf..6477f7e23 100644 --- a/tools/KoreBuild.Console/Commands/RootCommand.cs +++ b/tools/KoreBuild.Console/Commands/RootCommand.cs @@ -15,8 +15,7 @@ public override void Configure(CommandLineApplication application) application.FullName = "korebuild"; application.Command("install-tools", new InstallToolsCommand(context).Configure, throwOnUnexpectedArg: false); - application.Command("install", c => - { + application.Command("install", c => { c.HelpOption("-h|--help"); c.Command("vs", new InstallToolsetsCommand(context).Configure, throwOnUnexpectedArg: false); c.OnExecute(() => @@ -28,11 +27,25 @@ public override void Configure(CommandLineApplication application) application.Command("msbuild", new MSBuildCommand(context).Configure, throwOnUnexpectedArg: false); application.Command("docker-build", new DockerBuildCommand(context).Configure, throwOnUnexpectedArg: false); + // Commands that upgrade things + application.Command("upgrade", c => + { + c.HelpOption("-h|--help"); + c.Command("deps", new DependenciesUpgradeCommand(context).Configure, throwOnUnexpectedArg: false); + + c.OnExecute(() => + { + c.ShowHelp(); + return 2; + }); + }); + // Commands that generate code and files application.Command("generate", c => { c.HelpOption("-h|--help"); + c.Command("deps", new DependenciesGenerateCommand(context).Configure, throwOnUnexpectedArg: false); c.Command("api-baselines", new ApiBaselinesGenerateCommand(context).Configure, throwOnUnexpectedArg: false); c.OnExecute(() => From 84dcc6f0eb5455a3c0305d6d238926defb050889 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 20 Nov 2018 20:03:03 -0800 Subject: [PATCH 135/192] Fix NU5123 when the package id for shared sources is long --- files/KoreBuild/modules/sharedsources/sharedsources.csproj | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/KoreBuild/modules/sharedsources/sharedsources.csproj b/files/KoreBuild/modules/sharedsources/sharedsources.csproj index ad47abc14..326d3503f 100644 --- a/files/KoreBuild/modules/sharedsources/sharedsources.csproj +++ b/files/KoreBuild/modules/sharedsources/sharedsources.csproj @@ -51,11 +51,11 @@ true - $(ContentTargetFolders)\cs\netstandard1.0\$(PackageId)\%(RecursiveDir)\ + $(ContentTargetFolders)\cs\netstandard1.0\shared\%(RecursiveDir)\ true - $(ContentTargetFolders)\any\any\$(PackageId)\%(RecursiveDir)\ + $(ContentTargetFolders)\any\any\shared\%(RecursiveDir)\ From e7f77e1fda60bc39e8239ea51d94a9b4cdb889bc Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 30 Nov 2018 12:41:47 -0800 Subject: [PATCH 136/192] Update sdk.version --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 4aa47c3c8..241509e86 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -2.2.100-rtm-009578 +2.2.100 From c09ff342bcb4b5fa404f607ec3234bfe2eaa4cf3 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Fri, 7 Dec 2018 12:11:02 -0800 Subject: [PATCH 137/192] Fix some site extension sdk bugs (#892) --- .../build/Internal.AspNetCore.SiteExtension.Sdk.targets | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets index b1cc2f2d4..628d1b2eb 100644 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets +++ b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets @@ -23,7 +23,6 @@ - @@ -32,7 +31,7 @@ - + @@ -54,7 +53,7 @@ - + @@ -74,8 +73,9 @@ - + <_RuntimeStoreFiles Include="$(_RuntimeStoreOutput)\%(HostingStartupRuntimeStoreTargets.Runtime)\**\*.dll" /> + From e746b2b3c66fc02cd1a400d8a9d8307186ed6bce Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Tue, 11 Dec 2018 15:52:57 -0800 Subject: [PATCH 138/192] ENV to keep existing global.json (#899) * ENV to keep existing global.json --- files/KoreBuild/scripts/KoreBuild.psm1 | 2 +- files/KoreBuild/scripts/invoke-repository-build.sh | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index a15faffc3..f10b52db5 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -390,7 +390,7 @@ function Invoke-KoreBuildCommand( $sdkVersion = __get_dotnet_sdk_version $korebuildVersion = Get-KoreBuildVersion - if ($sdkVersion -ne 'latest') { + if ($sdkVersion -ne 'latest' -and $env:KOREBUILD_KEEPGLOBALJSON -ne '1') { @" { `"sdk`": { diff --git a/files/KoreBuild/scripts/invoke-repository-build.sh b/files/KoreBuild/scripts/invoke-repository-build.sh index d1bac5560..75c15f4d4 100755 --- a/files/KoreBuild/scripts/invoke-repository-build.sh +++ b/files/KoreBuild/scripts/invoke-repository-build.sh @@ -60,7 +60,7 @@ __verbose "Building $repo_path" sdk_version="$(__get_dotnet_sdk_version)" korebuild_version="$(__get_korebuild_version)" -if [ "$sdk_version" != 'latest' ]; then +if [ "$sdk_version" != 'latest' ] && [ "${KOREBUILD_KEEPGLOBALJSON:-}" != '1' ]; then echo "{ \"sdk\": { \"version\": \"${sdk_version}\" From 0872134136bf3d181e3ca3fa700b7ff392c055b3 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Fri, 14 Dec 2018 11:12:39 -0800 Subject: [PATCH 139/192] Update SignTool to 1.0.0-beta.18614.1 (#902) --- build/dependencies.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index e660bb6eb..40b774474 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,8 +3,8 @@ 1.5.1 0.3.0 2.0.0 - 1.0.0-beta.18603.2 - 1.0.0-beta.18603.2 + 1.0.0-beta.18614.1 + 1.0.0-beta.18614.1 15.9.0 0.10.0-beta6 4.7.99 From afd496cf364425795024e88b6581b7b443294b90 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Wed, 19 Dec 2018 16:41:13 -0800 Subject: [PATCH 140/192] Remove SiteExtension Sdk (#904) --- BuildTools.sln | 7 -- ...ternal.AspNetCore.SiteExtension.Sdk.csproj | 32 ------- ...ternal.AspNetCore.SiteExtension.Sdk.nuspec | 18 ---- .../TrimDeps.cs | 60 ------------- src/Internal.AspNetCore.SiteExtension.Sdk/_._ | 0 ...nternal.AspNetCore.SiteExtension.Sdk.props | 13 --- ...ernal.AspNetCore.SiteExtension.Sdk.targets | 84 ------------------- .../HostingStartup/HostingStartup.csproj | 13 --- .../content/HostingStartup/Program.cs | 7 -- 9 files changed, 234 deletions(-) delete mode 100644 src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj delete mode 100644 src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec delete mode 100644 src/Internal.AspNetCore.SiteExtension.Sdk/TrimDeps.cs delete mode 100644 src/Internal.AspNetCore.SiteExtension.Sdk/_._ delete mode 100644 src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props delete mode 100644 src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets delete mode 100644 src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/HostingStartup.csproj delete mode 100644 src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/Program.cs diff --git a/BuildTools.sln b/BuildTools.sln index bf593df44..573e4b696 100644 --- a/BuildTools.sln +++ b/BuildTools.sln @@ -88,8 +88,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KoreBuild.Console", "tools\ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApiCheckForwardDestination", "test\ApiCheckForwardDestination\ApiCheckForwardDestination.csproj", "{605F0478-A9D2-4A8A-BB38-9D5DC132FBB5}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Internal.AspNetCore.SiteExtension.Sdk", "src\Internal.AspNetCore.SiteExtension.Sdk\Internal.AspNetCore.SiteExtension.Sdk.csproj", "{418F99A5-5EC4-4895-B8EB-7F8BBA241DB2}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetPackageVerifier.Tests", "test\NuGetPackageVerifier.Tests\NuGetPackageVerifier.Tests.csproj", "{439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}" EndProject Global @@ -158,10 +156,6 @@ Global {605F0478-A9D2-4A8A-BB38-9D5DC132FBB5}.Debug|Any CPU.Build.0 = Debug|Any CPU {605F0478-A9D2-4A8A-BB38-9D5DC132FBB5}.Release|Any CPU.ActiveCfg = Release|Any CPU {605F0478-A9D2-4A8A-BB38-9D5DC132FBB5}.Release|Any CPU.Build.0 = Release|Any CPU - {418F99A5-5EC4-4895-B8EB-7F8BBA241DB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {418F99A5-5EC4-4895-B8EB-7F8BBA241DB2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {418F99A5-5EC4-4895-B8EB-7F8BBA241DB2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {418F99A5-5EC4-4895-B8EB-7F8BBA241DB2}.Release|Any CPU.Build.0 = Release|Any CPU {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Debug|Any CPU.Build.0 = Debug|Any CPU {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -187,7 +181,6 @@ Global {A3A81E93-0157-406F-A43C-C163F7F781A9} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} {02F548A6-B0E9-4F09-BC03-812FC3C8F0D2} = {B16B5072-3A0B-4527-8AB5-1C73A51684F7} {605F0478-A9D2-4A8A-BB38-9D5DC132FBB5} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} - {418F99A5-5EC4-4895-B8EB-7F8BBA241DB2} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76} {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj deleted file mode 100644 index 4170683c2..000000000 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.csproj +++ /dev/null @@ -1,32 +0,0 @@ - - - - Internal.AspNetCore.SiteExtension.Sdk - netcoreapp3.0;net46 - false - Build targets and extensions to Microsoft.NET.Sdk. This package is intended for Microsoft use only. - $(MSBuildThisFileDirectory)$(MSBuildProjectName).nuspec - false - false - - - - - - - - - - - - - $(NuspecProperties);id=$(PackageId) - $(NuspecProperties);config=$(Configuration) - $(NuspecProperties);version=$(PackageVersion) - $(NuspecProperties);description=$(Description) - $(NuspecProperties);copyright=$(Copyright) - - - - - diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec b/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec deleted file mode 100644 index dff041805..000000000 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/Internal.AspNetCore.SiteExtension.Sdk.nuspec +++ /dev/null @@ -1,18 +0,0 @@ - - - - $id$ - $version$ - Microsoft - false - $description$ - $copyright$ - - - - - - - - - diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/TrimDeps.cs b/src/Internal.AspNetCore.SiteExtension.Sdk/TrimDeps.cs deleted file mode 100644 index f19f610bd..000000000 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/TrimDeps.cs +++ /dev/null @@ -1,60 +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 System.Linq; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace RepoTasks -{ - public class TrimDeps : Task - { - [Required] - public ITaskItem[] DepsFiles { get; set; } - - public override bool Execute() - { - foreach (var depsFile in DepsFiles) - { - ChangeEntryPointLibraryName(depsFile.ItemSpec); - } - - // Parse input - return true; - } - - - private void ChangeEntryPointLibraryName(string depsFile) - { - JToken deps; - using (var file = File.OpenText(depsFile)) - using (JsonTextReader reader = new JsonTextReader(file)) - { - deps = JObject.ReadFrom(reader); - } - - foreach (JProperty target in deps["targets"]) - { - var targetLibrary = target.Value.Children().FirstOrDefault(); - if (targetLibrary == null) - { - continue; - } - - targetLibrary.Remove(); - } - - var library = deps["libraries"].Children().First(); - library.Remove(); - - using (var file = File.CreateText(depsFile)) - using (var writer = new JsonTextWriter(file) { Formatting = Formatting.Indented }) - { - deps.WriteTo(writer); - } - } - } -} diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/_._ b/src/Internal.AspNetCore.SiteExtension.Sdk/_._ deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props deleted file mode 100644 index 7d7ccfee1..000000000 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.props +++ /dev/null @@ -1,13 +0,0 @@ - - - - netcoreapp3.0 - net46 - $(MSBuildThisFileDirectory)..\tools\$(TaskFolder)\Internal.AspNetCore.SiteExtension.Sdk.dll - - - - diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets b/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets deleted file mode 100644 index 628d1b2eb..000000000 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/build/Internal.AspNetCore.SiteExtension.Sdk.targets +++ /dev/null @@ -1,84 +0,0 @@ - - - - - - - - <_TemplatesDirectory>$(MSBuildThisFileDirectory)..\content\ - <_DepsOutputDirectory>$(RepositoryRoot)\obj\lse\ - <_WorkingDirectory>$(_DepsOutputDirectory)\depswork - <_BasePackagePath>content\additionaldeps\ - <_RuntimeStoreManifestFile>$(_DepsOutputDirectory)\rs.csproj - <_RuntimeStoreOutput>$(_DepsOutputDirectory)\rs\ - - - - 99.9 - netcoreapp3.0 - - - - - - - - ]]> - - - - - - - - - - <_TemplateFiles Include="$(MSBuildThisFileDirectory)..\content\HostingStartup\**\*" /> - <_HostingStartupPackageReference - Include="%(HostingStartupPackageReference.Identity)" - Source="%(HostingStartupPackageReference.Source)" - Version="%(HostingStartupPackageReference.Version)" - WorkingDirectory="$(_DepsOutputDirectory)%(HostingStartupPackageReference.Identity)" - Project="$(_DepsOutputDirectory)%(HostingStartupPackageReference.Identity)\HostingStartup.csproj" - DepsFile="$(_DepsOutputDirectory)%(HostingStartupPackageReference.Identity)\p\HostingStartup.deps.json" - TrimmedDepsFile="$(_DepsOutputDirectory)%(HostingStartupPackageReference.Identity)\%(HostingStartupPackageReference.Identity).deps.json" - PackagePath="$(_BasePackagePath)%(HostingStartupPackageReference.Identity)\shared\Microsoft.AspNetCore.App\$(MicrosoftAspNetCoreAppPackageVersion)\" - /> - - - - - - - - - - - - - - - - - - - - - - <_RuntimeStoreFiles Include="$(_RuntimeStoreOutput)\%(HostingStartupRuntimeStoreTargets.Runtime)\**\*.dll" /> - - - - - - - - diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/HostingStartup.csproj b/src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/HostingStartup.csproj deleted file mode 100644 index be2bed7fc..000000000 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/HostingStartup.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - netcoreapp3.0 - Exe - - - - - - - - diff --git a/src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/Program.cs b/src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/Program.cs deleted file mode 100644 index 8cd3c0026..000000000 --- a/src/Internal.AspNetCore.SiteExtension.Sdk/content/HostingStartup/Program.cs +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -public class Program -{ - public static void Main() { } -} \ No newline at end of file From 96f63f56c41cb44d22ff06d2731e938539913c73 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 21 Dec 2018 15:48:35 -0800 Subject: [PATCH 141/192] Add item groups on sign task for setting cert names by PKT or file extension --- modules/KoreBuild.Tasks/CodeSign.targets | 2 ++ 1 file changed, 2 insertions(+) diff --git a/modules/KoreBuild.Tasks/CodeSign.targets b/modules/KoreBuild.Tasks/CodeSign.targets index c3cdc07f3..718ebec3b 100644 --- a/modules/KoreBuild.Tasks/CodeSign.targets +++ b/modules/KoreBuild.Tasks/CodeSign.targets @@ -53,6 +53,8 @@ TestSign="$(SignToolTestSign)" ItemsToSign="@(_ItemsToSign)" FileSignInfo="@(_FileSignInfo)" + StrongNameSignInfo="@(AssemblyToSign)" + FileExtensionSignInfo="@(FileExtensionsToSign)" TempDir="$(IntermediateDir)" LogDir="$(LogOutputDir)" MSBuildPath="$(MSBuildx86Path)" From da2a26f645cb3cda1e35a50e97d0cdc731eb0866 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 9 Jan 2019 10:58:09 -0800 Subject: [PATCH 142/192] Update SDK to 2.2.102 and remove --no-cdn on install --- files/KoreBuild/config/sdk.version | 2 +- files/KoreBuild/scripts/KoreBuild.psm1 | 3 +-- files/KoreBuild/scripts/get-dotnet.sh | 1 - 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 241509e86..0fa1bdc8c 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -2.2.100 +2.2.102 diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index a15faffc3..483d4e9df 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -216,8 +216,7 @@ function Install-Tools( -InstallDir $installDir ` -AzureFeed $script:config.'dotnet.feed.cdn' ` -UncachedFeed $script:config.'dotnet.feed.uncached' ` - -FeedCredential $script:config.'dotnet.feed.credential' ` - -NoCdn + -FeedCredential $script:config.'dotnet.feed.credential' } else { Write-Host -ForegroundColor DarkGray ".NET Core SDK $version is already installed. Skipping installation." diff --git a/files/KoreBuild/scripts/get-dotnet.sh b/files/KoreBuild/scripts/get-dotnet.sh index 50bc9d7e1..1d9fc26c0 100755 --- a/files/KoreBuild/scripts/get-dotnet.sh +++ b/files/KoreBuild/scripts/get-dotnet.sh @@ -49,7 +49,6 @@ if [ ! -f "$install_dir/sdk/$version/dotnet.dll" ]; then --install-dir "$install_dir" \ --architecture x64 \ --version "$version" \ - --no-cdn \ $verbose_flag else echo -e "${GRAY}.NET Core SDK $version is already installed. Skipping installation.${RESET}" From f4ebd797fd15484869312b139fdd7e3a115d23bb Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 10 Jan 2019 01:03:57 -0800 Subject: [PATCH 143/192] Support RestoreInParallel metadata on ProjectToBuild --- files/KoreBuild/modules/projectbuild/module.targets | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/files/KoreBuild/modules/projectbuild/module.targets b/files/KoreBuild/modules/projectbuild/module.targets index 01ccb5fd2..c612b989e 100644 --- a/files/KoreBuild/modules/projectbuild/module.targets +++ b/files/KoreBuild/modules/projectbuild/module.targets @@ -4,6 +4,12 @@ FYI: targets, properties, and items that begin with an underscore are meant to b --> + + + $(BuildInParallel) + + + @@ -83,7 +89,7 @@ Executes /t:{Target} on all projects Targets="Restore" Properties="$(BuildProperties);__BuildTarget=Restore" RemoveProperties="$(_BuildPropertiesToRemove)" - BuildInParallel="$(BuildInParallel)" /> + BuildInParallel="%(_ProjectToRestoreDirectly.RestoreInParallel)" /> From 856f28c01866b98f2f2019d955c83bbb408c3189 Mon Sep 17 00:00:00 2001 From: Patrick Westerhoff Date: Fri, 11 Jan 2019 16:22:10 +0100 Subject: [PATCH 144/192] Fix parsing of vswhere output (#921) The output from vswhere may be stored as a list of lines, so the JSON parsing will fail since it operates on each line separately. By piping in `Out-String`, the result will be forced into a single string which will then be processed as a whole. --- files/KoreBuild/scripts/KoreBuild.psm1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index c96a67f57..93bfa8761 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -488,7 +488,7 @@ function Get-MSBuildPath() { Write-Verbose "vswhere = $vswherePath $vswhereArgs" - $installations = & $vswherePath @vswhereArgs | ConvertFrom-Json + $installations = & $vswherePath @vswhereArgs | Out-String | ConvertFrom-Json $latest = $null if ($installations) { From 22916e09d533fcbdf5d0c51f8a9140e8c36e7bad Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Wed, 16 Jan 2019 15:04:45 -0800 Subject: [PATCH 145/192] Update SignTool to 1.0.0-beta.18614.1 (#922) --- build/dependencies.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 5308dbc4e..4611d75f7 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,8 +3,8 @@ 1.5.1 0.3.0 2.0.0 - 1.0.0-beta.18603.2 - 1.0.0-beta.18603.2 + 1.0.0-beta.18614.1 + 1.0.0-beta.18614.1 15.9.0 0.10.0-beta6 4.7.99 From c75385bee22bcde37ecd23ef35b367e80b668468 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Thu, 17 Jan 2019 09:03:04 -0800 Subject: [PATCH 146/192] Update sign tool to 1.0.0-beta.19057.6 (#924) --- build/dependencies.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 40b774474..ce46a47f2 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,8 +3,8 @@ 1.5.1 0.3.0 2.0.0 - 1.0.0-beta.18614.1 - 1.0.0-beta.18614.1 + 1.0.0-beta.19057.6 + 1.0.0-beta.19057.6 15.9.0 0.10.0-beta6 4.7.99 From 66f8343ddf482908dd82005dd2154c9e2776e2a1 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Thu, 17 Jan 2019 09:29:51 -0800 Subject: [PATCH 147/192] Update sign tool to 1.0.0-beta.19057.6 (#924) (#925) --- build/dependencies.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 4611d75f7..9725665d6 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,8 +3,8 @@ 1.5.1 0.3.0 2.0.0 - 1.0.0-beta.18614.1 - 1.0.0-beta.18614.1 + 1.0.0-beta.19057.6 + 1.0.0-beta.19057.6 15.9.0 0.10.0-beta6 4.7.99 From bddfbe9c6512fd9235665b04f39679ff80371a1b Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 18 Jan 2019 10:36:43 -0800 Subject: [PATCH 148/192] Change indentation on generated global.json --- files/KoreBuild/scripts/KoreBuild.psm1 | 12 ++++++------ files/KoreBuild/scripts/invoke-repository-build.sh | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index 33161c349..330279e16 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -392,12 +392,12 @@ function Invoke-KoreBuildCommand( if ($sdkVersion -ne 'latest' -and $env:KOREBUILD_KEEPGLOBALJSON -ne '1') { @" { - `"sdk`": { - `"version`": `"$sdkVersion`" - }, - `"msbuild-sdks`": { - `"Internal.AspNetCore.Sdk`": `"$korebuildVersion`" - } + `"sdk`": { + `"version`": `"$sdkVersion`" + }, + `"msbuild-sdks`": { + `"Internal.AspNetCore.Sdk`": `"$korebuildVersion`" + } } "@ | Out-File (Join-Path $global:KoreBuildSettings.RepoPath 'global.json') -Encoding ascii } diff --git a/files/KoreBuild/scripts/invoke-repository-build.sh b/files/KoreBuild/scripts/invoke-repository-build.sh index 75c15f4d4..672066a45 100755 --- a/files/KoreBuild/scripts/invoke-repository-build.sh +++ b/files/KoreBuild/scripts/invoke-repository-build.sh @@ -62,12 +62,12 @@ sdk_version="$(__get_dotnet_sdk_version)" korebuild_version="$(__get_korebuild_version)" if [ "$sdk_version" != 'latest' ] && [ "${KOREBUILD_KEEPGLOBALJSON:-}" != '1' ]; then echo "{ - \"sdk\": { - \"version\": \"${sdk_version}\" - }, - \"msbuild-sdks\": { - \"Internal.AspNetCore.Sdk\": \"${korebuild_version}\" - } + \"sdk\": { + \"version\": \"${sdk_version}\" + }, + \"msbuild-sdks\": { + \"Internal.AspNetCore.Sdk\": \"${korebuild_version}\" + } }" > "$repo_path/global.json" else __verbose "Skipping global.json generation because the \$sdk_version = $sdk_version" From 9f3d2965337977241498d65bd20e92be41f947b6 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 18 Jan 2019 14:24:18 -0800 Subject: [PATCH 149/192] Don't code-sign .symbols.nupkg files by default and allow signcheck to run on multiple directories (#927) --- files/KoreBuild/Project.Inspection.targets | 8 +++--- modules/KoreBuild.Tasks/CodeSign.props | 29 ++++++++++++++++++++++ modules/KoreBuild.Tasks/CodeSign.targets | 29 +++------------------- modules/KoreBuild.Tasks/module.props | 1 + 4 files changed, 37 insertions(+), 30 deletions(-) create mode 100644 modules/KoreBuild.Tasks/CodeSign.props diff --git a/files/KoreBuild/Project.Inspection.targets b/files/KoreBuild/Project.Inspection.targets index 9126b77b1..2b39c7bd7 100644 --- a/files/KoreBuild/Project.Inspection.targets +++ b/files/KoreBuild/Project.Inspection.targets @@ -10,7 +10,7 @@ $(PackageVersion.Substring(0, $(PackageVersion.IndexOf('+')))) $(PackageOutputPath)$(PackageId).$(NormalizedPackageVersion).nupkg $(PackageOutputPath)$(PackageId).$(NormalizedPackageVersion).symbols.nupkg - + <_ReferencesInternalAspNetCoreSdk Condition="'$(_ReferencesInternalAspNetCoreSdk)' == ''">@(PackageReference->AnyHaveMetadataValue('Identity', 'Internal.AspNetCore.Sdk')) @@ -61,12 +61,12 @@ $(RepositoryUrl) $(PackageArtifactCategory) $(PackageSigningCertName) - true + true false true - + @@ -79,7 +79,7 @@ $(FullPackageOutputPath) - + true $(SymbolsPackageOutputPath) diff --git a/modules/KoreBuild.Tasks/CodeSign.props b/modules/KoreBuild.Tasks/CodeSign.props new file mode 100644 index 000000000..9ed3e61b3 --- /dev/null +++ b/modules/KoreBuild.Tasks/CodeSign.props @@ -0,0 +1,29 @@ + + + + + true + + + $(RepositoryRoot)build\signcheck.exclusions.txt + + $(ArtifactsDir) + + + $(RepositoryRoot) + + + true + false + + + false + true + + + + + + + + diff --git a/modules/KoreBuild.Tasks/CodeSign.targets b/modules/KoreBuild.Tasks/CodeSign.targets index 718ebec3b..3cd853c25 100644 --- a/modules/KoreBuild.Tasks/CodeSign.targets +++ b/modules/KoreBuild.Tasks/CodeSign.targets @@ -1,26 +1,4 @@ - - - - true - - - $(RepositoryRoot)build\signcheck.exclusions.txt - - $(ArtifactsDir) - - - $(RepositoryRoot) - - - true - false - - - false - true - - @@ -52,7 +30,7 @@ DryRun="$(SignToolDryRun)" TestSign="$(SignToolTestSign)" ItemsToSign="@(_ItemsToSign)" - FileSignInfo="@(_FileSignInfo)" + FileSignInfo="@(_FileSignInfo);@(FileNamesToSign)" StrongNameSignInfo="@(AssemblyToSign)" FileExtensionSignInfo="@(FileExtensionsToSign)" TempDir="$(IntermediateDir)" @@ -73,16 +51,15 @@ - - + - + diff --git a/modules/KoreBuild.Tasks/module.props b/modules/KoreBuild.Tasks/module.props index 87d34041c..65848d3fb 100644 --- a/modules/KoreBuild.Tasks/module.props +++ b/modules/KoreBuild.Tasks/module.props @@ -1,5 +1,6 @@ + $(MSBuildThisFileDirectory)Internal.AspNetCore.KoreBuild.Tasks.dll From 27bad0e40ebbb1b8f1d4b7143edc600974fbe3db Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 18 Jan 2019 14:28:49 -0800 Subject: [PATCH 150/192] Revert to signtools 1.0.0-beta.18614.1 --- build/dependencies.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index fd2f0287a..f78cb4275 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,8 +3,8 @@ 1.5.1 0.3.0 2.0.0 - 1.0.0-beta.19057.6 - 1.0.0-beta.19057.6 + 1.0.0-beta.18614.1 + 1.0.0-beta.18614.1 1.0.0-alpha-004 15.9.0 0.10.0-beta6 From dc060235e4056a2a5ec0141fa89da9e490544268 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 18 Jan 2019 16:06:37 -0800 Subject: [PATCH 151/192] Update signtools to 1.0.0-beta.19067.6 (#928) --- build/dependencies.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index f78cb4275..082bbb8b1 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,8 +3,8 @@ 1.5.1 0.3.0 2.0.0 - 1.0.0-beta.18614.1 - 1.0.0-beta.18614.1 + 1.0.0-beta.19067.6 + 1.0.0-beta.19067.6 1.0.0-alpha-004 15.9.0 0.10.0-beta6 From 3b24877488f6bbff779aa3bd66fcffb4a6c04daf Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 30 Jan 2019 22:40:52 -0800 Subject: [PATCH 152/192] Update signtool to 1.0.0-beta.19080.9 and netfx ref assemblies to 1.0.0-alpha-5 --- build/dependencies.props | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 295aff037..d04b326e5 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,9 +3,9 @@ 1.5.1 0.3.0 2.0.0 - 1.0.0-beta.19078.3 - 1.0.0-beta.19078.3 - 1.0.0-alpha-004 + 1.0.0-beta.19080.9 + 1.0.0-beta.19080.9 + 1.0.0-alpha-5 15.9.0 0.10.0-beta6 4.7.99 From d311c7e5300aed235a1f902a53dd9be02e5ac861 Mon Sep 17 00:00:00 2001 From: BrennanConroy Date: Tue, 5 Feb 2019 11:00:22 -0800 Subject: [PATCH 153/192] Pass through AdditionalProperties for _ProjectToTestDirectly (#933) --- files/KoreBuild/modules/vstest/module.targets | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/KoreBuild/modules/vstest/module.targets b/files/KoreBuild/modules/vstest/module.targets index 613bf1728..2e78267bb 100644 --- a/files/KoreBuild/modules/vstest/module.targets +++ b/files/KoreBuild/modules/vstest/module.targets @@ -75,10 +75,10 @@ Runs the VSTest on all projects in the ProjectToBuild itemgroup. - <_TestGroups Include="@(_ProjectToTestDirectly)"> + <_TestGroups Include="%(_ProjectToTestDirectly.Identity)"> Test true - $(BuildProperties) + %(_ProjectToTestDirectly.AdditionalProperties);$(BuildProperties) From e4e248edfc6eb9c30d2897a65f69f00c27bc66c7 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 13 Feb 2019 15:52:35 -0800 Subject: [PATCH 154/192] Remove obsolete targets and tasks for source link and fetching git info (#934) The recommended replacement is packages from https://github.com/dotnet/sourcelink and the targets embedded in MSBuild for working with source control information. --- Directory.Build.props | 3 - build/repo.targets | 23 +-- build/tasks/RepoTasks.csproj | 1 - files/KoreBuild/KoreBuild.Common.props | 6 - .../BuildTools.Tasks/BuildTools.Tasks.props | 4 - modules/BuildTools.Tasks/CreateSourceLink.cs | 122 ----------- modules/BuildTools.Tasks/GetGitBranch.cs | 67 ------ modules/BuildTools.Tasks/GetGitCommitHash.cs | 60 ------ modules/BuildTools.Tasks/GetGitCommitInfo.cs | 80 -------- .../BuildTools.Tasks/Utilities/GitRepoInfo.cs | 193 ------------------ modules/BuildTools.Tasks/module.targets | 35 +--- src/Internal.AspNetCore.Sdk/build/Git.targets | 148 -------------- .../build/Internal.AspNetCore.Sdk.targets | 1 - .../CreateSourceLinkTest.cs | 153 -------------- .../GetGitCommitInfoTests.cs | 119 ----------- .../Resources/SimpleGitRepo.zip | Bin 16116 -> 0 bytes .../Resources/SparseCheckout.zip | Bin 11187 -> 0 bytes .../Resources/SubmoduleRepo.zip | Bin 1703093 -> 0 bytes .../Resources/WorktreeRepo.zip | Bin 20306 -> 0 bytes 19 files changed, 3 insertions(+), 1012 deletions(-) delete mode 100644 modules/BuildTools.Tasks/CreateSourceLink.cs delete mode 100644 modules/BuildTools.Tasks/GetGitBranch.cs delete mode 100644 modules/BuildTools.Tasks/GetGitCommitHash.cs delete mode 100644 modules/BuildTools.Tasks/GetGitCommitInfo.cs delete mode 100644 modules/BuildTools.Tasks/Utilities/GitRepoInfo.cs delete mode 100644 src/Internal.AspNetCore.Sdk/build/Git.targets delete mode 100644 test/BuildTools.Tasks.Tests/CreateSourceLinkTest.cs delete mode 100644 test/BuildTools.Tasks.Tests/GetGitCommitInfoTests.cs delete mode 100644 test/BuildTools.Tasks.Tests/Resources/SimpleGitRepo.zip delete mode 100644 test/BuildTools.Tasks.Tests/Resources/SparseCheckout.zip delete mode 100644 test/BuildTools.Tasks.Tests/Resources/SubmoduleRepo.zip delete mode 100644 test/BuildTools.Tasks.Tests/Resources/WorktreeRepo.zip diff --git a/Directory.Build.props b/Directory.Build.props index 22993fd1b..e8b021768 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -4,9 +4,6 @@ - false - false - false false $(NoWarn);NU5105 false diff --git a/build/repo.targets b/build/repo.targets index 1b58ae44f..6e1c503e1 100644 --- a/build/repo.targets +++ b/build/repo.targets @@ -32,19 +32,6 @@ - - - - - - - - $(BuildProperties);RepositoryCommit=$(RepositoryCommit) - $(BuildProperties);RepositoryBranch=$(RepositoryBranch) - - - - + - - - - <_ToolsProjects Include="$(RepositoryRoot)tools\KoreBuild.Console\KoreBuild.Console.csproj"> @@ -80,7 +61,7 @@ - + diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index 95cf0c2ce..e2242175f 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -13,7 +13,6 @@ - diff --git a/files/KoreBuild/KoreBuild.Common.props b/files/KoreBuild/KoreBuild.Common.props index 10729698c..ca89a5055 100644 --- a/files/KoreBuild/KoreBuild.Common.props +++ b/files/KoreBuild/KoreBuild.Common.props @@ -69,10 +69,6 @@ Default layout and configuration. This environment variable is automatically set by VSTS. --> $(BUILD_BUILDNUMBER) - $(BUILD_SOURCEBRANCH) - $(RepositoryBranch.Substring(11)) - $(RepositoryBranch.Substring(10)) - $(BUILD_SOURCEVERSION) @@ -93,8 +89,6 @@ Default layout and configuration. $(BuildProperties);BuildNumber=$(BuildNumber) - $(BuildProperties);RepositoryCommit=$(RepositoryCommit) - $(BuildProperties);RepositoryBranch=$(RepositoryBranch) $(BuildProperties);GenerateFullPaths=true diff --git a/modules/BuildTools.Tasks/BuildTools.Tasks.props b/modules/BuildTools.Tasks/BuildTools.Tasks.props index e32478c8d..bddb61326 100644 --- a/modules/BuildTools.Tasks/BuildTools.Tasks.props +++ b/modules/BuildTools.Tasks/BuildTools.Tasks.props @@ -3,16 +3,12 @@ - - - - diff --git a/modules/BuildTools.Tasks/CreateSourceLink.cs b/modules/BuildTools.Tasks/CreateSourceLink.cs deleted file mode 100644 index ed6f42878..000000000 --- a/modules/BuildTools.Tasks/CreateSourceLink.cs +++ /dev/null @@ -1,122 +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.IO; -using System.Text; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace Microsoft.AspNetCore.BuildTools -{ - /// - /// Generates a source link JSON file. - /// - /// - /// - /// -#if SDK - public class Sdk_CreateSourceLink : Task -#elif BuildTools - public class CreateSourceLink : Task -#else -#error This must be built either for an SDK or for BuildTools -#endif - { - [Required] - public string SourceLinkRoot { get; set; } - - [Required] - public string OriginUrl { get; set; } - - [Required] - public string DestinationFile { get; set; } - - [Required] - public string Commit { get; set; } - - [Output] - public string SourceLinkFile { get; set; } - - public override bool Execute() - { - var lastCh = SourceLinkRoot[SourceLinkRoot.Length - 1]; - if (lastCh != '/' && lastCh != '\\') - { - Log.LogError("SourceLinkRoot must end with a slash."); - return false; - } - - SourceLinkRoot += '*'; - - var codeSource = ConvertUrl(); - var mappings = new List - { - new Mapping { LocalPath = SourceLinkRoot, Url = codeSource }, - }; - - GenerateSourceLink(DestinationFile, mappings); - SourceLinkFile = DestinationFile; - return true; - } - - private static void GenerateSourceLink(string filePath, List mappings) - { - var data = new StringBuilder(); - data.Append("{\"documents\":{"); - - // not bullet-proof, but should be good enough for escaping paths - string JsonEscape(string str) - => str.Replace(@"\", @"\\").Replace("\"", "\\\""); - - var first = true; - foreach (var mapping in mappings) - { - if (first) - { - first = false; - } - else - { - data.Append(","); - } - - data - .Append('"') - .Append(JsonEscape(mapping.LocalPath)) - .Append("\":\"") - .Append(JsonEscape(mapping.Url)) - .Append('"'); - } - - data.Append("}}"); - - File.WriteAllText(filePath, data.ToString()); - } - - private string ConvertUrl() - { - if (!OriginUrl.Contains("github.com")) - { - throw new ArgumentException("OriginUrl must be for github.com", "OriginUrl"); - } - - var prefix = OriginUrl.StartsWith("git@github.com:") - ? "git@github.com:" - : "https://github.com/"; - - var repoName = OriginUrl.Replace(prefix, ""); - - repoName = repoName.Replace(".git", ""); - - return $"https://raw.githubusercontent.com/{repoName}/{Commit}/*"; - } - - private struct Mapping - { - public string LocalPath; - public string Url; - } - } -} diff --git a/modules/BuildTools.Tasks/GetGitBranch.cs b/modules/BuildTools.Tasks/GetGitBranch.cs deleted file mode 100644 index d58b22181..000000000 --- a/modules/BuildTools.Tasks/GetGitBranch.cs +++ /dev/null @@ -1,67 +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 Microsoft.AspNetCore.BuildTools.Utilities; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace Microsoft.AspNetCore.BuildTools -{ -#if SDK - public class Sdk_GetGitBranch : Task -#elif BuildTools - public class GetGitBranch : Task -#else -#error This must be built either for an SDK or for BuildTools -#endif - { - /// - /// A folder inside the git project. Does not need to be the top folder. - /// This task will search upwards for the .git folder. - /// - [Required] - public string WorkingDirectory { get; set; } - - /// - /// The name of the branch HEAD is pointed to. Can be null or empty - /// for repositories in detached HEAD mode. - /// - [Output] - public string Branch { get; set; } - - public override bool Execute() - { - try - { - var repoInfo = GitRepoInfo.Load(WorkingDirectory); - Log.LogMessage(MessageImportance.Low, "Resolved git repo info to: RootPath = {0}, GitDir = {1}, HEAD = {2}, Branch = {3}, Hash = {4}", - repoInfo.RepositoryRootPath, - repoInfo.GitDir, - repoInfo.HeadFile, - repoInfo.Branch, - repoInfo.CommitHash); - - if (repoInfo.DetachedHeadMode) - { - Log.LogError("The current git repo is in detached HEAD mode. It is not possible to determine the branch name."); - return false; - } - - if (string.IsNullOrEmpty(repoInfo.Branch)) - { - Log.LogError("Could not determine the branch name of the current git repo in '{0}'.", repoInfo.RepositoryRootPath); - return false; - } - - Branch = repoInfo.Branch; - return true; - } - catch (Exception ex) - { - Log.LogError(ex.Message); - return false; - } - } - } -} diff --git a/modules/BuildTools.Tasks/GetGitCommitHash.cs b/modules/BuildTools.Tasks/GetGitCommitHash.cs deleted file mode 100644 index 720cb3cb7..000000000 --- a/modules/BuildTools.Tasks/GetGitCommitHash.cs +++ /dev/null @@ -1,60 +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 Microsoft.AspNetCore.BuildTools.Utilities; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace Microsoft.AspNetCore.BuildTools -{ -#if SDK - public class Sdk_GetGitCommitHash : Task -#elif BuildTools - public class GetGitCommitHash : Task -#else -#error This must be built either for an SDK or for BuildTools -#endif - { - /// - /// A folder inside the git project. Does not need to be the top folder. - /// This task will search upwards for the .git folder. - /// - [Required] - public string WorkingDirectory { get; set; } - - /// - /// The full commit SHA of the current commit referenced by HEAD. - /// - [Output] - public string CommitHash { get; set; } - - public override bool Execute() - { - try - { - var repoInfo = GitRepoInfo.Load(WorkingDirectory); - Log.LogMessage(MessageImportance.Low, "Resolved git repo info to: RootPath = {0}, GitDir = {1}, HEAD = {2}, Branch = {3}, Hash = {4}", - repoInfo.RepositoryRootPath, - repoInfo.GitDir, - repoInfo.HeadFile, - repoInfo.Branch, - repoInfo.CommitHash); - - if (string.IsNullOrEmpty(repoInfo.CommitHash)) - { - Log.LogError("Could not determine the commit hash of the current git repo in '{0}'.", repoInfo.RepositoryRootPath); - return false; - } - - CommitHash = repoInfo.CommitHash; - return true; - } - catch (Exception ex) - { - Log.LogError(ex.Message); - return false; - } - } - } -} diff --git a/modules/BuildTools.Tasks/GetGitCommitInfo.cs b/modules/BuildTools.Tasks/GetGitCommitInfo.cs deleted file mode 100644 index 6cd305083..000000000 --- a/modules/BuildTools.Tasks/GetGitCommitInfo.cs +++ /dev/null @@ -1,80 +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 Microsoft.AspNetCore.BuildTools.Utilities; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace Microsoft.AspNetCore.BuildTools -{ -#if SDK - public class Sdk_GetGitCommitInfo : Task -#elif BuildTools - public class GetGitCommitInfo : Task -#else -#error This must be built either for an SDK or for BuildTools -#endif - { - /// - /// A folder inside the git project. Does not need to be the top folder. - /// This task will search upwards for the .git folder. - /// - [Required] - public string WorkingDirectory { get; set; } - - /// - /// The name of the branch HEAD is pointed to. Can be null or empty - /// for repositories in detached HEAD mode. - /// - [Output] - public string Branch { get; set; } - - /// - /// The full commit SHA of the current commit referenced by HEAD. - /// - [Output] - public string CommitHash { get; set; } - - /// - /// The folder containing the '.git', not the .git folder itself. - /// - [Output] - public string RepositoryRootPath { get; set; } - - public override bool Execute() - { - try - { - var repoInfo = GitRepoInfo.Load(WorkingDirectory); - Log.LogMessage(MessageImportance.Low, "Resolved git repo info to: RootPath = {0}, GitDir = {1}, HEAD = {2}, Branch = {3}, Hash = {4}", - repoInfo.RepositoryRootPath, - repoInfo.GitDir, - repoInfo.HeadFile, - repoInfo.Branch, - repoInfo.CommitHash); - - if (repoInfo.DetachedHeadMode) - { - Log.LogWarning("The repo in '{0}' appears to be in detached HEAD mode. Unable to determine current git branch.", repoInfo.RepositoryRootPath); - } - - if (string.IsNullOrEmpty(repoInfo.CommitHash)) - { - Log.LogError("Could not determine the commit hash of the current git repo in '{0}'.", repoInfo.RepositoryRootPath); - return false; - } - - Branch = repoInfo.Branch; - CommitHash = repoInfo.CommitHash; - RepositoryRootPath = repoInfo.RepositoryRootPath; - return true; - } - catch (Exception ex) - { - Log.LogError(ex.Message); - return false; - } - } - } -} diff --git a/modules/BuildTools.Tasks/Utilities/GitRepoInfo.cs b/modules/BuildTools.Tasks/Utilities/GitRepoInfo.cs deleted file mode 100644 index 77d1edf35..000000000 --- a/modules/BuildTools.Tasks/Utilities/GitRepoInfo.cs +++ /dev/null @@ -1,193 +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.IO; -using System.Linq; - -namespace Microsoft.AspNetCore.BuildTools.Utilities -{ - internal class GitRepoInfo - { - private const string HeadContentStart = "ref: refs/heads/"; - private const string GitDirRefContentStart = "gitdir:"; - - private const int CommitShaLength = 40; - - /// - /// The name of the branch HEAD is pointed to. Can be null or empty - /// for repositories in detached HEAD mode. - /// - public string Branch { get; set; } - - /// - /// The full commit SHA of the current commit referenced by HEAD. - /// - public string CommitHash { get; private set; } - - /// - /// The root folder of the working directory. Not the .git folder itself. - /// - public string RepositoryRootPath { get; private set; } - - /// - /// The folder containing the .git folder - /// - public string GitDir { get; private set; } - - /// - /// The repo is in detached head mode. - /// - public bool DetachedHeadMode { get; private set; } - - /// - /// Full path to the HEAD file. - /// - public string HeadFile { get; set; } - - /// - /// Find give info for a folder inside the git project. Does not need to be the top folder. - /// This task will search upwards for the .git folder. - /// - public static GitRepoInfo Load(string workingDirectory) - { - var repoRoot = GetRepositoryRoot(workingDirectory); - if (repoRoot == null) - { - throw new DirectoryNotFoundException($"Could not find the git directory for '{workingDirectory}'"); - } - - var info = new GitRepoInfo - { - RepositoryRootPath = FileHelpers.EnsureTrailingSlash(repoRoot.FullName) - }; - - switch (repoRoot.GetFileSystemInfos(".git").FirstOrDefault()) - { - case DirectoryInfo d: - // regular git working directories - info.GitDir = d.FullName; - info.HeadFile = Path.Combine(info.GitDir, "HEAD"); - break; - case FileInfo f: - // submodules and worktrees - var contents = File.ReadAllText(f.FullName); - if (contents.StartsWith(GitDirRefContentStart, StringComparison.OrdinalIgnoreCase)) - { - var gitdirRef = contents.Substring(GitDirRefContentStart.Length).Trim(); - var gitDirRoot = Path.IsPathRooted(gitdirRef) - ? new DirectoryInfo(gitdirRef) - : new DirectoryInfo(Path.Combine(f.Directory.FullName, gitdirRef)); - - info.HeadFile = Path.Combine(gitDirRoot.FullName, "HEAD"); - - var commonDir = gitDirRoot.GetFiles("commondir").FirstOrDefault(); - if (commonDir != null) - { - // happens in worktrees - var commonDirRef = File.ReadAllText(commonDir.FullName).Trim(); - info.GitDir = Path.IsPathRooted(commonDirRef) - ? commonDirRef - : Path.Combine(gitDirRoot.FullName, commonDirRef); - } - else - { - // happens with submodules - info.GitDir = gitDirRoot.FullName; - } - } - else - { - throw new DirectoryNotFoundException($"Unable to determine the location of the .git directory. Unrecognized file format: {f.FullName}"); - } - break; - case null: - default: - throw new ArgumentOutOfRangeException("Unrecognized implementation of FileSystemInfo"); - } - - if (!File.Exists(info.HeadFile)) - { - throw new FileNotFoundException("Unable to determine the status of the git repo. No HEAD file found."); - } - - var content = File.ReadAllText(info.HeadFile).Trim(); - if (content.StartsWith(HeadContentStart, StringComparison.OrdinalIgnoreCase)) - { - info.Branch = content.Substring(HeadContentStart.Length); - info.CommitHash = ResolveHashFromBranch(info.GitDir, info.Branch); - } - else if (content.Length == CommitShaLength) - { - info.DetachedHeadMode = true; - info.CommitHash = content; - } - else - { - throw new InvalidOperationException($"Unable to determine the status of the git repo. THe HEAD file has an unexpected format: '{content}'"); - } - - return info; - } - - private static string ResolveHashFromBranch(string gitDir, string branch) - { - if (string.IsNullOrEmpty(branch)) - { - throw new InvalidOperationException("Current branch appears to be empty. Failed to retrieve current branch."); - } - - var branchFile = Path.Combine(gitDir, "refs", "heads", branch); - if (File.Exists(branchFile)) - { - return File.ReadAllText(branchFile).Trim(); - } - - var packedRefs = Path.Combine(gitDir, "packed-refs"); - if (File.Exists(packedRefs)) - { - var lines = File.ReadAllLines(packedRefs); - foreach (var line in lines) - { - if (line.Length == 0) - { - continue; - } - - if (line[0] == '#' || line[0] == '^') - { - continue; - } - - var split = line.Split(new[] { ' ' }, 2); - if (split.Length < 2) - { - continue; - } - - if (string.Equals("refs/heads/" + branch, split[1], StringComparison.Ordinal)) - { - return split[0]; - } - } - } - - throw new FileNotFoundException("Unable to determine current git commit hash"); - } - - private static DirectoryInfo GetRepositoryRoot(string start) - { - var dir = new DirectoryInfo(start); - while (dir != null) - { - var dotGit = dir.GetFileSystemInfos(".git").FirstOrDefault(); - if (dotGit != null) - { - return dir; - } - dir = dir.Parent; - } - return null; - } - } -} diff --git a/modules/BuildTools.Tasks/module.targets b/modules/BuildTools.Tasks/module.targets index b22749fea..23e030a25 100644 --- a/modules/BuildTools.Tasks/module.targets +++ b/modules/BuildTools.Tasks/module.targets @@ -1,42 +1,9 @@ - $(PrepareDependsOn);_UseVolatileFeed;ResolveCommitHash + $(PrepareDependsOn);_UseVolatileFeed - - - - - - - - - - $(APPVEYOR_REPO_COMMIT) - $(TRAVIS_COMMIT) - $(CommitHash) - - - - - - - - - $(RepositoryCommit) - $(BuildProperties);CommitHash=$(RepositoryCommit) - $(BuildProperties);RepositoryCommit=$(RepositoryCommit) - - - - /_/ - - $(DeterministicSourceRoot) - $([MSBuild]::NormalizeDirectory($(RepositoryRoot))) - - $([MSBuild]::NormalizeDirectory($(RepositoryRoot)))=$(DeterministicSourceRoot) - - - - - - - - - - - - - $(APPVEYOR_REPO_COMMIT) - $(TRAVIS_COMMIT) - $(CommitHash) - - - - - - - - - $(RepositoryCommit) - - - - - - - - - - - - - - - - - - - - - - - - - $(IntermediateOutputPath)$(RepositoryCommit.Substring(0, 10)).commit - - - - <_OldCommitFiles Include="$(IntermediateOutputPath)*.commit" Exclude="$(IntermediateCommitHash)" /> - - - - - - - - - - <_CustomAttributes Remove="@(_CustomAttributes)" /> - <_CustomAttributes Include="System.Reflection.AssemblyMetadataAttribute"> - <_Parameter1>CommitHash - <_Parameter2>$(RepositoryCommit) - - <_CustomAttributes Include="System.Reflection.AssemblyMetadataAttribute" - Condition=" '$(RepositoryUrl)' != ''"> - <_Parameter1>SourceCommitUrl - <_Parameter2>$(RepositoryUrl)/tree/$(RepositoryCommit) - - - - - - - - - - - - - - $(PackageDescription) - -This package was built from the source code at $(RepositoryUrl)/tree/$(RepositoryCommit) - - - - diff --git a/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets b/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets index ab26b21b2..5f76a7bfc 100644 --- a/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets +++ b/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets @@ -6,7 +6,6 @@ for use outside of Microsoft. - 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 A5&!@I diff --git a/test/BuildTools.Tasks.Tests/Resources/SparseCheckout.zip b/test/BuildTools.Tasks.Tests/Resources/SparseCheckout.zip deleted file mode 100644 index 933a129170dc0a32324854e9a21a883ff81686a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11187 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 diff --git a/test/BuildTools.Tasks.Tests/Resources/SubmoduleRepo.zip b/test/BuildTools.Tasks.Tests/Resources/SubmoduleRepo.zip deleted file mode 100644 index 13cdf3cde107d2a307aa7a889ca1f5a4ca957684..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1703093 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 z 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 z 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

HPeJ;ZZ3rsQc+%hF#3h5N#`m~O;XB|J(786 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%0DOyxtF{+gR2c-Uq;o+b}|Ai#3<5@rPFqlurjPKF8 z`?>`RfcJ!mx#XV&yHmB|UqKTAtNMQX_xI=H;a@1Fys7P|d+y(^`L>b+h~yu!AK@hw z*&(Ke<5JC+;jD2498+NE^N)B$T-%|NW;|Y}H>sk9>2b0H1q27r6v4;M!nWW8n#Kma>CNTN?vcRsUh8XWqi(4`vuO9{^i-5W!8KRVM0a0zk#?&1^$-{`Z*#XFj>U2IFdqTwa%- zwQ=l5f?`=Or><#e>o-xOq!BA5oV{AX|0VHyO&#w;X3;{0*GQ7blg||k!%qfivuaeC8`tjm#s`VZ zOoSNsIk4ekc59zkps-&RT}et8T1Qc0$Mh@>hSh2F}49Z;0=cTP%O60QJ6F#rC1d zuQ%%hixjF}wFKrPqniOF&+m}Z<)|896Bai)kLTPYbt?Xqq~jV<=KO7Zj-|%QIx?=z zwNN=cVf-mOZ`}Nv;dmgn^~jCo!T_y7_N{q`^Ch&SZU*~YmyK|QQXUs5tQqZyWD zUTf!7{EZ{LfV)1EvOpmvC)u{-fv2@)-imectbe^+Ze-sEbqU>em7#Zpcg}1gyvosM zcg0EN{AL5Z4uu^a)DpeR!{9m9<;EoU#3HWJ{Kt4En;}y zBEoPEGgU7j-b>ijVRXj}q-C_6%J+XIli|x0(I{H^@{#;PLoTr4mmxJ&x|L&Gn+9Ez zNsfEHXen#qj&_|_MBrmPA!3om^!^@$?C~wBt@?-*0+TR}I5Fu&DX2|2fgde^5YqZz z9S|(JUW_qNBk!z;J(Zi0H*8~L&v%ux#f+xe9bcn)6uk1nrfUBS8b#|xx`3C~mfB5J z*i1OsQD%NGW>g?9eqq=qR-w|bYqrE98&@L^&>w6S-YfJt6PZDU)f|kaX)J3vOftxo zkz!bs9bNp>TR!|ri-gn9GYI=vaOVcf_gv}r9vK8F3LSI!%uU#N%dX#tar^3#eeJU# zKCV_t!zW}erRAv;SqwVj`}@brN>M`xC8LRVt_3 z9iK5uW=vXO76)mEI8PK#cb6bx=}(R$t%Mkp!kfXGXmPeERW&_~Z?#-tM|Af;YA!*J zHhDiVpwDiOF)6uRFoWyyXa%#U`vI{}kzOj3roP;H$xkBQ`Twx&X z!agX=t6dT$;;ez_$J0N+hjFm^fnKaejbxy+^`2s@0J zDu6|1vN4nim4pl}&Kj}2d#Z2qQBk5$mRUf4NVc6}jk6W8mmTxih2wA5$EDz-OZ?r5 zM1|zsx>n6YXM^wK&yC*Ia`7-!2RPj|8RT33+ztyu2FIF=71(JErdUD+zWJhtb>fLg zuD-%DsJ`*|>XP?u@N1q-&zYR3B&F+zFXUIuO1&~4>MzyEg3cMLK8;DTWHtqgBpb79 zMztq&0&Dlv&kTu5vXJnro1Pn**sXi0CJVxPjyC(9pY^2o(H)0AH!@EoalT5%`a18& zFU2-Mi}PUI;;HiB-i{d$vR}wG>C_Xx#nH!d1Z<-PBZBDXsrppY5Yea6FHIcw&AjEo znEh#*P_lu##%Y2-mjEYKrpCsVJ=HkbkRW!G7BL|;3hJPOo9^lOg zjY>O%7u-E@%Aubgcj(v;JJbcXa>=bq3?caJUV4c};Y>A$O6bvY`CS3k{z{=^>8-?P ziIC--Qcd4ij0do%f)@tZZbP06wA5hNhaZfd-<8np)o$J}w9)dryuzOXn4!b@=9BrS zlaJd3{DTiwQC@Yd*%{wsI+O&Kh-)!_P9?OFUdXZNVq|TGb-dG}sQ0J*-g~PlmE=;L z*Q|rZhNj0#eLfx%Ki3VTBrz@1*i9YpX}^kZ@(OlENbBSKy;kB|bz5HC2< zlw}>zvy+6pF+k7;2^-heRFYj;3$Of|4Vw)CB_gcx2biJmh($kol4u=VDpe0N zvVk~5OpKIFG@}x8gZL9{O)RVmA1CRj=mB)_pvd6F(cu?tCO62h9sMcrohl3 z-GZV=&kv$Zx0MaO?O#2i{V3=^ERreR?l4D#5ah0kv}yzcgf=ZDt%Tgx<^{3z815*HY1{O%+=(q z7heYo%PcRH+AywtMP=H8pWcy+hNqRTejFEz|oItyFp2HNsq3NpjktMjr$aiDTL? z`HyTMVQ!NsTpbpxe5FIDxh}FBYgwG5n8Ip^3SU0M8o?)q*u9w75(|6}JkQ36yZ&mbJdaKdt-+rj$RjmYVOX~19_|MyOD z0LlgvL#MJAyjbgRfq0i)|4ASfN(r6!IUywQYe^UZ5B7)Q5%MsD(imWpep3C}RX&hB z(GIMtDH)hIf9PbHmV76DjXR!jYm(~Y3D2K%vHo`Mp#~dy>dLBo4=8IRDJO@`d>m6# z!-O!UCRq*FNL;YMT6d>U8}zxK>p(Tapw{uIsv$CLl4m!>#X6alt;?bxn7JjmYhQ6X z7xN;8LqZM9--It79c(^R3r5kO6>IGKfz5>0dXo@~p~2Dl--nE#c|cU0*Pc{s9|)V(G?r&+=q zqiM1xn#IDwi@@Fp>-V9EnARZ~-0lC-S^SOVehAyaz>X)DcInG(HAyvL;CYyBcKY(C z;ITrt5B63H6@t&)3)=Iato3B-y{t%t+8?(pT;S_rIK0Mb5cG+86SqegERTSp{_6e}l-kwu*{22rgO4%?x4(sIX3q zkW*~)=gmkJdwZA58D|a_M}m8S#jKgv->AB|Jph2aNf7WWQqa1E7rcX`QFxz;miBAAd<| zzUtm~$-Fci=>>$evWW{cS_NQ1h+(u|#7W}2GDu{(<9l4N0|cz@Mg_RRc-Emdki zZ6JNf`Lqf$j${=QAUcle^%gS11&|&Swne5f6=wul=_L z-g<87q59XNpNUOkAr&&(OoKTih=s&S`3l@t2$&YdAW(1rrnY z+O=HyU-=XtL{V$-8j<|}sZ&cu_b|yW4cX>q!r00me(vaf5Ut(S5JM=X_T(blBvWzI zY;GjsLc0zX*BxrQxpk%2QSH2cOE)wjHjnxv9{i+F*pssHkAD*BnyZRnz#=*Bz9V5Hta(GiP1C~Hs z>ncDk5-RF}z3u`|+4_lxp#TTT2i0Cqn}o1={EM!@Lw!P-Q;7o-Mg^EDKf3+#vy}JN zzy9U-_^3%oeSf~^&Uj=w`Dlo@U>&B4S6}I}82bR3ecVWM95rfGZogdJK~TaY0TyW< z{@qLm4I-nkYIeyAO{W{&?IL#mq_=I;#-u(!0Km-KUw!5Zji$V`&uMN`8x5G%nZ8{# z3QaLG8f%xPu&J^%LY$7&)D->w)p(NH)Q?h{eJyoe?zbc&;!pav?_aR#UCFrrL@yMP zwi$b*fN-ahkE4DJ>=OTK`MPf69cG0Pi$o79#N1-|U9<}u?85>6+xt7yz9uZyO8fbI zwh-myj|>MB7X-AgOG593-~ZtAKO-;Z&p)Ah1enwBy8D6_WQIudH2}2_iztgI3A-fz zadB2xckC1Y*mNs@Zw?oJy zToue6%w3G#%w-(y?TsDGK&GyMjlb}9j?I;=X&64Slg^HHV%zLkJGO1RW81cE+qP|X zY^$TmplasR{DXI`su>S85xSG}%tc@Z18 zJ3(99Y3O_3%0JJBxWn~Q+w-py2hHyi2Xyb}8Vx}CYe0Z%2uop!ryV zoC>|@Ov6j3uqRJ>Se zzHby!&4L560{Bd%+vrST`U2$*!n-cO>X@q-X#6znym^W|X@I%(y;24RP(?l2OcK~L zU$3?i(h`SGsyj3Va3FPwLoSRmc*cpEux09@Q6O&Vmnd4XHA}uK9G|ZeM*!9D9GQuW zpW{L<*d6%o@bt9sZuRHatG@T`CQW^eTd!0THVm2KFzIc7)n6DswAPDl=zlwjkt!ki|

0Ym%#vyi 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 fy69h0jFO$EKZ{ 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

4=1Am&7{*9L0*sYWs;s;gVC4{?<5o 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%0DtHH(4Jw=%yvwru{xsu{{qt7FYHGkJ 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

*b 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%0Dq%U%WrWKEgqMe|w_A0*vGc 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 z%0D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 WK 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�oQ=!LjT(6mO#Yg6rN{BPt~! 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 z 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 Pj9M?QG0OP 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⁢Mv$%RmLb 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 diff --git a/test/BuildTools.Tasks.Tests/Resources/WorktreeRepo.zip b/test/BuildTools.Tasks.Tests/Resources/WorktreeRepo.zip deleted file mode 100644 index 4b140732911dd4d1a3cb950ff5afd46bfbc577af..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20306 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 A!2kdN From 7effe75f1408a86a9c32b592192fea1097bdd3a3 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 19 Feb 2019 13:03:12 -0800 Subject: [PATCH 155/192] Update to MSBuild 16, .NET Core 3.0 Preview 2 SDK, and remove obsolete tasks and targets (#935) Part of https://github.com/aspnet/AspNetCore/pull/7005. Resolves https://github.com/aspnet/BuildTools/issues/881 Due to the large amount of breaking changes between MSBuild 15 and 16 (VS 2017 and VS 2019), I've decided to remove tasks broken by the upgrade instead of port them to a higher version. Changes: * Remove tasks related to dependency flow (replaced by Arcade) * Remove tasks which push and pack NuGet packages (replaced by Azure Pipelines and pack tasks in Microsoft.NET.Sdk) * Remove tasks for enabling/disabling strong name verification in .NET Framework (this was added as a workaround for bad builds from corefx which haven't happened in a long time) * Remove tasks related to running KoreBuild inside a Docker container (replaced by the `dockerbuild.sh` script in aspnet/AspNetCore`) * Remove unzip/zip tasks - there is now a version built-in to MSBuild itself which should be used instead --- BuildTools.sln | 15 +- build/dependencies.props | 12 +- build/repo.props | 1 - build/repo.targets | 11 - build/tasks/RepoTasks.csproj | 1 - .../tasks}/ZipArchive.cs | 0 docs/Logging.md | 10 - docs/PackageReferenceManagement.md | 87 ---- docs/Sdk.md | 31 -- files/KoreBuild/KoreBuild.Common.props | 4 +- files/KoreBuild/KoreBuild.sh | 23 +- files/KoreBuild/config/sdk.version | 2 +- files/KoreBuild/scripts/KoreBuild.psm1 | 22 +- .../BuildTools.Tasks/BuildTools.Tasks.props | 5 - .../SetEnvironmentVariable.cs | 41 -- modules/BuildTools.Tasks/UnzipArchive.cs | 101 ----- .../BuildTools.Tasks/UpdatePackageSource.cs | 76 ---- modules/BuildTools.Tasks/WaitForDebugger.cs | 48 --- modules/BuildTools.Tasks/module.targets | 23 - modules/BundledPackages/BundledPackages.proj | 53 --- modules/BundledPackages/NuGet.config | 7 - .../KoreBuild.Tasks/CheckPackageReferences.cs | 150 ------- modules/KoreBuild.Tasks/CodeSign.props | 2 +- .../KoreBuild.Tasks/DisableSkipStrongName.cs | 70 ---- .../KoreBuild.Tasks/DownloadNuGetPackages.cs | 131 ------ .../KoreBuild.Tasks/EnableSkipStrongName.cs | 84 ---- .../GenerateDependenciesPropsFile.cs | 158 ------- .../GeneratePackageVersionPropsFile.cs | 91 ---- modules/KoreBuild.Tasks/InstallToolsets.cs | 175 -------- .../KoreBuild.Tasks/Internal/HashHelper.cs | 45 -- .../KoreBuild.Tasks/Internal/MSBuildLogger.cs | 200 --------- .../KoreBuild.Tasks/Internal/PackageInfo.cs | 19 - .../ProjectModel/DotNetCliReferenceInfo.cs | 24 -- .../ProjectModel/PackageReferenceInfo.cs | 30 -- .../ProjectModel/ProjectFrameworkInfo.cs | 22 - .../Internal/ProjectModel/ProjectInfo.cs | 45 -- .../ProjectModel/ProjectInfoFactory.cs | 166 -------- .../Internal/ProjectModel/SolutionInfo.cs | 26 -- .../ProjectModel/SolutionInfoFactory.cs | 73 ---- .../Internal/SimplePackageInstaller.cs | 92 ---- .../KoreBuild.Tasks/KoreBuild.Tasks.csproj | 4 - .../KoreBuild.Tasks}/KoreBuildSettings.cs | 0 modules/KoreBuild.Tasks/PackNuSpec.cs | 250 ----------- modules/KoreBuild.Tasks/PushNuGetPackages.cs | 154 ------- .../SkipStrongName/AssembliesFile.cs | 78 ---- .../SkipStrongName/AssemblySpecification.cs | 16 - .../SkipStrongName/RegistrySection.cs | 10 - .../KoreBuild.Tasks/SkipStrongName/Status.cs | 11 - .../SkipStrongName/StrongNameConfiguration.cs | 110 ----- .../SkipStrongName/WindowsRegistry.cs | 116 ------ modules/KoreBuild.Tasks/SkipStrongNames.xml | 9 - .../KoreBuild.Tasks/UpgradeDependencies.cs | 276 ------------ .../Utilities/DependencyVersionsFile.cs | 235 ----------- .../Utilities/PackageDownloadRequest.cs | 15 - .../Utilities/PackageDownloader.cs | 114 ----- .../Utilities/PackageVersionVariable.cs | 56 --- modules/KoreBuild.Tasks/module.props | 10 - modules/KoreBuild.Tasks/module.targets | 94 +---- .../build/Common.props | 2 +- .../build/DotNetTool.targets | 21 - .../build/Internal.AspNetCore.Sdk.targets | 4 - .../UnzipArchiveTest.cs | 197 --------- test/BuildTools.Tasks.Tests/ZipArchiveTest.cs | 220 ---------- .../SimpleRepoTests.cs | 139 +------ .../CheckPackageReferenceTests.cs | 288 ------------- .../DependencyVersionsFileTests.cs | 117 ------ .../DownloadNuGetPackagesTests.cs | 106 ----- .../GenerateDependenciesPropsFileTests.cs | 151 ------- .../GeneratePackageVersionPropsFileTests.cs | 116 ------ .../InstallToolsetsTests.cs | 54 --- .../KoreBuild.Tasks.Tests.csproj | 6 - test/KoreBuild.Tasks.Tests/PackNuSpecTests.cs | 393 ------------------ .../SolutionInfoFactoryTests.cs | 96 ----- .../TestResources/lorem.bin | 1 - .../UpgradeDependenciesTests.cs | 254 ----------- .../src/BadConsole/BadConsole.csproj | 2 +- .../RepoWithGlobalTool/Directory.Build.props | 1 - .../Directory.Build.targets | 4 - .../RepoWithGlobalTool/RepoWithGlobalTool.sln | 34 -- .../build/dependencies.props | 5 - testassets/RepoWithGlobalTool/korebuild.json | 4 - .../GlobalConsoleTool.csproj | 10 - .../src/GlobalConsoleTool/Program.cs | 12 - testassets/SimpleRepo/Directory.Build.props | 5 +- .../SimpleRepo/build/Sample.Lineup.nuspec | 15 - testassets/SimpleRepo/build/repo.targets | 18 - testassets/SimpleRepo/build/sources.props | 5 - .../SimpleRepo/build/tasks/RepoTasks.csproj | 5 +- .../Simple.Sample/Simple.Sample.csproj | 2 +- .../src/Simple.CliTool/Simple.CliTool.csproj | 3 +- .../src/Simple.Lib/Simple.Lib.csproj | 3 +- .../test/Simple.Test/Simple.Test.csproj | 2 +- .../Commands/ApiBaselinesGenerateCommand.cs | 50 --- .../KoreBuild.Console/Commands/CommandBase.cs | 45 -- .../Commands/CommandContext.cs | 177 -------- .../Commands/DependenciesGenerateCommand.cs | 76 ---- .../Commands/DependenciesUpgradeCommand.cs | 99 ----- .../Commands/DockerBuildCommand.cs | 187 --------- .../Commands/DockerFiles/.dockerignore | 4 - .../Commands/DockerFiles/jessie.dockerfile | 19 - .../DockerFiles/winservercore.dockerfile | 20 - .../Commands/InstallToolsCommand.cs | 130 ------ .../Commands/InstallToolsetsCommand.cs | 74 ---- .../Commands/MSBuildCommand.cs | 124 ------ .../KoreBuild.Console/Commands/RootCommand.cs | 66 --- .../Commands/SubCommandBase.cs | 63 --- .../KoreBuild.Console.csproj | 18 - tools/KoreBuild.Console/Program.cs | 32 -- .../Reporter/ConsoleReporter.cs | 70 ---- tools/KoreBuild.Console/Reporter/IConsole.cs | 21 - tools/KoreBuild.Console/Reporter/IReporter.cs | 14 - .../Reporter/PhysicalConsole.cs | 36 -- 112 files changed, 39 insertions(+), 7315 deletions(-) rename {modules/BuildTools.Tasks => build/tasks}/ZipArchive.cs (100%) delete mode 100644 docs/PackageReferenceManagement.md delete mode 100644 docs/Sdk.md delete mode 100644 modules/BuildTools.Tasks/SetEnvironmentVariable.cs delete mode 100644 modules/BuildTools.Tasks/UnzipArchive.cs delete mode 100644 modules/BuildTools.Tasks/UpdatePackageSource.cs delete mode 100644 modules/BuildTools.Tasks/WaitForDebugger.cs delete mode 100644 modules/BundledPackages/BundledPackages.proj delete mode 100644 modules/BundledPackages/NuGet.config delete mode 100644 modules/KoreBuild.Tasks/CheckPackageReferences.cs delete mode 100644 modules/KoreBuild.Tasks/DisableSkipStrongName.cs delete mode 100644 modules/KoreBuild.Tasks/DownloadNuGetPackages.cs delete mode 100644 modules/KoreBuild.Tasks/EnableSkipStrongName.cs delete mode 100644 modules/KoreBuild.Tasks/GenerateDependenciesPropsFile.cs delete mode 100644 modules/KoreBuild.Tasks/GeneratePackageVersionPropsFile.cs delete mode 100644 modules/KoreBuild.Tasks/InstallToolsets.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/HashHelper.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/MSBuildLogger.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/PackageInfo.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/DotNetCliReferenceInfo.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/PackageReferenceInfo.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectFrameworkInfo.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfo.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfoFactory.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfo.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfoFactory.cs delete mode 100644 modules/KoreBuild.Tasks/Internal/SimplePackageInstaller.cs rename {tools => modules/KoreBuild.Tasks}/KoreBuildSettings.cs (100%) delete mode 100644 modules/KoreBuild.Tasks/PackNuSpec.cs delete mode 100644 modules/KoreBuild.Tasks/PushNuGetPackages.cs delete mode 100644 modules/KoreBuild.Tasks/SkipStrongName/AssembliesFile.cs delete mode 100644 modules/KoreBuild.Tasks/SkipStrongName/AssemblySpecification.cs delete mode 100644 modules/KoreBuild.Tasks/SkipStrongName/RegistrySection.cs delete mode 100644 modules/KoreBuild.Tasks/SkipStrongName/Status.cs delete mode 100644 modules/KoreBuild.Tasks/SkipStrongName/StrongNameConfiguration.cs delete mode 100644 modules/KoreBuild.Tasks/SkipStrongName/WindowsRegistry.cs delete mode 100644 modules/KoreBuild.Tasks/SkipStrongNames.xml delete mode 100644 modules/KoreBuild.Tasks/UpgradeDependencies.cs delete mode 100644 modules/KoreBuild.Tasks/Utilities/DependencyVersionsFile.cs delete mode 100644 modules/KoreBuild.Tasks/Utilities/PackageDownloadRequest.cs delete mode 100644 modules/KoreBuild.Tasks/Utilities/PackageDownloader.cs delete mode 100644 modules/KoreBuild.Tasks/Utilities/PackageVersionVariable.cs delete mode 100644 src/Internal.AspNetCore.Sdk/build/DotNetTool.targets delete mode 100644 test/BuildTools.Tasks.Tests/UnzipArchiveTest.cs delete mode 100644 test/BuildTools.Tasks.Tests/ZipArchiveTest.cs delete mode 100644 test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs delete mode 100644 test/KoreBuild.Tasks.Tests/DependencyVersionsFileTests.cs delete mode 100644 test/KoreBuild.Tasks.Tests/DownloadNuGetPackagesTests.cs delete mode 100644 test/KoreBuild.Tasks.Tests/GenerateDependenciesPropsFileTests.cs delete mode 100644 test/KoreBuild.Tasks.Tests/GeneratePackageVersionPropsFileTests.cs delete mode 100644 test/KoreBuild.Tasks.Tests/InstallToolsetsTests.cs delete mode 100644 test/KoreBuild.Tasks.Tests/PackNuSpecTests.cs delete mode 100644 test/KoreBuild.Tasks.Tests/SolutionInfoFactoryTests.cs delete mode 100644 test/KoreBuild.Tasks.Tests/TestResources/lorem.bin delete mode 100644 test/KoreBuild.Tasks.Tests/UpgradeDependenciesTests.cs delete mode 100644 testassets/RepoWithGlobalTool/Directory.Build.props delete mode 100644 testassets/RepoWithGlobalTool/Directory.Build.targets delete mode 100644 testassets/RepoWithGlobalTool/RepoWithGlobalTool.sln delete mode 100644 testassets/RepoWithGlobalTool/build/dependencies.props delete mode 100644 testassets/RepoWithGlobalTool/korebuild.json delete mode 100644 testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj delete mode 100644 testassets/RepoWithGlobalTool/src/GlobalConsoleTool/Program.cs delete mode 100644 testassets/SimpleRepo/build/Sample.Lineup.nuspec delete mode 100644 testassets/SimpleRepo/build/sources.props delete mode 100644 tools/KoreBuild.Console/Commands/ApiBaselinesGenerateCommand.cs delete mode 100644 tools/KoreBuild.Console/Commands/CommandBase.cs delete mode 100644 tools/KoreBuild.Console/Commands/CommandContext.cs delete mode 100644 tools/KoreBuild.Console/Commands/DependenciesGenerateCommand.cs delete mode 100644 tools/KoreBuild.Console/Commands/DependenciesUpgradeCommand.cs delete mode 100644 tools/KoreBuild.Console/Commands/DockerBuildCommand.cs delete mode 100644 tools/KoreBuild.Console/Commands/DockerFiles/.dockerignore delete mode 100644 tools/KoreBuild.Console/Commands/DockerFiles/jessie.dockerfile delete mode 100644 tools/KoreBuild.Console/Commands/DockerFiles/winservercore.dockerfile delete mode 100644 tools/KoreBuild.Console/Commands/InstallToolsCommand.cs delete mode 100644 tools/KoreBuild.Console/Commands/InstallToolsetsCommand.cs delete mode 100644 tools/KoreBuild.Console/Commands/MSBuildCommand.cs delete mode 100644 tools/KoreBuild.Console/Commands/RootCommand.cs delete mode 100644 tools/KoreBuild.Console/Commands/SubCommandBase.cs delete mode 100644 tools/KoreBuild.Console/KoreBuild.Console.csproj delete mode 100644 tools/KoreBuild.Console/Program.cs delete mode 100644 tools/KoreBuild.Console/Reporter/ConsoleReporter.cs delete mode 100644 tools/KoreBuild.Console/Reporter/IConsole.cs delete mode 100644 tools/KoreBuild.Console/Reporter/IReporter.cs delete mode 100644 tools/KoreBuild.Console/Reporter/PhysicalConsole.cs diff --git a/BuildTools.sln b/BuildTools.sln index 573e4b696..fb9817086 100644 --- a/BuildTools.sln +++ b/BuildTools.sln @@ -1,7 +1,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27121.1 -MinimumVisualStudioVersion = 15.0.26730.03 +# Visual Studio Version 16 +VisualStudioVersion = 16.0.0.0 +MinimumVisualStudioVersion = 16.0.0.0 Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A4F4353B-C3D2-40B0-909A-5B48A748EA76}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "files", "files", "{BF3E9C90-F129-4CE6-8F3B-F96831E4429B}" @@ -82,10 +82,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NuGetPackageVerifier", "NuG EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KoreBuild.Tasks.Tests", "test\KoreBuild.Tasks.Tests\KoreBuild.Tasks.Tests.csproj", "{A3A81E93-0157-406F-A43C-C163F7F781A9}" EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tools", "tools", "{B16B5072-3A0B-4527-8AB5-1C73A51684F7}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KoreBuild.Console", "tools\KoreBuild.Console\KoreBuild.Console.csproj", "{02F548A6-B0E9-4F09-BC03-812FC3C8F0D2}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApiCheckForwardDestination", "test\ApiCheckForwardDestination\ApiCheckForwardDestination.csproj", "{605F0478-A9D2-4A8A-BB38-9D5DC132FBB5}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetPackageVerifier.Tests", "test\NuGetPackageVerifier.Tests\NuGetPackageVerifier.Tests.csproj", "{439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}" @@ -148,10 +144,6 @@ Global {A3A81E93-0157-406F-A43C-C163F7F781A9}.Debug|Any CPU.Build.0 = Debug|Any CPU {A3A81E93-0157-406F-A43C-C163F7F781A9}.Release|Any CPU.ActiveCfg = Release|Any CPU {A3A81E93-0157-406F-A43C-C163F7F781A9}.Release|Any CPU.Build.0 = Release|Any CPU - {02F548A6-B0E9-4F09-BC03-812FC3C8F0D2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {02F548A6-B0E9-4F09-BC03-812FC3C8F0D2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {02F548A6-B0E9-4F09-BC03-812FC3C8F0D2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {02F548A6-B0E9-4F09-BC03-812FC3C8F0D2}.Release|Any CPU.Build.0 = Release|Any CPU {605F0478-A9D2-4A8A-BB38-9D5DC132FBB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {605F0478-A9D2-4A8A-BB38-9D5DC132FBB5}.Debug|Any CPU.Build.0 = Debug|Any CPU {605F0478-A9D2-4A8A-BB38-9D5DC132FBB5}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -179,7 +171,6 @@ Global {020ED083-4076-4711-A52B-2F89EA884F9B} = {BD3545FB-5520-43DF-B4F9-83BEA3A38ECA} {C0E43505-F8EB-4B7F-B84D-5961F9763945} = {BD3545FB-5520-43DF-B4F9-83BEA3A38ECA} {A3A81E93-0157-406F-A43C-C163F7F781A9} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} - {02F548A6-B0E9-4F09-BC03-812FC3C8F0D2} = {B16B5072-3A0B-4527-8AB5-1C73A51684F7} {605F0478-A9D2-4A8A-BB38-9D5DC132FBB5} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} EndGlobalSection diff --git a/build/dependencies.props b/build/dependencies.props index d04b326e5..84b4eab37 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -10,27 +10,27 @@ 0.10.0-beta6 4.7.99 - 10.0.1 + 12.0.1 4.7.0-rtm.5148 4.7.0-rtm.5148 2.2.7 - 2.3.1 - 2.3.1 + 2.4.1 + 2.4.1 - 15.9.19 + 16.0.0-preview.383 $(MicrosoftBuildPackageVersion) $(MicrosoftBuildPackageVersion) $(MicrosoftBuildPackageVersion) 9.0.1 - 4.9.0-preview3.5473 + 5.0.0-preview1.5663 diff --git a/build/repo.props b/build/repo.props index 603d5ec41..3b5ddf7e6 100644 --- a/build/repo.props +++ b/build/repo.props @@ -9,7 +9,6 @@ - diff --git a/build/repo.targets b/build/repo.targets index 6e1c503e1..5f90e60fa 100644 --- a/build/repo.targets +++ b/build/repo.targets @@ -47,17 +47,6 @@ - - <_ToolsProjects Include="$(RepositoryRoot)tools\KoreBuild.Console\KoreBuild.Console.csproj"> - PublishDir=$(_KoreBuildIntermediateDir)\tools\%(Identity)\ - - - - - diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index e2242175f..8aa6fe562 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -17,7 +17,6 @@ - diff --git a/modules/BuildTools.Tasks/ZipArchive.cs b/build/tasks/ZipArchive.cs similarity index 100% rename from modules/BuildTools.Tasks/ZipArchive.cs rename to build/tasks/ZipArchive.cs diff --git a/docs/Logging.md b/docs/Logging.md index 580ad35b6..610222c38 100644 --- a/docs/Logging.md +++ b/docs/Logging.md @@ -8,13 +8,3 @@ KoreBuild produces log files to $(RepositoryRoot)/artifacts/logs. The following Using `build.cmd -Verbose` will produce a binary log file to artifacts/logs/msbuild.binlog. See for details. - -## TeamCity Logger - -KoreBuild can produce log messages for TeamCity by using . - -To configure this, - -1. Download the logger from JetBrains. https://github.com/JetBrains/TeamCity.MSBuild.Logger#download -2. Install this on CI agents. -3. Set the environment variable `KOREBUILD_TEAMCITY_LOGGER` to the file path of TeamCity.MSBuild.Logger.dll on CI agents. diff --git a/docs/PackageReferenceManagement.md b/docs/PackageReferenceManagement.md deleted file mode 100644 index 2c5203df7..000000000 --- a/docs/PackageReferenceManagement.md +++ /dev/null @@ -1,87 +0,0 @@ -PackageReference management ---------------------------- - -## Usage - -KoreBuild includes tools to help you automatically update your `dependencies.props` files. - -#### Generating a dependencies.props file - -On an existing project, you can execute the following command: -``` -run.ps1 generate deps -``` - -This will update csproj files and overwrite your build/dependencies.props file with variables. - -#### Updating dependencies.props - -KoreBuild can help you automatically update the `build/dependencies.props` file in your repo by using a lineup package. - -On command line, you can then execute -``` -run.ps1 upgrade deps -``` - -This command requires you set a few properties so the command can download a remote package and use that as the source -of version information. Most aspnetcore repos will set this in `build/repo.props` - -```xml - - Internal.AspNetCore.Universe.Lineup - - 2.1.0-* - https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json - -``` - -The lineup package itself contains a file that lists all version, and is itself also packaged under `build/dependencies.props`. The `upgrade deps` command will update any matching variables from the lineup package in the local copy of build/dependencies.props. - -## Restrictions on PackageReference usage - -To manage the complexity of keeping PackageReference versions consistent within a repo and between multiple repos, KoreBuild will enforce the following patterns for using PackageReference. - -#### 1. build/dependencies.props - -Each repository should have this file, and it should look like this. - -```xml - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - - 10.0.1 - 15.3.0 - 4.7.49 - 2.3.0 - - - - 10.0.1 - - -``` - -The `` section is for variables which should be automatically updated. - -The `` section is for variables which upgrade automation should not touch. - -### 2. PackageReference's should use variables to set versions - -All .csproj files should set the version of a package reference like this: - -```xml - - - -``` - -#### Opt-out of restrictions - -To opt-out of these restrictions, projects should add this to the `build/repo.props` file in their repository. -```xml - - true - -``` diff --git a/docs/Sdk.md b/docs/Sdk.md deleted file mode 100644 index 2cbca9efc..000000000 --- a/docs/Sdk.md +++ /dev/null @@ -1,31 +0,0 @@ -The Internal ASP.NET Core SDK -============================= - -The internal ASP.NET Core SDK provides features essential to producing ASP.NET Core itself. -It is not indended for general consumption beyond the ASP.NET Core team. - -## How to use it - -1. Change the first line of your .csproj files to - -```xml - -``` - -2. Add this to your NuGet.config -```xml - - - - - -``` - -3. Add a global.json file to your project with contents like this: -```json -{ - "msbuild-sdks": { - "Internal.AspNetCore.Sdk": "2.2.0-preview1-1234" - } -} -``` diff --git a/files/KoreBuild/KoreBuild.Common.props b/files/KoreBuild/KoreBuild.Common.props index ca89a5055..c2fa69dab 100644 --- a/files/KoreBuild/KoreBuild.Common.props +++ b/files/KoreBuild/KoreBuild.Common.props @@ -37,8 +37,8 @@ Default layout and configuration. $([MSBuild]::NormalizeDirectory('$(RepositoryRoot)')) $([MSBuild]::NormalizeDirectory('$(RepositoryRoot)'))artifacts\ $(ArtifactsDir)build\ - $(ArtifactsDir)logs\ - $([MSBuild]::NormalizeDirectory('$(RepositoryRoot)'))obj\ + $(ArtifactsDir)logs\ + $([MSBuild]::NormalizeDirectory('$(RepositoryRoot)'))obj\ $(NUGET_PACKAGES) $(USERPROFILE)\.nuget\packages\ diff --git a/files/KoreBuild/KoreBuild.sh b/files/KoreBuild/KoreBuild.sh index ceaefa0c0..952a8b4af 100755 --- a/files/KoreBuild/KoreBuild.sh +++ b/files/KoreBuild/KoreBuild.sh @@ -72,15 +72,8 @@ invoke_korebuild_command(){ elif [ "$command" = "install-tools" ]; then __install_tools "$tools_source" "$dot_net_home" else - __ensure_dotnet - - kore_build_console_dll="$__korebuild_dir/tools/KoreBuild.Console.dll" - - __exec dotnet "$kore_build_console_dll" "$command" \ - --tools-source "$tools_source" \ - --dotnet-home "$dot_net_home" \ - --repo-path "$repo_path" \ - "$@" + __error "Unrecognized command '$command'" + exit 1 fi } @@ -129,18 +122,6 @@ __install_tools() { # Set environment variables export PATH="$install_dir:$PATH" - - # This is a workaround for https://github.com/Microsoft/msbuild/issues/2914. - # Currently, the only way to configure the NuGetSdkResolver is with NuGet.config, which is not generally used in aspnet org projects. - # This project is restored so that it pre-populates the NuGet cache with SDK packages. - local restorerfile="$__korebuild_dir/modules/BundledPackages/BundledPackageRestorer.csproj" - local restorerfilelock="$NUGET_PACKAGES/internal.aspnetcore.sdk/$(__get_korebuild_version)/korebuild.sentinel" - if [[ -e "$restorerfile" ]] && [[ ! -e "$restorerfilelock" ]]; then - mkdir -p "$(dirname $restorerfilelock)" - touch "$restorerfilelock" - __exec dotnet msbuild -t:restore -v:q "$restorerfile" - fi - # end workaround } __show_version_info() { diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index c4267acea..c175478ef 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview-009750 +3.0.100-preview-010184 diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index 06df4cb83..ca718ead5 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -221,18 +221,6 @@ function Install-Tools( else { Write-Host -ForegroundColor DarkGray ".NET Core SDK $version is already installed. Skipping installation." } - - # This is a workaround for https://github.com/Microsoft/msbuild/issues/2914. - # Currently, the only way to configure the NuGetSdkResolver is with NuGet.config, which is not generally used in aspnet org projects. - # This project is restored so that it pre-populates the NuGet cache with SDK packages. - $restorerfile = "$PSScriptRoot/../modules/BundledPackages/BundledPackageRestorer.csproj" - $restorerfilelock="$env:NUGET_PACKAGES/internal.aspnetcore.sdk/$(Get-KoreBuildVersion)/korebuild.sentinel" - if ((Test-Path $restorerfile) -and -not (Test-Path $restorerfilelock)) { - New-Item -ItemType Directory $(Split-Path -Parent $restorerfilelock) -ErrorAction Ignore | Out-Null - New-Item -ItemType File $restorerfilelock -ErrorAction Ignore | Out-Null - __exec $global:dotnet msbuild '-t:restore' '-v:q' "$restorerfile" - } - # end workaround } <# @@ -492,8 +480,14 @@ function Get-MSBuildPath() { } Write-Verbose "vswhere = $vswherePath $vswhereArgs" - - $installations = & $vswherePath @vswhereArgs | Out-String | ConvertFrom-Json + $vswhereOut = & $vswherePath @vswhereArgs | Out-String + try { + $installations = $vswhereOut | ConvertFrom-Json + } + catch { + Write-Host -f Red "vswhere output = $vswhereOut" + throw $_ + } $latest = $null if ($installations) { diff --git a/modules/BuildTools.Tasks/BuildTools.Tasks.props b/modules/BuildTools.Tasks/BuildTools.Tasks.props index bddb61326..fb3b7fd92 100644 --- a/modules/BuildTools.Tasks/BuildTools.Tasks.props +++ b/modules/BuildTools.Tasks/BuildTools.Tasks.props @@ -4,11 +4,6 @@ - - - - - diff --git a/modules/BuildTools.Tasks/SetEnvironmentVariable.cs b/modules/BuildTools.Tasks/SetEnvironmentVariable.cs deleted file mode 100644 index 62ca1cc79..000000000 --- a/modules/BuildTools.Tasks/SetEnvironmentVariable.cs +++ /dev/null @@ -1,41 +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 Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace Microsoft.AspNetCore.BuildTools -{ -#if SDK - public class Sdk_SetEnvironmentVariable : Task -#elif BuildTools - public class SetEnvironmentVariable : Task -#else -#error This must be built either for an SDK or for BuildTools -#endif - { - [Required] - public string Variable { get; set; } - - [Required] - public string Value { get; set; } - - public override bool Execute() - { - if (string.IsNullOrEmpty(Variable)) - { - Log.LogError($"{nameof(Variable)} cannot be null or an empty string"); - return false; - } - - var expandedValue = Environment.ExpandEnvironmentVariables(Value); - - Log.LogMessage("Setting environment variable '{0}' to '{1}'", Variable, expandedValue); - - Environment.SetEnvironmentVariable(Variable, expandedValue); - - return true; - } - } -} diff --git a/modules/BuildTools.Tasks/UnzipArchive.cs b/modules/BuildTools.Tasks/UnzipArchive.cs deleted file mode 100644 index 5a4f37861..000000000 --- a/modules/BuildTools.Tasks/UnzipArchive.cs +++ /dev/null @@ -1,101 +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.Collections.Generic; -using System.IO; -using System.IO.Compression; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using ZipArchiveStream = System.IO.Compression.ZipArchive; -using IOFile = System.IO.File; - -namespace Microsoft.AspNetCore.BuildTools -{ - ///

- /// Unzips an archive file. - /// -#if SDK - public class Sdk_UnzipArchive : Task -#elif BuildTools - public class UnzipArchive : Task -#else -#error This must be built either for an SDK or for BuildTools -#endif - { - /// - /// The file to unzip. - /// - [Required] - public string File { get; set; } - - /// - /// The directory where files will be unzipped. - /// - /// - [Required] - public string Destination { get; set; } - - /// - /// Overwrite if it exists. Defaults to false. - /// - public bool Overwrite { get; set; } = false; - - /// - /// Disables normalizing zip entry paths while extracting. - /// - public bool DisablePathNormalization { get; set; } = false; - - /// - /// The files that were unzipped. - /// - [Output] - public ITaskItem[] OutputFiles { get; set; } - - public override bool Execute() - { - if (!IOFile.Exists(File)) - { - Log.LogError("'{0}' does not exist", File); - return false; - } - - Directory.CreateDirectory(Destination); - - var output = new List(); - using (var stream = IOFile.OpenRead(File)) - using (var zip = new ZipArchiveStream(stream, ZipArchiveMode.Read)) - { - foreach (var entry in zip.Entries) - { - var entryPath = entry.FullName; - if (!DisablePathNormalization) - { - if (entry.FullName.IndexOf('\\') >= 0) - { - Log.LogMessage(null, null, null, File, 0, 0, 0, 0, MessageImportance.Low, - message: $"Zip entry '{entry.FullName}' has been normalized because it contains a backslash. Set DisablePathNormalization=true to disable this."); - entryPath = entry.FullName.Replace('\\', '/'); - } - } - - var fileDest = Path.Combine(Destination, entryPath); - var dirName = Path.GetDirectoryName(fileDest); - Directory.CreateDirectory(dirName); - - // Do not try to extract directories - if (Path.GetFileName(fileDest) != string.Empty) - { - entry.ExtractToFile(fileDest, Overwrite); - Log.LogMessage(MessageImportance.Low, "Extracted '{0}'", fileDest); - output.Add(new TaskItem(fileDest)); - } - } - } - - Log.LogMessage(MessageImportance.High, "Extracted {0} file(s) to '{1}'", output.Count, Destination); - OutputFiles = output.ToArray(); - - return true; - } - } -} diff --git a/modules/BuildTools.Tasks/UpdatePackageSource.cs b/modules/BuildTools.Tasks/UpdatePackageSource.cs deleted file mode 100644 index 07321a095..000000000 --- a/modules/BuildTools.Tasks/UpdatePackageSource.cs +++ /dev/null @@ -1,76 +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.IO; -using System.Linq; -using System.Xml.Linq; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace Microsoft.AspNetCore.BuildTools -{ - /// - /// Update or adds a NuGet feed to a NuGet.config file. It reads - /// and replaces or adds the feed named with . - /// -#if SDK - public class Sdk_UpdatePackageSource : Task -#elif BuildTools - public class UpdatePackageSource : Task -#else -#error This must be built either for an SDK or for BuildTools -#endif - { - [Required] - public string NuGetConfigPath { get; set; } - - [Required] - public string SourceName { get; set; } - - [Required] - public string SourceUri { get; set; } - - public override bool Execute() - { - if (string.IsNullOrEmpty(SourceName)) - { - Log.LogError("FeedName must not be empty"); - return false; - } - - if (string.IsNullOrEmpty(SourceUri)) - { - Log.LogError("PackageSource must not be empty"); - return false; - } - - var nugetConfig = XDocument.Load(NuGetConfigPath); - var packageSources = nugetConfig.Element("configuration")?.Element("packageSources"); - var addElements = packageSources?.Elements("add").ToList(); - - var valueToUpdate = addElements.FirstOrDefault(f => string.Equals(f.Attribute("key")?.Value, SourceName, StringComparison.OrdinalIgnoreCase)); - if (valueToUpdate == null) - { - Log.LogMessage("Adding feed '{0}' to '{1}'", SourceName, SourceUri); - packageSources.Add(new XElement("add", - new XAttribute("key", SourceName), - new XAttribute("value", SourceUri))); - } - else - { - Log.LogMessage("Updating feed '{0}' to '{1}'", SourceName, SourceUri); - valueToUpdate.SetAttributeValue("value", SourceUri); - } - - using (var file = new FileStream(NuGetConfigPath, FileMode.Create)) - { - nugetConfig.Save(file); - } - - Log.LogMessage("Saved changes to '{0}'", NuGetConfigPath); - - return true; - } - } -} diff --git a/modules/BuildTools.Tasks/WaitForDebugger.cs b/modules/BuildTools.Tasks/WaitForDebugger.cs deleted file mode 100644 index 43478090a..000000000 --- a/modules/BuildTools.Tasks/WaitForDebugger.cs +++ /dev/null @@ -1,48 +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.Diagnostics; -using System.Threading; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace Microsoft.AspNetCore.BuildTools -{ -#if SDK - public class Sdk_WaitForDebugger : Task, ICancelableTask -#elif BuildTools - public class WaitForDebugger : Task -#else -#error This must be built either for an SDK or for BuildTools -#endif - { - private bool _canceled; - - public void Cancel() - { - _canceled = true; - } - - public override bool Execute() - { - Log.LogMessage(MessageImportance.High, $"Waiting for debugger. Process ID: {Process.GetCurrentProcess().Id}"); - - // 30 seconds - var maxTimeout = 30 * 1000; - var step = 150; - - while (!Debugger.IsAttached && maxTimeout > 0 && !_canceled) - { - Thread.Sleep(step); - maxTimeout -= step; - } - - if (!Debugger.IsAttached && !_canceled) - { - Log.LogMessage(MessageImportance.High, "Waiting for debugger timed out. Continuing execution."); - } - - return true; - } - } -} diff --git a/modules/BuildTools.Tasks/module.targets b/modules/BuildTools.Tasks/module.targets index 23e030a25..826fbb7f7 100644 --- a/modules/BuildTools.Tasks/module.targets +++ b/modules/BuildTools.Tasks/module.targets @@ -1,9 +1,5 @@ - - $(PrepareDependsOn);_UseVolatileFeed - - - - <_UpdateFeeds Include="ARTIFACTS" Value="$(NUGET_VOLATILE_FEED_ARTIFACTS)" Condition="'$(NUGET_VOLATILE_FEED_ARTIFACTS)' != ''" /> - <_UpdateFeeds Include="AspNetCore" Value="$(NUGET_VOLATILE_FEED_AspNetCore)" Condition="'$(NUGET_VOLATILE_FEED_AspNetCore)' != ''" /> - - - - - - diff --git a/modules/BundledPackages/BundledPackages.proj b/modules/BundledPackages/BundledPackages.proj deleted file mode 100644 index 6de9f34ef..000000000 --- a/modules/BundledPackages/BundledPackages.proj +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - false - false - - - - - - netcoreapp3.0 - true - - - - - - - -]]> - - - - - - - - - diff --git a/modules/BundledPackages/NuGet.config b/modules/BundledPackages/NuGet.config deleted file mode 100644 index b34426546..000000000 --- a/modules/BundledPackages/NuGet.config +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/modules/KoreBuild.Tasks/CheckPackageReferences.cs b/modules/KoreBuild.Tasks/CheckPackageReferences.cs deleted file mode 100644 index c99d5dd26..000000000 --- a/modules/KoreBuild.Tasks/CheckPackageReferences.cs +++ /dev/null @@ -1,150 +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.Collections.Generic; -using System.IO; -using System.Linq; -using KoreBuild.Tasks.ProjectModel; -using KoreBuild.Tasks.Utilities; -using Microsoft.AspNetCore.BuildTools; -using Microsoft.Build.Construction; -using Microsoft.Build.Exceptions; -using Microsoft.Build.Framework; -using NuGet.Versioning; - -namespace KoreBuild.Tasks -{ - /// - /// Ensures MSBuild files use PackageReference responsibly. - /// - public class CheckPackageReferences : Microsoft.Build.Utilities.Task - { - /// - /// The solutions of csproj files to check. - /// - [Required] - public ITaskItem[] Projects { get; set; } - - /// - /// The file that contains the PropertyGroup of versions - /// - [Required] - public string DependenciesFile { get; set; } - - public string[] Properties { get; set; } - - public override bool Execute() - { - if (Projects == null || Projects.Length == 0) - { - Log.LogMessage(MessageImportance.Low, "No projects or solutions were found. Skipping PackageReference validation."); - return true; - } - - if (!File.Exists(DependenciesFile)) - { - Log.LogKoreBuildError(KoreBuildErrors.DependenciesFileDoesNotExist, $"Expected the dependencies file to exist at {DependenciesFile}"); - return false; - } - - if (!DependencyVersionsFile.TryLoad(DependenciesFile, out var depsFile)) - { - Log.LogError($"Could not load the dependencies file from {DependenciesFile}"); - return false; - } - - if (!depsFile.HasVersionsPropertyGroup) - { - Log.LogKoreBuildWarning(KoreBuildErrors.PackageRefPropertyGroupNotFound, $"No PropertyGroup with Label=\"{DependencyVersionsFile.PackageVersionsLabel}\" or Label=\"{DependencyVersionsFile.AutoPackageVersionsLabel}\" could be found in {DependenciesFile}"); - } - - foreach (var proj in Projects) - { - var ext = Path.GetExtension(proj.ItemSpec); - if (ext == ".sln") - { - var solutionProps = MSBuildListSplitter.GetNamedProperties(Properties); - var projectFiles = Projects.SelectMany(p => SolutionInfoFactory.GetProjects(p, solutionProps)).Distinct(); - foreach (var project in projectFiles) - { - VerifyPackageReferences(project, depsFile.VersionVariables); - } - } - else - { - VerifyPackageReferences(proj.ItemSpec, depsFile.VersionVariables); - } - } - - return !Log.HasLoggedErrors; - } - - private void VerifyPackageReferences(string filePath, IReadOnlyDictionary versionVariables) - { - ProjectRootElement doc; - try - { - doc = ProjectRootElement.Open(filePath); - } - catch (InvalidProjectFileException ex) - { - Log.LogError(null, null, null, filePath, 0, 0, 0, 0, message: "Invalid project file: " + ex.Message); - return; - } - - var packageReferences = doc.Items.Where(i => i.ItemType == "PackageReference"); - foreach (var pkgRef in packageReferences) - { - var id = pkgRef.Include; - - if (string.IsNullOrEmpty(id)) - { - // this node is an Update or Remove node - continue; - } - - var versionMetadata = pkgRef.Metadata.LastOrDefault(m => m.Name == "Version"); - var versionRaw = versionMetadata?.Value; - if (versionMetadata == null || string.IsNullOrEmpty(versionRaw)) - { - Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.PackageReferenceDoesNotHaveVersion, $"PackageReference to {id} does not define a Version"); - continue; - } - - var versionIsVariable = - versionRaw != null - && versionRaw.Length > 3 - && versionRaw[0] == '$' - && versionRaw[1] == '(' - && versionRaw[versionRaw.Length - 1] == ')' - && versionRaw.IndexOf(')') == versionRaw.Length - 1; - - if (!versionIsVariable) - { - Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.PackageRefHasLiteralVersion, "PackageReference must use an MSBuild variable to set the version."); - continue; - } - - var versionVarName = versionRaw.Substring(2, versionRaw.Length - 3); - - if (!versionVariables.TryGetValue(versionVarName, out var variable)) - { - Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.VariableNotFoundInDependenciesPropsFile, $"The variable {versionRaw} could not be found in {DependenciesFile}"); - continue; - } - - var versionValue = variable.Version; - if (!VersionRange.TryParse(versionValue, out var nugetVersion)) - { - Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.InvalidPackageVersion, $"PackageReference to {id} has an invalid version identifier: '{versionValue}'"); - continue; - } - - if (nugetVersion.IsFloating) - { - Log.LogKoreBuildError(pkgRef.Location.File, pkgRef.Location.Line, KoreBuildErrors.PackageRefHasFloatingVersion, $"PackageReference to {id} uses a floating version: '{versionValue}'"); - } - } - } - } -} diff --git a/modules/KoreBuild.Tasks/CodeSign.props b/modules/KoreBuild.Tasks/CodeSign.props index 9ed3e61b3..fed0d924f 100644 --- a/modules/KoreBuild.Tasks/CodeSign.props +++ b/modules/KoreBuild.Tasks/CodeSign.props @@ -21,7 +21,7 @@ true - + diff --git a/modules/KoreBuild.Tasks/DisableSkipStrongName.cs b/modules/KoreBuild.Tasks/DisableSkipStrongName.cs deleted file mode 100644 index acb0d2345..000000000 --- a/modules/KoreBuild.Tasks/DisableSkipStrongName.cs +++ /dev/null @@ -1,70 +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 KoreBuild.Tasks.SkipStrongNames; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using Microsoft.Win32; - -namespace KoreBuild.Tasks -{ - public class DisableSkipStrongName : Task - { - [Required] - public string XmlFile { get; set; } - - public override bool Execute() - { - var configuration = new StrongNameConfiguration(AssembliesFile.Read(XmlFile)); - - return SkipDisable(configuration); - } - - private bool SkipDisable(StrongNameConfiguration configuration) - { - bool printedHeader = false; - - foreach (RegistrySection section in WindowsRegistry.Sections) - { - using (RegistryKey registryKey = WindowsRegistry.CreateWritableVerificationRegistryKey(section)) - { - if (registryKey == null) - { - Log.LogError($"Unable to open writable verification registry key for {section}."); - return false; - } - - foreach (var assembly in configuration.FilteredAssemblySpecifications[section]) - { - RegistryKey subKey = registryKey.OpenSubKey(assembly); - - if (subKey != null) - { - if (!printedHeader) - { - printedHeader = true; - Log.LogMessage("Deleting registry entries:"); - } - - Log.LogMessage($" {registryKey}\\{assembly}"); - subKey.Dispose(); - registryKey.DeleteSubKeyTree(assembly); - } - } - } - } - - if (!printedHeader) - { - Log.LogMessage("Skip Strong Names is already disabled."); - } - else - { - Log.LogMessage(""); - Log.LogMessage("Skip Strong Names was successfully disabled."); - } - - return true; - } - } -} diff --git a/modules/KoreBuild.Tasks/DownloadNuGetPackages.cs b/modules/KoreBuild.Tasks/DownloadNuGetPackages.cs deleted file mode 100644 index e69cb71f1..000000000 --- a/modules/KoreBuild.Tasks/DownloadNuGetPackages.cs +++ /dev/null @@ -1,131 +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.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using NuGet.Build; -using NuGet.Packaging.Core; -using NuGet.Versioning; - -namespace KoreBuild.Tasks -{ - /// - /// Downloads NuGet packages in parallel. - /// - public class DownloadNuGetPackages : Microsoft.Build.Utilities.Task, ICancelableTask - { - private readonly CancellationTokenSource _cts = new CancellationTokenSource(); - - /// - /// The NuGet packages to download. Expected form: - /// - /// ItemSpec = PackageID - /// - /// Metadata: - /// Version = the exact package version to download - /// Source = the NuGet feed (remote or folder) - /// - [Required] - public ITaskItem[] Packages { get; set; } - - /// - /// The directory for download NuGet files. The task will write files to $(DestinationFolder)/$(PackageId.ToLower()).$(Version).nupkg - /// - [Required] - public string DestinationFolder { get; set; } - - /// - /// The package files that were downloaded. - /// - [Output] - public ITaskItem[] Files { get; set; } - - /// - /// The maximum amount of time to allow for downloading packages. - /// - public int TimeoutSeconds { get; set; } = 60 * 5; - - public void Cancel() => _cts.Cancel(); - - public override bool Execute() - { - return ExecuteAsync().Result; - } - - public async Task ExecuteAsync() - { - DestinationFolder = DestinationFolder.Replace('\\', '/'); - - var requests = new List(); - var files = new List(); - var downloadCount = 0; - foreach (var item in Packages) - { - var id = item.ItemSpec; - var rawVersion = item.GetMetadata("Version"); - if (!NuGetVersion.TryParse(rawVersion, out var version)) - { - Log.LogError($"Package '{id}' has an invalid 'Version' metadata value: '{rawVersion}'."); - return false; - } - - var source = item.GetMetadata("Source"); - if (string.IsNullOrEmpty(source)) - { - Log.LogError($"Package '{id}' is missing the 'Source' metadata value."); - return false; - } - - var outputPath = Path.Combine(DestinationFolder, $"{id.ToLowerInvariant()}.{version.ToNormalizedString()}.nupkg"); - - files.Add(new TaskItem(outputPath)); - if (File.Exists(outputPath)) - { - Log.LogMessage($"Skipping {id} {version}. Already exists in '{outputPath}'"); - continue; - } - else - { - downloadCount++; - - var request = new PackageDownloadRequest - { - Identity = new PackageIdentity(id, version), - OutputPath = outputPath, - Sources = source.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries), - }; - - requests.Add(request); - } - } - - Files = files.ToArray(); - - if (downloadCount == 0) - { - Log.LogMessage("All packages are downloaded."); - return true; - } - - Directory.CreateDirectory(DestinationFolder); - var logger = new MSBuildLogger(Log); - var timeout = TimeSpan.FromSeconds(TimeoutSeconds); - var downloader = new PackageDownloader(logger); - var timer = Stopwatch.StartNew(); - - var result = await downloader.DownloadPackagesAsync(requests, timeout, _cts.Token); - - timer.Stop(); - logger.LogMinimal($"Finished downloading {requests.Count} package(s) in {timer.ElapsedMilliseconds}ms"); - return result; - } - } -} diff --git a/modules/KoreBuild.Tasks/EnableSkipStrongName.cs b/modules/KoreBuild.Tasks/EnableSkipStrongName.cs deleted file mode 100644 index 53ffd31ce..000000000 --- a/modules/KoreBuild.Tasks/EnableSkipStrongName.cs +++ /dev/null @@ -1,84 +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 System.Runtime.InteropServices; -using KoreBuild.Tasks.SkipStrongNames; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using Microsoft.Win32; - -namespace KoreBuild.Tasks -{ - public class EnableSkipStrongName : Task - { - [Required] - public string XmlFile { get; set; } - - public override bool Execute() - { - var configuration = new StrongNameConfiguration(AssembliesFile.Read(XmlFile)); - - return SkipEnable(configuration); - } - - private bool SkipEnable(StrongNameConfiguration configuration) - { - if (!File.Exists(XmlFile)) - { - Log.LogError("The XmlFile given must exist."); - return false; - } - - if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - Log.LogError("Strongname tasks should only be run on Windows."); - return false; - } - - bool printedHeader = false; - - foreach (RegistrySection section in WindowsRegistry.Sections) - { - using (RegistryKey registryKey = WindowsRegistry.CreateWritableVerificationRegistryKey(section)) - { - if (registryKey == null) - { - Log.LogError($"Unable to open writable verification registry key for {section}."); - return false; - } - - foreach (var assembly in configuration.FilteredAssemblySpecifications[section]) - { - using (RegistryKey subKey = registryKey.OpenSubKey(assembly)) - { - if (subKey == null) - { - if (!printedHeader) - { - printedHeader = true; - Log.LogMessage("Adding registry entries:"); - } - - Log.LogMessage($" {registryKey}\\{assembly}"); - registryKey.CreateSubKey(assembly); - } - } - } - } - } - - if (!printedHeader) - { - Log.LogMessage("Skip Strong Names is already enabled."); - } - else - { - Log.LogMessage(""); - Log.LogMessage("Skip Strong Names was successfully enabled."); - } - - return true; - } - } -} diff --git a/modules/KoreBuild.Tasks/GenerateDependenciesPropsFile.cs b/modules/KoreBuild.Tasks/GenerateDependenciesPropsFile.cs deleted file mode 100644 index 149fc5b8d..000000000 --- a/modules/KoreBuild.Tasks/GenerateDependenciesPropsFile.cs +++ /dev/null @@ -1,158 +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; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using KoreBuild.Tasks.ProjectModel; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Construction; -using Microsoft.Build.Evaluation; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace KoreBuild.Tasks -{ - /// - /// Generates the build/dependencies.props file base on your current project, - /// and updates all PackageReferences in and to use MSBuild variables. - /// - public class GenerateDependenciesPropsFile : Microsoft.Build.Utilities.Task, ICancelableTask - { - private readonly CancellationTokenSource _cts = new CancellationTokenSource(); - - /// - /// The projects to update - /// - [Required] - public ITaskItem[] Projects { get; set; } - - /// - /// other files to update that may have PackageReferences in them - /// - public ITaskItem[] OtherImports { get; set; } - - /// - /// Location of the dependenices.props file - /// - [Required] - public string DependenciesFile { get; set; } - - /// - /// Additional properties to use when evaluating the projects - /// - public string[] Properties { get; set; } - - public void Cancel() - { - _cts.Cancel(); - } - - public override bool Execute() - { - var unifiedPackageList = new Dictionary(StringComparer.OrdinalIgnoreCase); - - var projects = new ProjectInfoFactory(Log).CreateMany(Projects, Properties, false, _cts.Token); - var packageRefs = projects.SelectMany(p => p.Frameworks).SelectMany(f => f.Dependencies); - - foreach (var packageRef in packageRefs) - { - if (packageRef.Value.IsImplicitlyDefined) - { - // skip PackageReferences added by the SDK - continue; - } - - if (packageRef.Value.NoWarn.Contains(KoreBuildErrors.Prefix + KoreBuildErrors.ConflictingPackageReferenceVersions)) - { - // Make it possible to suppress version conflicts while generating this file. - continue; - } - - if (unifiedPackageList.TryGetValue(packageRef.Value.Id, out var other)) - { - if (other.Version != packageRef.Value.Version) - { - Log.LogKoreBuildError(KoreBuildErrors.ConflictingPackageReferenceVersions, $"Conflicting dependency versions for {packageRef.Value.Id}: {other.Project.FileName} references '{other.Version}' but {packageRef.Value.Project.FileName} references '{packageRef.Value.Version}'"); - } - } - else - { - unifiedPackageList.Add(packageRef.Value.Id, packageRef.Value); - Log.LogMessage(MessageImportance.Low, $"Found {packageRef.Value.Id} = {packageRef.Value.Version}"); - } - } - - if (Log.HasLoggedErrors) - { - return false; - } - - var items = unifiedPackageList.Values.Select(p => new TaskItem(p.Id, new Hashtable { ["Version"] = p.Version })).ToArray(); - - var task = new GeneratePackageVersionPropsFile - { - AddOverrideImport = true, - SuppressVariableLabels = true, - Packages = items, - BuildEngine = BuildEngine, - HostObject = HostObject, - OutputPath = DependenciesFile, - }; - - if (!task.Execute()) - { - return false; - } - - var otherImports = OtherImports != null - ? OtherImports.Select(p => p.ItemSpec) - : Array.Empty(); - - foreach (var proj in projects.Select(p => p.FullPath).Concat(otherImports)) - { - var project = ProjectRootElement.Open(proj, ProjectCollection.GlobalProjectCollection, preserveFormatting: true); - var changed = false; - foreach (var item in project.Items.Where(i => i.ItemType == "PackageReference")) - { - var noWarn = item.Metadata.FirstOrDefault(m => m.Name == "NoWarn"); - if (noWarn != null && noWarn.Value.Contains(KoreBuildErrors.Prefix + KoreBuildErrors.ConflictingPackageReferenceVersions)) - { - continue; - } - - var versionMetadata = item.Metadata.LastOrDefault(p => p.Name == "Version"); - if (versionMetadata != null && versionMetadata.Value.StartsWith("$(")) - { - continue; - } - changed = true; - - var varName = $"$({DependencyVersionsFile.GetVariableName(item.Include)})"; - if (versionMetadata == null) - { - item.AddMetadata("Version", varName, expressAsAttribute: true); - } - else - { - versionMetadata.Value = varName; - } - } - - if (changed) - { - Log.LogMessage(MessageImportance.High, $"Updated {proj}"); - project.Save(proj); - } - else - { - Log.LogMessage(MessageImportance.Normal, $"Skipping {proj}. Already up to date."); - } - } - - return !Log.HasLoggedErrors; - } - } -} diff --git a/modules/KoreBuild.Tasks/GeneratePackageVersionPropsFile.cs b/modules/KoreBuild.Tasks/GeneratePackageVersionPropsFile.cs deleted file mode 100644 index 38c34cf15..000000000 --- a/modules/KoreBuild.Tasks/GeneratePackageVersionPropsFile.cs +++ /dev/null @@ -1,91 +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.IO; -using System.Text; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace KoreBuild.Tasks -{ - public class GeneratePackageVersionPropsFile : Task - { - [Required] - public ITaskItem[] Packages { get; set; } - - [Required] - public string OutputPath { get; set; } - - public bool AddOverrideImport { get; set; } - - public string[] AdditionalImports { get; set; } - - public bool SuppressVariableLabels { get; set; } - - public override bool Execute() - { - OutputPath = OutputPath.Replace('\\', '/'); - Directory.CreateDirectory(Path.GetDirectoryName(OutputPath)); - - DependencyVersionsFile depsFile; - if (File.Exists(OutputPath)) - { - if (!DependencyVersionsFile.TryLoad(OutputPath, out depsFile)) - { - depsFile = DependencyVersionsFile.Create(AddOverrideImport, AdditionalImports); - Log.LogWarning($"Could not load the existing deps file from {OutputPath}. This file will be overwritten."); - } - } - else - { - depsFile = DependencyVersionsFile.Create(AddOverrideImport, AdditionalImports); - } - - var varNames = new HashSet(); - foreach (var pkg in Packages) - { - var packageVersion = pkg.GetMetadata("Version"); - - if (string.IsNullOrEmpty(packageVersion)) - { - Log.LogError("Package {0} is missing the Version metadata", pkg.ItemSpec); - continue; - } - - string packageVarName; - if (!string.IsNullOrEmpty(pkg.GetMetadata("VariableName"))) - { - packageVarName = pkg.GetMetadata("VariableName"); - if (!packageVarName.EndsWith("Version", StringComparison.Ordinal)) - { - Log.LogError("VariableName for {0} must end in 'Version'", pkg.ItemSpec); - continue; - } - } - else - { - packageVarName = DependencyVersionsFile.GetVariableName(pkg.ItemSpec); - } - - if (varNames.Contains(packageVarName)) - { - Log.LogError("Multiple packages would produce {0} in the generated dependencies.props file. Set VariableName to differentiate the packages manually", packageVarName); - continue; - } - - var item = depsFile.Update(packageVarName, packageVersion); - if (!SuppressVariableLabels) - { - item.SetLabel(pkg.ItemSpec); - } - } - - depsFile.Save(OutputPath); - Log.LogMessage(MessageImportance.Normal, $"Generated {OutputPath}"); - return !Log.HasLoggedErrors; - } - } -} diff --git a/modules/KoreBuild.Tasks/InstallToolsets.cs b/modules/KoreBuild.Tasks/InstallToolsets.cs deleted file mode 100644 index 079751513..000000000 --- a/modules/KoreBuild.Tasks/InstallToolsets.cs +++ /dev/null @@ -1,175 +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.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Runtime.InteropServices; -using System.Threading.Tasks; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Framework; -using Microsoft.Extensions.CommandLineUtils; - -namespace KoreBuild.Tasks -{ - /// - /// Installs toolset information as listed in korebuild.json - /// - public class InstallToolsets : Microsoft.Build.Utilities.Task - { - /// - /// The path to the korebuild.json file. - /// - [Required] - public string ConfigFile { get; set; } - - /// - /// Whether to install toolsets with or without user interation. - /// It will default prompting users to confirm and see installation steps. - /// - public bool QuietVSInstallation { get; set; } - - /// - /// Whether to upgrade existing toolsets. - /// It will default to only adding tools that were not previously installed. - /// - public bool UpgradeVSInstallation { get; set; } - - /// - /// Specifies what version of VS to install. - /// Defaults to Enterprise. - /// - public string VSProductVersionType { get; set; } = "Enterprise"; - - public override bool Execute() - { - return ExecuteAsync().GetAwaiter().GetResult(); - } - - public async Task ExecuteAsync() - { - if (!File.Exists(ConfigFile)) - { - Log.LogError($"Could not load the korebuild config file from '{ConfigFile}'"); - return false; - } - - var settings = KoreBuildSettings.Load(ConfigFile); - - if (settings?.Toolsets == null) - { - Log.LogMessage(MessageImportance.Normal, "No recognized toolsets specified."); - return true; - } - - foreach (var toolset in settings.Toolsets) - { - switch (toolset) - { - case KoreBuildSettings.VisualStudioToolset vs: - await InstallVsComponents(vs); - break; - // TODO support NodeJSToolset - default: - Log.LogWarning("Toolset checks not implemented for " + toolset.GetType().Name); - break; - } - } - - return !Log.HasLoggedErrors; - } - - private async Task InstallVsComponents(KoreBuildSettings.VisualStudioToolset vsToolset) - { - if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - if ((vsToolset.Required & ~KoreBuildSettings.RequiredPlatforms.Windows) != 0) - { - Log.LogError("Visual Studio is not available on non-Windows. Change korebuild.json to 'required: [\"windows\"]'."); - } - else - { - Log.LogMessage(MessageImportance.Low, "Skipping Visual Studio verification on non-Windows platforms."); - } - return; - } - - // Update the vs installation based on the product version specified. - var vs = VsWhere.FindLatestInstallation(includePrerelease: true, vsProductVersion: VSProductVersionType, log: Log); - - if (vs != null) - { - Log.LogMessage($"Found vs installation located at {vs.InstallationPath}"); - } - else - { - Log.LogMessage($"No vs installation found."); - } - - var vsExePath = await VsInstallerHelper.DownloadVsExe(Log, VSProductVersionType); - var vsJsonFilePath = VsInstallerHelper.CreateVsFileFromRequiredToolset(vsToolset, Log, VSProductVersionType); - - var args = GetVisualStudioArgs(vs, vsJsonFilePath); - - StartVsExe(vsExePath, args); - - // Cleanup temp files created. - try - { - File.Delete(vsExePath); - File.Delete(vsJsonFilePath); - } - catch (IOException ioe) - { - Log.LogWarning($"Could not delete vs installation files in temp directory: {ioe.Message}."); - } - - return; - } - - private string GetVisualStudioArgs(VsInstallation vs, string vsJsonFilePath) - { - var args = new List(); - - if (vs != null) - { - if (UpgradeVSInstallation) - { - args.Add("upgrade"); - } - else - { - args.Add("modify"); - } - args.Add("--installPath"); - args.Add($"{vs.InstallationPath}"); - } - - args.Add("--in"); - args.Add($"{vsJsonFilePath}"); - args.Add("--wait"); - args.Add("--norestart"); - - if (QuietVSInstallation) - { - args.Add("--quiet"); - } - return ArgumentEscaper.EscapeAndConcatenate(args); - } - - private void StartVsExe(string vsExePath, string args) - { - var psi = new ProcessStartInfo - { - FileName = vsExePath, - Arguments = args - }; - - Log.LogMessage($"Calling: {psi.FileName} {psi.Arguments}"); - - var process = Process.Start(psi); - - process.WaitForExit(); - } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/HashHelper.cs b/modules/KoreBuild.Tasks/Internal/HashHelper.cs deleted file mode 100644 index 0973cf812..000000000 --- a/modules/KoreBuild.Tasks/Internal/HashHelper.cs +++ /dev/null @@ -1,45 +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.IO; -using System.Security.Cryptography; -using System.Text; - -namespace KoreBuild.Tasks -{ - internal class HashHelper - { - public static string GetFileHash(string algorithmName, string filePath) - { - byte[] hash; - using (var stream = File.OpenRead(filePath)) - { - HashAlgorithm algorithm; - switch (algorithmName.ToUpperInvariant()) - { - case "SHA256": - algorithm = new SHA256Managed(); - break; - case "SHA384": - algorithm = new SHA384Managed(); - break; - case "SHA512": - algorithm = new SHA512Managed(); - break; - default: - throw new ArgumentOutOfRangeException($"Unsupported hash algoritm {algorithmName}", nameof(algorithm)); - } - hash = algorithm.ComputeHash(stream); - } - - var sb = new StringBuilder(); - foreach (var b in hash) - { - sb.AppendFormat("{0:X2}", b); - } - - return sb.ToString(); - } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/MSBuildLogger.cs b/modules/KoreBuild.Tasks/Internal/MSBuildLogger.cs deleted file mode 100644 index 458bd698d..000000000 --- a/modules/KoreBuild.Tasks/Internal/MSBuildLogger.cs +++ /dev/null @@ -1,200 +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 Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using NuGet.Common; - -namespace NuGet.Build -{ - /// - /// TaskLoggingHelper -> ILogger - /// - internal class MSBuildLogger : LoggerBase, Common.ILogger - { - private readonly TaskLoggingHelper _taskLogging; - - private delegate void LogMessageWithDetails(string subcategory, - string code, - string helpKeyword, - string file, - int lineNumber, - int columnNumber, - int endLineNumber, - int endColumnNumber, - MessageImportance importance, - string message, - params object[] messageArgs); - - private delegate void LogErrorWithDetails(string subcategory, - string code, - string helpKeyword, - string file, - int lineNumber, - int columnNumber, - int endLineNumber, - int endColumnNumber, - string message, - params object[] messageArgs); - - private delegate void LogMessageAsString(MessageImportance importance, - string message, - params object[] messageArgs); - - private delegate void LogErrorAsString(string message, - params object[] messageArgs); - - public MSBuildLogger(TaskLoggingHelper taskLogging) - { - _taskLogging = taskLogging ?? throw new ArgumentNullException(nameof(taskLogging)); - } - - public override void Log(ILogMessage message) - { - if (DisplayMessage(message.Level)) - { - if (RuntimeEnvironmentHelper.IsMono) - { - LogForMono(message); - return; - } - else - { - var logMessage = message as IRestoreLogMessage; - - if (logMessage == null) - { - logMessage = new RestoreLogMessage(message.Level, message.Message) - { - Code = message.Code, - FilePath = message.ProjectPath - }; - } - LogForNonMono(logMessage); - } - } - } - - /// - /// Log using with metadata for non mono platforms. - /// - private void LogForNonMono(IRestoreLogMessage message) - { - switch (message.Level) - { - case LogLevel.Error: - LogError(message, _taskLogging.LogError, _taskLogging.LogError); - break; - - case LogLevel.Warning: - LogError(message, _taskLogging.LogWarning, _taskLogging.LogWarning); - break; - - case LogLevel.Minimal: - LogMessage(message, MessageImportance.High, _taskLogging.LogMessage, _taskLogging.LogMessage); - break; - - case LogLevel.Information: - LogMessage(message, MessageImportance.Normal, _taskLogging.LogMessage, _taskLogging.LogMessage); - break; - - case LogLevel.Debug: - case LogLevel.Verbose: - default: - // Default to LogLevel.Debug and low importance - LogMessage(message, MessageImportance.Low, _taskLogging.LogMessage, _taskLogging.LogMessage); - break; - } - } - - /// - /// Log using basic methods to avoid missing methods on mono. - /// - private void LogForMono(ILogMessage message) - { - switch (message.Level) - { - case LogLevel.Error: - _taskLogging.LogError(message.Message); - break; - - case LogLevel.Warning: - _taskLogging.LogWarning(message.Message); - break; - - case LogLevel.Minimal: - _taskLogging.LogMessage(MessageImportance.High, message.Message); - break; - - case LogLevel.Information: - _taskLogging.LogMessage(MessageImportance.Normal, message.Message); - break; - - case LogLevel.Debug: - case LogLevel.Verbose: - default: - // Default to LogLevel.Debug and low importance - _taskLogging.LogMessage(MessageImportance.Low, message.Message); - break; - } - - return; - } - - private void LogMessage(IRestoreLogMessage logMessage, - MessageImportance importance, - LogMessageWithDetails logWithDetails, - LogMessageAsString logAsString) - { - if (logMessage.Code > NuGetLogCode.Undefined) - { - // NuGet does not currently have a subcategory while throwing logs, hence string.Empty - logWithDetails(string.Empty, - Enum.GetName(typeof(NuGetLogCode), logMessage.Code), - Enum.GetName(typeof(NuGetLogCode), logMessage.Code), - logMessage.FilePath, - logMessage.StartLineNumber, - logMessage.StartColumnNumber, - logMessage.EndLineNumber, - logMessage.EndColumnNumber, - importance, - logMessage.Message); - } - else - { - logAsString(importance, logMessage.Message); - } - } - - private void LogError(IRestoreLogMessage logMessage, - LogErrorWithDetails logWithDetails, - LogErrorAsString logAsString) - { - if (logMessage.Code > NuGetLogCode.Undefined) - { - // NuGet does not currently have a subcategory while throwing logs, hence string.Empty - logWithDetails(string.Empty, - Enum.GetName(typeof(NuGetLogCode), logMessage.Code), - Enum.GetName(typeof(NuGetLogCode), logMessage.Code), - logMessage.FilePath, - logMessage.StartLineNumber, - logMessage.StartColumnNumber, - logMessage.EndLineNumber, - logMessage.EndColumnNumber, - logMessage.Message); - } - else - { - logAsString(logMessage.Message); - } - } - - public override System.Threading.Tasks.Task LogAsync(ILogMessage message) - { - Log(message); - - return System.Threading.Tasks.Task.FromResult(0); - } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/PackageInfo.cs b/modules/KoreBuild.Tasks/Internal/PackageInfo.cs deleted file mode 100644 index b976aabfa..000000000 --- a/modules/KoreBuild.Tasks/Internal/PackageInfo.cs +++ /dev/null @@ -1,19 +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 NuGet.Packaging.Core; - -namespace KoreBuild.Tasks.Internal -{ - public class PackageInfo - { - public PackageIdentity Identity { get; set; } - - public string PackagePath { get; set; } - - public override string ToString() - { - return Identity.ToString(); - } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/DotNetCliReferenceInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/DotNetCliReferenceInfo.cs deleted file mode 100644 index d4a9712fd..000000000 --- a/modules/KoreBuild.Tasks/Internal/ProjectModel/DotNetCliReferenceInfo.cs +++ /dev/null @@ -1,24 +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; - -namespace KoreBuild.Tasks.ProjectModel -{ - internal class DotNetCliReferenceInfo - { - public DotNetCliReferenceInfo(string id, string version) - { - if (string.IsNullOrEmpty(id)) - { - throw new ArgumentException(nameof(id)); - } - - Id = id; - Version = version; - } - - public string Id { get; } - public string Version { get; } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/PackageReferenceInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/PackageReferenceInfo.cs deleted file mode 100644 index 63a9edde8..000000000 --- a/modules/KoreBuild.Tasks/Internal/ProjectModel/PackageReferenceInfo.cs +++ /dev/null @@ -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; -using System.Collections.Generic; - -namespace KoreBuild.Tasks.ProjectModel -{ - internal class PackageReferenceInfo - { - public PackageReferenceInfo(string id, string version, bool isImplicitlyDefined, IReadOnlyList noWarn) - { - if (string.IsNullOrEmpty(id)) - { - throw new ArgumentException(nameof(id)); - } - - Id = id; - Version = version; - IsImplicitlyDefined = isImplicitlyDefined; - NoWarn = noWarn; - } - - public string Id { get; } - public string Version { get; } - public bool IsImplicitlyDefined { get; } - public IReadOnlyList NoWarn { get; } - public ProjectInfo Project { get; internal set; } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectFrameworkInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectFrameworkInfo.cs deleted file mode 100644 index ee0f9d3db..000000000 --- a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectFrameworkInfo.cs +++ /dev/null @@ -1,22 +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 NuGet.Frameworks; - -namespace KoreBuild.Tasks.ProjectModel -{ - internal class ProjectFrameworkInfo - { - public ProjectFrameworkInfo(NuGetFramework targetFramework, IReadOnlyDictionary dependencies) - { - TargetFramework = targetFramework ?? throw new ArgumentNullException(nameof(targetFramework)); - Dependencies = dependencies ?? throw new ArgumentNullException(nameof(dependencies)); - } - - public NuGetFramework TargetFramework { get; } - public IReadOnlyDictionary Dependencies { get; } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfo.cs deleted file mode 100644 index 95dc0780f..000000000 --- a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfo.cs +++ /dev/null @@ -1,45 +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.IO; -using System.Linq; - -namespace KoreBuild.Tasks.ProjectModel -{ - internal class ProjectInfo - { - public ProjectInfo(string fullPath, - string projectExtensionsPath, - IReadOnlyList frameworks, - IReadOnlyList tools) - { - if (!Path.IsPathRooted(fullPath)) - { - throw new ArgumentException("Path must be absolute", nameof(fullPath)); - } - - Frameworks = frameworks ?? throw new ArgumentNullException(nameof(frameworks)); - Tools = tools ?? throw new ArgumentNullException(nameof(tools)); - - FullPath = fullPath; - FileName = Path.GetFileName(fullPath); - Directory = Path.GetDirectoryName(FullPath); - ProjectExtensionsPath = projectExtensionsPath ?? Path.Combine(Directory, "obj"); - - foreach (var dep in frameworks.SelectMany(f => f.Dependencies)) - { - dep.Value.Project = this; - } - } - - public string FullPath { get; } - public string FileName { get; } - public string ProjectExtensionsPath { get; } - public string Directory { get; } - - public IReadOnlyList Frameworks { get; } - public IReadOnlyList Tools { get; } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfoFactory.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfoFactory.cs deleted file mode 100644 index 65e5879dc..000000000 --- a/modules/KoreBuild.Tasks/Internal/ProjectModel/ProjectInfoFactory.cs +++ /dev/null @@ -1,166 +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.Concurrent; -using System.Collections.Generic; -using System.Diagnostics; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.BuildTools; -using Microsoft.Build.Construction; -using Microsoft.Build.Evaluation; -using Microsoft.Build.Execution; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using NuGet.Frameworks; - -namespace KoreBuild.Tasks.ProjectModel -{ - internal class ProjectInfoFactory - { - private readonly TaskLoggingHelper _logger; - - public ProjectInfoFactory(TaskLoggingHelper logger) - { - _logger = logger ?? throw new ArgumentNullException(nameof(logger)); - } - - public IReadOnlyList CreateMany(ITaskItem[] projectItems, string[] properties, bool policyDesignBuild, CancellationToken token) - { - if (projectItems == null) - { - return Array.Empty(); - } - - var cts = new CancellationTokenSource(); - token.Register(() => cts.Cancel()); - var solutionProps = MSBuildListSplitter.GetNamedProperties(properties); - var projectFiles = projectItems.SelectMany(p => SolutionInfoFactory.GetProjects(p, solutionProps)).Distinct(); - var projects = new ConcurrentBag(); - var stop = Stopwatch.StartNew(); - - Parallel.ForEach(projectFiles, projectFile => - { - if (cts.Token.IsCancellationRequested) - { - return; - } - - try - { - projects.Add(Create(projectFile, policyDesignBuild)); - } - catch (Exception ex) - { - _logger.LogErrorFromException(ex); - cts.Cancel(); - } - }); - - stop.Stop(); - _logger.LogMessage(MessageImportance.Low, $"Finished design-time build in {stop.ElapsedMilliseconds}ms"); - return projects.ToArray(); - } - - public ProjectInfo Create(string path, bool policyDesignBuild) - { - var project = GetProject(path, ProjectCollection.GlobalProjectCollection, policyDesignBuild); - var instance = project.CreateProjectInstance(ProjectInstanceSettings.ImmutableWithFastItemLookup); - var projExtPath = instance.GetPropertyValue("MSBuildProjectExtensionsPath"); - - var targetFrameworks = instance.GetPropertyValue("TargetFrameworks"); - var targetFramework = instance.GetPropertyValue("TargetFramework"); - - var frameworks = new List(); - if (!string.IsNullOrEmpty(targetFrameworks) && string.IsNullOrEmpty(targetFramework)) - { - // multi targeting - foreach (var tfm in targetFrameworks.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries)) - { - project.SetGlobalProperty("TargetFramework", tfm); - var innerBuild = project.CreateProjectInstance(ProjectInstanceSettings.ImmutableWithFastItemLookup); - - var tfmInfo = new ProjectFrameworkInfo(NuGetFramework.Parse(tfm), GetDependencies(innerBuild)); - - frameworks.Add(tfmInfo); - } - - project.RemoveGlobalProperty("TargetFramework"); - } - else if (!string.IsNullOrEmpty(targetFramework)) - { - var tfmInfo = new ProjectFrameworkInfo(NuGetFramework.Parse(targetFramework), GetDependencies(instance)); - - frameworks.Add(tfmInfo); - } - - var projectDir = Path.GetDirectoryName(path); - - var tools = GetTools(instance).ToArray(); - - return new ProjectInfo(path, projExtPath, frameworks, tools); - } - - private static Project GetProject(string path, ProjectCollection projectCollection, bool policyDesignBuild) - { - var projects = projectCollection.GetLoadedProjects(path); - foreach (var proj in projects) - { - if (proj.GetPropertyValue("DesignTimeBuild") == "true") - { - return proj; - } - } - var xml = ProjectRootElement.Open(path, projectCollection); - var globalProps = new Dictionary() - { - ["DesignTimeBuild"] = "true", - }; - if (policyDesignBuild) - { - globalProps["PolicyDesignTimeBuild"] = "true"; - } - var project = new Project(xml, - globalProps, - toolsVersion: "15.0", - projectCollection: projectCollection) - { - IsBuildEnabled = false - }; - return project; - } - - private IReadOnlyDictionary GetDependencies(ProjectInstance project) - { - var references = new Dictionary(StringComparer.OrdinalIgnoreCase); - foreach (var item in project.GetItems("PackageReference")) - { - bool.TryParse(item.GetMetadataValue("IsImplicitlyDefined"), out var isImplicit); - var noWarn = item.GetMetadataValue("NoWarn"); - IReadOnlyList noWarnItems = string.IsNullOrEmpty(noWarn) - ? Array.Empty() - : noWarn.Split(new[] { ';' }, StringSplitOptions.RemoveEmptyEntries); - - var info = new PackageReferenceInfo(item.EvaluatedInclude, item.GetMetadataValue("Version"), isImplicit, noWarnItems); - - if (references.ContainsKey(info.Id)) - { - _logger.LogKoreBuildWarning(project.ProjectFileLocation.File, KoreBuildErrors.DuplicatePackageReference, $"Found a duplicate PackageReference for {info.Id}. Restore results may be unpredictable."); - } - - references[info.Id] = info; - } - - return references; - } - - private static IEnumerable GetTools(ProjectInstance project) - { - return project.GetItems("DotNetCliToolReference").Select(item => - new DotNetCliReferenceInfo(item.EvaluatedInclude, item.GetMetadataValue("Version"))); - } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfo.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfo.cs deleted file mode 100644 index d968438cb..000000000 --- a/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfo.cs +++ /dev/null @@ -1,26 +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; - -namespace KoreBuild.Tasks.ProjectModel -{ - internal class SolutionInfo - { - public SolutionInfo(string fullPath, IReadOnlyList projects) - { - if (string.IsNullOrEmpty(fullPath)) - { - throw new ArgumentException(nameof(fullPath)); - } - - FullPath = fullPath; - Projects = projects ?? throw new ArgumentNullException(nameof(projects)); - } - - public string FullPath { get; } - - public IReadOnlyList Projects { get; } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfoFactory.cs b/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfoFactory.cs deleted file mode 100644 index 18d2a2550..000000000 --- a/modules/KoreBuild.Tasks/Internal/ProjectModel/SolutionInfoFactory.cs +++ /dev/null @@ -1,73 +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.IO; -using System.Linq; -using Microsoft.AspNetCore.BuildTools; -using Microsoft.Build.Construction; -using Microsoft.Build.Framework; - -namespace KoreBuild.Tasks.ProjectModel -{ - internal class SolutionInfoFactory - { - public static SolutionInfo Create(string filePath, string configName) - { - var sln = SolutionFile.Parse(filePath); - - if (string.IsNullOrEmpty(configName)) - { - configName = sln.GetDefaultConfigurationName(); - } - - var projects = new List(); - - var config = sln.SolutionConfigurations.FirstOrDefault(c => c.ConfigurationName == configName); - if (config == null) - { - throw new InvalidOperationException($"A solution configuration by the name of '{configName}' was not found in '{filePath}'"); - } - - foreach (var project in sln.ProjectsInOrder - .Where(p => - p.ProjectType == SolutionProjectType.KnownToBeMSBuildFormat // skips solution folders - && p.ProjectConfigurations.TryGetValue(config.FullName, out var projectConfig) - && projectConfig.IncludeInBuild)) - { - projects.Add(project.AbsolutePath.Replace('\\', '/')); - } - - return new SolutionInfo(filePath, projects.ToArray()); - } - - public static IEnumerable GetProjects(ITaskItem projectOrSolution, IDictionary solutionProperties) - { - var projectFilePath = projectOrSolution.ItemSpec.Replace('\\', '/'); - - if (Path.GetExtension(projectFilePath).Equals(".sln", StringComparison.OrdinalIgnoreCase)) - { - // prefer the AdditionalProperties metadata as this is what the MSBuild task will use when building solutions - var props = MSBuildListSplitter.GetNamedProperties(projectOrSolution.GetMetadata("AdditionalProperties")); - props.TryGetValue("Configuration", out var config); - - if (config == null) - { - solutionProperties.TryGetValue("Configuration", out config); - } - - var sln = Create(projectFilePath, config); - - foreach (var project in sln.Projects) - { - yield return project; - } - } - else - { - yield return Path.GetFullPath(projectFilePath); - } - } - } -} diff --git a/modules/KoreBuild.Tasks/Internal/SimplePackageInstaller.cs b/modules/KoreBuild.Tasks/Internal/SimplePackageInstaller.cs deleted file mode 100644 index 796c220a6..000000000 --- a/modules/KoreBuild.Tasks/Internal/SimplePackageInstaller.cs +++ /dev/null @@ -1,92 +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.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using NuGet.Commands; -using NuGet.Common; -using NuGet.DependencyResolver; -using NuGet.LibraryModel; -using NuGet.Packaging; -using NuGet.Packaging.Core; -using NuGet.Packaging.Signing; -using NuGet.Protocol.Core.Types; - -namespace KoreBuild.Tasks.Utilities -{ - internal class SimplePackageInstaller - { - private readonly string _packagesDirectory; - private readonly ILogger _logger; - private readonly SourceCacheContext _cacheContext; - private readonly int _maxDegreeOfConcurrency; - - public SimplePackageInstaller(string packageDir, SourceCacheContext cacheContext, bool disableParallel, ILogger logger) - { - _packagesDirectory = packageDir; - _cacheContext = cacheContext; - _logger = logger; - _maxDegreeOfConcurrency = disableParallel ? 1 : 16; - } - - public async Task InstallPackagesAsync(IEnumerable graphs, - HashSet allInstalledPackages, - CancellationToken token) - { - var packagesToInstall = graphs.SelectMany(g => g.Install.Where(match => allInstalledPackages.Add(match.Library))); - if (_maxDegreeOfConcurrency <= 1) - { - foreach (var match in packagesToInstall) - { - await InstallPackageAsync(match, token); - } - } - else - { - var bag = new ConcurrentBag(packagesToInstall); - var tasks = Enumerable.Range(0, _maxDegreeOfConcurrency) - .Select(async _ => - { - while (bag.TryTake(out RemoteMatch match)) - { - await InstallPackageAsync(match, token); - } - }); - await Task.WhenAll(tasks); - } - } - - private async Task InstallPackageAsync(RemoteMatch installItem, CancellationToken token) - { - var packageIdentity = new PackageIdentity(installItem.Library.Name, installItem.Library.Version); - - var verificationProviders = SignatureVerificationProviderFactory.GetSignatureVerificationProviders(); - var signedPackageVerifier = new PackageSignatureVerifier(verificationProviders); - - var versionFolderPathResolver = new VersionFolderPathResolver(_packagesDirectory); - var packageExtractionContext = new PackageExtractionContext( - PackageSaveMode.Defaultv3, - XmlDocFileSaveMode.None, - _logger, - signedPackageVerifier, - SignedPackageVerifierSettings.GetDefault()); - - using (var packageDependency = await installItem.Provider.GetPackageDownloaderAsync( - packageIdentity, - _cacheContext, - _logger, - token)) - { - await PackageExtractor.InstallFromSourceAsync( - packageIdentity, - packageDependency, - versionFolderPathResolver, - packageExtractionContext, - token); - } - } - } -} diff --git a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj index 0c42f0032..12ff8c23f 100644 --- a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj +++ b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj @@ -12,21 +12,17 @@ - - - - diff --git a/tools/KoreBuildSettings.cs b/modules/KoreBuild.Tasks/KoreBuildSettings.cs similarity index 100% rename from tools/KoreBuildSettings.cs rename to modules/KoreBuild.Tasks/KoreBuildSettings.cs diff --git a/modules/KoreBuild.Tasks/PackNuSpec.cs b/modules/KoreBuild.Tasks/PackNuSpec.cs deleted file mode 100644 index f711a4fbb..000000000 --- a/modules/KoreBuild.Tasks/PackNuSpec.cs +++ /dev/null @@ -1,250 +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 System.Linq; -using Microsoft.AspNetCore.BuildTools; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using NuGet.Frameworks; -using NuGet.Packaging; -using NuGet.Packaging.Core; -using NuGet.Versioning; - -namespace KoreBuild.Tasks -{ - /// - /// Generates a nupkg from a nuspec file - /// - public class PackNuSpec : Microsoft.Build.Utilities.Task - { - /// - /// The path the nuspec file. - /// - [Required] - public string NuspecPath { get; set; } - - /// - /// Output nupkg is placed in folder + '$(id).$(version).nupkg'. - /// Either this or must be specified. - /// - public string DestinationFolder { get; set; } - - /// - /// The output path for the nupkg. - /// Either this or must be specified. - /// - public string OutputPath { get; set; } - - /// - /// The base path to use for any relative paths in the <files%gt; section of nuspec. - /// Defaults to the nuspec folder. - /// - public string BasePath { get; set; } - - /// - /// Dependencies to add to the metadata>dependencies section of the spec. - /// Metadata 'TargetFramework' can be specified to further put dependencies into >group[targetFramework] - /// - public ITaskItem[] Dependencies { get; set; } - - /// - /// Files to add to the package. Must specify the PackagePath metadata. - /// - public ITaskItem[] PackageFiles { get; set; } - - /// - /// Subsitution in the nuspec via $key$. - /// - public string[] Properties { get; set; } - - /// - /// Pack empty directories. - /// - public bool IncludeEmptyDirectories { get; set; } = false; - - /// - /// Overwrite the destination file if it exists. - /// - public bool Overwrite { get; set; } = false; - - /// - /// The nupkg files created - /// - [Output] - public ITaskItem[] Packages { get; set; } - - public override bool Execute() - { - if (!File.Exists(NuspecPath)) - { - Log.LogError("Nuspec does not exist: " + NuspecPath); - return false; - } - - var packageBasePath = string.IsNullOrEmpty(BasePath) - ? Path.GetDirectoryName(NuspecPath) - : BasePath; - - if (!Directory.Exists(packageBasePath)) - { - Log.LogError("Base path does not exist: " + packageBasePath); - return false; - } - - if (!(string.IsNullOrEmpty(DestinationFolder) ^ string.IsNullOrEmpty(OutputPath))) - { - Log.LogError("Either DestinationFolder and OutputPath must be specified, but only not both."); - return false; - } - - var properties = MSBuildListSplitter.GetNamedProperties(Properties); - - string PropertyProvider(string name) - { - if (properties.TryGetValue(name, out var value)) - { - return value; - } - Log.LogError("Undefined property: " + name); - return null; - } - - PackageBuilder packageBuilder; - try - { - Log.LogMessage($"Loading nuspec {NuspecPath}"); - - using (var file = File.OpenRead(NuspecPath)) - { - var manifest = Manifest.ReadFrom(file, PropertyProvider, validateSchema: false); - if (!manifest.HasFilesNode) - { - // Warn about this overly permissive default in nuspec. - Log.LogKoreBuildWarning(KoreBuildErrors.NuspecMissingFilesNode, - "The nuspec file is missing the nodes. This causes all files in NuspecBase to be included in the package. " + - @"Add an empty `` node to prevent this behavior. Add ` ` to the nuspec to suppress this warning."); - } - } - - packageBuilder = new PackageBuilder(NuspecPath, packageBasePath, PropertyProvider, IncludeEmptyDirectories); - } - catch (InvalidDataException ex) - { - Log.LogKoreBuildError(NuspecPath, KoreBuildErrors.InvalidNuspecFile, ex.Message); - return false; - } - - if (Dependencies != null) - { - AddDependencies(packageBuilder); - } - - if (PackageFiles != null) - { - AddFiles(packageBuilder); - } - - if (Log.HasLoggedErrors) - { - return false; - } - - var dest = !string.IsNullOrEmpty(OutputPath) - ? OutputPath - : Path.Combine(DestinationFolder, $"{packageBuilder.Id}.{packageBuilder.Version}.nupkg"); - - // normalize path - dest = Path.GetFullPath(dest); - - Directory.CreateDirectory(Path.GetDirectoryName(dest)); - - if (!Overwrite && File.Exists(dest)) - { - Log.LogError($"File path '{dest}' already exists. Set Overwrite=true to overwrite the destination nupkg file."); - return false; - } - - if (packageBuilder.Files != null) - { - foreach (var file in packageBuilder.Files) - { - if (file is PhysicalPackageFile p) - { - Log.LogMessage($"Packing {p.SourcePath} => {p.Path}"); - } - else - { - Log.LogMessage($"Packing {file.Path}"); - } - } - } - - using (var stream = File.Create(dest)) - { - packageBuilder.Save(stream); - } - - Log.LogMessage(MessageImportance.High, $"Created package {dest}"); - Packages = new[] { new TaskItem(dest) }; - - return true; - } - - private void AddFiles(PackageBuilder builder) - { - foreach (var file in PackageFiles) - { - var packagePath = file.GetMetadata("PackagePath"); - var fileName = Path.GetFileName(packagePath); - if (string.IsNullOrEmpty(fileName)) - { - Log.LogKoreBuildError(KoreBuildErrors.InvalidPackagePathMetadata, - "The PackagePath metadata value on {0} is invalid. PackagePath must be set to the exact file path within the nuget package."); - continue; - } - - builder.Files.Add(new PhysicalPackageFile - { - SourcePath = file.ItemSpec, - TargetPath = packagePath, - }); - } - } - - private void AddDependencies(PackageBuilder builder) - { - var packageRequest = Dependencies.Select(d => - { - NuGetFramework tfm = NuGetFramework.AnyFramework; - if (!string.IsNullOrEmpty(d.GetMetadata("TargetFramework"))) - { - tfm = NuGetFramework.Parse(d.GetMetadata("TargetFramework")); - } - - if (string.IsNullOrEmpty(d.GetMetadata("Version"))) - { - Log.LogError($"Dependency {d.ItemSpec} is missing expected metdata: Version"); - } - - return new - { - tfm, - dependency = new PackageDependency(d.ItemSpec, - VersionRange.Parse(d.GetMetadata("Version")), - d.GetMetadata("IncludeAssets").Split(';').Select(s => s.Trim()).ToArray(), - d.GetMetadata("ExcludeAssets").Split(';').Select(s => s.Trim()).ToArray()) - }; - }); - - foreach (var group in packageRequest.GroupBy(g => g.tfm)) - { - var existingPackages = builder.DependencyGroups.FirstOrDefault(g => g.TargetFramework == group.Key)?.Packages - ?? Enumerable.Empty(); - - var depGroup = new PackageDependencyGroup(group.Key, existingPackages.Concat(group.Select(d => d.dependency))); - builder.DependencyGroups.Add(depGroup); - } - } - } -} diff --git a/modules/KoreBuild.Tasks/PushNuGetPackages.cs b/modules/KoreBuild.Tasks/PushNuGetPackages.cs deleted file mode 100644 index ae564dc98..000000000 --- a/modules/KoreBuild.Tasks/PushNuGetPackages.cs +++ /dev/null @@ -1,154 +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.Concurrent; -using System.IO; -using System.Linq; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Build.Framework; -using NuGet.Common; -using NuGet.Packaging; -using NuGet.Protocol; -using NuGet.Protocol.Core.Types; -using KoreBuild.Tasks.Internal; - -namespace KoreBuild.Tasks -{ - public class PushNuGetPackages : Microsoft.Build.Utilities.Task, ICancelableTask - { - private const int _maxRetryCount = 5; - private const int _maxParallelPackagePushes = 4; - - private ConcurrentBag _packages; - private readonly CancellationTokenSource _packagePushCancellationTokenSource = new CancellationTokenSource(); - - [Required] - public ITaskItem[] Packages { get; set; } - - [Required] - public string Feed { get; set; } - - // not be required if pushing to the filesystem - public string ApiKey { get; set; } - - public int TimeoutSeconds { get; set; } = 300; - - public void Cancel() - { - _packagePushCancellationTokenSource.Cancel(); - } - - public override bool Execute() - { - if (Packages.Length == 0) - { - Log.LogWarning("No package files were found to be published."); - return true; - } - - if (string.IsNullOrEmpty(Feed)) - { - Log.LogError("Feed must not be null or empty."); - return false; - } - - var packages = Packages - .Select(fileInfo => - { - using (var fileStream = File.OpenRead(fileInfo.ItemSpec)) - using (var reader = new PackageArchiveReader(fileStream)) - { - return new PackageInfo - { - Identity = reader.GetIdentity(), - PackagePath = fileInfo.ItemSpec - }; - } - }); - - _packages = new ConcurrentBag(packages); - - Log.LogMessage(MessageImportance.High, "Attempting to push {0} package(s) to {1}", Packages.Length, Feed); - try - { - PublishToFeedAsync().GetAwaiter().GetResult(); - Log.LogMessage(MessageImportance.High, "Successfully pushed {0} package(s) to {1}", Packages.Length, Feed); - return true; - } - catch (Exception ex) - { - Log.LogErrorFromException(ex, showStackTrace: true); - return false; - } - } - - private async Task PublishToFeedAsync() - { - Log.LogMessage("Publishing packages to feed: {0}", Feed); - - var sourceRepository = Repository.Factory.GetCoreV3(Feed, FeedType.HttpV3); - var packageUpdateResource = await sourceRepository.GetResourceAsync(); - - var tasks = new Task[_maxParallelPackagePushes]; - for (var i = 0; i < tasks.Length; i++) - { - tasks[i] = PushPackagesAsync(packageUpdateResource); - } - - await Task.WhenAll(tasks); - } - - private async Task PushPackagesAsync(PackageUpdateResource packageUpdateResource) - { - while (_packages.TryTake(out var package)) - { - await PushPackageAsync(packageUpdateResource, package); - } - } - - private async Task PushPackageAsync(PackageUpdateResource packageUpdateResource, PackageInfo package) - { - for (var attempt = 1; attempt <= _maxRetryCount; attempt++) - { - // Fail fast if a parallel push operation has already failed - _packagePushCancellationTokenSource.Token.ThrowIfCancellationRequested(); - - Log.LogMessage($"Attempting to publish package {package.Identity} (Attempt: {attempt})"); - - try - { - await packageUpdateResource.Push( - package.PackagePath, - symbolSource: null, - timeoutInSecond: TimeoutSeconds, - disableBuffering: false, - getApiKey: _ => ApiKey, - getSymbolApiKey: _ => null, - noServiceEndpoint: false, - log: NullLogger.Instance); - - Log.LogMessage(MessageImportance.High, $"Published package {package.Identity}"); - - return; - } - catch (Exception ex) when (attempt < _maxRetryCount) // allow exception to be thrown at the last attempt - { - Log.LogMessage( - MessageImportance.High, - $"Attempt {attempt} failed to publish package {package.Identity}." + - Environment.NewLine + - ex + - Environment.NewLine + - "Retrying..."); - } - catch - { - _packagePushCancellationTokenSource.Cancel(); - throw; - } - } - } - } -} diff --git a/modules/KoreBuild.Tasks/SkipStrongName/AssembliesFile.cs b/modules/KoreBuild.Tasks/SkipStrongName/AssembliesFile.cs deleted file mode 100644 index 9fb2343be..000000000 --- a/modules/KoreBuild.Tasks/SkipStrongName/AssembliesFile.cs +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Xml.Linq; - -namespace KoreBuild.Tasks.SkipStrongNames -{ - internal static class AssembliesFile - { - public static AssemblySpecification[] Read(string path) - { - XElement assembliesElement = XElement.Load(path); - - if (assembliesElement.Name != "assemblies") - { - throw new InvalidOperationException("The name of the root element must be assemblies."); - } - - XAttribute defaultPublicKeyTokenAttribute = assembliesElement.Attribute("defaultPublicKeyToken"); - - string defaultPublicKeyToken; - - if (defaultPublicKeyTokenAttribute != null) - { - defaultPublicKeyToken = defaultPublicKeyTokenAttribute.Value; - } - else - { - defaultPublicKeyToken = null; - } - - List specifications = new List(); - - foreach (XElement assembly in assembliesElement.Elements("assembly")) - { - XAttribute nameAttribute = assembly.Attribute("name"); - - if (nameAttribute == null) - { - throw new InvalidOperationException("An assembly element must have a name attribute."); - } - - XAttribute publicKeyTokenAttribute = assembly.Attribute("publicKeyToken"); - string publicKeyToken; - - if (publicKeyTokenAttribute != null) - { - publicKeyToken = publicKeyTokenAttribute.Value; - } - else - { - publicKeyToken = defaultPublicKeyToken; - } - - if (publicKeyToken == null) - { - throw new InvalidOperationException("An assembly element must have a publicKeyToken attribute, " + - "or the assemblies element must have a defaultPublicKeyToken attribute."); - } - - specifications.Add(new AssemblySpecification - { - Name = nameAttribute.Value, - PublicKeyToken = publicKeyToken - }); - } - - if (specifications.Count == 0) - { - throw new InvalidOperationException( - "The assemblies element must contain at least one assembly element."); - } - - return specifications.ToArray(); - } - } -} diff --git a/modules/KoreBuild.Tasks/SkipStrongName/AssemblySpecification.cs b/modules/KoreBuild.Tasks/SkipStrongName/AssemblySpecification.cs deleted file mode 100644 index 5f6798254..000000000 --- a/modules/KoreBuild.Tasks/SkipStrongName/AssemblySpecification.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -namespace KoreBuild.Tasks.SkipStrongNames -{ - internal class AssemblySpecification - { - public string Name { get; set; } - - public string PublicKeyToken { get; set; } - - public override string ToString() - { - return Name + "," + PublicKeyToken; - } - } -} diff --git a/modules/KoreBuild.Tasks/SkipStrongName/RegistrySection.cs b/modules/KoreBuild.Tasks/SkipStrongName/RegistrySection.cs deleted file mode 100644 index 2999ae1d0..000000000 --- a/modules/KoreBuild.Tasks/SkipStrongName/RegistrySection.cs +++ /dev/null @@ -1,10 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -namespace KoreBuild.Tasks.SkipStrongNames -{ - public enum RegistrySection - { - Native, - Windows32OnWindows64 - } -} diff --git a/modules/KoreBuild.Tasks/SkipStrongName/Status.cs b/modules/KoreBuild.Tasks/SkipStrongName/Status.cs deleted file mode 100644 index 2f37811fe..000000000 --- a/modules/KoreBuild.Tasks/SkipStrongName/Status.cs +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -namespace KoreBuild.Tasks.SkipStrongNames -{ - public enum Status - { - Disabled, - Enabled, - PartiallyEnabled, - } -} diff --git a/modules/KoreBuild.Tasks/SkipStrongName/StrongNameConfiguration.cs b/modules/KoreBuild.Tasks/SkipStrongName/StrongNameConfiguration.cs deleted file mode 100644 index 80dedffc5..000000000 --- a/modules/KoreBuild.Tasks/SkipStrongName/StrongNameConfiguration.cs +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Linq; - -namespace KoreBuild.Tasks.SkipStrongNames -{ - internal class StrongNameConfiguration - { - private readonly Dictionary> _strongNameExclusions; - private readonly AssemblySpecification[] _assemblies; - - public StrongNameConfiguration(AssemblySpecification[] specifications) - { - if (specifications != null) - { - _assemblies = specifications.OrderBy(s => s.Name).ToArray(); - } - else - { - _assemblies = null; - } - - FilteredAssemblySpecifications = new Dictionary(); - _strongNameExclusions = new Dictionary>(); - - foreach (RegistrySection section in WindowsRegistry.Sections) - { - HashSet sectionExclusions = WindowsRegistry.LoadStrongNameExclusions(section); - string[] sectionFilteredAssemblies = FilterAssemblySpecifications(_assemblies, sectionExclusions); - - FilteredAssemblySpecifications.Add(section, sectionFilteredAssemblies); - _strongNameExclusions.Add(section, sectionExclusions); - } - } - - public Dictionary FilteredAssemblySpecifications { get; private set; } - - public Status Status - { - get - { - bool allFound = true; - bool anyFound = false; - - foreach (RegistrySection section in WindowsRegistry.Sections) - { - string[] sectionFilteredAssemblies = FilteredAssemblySpecifications[section]; - HashSet sectionExclusions = _strongNameExclusions[section]; - - foreach (string assemblySpecification in sectionFilteredAssemblies) - { - bool found = sectionExclusions.Contains(assemblySpecification); - allFound = allFound && found; - anyFound = anyFound || found; - - if (!allFound && anyFound) - { - break; - } - } - } - - if (allFound) - { - return Status.Enabled; - } - else if (anyFound) - { - return Status.PartiallyEnabled; - } - else - { - return Status.Disabled; - } - } - } - - private string[] FilterAssemblySpecifications(AssemblySpecification[] assemblies, HashSet exclusions) - { - if (assemblies == null || assemblies.Length == 0) - { - return new string[0]; - } - - // Determine whether strong name verification is disabled globally (with a "*,*" entry). - if (exclusions.Contains("*,*")) - { - return new string[0]; - } - - // Get a list of the public key tokens that are globally excluded (with a "*,PublicKeyToken" entry) - HashSet globallyExcludedPublicKeyTokens = new HashSet(StringComparer.InvariantCultureIgnoreCase); - - foreach (var publicKeyToken in assemblies.Select(a => a.PublicKeyToken.ToUpperInvariant()).Distinct()) - { - if (exclusions.Contains("*," + publicKeyToken)) - { - globallyExcludedPublicKeyTokens.Add(publicKeyToken); - } - } - - // Create specifications for the list of the assemblies not covered by a global exclusion - return (from element in assemblies - where !globallyExcludedPublicKeyTokens.Contains(element.PublicKeyToken) - select element.ToString()).ToArray(); - } - } -} diff --git a/modules/KoreBuild.Tasks/SkipStrongName/WindowsRegistry.cs b/modules/KoreBuild.Tasks/SkipStrongName/WindowsRegistry.cs deleted file mode 100644 index 6e7a5aae8..000000000 --- a/modules/KoreBuild.Tasks/SkipStrongName/WindowsRegistry.cs +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using Microsoft.Win32; - -namespace KoreBuild.Tasks.SkipStrongNames -{ - internal static class WindowsRegistry - { - private const string SoftwareNativeKeyName = "SOFTWARE"; - private const string SoftwareWowKeyName = @"SOFTWARE\Wow6432Node"; - private const string VerificationSubKeyName = @"Microsoft\StrongName\Verification"; - - private static readonly Lazy softwareWowExists = new Lazy(() => CheckRegistryKeyExists(SoftwareWowKeyName)); - - public static IEnumerable Sections - { - get - { - yield return RegistrySection.Native; - - if (softwareWowExists.Value) - { - yield return RegistrySection.Windows32OnWindows64; - } - } - } - - public static RegistryKey CreateWritableVerificationRegistryKey(RegistrySection section) - { - return CreateWriteableRegistryKey(GetBaseKeyName(section), VerificationSubKeyName); - } - - public static HashSet LoadStrongNameExclusions(RegistrySection section) - { - HashSet results = new HashSet(StringComparer.OrdinalIgnoreCase); - - using (RegistryKey key = OpenReadOnlyVerificationRegistryKey(section)) - { - if (key != null) - { - foreach (var subKey in key.GetSubKeyNames()) - { - results.Add(subKey); - } - } - } - - return results; - } - - private static bool CheckRegistryKeyExists(string name) - { - using (RegistryKey key = OpenReadOnlyRegistryKey(name)) - { - return key != null; - } - } - - private static RegistryKey CreateWriteableRegistryKey(string baseKeyName, string subKeyName) - { - List keysToDispose = new List(); - - try - { - RegistryKey currentKey = Microsoft.Win32.Registry.LocalMachine.OpenSubKey(baseKeyName, writable: true); - - if (currentKey == null) - { - return null; - } - - string[] subKeyParts = subKeyName.Split('\\'); - - foreach (string subKeyPart in subKeyParts) - { - keysToDispose.Add(currentKey); - currentKey = currentKey.CreateSubKey(subKeyPart); - } - - return currentKey; - } - finally - { - foreach (RegistryKey key in keysToDispose) - { - key.Dispose(); - } - } - } - - private static string GetBaseKeyName(RegistrySection section) - { - switch (section) - { - case RegistrySection.Windows32OnWindows64: - return SoftwareWowKeyName; - case RegistrySection.Native: - default: - return SoftwareNativeKeyName; - } - } - - private static RegistryKey OpenReadOnlyRegistryKey(string name) - { - return Microsoft.Win32.Registry.LocalMachine.OpenSubKey(name); - } - - private static RegistryKey OpenReadOnlyVerificationRegistryKey(RegistrySection section) - { - string keyName = GetBaseKeyName(section) + '\\' + VerificationSubKeyName; - return OpenReadOnlyRegistryKey(keyName); - } - } -} diff --git a/modules/KoreBuild.Tasks/SkipStrongNames.xml b/modules/KoreBuild.Tasks/SkipStrongNames.xml deleted file mode 100644 index 3457d438e..000000000 --- a/modules/KoreBuild.Tasks/SkipStrongNames.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/modules/KoreBuild.Tasks/UpgradeDependencies.cs b/modules/KoreBuild.Tasks/UpgradeDependencies.cs deleted file mode 100644 index 4e5ca9006..000000000 --- a/modules/KoreBuild.Tasks/UpgradeDependencies.cs +++ /dev/null @@ -1,276 +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.IO; -using System.Linq; -using System.Net.Http; -using System.Threading; -using System.Threading.Tasks; -using System.Xml; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Construction; -using Microsoft.Build.Evaluation; -using Microsoft.Build.Framework; -using NuGet.Build; -using NuGet.Configuration; -using NuGet.Packaging; -using NuGet.Packaging.Core; -using NuGet.Protocol; -using NuGet.Protocol.Core.Types; -using NuGet.Versioning; - -namespace KoreBuild.Tasks -{ - /// - /// Uses a remote package to update the version variables in the local dependencies.props file - /// - public class UpgradeDependencies : Microsoft.Build.Utilities.Task, ICancelableTask - { - private CancellationTokenSource _cts = new CancellationTokenSource(); - - /// - /// The lineup package ID of the nupkg that contains the master dependencies.props files that will be used to upgrade versions - /// - [Required] - public string LineupPackageId { get; set; } - - /// - /// The version of the lineup package. If empty, this will attempt to pull the latest - /// - public string LineupPackageVersion { get; set; } - - /// - /// The dependencies.props file to use versions from - /// - public string LineupDependenciesFile { get; set; } - - /// - /// The NuGet feed containing the lineup package - /// - [Required] - public string LineupPackageRestoreSource { get; set; } - - /// - /// The dependencies.props file to update - /// - [Required] - public string DependenciesFile { get; set; } - - public void Cancel() - { - _cts.Cancel(); - } - - public override bool Execute() - { - return ExecuteAsync().GetAwaiter().GetResult(); - } - - public async Task ExecuteAsync() - { - if (!DependencyVersionsFile.TryLoad(DependenciesFile, out var localVersionsFile)) - { - Log.LogError($"Could not load file from {DependenciesFile}"); - return false; - } - - if (!localVersionsFile.HasVersionsPropertyGroup) - { - Log.LogKoreBuildWarning(KoreBuildErrors.PackageRefPropertyGroupNotFound, $"No PropertyGroup with Label=\"{DependencyVersionsFile.PackageVersionsLabel}\" could be found in {DependenciesFile}"); - } - - if (localVersionsFile.VersionVariables.Count == 0) - { - Log.LogMessage(MessageImportance.High, $"No version variables could be found in {DependenciesFile}"); - return true; - } - - - var tmpNupkgPath = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - var logger = new MSBuildLogger(Log); - - try - { - var remoteDepsVersionFile = await TryDownloadLineupDepsFile() ?? await TryDownloadLineupPackage(logger, tmpNupkgPath); - - if (remoteDepsVersionFile == null) - { - return false; - } - - var updateCount = UpdateDependencies(localVersionsFile, remoteDepsVersionFile); - - if (updateCount > 0) - { - Log.LogMessage($"Finished updating {updateCount} version variables in {DependenciesFile}"); - localVersionsFile.Save(DependenciesFile); - } - else - { - Log.LogMessage($"Versions in {DependenciesFile} are already up to date"); - } - - return !Log.HasLoggedErrors; - } - finally - { - if (File.Exists(tmpNupkgPath)) - { - File.Delete(tmpNupkgPath); - } - } - } - - private async Task TryDownloadLineupDepsFile() - { - if (string.IsNullOrEmpty(LineupDependenciesFile)) - { - return null; - } - - var path = LineupDependenciesFile; - string text; - if (path.StartsWith("http")) - { - using (var client = new HttpClient()) - { - text = await client.GetStringAsync(path); - } - } - else - { - text = File.ReadAllText(path); - } - - - using (var stringReader = new StringReader(text)) - using (var reader = new XmlTextReader(stringReader)) - { - var project = new Project(ProjectRootElement.Create(reader)); - return DependencyVersionsFile.LoadFromProject(project); - } - } - - private async Task TryDownloadLineupPackage(MSBuildLogger logger, string tmpNupkgPath) - { - VersionRange versionRange; - - if (string.IsNullOrEmpty(LineupPackageVersion)) - { - versionRange = VersionRange.AllFloating; - } - else if (!VersionRange.TryParse(LineupPackageVersion, out versionRange)) - { - Log.LogError($"{LineupPackageVersion} is not a valid NuGet package version"); - return null; - } - - var packageVersion = await GetPackageVersion(versionRange); - if (packageVersion == null) - { - Log.LogError($"Could not find a version of {LineupPackageId} in the version range {versionRange}."); - return null; - } - - var packageId = new PackageIdentity(LineupPackageId, packageVersion); - - var request = new PackageDownloadRequest - { - Identity = packageId, - OutputPath = tmpNupkgPath, - Sources = new[] { LineupPackageRestoreSource }, - }; - - var result = await new PackageDownloader(logger).DownloadPackagesAsync(new[] { request }, TimeSpan.FromSeconds(60), _cts.Token); - - if (!result) - { - Log.LogError("Could not download the lineup package"); - return null; - } - - using (var nupkgReader = new PackageArchiveReader(tmpNupkgPath)) - using (var stream = nupkgReader.GetStream("build/dependencies.props")) - using (var reader = new XmlTextReader(stream)) - { - var projectRoot = ProjectRootElement.Create(reader); - return DependencyVersionsFile.Load(projectRoot); - } - } - - private int UpdateDependencies(DependencyVersionsFile localVersionsFile, DependencyVersionsFile remoteDepsVersionFile) - { - var updateCount = 0; - foreach (var localVariable in localVersionsFile.VersionVariables.Values.Where(v => !v.IsReadOnly)) - { - string remoteVariableVersion; - // special case any package bundled in KoreBuild - if (!string.IsNullOrEmpty(KoreBuildVersion.Current) && localVariable.Name == "InternalAspNetCoreSdkPackageVersion") - { - remoteVariableVersion = KoreBuildVersion.Current; - Log.LogMessage(MessageImportance.Low, "Setting InternalAspNetCoreSdkPackageVersion to the current version of KoreBuild"); - } - else - { - if (remoteDepsVersionFile.VersionVariables.TryGetValue(localVariable.Name, out var remoteVariable)) - { - remoteVariableVersion = remoteVariable.Version; - } - else - { - Log.LogKoreBuildWarning( - DependenciesFile, KoreBuildErrors.PackageVersionNotFoundInLineup, - $"A new version variable for {localVariable.Name} could not be found in {LineupPackageId}. This might be an unsupported external dependency."); - continue; - } - } - - - if (remoteVariableVersion != localVariable.Version) - { - updateCount++; - localVersionsFile.Update(localVariable.Name, remoteVariableVersion); - } - } - - return updateCount; - } - - private async Task GetPackageVersion(VersionRange range) - { - if (!range.IsFloating) - { - return range.MinVersion; - } - - using (var cacheContext = new SourceCacheContext()) - { - var log = new MSBuildLogger(Log); - var defaultSettings = Settings.LoadDefaultSettings(root: null, configFileName: null, machineWideSettings: null); - var sourceProvider = new CachingSourceProvider(new PackageSourceProvider(defaultSettings)); - - var repo = sourceProvider.CreateRepository(new PackageSource(LineupPackageRestoreSource)); - - var metadata = await repo.GetResourceAsync(); - if (!await metadata.Exists(LineupPackageId, cacheContext, log, _cts.Token)) - { - Log.LogError($"Package {LineupPackageId} is not available on '{repo}'"); - return null; - } - - try - { - var versions = await metadata.GetVersions(LineupPackageId, includePrerelease: true, includeUnlisted: false, sourceCacheContext: cacheContext, log: log, token: _cts.Token); - - return range.FindBestMatch(versions); - } - catch (Exception ex) - { - Log.LogError($"Unexpected error while fetching versions from {repo.PackageSource.Source}: " + ex.Message); - return null; - } - } - } - } -} diff --git a/modules/KoreBuild.Tasks/Utilities/DependencyVersionsFile.cs b/modules/KoreBuild.Tasks/Utilities/DependencyVersionsFile.cs deleted file mode 100644 index 2b50a02b1..000000000 --- a/modules/KoreBuild.Tasks/Utilities/DependencyVersionsFile.cs +++ /dev/null @@ -1,235 +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 System.Text; -using Microsoft.Build.Construction; -using Microsoft.Build.Evaluation; - -namespace KoreBuild.Tasks.Utilities -{ - public class DependencyVersionsFile - { - public const string PackageVersionsLabel = "Package Versions"; - - public const string AutoPackageVersionsLabel = "Package Versions: Auto"; - public const string PinnedPackageVersionsLabel = "Package Versions: Pinned"; - - private readonly Dictionary _versionVariables - = new Dictionary(StringComparer.OrdinalIgnoreCase); - - //private readonly SortedDictionary _versionElements - // = new SortedDictionary(StringComparer.OrdinalIgnoreCase); - - private readonly ProjectRootElement _document; - private ProjectPropertyGroupElement _autoPackageVersions; - private ProjectPropertyGroupElement _pinnedPackageVersions; - - private DependencyVersionsFile(ProjectRootElement xDocument) - { - _document = xDocument; - } - - public static string GetVariableName(string packageId) - { - var sb = new StringBuilder(); - var first = true; - foreach (var ch in packageId) - { - if (!char.IsLetterOrDigit(ch)) - { - first = true; - continue; - } - - if (first) - { - first = false; - sb.Append(char.ToUpperInvariant(ch)); - } - else - { - sb.Append(ch); - } - } - sb.Append("PackageVersion"); - return sb.ToString(); - } - - - public static DependencyVersionsFile Create(bool addOverrideImport, string[] additionalImports = null) - { - var projectRoot = ProjectRootElement.Create(NewProjectFileOptions.None); - - projectRoot.AddPropertyGroup().AddProperty("MSBuildAllProjects", "$(MSBuildAllProjects);$(MSBuildThisFileFullPath)"); - - var autoPackageVersions = projectRoot.AddPropertyGroup(); - autoPackageVersions.Label = AutoPackageVersionsLabel; - - if (additionalImports != null) - { - foreach (var item in additionalImports) - { - var import = projectRoot.AddImport(item); - import.Condition = $"Exists('{item}')"; - } - } - - if (addOverrideImport) - { - var import = projectRoot.AddImport("$(DotNetPackageVersionPropsPath)"); - import.Condition = " '$(DotNetPackageVersionPropsPath)' != '' "; - } - - var pinnedPackageVersions = projectRoot.AddPropertyGroup(); - pinnedPackageVersions.Label = PinnedPackageVersionsLabel; - - return new DependencyVersionsFile(projectRoot) - { - _autoPackageVersions = autoPackageVersions, - _pinnedPackageVersions = pinnedPackageVersions, - }; - } - - public static bool TryLoad(string sourceFile, out DependencyVersionsFile file) - { - try - { - file = Load(sourceFile); - return true; - } - catch - { - file = null; - return false; - } - } - - public static DependencyVersionsFile Load(string sourceFile) - { - var project = ProjectRootElement.Open(sourceFile, ProjectCollection.GlobalProjectCollection, preserveFormatting: true); - return Load(project); - } - - public static DependencyVersionsFile Load(ProjectRootElement document) - { - var file = new DependencyVersionsFile(document); - - var propGroups = file._document.PropertyGroups; - - var listPropertyGroups = new List(); - - foreach (var propGroup in propGroups) - { - var attr = propGroup.Label; - if (attr != null && attr.StartsWith(PackageVersionsLabel, StringComparison.OrdinalIgnoreCase)) - { - file.HasVersionsPropertyGroup = true; - listPropertyGroups.Add(propGroup); - } - } - - foreach (var group in listPropertyGroups) - { - var isReadOnly = string.Equals(group.Label, PinnedPackageVersionsLabel, StringComparison.OrdinalIgnoreCase); - if (isReadOnly) - { - file._pinnedPackageVersions = group; - } - else - { - file._autoPackageVersions = group; - } - - foreach (var child in group.Properties) - { - var variable = new PackageVersionVariable(child, isReadOnly); - file._versionVariables[variable.Name] = variable; - } - } - - file.EnsureGroupsCreated(); - return file; - } - - private void EnsureGroupsCreated() - { - if (_autoPackageVersions == null) - { - _autoPackageVersions = _document.AddPropertyGroup(); - _autoPackageVersions.Label = AutoPackageVersionsLabel; - } - - if (_pinnedPackageVersions == null) - { - _pinnedPackageVersions = _document.AddPropertyGroup(); - _pinnedPackageVersions.Label = PinnedPackageVersionsLabel; - } - } - - public static DependencyVersionsFile LoadFromProject(Project project) - { - var file = new DependencyVersionsFile(ProjectRootElement.Create(NewProjectFileOptions.None)); - - foreach (var property in project.AllEvaluatedProperties.Where(p => p.Xml != null)) - { - var group = (ProjectPropertyGroupElement)property.Xml.Parent; - var isReadOnly = string.Equals(group.Label, PinnedPackageVersionsLabel, StringComparison.OrdinalIgnoreCase); - - var variable = new PackageVersionVariable(property.Xml, property.EvaluatedValue?.Trim(), isReadOnly); - file._versionVariables[property.Name] = variable; - } - - file.EnsureGroupsCreated(); - - return file; - } - - public bool HasVersionsPropertyGroup { get; private set; } - - // copying is required so calling .Set while iterating on this doesn't raise an InvalidOperationException - public IReadOnlyDictionary VersionVariables - => new Dictionary(_versionVariables, StringComparer.OrdinalIgnoreCase); - - public PackageVersionVariable Update(string variableName, string version) - { - if (!_versionVariables.TryGetValue(variableName, out var variable)) - { - var element = _document.CreatePropertyElement(variableName); - variable = new PackageVersionVariable(element, version, isReadOnly: false); - _versionVariables[variableName] = variable; - variable.AddToGroup(_autoPackageVersions); - } - - variable.UpdateVersion(version); - return variable; - } - - public PackageVersionVariable AddPinnedVariable(string variableName, string version) - { - if (_versionVariables.ContainsKey(variableName)) - { - throw new InvalidOperationException("Key already exists: " + variableName); - } - - var element = _document.CreatePropertyElement(variableName); - var variable = new PackageVersionVariable(element, version, isReadOnly: true); - _versionVariables.Add(variableName, variable); - variable.AddToGroup(_pinnedPackageVersions); - return variable; - } - - public void Save(string filePath) - { - _autoPackageVersions.RemoveAllChildren(); - foreach (var item in _versionVariables.Values.Where(v => !v.IsReadOnly).OrderBy(v => v.Name)) - { - item.AddToGroup(_autoPackageVersions); - } - - _document.Save(filePath, Encoding.UTF8); - } - } -} diff --git a/modules/KoreBuild.Tasks/Utilities/PackageDownloadRequest.cs b/modules/KoreBuild.Tasks/Utilities/PackageDownloadRequest.cs deleted file mode 100644 index 40aeef381..000000000 --- a/modules/KoreBuild.Tasks/Utilities/PackageDownloadRequest.cs +++ /dev/null @@ -1,15 +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.Collections.Generic; -using NuGet.Packaging.Core; - -namespace KoreBuild.Tasks.Utilities -{ - public class PackageDownloadRequest - { - public PackageIdentity Identity { get; set; } - public string OutputPath { get; set; } - public IReadOnlyList Sources { get; set; } - } -} diff --git a/modules/KoreBuild.Tasks/Utilities/PackageDownloader.cs b/modules/KoreBuild.Tasks/Utilities/PackageDownloader.cs deleted file mode 100644 index 9d5a9ac32..000000000 --- a/modules/KoreBuild.Tasks/Utilities/PackageDownloader.cs +++ /dev/null @@ -1,114 +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 System.Threading; -using System.Threading.Tasks; -using NuGet.Commands; -using NuGet.Configuration; -using NuGet.Packaging.Core; -using NuGet.Protocol; -using NuGet.Protocol.Core.Types; - -namespace KoreBuild.Tasks.Utilities -{ - public class PackageDownloader - { - private static readonly Task FalseTask = Task.FromResult(false); - private readonly NuGet.Common.ILogger logger; - - public PackageDownloader(NuGet.Common.ILogger logger) - { - this.logger = logger; - } - - public async Task DownloadPackagesAsync(ICollection requests, TimeSpan timeout, CancellationToken cancellationToken) - { - logger.LogMinimal($"Downloading {requests.Count} package(s)"); - - var cts = new CancellationTokenSource(timeout); - cancellationToken.Register(() => cts.Cancel()); - - using (var cacheContext = new SourceCacheContext()) - using (var throttle = new SemaphoreSlim(8)) - { - var defaultSettings = Settings.LoadDefaultSettings(root: null, configFileName: null, machineWideSettings: null); - var sourceProvider = new CachingSourceProvider(new PackageSourceProvider(defaultSettings)); - var tasks = new List>(); - - foreach (var request in requests) - { - var feeds = request.Sources - .Select(s => s?.Trim()) - .Where(s => !string.IsNullOrEmpty(s)) - .Distinct() - .Select(sourceProvider.CreateRepository); - tasks.Add(DownloadPackageAsync(request, feeds, cacheContext, throttle, logger, cts.Token)); - } - - var all = Task.WhenAll(tasks); - var delay = Task.Delay(timeout); - - var finished = await Task.WhenAny(all, delay); - if (ReferenceEquals(delay, finished)) - { - logger.LogError($"Timed out after {timeout.TotalSeconds}s"); - cts.Cancel(); - return false; - } - - if (!tasks.All(a => a.Result)) - { - logger.LogError("Failed to download all packages"); - return false; - } - - return true; - } - } - - private async Task DownloadPackageAsync( - PackageDownloadRequest request, - IEnumerable repositories, - SourceCacheContext cacheContext, - SemaphoreSlim throttle, - NuGet.Common.ILogger logger, - CancellationToken cancellationToken) - { - foreach (var repo in repositories) - { - var findPackageByIdResource = await repo.GetResourceAsync(cancellationToken); - - if (findPackageByIdResource == null) - { - logger.LogError($"{nameof(FindPackageByIdResource)} for '{repo}' could not be loaded."); - return false; - } - - using (var downloader = await findPackageByIdResource.GetPackageDownloaderAsync(request.Identity, cacheContext, logger, cancellationToken)) - { - if (downloader == null) - { - logger.LogInformation($"Package {request.Identity.Id} {request.Identity.Version} is not available on '{repo}'"); - // Skip to the next source if a package cannot be found in a given source. - continue; - } - - downloader.SetThrottle(throttle); - if (!await downloader.CopyNupkgFileToAsync(request.OutputPath, cancellationToken)) - { - logger.LogError($"Could not download {request.Identity.Id} {request.Identity.Version} from {repo}."); - return false; - } - } - - return true; - } - - logger.LogError($"{request.Identity.Id} {request.Identity.Version} is not available.'"); - return false; - } - } -} diff --git a/modules/KoreBuild.Tasks/Utilities/PackageVersionVariable.cs b/modules/KoreBuild.Tasks/Utilities/PackageVersionVariable.cs deleted file mode 100644 index 4131e2113..000000000 --- a/modules/KoreBuild.Tasks/Utilities/PackageVersionVariable.cs +++ /dev/null @@ -1,56 +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 Microsoft.Build.Construction; - -namespace KoreBuild.Tasks.Utilities -{ - public class PackageVersionVariable - { - private readonly ProjectPropertyElement _element; - - public PackageVersionVariable(ProjectPropertyElement element, bool isReadOnly) - : this(element, element.Value?.Trim(), isReadOnly) - { - } - - public PackageVersionVariable(ProjectPropertyElement element, string version, bool isReadOnly) - { - _element = element ?? throw new ArgumentNullException(nameof(element)); - IsReadOnly = isReadOnly; - Name = element.Name.ToString(); - Version = version ?? string.Empty; - } - - public string Name { get; } - - public string Version - { - get => _element.Value; - private set => _element.Value = value; - } - - public bool IsReadOnly { get; private set; } - - public void UpdateVersion(string version) - { - if (IsReadOnly) - { - throw new InvalidOperationException("You cannot updated a pinned package version variable automatically"); - } - - Version = version; - } - - public void AddToGroup(ProjectPropertyGroupElement group) - { - group.AppendChild(_element); - } - - public void SetLabel(string label) - { - _element.Label = label; - } - } -} diff --git a/modules/KoreBuild.Tasks/module.props b/modules/KoreBuild.Tasks/module.props index 65848d3fb..1bc7ebbd4 100644 --- a/modules/KoreBuild.Tasks/module.props +++ b/modules/KoreBuild.Tasks/module.props @@ -11,20 +11,10 @@ - - - - - - - - - - $(KOREBUILD_DOTNET_ARCH) diff --git a/modules/KoreBuild.Tasks/module.targets b/modules/KoreBuild.Tasks/module.targets index f907ece4e..3cce8d116 100644 --- a/modules/KoreBuild.Tasks/module.targets +++ b/modules/KoreBuild.Tasks/module.targets @@ -3,9 +3,8 @@ GetToolsets;$(PrepareDependsOn) - InstallDotNet;CheckPackageReferences;$(RestoreDependsOn) + InstallDotNet;$(RestoreDependsOn) - false $(RepositoryRoot)korebuild.json $(RepositoryRoot)build\dependencies.props @@ -47,97 +46,6 @@ Downloads and extracts .NET Core shared runtimes and SDKs. InstallScript="$(_DotNetInstall)"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SHA256 diff --git a/src/Internal.AspNetCore.Sdk/build/DotNetTool.targets b/src/Internal.AspNetCore.Sdk/build/DotNetTool.targets deleted file mode 100644 index d4bbb768c..000000000 --- a/src/Internal.AspNetCore.Sdk/build/DotNetTool.targets +++ /dev/null @@ -1,21 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - $(GetSignedPackageFilesDependsOn);_GetSignedPackageFilesForGeneratedShims - $(OutDir) - - - - - <_ShimRids Include="$(PackAsToolShimRuntimeIdentifiers)" /> - - tools/$(TargetFramework)/any/shims/%(_ShimRids.Identity)/ - - - tools/$(TargetFramework)/any/$(TargetFileName) - - - - - diff --git a/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets b/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets index 5f76a7bfc..0551a59c3 100644 --- a/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets +++ b/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets @@ -7,10 +7,6 @@ for use outside of Microsoft. - - diff --git a/test/BuildTools.Tasks.Tests/UnzipArchiveTest.cs b/test/BuildTools.Tasks.Tests/UnzipArchiveTest.cs deleted file mode 100644 index fcbf0c9d9..000000000 --- a/test/BuildTools.Tasks.Tests/UnzipArchiveTest.cs +++ /dev/null @@ -1,197 +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.IO; -using Microsoft.AspNetCore.BuildTools; -using Xunit; - -using ZipArchiveStream = System.IO.Compression.ZipArchive; -using System.IO.Compression; - -namespace BuildTools.Tasks.Tests -{ - public class UnzipArchiveTest : IDisposable - { - private readonly string _tempDir; - - public UnzipArchiveTest() - { - _tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); - Directory.CreateDirectory(_tempDir); - } - - [Fact] - public void UnzipsFile() - { - var files = new[] - { - "a.txt", - "dir/b.txt", - }; - - var dest = CreateZip(files); - var outDir = Path.Combine(_tempDir, "out"); - - var task = new UnzipArchive - { - File = dest, - Destination = outDir, - BuildEngine = new MockEngine(), - }; - - Assert.True(task.Execute(), "The task failed but should have passed."); - Assert.True(Directory.Exists(outDir), outDir + " does not exist"); - Assert.Equal(files.Length, task.OutputFiles.Length); - - Assert.All(task.OutputFiles, - f => Assert.True(Path.IsPathRooted(f.ItemSpec), $"Entry {f} should be a fullpath rooted")); - - foreach (var file in files) - { - var outFile = Path.Combine(outDir, file); - Assert.True(File.Exists(outFile), outFile + " does not exist"); - } - } - - [Fact] - public void UnzipsSubdirectories() - { - var files = new[] - { - "a/b/c/d.dll", - "e/f/j/k/l.json", - "e/f/m/n/o.json" - }; - - var dest = CreateZip(files); - var outDir = Path.Combine(_tempDir, "out"); - - var task = new UnzipArchive - { - File = dest, - Destination = outDir, - BuildEngine = new MockEngine(), - }; - - Assert.True(task.Execute(), "The task failed but should have passed."); - Assert.True(Directory.Exists(outDir), outDir + " does not exist"); - Assert.Equal(files.Length, task.OutputFiles.Length); - - Assert.All(task.OutputFiles, - f => Assert.True(Path.IsPathRooted(f.ItemSpec), $"Entry {f} should be a fullpath rooted")); - - foreach (var file in files) - { - var outFile = Path.Combine(outDir, file); - Assert.True(File.Exists(outFile), outFile + " does not exist"); - } - } - - [Fact] - public void Overwrites() - { - var files = new[] - { - "a.txt", - "dir/b.txt" - }; - - var dest = CreateZip(files); - var outDir = Path.Combine(_tempDir, "out"); - - var task = new UnzipArchive - { - File = dest, - Destination = outDir, - BuildEngine = new MockEngine(), - Overwrite = true - }; - - Directory.CreateDirectory(outDir); - - // Create a.txt before trying to unzip - var path = Path.Combine(outDir, "a.txt"); - File.WriteAllText(path, "contents!"); - Assert.True(task.Execute(), "The task failed but should have passed."); - Assert.Empty(File.ReadAllText(path)); - } - - [Fact] - public void DoesNotOverwrite() - { - var files = new[] - { - "a.txt", - "dir/b.txt" - }; - - var dest = CreateZip(files); - var outDir = Path.Combine(_tempDir, "out"); - - var task = new UnzipArchive - { - File = dest, - Destination = outDir, - BuildEngine = new MockEngine(), - Overwrite = false - }; - - Directory.CreateDirectory(outDir); - - // Create a.txt before trying to unzip - var path = Path.Combine(outDir, "a.txt"); - var contents = "contents!"; - File.WriteAllText(path, contents); - - Assert.Throws(() => task.Execute()); - - Assert.Equal(contents, File.ReadAllText(path)); - } - - [Fact] - public void ItNormalizesBacklashesInPath() - { - var files = new[] - { - @"dir\b.txt" - }; - - var dest = CreateZip(files); - var outDir = Path.Combine(_tempDir, "out"); - - var engine = new MockEngine(); - var task = new UnzipArchive - { - File = dest, - Destination = outDir, - BuildEngine = engine, - Overwrite = false - }; - - Assert.True(task.Execute(), "The task failed but should have passed."); - Assert.True(File.Exists(Path.Combine(outDir, "dir", "b.txt")), "File should exist."); - } - - private string CreateZip(string[] files) - { - var dest = Path.Combine(_tempDir, "test.zip"); - - using (var fileStream = new FileStream(dest, FileMode.Create)) - using (var zipStream = new ZipArchiveStream(fileStream, ZipArchiveMode.Create)) - { - foreach (var file in files) - { - zipStream.CreateEntry(file); - } - } - - return dest; - } - - public void Dispose() - { - Directory.Delete(_tempDir, recursive: true); - } - } -} diff --git a/test/BuildTools.Tasks.Tests/ZipArchiveTest.cs b/test/BuildTools.Tasks.Tests/ZipArchiveTest.cs deleted file mode 100644 index c39ad48bd..000000000 --- a/test/BuildTools.Tasks.Tests/ZipArchiveTest.cs +++ /dev/null @@ -1,220 +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.IO; -using System.Linq; -using Microsoft.AspNetCore.BuildTools; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using Xunit; - -using ZipArchiveStream = System.IO.Compression.ZipArchive; - -namespace BuildTools.Tasks.Tests -{ - public class ZipArchiveTest : IDisposable - { - private readonly string _tempDir; - - public ZipArchiveTest() - { - _tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); - Directory.CreateDirectory(_tempDir); - } - - [Fact] - public void ZipsLinkItems() - { - var inputFile = Path.Combine(_tempDir, "..", Guid.NewGuid().ToString()); - var dest = Path.Combine(_tempDir, "test.zip"); - var linkItem = new TaskItem(inputFile); - linkItem.SetMetadata("Link", "temp/temp/temp/file.txt"); - try - { - File.WriteAllText(inputFile, ""); - var task = new ZipArchive - { - SourceFiles = new[] { linkItem }, - WorkingDirectory = Path.Combine(_tempDir, "temp"), - File = dest, - BuildEngine = new MockEngine(), - }; - Assert.True(task.Execute()); - - using (var fileStream = new FileStream(dest, FileMode.Open)) - using (var zipStream = new ZipArchiveStream(fileStream)) - { - var entry = Assert.Single(zipStream.Entries); - Assert.Equal("temp/temp/temp/file.txt", entry.FullName); - } - } - finally - { - File.Delete(inputFile); - } - } - - [Fact] - public void CreatesZip() - { - var files = new[] - { - "a.txt", - "dir/b.txt", - @"dir\c.txt", - }; - - var dest = Path.Combine(_tempDir, "test.zip"); - Assert.False(File.Exists(dest)); - - var task = new ZipArchive - { - SourceFiles = CreateItems(files).ToArray(), - WorkingDirectory = _tempDir, - File = dest, - Overwrite = true, - BuildEngine = new MockEngine(), - }; - - Assert.True(task.Execute()); - Assert.True(File.Exists(dest)); - - using (var fileStream = new FileStream(dest, FileMode.Open)) - using (var zipStream = new ZipArchiveStream(fileStream)) - { - Assert.Equal(files.Length, zipStream.Entries.Count); - Assert.Collection(zipStream.Entries, - a => Assert.Equal("a.txt", a.FullName), - b => Assert.Equal("dir/b.txt", b.FullName), - c => Assert.Equal("dir/c.txt", c.FullName)); - } - } - - [Fact] - public void FailsIfFileExists() - { - var files = new[] - { - "test.txt", - }; - - var dest = Path.Combine(_tempDir, "test.zip"); - File.WriteAllText(dest, "Original"); - - var task = new ZipArchive - { - SourceFiles = CreateItems(files).ToArray(), - WorkingDirectory = _tempDir, - File = dest, - Overwrite = false, - BuildEngine = new MockEngine { ContinueOnError = true }, - }; - - Assert.False(task.Execute(), "Task should fail"); - Assert.Equal("Original", File.ReadAllText(dest)); - } - - [Fact] - public void OverwriteReplacesEntireZip() - { - var files1 = new[] - { - "a.txt", - "dir/b.txt", - @"dir\c.txt", - }; - - var files2 = new[] - { - "test.txt", - }; - - var dest = Path.Combine(_tempDir, "test.zip"); - Assert.False(File.Exists(dest)); - - var task = new ZipArchive - { - SourceFiles = CreateItems(files1).ToArray(), - WorkingDirectory = _tempDir, - File = dest, - BuildEngine = new MockEngine(), - }; - - Assert.True(task.Execute()); - Assert.True(File.Exists(dest)); - - task = new ZipArchive - { - SourceFiles = CreateItems(files2).ToArray(), - WorkingDirectory = _tempDir, - File = dest, - Overwrite = true, - BuildEngine = new MockEngine(), - }; - - Assert.True(task.Execute()); - Assert.True(File.Exists(dest)); - - using (var fileStream = File.OpenRead(dest)) - using (var zipStream = new ZipArchiveStream(fileStream)) - { - var entry = Assert.Single(zipStream.Entries); - Assert.Equal("test.txt", entry.FullName); - } - } - - [Fact] - public void FailsForEmptyFileName() - { - var inputFile = Path.Combine(_tempDir, "..", Guid.NewGuid().ToString()); - var dest = Path.Combine(_tempDir, "test.zip"); - var linkItem = new TaskItem(inputFile); - linkItem.SetMetadata("Link", "temp/"); - try - { - File.WriteAllText(inputFile, ""); - var mock = new MockEngine { ContinueOnError = true }; - var task = new ZipArchive - { - SourceFiles = new[] { linkItem }, - WorkingDirectory = Path.Combine(_tempDir, "temp"), - File = dest, - BuildEngine = mock, - }; - - Assert.False(task.Execute(), "Task should fail"); - Assert.NotEmpty(mock.Errors); - - using (var fileStream = new FileStream(dest, FileMode.Open)) - using (var zipStream = new ZipArchiveStream(fileStream)) - { - Assert.Empty(zipStream.Entries); - } - } - finally - { - File.Delete(inputFile); - } - } - - private IEnumerable CreateItems(string[] files) - { - foreach (var file in files) - { - var path = Path.Combine(_tempDir, file); - Directory.CreateDirectory(Path.GetDirectoryName(path)); - File.WriteAllText(path.Replace('\\', '/'), ""); - // intentionally allow item spec to contain \ and / - // this tests that MSBuild normalizes before we create zip entries - yield return new TaskItem(path); - } - } - - public void Dispose() - { - Directory.Delete(_tempDir, recursive: true); - } - } -} diff --git a/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs b/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs index 0febb9a1b..4ddc095a1 100644 --- a/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs +++ b/test/KoreBuild.FunctionalTests/SimpleRepoTests.cs @@ -33,7 +33,7 @@ public void FullBuildCompletes() { var app = _fixture.CreateTestApp("SimpleRepo"); - var build = app.ExecuteBuild(_output, "/p:BuildNumber=0001"); + var build = app.ExecuteBuild(_output, "/p:BuildNumber=0001", "/p:DisableCodeSigning=true"); Assert.Equal(0, build); @@ -52,64 +52,6 @@ public void FullBuildCompletes() { Assert.Empty(reader.GetFiles().Where(p => Path.GetExtension(p).Equals(".pdb", StringComparison.OrdinalIgnoreCase))); } - - // /t:TestNuGetPush - Assert.True(File.Exists(Path.Combine(app.WorkingDirectory, "obj", "tmp-nuget", "Simple.CliTool.1.0.0-beta-0001.nupkg")), "Build done a test push of all the packages"); - Assert.True(File.Exists(Path.Combine(app.WorkingDirectory, "obj", "tmp-nuget", "Simple.Lib.1.0.0-beta-0001.nupkg")), "Build done a test push of all the packages"); - Assert.True(File.Exists(Path.Combine(app.WorkingDirectory, "obj", "tmp-nuget", "Simple.Sources.1.0.0-beta-0001.nupkg")), "Build done a test push of all the packages"); - } - - [Fact] - public void BuildOfGlobalCliToolIncludesShims() - { - var app = _fixture.CreateTestApp("RepoWithGlobalTool"); - - var build = app.ExecuteBuild(_output, "/p:BuildNumber=0001"); - - Assert.Equal(0, build); - - var artifactsDir = Path.Combine(app.WorkingDirectory, "artifacts", "build"); - - var pkg = Path.Combine(artifactsDir, "GlobalConsoleTool.1.0.0.nupkg"); - using (var reader = new PackageArchiveReader(pkg)) - { - var files = reader.GetFiles(); - foreach (var file in files) - { - _output.WriteLine("pkg: " + file); - } - - var winx86 = Assert.Single(files, f => f.StartsWith("tools/netcoreapp3.0/any/shims/win-x86/")); - Assert.Equal("GlobalConsoleTool.exe", Path.GetFileName(winx86)); - - var winx64 = Assert.Single(files, f => f.StartsWith("tools/netcoreapp3.0/any/shims/win-x64/")); - Assert.Equal("GlobalConsoleTool.exe", Path.GetFileName(winx64)); - } - - var toolsDir = Path.Combine(app.WorkingDirectory, "artifacts", "tools"); - var installPsi = new ProcessStartInfo - { - FileName = DotNetMuxer.MuxerPathOrDefault(), - Arguments = ArgumentEscaper.EscapeAndConcatenate(new[] - { - "tool", - "install", - "--tool-path", toolsDir, - "GlobalConsoleTool", - "--add-source", artifactsDir - }), - }; - var install = app.Run(_output, installPsi); - Assert.Equal(0, install); - - var ext = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) - ? ".exe" - : string.Empty; - var run = app.Run(_output, new ProcessStartInfo - { - FileName = Path.Combine(toolsDir, "GlobalConsoleTool" + ext), - }); - Assert.Equal(0, run); } [Fact] @@ -121,84 +63,5 @@ public void BuildShouldReturnNonZeroCode() Assert.NotEqual(0, build); } - - [DockerExistsFact(Skip = "winservercore currently fails on AppVeyor due to breaking changes in winservercore 1710")] - public void DockerSuccessful() - { - var app = _fixture.CreateTestApp("SimpleRepo"); - var platform = "jessie"; - - var dockerPlatform = GetDockerPlatform(); - if (dockerPlatform == OSPlatform.Windows) - { - platform = "winservercore"; - } - - var build = app.ExecuteRun(_output, new string[] { "docker-build", "-Path", app.WorkingDirectory }, platform, "/p:BuildNumber=0001"); - - Assert.Equal(0, build); - } - - private static OSPlatform GetDockerPlatform() - { - var startInfo = new ProcessStartInfo("docker", @"version -f ""{{ .Server.Os }}""") - { - RedirectStandardOutput = true, - UseShellExecute = false, - }; - - using (var process = Process.Start(startInfo)) - { - var output = process.StandardOutput.ReadToEnd().Trim(); - - OSPlatform result; - switch (output) - { - case "windows": - result = OSPlatform.Windows; - break; - case "linux": - result = OSPlatform.Linux; - break; - default: - throw new NotImplementedException($"No default for docker platform {output}"); - } - - return result; - } - } - } - - [AttributeUsage(AttributeTargets.Method, AllowMultiple = false)] - public class DockerExistsFactAttribute : FactAttribute - { - public DockerExistsFactAttribute() - { - if (!HasDocker()) - { - Skip = "Docker must be installed to run this test."; - } - } - - private static bool HasDocker() - { - try - { - var startInfo = new ProcessStartInfo("docker", "--version") - { - RedirectStandardOutput = true, - RedirectStandardError = true, - UseShellExecute = false, - }; - using (Process.Start(startInfo)) - { - return true; - } - } - catch (Win32Exception) - { - return false; - } - } } } diff --git a/test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs b/test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs deleted file mode 100644 index a83450ff5..000000000 --- a/test/KoreBuild.Tasks.Tests/CheckPackageReferenceTests.cs +++ /dev/null @@ -1,288 +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 BuildTools.Tasks.Tests; -using Microsoft.Build.Utilities; -using System.IO; -using Xunit; -using Xunit.Abstractions; - -namespace KoreBuild.Tasks.Tests -{ - [Collection(nameof(MSBuildTestCollection))] - public class CheckPackageReferenceTests : TaskTestBase - { - public CheckPackageReferenceTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) : base(output, fixture) - { - } - - [Fact] - public void ItAllowsPinnedAndUnpinnedVersions() - { - var depsProps = Path.Combine(TempDir, "dependencies.props"); - File.WriteAllText(depsProps, $@" - - - 1.0.0 - - - - - - 1.0.0 - - -".Replace('`', '"')); - - var csproj = Path.Combine(TempDir, "Test.csproj"); - File.WriteAllText(csproj, $@" - - - - - $(BaseLinePackageVersion) - - - -".Replace('`', '"')); - - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - DependenciesFile = depsProps, - Projects = new[] { new TaskItem(csproj) } - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - } - - [Fact] - public void PassesWhenAllRequirementsAreSatisifed() - { - var depsProps = Path.Combine(TempDir, "dependencies.props"); - File.WriteAllText(depsProps, $@" - - - 1.0.0 - - -".Replace('`', '"')); - - var csproj = Path.Combine(TempDir, "Test.csproj"); - File.WriteAllText(csproj, $@" - - - - - $(AspNetCorePackageVersion) - - - -".Replace('`', '"')); - - MockEngine.ContinueOnError = true; - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - DependenciesFile = depsProps, - Projects = new[] { new TaskItem(csproj) } - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - } - - [Fact] - public void IgnoresUpdateAndRemoveItems() - { - var depsProps = Path.Combine(TempDir, "dependencies.props"); - File.WriteAllText(depsProps, $@" - - - -".Replace('`', '"')); - - var csproj = Path.Combine(TempDir, "Test.csproj"); - File.WriteAllText(csproj, $@" - - - - - - -".Replace('`', '"')); - - MockEngine.ContinueOnError = true; - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - DependenciesFile = depsProps, - Projects = new[] { new TaskItem(csproj) } - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - } - - [Fact] - public void FailsWhenDependenciesHasNoPropGroup() - { - var depsFile = Path.Combine(TempDir, "deps.props"); - File.WriteAllText(depsFile, $@" - - - 1.0.0 - - -".Replace('`', '"')); - - MockEngine.ContinueOnError = true; - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - Projects = new[] { new TaskItem(depsFile) }, - DependenciesFile = depsFile, - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - Assert.NotEmpty(MockEngine.Warnings); - Assert.Contains(MockEngine.Warnings, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefPropertyGroupNotFound); - } - - [Fact] - public void FailsWhenVariableIsNotInDependenciesPropsFile() - { - var depsProps = Path.Combine(TempDir, "dependencies.props"); - File.WriteAllText(depsProps, $@" - - - - -".Replace('`', '"')); - - var csproj = Path.Combine(TempDir, "Test.csproj"); - File.WriteAllText(csproj, $@" - - - - - -".Replace('`', '"')); - - MockEngine.ContinueOnError = true; - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - Projects = new[] { new TaskItem(csproj) }, - DependenciesFile = depsProps, - }; - - Assert.False(task.Execute(), "Task is expected to fail"); - Assert.NotEmpty(MockEngine.Errors); - Assert.Contains(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.VariableNotFoundInDependenciesPropsFile); - } - - [Fact] - public void FailsWhenPackageVersionFloat() - { - var depsProps = Path.Combine(TempDir, "dependencies.props"); - File.WriteAllText(depsProps, $@" - - - 1.0.0-* - - -".Replace('`', '"')); - - var csproj = Path.Combine(TempDir, "Test.csproj"); - File.WriteAllText(csproj, $@" - - - - - -".Replace('`', '"')); - - MockEngine.ContinueOnError = true; - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - Projects = new[] { new TaskItem(csproj) }, - DependenciesFile = depsProps, - }; - - Assert.False(task.Execute(), "Task is expected to fail"); - Assert.NotEmpty(MockEngine.Errors); - Assert.Contains(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefHasFloatingVersion); - } - - [Fact] - public void FailsWhenPackageVersionIsInvalid() - { - var depsProps = Path.Combine(TempDir, "dependencies.props"); - File.WriteAllText(depsProps, $@" - - - 1 - - -".Replace('`', '"')); - - var csproj = Path.Combine(TempDir, "Test.csproj"); - File.WriteAllText(csproj, $@" - - - - - -".Replace('`', '"')); - - MockEngine.ContinueOnError = true; - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - Projects = new[] { new TaskItem(csproj) }, - DependenciesFile = depsProps, - }; - - Assert.False(task.Execute(), "Task is expected to fail"); - Assert.NotEmpty(MockEngine.Errors); - Assert.Contains(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.InvalidPackageVersion); - } - - [Theory] - [InlineData("1.0.0")] - [InlineData("1.0.0-$(Suffix)")] - [InlineData("$(Prefix)-1.0.0-$(Suffix)")] - [InlineData("$(Prefix)-1.0.0")] - public void FailsWhenPackagesReferenceVersionDoesNotCompletelyUseVariables(string version) - { - var depsProps = Path.Combine(TempDir, "dependencies.props"); - File.WriteAllText(depsProps, $@" - - - -".Replace('`', '"')); - - var csproj = Path.Combine(TempDir, "Test.csproj"); - File.WriteAllText(csproj, $@" - - - - - -".Replace('`', '"')); - - MockEngine.ContinueOnError = true; - var task = new CheckPackageReferences - { - BuildEngine = MockEngine, - Projects = new[] { new TaskItem(csproj) }, - DependenciesFile = depsProps, - }; - - Assert.False(task.Execute(), "Task is expected to fail"); - Assert.NotEmpty(MockEngine.Errors); - var error = Assert.Single(MockEngine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.PackageRefHasLiteralVersion); - Assert.Equal(4, error.LineNumber); - } - } -} diff --git a/test/KoreBuild.Tasks.Tests/DependencyVersionsFileTests.cs b/test/KoreBuild.Tasks.Tests/DependencyVersionsFileTests.cs deleted file mode 100644 index 8b030706f..000000000 --- a/test/KoreBuild.Tasks.Tests/DependencyVersionsFileTests.cs +++ /dev/null @@ -1,117 +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; -using System.IO; -using System.Linq; -using BuildTools.Tasks.Tests; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Construction; -using Microsoft.Build.Utilities; -using Xunit; -using Xunit.Abstractions; - -namespace KoreBuild.Tasks.Tests -{ - [Collection(nameof(MSBuildTestCollection))] - public class DependencyVersionsFileTests : IDisposable - { - private readonly string _tempFile; - private readonly ITestOutputHelper _output; - - public DependencyVersionsFileTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) - { - _output = output; - fixture.InitializeEnvironment(output); - _tempFile = Path.Combine(AppContext.BaseDirectory, Path.GetRandomFileName()); - } - - public void Dispose() - { - if (File.Exists(_tempFile)) - { - File.Delete(_tempFile); - } - } - - [Fact] - public void ItSortsVariablesAlphabetically() - { - var depsFile = DependencyVersionsFile.Create(addOverrideImport: true); - depsFile.Update("XyzPackageVersion", "123"); - depsFile.Update("AbcPackageVersion", "456"); - depsFile.Save(_tempFile); - - var project = ProjectRootElement.Open(_tempFile); - _output.WriteLine(File.ReadAllText(_tempFile)); - - var versions = Assert.Single(project.PropertyGroups, p => p.Label == DependencyVersionsFile.AutoPackageVersionsLabel); - Assert.Collection(versions.Properties, - v => Assert.Equal("AbcPackageVersion", v.Name), - v => Assert.Equal("XyzPackageVersion", v.Name)); - } - - [Fact] - public void SetIsCaseInsensitive() - { - var depsFile = DependencyVersionsFile.Create(addOverrideImport: true); - depsFile.Update("XunitRunnerVisualStudioVersion", "2.3.0"); - depsFile.Update("XunitRunnerVisualstudioVersion", "2.4.0"); - depsFile.Save(_tempFile); - - var project = ProjectRootElement.Open(_tempFile); - _output.WriteLine(File.ReadAllText(_tempFile)); - - var versions = Assert.Single(project.PropertyGroups, p => p.Label == DependencyVersionsFile.AutoPackageVersionsLabel); - var prop = Assert.Single(versions.Properties); - Assert.Equal("XunitRunnerVisualStudioVersion", prop.Name); - Assert.Equal("2.4.0", prop.Value); - } - - [Theory] - [InlineData("Microsoft.Data.Sqlite", "MicrosoftDataSqlitePackageVersion")] - [InlineData("SQLitePCLRaw.bundle_green", "SQLitePCLRawBundleGreenPackageVersion")] - [InlineData("runtime.win-x64.Microsoft.NETCore", "RuntimeWinX64MicrosoftNETCorePackageVersion")] - public void GeneratesVariableName(string id, string varName) - { - Assert.Equal(varName, DependencyVersionsFile.GetVariableName(id)); - } - - [Fact] - public void AdditionalImportsAreAdded_WithOverrideImportFalse() - { - // Arrange - var path = "obj/test.props"; - var depsFile = DependencyVersionsFile.Create(addOverrideImport: false, additionalImports: new[] { path }); - depsFile.Save(_tempFile); - - // Act - var project = ProjectRootElement.Open(_tempFile); - _output.WriteLine(File.ReadAllText(_tempFile)); - - // Assert - var import = Assert.Single(project.Imports); - Assert.Equal(path, import.Project); - } - - [Fact] - public void AdditionalImportsAreAdded_WithOverrideImportTrue() - { - // Arrange - var path = "obj/external.props"; - var depsFile = DependencyVersionsFile.Create(addOverrideImport: true, additionalImports: new[] { path }); - depsFile.Save(_tempFile); - - // Act - var project = ProjectRootElement.Open(_tempFile); - _output.WriteLine(File.ReadAllText(_tempFile)); - - // Assert - Assert.Collection( - project.Imports, - import => Assert.Equal(path, import.Project), - import => Assert.Equal("$(DotNetPackageVersionPropsPath)", import.Project)); - } - } -} diff --git a/test/KoreBuild.Tasks.Tests/DownloadNuGetPackagesTests.cs b/test/KoreBuild.Tasks.Tests/DownloadNuGetPackagesTests.cs deleted file mode 100644 index a1a72f3ef..000000000 --- a/test/KoreBuild.Tasks.Tests/DownloadNuGetPackagesTests.cs +++ /dev/null @@ -1,106 +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; -using System.IO; -using BuildTools.Tasks.Tests; -using Microsoft.Build.Utilities; -using Xunit; -using Xunit.Abstractions; -using Task = System.Threading.Tasks.Task; - -namespace KoreBuild.Tasks.Tests -{ - public class DownloadNuGetPackagesTest - { - private readonly ITestOutputHelper _output; - - public DownloadNuGetPackagesTest(ITestOutputHelper output) - { - _output = output; - } - - [Fact] - public async Task ItDownloadPackages() - { - var packages = new[] - { - new TaskItem("Newtonsoft.Json", new Hashtable - { - ["Version"] = "9.0.1", - ["Source"] = " https://api.nuget.org/v3/index.json ; ;https://api.nuget.org/v3/index.json; https://dotnetfeed.blob.core.windows.net/dotnet-core/index.json " - }), - }; - - var task = new DownloadNuGetPackages - { - Packages = packages, - DestinationFolder = AppContext.BaseDirectory, - BuildEngine = new MockEngine(_output), - TimeoutSeconds = 120, - }; - var expectedPath = Path.Combine(AppContext.BaseDirectory, "newtonsoft.json.9.0.1.nupkg").Replace('\\', '/'); - if (File.Exists(expectedPath)) - { - File.Delete(expectedPath); - } - - Assert.False(File.Exists(expectedPath), "The file should not exist yet"); - Assert.True(await task.ExecuteAsync(), "Task should pass"); - var file = Assert.Single(task.Files); - Assert.Equal(expectedPath, file.ItemSpec.Replace('\\', '/')); - Assert.True(File.Exists(expectedPath), "The file should exist"); - } - - [Fact] - public async Task ItFailsForPackagesThatDoNotExist() - { - var packages = new[] - { - new TaskItem("SomePackage", new Hashtable { ["Version"] = "1.0.0", ["Source"] = AppContext.BaseDirectory }), - }; - - var engine = new MockEngine(_output) { ContinueOnError = true }; - var task = new DownloadNuGetPackages - { - Packages = packages, - DestinationFolder = AppContext.BaseDirectory, - BuildEngine = engine, - TimeoutSeconds = 120, - }; - - Assert.False(await task.ExecuteAsync(), "Task should fail"); - Assert.NotEmpty(engine.Errors); - Assert.Contains(engine.Errors, m => m.Message.Contains("SomePackage 1.0.0 is not available")); - } - - [Fact] - public async Task ItFindsPackageWhenMultipleFeedsAreSpecified() - { - var packages = new[] - { - new TaskItem("Newtonsoft.Json", new Hashtable { ["Version"] = "9.0.1", ["Source"] = $"{AppContext.BaseDirectory};https://api.nuget.org/v3/index.json"} ), - }; - - var task = new DownloadNuGetPackages - { - Packages = packages, - DestinationFolder = AppContext.BaseDirectory, - BuildEngine = new MockEngine(_output), - TimeoutSeconds = 120, - }; - var expectedPath = Path.Combine(AppContext.BaseDirectory, "newtonsoft.json.9.0.1.nupkg").Replace('\\', '/'); - if (File.Exists(expectedPath)) - { - File.Delete(expectedPath); - } - - Assert.False(File.Exists(expectedPath), "The file should not exist yet"); - Assert.True(await task.ExecuteAsync(), "Task should pass"); - var file = Assert.Single(task.Files); - Assert.Equal(expectedPath, file.ItemSpec.Replace('\\', '/')); - Assert.True(File.Exists(expectedPath), "The file should exist"); - } - } -} diff --git a/test/KoreBuild.Tasks.Tests/GenerateDependenciesPropsFileTests.cs b/test/KoreBuild.Tasks.Tests/GenerateDependenciesPropsFileTests.cs deleted file mode 100644 index 0748aec14..000000000 --- a/test/KoreBuild.Tasks.Tests/GenerateDependenciesPropsFileTests.cs +++ /dev/null @@ -1,151 +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; -using System.IO; -using BuildTools.Tasks.Tests; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Construction; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using Xunit; -using Xunit.Abstractions; - -namespace KoreBuild.Tasks.Tests -{ - [Collection(nameof(MSBuildTestCollection))] - public class GenerateDependenciesPropsFileTests : IDisposable - { - private readonly ITestOutputHelper _output; - private readonly string _tempDir; - - public GenerateDependenciesPropsFileTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) - { - _output = output; - _tempDir = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - Directory.CreateDirectory(_tempDir); - fixture.InitializeEnvironment(output); - } - - [Fact] - public void GeneratesVariableName() - { - var generatedFile = Path.Combine(_tempDir, "deps.props"); - var csproj = Path.Combine(_tempDir, "test.csproj"); - CreateProject(csproj, "1.2.3"); - - var task = new GenerateDependenciesPropsFile - { - BuildEngine = new MockEngine(_output), - DependenciesFile = generatedFile, - Projects = new[] { new TaskItem(csproj) }, - Properties = Array.Empty(), - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - var depsFile = ProjectRootElement.Open(generatedFile); - _output.WriteLine(File.ReadAllText(generatedFile)); - var pg = Assert.Single(depsFile.PropertyGroups, p => p.Label == DependencyVersionsFile.AutoPackageVersionsLabel); - var prop = Assert.Single(pg.Properties, p => p.Name == "MyDependencyPackageVersion"); - Assert.Equal("1.2.3", prop.Value); - } - - [Fact] - public void IgnoresImplicitlyDefinedVariables() - { - var generatedFile = Path.Combine(_tempDir, "deps.props"); - var csproj = Path.Combine(_tempDir, "test.csproj"); - File.WriteAllText(csproj, $@" - - - netstandard2.0 - -".Replace('`', '"')); - - var task = new GenerateDependenciesPropsFile - { - BuildEngine = new MockEngine(_output), - DependenciesFile = generatedFile, - Projects = new[] { new TaskItem(csproj) }, - Properties = Array.Empty(), - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - var depsFile = ProjectRootElement.Open(generatedFile); - _output.WriteLine(File.ReadAllText(generatedFile)); - var pg = Assert.Single(depsFile.PropertyGroups, p => p.Label == DependencyVersionsFile.AutoPackageVersionsLabel); - Assert.Empty(pg.Properties); - } - - [Fact] - public void FailsWhenConflictingVersions() - { - var generatedFile = Path.Combine(_tempDir, "deps.props"); - var csproj1 = Path.Combine(_tempDir, "test1.csproj"); - var csproj2 = Path.Combine(_tempDir, "test2.csproj"); - CreateProject(csproj1, "1.2.3"); - CreateProject(csproj2, "4.5.6"); - - var engine = new MockEngine(_output) { ContinueOnError = true }; - var task = new GenerateDependenciesPropsFile - { - BuildEngine = engine, - DependenciesFile = generatedFile, - Projects = new[] { new TaskItem(csproj1), new TaskItem(csproj2) }, - Properties = Array.Empty(), - }; - - Assert.False(task.Execute(), "Task is expected to fail"); - Assert.Single(engine.Errors, e => e.Code == KoreBuildErrors.Prefix + KoreBuildErrors.ConflictingPackageReferenceVersions); - } - - [Fact] - public void DoesNotFailWhenConflictingVersionsAreSuppressed() - { - var generatedFile = Path.Combine(_tempDir, "deps.props"); - var csproj1 = Path.Combine(_tempDir, "test1.csproj"); - var csproj2 = Path.Combine(_tempDir, "test2.csproj"); - CreateProject(csproj1, "1.2.3"); - - File.WriteAllText(csproj2, $@" - - - netstandard2.0 - - - - -".Replace('`', '"')); - - var task = new GenerateDependenciesPropsFile - { - BuildEngine = new MockEngine(_output), - DependenciesFile = generatedFile, - Projects = new[] { new TaskItem(csproj1), new TaskItem(csproj2) }, - Properties = Array.Empty(), - }; - - Assert.True(task.Execute(), "Task is expected to oass"); - } - - private static void CreateProject(string csprojFilePath, string version) - { - File.WriteAllText(csprojFilePath, $@" - - - netstandard2.0 - - - - -".Replace('`', '"')); - } - - - public void Dispose() - { - Directory.Delete(_tempDir, recursive: true); - } - } -} diff --git a/test/KoreBuild.Tasks.Tests/GeneratePackageVersionPropsFileTests.cs b/test/KoreBuild.Tasks.Tests/GeneratePackageVersionPropsFileTests.cs deleted file mode 100644 index 86c731b8c..000000000 --- a/test/KoreBuild.Tasks.Tests/GeneratePackageVersionPropsFileTests.cs +++ /dev/null @@ -1,116 +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; -using System.IO; -using BuildTools.Tasks.Tests; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Construction; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using Xunit; -using Xunit.Abstractions; - -namespace KoreBuild.Tasks.Tests -{ - [Collection(nameof(MSBuildTestCollection))] - public class GeneratePackageVersionPropsFileTests : IDisposable - { - private readonly ITestOutputHelper _output; - private readonly string _tempFile; - - public GeneratePackageVersionPropsFileTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) - { - _output = output; - _tempFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - fixture.InitializeEnvironment(output); - } - - [Fact] - public void GeneratesFile() - { - var engine = new MockEngine(_output); - var task = new GeneratePackageVersionPropsFile - { - BuildEngine = engine, - Packages = new[] - { - // Order is important. These are intentionally reverse sorted to ensure the generated file sorts properties by prop name - new TaskItem("Newtonsoft.Json", new Hashtable{["Version"] = "10.0.3", ["VariableName"] = "JsonNetVersion"}), - new TaskItem("Microsoft.Azure", new Hashtable{["Version"] = "1.2.0"}), - new TaskItem("Another.Package", new Hashtable{["Version"] = "0.0.1", ["TargetFramework"] = "netstandard1.0"}), - }, - OutputPath = _tempFile, - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - - var project = ProjectRootElement.Open(_tempFile); - _output.WriteLine(File.ReadAllText(_tempFile)); - - Assert.Empty(project.Imports); - Assert.Empty(project.ImportGroups); - - var defaultPropGroup = Assert.Single(project.PropertyGroups, pg => string.IsNullOrEmpty(pg.Label)); - var allProjectsProp = Assert.Single(defaultPropGroup.Properties); - Assert.Equal("MSBuildAllProjects", allProjectsProp.Name); - Assert.Empty(allProjectsProp.Condition); - Assert.Equal("$(MSBuildAllProjects);$(MSBuildThisFileFullPath)", allProjectsProp.Value); - - var versions = Assert.Single(project.PropertyGroups, pg => pg.Label == DependencyVersionsFile.AutoPackageVersionsLabel); - - // Order is important. These should be sorted. - Assert.Collection(versions.Properties, - p => - { - Assert.Equal("AnotherPackagePackageVersion", p.Name); - Assert.Equal("Another.Package", p.Label); - Assert.Equal("0.0.1", p.Value); - Assert.Empty(p.Condition); - }, - p => - { - Assert.Equal("JsonNetVersion", p.Name); - Assert.Equal("Newtonsoft.Json", p.Label); - Assert.Equal("10.0.3", p.Value); - Assert.Empty(p.Condition); - }, - p => - { - Assert.Equal("MicrosoftAzurePackageVersion", p.Name); - Assert.Equal("Microsoft.Azure", p.Label); - Assert.Equal("1.2.0", p.Value); - Assert.Empty(p.Condition); - }); - } - - [Fact] - public void GeneratesImport() - { - var task = new GeneratePackageVersionPropsFile - { - BuildEngine = new MockEngine(_output), - Packages = Array.Empty(), - AddOverrideImport = true, - OutputPath = _tempFile, - }; - - Assert.True(task.Execute(), "Task is expected to pass"); - var project = ProjectRootElement.Open(_tempFile); - _output.WriteLine(File.ReadAllText(_tempFile)); - - var import = Assert.Single(project.Imports); - Assert.Equal("$(DotNetPackageVersionPropsPath)", import.Project); - Assert.Equal(" '$(DotNetPackageVersionPropsPath)' != '' ", import.Condition); - } - - public void Dispose() - { - if (File.Exists(_tempFile)) - { - File.Delete(_tempFile); - } - } - } -} diff --git a/test/KoreBuild.Tasks.Tests/InstallToolsetsTests.cs b/test/KoreBuild.Tasks.Tests/InstallToolsetsTests.cs deleted file mode 100644 index c66e67bf8..000000000 --- a/test/KoreBuild.Tasks.Tests/InstallToolsetsTests.cs +++ /dev/null @@ -1,54 +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.IO; -using System.Runtime.InteropServices; -using BuildTools.Tasks.Tests; -using Xunit; - -namespace KoreBuild.Tasks.Tests -{ - public class InstallToolsetsTests : IDisposable - { - private readonly string _configFile; - - public InstallToolsetsTests() - { - _configFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - } - - public void Dispose() - { - if (File.Exists(_configFile)) - { - File.Delete(_configFile); - } - } - - [Fact] - public void FailsIfVsIsRequiredOnNonWindows() - { - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - return; - } - - File.WriteAllText(_configFile, @" -{ - ""toolsets"": { - ""visualstudio"": { - ""required"": [""macos"", ""linux""] - }, - } -}"); - var task = new InstallToolsets - { - BuildEngine = new MockEngine { ContinueOnError = true }, - ConfigFile = _configFile, - }; - - Assert.False(task.Execute(), "Task is expected to fail"); - } - } -} diff --git a/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj b/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj index a0cfe0a82..2ec3473a6 100644 --- a/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj +++ b/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj @@ -28,11 +28,5 @@ - - - PreserveNewest - - - diff --git a/test/KoreBuild.Tasks.Tests/PackNuSpecTests.cs b/test/KoreBuild.Tasks.Tests/PackNuSpecTests.cs deleted file mode 100644 index bdadd3e38..000000000 --- a/test/KoreBuild.Tasks.Tests/PackNuSpecTests.cs +++ /dev/null @@ -1,393 +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; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using BuildTools.Tasks.Tests; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using NuGet.Frameworks; -using NuGet.Packaging; -using NuGet.Versioning; -using Xunit; - -namespace KoreBuild.Tasks.Tests -{ - public class PackNuSpecTests : IDisposable - { - private readonly string _tempDir; - - public PackNuSpecTests() - { - _tempDir = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); - Directory.CreateDirectory(_tempDir); - } - - [Fact] - public void CreatesPackage() - { - var outputPath = Path.Combine(_tempDir, $"TestPackage.1.0.0.nupkg"); - Directory.CreateDirectory(Path.Combine(_tempDir, "tools")); - Directory.CreateDirectory(Path.Combine(_tempDir, "lib", "netstandard2.0")); - File.WriteAllText(Path.Combine(_tempDir, "tools", "test.sh"), ""); - File.WriteAllText(Path.Combine(_tempDir, "lib", "netstandard2.0", "TestPackage.dll"), ""); - - var nuspec = CreateNuspec(@" - - - - TestPackage - 1.0.0 - Test - Test - - - - - - - "); - - var task = new PackNuSpec - { - NuspecPath = nuspec, - BasePath = _tempDir, - BuildEngine = new MockEngine(), - DestinationFolder = _tempDir, - }; - - Assert.True(task.Execute(), "The task should have passed"); - Assert.True(File.Exists(outputPath), "Should have produced a nupkg file in " + _tempDir); - var result = Assert.Single(task.Packages); - Assert.Equal(outputPath, result.ItemSpec); - using (var reader = new PackageArchiveReader(outputPath)) - { - var libItems = reader.GetLibItems().ToList(); - var libItem = Assert.Single(libItems); - Assert.Equal(FrameworkConstants.CommonFrameworks.NetStandard20, libItem.TargetFramework); - var assembly = Assert.Single(libItem.Items); - Assert.Equal("lib/netstandard2.0/TestPackage.dll", assembly); - - Assert.Contains(reader.GetFiles(), f => f == "tools/test.sh"); - } - } - - [Fact] - public void AppliesProperties() - { - var nuspec = CreateNuspec(@" - - - - HasProperties - $version$ - Microsoft - $description$ - $copyright$ - - - - - - - "); - - var version = "1.2.3"; - var description = "A test package\n\n\nwith newlines"; - var outputPath = Path.Combine(_tempDir, $"HasProperties.{version}.nupkg"); - var task = new PackNuSpec - { - NuspecPath = nuspec, - BasePath = _tempDir, - BuildEngine = new MockEngine(), - DestinationFolder = _tempDir, - Properties = new[] { $"version={version}", "", "", $" description ={description}", "copyright=", }, - }; - - Assert.True(task.Execute(), "The task should have passed"); - Assert.True(File.Exists(outputPath), "Should have produced a nupkg file in " + _tempDir); - - using (var reader = new PackageArchiveReader(outputPath)) - { - var metadata = new PackageBuilder(reader.GetNuspec(), basePath: null); - Assert.Equal(version, metadata.Version.ToString()); - Assert.Empty(metadata.Copyright); - Assert.Equal(description, metadata.Description); - } - } - - [Fact] - public void AddsDependencies() - { - var nuspec = CreateNuspec(@" - - - - HasDependencies - 1.0.0 - Test - Test - - - - - - - "); - - var task = new PackNuSpec - { - NuspecPath = nuspec, - BasePath = _tempDir, - BuildEngine = new MockEngine(), - DestinationFolder = _tempDir, - Dependencies = new[] - { - new TaskItem("OtherPackage", new Hashtable { ["Version"] = "[1.0.0, 2.0.0)"}), - new TaskItem("PackageInTfm", new Hashtable { ["TargetFramework"] = "netstandard1.0", ["Version"] = "0.1.0-beta" }), - new TaskItem("PackageInTfm", new Hashtable { ["TargetFramework"] = "netstandard1.1", ["Version"] = "0.2.0-beta" }), - } - }; - - Assert.True(task.Execute(), "The task should have passed"); - var result = Assert.Single(task.Packages); - - using (var reader = new PackageArchiveReader(result.ItemSpec)) - { - var metadata = new PackageBuilder(reader.GetNuspec(), basePath: null); - - var noTfmGroup = Assert.Single(metadata.DependencyGroups, d => d.TargetFramework.Equals(NuGetFramework.UnsupportedFramework)); - Assert.Equal(2, noTfmGroup.Packages.Count()); - Assert.Single(noTfmGroup.Packages, p => p.Id == "OtherPackage" && p.VersionRange.Equals(VersionRange.Parse("[1.0.0, 2.0.0)"))); - Assert.Single(noTfmGroup.Packages, p => p.Id == "AlreadyInNuspec" && p.VersionRange.Equals(VersionRange.Parse("[2.0.0]"))); - - var netstandard10Group = Assert.Single(metadata.DependencyGroups, d => d.TargetFramework.Equals(FrameworkConstants.CommonFrameworks.NetStandard10)); - var package1 = Assert.Single(netstandard10Group.Packages); - Assert.Equal("PackageInTfm", package1.Id); - Assert.Equal(VersionRange.Parse("0.1.0-beta"), package1.VersionRange); - - var netstandard11Group = Assert.Single(metadata.DependencyGroups, d => d.TargetFramework.Equals(FrameworkConstants.CommonFrameworks.NetStandard11)); - var package2 = Assert.Single(netstandard11Group.Packages); - Assert.Equal("PackageInTfm", package2.Id); - Assert.Equal(VersionRange.Parse("0.2.0-beta"), package2.VersionRange); - } - } - - [Fact] - public void WarnIfMissingFilesNodes() - { - var nuspec = CreateNuspec(@" - - - - HasNoFiles - 1.0.0 - Test - Test - - - "); - - var engine = new MockEngine(); - var task = new PackNuSpec - { - NuspecPath = nuspec, - BasePath = _tempDir, - BuildEngine = engine, - DestinationFolder = _tempDir, - }; - Assert.True(task.Execute()); - var warning = Assert.Single(engine.Warnings); - Assert.Equal("KRB" + KoreBuildErrors.NuspecMissingFilesNode, warning.Code); - } - - [Fact] - public void PacksFiles() - { - var files = new[] - { - Path.Combine("lib", "netstandard1.0", "_._"), - "top.txt", - }; - - var items = new List(); - - foreach (var file in files) - { - var path = Path.Combine(_tempDir, file); - Directory.CreateDirectory(Path.GetDirectoryName(path)); - File.WriteAllText(path, ""); - items.Add(new TaskItem(path, new Hashtable { ["PackagePath"] = file })); - } - - var nuspec = CreateNuspec(@" - - - - HasFiles - 1.0.0 - Test - Test - - - - "); - - var engine = new MockEngine(); - var task = new PackNuSpec - { - NuspecPath = nuspec, - BasePath = _tempDir, - BuildEngine = engine, - PackageFiles = items.ToArray(), - DestinationFolder = _tempDir, - }; - - Assert.True(task.Execute()); - var result = Assert.Single(task.Packages); - - using (var reader = new PackageArchiveReader(result.ItemSpec)) - { - Assert.Contains("lib/netstandard1.0/_._", reader.GetFiles()); - Assert.Contains("top.txt", reader.GetFiles()); - } - } - - [Theory] - [InlineData("")] - [InlineData("/")] - [InlineData("somedir/")] - public void FailsForBadPackagePath(string path) - { - var nuspec = CreateNuspec(@" - - - - HasFiles - 1.0.0 - Test - Test - - - - "); - - var engine = new MockEngine { ContinueOnError = true }; - var task = new PackNuSpec - { - NuspecPath = nuspec, - BasePath = _tempDir, - BuildEngine = engine, - PackageFiles = new[] { new TaskItem("file.txt", new Hashtable { ["PackagePath"] = path }) }, - DestinationFolder = _tempDir, - }; - - Assert.False(task.Execute(), "Task should fail"); - var error = Assert.Single(engine.Errors); - Assert.Equal("KRB" + KoreBuildErrors.InvalidPackagePathMetadata, error.Code); - } - - [Fact] - public void SetsLibraryIncludeFlagsOnDependency() - { - var nuspec = CreateNuspec(@" - - - - HasDependencies - 1.0.0 - Test - Test - - - - "); - - var task = new PackNuSpec - { - NuspecPath = nuspec, - BasePath = _tempDir, - BuildEngine = new MockEngine(), - DestinationFolder = _tempDir, - Dependencies = new[] - { - new TaskItem("Include", new Hashtable { ["Version"] = "1.0.0", ["IncludeAssets"] = "Build;Analyzers"}), - new TaskItem("Exclude", new Hashtable { ["Version"] = "1.0.0", ["ExcludeAssets"] = "Compile;Native"}), - new TaskItem("Both", new Hashtable { ["Version"] = "1.0.0", ["IncludeAssets"] = "Build; Analyzers", ["ExcludeAssets"] = "Build; Native; ContentFiles"}), - } - }; - - Assert.True(task.Execute(), "The task should have passed"); - var result = Assert.Single(task.Packages); - - using (var reader = new PackageArchiveReader(result.ItemSpec)) - { - var metadata = new PackageBuilder(reader.GetNuspec(), basePath: null); - var packages = Assert.Single(metadata.DependencyGroups).Packages; - Assert.Equal(3, packages.Count()); - - var include = Assert.Single(packages, p => p.Id == "Include").Include; - Assert.Equal(new[] { "Build", "Analyzers" }, include); - - var exclude = Assert.Single(packages, p => p.Id == "Exclude").Exclude; - Assert.Equal(new[] { "Compile", "Native" }, exclude); - - var both = Assert.Single(packages, p => p.Id == "Both"); - Assert.Equal(new[] { "Build", "Analyzers" }, both.Include); - Assert.Equal(new[] { "Build", "Native", "ContentFiles" }, both.Exclude); - } - } - - [Fact] - public void FailsIfBothOutputPathAndDestinationFolderAreGiven() - { - var engine = new MockEngine { ContinueOnError = true }; - var task = new PackNuSpec - { - BuildEngine = engine, - OutputPath = _tempDir, - DestinationFolder = _tempDir, - NuspecPath = CreateNuspec(""), - }; - - Assert.False(task.Execute(), "Task should fail"); - Assert.Contains("Either DestinationFolder and OutputPath must be specified, but only not both.", engine.Errors.Select(e => e.Message)); - } - - [Fact] - public void FailsIfNeitherOutputPathAndDestinationFolderAreGiven() - { - var engine = new MockEngine { ContinueOnError = true }; - var task = new PackNuSpec - { - BuildEngine = engine, - NuspecPath = CreateNuspec(""), - }; - - Assert.False(task.Execute(), "Task should fail"); - Assert.Contains("Either DestinationFolder and OutputPath must be specified, but only not both.", engine.Errors.Select(e => e.Message)); - } - - private string CreateNuspec(string xml) - { - var nuspecPath = Path.Combine(_tempDir, Path.GetRandomFileName() + ".nuspec"); - File.WriteAllText(nuspecPath, xml.Replace('`', '"').TrimStart()); - return nuspecPath; - } - - public void Dispose() - { - try - { - Directory.Delete(_tempDir, recursive: true); - } - catch - { - Console.WriteLine("Failed to delete " + _tempDir); - } - } - } -} diff --git a/test/KoreBuild.Tasks.Tests/SolutionInfoFactoryTests.cs b/test/KoreBuild.Tasks.Tests/SolutionInfoFactoryTests.cs deleted file mode 100644 index f2eaad004..000000000 --- a/test/KoreBuild.Tasks.Tests/SolutionInfoFactoryTests.cs +++ /dev/null @@ -1,96 +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.IO; -using KoreBuild.Tasks.ProjectModel; -using Xunit; - -namespace KoreBuild.Tasks.Tests -{ - public class SolutionInfoFactoryTests : IDisposable - { - private readonly string _slnFile; - - public SolutionInfoFactoryTests() - { - _slnFile = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); - } - - [Theory] - [InlineData("", new[] { "ClassLib1", "VsixProject" })] - [InlineData("Debug", new[] { "ClassLib1", "VsixProject" })] - [InlineData("DebugNoVSIX", new[] { "ClassLib1" })] - public void FindsProjectsByDefaultConfiguration(string config, string[] projects) - { - File.WriteAllText(_slnFile, @" -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26124.0 -MinimumVisualStudioVersion = 15.0.26124.0 -Project(`{2150E333-8FDC-42A3-9474-1A3956D46DE8}`) = `src`, `src`, `{6BC8A037-601B-412E-B394-92F55C01C7A6}` -EndProject -Project(`{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}`) = `ClassLib1`, `src\ClassLib1\ClassLib1.csproj`, `{89EF0B05-98D4-4C4D-8870-718571091F79}` -EndProject -Project(`{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}`) = `VsixProject`, `src\VsixProject\VsixProject.csproj`, `{86986537-8DF5-423F-A3A8-0CA568A9FFC4}` -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - DebugNoVSIX|Any CPU = DebugNoVSIX|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {89EF0B05-98D4-4C4D-8870-718571091F79}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {89EF0B05-98D4-4C4D-8870-718571091F79}.Debug|Any CPU.Build.0 = Debug|Any CPU - {86986537-8DF5-423F-A3A8-0CA568A9FFC4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {86986537-8DF5-423F-A3A8-0CA568A9FFC4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {89EF0B05-98D4-4C4D-8870-718571091F79}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - {89EF0B05-98D4-4C4D-8870-718571091F79}.DebugNoVSIX|Any CPU.Build.0 = Debug|Any CPU - {86986537-8DF5-423F-A3A8-0CA568A9FFC4}.DebugNoVSIX|Any CPU.ActiveCfg = Debug|Any CPU - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {89EF0B05-98D4-4C4D-8870-718571091F79} = {6BC8A037-601B-412E-B394-92F55C01C7A6} - {86986537-8DF5-423F-A3A8-0CA568A9FFC4} = {6BC8A037-601B-412E-B394-92F55C01C7A6} - EndGlobalSection -EndGlobal -".Replace('`', '"')); - - var solution = SolutionInfoFactory.Create(_slnFile, config); - Assert.Equal(projects.Length, solution.Projects.Count); - Assert.All(projects, expected => Assert.Contains(solution.Projects, proj => Path.GetFileNameWithoutExtension(proj) == expected)); - } - - [Fact] - public void ThrowsForBadConfigName() - { - File.WriteAllText(_slnFile, @" -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26124.0 -MinimumVisualStudioVersion = 15.0.26124.0 -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection -EndGlobal -".Replace('`', '"')); - - Assert.Throws(() => SolutionInfoFactory.Create(_slnFile, "Release")); - } - - public void Dispose() - { - try - { - File.Delete(_slnFile); - } - catch { } - } - } -} diff --git a/test/KoreBuild.Tasks.Tests/TestResources/lorem.bin b/test/KoreBuild.Tasks.Tests/TestResources/lorem.bin deleted file mode 100644 index 2408fe952..000000000 --- a/test/KoreBuild.Tasks.Tests/TestResources/lorem.bin +++ /dev/null @@ -1 +0,0 @@ -Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque et nulla laoreet ex pharetra congue. Sed gravida justo orci. Nunc nec est vitae purus accumsan consectetur et vel risus. Sed lobortis nulla eu feugiat ornare. Pellentesque ornare semper lorem at vestibulum. Aliquam molestie erat nunc. Curabitur suscipit aliquet quam quis fringilla. diff --git a/test/KoreBuild.Tasks.Tests/UpgradeDependenciesTests.cs b/test/KoreBuild.Tasks.Tests/UpgradeDependenciesTests.cs deleted file mode 100644 index 3de7997f3..000000000 --- a/test/KoreBuild.Tasks.Tests/UpgradeDependenciesTests.cs +++ /dev/null @@ -1,254 +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.IO; -using System.Threading.Tasks; -using BuildTools.Tasks.Tests; -using KoreBuild.Tasks.Utilities; -using Microsoft.Build.Construction; -using Microsoft.Build.Evaluation; -using NuGet.Packaging; -using NuGet.Packaging.Core; -using NuGet.Versioning; -using Xunit; -using Xunit.Abstractions; - -namespace KoreBuild.Tasks.Tests -{ - [Collection(nameof(MSBuildTestCollection))] - public class UpgradeDependenciesTests : IDisposable - { - private readonly string _tempDir; - private readonly ITestOutputHelper _output; - - public UpgradeDependenciesTests(ITestOutputHelper output, MSBuildTestCollectionFixture fixture) - { - fixture.InitializeEnvironment(output); - _tempDir = Path.Combine(AppContext.BaseDirectory, Path.GetRandomFileName()); - Directory.CreateDirectory(_tempDir); - _output = output; - } - - [Fact] - public async Task WarnsWhenVariableIsNotInPackage() - { - // arrange - var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); - var lineupPackagePath = CreateLineup(packageId); - var depsFilePath = CreateProjectDepsFile(new VersionVariable("PackageVersionVar", "1.0.0")); - var engine = new MockEngine(_output); - - // act - var task = new UpgradeDependencies - { - BuildEngine = engine, - DependenciesFile = depsFilePath, - LineupPackageId = packageId.Id, - LineupPackageRestoreSource = _tempDir, - }; - - // assert - Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); - var warning = Assert.Single(engine.Warnings); - Assert.Equal(KoreBuildErrors.Prefix + KoreBuildErrors.PackageVersionNotFoundInLineup, warning.Code); - - var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); - Assert.Equal("1.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); - } - - [Fact] - public async Task ModifiesVariableValue() - { - // arrange - var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); - var lineupPackagePath = CreateLineup(packageId, new VersionVariable("PackageVersionVar", "2.0.0")); - var depsFilePath = CreateProjectDepsFile(new VersionVariable("PackageVersionVar", "1.0.0")); - - // act - var task = new UpgradeDependencies - { - BuildEngine = new MockEngine(_output), - DependenciesFile = depsFilePath, - LineupPackageId = packageId.Id, - LineupPackageRestoreSource = _tempDir, - }; - - // assert - Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); - var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); - Assert.Equal("2.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); - Assert.False(modifiedDepsFile.VersionVariables["PackageVersionVar"].IsReadOnly); - } - - - [Fact] - public async Task DoesNotModifyPinnedVariableValue() - { - // arrange - var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); - var lineupPackagePath = CreateLineup(packageId, new VersionVariable("PackageVersionVar", "2.0.0")); - var depsFilePath = CreateProjectDepsFile(new VersionVariable("PackageVersionVar", "1.0.0") { IsReadOnly = true }); - - // act - var task = new UpgradeDependencies - { - BuildEngine = new MockEngine(_output), - DependenciesFile = depsFilePath, - LineupPackageId = packageId.Id, - LineupPackageRestoreSource = _tempDir, - }; - - // assert - Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); - _output.WriteLine(File.ReadAllText(depsFilePath)); - var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); - Assert.Equal("1.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); - Assert.True(modifiedDepsFile.VersionVariables["PackageVersionVar"].IsReadOnly); - } - - - [Fact] - public async Task ModifiesVariableValueUsingDepsFile() - { - // arrange - var depsFilePath = CreateProjectDepsFile(new VersionVariable("PackageVersionVar", "1.0.0")); - var updatedDepsFilePath = CreateProjectDepsFile(Path.Combine(_tempDir, "dependencies.props"), new VersionVariable("PackageVersionVar", "2.0.0")); - - // act - var task = new UpgradeDependencies - { - BuildEngine = new MockEngine(_output), - DependenciesFile = depsFilePath, - LineupDependenciesFile = updatedDepsFilePath - }; - - // assert - Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); - var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); - Assert.Equal("2.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); - } - - [Fact] - public async Task SnapsInternalAspNetCoreSdkToBuildTools() - { - // arrange - var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); - var lineupPackagePath = CreateLineup(packageId, new VersionVariable("InternalAspNetCoreSdkPackageVersion", "2.0.0")); - var depsFilePath = CreateProjectDepsFile(new VersionVariable("InternalAspNetCoreSdkPackageVersion", "1.0.0")); - - // act - var task = new UpgradeDependencies - { - BuildEngine = new MockEngine(_output), - DependenciesFile = depsFilePath, - LineupPackageId = packageId.Id, - LineupPackageRestoreSource = _tempDir, - }; - - // assert - Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); - var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); - Assert.Equal(KoreBuildVersion.Current, modifiedDepsFile.VersionVariables["InternalAspNetCoreSdkPackageVersion"].Version); - } - - [Fact] - public async Task DoesNotModifiesFileIfNoChanges() - { - // arrange - var packageId = new PackageIdentity("Lineup", NuGetVersion.Parse("1.0.0")); - var pkg = new VersionVariable("PackageVersionVar", "1.0.0"); - var lineupPackagePath = CreateLineup(packageId, pkg); - var depsFilePath = CreateProjectDepsFile(pkg); - var created = File.GetLastWriteTime(depsFilePath); - - // act - var task = new UpgradeDependencies - { - BuildEngine = new MockEngine(_output), - DependenciesFile = depsFilePath, - LineupPackageId = packageId.Id, - LineupPackageRestoreSource = _tempDir, - }; - - // assert - Assert.True(await task.ExecuteAsync(), "Task is expected to pass"); - var modifiedDepsFile = DependencyVersionsFile.Load(depsFilePath); - Assert.Equal("1.0.0", modifiedDepsFile.VersionVariables["PackageVersionVar"].Version); - Assert.Equal(created, File.GetLastWriteTime(depsFilePath)); - } - - private string CreateProjectDepsFile(params VersionVariable[] variables) - { - return CreateProjectDepsFile(Path.Combine(_tempDir, "projectdeps.props"), variables); - } - - private string CreateProjectDepsFile(string depsFilePath, params VersionVariable[] variables) - { - var proj = ProjectRootElement.Create(NewProjectFileOptions.None); - var originalDepsFile = DependencyVersionsFile.Load(proj); - foreach (var item in variables) - { - if (item.IsReadOnly) - { - originalDepsFile.AddPinnedVariable(item.Name, item.Version); - } - else - { - originalDepsFile.Update(item.Name, item.Version); - } - } - originalDepsFile.Save(depsFilePath); - return depsFilePath; - } - - private string CreateLineup(PackageIdentity identity, params VersionVariable[] variables) - { - var output = Path.Combine(_tempDir, $"{identity.Id}.{identity.Version}.nupkg"); - - var proj = ProjectRootElement.Create(NewProjectFileOptions.None); - var depsFiles = DependencyVersionsFile.Load(proj); - foreach (var item in variables) - { - depsFiles.Update(item.Name, item.Version); - } - depsFiles.Save(Path.Combine(_tempDir, "dependencies.props")); - - var builder = new PackageBuilder - { - Id = identity.Id, - Version = identity.Version, - Owners = { "Test" }, - Authors = { "Test" }, - Description = "Test lineup package" - }; - - builder.AddFiles(_tempDir, "dependencies.props", "build/dependencies.props"); - - using (var stream = File.Create(output)) - { - builder.Save(stream); - } - - return output; - } - - public void Dispose() - { - Directory.Delete(_tempDir, recursive: true); - } - - private struct VersionVariable - { - public string Name; - public string Version; - internal bool IsReadOnly; - - public VersionVariable(string varName, string version) : this() - { - this.Name = varName; - this.Version = version; - } - } - } -} diff --git a/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj b/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj index 497bf8488..958d2f1da 100644 --- a/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj +++ b/testassets/RepoThatShouldFailToBuild/src/BadConsole/BadConsole.csproj @@ -1,4 +1,4 @@ - + Exe diff --git a/testassets/RepoWithGlobalTool/Directory.Build.props b/testassets/RepoWithGlobalTool/Directory.Build.props deleted file mode 100644 index 058246e40..000000000 --- a/testassets/RepoWithGlobalTool/Directory.Build.props +++ /dev/null @@ -1 +0,0 @@ - diff --git a/testassets/RepoWithGlobalTool/Directory.Build.targets b/testassets/RepoWithGlobalTool/Directory.Build.targets deleted file mode 100644 index b207ca315..000000000 --- a/testassets/RepoWithGlobalTool/Directory.Build.targets +++ /dev/null @@ -1,4 +0,0 @@ - - diff --git a/testassets/RepoWithGlobalTool/RepoWithGlobalTool.sln b/testassets/RepoWithGlobalTool/RepoWithGlobalTool.sln deleted file mode 100644 index af58340cc..000000000 --- a/testassets/RepoWithGlobalTool/RepoWithGlobalTool.sln +++ /dev/null @@ -1,34 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.26124.0 -MinimumVisualStudioVersion = 15.0.26124.0 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GlobalConsoleTool", "src\GlobalConsoleTool\GlobalConsoleTool.csproj", "{4F0E73BA-1E8D-41B2-8FE8-59E58228224F}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {4F0E73BA-1E8D-41B2-8FE8-59E58228224F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4F0E73BA-1E8D-41B2-8FE8-59E58228224F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4F0E73BA-1E8D-41B2-8FE8-59E58228224F}.Debug|x64.ActiveCfg = Debug|Any CPU - {4F0E73BA-1E8D-41B2-8FE8-59E58228224F}.Debug|x64.Build.0 = Debug|Any CPU - {4F0E73BA-1E8D-41B2-8FE8-59E58228224F}.Debug|x86.ActiveCfg = Debug|Any CPU - {4F0E73BA-1E8D-41B2-8FE8-59E58228224F}.Debug|x86.Build.0 = Debug|Any CPU - {4F0E73BA-1E8D-41B2-8FE8-59E58228224F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4F0E73BA-1E8D-41B2-8FE8-59E58228224F}.Release|Any CPU.Build.0 = Release|Any CPU - {4F0E73BA-1E8D-41B2-8FE8-59E58228224F}.Release|x64.ActiveCfg = Release|Any CPU - {4F0E73BA-1E8D-41B2-8FE8-59E58228224F}.Release|x64.Build.0 = Release|Any CPU - {4F0E73BA-1E8D-41B2-8FE8-59E58228224F}.Release|x86.ActiveCfg = Release|Any CPU - {4F0E73BA-1E8D-41B2-8FE8-59E58228224F}.Release|x86.Build.0 = Release|Any CPU - EndGlobalSection -EndGlobal diff --git a/testassets/RepoWithGlobalTool/build/dependencies.props b/testassets/RepoWithGlobalTool/build/dependencies.props deleted file mode 100644 index a932d8361..000000000 --- a/testassets/RepoWithGlobalTool/build/dependencies.props +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/testassets/RepoWithGlobalTool/korebuild.json b/testassets/RepoWithGlobalTool/korebuild.json deleted file mode 100644 index 8a276a7f3..000000000 --- a/testassets/RepoWithGlobalTool/korebuild.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/master/tools/korebuild.schema.json", - "channel": "master" -} diff --git a/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj b/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj deleted file mode 100644 index 06d3435d3..000000000 --- a/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/GlobalConsoleTool.csproj +++ /dev/null @@ -1,10 +0,0 @@ - - - - Exe - netcoreapp3.0 - true - win-x64;win-x86 - - - diff --git a/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/Program.cs b/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/Program.cs deleted file mode 100644 index e91098a2b..000000000 --- a/testassets/RepoWithGlobalTool/src/GlobalConsoleTool/Program.cs +++ /dev/null @@ -1,12 +0,0 @@ -using System; - -namespace GlobalConsoleTool -{ - class Program - { - static void Main(string[] args) - { - Console.WriteLine("Hello World!"); - } - } -} diff --git a/testassets/SimpleRepo/Directory.Build.props b/testassets/SimpleRepo/Directory.Build.props index 49ef3296a..31b0d1447 100644 --- a/testassets/SimpleRepo/Directory.Build.props +++ b/testassets/SimpleRepo/Directory.Build.props @@ -1,5 +1,8 @@ - + + + true + diff --git a/testassets/SimpleRepo/build/Sample.Lineup.nuspec b/testassets/SimpleRepo/build/Sample.Lineup.nuspec deleted file mode 100644 index 9dc148902..000000000 --- a/testassets/SimpleRepo/build/Sample.Lineup.nuspec +++ /dev/null @@ -1,15 +0,0 @@ - - - - Sample.Lineup - $version$ - KoreBuild - Description. - - - - - - - - diff --git a/testassets/SimpleRepo/build/repo.targets b/testassets/SimpleRepo/build/repo.targets index c7f3af77e..6971488f7 100644 --- a/testassets/SimpleRepo/build/repo.targets +++ b/testassets/SimpleRepo/build/repo.targets @@ -1,27 +1,9 @@ $(PrepareDependsOn);Greet - $(PackageDependsOn);PackLineup - $(VerifyDependsOn);TestNuGetPush;UpgradeDependencies - - Sample.Lineup - $(Version) - $(IntermediateDir) - - - - - - - - - - - - diff --git a/testassets/SimpleRepo/build/sources.props b/testassets/SimpleRepo/build/sources.props deleted file mode 100644 index a5c9ae8bc..000000000 --- a/testassets/SimpleRepo/build/sources.props +++ /dev/null @@ -1,5 +0,0 @@ - - - $(RestoreAdditionalProjectSources);$(KoreBuildBundledPackageFolder) - - diff --git a/testassets/SimpleRepo/build/tasks/RepoTasks.csproj b/testassets/SimpleRepo/build/tasks/RepoTasks.csproj index cdea37999..5567856ce 100644 --- a/testassets/SimpleRepo/build/tasks/RepoTasks.csproj +++ b/testassets/SimpleRepo/build/tasks/RepoTasks.csproj @@ -1,8 +1,9 @@ - + + netcoreapp3.0 - RepoTasks + diff --git a/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj b/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj index 852793c1f..e289a325d 100644 --- a/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj +++ b/testassets/SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj @@ -1,4 +1,4 @@ - + diff --git a/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj b/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj index 8de1419f3..2ea5a7ef8 100644 --- a/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj +++ b/testassets/SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj @@ -1,4 +1,4 @@ - + netcoreapp3.0 @@ -7,7 +7,6 @@ cowsay Simple.CliTool true - win-x64;win-x86 TestCert MyPackageSigningCert diff --git a/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj b/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj index 90776f448..cb7605251 100644 --- a/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj +++ b/testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj @@ -1,8 +1,9 @@ - + netstandard2.0;net461 TestCert + NuGet diff --git a/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj b/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj index f68591deb..114e37ba1 100644 --- a/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj +++ b/testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj @@ -1,4 +1,4 @@ - + netcoreapp3.0;net461 diff --git a/tools/KoreBuild.Console/Commands/ApiBaselinesGenerateCommand.cs b/tools/KoreBuild.Console/Commands/ApiBaselinesGenerateCommand.cs deleted file mode 100644 index e1bb37c57..000000000 --- a/tools/KoreBuild.Console/Commands/ApiBaselinesGenerateCommand.cs +++ /dev/null @@ -1,50 +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.Collections.Generic; -using System.IO; -using Microsoft.Extensions.CommandLineUtils; - -namespace KoreBuild.Console.Commands -{ - internal class ApiBaselinesGenerateCommand : SubCommandBase - { - public ApiBaselinesGenerateCommand(CommandContext context) : base(context) - { - } - - public override void Configure(CommandLineApplication application) - { - application.Description = "Generates baselines for all projects in this repo."; - - base.Configure(application); - } - - protected override int Execute() - { - var args = new List - { - "msbuild", - "/nologo", - "/m", - $"/p:KoreBuildVersion={this.Context.KoreBuildVersion}", - $"/p:RepositoryRoot=\"{this.Context.RepoPath}/\"", - "\"/p:GenerateBaselines=true\"", - "\"/p:SkipTests=true\"", - "/clp:Summary", - Path.Combine(Context.KoreBuildDir, "KoreBuild.proj") - }; - - if (Reporter.IsVerbose) - { - args.Add("\"/v:n\""); - } - else - { - args.Add("\"/v:m\""); - } - - return RunDotnet(args, Context.RepoPath); - } - } -} diff --git a/tools/KoreBuild.Console/Commands/CommandBase.cs b/tools/KoreBuild.Console/Commands/CommandBase.cs deleted file mode 100644 index bb8fcc8c9..000000000 --- a/tools/KoreBuild.Console/Commands/CommandBase.cs +++ /dev/null @@ -1,45 +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 Microsoft.Extensions.CommandLineUtils; - -namespace KoreBuild.Console.Commands -{ - internal abstract class CommandBase - { - private CommandLineApplication _application; - - public virtual void Configure(CommandLineApplication application) - { - _application = application; - - application.HelpOption("-h|--help"); - - application.OnExecute( - () => - { - if (IsValid()) - { - return Execute(); - } - else - { - application.ShowHelp(); - return 1; - } - }); - } - - protected virtual int Execute() - { - _application.ShowHelp(); - - return 0; - } - - protected virtual bool IsValid() - { - return true; - } - } -} diff --git a/tools/KoreBuild.Console/Commands/CommandContext.cs b/tools/KoreBuild.Console/Commands/CommandContext.cs deleted file mode 100644 index 2373311c8..000000000 --- a/tools/KoreBuild.Console/Commands/CommandContext.cs +++ /dev/null @@ -1,177 +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.IO; -using System.Linq; -using System.Reflection; -using System.Runtime.InteropServices; -using Microsoft.Extensions.CommandLineUtils; -using Microsoft.Extensions.Tools.Internal; - -namespace KoreBuild.Console.Commands -{ - internal class CommandContext - { - private const string _defaultToolsSource = "https://aspnetcore.blob.core.windows.net/buildtools"; - private const string _dotnetFolderName = ".dotnet"; - - private CommandOption _repoPathOption; - private CommandOption _dotNetHomeOption; - private CommandOption _toolsSourceOption; - private CommandOption _verbose; - - private string _koreBuildDir; - private CommandOption _korebuildOverrideOpt; - - public CommandContext(CommandLineApplication application) - { - _korebuildOverrideOpt = application.Option("--korebuild-override ", "Where is KoreBuild?", CommandOptionType.SingleValue, inherited: true); - // for local development only - _korebuildOverrideOpt.ShowInHelpText = false; - - _verbose = application.Option("-v|--verbose", "Show verbose output", CommandOptionType.NoValue, inherited: true); - _toolsSourceOption = application.Option("--tools-source", "The source to draw tools from.", CommandOptionType.SingleValue, inherited: true); - _repoPathOption = application.Option("--repo-path", "The path to the repo to work on.", CommandOptionType.SingleValue, inherited: true); - _dotNetHomeOption = application.Option("--dotnet-home", "The place where dotnet lives", CommandOptionType.SingleValue, inherited: true); - // TODO: Configure file - } - - public string KoreBuildDir - { - get - { - if (_koreBuildDir == null) - { - _koreBuildDir = FindKoreBuildDirectory(); - } - return _koreBuildDir; - } - } - - public string ConfigDirectory => Path.Combine(KoreBuildDir, "config"); - public string RepoPath => _repoPathOption.HasValue() ? _repoPathOption.Value() : Directory.GetCurrentDirectory(); - public string DotNetHome => GetDotNetHome(); - public string ToolsSource => _toolsSourceOption.HasValue() ? _toolsSourceOption.Value() : _defaultToolsSource; - public string SDKVersion => GetDotnetSDKVersion(); - - public string KoreBuildVersion => GetKoreBuildVersion(); - - public IReporter Reporter => new ConsoleReporter(PhysicalConsole.Singleton, _verbose != null, false); - - private string GetDotnetSDKVersion() - { - var sdkVersionEnv = Environment.GetEnvironmentVariable("KOREBUILD_DOTNET_VERSION"); - if (sdkVersionEnv != null) - { - return sdkVersionEnv; - } - else - { - var sdkVersionPath = Path.Combine(ConfigDirectory, "sdk.version"); - return File.ReadAllText(sdkVersionPath).Trim(); - } - } - - private string GetDotNetHome() - { - var dotnetHome = Environment.GetEnvironmentVariable("DOTNET_HOME"); - var userProfile = Environment.GetEnvironmentVariable("USERPROFILE"); - var home = Environment.GetEnvironmentVariable("HOME"); - - var result = Path.Combine(Directory.GetCurrentDirectory(), _dotnetFolderName); - if (_dotNetHomeOption.HasValue()) - { - result = _dotNetHomeOption.Value(); - } - else if (!string.IsNullOrEmpty(dotnetHome)) - { - result = dotnetHome; - } - else if (!string.IsNullOrEmpty(userProfile)) - { - result = Path.Combine(userProfile, _dotnetFolderName); - } - else if (!string.IsNullOrEmpty(home)) - { - result = home; - } - - return result; - } - - private string GetKoreBuildVersion() - { - var dir = new DirectoryInfo(FindKoreBuildDirectory()); - return dir.Parent.Name; - } - - private string FindKoreBuildDirectory() - { - if (_korebuildOverrideOpt.HasValue()) - { - return Path.GetFullPath(_korebuildOverrideOpt.Value()); - } - - var executingDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - var root = Directory.GetDirectoryRoot(executingDir); - while (executingDir != root) - { - var files = Directory.EnumerateFiles(executingDir); - var koreProj = Path.Combine(executingDir, "KoreBuild.proj"); - if (files.Contains(koreProj)) - { - return executingDir; - } - - var directories = Directory.EnumerateDirectories(executingDir); - - var fileDir = Path.Combine(executingDir, "files"); - if (directories.Contains(fileDir)) - { - return Path.Combine(fileDir, "KoreBuild"); - } - - executingDir = Directory.GetParent(executingDir).FullName; - } - - Reporter.Error("Couldn't find the KoreBuild directory."); - throw new DirectoryNotFoundException(); - } - - public string GetDotNetInstallDir() - { - var dotnetDir = DotNetHome; - if (IsWindows()) - { - dotnetDir = Path.Combine(dotnetDir, GetArchitecture()); - } - - return dotnetDir; - } - - public string GetDotNetExecutable() - { - var dotnetDir = GetDotNetInstallDir(); - - var dotnetFile = "dotnet"; - - if (IsWindows()) - { - dotnetFile += ".exe"; - } - - return Path.Combine(dotnetDir, dotnetFile); - } - - public string GetArchitecture() - { - return Environment.GetEnvironmentVariable("KOREBUILD_DOTNET_ARCH") ?? "x64"; - } - - public bool IsWindows() - { - return RuntimeInformation.IsOSPlatform(OSPlatform.Windows); - } - } -} diff --git a/tools/KoreBuild.Console/Commands/DependenciesGenerateCommand.cs b/tools/KoreBuild.Console/Commands/DependenciesGenerateCommand.cs deleted file mode 100644 index 274de1c7f..000000000 --- a/tools/KoreBuild.Console/Commands/DependenciesGenerateCommand.cs +++ /dev/null @@ -1,76 +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.Collections.Generic; -using System.IO; -using Microsoft.Extensions.CommandLineUtils; - -namespace KoreBuild.Console.Commands -{ - internal class DependenciesGenerateCommand : SubCommandBase - { - private CommandOption _configOpt; - private CommandOption _fileOpt; - - public DependenciesGenerateCommand(CommandContext context) : base(context) - { - } - - public override void Configure(CommandLineApplication application) - { - application.Description = "Generates a build/dependencies.props file and updates csproj files to use variables"; - application.ExtendedHelpText = @" -MORE INFO: - - This command will generate a dependencies.props file and adjust all PackageReference's in csproj files - to use the MSBuild variables it generates. - - Example output: - - - - 1.0.0 - - -"; - - _configOpt = application.Option("-c|--configuration ", "The MSBuild configuration. Defaults to 'Debug'.", CommandOptionType.SingleValue); - _fileOpt = application.Option("--deps-file ", "The dependencies.props file to upgrade.", CommandOptionType.SingleValue); - - base.Configure(application); - } - - protected override int Execute() - { - var args = new List - { - "msbuild", - Path.Combine(Context.KoreBuildDir, "KoreBuild.proj"), - "-t:GenerateDependenciesPropsFile", - }; - - if (_configOpt.HasValue()) - { - args.Add("-p:Configuration=" + _configOpt.Value()); - } - - if (_fileOpt.HasValue()) - { - var filePath = _fileOpt.Value(); - if (!Path.IsPathRooted(filePath)) - { - filePath = Path.GetFullPath(filePath); - } - - args.Add("-p:DependencyVersionsFile=" + filePath); - } - - if (Reporter.IsVerbose) - { - args.Add("-v:n"); - } - - return RunDotnet(args, Context.RepoPath); - } - } -} diff --git a/tools/KoreBuild.Console/Commands/DependenciesUpgradeCommand.cs b/tools/KoreBuild.Console/Commands/DependenciesUpgradeCommand.cs deleted file mode 100644 index b830e71a5..000000000 --- a/tools/KoreBuild.Console/Commands/DependenciesUpgradeCommand.cs +++ /dev/null @@ -1,99 +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.Collections.Generic; -using System.IO; -using Microsoft.Extensions.CommandLineUtils; - -namespace KoreBuild.Console.Commands -{ - internal class DependenciesUpgradeCommand : SubCommandBase - { - private CommandOption _sourceOpt; - private CommandOption _packageIdOpt; - private CommandOption _packageVersionOpt; - private CommandOption _sourceDeps; - private CommandOption _fileOpt; - - public DependenciesUpgradeCommand(CommandContext context) : base(context) - { - } - - public override void Configure(CommandLineApplication application) - { - application.Description = "Upgrades the build/dependencies.props file to the latest package versions"; - application.ExtendedHelpText = @" -MORE INFO: - - The upgrade uses a 'lineup' package as the source of information about which versions to use. - - A lineup package is simply a nuget package that contains a file in build/dependencies.props. - Just like the version of the file in this local repo, this file is an MSBuild project file - with a list of MSBuild variables. Example: - - - - 1.0.0 - - -"; - - _sourceOpt = application.Option("-s|--source ", - "Specifies a NuGet package source to use to upgrade dependencies to the latest lineup package.", CommandOptionType.SingleValue); - _packageIdOpt = application.Option("--id ", "Specifies the lineup package id to use.", CommandOptionType.SingleValue); - _packageVersionOpt = application.Option("--version ", "Specifies the lineup package version to use.", CommandOptionType.SingleValue); - _sourceDeps = application.Option("--source-deps ", "The dependencies.props file to use as a source of versions.", CommandOptionType.SingleValue); - _fileOpt = application.Option("--deps-file ", "The dependencies.props file to upgrade.", CommandOptionType.SingleValue); - - base.Configure(application); - } - - protected override int Execute() - { - var args = new List - { - "msbuild", - Path.Combine(Context.KoreBuildDir, "KoreBuild.proj"), - "-t:UpgradeDependencies", - }; - - if (_sourceOpt.HasValue()) - { - args.Add("-p:LineupPackageRestoreSource=" + _sourceOpt.Value()); - } - - if (_packageIdOpt.HasValue()) - { - args.Add("-p:LineupPackageId=" + _packageIdOpt.Value()); - } - - if (_packageVersionOpt.HasValue()) - { - args.Add("-p:LineupPackageVersion=" + _packageVersionOpt.Value()); - } - - if (_sourceDeps.HasValue()) - { - args.Add("-p:LineupDependenciesFile=" + _sourceDeps.Value()); - } - - if (_fileOpt.HasValue()) - { - var filePath = _fileOpt.Value(); - if (!Path.IsPathRooted(filePath)) - { - filePath = Path.GetFullPath(filePath); - } - - args.Add("-p:DependencyVersionsFile=" + filePath); - } - - if (Reporter.IsVerbose) - { - args.Add("-v:n"); - } - - return RunDotnet(args, Context.RepoPath); - } - } -} diff --git a/tools/KoreBuild.Console/Commands/DockerBuildCommand.cs b/tools/KoreBuild.Console/Commands/DockerBuildCommand.cs deleted file mode 100644 index 7e8e8eb9f..000000000 --- a/tools/KoreBuild.Console/Commands/DockerBuildCommand.cs +++ /dev/null @@ -1,187 +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.Diagnostics; -using System.IO; -using System.Reflection; -using Microsoft.Extensions.CommandLineUtils; - -namespace KoreBuild.Console.Commands -{ - internal class DockerBuildCommand : SubCommandBase - { - private const string DockerIgnore = ".dockerignore"; - private const string DockerfileExtension = ".dockerfile"; - private const string Owner = "aspnetbuild"; - private const string ImageName = "korebuild"; - - public DockerBuildCommand(CommandContext context) : base(context) - { - } - - public CommandArgument ImageVariant { get; set; } - - public List Arguments { get; set; } - - public string Tag => $@"{Owner}/{ImageName}:{ImageVariant.Value}"; - - public override void Configure(CommandLineApplication application) - { - ImageVariant = application.Argument("image", "The docker image to run on."); - Arguments = application.RemainingArguments; - - base.Configure(application); - } - - protected override bool IsValid() - { - if (string.IsNullOrEmpty(ImageVariant?.Value)) - { - Reporter.Error("Image is a required argument."); - return false; - } - - return true; - } - - protected override int Execute() - { - var dockerFileName = GetDockerFileName(ImageVariant.Value); - var dockerFileSource = GetDockerFileSource(dockerFileName); - var dockerFileDestination = Path.Combine(Context.RepoPath, GetDockerFileName(ImageVariant.Value)); - - File.Copy(dockerFileSource, dockerFileDestination, overwrite: true); - - var dockerIgnoreSource = GetDockerFileSource(DockerIgnore); - var dockerIgnoreDestination = Path.Combine(Context.RepoPath, DockerIgnore); - - File.Copy(dockerIgnoreSource, dockerIgnoreDestination, overwrite: true); - - // If our ToolSource isn't http copy it to the docker context - var dockerToolsSource = Context.ToolsSource; - string toolsSourceDestination = null; - if (!Context.ToolsSource.StartsWith("http")) - { - dockerToolsSource = "ToolsSource"; - toolsSourceDestination = Path.Combine(Context.RepoPath, dockerToolsSource); - DirectoryCopy(Context.ToolsSource, toolsSourceDestination); - } - - try - { - var buildArgs = new List { "build" }; - - buildArgs.AddRange(new string[] { "-t", Tag, "-f", dockerFileDestination, Context.RepoPath }); - var buildResult = RunDockerCommand(buildArgs); - - if (buildResult != 0) - { - return buildResult; - } - - var containerName = $"{Owner}_{DateTime.Now.ToString("yyyyMMddHHmmss")}"; - - var runArgs = new List { "run", "--rm", "-i", "--name", containerName, Tag }; - - runArgs.AddRange(new[] { "-ToolsSource", dockerToolsSource }); - - if (Arguments?.Count > 0) - { - runArgs.AddRange(Arguments); - } - - Reporter.Verbose($"Running in container '{containerName}'"); - return RunDockerCommand(runArgs); - } - finally - { - // Clean up the stuff we dumped there in order to get it in the docker context. - File.Delete(dockerFileDestination); - File.Delete(dockerIgnoreDestination); - if (toolsSourceDestination != null) - { - Directory.Delete(toolsSourceDestination, recursive: true); - } - } - } - - private string GetDockerFileSource(string fileName) - { - var executingDir = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); - var source = Path.Combine(executingDir, "Commands", "DockerFiles", fileName); - - if (!File.Exists(source)) - { - Reporter.Error($"DockerFile '{source}' doesn't exist."); - throw new FileNotFoundException(); - } - - return source; - } - - private string GetDockerFileName(string platform) - { - return $"{platform}{DockerfileExtension}"; - } - - private int RunDockerCommand(List arguments) - { - var args = ArgumentEscaper.EscapeAndConcatenate(arguments.ToArray()); - Reporter.Verbose($"Running 'docker {args}'"); - - var psi = new ProcessStartInfo - { - FileName = "docker", - Arguments = args, - RedirectStandardError = true - }; - - var process = Process.Start(psi); - process.WaitForExit(); - - if (process.ExitCode != 0) - { - Reporter.Error(process.StandardError.ReadToEnd()); - } - - return process.ExitCode; - } - - private static void DirectoryCopy(string sourceDirName, string destDirName) - { - // Get the subdirectories for the specified directory. - DirectoryInfo dir = new DirectoryInfo(sourceDirName); - - if (!dir.Exists) - { - throw new DirectoryNotFoundException( - "Source directory does not exist or could not be found: " - + sourceDirName); - } - - DirectoryInfo[] dirs = dir.GetDirectories(); - // If the destination directory doesn't exist, create it. - if (!Directory.Exists(destDirName)) - { - Directory.CreateDirectory(destDirName); - } - - // Get the files in the directory and copy them to the new location. - FileInfo[] files = dir.GetFiles(); - foreach (FileInfo file in files) - { - string temppath = Path.Combine(destDirName, file.Name); - file.CopyTo(temppath, overwrite: true); - } - - // Copy subdirectories and their contents to the new location. - foreach (DirectoryInfo subdir in dirs) - { - string temppath = Path.Combine(destDirName, subdir.Name); - DirectoryCopy(subdir.FullName, temppath); - } - } - } -} diff --git a/tools/KoreBuild.Console/Commands/DockerFiles/.dockerignore b/tools/KoreBuild.Console/Commands/DockerFiles/.dockerignore deleted file mode 100644 index 26f97c87a..000000000 --- a/tools/KoreBuild.Console/Commands/DockerFiles/.dockerignore +++ /dev/null @@ -1,4 +0,0 @@ -korebuild-lock.txt -**/bin -**/obj -artifacts diff --git a/tools/KoreBuild.Console/Commands/DockerFiles/jessie.dockerfile b/tools/KoreBuild.Console/Commands/DockerFiles/jessie.dockerfile deleted file mode 100644 index cef20b92f..000000000 --- a/tools/KoreBuild.Console/Commands/DockerFiles/jessie.dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM microsoft/dotnet:2.0-runtime-deps-jessie - -RUN apt-get update \ - && apt-get install -y --no-install-recommends \ - git \ - # KoreBuild dependencies - jq \ - curl \ - unzip \ - apt-transport-https \ - && rm -rf /var/lib/apt/lists/* - -ADD . . - -ENV DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true - -RUN ./run.sh install-tools - -ENTRYPOINT ["./build.sh"] diff --git a/tools/KoreBuild.Console/Commands/DockerFiles/winservercore.dockerfile b/tools/KoreBuild.Console/Commands/DockerFiles/winservercore.dockerfile deleted file mode 100644 index a591f1adf..000000000 --- a/tools/KoreBuild.Console/Commands/DockerFiles/winservercore.dockerfile +++ /dev/null @@ -1,20 +0,0 @@ -FROM microsoft/aspnet:4.6.2 - - -# DevPack returns exit 0 immediately, but it's not done, so we wait. -# A more correct thing would be to block on a registry key existing or similar. -RUN \ - Invoke-WebRequest https://download.microsoft.com/download/F/1/D/F1DEB8DB-D277-4EF9-9F48-3A65D4D8F965/NDP461-DevPack-KB3105179-ENU.exe -OutFile ~\\net461dev.exe ; \ - ~\\net461dev.exe /Passive /NoRestart ; \ - Start-Sleep -s 10; \ - Remove-Item ~\\net461dev.exe -Force ; - -WORKDIR c:\\repo - -ADD . . - -ENV DOTNET_SKIP_FIRST_TIME_EXPERIENCE=true - -RUN ./run.ps1 install-tools - -ENTRYPOINT ["build.cmd"] diff --git a/tools/KoreBuild.Console/Commands/InstallToolsCommand.cs b/tools/KoreBuild.Console/Commands/InstallToolsCommand.cs deleted file mode 100644 index 619065795..000000000 --- a/tools/KoreBuild.Console/Commands/InstallToolsCommand.cs +++ /dev/null @@ -1,130 +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.Diagnostics; -using System.IO; -using Microsoft.Extensions.CommandLineUtils; - -namespace KoreBuild.Console.Commands -{ - internal class InstallToolsCommand : SubCommandBase - { - public InstallToolsCommand(CommandContext context) : base(context) - { - } - - private string KoreBuildSkipRuntimeInstall => Environment.GetEnvironmentVariable("KOREBUILD_SKIP_RUNTIME_INSTALL"); - private string PathENV => Environment.GetEnvironmentVariable("PATH"); - private string DotNetInstallDir => Environment.GetEnvironmentVariable("DOTNET_INSTALL_DIR"); - - public override void Configure(CommandLineApplication application) - { - base.Configure(application); - } - - protected override int Execute() - { - var installDir = Context.GetDotNetInstallDir(); - - Reporter.Verbose($"Installing tools to '{installDir}'"); - - if (DotNetInstallDir != null && DotNetInstallDir != installDir) - { - Reporter.Verbose($"installDir = {installDir}"); - Reporter.Verbose($"DOTNET_INSTALL_DIR = {DotNetInstallDir}"); - Reporter.Verbose("The environment variable DOTNET_INSTALL_DIR is deprecated. The recommended alternative is DOTNET_HOME."); - } - - var dotnet = Context.GetDotNetExecutable(); - var dotnetOnPath = GetCommandFromPath("dotnet"); - - // TODO: decide case sensitivity and handly symbolic links - if (dotnetOnPath != null && (dotnetOnPath != dotnet)) - { - Reporter.Warn($"dotnet found on the system PATH is '{dotnetOnPath}' but KoreBuild will use '{dotnet}'"); - } - - var pathPrefix = Directory.GetParent(dotnet); - if (PathENV.StartsWith($"{pathPrefix}{Path.PathSeparator}", StringComparison.OrdinalIgnoreCase)) - { - Reporter.Output($"Adding {pathPrefix} to PATH"); - Environment.SetEnvironmentVariable("PATH", $"{pathPrefix};{PathENV}"); - } - - if (KoreBuildSkipRuntimeInstall == "1") - { - Reporter.Output("Skipping runtime installation because KOREBUILD_SKIP_RUNTIME_INSTALL = 1"); - return 0; - } - - var scriptExtension = Context.IsWindows() ? "ps1" : "sh"; - - var scriptPath = Path.Combine(Context.KoreBuildDir, "dotnet-install." + scriptExtension); - - if (!Context.IsWindows()) - { - var args = ArgumentEscaper.EscapeAndConcatenate(new string[] { "+x", scriptPath }); - var psi = new ProcessStartInfo - { - FileName = "chmod", - Arguments = args - }; - - var process = Process.Start(psi); - process.WaitForExit(); - } - - var architecture = Context.GetArchitecture(); - - InstallCLI(scriptPath, installDir, architecture, Context.SDKVersion); - - return 0; - } - - private void InstallCLI(string script, string installDir, string architecture, string version) - { - var sdkPath = Path.Combine(installDir, "sdk", version, "dotnet.dll"); - - if (!File.Exists(sdkPath)) - { - Reporter.Verbose($"Installing dotnet {version} to {installDir}"); - - var args = ArgumentEscaper.EscapeAndConcatenate(new string[] { - "-Version", version, - "-Architecture", architecture, - "-InstallDir", installDir, - // workaround for https://github.com/dotnet/cli/issues/9143 - // disable the CDN, which has non-deterministic behavior when multiple builds of the same SDK version exist - "-NoCdn", - }); - - var psi = new ProcessStartInfo - { - FileName = script, - Arguments = args - }; - - var process = Process.Start(psi); - process.WaitForExit(); - } - else - { - Reporter.Output($".NET Core SDK {version} is already installed. Skipping installation."); - } - } - - private static string GetCommandFromPath(string command) - { - var values = Environment.GetEnvironmentVariable("PATH"); - foreach (var path in values.Split(';')) - { - var fullPath = Path.Combine(path, command); - if (File.Exists(fullPath)) - return fullPath; - } - return null; - } - } -} diff --git a/tools/KoreBuild.Console/Commands/InstallToolsetsCommand.cs b/tools/KoreBuild.Console/Commands/InstallToolsetsCommand.cs deleted file mode 100644 index 4494b917c..000000000 --- a/tools/KoreBuild.Console/Commands/InstallToolsetsCommand.cs +++ /dev/null @@ -1,74 +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.Collections.Generic; -using System.IO; -using Microsoft.Extensions.CommandLineUtils; - -namespace KoreBuild.Console.Commands -{ - internal class InstallToolsetsCommand : SubCommandBase - { - private CommandOption _quietOpt; - private CommandOption _productOpt; - private CommandOption _upgradeOpt; - - public InstallToolsetsCommand(CommandContext context) : base(context) - { - } - - public override void Configure(CommandLineApplication application) - { - application.Description = "Installs the toolsets necessary to build the current project."; - application.ExtendedHelpText = @" -MORE INFO: - - Uses the toolsets specified in korebuild.json to install all toolsets. -"; - _quietOpt = application.Option("-q|--quiet", - "Install toolsets without requiring user interation.", - CommandOptionType.NoValue); - _productOpt = application.Option("--product ", - "Which vs product version to install. Valid values are Enterprise, Professional, or Community.", - CommandOptionType.SingleValue); - _upgradeOpt = application.Option("-u|--upgrade", - "Upgrade existing toolsets.", - CommandOptionType.NoValue); - base.Configure(application); - } - - protected override int Execute() - { - var args = new List - { - "msbuild", - Path.Combine(Context.KoreBuildDir, "KoreBuild.proj"), - "-t:InstallToolsets", - }; - - if (_upgradeOpt.HasValue()) - { - args.Add("-p:UpgradeVSInstallation=true"); - } - - if (_quietOpt.HasValue()) - { - args.Add("-p:QuietVSInstallation=true"); - } - - if (_productOpt.HasValue()) - { - args.Add($"-p:VSProductVersionType={_productOpt.Value()}"); - } - - if (Reporter.IsVerbose) - { - args.Add("-v:n"); - } - - Reporter.Verbose($"Starting msbuild with arguments: {ArgumentEscaper.EscapeAndConcatenate(args)}"); - - return RunDotnet(args, Context.RepoPath); - } - } -} diff --git a/tools/KoreBuild.Console/Commands/MSBuildCommand.cs b/tools/KoreBuild.Console/Commands/MSBuildCommand.cs deleted file mode 100644 index 1ab4c4414..000000000 --- a/tools/KoreBuild.Console/Commands/MSBuildCommand.cs +++ /dev/null @@ -1,124 +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.IO; -using Microsoft.Extensions.CommandLineUtils; - -namespace KoreBuild.Console.Commands -{ - internal class MSBuildCommand : SubCommandBase - { - public MSBuildCommand(CommandContext context) : base(context) - { - } - - private bool EnableBinaryLog => Environment.GetEnvironmentVariable("KOREBUILD_ENABLE_BINARY_LOG") == "1"; - - private List Arguments { get; set; } - - public override void Configure(CommandLineApplication application) - { - base.Configure(application); - Arguments = application.RemainingArguments; - } - - protected override int Execute() - { - Reporter.Verbose($"Building {Context.RepoPath}."); - Reporter.Verbose($"dotnet = {Context.RepoPath}"); - - if (Context.SDKVersion != "latest") - { - var globalFile = Path.Combine(Context.RepoPath, "global.json"); - File.WriteAllText(globalFile, $"{{ \"sdk\": {{ \"version\": \"{Context.SDKVersion}\" }} }}", System.Text.Encoding.ASCII); - } - else - { - Reporter.Verbose($"Skipping global.json generation because the SDKVersion = {Context.SDKVersion}"); - } - - var makeFileProj = Path.Combine(Context.KoreBuildDir, "KoreBuild.proj"); - var msBuildArtifactsDir = Path.Combine(Context.RepoPath, "artifacts", "msbuild"); - var msBuildResponseFile = Path.Combine(msBuildArtifactsDir, "msbuild.rsp"); - - var msBuildLogArgument = string.Empty; - - - if (EnableBinaryLog) - { - Reporter.Verbose("Enabling binary logging"); - var msBuildLogFilePath = Path.Combine(msBuildArtifactsDir, "msbuild.binlog"); - msBuildLogArgument = $"/bl:{msBuildLogFilePath}"; - } - - var msBuildArguments = string.Empty; - - foreach (var arg in Arguments) - { - msBuildArguments += Environment.NewLine + arg; - } - - // TODO: naturalize newlines - msBuildArguments += $@" -/nologo -/m -/p:RepositoryRoot={Context.RepoPath}\ -{msBuildLogArgument} -/clp:Summary -""{makeFileProj}"" -"; - - Directory.CreateDirectory(msBuildArtifactsDir); - - var noop = msBuildArguments.IndexOf("/t:Noop", StringComparison.OrdinalIgnoreCase) >= 0 - || msBuildArguments.IndexOf("/t:Cow", StringComparison.OrdinalIgnoreCase) >= 0; - - File.WriteAllText(msBuildResponseFile, msBuildArguments, System.Text.Encoding.ASCII); - Reporter.Verbose($"Noop = {noop}"); - var firstTime = Environment.GetEnvironmentVariable("DOTNET_SKIP_FIRST_TIME_EXPERIENCE"); - if (noop) - { - Environment.SetEnvironmentVariable("DOTNET_SKIP_FIRST_TIME_EXPERIENCE", "true"); - } - else - { - var buildTaskResult = BuildTaskProject(Context.RepoPath); - if (buildTaskResult != 0) - { - return buildTaskResult; - } - } - - return RunDotnet(new[] { "msbuild", $@"@""{msBuildResponseFile}""" }); - } - - private int BuildTaskProject(string path) - { - var taskFolder = Path.Combine(Context.RepoPath, "build", "tasks"); - var taskProj = Path.Combine(taskFolder, "RepoTasks.csproj"); - var publishFolder = Path.Combine(taskFolder, "bin", "publish"); - - if (File.Exists(taskProj)) - { - if (File.Exists(publishFolder)) - { - Directory.Delete(publishFolder, recursive: true); - } - - var sdkPath = $"/p:RepoTasksSdkPath={Path.Combine(Context.KoreBuildDir, "msbuild", "KoreBuild.RepoTasks.Sdk", "Sdk")}"; - - var restoreResult = RunDotnet(new[] { "restore", taskProj, sdkPath }); - if (restoreResult != 0) - { - return restoreResult; - } - - return RunDotnet(new[] { "publish", taskProj, "--configuration", "Release", "--output", publishFolder, "/nologo", sdkPath }); - } - - return 0; - } - } -} diff --git a/tools/KoreBuild.Console/Commands/RootCommand.cs b/tools/KoreBuild.Console/Commands/RootCommand.cs deleted file mode 100644 index 6477f7e23..000000000 --- a/tools/KoreBuild.Console/Commands/RootCommand.cs +++ /dev/null @@ -1,66 +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.Reflection; -using Microsoft.Extensions.CommandLineUtils; - -namespace KoreBuild.Console.Commands -{ - internal class RootCommand : CommandBase - { - public override void Configure(CommandLineApplication application) - { - var context = new CommandContext(application); - - application.FullName = "korebuild"; - - application.Command("install-tools", new InstallToolsCommand(context).Configure, throwOnUnexpectedArg: false); - application.Command("install", c => { - c.HelpOption("-h|--help"); - c.Command("vs", new InstallToolsetsCommand(context).Configure, throwOnUnexpectedArg: false); - c.OnExecute(() => - { - c.ShowHelp(); - return 2; - }); - }); - application.Command("msbuild", new MSBuildCommand(context).Configure, throwOnUnexpectedArg: false); - application.Command("docker-build", new DockerBuildCommand(context).Configure, throwOnUnexpectedArg: false); - - // Commands that upgrade things - application.Command("upgrade", c => - { - c.HelpOption("-h|--help"); - c.Command("deps", new DependenciesUpgradeCommand(context).Configure, throwOnUnexpectedArg: false); - - c.OnExecute(() => - { - c.ShowHelp(); - return 2; - }); - }); - - // Commands that generate code and files - application.Command("generate", c => - { - c.HelpOption("-h|--help"); - - c.Command("deps", new DependenciesGenerateCommand(context).Configure, throwOnUnexpectedArg: false); - c.Command("api-baselines", new ApiBaselinesGenerateCommand(context).Configure, throwOnUnexpectedArg: false); - - c.OnExecute(() => - { - c.ShowHelp(); - return 2; - }); - }); - - application.VersionOption("--version", GetVersion); - - base.Configure(application); - } - - private static string GetVersion() - => typeof(RootCommand).GetTypeInfo().Assembly.GetCustomAttribute().InformationalVersion; - } -} diff --git a/tools/KoreBuild.Console/Commands/SubCommandBase.cs b/tools/KoreBuild.Console/Commands/SubCommandBase.cs deleted file mode 100644 index ecd7f088b..000000000 --- a/tools/KoreBuild.Console/Commands/SubCommandBase.cs +++ /dev/null @@ -1,63 +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.Collections.Generic; -using System.Diagnostics; -using System.IO; -using Microsoft.Extensions.CommandLineUtils; -using Microsoft.Extensions.Tools.Internal; - -namespace KoreBuild.Console.Commands -{ - internal abstract class SubCommandBase : CommandBase - { - protected SubCommandBase(CommandContext context) - { - Context = context; - } - - protected CommandContext Context { get; } - - protected IReporter Reporter => Context.Reporter; - - protected override bool IsValid() - { - if (!Directory.Exists(Context.RepoPath)) - { - Context.Reporter.Error($"The RepoPath '{Context.RepoPath}' doesn't exist."); - return false; - } - - return base.IsValid(); - } - - protected int RunDotnet(params string[] arguments) - => RunDotnet(arguments, Directory.GetCurrentDirectory()); - - protected int RunDotnet(IEnumerable arguments, string workingDir) - { - var args = ArgumentEscaper.EscapeAndConcatenate(arguments); - - // use the dotnet.exe file used to start this process - var dotnet = DotNetMuxer.MuxerPath; - // if it could not be found, fallback to detecting DOTNET_HOME or PATH - dotnet = string.IsNullOrEmpty(dotnet) || !Path.IsPathRooted(dotnet) - ? Context.GetDotNetExecutable() - : dotnet; - - var psi = new ProcessStartInfo - { - FileName = dotnet, - Arguments = args, - WorkingDirectory = workingDir, - }; - - Reporter.Verbose($"Executing '{psi.FileName} {psi.Arguments}'"); - - var process = Process.Start(psi); - process.WaitForExit(); - - return process.ExitCode; - } - } -} diff --git a/tools/KoreBuild.Console/KoreBuild.Console.csproj b/tools/KoreBuild.Console/KoreBuild.Console.csproj deleted file mode 100644 index 83f28c5d4..000000000 --- a/tools/KoreBuild.Console/KoreBuild.Console.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - - Exe - netcoreapp3.0 - - - - - - - - - - - - diff --git a/tools/KoreBuild.Console/Program.cs b/tools/KoreBuild.Console/Program.cs deleted file mode 100644 index d12e72388..000000000 --- a/tools/KoreBuild.Console/Program.cs +++ /dev/null @@ -1,32 +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 KoreBuild.Console.Commands; -using Microsoft.Extensions.CommandLineUtils; - -namespace KoreBuild.Console -{ - class Program - { - static int Main(string[] args) - { - var application = new CommandLineApplication() - { - Name = "korebuild" - }; - - new RootCommand().Configure(application); - - try - { - return application.Execute(args); - } - catch (Exception ex) - { - System.Console.Error.WriteLine($"Exception thrown: '{ex.ToString()}'"); - return 1; - } - } - } -} diff --git a/tools/KoreBuild.Console/Reporter/ConsoleReporter.cs b/tools/KoreBuild.Console/Reporter/ConsoleReporter.cs deleted file mode 100644 index a9fe89812..000000000 --- a/tools/KoreBuild.Console/Reporter/ConsoleReporter.cs +++ /dev/null @@ -1,70 +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.IO; - -namespace Microsoft.Extensions.Tools.Internal -{ - public class ConsoleReporter : IReporter - { - private object _writeLock = new object(); - - public ConsoleReporter(IConsole console) - : this(console, verbose: false, quiet: false) - { } - - public ConsoleReporter(IConsole console, bool verbose, bool quiet) - { - Console = console; - IsVerbose = verbose; - IsQuiet = quiet; - } - - protected IConsole Console { get; } - public bool IsVerbose { get; set; } - public bool IsQuiet { get; set; } - - protected virtual void WriteLine(TextWriter writer, string message, ConsoleColor? color) - { - lock (_writeLock) - { - if (color.HasValue) - { - Console.ForegroundColor = color.Value; - } - - writer.WriteLine(message); - - if (color.HasValue) - { - Console.ResetColor(); - } - } - } - - public virtual void Error(string message) - => WriteLine(Console.Error, message, ConsoleColor.Red); - public virtual void Warn(string message) - => WriteLine(Console.Out, message, ConsoleColor.Yellow); - - public virtual void Output(string message) - { - if (IsQuiet) - { - return; - } - WriteLine(Console.Out, message, color: null); - } - - public virtual void Verbose(string message) - { - if (!IsVerbose) - { - return; - } - - WriteLine(Console.Out, message, ConsoleColor.DarkGray); - } - } -} diff --git a/tools/KoreBuild.Console/Reporter/IConsole.cs b/tools/KoreBuild.Console/Reporter/IConsole.cs deleted file mode 100644 index 46cae4a05..000000000 --- a/tools/KoreBuild.Console/Reporter/IConsole.cs +++ /dev/null @@ -1,21 +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.IO; - -namespace Microsoft.Extensions.Tools.Internal -{ - public interface IConsole - { - event ConsoleCancelEventHandler CancelKeyPress; - TextWriter Out { get; } - TextWriter Error { get; } - TextReader In { get; } - bool IsInputRedirected { get; } - bool IsOutputRedirected { get; } - bool IsErrorRedirected { get; } - ConsoleColor ForegroundColor { get; set; } - void ResetColor(); - } -} diff --git a/tools/KoreBuild.Console/Reporter/IReporter.cs b/tools/KoreBuild.Console/Reporter/IReporter.cs deleted file mode 100644 index e57261401..000000000 --- a/tools/KoreBuild.Console/Reporter/IReporter.cs +++ /dev/null @@ -1,14 +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. - -namespace Microsoft.Extensions.Tools.Internal -{ - public interface IReporter - { - void Verbose(string message); - void Output(string message); - void Warn(string message); - void Error(string message); - bool IsVerbose { get; } - } -} diff --git a/tools/KoreBuild.Console/Reporter/PhysicalConsole.cs b/tools/KoreBuild.Console/Reporter/PhysicalConsole.cs deleted file mode 100644 index 429342ecc..000000000 --- a/tools/KoreBuild.Console/Reporter/PhysicalConsole.cs +++ /dev/null @@ -1,36 +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.IO; - -namespace Microsoft.Extensions.Tools.Internal -{ - public class PhysicalConsole : IConsole - { - private PhysicalConsole() - { - Console.CancelKeyPress += (o, e) => - { - CancelKeyPress?.Invoke(o, e); - }; - } - - public static IConsole Singleton { get; } = new PhysicalConsole(); - - public event ConsoleCancelEventHandler CancelKeyPress; - public TextWriter Error => Console.Error; - public TextReader In => Console.In; - public TextWriter Out => Console.Out; - public bool IsInputRedirected => Console.IsInputRedirected; - public bool IsOutputRedirected => Console.IsOutputRedirected; - public bool IsErrorRedirected => Console.IsErrorRedirected; - public ConsoleColor ForegroundColor - { - get => Console.ForegroundColor; - set => Console.ForegroundColor = value; - } - - public void ResetColor() => Console.ResetColor(); - } -} From 6f01223531df91913e253760e93ccc595a418a36 Mon Sep 17 00:00:00 2001 From: Vijay Ramakrishnan Date: Tue, 26 Feb 2019 15:51:06 -0800 Subject: [PATCH 156/192] Updating the sdk version (#939) --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index c175478ef..98c439bc2 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview-010184 +3.0.100-preview4-010309 \ No newline at end of file From 00d497b8340d61de0045de20dd2036c502c02bbd Mon Sep 17 00:00:00 2001 From: Ryan Brandenburg Date: Wed, 6 Mar 2019 11:29:53 -0800 Subject: [PATCH 157/192] Fix Trx files for teamcity --- files/KoreBuild/modules/vstest/module.targets | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/files/KoreBuild/modules/vstest/module.targets b/files/KoreBuild/modules/vstest/module.targets index 2e78267bb..2fbaa715b 100644 --- a/files/KoreBuild/modules/vstest/module.targets +++ b/files/KoreBuild/modules/vstest/module.targets @@ -92,7 +92,9 @@ Runs the VSTest on all projects in the ProjectToBuild itemgroup. - $(LogOutputDir)$(TestGroupName)-$(TargetFramework)-$(BuildNumber).trx + $(LogOutputDir)$(TestGroupName)-$(TargetFramework)-$(BuildNumber).trx + $(TrxFileWithoutExtension).trx + $(TrxFileWithoutExtension)*.trx trx;LogFileName=$(TrxFile) $(LogOutputDir)$(TestGroupName)-$(TargetFramework)-$(BuildNumber).diag - $(LogOutputDir)$(TestGroupName)-$(TargetFramework)-$(BuildNumber).trx + $(LogOutputDir)$(TestGroupName)-$(TargetFramework)-$(BuildNumber) $(TrxFileWithoutExtension).trx $(TrxFileWithoutExtension)*.trx trx;LogFileName=$(TrxFile) From 321c5b9f50bd787e4cf2c66f6103d177b5d769aa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9bastien=20Ros?= Date: Thu, 7 Mar 2019 15:43:44 -0800 Subject: [PATCH 159/192] Update sdk.version (#942) --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 98c439bc2..efd41c75c 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview4-010309 \ No newline at end of file +3.0.100-preview4-010649 From 2d74b7a6602a33235c400afee861b2f71d4b1765 Mon Sep 17 00:00:00 2001 From: Pavel Krymets Date: Thu, 14 Mar 2019 15:29:24 -0700 Subject: [PATCH 160/192] Revert "Update sdk.version (#942)" (#944) This reverts commit 321c5b9f50bd787e4cf2c66f6103d177b5d769aa. --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index efd41c75c..98c439bc2 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview4-010649 +3.0.100-preview4-010309 \ No newline at end of file From e3a8a2aae198f1ef26309714ccba6835be2437c3 Mon Sep 17 00:00:00 2001 From: Andrew Stanton-Nurse Date: Thu, 14 Mar 2019 15:34:07 -0700 Subject: [PATCH 161/192] add support for handling flaky tests (#943) This configures KoreBuild to skip all tests marked with the relevant `[Flaky]` attribute when `RunFlakyTests` is not set. Similarly, it configures it to *only* run the relevant flaky tests when `RunFlakyTests` **is** set. Once this is flowing through to AspNetCore, we'll configure the AzP yaml to do two test passes, one without `RunFlakyTest` that we care about and one with `RunFlakyTests` that we ignore failures in. Separate TRX files are generated for each run and we'll still publish all the failing tests. If RaaS is configured to "triage" successful builds, it'll be able to see these failing flaky tests and update Issues as needed. --- files/KoreBuild/modules/vstest/module.targets | 18 +++++++++++++++++- files/KoreBuild/scripts/KoreBuild.psm1 | 12 ++++++++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/files/KoreBuild/modules/vstest/module.targets b/files/KoreBuild/modules/vstest/module.targets index 5f64cac67..67fde2d62 100644 --- a/files/KoreBuild/modules/vstest/module.targets +++ b/files/KoreBuild/modules/vstest/module.targets @@ -94,9 +94,12 @@ Runs the VSTest on all projects in the ProjectToBuild itemgroup. $(LogOutputDir)$(TestGroupName)-$(TargetFramework)-$(BuildNumber) $(TrxFileWithoutExtension).trx + $(TrxFileWithoutExtension).flaky.trx $(TrxFileWithoutExtension)*.trx trx;LogFileName=$(TrxFile) - $(LogOutputDir)$(TestGroupName)-$(TargetFramework)-$(BuildNumber).diag + $(LogOutputDir)$(TestGroupName)-$(TargetFramework)-$(BuildNumber) + $(VSTestDiagFileBase).diag + $(VSTestDiagFileBase).flaky.diag @@ -111,6 +114,18 @@ Runs the VSTest on all projects in the ProjectToBuild itemgroup. %(TestAssemblies.RootDir)%(TestAssemblies.Directory) + + <_DefaultNonFlakyTestFilterExpression>Flaky:All!=true + <_DefaultNonFlakyTestFilterExpression Condition="'$(AGENT_OS)' != ''">$(_DefaultNonFlakyTestFilterExpression)&Flaky:AzP:All!=true&Flaky:AzP:OS:$(AGENT_OS)!=true + <_DefaultFlakyTestFilterExpression>Flaky:All=true + <_DefaultFlakyTestFilterExpression Condition="'$(AGENT_OS)' != ''">$(_DefaultFlakyTestFilterExpression)|Flaky:AzP:All=true|Flaky:AzP:OS:$(AGENT_OS)=true + + $(_DefaultFlakyTestFilterExpression) + $(_DefaultNonFlakyTestFilterExpression) + + + $(NonFlakyTestFilterExpression) + $(FlakyTestFilterExpression) @@ -122,6 +137,7 @@ Runs the VSTest on all projects in the ProjectToBuild itemgroup. + diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index ca718ead5..c09ab3e20 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -125,7 +125,7 @@ function Invoke-RepositoryBuild( } else { [string[]]$repoTasksArgs = $MSBuildArgs | Where-Object { ($_ -like '-p:*') -or ($_ -like '/p:*') -or ($_ -like '-property:') -or ($_ -like '/property:') } - $repoTasksArgs += ,"@$msBuildLogRspFile" + $repoTasksArgs += , "@$msBuildLogRspFile" __build_task_project $Path $repoTasksArgs } @@ -288,11 +288,19 @@ function Set-KoreBuildSettings( if (!$DotNetHome) { $DotNetHome = if ($env:DOTNET_HOME) { $env:DOTNET_HOME } ` elseif ($CI) { Join-Path $RepoPath '.dotnet'} - elseif ($env:USERPROFILE) { Join-Path $env:USERPROFILE '.dotnet'} ` + elseif ($env:USERPROFILE) { Join-Path $env:USERPROFILE '.dotnet'} ` elseif ($env:HOME) {Join-Path $env:HOME '.dotnet'}` else { Join-Path $RepoPath '.dotnet'} } + # Normalize RepoPath to a native File System path so other tools can use it properly + $RepoPath = Convert-Path $RepoPath + + if ($RepoPath.EndsWith("/") -or $RepoPath.EndsWith("\")) { + # Remove trailing slash, we add it ourselves + $RepoPath = $RepoPath.Substring(0, $RepoPath.Length - 1); + } + if (!$ToolsSource) { $ToolsSource = 'https://aspnetcore.blob.core.windows.net/buildtools' } if ($CI) { From 530ec9c3c7892073cd179a0ad7242d9398efd8e8 Mon Sep 17 00:00:00 2001 From: John Luo Date: Mon, 18 Mar 2019 11:28:34 -0700 Subject: [PATCH 162/192] Update SignTool version (#945) To get https://github.com/dotnet/arcade/pull/2170 fix --- build/dependencies.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index bc28a9c0b..865ad10bd 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -3,8 +3,8 @@ 1.5.1 0.3.0 2.0.0 - 1.0.0-beta.19119.1 - 1.0.0-beta.19119.1 + 1.0.0-beta.19167.10 + 1.0.0-beta.19167.10 1.0.0-alpha-004 15.9.0 0.10.0-beta6 From c38761a564c72b5bc96356ec99c89de5f281a358 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Fri, 22 Mar 2019 10:28:54 -0700 Subject: [PATCH 163/192] Update SDK (#947) --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 98c439bc2..6476bb10c 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview4-010309 \ No newline at end of file +3.0.100-preview4-010940 \ No newline at end of file From fb72e2f81a59eb55bbe7ca111354a2256e9e7e56 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 3 Apr 2019 06:30:46 -0700 Subject: [PATCH 164/192] Update SDK to 3.0.100-preview4-011021 (#948) * Update SDK to 3.0.100-preview4-011021 --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 6476bb10c..bfb11348e 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview4-010940 \ No newline at end of file +3.0.100-preview4-011021 From 15a736a8e60846186a8e845ecba136ec9285604f Mon Sep 17 00:00:00 2001 From: Pranav K Date: Wed, 3 Apr 2019 09:43:15 -0700 Subject: [PATCH 165/192] Revert "Update SDK to 3.0.100-preview4-011021 (#948)" (#949) This reverts commit fb72e2f81a59eb55bbe7ca111354a2256e9e7e56. --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index bfb11348e..6476bb10c 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview4-011021 +3.0.100-preview4-010940 \ No newline at end of file From 8c2958d5760531550f30bd6be4c221affdf12c94 Mon Sep 17 00:00:00 2001 From: Pranav K Date: Fri, 5 Apr 2019 16:21:36 -0700 Subject: [PATCH 166/192] Update sdk.version (#950) --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 6476bb10c..7268cafd1 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview4-010940 \ No newline at end of file +3.0.100-preview4-011092 \ No newline at end of file From 8b533cbfa5357e5785f4c4231231c1234cfc2c5f Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 8 Apr 2019 06:21:32 -0700 Subject: [PATCH 167/192] Update to SDK 3.0.100-preview4-011136 (#952) --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 7268cafd1..e847ca8a6 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview4-011092 \ No newline at end of file +3.0.100-preview4-011136 \ No newline at end of file From 89c1651a2b056135b85d343c7ebb4f999ddb7833 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 12 Apr 2019 10:41:56 -0700 Subject: [PATCH 168/192] Create CODEOWNERS (#957) --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) create mode 100644 .github/CODEOWNERS diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 000000000..0578a0e1f --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @aspnet/build From 0e543fb8761394491250585d3811bdbb62e350e8 Mon Sep 17 00:00:00 2001 From: Javier Calvarro Nelson Date: Fri, 12 Apr 2019 19:49:16 +0200 Subject: [PATCH 169/192] Add support for custom restore targets (#956) * Add support for custom restore targets * Allows projects to define custom targets that will run during the repository restore phase. * These custom build targets will run sequentially. * Projects will define the custom restore targets to run by implementing a target like the one below. ``` YarnInstall ``` --- .../modules/projectbuild/module.targets | 21 +++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/files/KoreBuild/modules/projectbuild/module.targets b/files/KoreBuild/modules/projectbuild/module.targets index c57ac2331..9657836c8 100644 --- a/files/KoreBuild/modules/projectbuild/module.targets +++ b/files/KoreBuild/modules/projectbuild/module.targets @@ -75,6 +75,18 @@ Executes /t:{Target} on all projects ItemName="_ProjectToRestoreWithNuGet" /> + + + + <_ProjectToRestoreWithNuGetList>@(_ProjectToRestoreWithNuGet->'%(FullPath)') @@ -93,6 +105,15 @@ Executes /t:{Target} on all projects Properties="$(BuildProperties);__BuildTarget=Restore" RemoveProperties="$(_BuildPropertiesToRemove);Platform" BuildInParallel="%(_ProjectToRestoreDirectly.RestoreInParallel)" /> + + + + From fa8422aa13eb3df196d4da3a32a5e31921d0435b Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 30 Apr 2019 08:56:01 -0700 Subject: [PATCH 170/192] Remove API check (#961) This tool has been made obsolete and will not be supported going forward. The recommended replacement is Microsoft.DotNet.ApiCompat (see https://github.com/dotnet/arcade) --- BuildTools.sln | 46 +- Directory.Build.props | 1 - build/repo.props | 4 - build/tasks/RepoTasks.csproj | 6 +- docs/KoreBuild.md | 8 - files/KoreBuild/KoreBuild.Common.targets | 2 +- src/ApiCheck.Console/ApiCheck.Console.csproj | 51 - src/ApiCheck.Console/ApiListing/ApiElement.cs | 13 - .../ApiListing/ApiElementVisibility.cs | 15 - src/ApiCheck.Console/ApiListing/ApiListing.cs | 50 - .../ApiListing/ApiListingFilters.cs | 37 - .../ApiListing/GenericParameterDescriptor.cs | 61 - .../ApiListing/MemberDescriptor.cs | 193 --- src/ApiCheck.Console/ApiListing/MemberKind.cs | 17 - .../ApiListing/ParameterDescriptor.cs | 61 - .../ApiListing/ParameterDirection.cs | 16 - .../ApiListing/TypeDescriptor.cs | 275 ---- src/ApiCheck.Console/ApiListing/TypeKind.cs | 19 - src/ApiCheck.Console/ApiListingComparer.cs | 294 ---- src/ApiCheck.Console/ApiListingGenerator.cs | 469 ------ src/ApiCheck.Console/BreakingChange.cs | 51 - src/ApiCheck.Console/ChangeKind.cs | 15 - src/ApiCheck.Console/Loader/AssemblyLoader.cs | 34 - .../Loader/AssemblyNameComparer.cs | 33 - .../Loader/CoreClrAssemblyLoader.cs | 131 -- .../Loader/FullFrameworkAssemblyLoader.cs | 43 - ...soft.AspNetCore.BuildTools.ApiCheck.nuspec | 18 - src/ApiCheck.Console/NuGet/Package.cs | 61 - src/ApiCheck.Console/NuGet/PackageAssembly.cs | 20 - src/ApiCheck.Console/NuGet/PackageGraph.cs | 322 ----- .../NuGet/RuntimeDefinition.cs | 18 - .../NuGet/RuntimeGraph.Compatibility.cs | 814 ----------- src/ApiCheck.Console/NuGet/RuntimeGraph.cs | 116 -- src/ApiCheck.Console/Program.cs | 337 ----- src/ApiCheck.Console/README.md | 3 - ...osoft.AspNetCore.BuildTools.ApiCheck.props | 16 - src/ApiCheck.Task/ApiCheck.Task.csproj | 21 - src/ApiCheck.Task/ApiCheckGenerateTask.cs | 34 - src/ApiCheck.Task/ApiCheckTask.cs | 53 - src/ApiCheck.Task/ApiCheckTasksBase.cs | 158 --- .../Internal.AspNetCore.Sdk.csproj | 28 +- .../Internal.AspNetCore.Sdk.nuspec | 4 - .../build/ApiCheck.props | 24 - .../build/ApiCheck.targets | 64 - .../build/Common.props | 2 - .../build/Internal.AspNetCore.Sdk.targets | 1 - .../buildMultiTargeting/ApiCheck.targets | 44 - .../Internal.AspNetCore.Sdk.targets | 1 - .../sdk/DefaultItems.targets | 25 - src/Internal.AspNetCore.Sdk/sdk/Sdk.props | 12 - src/Internal.AspNetCore.Sdk/sdk/Sdk.targets | 2 - test.ps1 | 3 +- test/ApiCheck.Test/ApiCheck.Test.csproj | 22 - test/ApiCheck.Test/ApiListingComparerTests.cs | 460 ------ .../ApiListingGenerationTests.cs | 1258 ----------------- .../ApiCheckBaseline.V1.csproj | 10 - .../ComparisonScenarios.cs | 141 -- test/ApiCheckBaseline.V1/Scenarios.cs | 483 ------- .../ApiCheckBaseline.V2.csproj | 14 - .../ComparisonScenarios.cs | 150 -- test/ApiCheckBaseline.V2/Scenarios.cs | 9 - .../ApiCheckForwardDestination.csproj | 10 - .../ComparisonScenarios.cs | 12 - .../Utilities/RepoTestFixture.cs | 1 - 64 files changed, 8 insertions(+), 6708 deletions(-) delete mode 100644 src/ApiCheck.Console/ApiCheck.Console.csproj delete mode 100644 src/ApiCheck.Console/ApiListing/ApiElement.cs delete mode 100644 src/ApiCheck.Console/ApiListing/ApiElementVisibility.cs delete mode 100644 src/ApiCheck.Console/ApiListing/ApiListing.cs delete mode 100644 src/ApiCheck.Console/ApiListing/ApiListingFilters.cs delete mode 100644 src/ApiCheck.Console/ApiListing/GenericParameterDescriptor.cs delete mode 100644 src/ApiCheck.Console/ApiListing/MemberDescriptor.cs delete mode 100644 src/ApiCheck.Console/ApiListing/MemberKind.cs delete mode 100644 src/ApiCheck.Console/ApiListing/ParameterDescriptor.cs delete mode 100644 src/ApiCheck.Console/ApiListing/ParameterDirection.cs delete mode 100644 src/ApiCheck.Console/ApiListing/TypeDescriptor.cs delete mode 100644 src/ApiCheck.Console/ApiListing/TypeKind.cs delete mode 100644 src/ApiCheck.Console/ApiListingComparer.cs delete mode 100644 src/ApiCheck.Console/ApiListingGenerator.cs delete mode 100644 src/ApiCheck.Console/BreakingChange.cs delete mode 100644 src/ApiCheck.Console/ChangeKind.cs delete mode 100644 src/ApiCheck.Console/Loader/AssemblyLoader.cs delete mode 100644 src/ApiCheck.Console/Loader/AssemblyNameComparer.cs delete mode 100644 src/ApiCheck.Console/Loader/CoreClrAssemblyLoader.cs delete mode 100644 src/ApiCheck.Console/Loader/FullFrameworkAssemblyLoader.cs delete mode 100644 src/ApiCheck.Console/Microsoft.AspNetCore.BuildTools.ApiCheck.nuspec delete mode 100644 src/ApiCheck.Console/NuGet/Package.cs delete mode 100644 src/ApiCheck.Console/NuGet/PackageAssembly.cs delete mode 100644 src/ApiCheck.Console/NuGet/PackageGraph.cs delete mode 100644 src/ApiCheck.Console/NuGet/RuntimeDefinition.cs delete mode 100644 src/ApiCheck.Console/NuGet/RuntimeGraph.Compatibility.cs delete mode 100644 src/ApiCheck.Console/NuGet/RuntimeGraph.cs delete mode 100644 src/ApiCheck.Console/Program.cs delete mode 100644 src/ApiCheck.Console/README.md delete mode 100644 src/ApiCheck.Console/build/Microsoft.AspNetCore.BuildTools.ApiCheck.props delete mode 100644 src/ApiCheck.Task/ApiCheck.Task.csproj delete mode 100644 src/ApiCheck.Task/ApiCheckGenerateTask.cs delete mode 100644 src/ApiCheck.Task/ApiCheckTask.cs delete mode 100644 src/ApiCheck.Task/ApiCheckTasksBase.cs delete mode 100644 src/Internal.AspNetCore.Sdk/build/ApiCheck.props delete mode 100644 src/Internal.AspNetCore.Sdk/build/ApiCheck.targets delete mode 100644 src/Internal.AspNetCore.Sdk/buildMultiTargeting/ApiCheck.targets delete mode 100644 src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets delete mode 100644 test/ApiCheck.Test/ApiCheck.Test.csproj delete mode 100644 test/ApiCheck.Test/ApiListingComparerTests.cs delete mode 100644 test/ApiCheck.Test/ApiListingGenerationTests.cs delete mode 100644 test/ApiCheckBaseline.V1/ApiCheckBaseline.V1.csproj delete mode 100644 test/ApiCheckBaseline.V1/ComparisonScenarios.cs delete mode 100644 test/ApiCheckBaseline.V1/Scenarios.cs delete mode 100644 test/ApiCheckBaseline.V2/ApiCheckBaseline.V2.csproj delete mode 100644 test/ApiCheckBaseline.V2/ComparisonScenarios.cs delete mode 100644 test/ApiCheckBaseline.V2/Scenarios.cs delete mode 100644 test/ApiCheckForwardDestination/ApiCheckForwardDestination.csproj delete mode 100644 test/ApiCheckForwardDestination/ComparisonScenarios.cs diff --git a/BuildTools.sln b/BuildTools.sln index fb9817086..0eb74a9a7 100644 --- a/BuildTools.sln +++ b/BuildTools.sln @@ -1,3 +1,4 @@ + Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.0.0 @@ -6,11 +7,9 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{A4F4353B-C3D EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "files", "files", "{BF3E9C90-F129-4CE6-8F3B-F96831E4429B}" ProjectSection(SolutionItems) = preProject - .appveyor.yml = .appveyor.yml .editorconfig = .editorconfig .gitattributes = .gitattributes .gitignore = .gitignore - .travis.yml = .travis.yml build.cmd = build.cmd build.ps1 = build.ps1 build.sh = build.sh @@ -39,14 +38,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{60A938B2-D EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetPackageVerifier.Console", "modules\NuGetPackageVerifier\console\NuGetPackageVerifier.Console.csproj", "{657AFF5E-164E-493D-8501-8026B7C20808}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApiCheckBaseline.V1", "test\ApiCheckBaseline.V1\ApiCheckBaseline.V1.csproj", "{1B1731E0-4ADB-4A04-9418-FCD7F5CFB79E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApiCheckBaseline.V2", "test\ApiCheckBaseline.V2\ApiCheckBaseline.V2.csproj", "{ECA89839-3332-43F3-B1B1-9C2D91B7285E}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApiCheck.Test", "test\ApiCheck.Test\ApiCheck.Test.csproj", "{D61A892B-D214-44AB-9652-334C4338377B}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApiCheck.Console", "src\ApiCheck.Console\ApiCheck.Console.csproj", "{AEFC7985-27C8-468E-8EF8-E1D589C9053F}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetPackageVerifier.Task", "modules\NuGetPackageVerifier\msbuild\NuGetPackageVerifier.Task.csproj", "{EF38C1CA-8A2E-4C8E-B478-7072C0140514}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Internal.AspNetCore.Sdk", "src\Internal.AspNetCore.Sdk\Internal.AspNetCore.Sdk.csproj", "{F0E4CF2B-29B9-432B-BF27-195996CA24FD}" @@ -55,14 +46,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BuildTools.Tasks", "modules EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BuildTools.Tasks.Tests", "test\BuildTools.Tasks.Tests\BuildTools.Tasks.Tests.csproj", "{211858CA-6E82-4EFD-9960-8D023EEB789F}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApiCheck.Task", "src\ApiCheck.Task\ApiCheck.Task.csproj", "{9BE633D2-025A-4B29-A8A9-FC8F79C331AB}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KoreBuild.FunctionalTests", "test\KoreBuild.FunctionalTests\KoreBuild.FunctionalTests.csproj", "{D5D1BD88-1781-4448-89DD-3E62C95D3A77}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{76ABA507-B453-43BA-BA98-FA3FDDC6DD39}" ProjectSection(SolutionItems) = preProject build\dependencies.props = build\dependencies.props - build\repo.beforecommon.props = build\repo.beforecommon.props build\repo.props = build\repo.props build\repo.targets = build\repo.targets EndProjectSection @@ -82,8 +70,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "NuGetPackageVerifier", "NuG EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KoreBuild.Tasks.Tests", "test\KoreBuild.Tasks.Tests\KoreBuild.Tasks.Tests.csproj", "{A3A81E93-0157-406F-A43C-C163F7F781A9}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "ApiCheckForwardDestination", "test\ApiCheckForwardDestination\ApiCheckForwardDestination.csproj", "{605F0478-A9D2-4A8A-BB38-9D5DC132FBB5}" -EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetPackageVerifier.Tests", "test\NuGetPackageVerifier.Tests\NuGetPackageVerifier.Tests.csproj", "{439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}" EndProject Global @@ -96,22 +82,6 @@ Global {657AFF5E-164E-493D-8501-8026B7C20808}.Debug|Any CPU.Build.0 = Debug|Any CPU {657AFF5E-164E-493D-8501-8026B7C20808}.Release|Any CPU.ActiveCfg = Release|Any CPU {657AFF5E-164E-493D-8501-8026B7C20808}.Release|Any CPU.Build.0 = Release|Any CPU - {1B1731E0-4ADB-4A04-9418-FCD7F5CFB79E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1B1731E0-4ADB-4A04-9418-FCD7F5CFB79E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1B1731E0-4ADB-4A04-9418-FCD7F5CFB79E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1B1731E0-4ADB-4A04-9418-FCD7F5CFB79E}.Release|Any CPU.Build.0 = Release|Any CPU - {ECA89839-3332-43F3-B1B1-9C2D91B7285E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {ECA89839-3332-43F3-B1B1-9C2D91B7285E}.Debug|Any CPU.Build.0 = Debug|Any CPU - {ECA89839-3332-43F3-B1B1-9C2D91B7285E}.Release|Any CPU.ActiveCfg = Release|Any CPU - {ECA89839-3332-43F3-B1B1-9C2D91B7285E}.Release|Any CPU.Build.0 = Release|Any CPU - {D61A892B-D214-44AB-9652-334C4338377B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {D61A892B-D214-44AB-9652-334C4338377B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {D61A892B-D214-44AB-9652-334C4338377B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {D61A892B-D214-44AB-9652-334C4338377B}.Release|Any CPU.Build.0 = Release|Any CPU - {AEFC7985-27C8-468E-8EF8-E1D589C9053F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AEFC7985-27C8-468E-8EF8-E1D589C9053F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AEFC7985-27C8-468E-8EF8-E1D589C9053F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AEFC7985-27C8-468E-8EF8-E1D589C9053F}.Release|Any CPU.Build.0 = Release|Any CPU {EF38C1CA-8A2E-4C8E-B478-7072C0140514}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EF38C1CA-8A2E-4C8E-B478-7072C0140514}.Debug|Any CPU.Build.0 = Debug|Any CPU {EF38C1CA-8A2E-4C8E-B478-7072C0140514}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -128,10 +98,6 @@ Global {211858CA-6E82-4EFD-9960-8D023EEB789F}.Debug|Any CPU.Build.0 = Debug|Any CPU {211858CA-6E82-4EFD-9960-8D023EEB789F}.Release|Any CPU.ActiveCfg = Release|Any CPU {211858CA-6E82-4EFD-9960-8D023EEB789F}.Release|Any CPU.Build.0 = Release|Any CPU - {9BE633D2-025A-4B29-A8A9-FC8F79C331AB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {9BE633D2-025A-4B29-A8A9-FC8F79C331AB}.Debug|Any CPU.Build.0 = Debug|Any CPU - {9BE633D2-025A-4B29-A8A9-FC8F79C331AB}.Release|Any CPU.ActiveCfg = Release|Any CPU - {9BE633D2-025A-4B29-A8A9-FC8F79C331AB}.Release|Any CPU.Build.0 = Release|Any CPU {D5D1BD88-1781-4448-89DD-3E62C95D3A77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D5D1BD88-1781-4448-89DD-3E62C95D3A77}.Debug|Any CPU.Build.0 = Debug|Any CPU {D5D1BD88-1781-4448-89DD-3E62C95D3A77}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -144,10 +110,6 @@ Global {A3A81E93-0157-406F-A43C-C163F7F781A9}.Debug|Any CPU.Build.0 = Debug|Any CPU {A3A81E93-0157-406F-A43C-C163F7F781A9}.Release|Any CPU.ActiveCfg = Release|Any CPU {A3A81E93-0157-406F-A43C-C163F7F781A9}.Release|Any CPU.Build.0 = Release|Any CPU - {605F0478-A9D2-4A8A-BB38-9D5DC132FBB5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {605F0478-A9D2-4A8A-BB38-9D5DC132FBB5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {605F0478-A9D2-4A8A-BB38-9D5DC132FBB5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {605F0478-A9D2-4A8A-BB38-9D5DC132FBB5}.Release|Any CPU.Build.0 = Release|Any CPU {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Debug|Any CPU.Build.0 = Debug|Any CPU {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -158,20 +120,14 @@ Global EndGlobalSection GlobalSection(NestedProjects) = preSolution {657AFF5E-164E-493D-8501-8026B7C20808} = {C0E43505-F8EB-4B7F-B84D-5961F9763945} - {1B1731E0-4ADB-4A04-9418-FCD7F5CFB79E} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} - {ECA89839-3332-43F3-B1B1-9C2D91B7285E} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} - {D61A892B-D214-44AB-9652-334C4338377B} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} - {AEFC7985-27C8-468E-8EF8-E1D589C9053F} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76} {EF38C1CA-8A2E-4C8E-B478-7072C0140514} = {C0E43505-F8EB-4B7F-B84D-5961F9763945} {F0E4CF2B-29B9-432B-BF27-195996CA24FD} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76} {6A631446-BBDD-4743-B576-7F9793B6BE45} = {BD3545FB-5520-43DF-B4F9-83BEA3A38ECA} {211858CA-6E82-4EFD-9960-8D023EEB789F} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} - {9BE633D2-025A-4B29-A8A9-FC8F79C331AB} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76} {D5D1BD88-1781-4448-89DD-3E62C95D3A77} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} {020ED083-4076-4711-A52B-2F89EA884F9B} = {BD3545FB-5520-43DF-B4F9-83BEA3A38ECA} {C0E43505-F8EB-4B7F-B84D-5961F9763945} = {BD3545FB-5520-43DF-B4F9-83BEA3A38ECA} {A3A81E93-0157-406F-A43C-C163F7F781A9} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} - {605F0478-A9D2-4A8A-BB38-9D5DC132FBB5} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution diff --git a/Directory.Build.props b/Directory.Build.props index e8b021768..c601c054a 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -4,7 +4,6 @@ - false $(NoWarn);NU5105 false true diff --git a/build/repo.props b/build/repo.props index 3b5ddf7e6..c428e476d 100644 --- a/build/repo.props +++ b/build/repo.props @@ -3,10 +3,6 @@ true - - - - diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index 8aa6fe562..23ea933e2 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -1,5 +1,5 @@ - - + + netcoreapp3.0 @@ -19,5 +19,5 @@ - + diff --git a/docs/KoreBuild.md b/docs/KoreBuild.md index 9191faa2d..13adc1f69 100644 --- a/docs/KoreBuild.md +++ b/docs/KoreBuild.md @@ -13,13 +13,8 @@ Previously repositories were runable in only one way, by doing `.\build.cmd`. Bu Command | Purpose | Example ----------------------|------------------------------------------------------------------|---------- install-tools | Installs dotnet, CLI and Shared runtimes. | .\run.ps1 install-tools -install vs | Installs/Updates VS components | .\run.ps1 install vs --quiet --product Enterprise -docker-build | Runs the build inside docker. | .\run.ps1 docker-build {jessie\|winservercore} /t:SomeTarget /p:Parameters default-build | Runs install-tools followed by msbuild (like build.cmd used to). | .\run.ps1 default-build /t:SomeTarget /p:Parameters msbuild | Runs the build normally. | .\run.ps1 msbuild /t:SomeTarget /p:Parameters -upgrade deps | Upgrade the dependencies.props of this project. | .\run.ps1 upgrade deps -generate deps | Generate a dependencies.props for this project. | .\run.ps1 generate deps -generate api-baselines | Re-generate baselines for all projects. | .\run.ps1 generate api-baselines ### KoreBuild properties @@ -27,10 +22,7 @@ Below is a list of some of the properties that KoreBuild recognizes which you mi Property | Purpose ------------------|-------- -GenerateBaselines | Toggles the (re-)generation of baselines for all projects (defaults to true). -ReplaceBaselines | If 'true' baseline.\*.json and breakingchanges.\*.json files are deleted, and baseline.\*.json files are recreated from the current state. VSTestBlame | Turns on the '--blame' option of vstest, useful for diagnosing test host failures. -EnableApiCheck | If 'false' no targets related to ApiCheck are run. ### KoreBuild config diff --git a/files/KoreBuild/KoreBuild.Common.targets b/files/KoreBuild/KoreBuild.Common.targets index 27255d0fe..4ce7bd2d7 100644 --- a/files/KoreBuild/KoreBuild.Common.targets +++ b/files/KoreBuild/KoreBuild.Common.targets @@ -93,7 +93,7 @@ extending the *DependsOn property diff --git a/src/ApiCheck.Console/ApiCheck.Console.csproj b/src/ApiCheck.Console/ApiCheck.Console.csproj deleted file mode 100644 index 048ed470f..000000000 --- a/src/ApiCheck.Console/ApiCheck.Console.csproj +++ /dev/null @@ -1,51 +0,0 @@ - - - - - netcoreapp3.0;net46 - Microsoft.AspNetCore.BuildTools.ApiCheck - ApiCheck - Microsoft.AspNetCore.BuildTools.ApiCheck - exe - false - false - - - - - $(MSBuildThisFileDirectory)Microsoft.AspNetCore.BuildTools.ApiCheck.nuspec - $(MSBuildThisFileDirectory)bin\$(Configuration)\publish\ - $(IntermediatePackDir)$(TargetFramework)\ - - - - - - - - - - - - - <_TargetFramework Include="$(TargetFrameworks)" /> - - - - - - - $(NuspecProperties);id=$(PackageId) - $(NuspecProperties);publishDir=$(IntermediatePackDir) - $(NuspecProperties);taskBuildDir=$(MSBuildThisFileDirectory)..\ApiCheck.Task\bin\$(Configuration) - $(NuspecProperties);version=$(PackageVersion) - - - - - - - diff --git a/src/ApiCheck.Console/ApiListing/ApiElement.cs b/src/ApiCheck.Console/ApiListing/ApiElement.cs deleted file mode 100644 index 849a29104..000000000 --- a/src/ApiCheck.Console/ApiListing/ApiElement.cs +++ /dev/null @@ -1,13 +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.Diagnostics; - -namespace ApiCheck.Description -{ - [DebuggerDisplay("{" + nameof(Id) + ",nq}")] - public class ApiElement - { - public virtual string Id { get; } - } -} diff --git a/src/ApiCheck.Console/ApiListing/ApiElementVisibility.cs b/src/ApiCheck.Console/ApiListing/ApiElementVisibility.cs deleted file mode 100644 index f3a04e7e0..000000000 --- a/src/ApiCheck.Console/ApiListing/ApiElementVisibility.cs +++ /dev/null @@ -1,15 +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 Newtonsoft.Json; -using Newtonsoft.Json.Converters; - -namespace ApiCheck.Description -{ - [JsonConverter(typeof(StringEnumConverter))] - public enum ApiElementVisibility - { - Public, - Protected - } -} diff --git a/src/ApiCheck.Console/ApiListing/ApiListing.cs b/src/ApiCheck.Console/ApiListing/ApiListing.cs deleted file mode 100644 index e23db4f91..000000000 --- a/src/ApiCheck.Console/ApiListing/ApiListing.cs +++ /dev/null @@ -1,50 +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 System.Reflection; -using Newtonsoft.Json; - -namespace ApiCheck.Description -{ - public class ApiListing - { - public string AssemblyIdentity { get; set; } - - public IList Types { get; } = new List(); - - [JsonIgnore] - public IEnumerable> SourceFilters { get; set; } - - public TypeDescriptor FindType(string name) - { - foreach (var type in Types) - { - if (string.Equals(name, type.Name, StringComparison.Ordinal)) - { - return type; - } - } - - return null; - } - - public ApiElement FindElement(string typeId, string memberId) - { - var type = Types.FirstOrDefault(t => t.Id == typeId); - if (type == null) - { - return null; - } - - if (memberId == null) - { - return type; - } - - return type.FindMember(memberId); - } - } -} diff --git a/src/ApiCheck.Console/ApiListing/ApiListingFilters.cs b/src/ApiCheck.Console/ApiListing/ApiListingFilters.cs deleted file mode 100644 index 38d4989e2..000000000 --- a/src/ApiCheck.Console/ApiListing/ApiListingFilters.cs +++ /dev/null @@ -1,37 +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.Linq; -using System.Reflection; -using ApiCheck.Description; - -namespace ApiCheck -{ - public static class ApiListingFilters - { - public static bool IsInInternalNamespace(MemberInfo e) - { - var type = e as TypeInfo; - if (type == null) - { - return false; - } - - var segments = type.Namespace.Split('.'); - return segments.Any(s => s == "Internal"); - } - - public static bool IsInInternalNamespace(ApiElement e) - { - var type = e as TypeDescriptor; - if (type == null) - { - return false; - } - - var segments = type.Name.Split('.'); - // Skip the last segment as is the type name. - return segments.Take(segments.Length - 1).Any(s => s.Equals("Internal")); - } - } -} diff --git a/src/ApiCheck.Console/ApiListing/GenericParameterDescriptor.cs b/src/ApiCheck.Console/ApiListing/GenericParameterDescriptor.cs deleted file mode 100644 index 3b174b0b0..000000000 --- a/src/ApiCheck.Console/ApiListing/GenericParameterDescriptor.cs +++ /dev/null @@ -1,61 +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.Collections.Generic; -using System.Reflection; -using Newtonsoft.Json; - -namespace ApiCheck.Description -{ - public class GenericParameterDescriptor : ApiElement - { - [JsonIgnore] - public override string Id => HasConstraints() ? $"T{ParameterPosition}" + " : " + GetConstraints() : ParameterName; - - [JsonIgnore] - public TypeInfo Source { get; set; } - - public string ParameterName { get; set; } - - public int ParameterPosition { get; set; } - - private string GetConstraints() - { - var constraints = new List(); - foreach (var type in BaseTypeOrInterfaces) - { - constraints.Add(type); - } - if (Class) - { - constraints.Add("class"); - } - - if (Struct) - { - constraints.Add("struct"); - } - - if (!Struct && New) - { - constraints.Add("new()"); - } - - return string.Join(", ", constraints); - } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool New { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool Class { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool Struct { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public IList BaseTypeOrInterfaces { get; } = new List(); - - public bool HasConstraints() => New || Class || Struct || BaseTypeOrInterfaces.Count > 0; - } -} diff --git a/src/ApiCheck.Console/ApiListing/MemberDescriptor.cs b/src/ApiCheck.Console/ApiListing/MemberDescriptor.cs deleted file mode 100644 index 35ef300c6..000000000 --- a/src/ApiCheck.Console/ApiListing/MemberDescriptor.cs +++ /dev/null @@ -1,193 +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.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Text; -using Newtonsoft.Json; - -namespace ApiCheck.Description -{ - public class MemberDescriptor : ApiElement - { - [JsonIgnore] - public override string Id => string.Join(" ", GetComponents()); - - [JsonIgnore] - public MemberInfo Source { get; set; } - - public MemberKind Kind { get; set; } - - public string Name { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public IList Parameters { get; set; } = new List(); - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public string ReturnType { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool Sealed { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool Static { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool Virtual { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool Override { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool Abstract { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool New { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool Extension { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool ReadOnly { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public string ExplicitInterface { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public string ImplementedInterface { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public ApiElementVisibility? Visibility { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public IList GenericParameter { get; } = new List(); - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool Constant { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public string Literal { get; set; } - - private IEnumerable GetComponents() - { - if (ExplicitInterface == null && Visibility != null) - { - switch (Visibility) - { - case ApiElementVisibility.Public: - yield return "public"; - break; - case ApiElementVisibility.Protected: - yield return "protected"; - break; - } - } - - if (Constant) - { - yield return "const"; - } - else - { - if (Static) - { - yield return "static"; - } - - if (ReadOnly) - { - yield return "readonly"; - } - } - - if (Abstract) - { - yield return "abstract"; - } - - if (Sealed && ImplementedInterface == null) - { - yield return "sealed"; - } - - if (!Sealed && Virtual && !Abstract && !Override && ImplementedInterface == null) - { - yield return "virtual"; - } - - if (Override) - { - yield return "override"; - } - - if (New) - { - yield return "new"; - } - - if (ReturnType != null) - { - yield return ReturnType; - } - - if (Kind != MemberKind.Field) - { - var name = ExplicitInterface != null ? $"{ExplicitInterface}.{Name}" : Name; - yield return GetParametersComponent(name); - - foreach (var constraint in GenericParameter.Where(p => p.HasConstraints())) - { - yield return "where"; - yield return constraint.Id; - } - } - else - { - yield return Name; - - if (Literal != null) - { - yield return "="; - yield return Literal; - } - } - } - - private string GetParametersComponent(string name) - { - var builder = new StringBuilder(); - - builder.Append(name); - builder.Append("("); - for (var i = 0; i < Parameters.Count; i++) - { - var parameter = Parameters[i]; - if (Extension && i == 0) - { - builder.Append("this "); - } - builder.Append(parameter.Id); - if (i < Parameters.Count - 1) - { - builder.Append(", "); - } - } - - builder.Append(")"); - return builder.ToString(); - } - - public static string GetMemberNameFor(MethodBase member, bool includeGenericParameters = true) - { - if (!member.IsGenericMethod || !includeGenericParameters) - { - return member.Name; - } - - var genericParameters = string.Join(", ", member.GetGenericArguments().Select(ga => TypeDescriptor.GetTypeNameFor(ga.GetTypeInfo()))); - - return $"{member.Name}<{genericParameters}>"; - } - } -} diff --git a/src/ApiCheck.Console/ApiListing/MemberKind.cs b/src/ApiCheck.Console/ApiListing/MemberKind.cs deleted file mode 100644 index d3a64f3e0..000000000 --- a/src/ApiCheck.Console/ApiListing/MemberKind.cs +++ /dev/null @@ -1,17 +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 Newtonsoft.Json; -using Newtonsoft.Json.Converters; - -namespace ApiCheck.Description -{ - [JsonConverter(typeof(StringEnumConverter))] - public enum MemberKind - { - Constructor, - // This includes property and events accessors. - Method, - Field - } -} diff --git a/src/ApiCheck.Console/ApiListing/ParameterDescriptor.cs b/src/ApiCheck.Console/ApiListing/ParameterDescriptor.cs deleted file mode 100644 index 6d72ac88b..000000000 --- a/src/ApiCheck.Console/ApiListing/ParameterDescriptor.cs +++ /dev/null @@ -1,61 +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.Collections.Generic; -using System.Reflection; -using Newtonsoft.Json; - -namespace ApiCheck.Description -{ - public class ParameterDescriptor : ApiElement - { - [JsonIgnore] - public override string Id => string.Join(" ", GetComponents()); - - [JsonIgnore] - public ParameterInfo Source { get; set; } - - public string Name { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public string Type { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public ParameterDirection Direction { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public string DefaultValue { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool IsParams { get; set; } - - private IEnumerable GetComponents() - { - switch (Direction) - { - case ParameterDirection.In: - break; - case ParameterDirection.Out: - yield return "out"; - break; - case ParameterDirection.Ref: - yield return "ref"; - break; - } - - if (IsParams) - { - yield return "params"; - } - - yield return Type; - yield return Name; - - if (DefaultValue != null) - { - yield return "="; - yield return DefaultValue; - } - } - } -} diff --git a/src/ApiCheck.Console/ApiListing/ParameterDirection.cs b/src/ApiCheck.Console/ApiListing/ParameterDirection.cs deleted file mode 100644 index 452ecfca2..000000000 --- a/src/ApiCheck.Console/ApiListing/ParameterDirection.cs +++ /dev/null @@ -1,16 +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 Newtonsoft.Json; -using Newtonsoft.Json.Converters; - -namespace ApiCheck.Description -{ - [JsonConverter(typeof(StringEnumConverter))] - public enum ParameterDirection - { - In, - Out, - Ref - } -} diff --git a/src/ApiCheck.Console/ApiListing/TypeDescriptor.cs b/src/ApiCheck.Console/ApiListing/TypeDescriptor.cs deleted file mode 100644 index 9b2298fb4..000000000 --- a/src/ApiCheck.Console/ApiListing/TypeDescriptor.cs +++ /dev/null @@ -1,275 +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 System.Reflection; -using Newtonsoft.Json; - -namespace ApiCheck.Description -{ - public class TypeDescriptor : ApiElement - { - [JsonIgnore] - public override string Id => string.Join(" ", GetSignatureComponents()); - - [JsonIgnore] - public TypeInfo Source { get; set; } - - public string Name { get; set; } - - public ApiElementVisibility Visibility { get; set; } - - public TypeKind Kind { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool Abstract { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool Static { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public bool Sealed { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public string BaseType { get; set; } - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public IList ImplementedInterfaces { get; } = new List(); - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public IList Members { get; } = new List(); - - [JsonProperty(DefaultValueHandling = DefaultValueHandling.IgnoreAndPopulate)] - public IList GenericParameters { get; } = new List(); - - private IEnumerable GetSignatureComponents() - { - switch (Visibility) - { - case ApiElementVisibility.Public: - yield return "public"; - break; - case ApiElementVisibility.Protected: - yield return "protected"; - break; - } - - if (Static) - { - yield return "static"; - } - else if (Kind == TypeKind.Class) - { - if (Abstract) - { - yield return "abstract"; - } - - if (Sealed) - { - yield return "sealed"; - } - } - - switch (Kind) - { - case TypeKind.Struct: - yield return "struct"; - break; - case TypeKind.Interface: - yield return "interface"; - break; - case TypeKind.Class: - yield return "class"; - break; - case TypeKind.Enumeration: - yield return "enum"; - break; - case TypeKind.Unknown: - Console.WriteLine($"Undefined kind for: {Name}"); - break; - default: - throw new InvalidOperationException("Invalid kind"); - } - - yield return Name; - - if (BaseType != null || ImplementedInterfaces.Count > 0) - { - yield return ":"; - yield return string.Join(", ", GetBaseTypeAndImplementedInterfaces()); - } - - foreach (var constraint in GenericParameters.Where(p => p.HasConstraints())) - { - yield return "where"; - yield return constraint.Id; - } - } - - public MemberDescriptor FindMember(string id) - { - foreach (var member in Members) - { - if (string.Equals(id, member.Id, StringComparison.Ordinal)) - { - return member; - } - } - - return null; - } - - private IEnumerable GetBaseTypeAndImplementedInterfaces() - { - if (BaseType != null) - { - yield return BaseType; - } - - foreach (var @interface in ImplementedInterfaces) - { - if (@interface != null) - { - yield return @interface; - } - } - } - - public static string GetTypeNameFor(TypeInfo type) - { - var typeName = type.FullName ?? type.Name; - - if (type.IsGenericParameter) - { - typeName = $"T{type.GenericParameterPosition}"; - } - - if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(Nullable<>)) - { - var underlyingTypeName = GetTypeNameFor(type.GetGenericArguments().Single().GetTypeInfo()); - typeName = underlyingTypeName + "?"; - } - - if (type.IsGenericType) - { - if (type.DeclaringType == null || Equals(type.DeclaringType.GetTypeInfo(), type)) - { - var name = type.GetGenericTypeDefinition().FullName; - typeName = name.Substring(0, name.IndexOf('`')); - typeName = $"{typeName}<{string.Join(", ", type.GetGenericArguments().Select(ga => GetTypeNameFor(ga.GetTypeInfo())))}>"; - } - else - { - var container = type.DeclaringType.GetTypeInfo(); - var prefix = GetTypeNameFor(container); - var name = type.GetGenericTypeDefinition().FullName; - var currentTypeGenericArguments = type.GetGenericTypeDefinition().GetGenericArguments() - .Where(p => container.GetGenericArguments().All(cp => cp.Name != p.Name)) - .Select(p => type.GetGenericArguments()[p.GenericParameterPosition]) - .ToArray(); - - if (currentTypeGenericArguments.Length == 0) - { - var nestedClassSeparatorIndex = name.LastIndexOf("+"); - name = name.Substring(nestedClassSeparatorIndex + 1, name.Length - nestedClassSeparatorIndex - 1); - } - else - { - var lastGenericArityIndex = name.LastIndexOf('`'); - var nestedClassSeparatorIndex = name.LastIndexOf("+"); - name = name.Substring(nestedClassSeparatorIndex + 1, lastGenericArityIndex - nestedClassSeparatorIndex - 1); - name = $"{name}<{string.Join(", ", currentTypeGenericArguments.Select(ga => GetTypeNameFor(ga.GetTypeInfo())))}>"; - } - - typeName = $"{prefix}+{name}"; - } - } - - if (type.IsArray) - { - var name = GetTypeNameFor(type.GetElementType().GetTypeInfo()); - typeName = $"{name}[]"; - } - - if (type.IsByRef) - { - typeName = GetTypeNameFor(type.GetElementType().GetTypeInfo()); - } - - // Parameters passed by reference through out or ref modifiers have an & at the end of their - // name to indicate they are pointers to a given type. - typeName = typeName.TrimEnd('&'); - - return typeName; - } - - public static IEnumerable GetImplementedInterfacesFor(TypeInfo type) - { - if (type.IsGenericParameter) - { - var interfaces = type.ImplementedInterfaces.ToArray(); - foreach (var t in interfaces) - { - var implementedInterface = t.GetTypeInfo(); - var implementedOnBaseType = type.BaseType != null && - InterfaceIsImplementedOnBaseType(type.BaseType.GetTypeInfo(), - implementedInterface); - - if (!implementedOnBaseType && !InterfaceIsTransitivelyImplemented(type, implementedInterface)) - { - yield return implementedInterface; - } - } - } - else if (!type.IsInterface) - { - var interfaces = type.ImplementedInterfaces.ToArray(); - foreach (var t in interfaces) - { - var implementedInterface = t.GetTypeInfo(); - if ((!InterfaceIsImplementedOnBaseType(type.BaseType.GetTypeInfo(), implementedInterface) && - !InterfaceIsTransitivelyImplemented(type, implementedInterface)) || - InterfaceIsReimplementedOnCurrentType(type, implementedInterface)) - { - yield return implementedInterface; - } - } - } - else - { - var interfaces = type.ImplementedInterfaces.ToArray(); - foreach (var t in interfaces) - { - var implementedInterface = t.GetTypeInfo(); - if (!InterfaceIsTransitivelyImplemented(type, implementedInterface)) - { - yield return implementedInterface; - } - } - } - } - - private static bool InterfaceIsReimplementedOnCurrentType(TypeInfo type, TypeInfo implementedInterface) - { - var mapping = type.GetRuntimeInterfaceMap(implementedInterface.AsType()); - return InterfaceIsImplementedOnBaseType(type.BaseType.GetTypeInfo(), implementedInterface) && - mapping.TargetMethods.Any(tm => tm.DeclaringType.GetTypeInfo().Equals(type) && - (tm.IsPrivate || tm.Equals(tm.GetBaseDefinition()))); - } - - private static bool InterfaceIsTransitivelyImplemented(TypeInfo type, TypeInfo implementedInterface) - { - return type.ImplementedInterfaces - .SelectMany(ii => ii.GetTypeInfo().ImplementedInterfaces) - .Any(bii => bii.GetTypeInfo().Equals(implementedInterface)); - } - - private static bool InterfaceIsImplementedOnBaseType(TypeInfo typeInfo, TypeInfo implementedInterface) - { - return typeInfo.ImplementedInterfaces.Any(ii => ii.GetTypeInfo().Equals(implementedInterface)); - } - } -} diff --git a/src/ApiCheck.Console/ApiListing/TypeKind.cs b/src/ApiCheck.Console/ApiListing/TypeKind.cs deleted file mode 100644 index eac324545..000000000 --- a/src/ApiCheck.Console/ApiListing/TypeKind.cs +++ /dev/null @@ -1,19 +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 Newtonsoft.Json; -using Newtonsoft.Json.Converters; - -namespace ApiCheck.Description -{ - [JsonConverter(typeof(StringEnumConverter))] - public enum TypeKind - { - Unknown, - Struct, - Interface, - // Includes delegates as they are extend multicast delegate. - Class, - Enumeration - } -} diff --git a/src/ApiCheck.Console/ApiListingComparer.cs b/src/ApiCheck.Console/ApiListingComparer.cs deleted file mode 100644 index 813404de3..000000000 --- a/src/ApiCheck.Console/ApiListingComparer.cs +++ /dev/null @@ -1,294 +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 System.Reflection; -using ApiCheck.Description; - -namespace ApiCheck -{ - public class ApiListingComparer - { - private readonly ApiListing _newApiListing; - private readonly ApiListing _oldApiListing; - - public ApiListingComparer( - ApiListing oldApiListing, - ApiListing newApiListing) - { - _oldApiListing = oldApiListing; - _newApiListing = newApiListing; - } - - public IList GetDifferences() - { - var breakingChanges = new List(); - var newTypes = _newApiListing.Types; - - foreach (var type in _oldApiListing.Types) - { - var newType = _newApiListing.FindType(type.Name); - if (newType == null) - { - breakingChanges.Add(new BreakingChange(type.Id, memberId: null, kind: ChangeKind.Removal)); - } - else - { - newTypes.Remove(newType); - - if (!string.Equals(type.Id, newType.Id, StringComparison.Ordinal) - && !IsAcceptableTypeChange(type, newType)) - { - breakingChanges.Add(new BreakingChange(type.Id, memberId: null, kind: ChangeKind.Removal)); - continue; - } - - CompareMembers(type, newType, breakingChanges); - } - } - - return breakingChanges; - } - - private void CompareMembers(TypeDescriptor type, TypeDescriptor newType, List breakingChanges) - { - var newMembers = newType.Members.ToList(); - - foreach (var member in type.Members) - { - if (IsAcceptableMemberChange(newType, member, out var newMember)) - { - newMembers.Remove(newMember); - } - else - { - breakingChanges.Add(new BreakingChange(type.Id, member.Id, ChangeKind.Removal)); - } - } - - if (newMembers.Count > 0) - { - if (type.Kind == TypeKind.Interface) - { - breakingChanges.AddRange(newMembers.Select(member => new BreakingChange(newType.Id, member.Id, ChangeKind.Addition))); - } - else - { - var disallowedNewMembers = newMembers.Where(member => member.Abstract).ToArray(); - if (disallowedNewMembers.Length > 0) - { - breakingChanges.AddRange(disallowedNewMembers.Select(member => new BreakingChange(newType.Id, member.Id, ChangeKind.Addition))); - } - } - } - } - - private bool IsAcceptableMemberChange(TypeDescriptor newType, MemberDescriptor member, out MemberDescriptor newMember) - { - var acceptable = false; - newMember = null; - var candidate = newType; - while (candidate != null && !acceptable) - { - var matchingMembers = candidate.Members.Where(m => m.Id == member.Id).ToList(); - - if (matchingMembers.Count == 1) - { - newMember = matchingMembers.Single(); - acceptable = true; - } - else if (member.Kind == MemberKind.Method) - { - var matchingMember = newType.Members.FirstOrDefault(m => SameSignature(member, m)); - if (matchingMember != null) - { - acceptable = (member.Sealed || !matchingMember.Sealed) - && (!member.Virtual || matchingMember.Virtual || matchingMember.Override) - && member.Static == matchingMember.Static - && (member.Abstract || !matchingMember.Abstract); - - if (acceptable) - { - newMember = matchingMember; - } - } - } - - candidate = candidate.BaseType == null ? null : FindOrGenerateDescriptorForBaseType(candidate); - } - - return acceptable; - } - - private TypeDescriptor FindOrGenerateDescriptorForBaseType(TypeDescriptor candidate) - { - return _newApiListing.FindType(candidate.BaseType) ?? - ApiListingGenerator.GenerateTypeDescriptor(candidate.Source.BaseType.GetTypeInfo(), _newApiListing.SourceFilters); - } - - private bool SameSignature(MemberDescriptor original, MemberDescriptor candidate) - { - return original.ReturnType == candidate.ReturnType && - original.Name == candidate.Name && - SameGenericParameters(original.GenericParameter, candidate.GenericParameter) && - SameParameters(original.Parameters, candidate.Parameters); - } - - private bool SameParameters( - IList original, - IList candidate) - { - if (original.Count != candidate.Count) - { - return false; - } - - for (var i = 0; i < original.Count; i++) - { - var originalParameter = original[i]; - var candidatePrameter = candidate[i]; - if (originalParameter.Type != candidatePrameter.Type || - originalParameter.Name != candidatePrameter.Name || - originalParameter.Direction != candidatePrameter.Direction || - originalParameter.DefaultValue != candidatePrameter.DefaultValue || - originalParameter.IsParams != candidatePrameter.IsParams) - { - return false; - } - } - - return true; - } - - private bool SameGenericParameters(IList original, IList candidate) - { - if (original.Count != candidate.Count) - { - return false; - } - - for (var i = 0; i < original.Count; i++) - { - var originalParameter = original[i]; - var candidatePrameter = candidate[i]; - if (originalParameter.ParameterPosition != candidatePrameter.ParameterPosition || - !originalParameter.BaseTypeOrInterfaces.OrderBy(id => id).SequenceEqual(candidatePrameter.BaseTypeOrInterfaces.OrderBy(id => id)) || - originalParameter.New != candidatePrameter.New || - originalParameter.Class != candidatePrameter.Class || - originalParameter.Struct != candidatePrameter.Struct) - { - return false; - } - } - - return true; - } - - private bool IsAcceptableTypeChange(TypeDescriptor oldType, TypeDescriptor newType) - { - var typeChanged = oldType.Kind != newType.Kind; - if (typeChanged) - { - return false; - } - - if (!HasCompatibleVisibility(oldType, newType)) - { - return false; - } - - if (oldType.GenericParameters.Count > 0 && - !HasCompatibleSetOfGenericParameters(oldType.GenericParameters, newType.GenericParameters)) - { - return false; - } - - switch (oldType.Kind) - { - case TypeKind.Struct: - return ImplementsAllInterfaces(oldType, newType); - case TypeKind.Class: - return ImplementsAllInterfaces(oldType, newType) && - (!newType.Sealed || oldType.Sealed == newType.Sealed) && - (!newType.Abstract || oldType.Abstract == newType.Abstract) && - newType.Static == oldType.Static && - (oldType.BaseType == null || newType.BaseType == oldType.BaseType); - case TypeKind.Interface: - return HasCompatibleSetOfInterfaces(oldType, newType); - case TypeKind.Enumeration: - return oldType.BaseType == newType.BaseType; - case TypeKind.Unknown: - break; - } - - return false; - } - - private bool HasCompatibleSetOfGenericParameters( - IList oldGenericParameters, - IList newGenericParameters) - { - if (oldGenericParameters.Count != newGenericParameters.Count) - { - return false; - } - - var oldSet = oldGenericParameters.OrderBy(ogp => ogp.ParameterPosition).ToArray(); - var newSet = newGenericParameters.OrderBy(ogp => ogp.ParameterPosition).ToArray(); - for (var i = 0; i < oldSet.Length; i++) - { - var oldParameter = oldSet[i]; - var newParameter = newSet[i]; - var areCompatible = AreCompatible(oldParameter, newParameter); - if (!areCompatible) - { - return false; - } - } - - return true; - } - - private bool AreCompatible(GenericParameterDescriptor oldParameter, GenericParameterDescriptor newParameter) - { - return ((newParameter.New && oldParameter.New) || !newParameter.New) && - ((newParameter.Class && oldParameter.Class) || !newParameter.Class) && - ((newParameter.Struct && oldParameter.Struct) || !newParameter.Struct) && - newParameter.BaseTypeOrInterfaces.Count == oldParameter.BaseTypeOrInterfaces.Count && - newParameter.BaseTypeOrInterfaces.All(btoi => oldParameter.BaseTypeOrInterfaces.Contains(btoi)); - } - - private bool HasCompatibleSetOfInterfaces(TypeDescriptor oldType, TypeDescriptor newType) - { - // An interface can't require new implemented interfaces unless they are marker interfaces (they don't have any member) - var newInterfaces = newType.Source.ImplementedInterfaces - .Where(i => !oldType.ImplementedInterfaces.Contains(TypeDescriptor.GetTypeNameFor(i.GetTypeInfo()))); - - return newInterfaces.All(ni => ni.GetTypeInfo().GetMembers().Length == 0); - } - - private bool ImplementsAllInterfaces(TypeDescriptor oldType, TypeDescriptor newType) - { - var oldInterfaces = oldType.ImplementedInterfaces; - var newInterfaces = newType.Source.ImplementedInterfaces.Select(i => TypeDescriptor.GetTypeNameFor(i.GetTypeInfo())); - - return oldInterfaces.All(oi => newInterfaces.Contains(oi)); - } - - private bool HasCompatibleVisibility(TypeDescriptor oldType, TypeDescriptor newType) - { - switch (oldType.Visibility) - { - case ApiElementVisibility.Public: - return newType.Visibility == ApiElementVisibility.Public; - case ApiElementVisibility.Protected: - // Is going from protected to public a breaking change ? - return true; - default: - throw new InvalidOperationException("Unrecognized visibility"); - } - } - } -} diff --git a/src/ApiCheck.Console/ApiListingGenerator.cs b/src/ApiCheck.Console/ApiListingGenerator.cs deleted file mode 100644 index 9737b4610..000000000 --- a/src/ApiCheck.Console/ApiListingGenerator.cs +++ /dev/null @@ -1,469 +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 System.Reflection; -using System.Runtime.CompilerServices; -using ApiCheck.Description; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace ApiCheck -{ - public class ApiListingGenerator - { - private const BindingFlags SearchFlags = BindingFlags.Public | - BindingFlags.NonPublic | - BindingFlags.Instance | - BindingFlags.Static | - BindingFlags.DeclaredOnly; - - private readonly Assembly _assembly; - private readonly IEnumerable> _filters; - - public ApiListingGenerator(Assembly assembly, IEnumerable> filters) - { - _assembly = assembly; - _filters = filters; - } - - public static JObject GenerateApiListingReport(Assembly assembly, IEnumerable> filters = null) - { - var generator = new ApiListingGenerator(assembly, filters ?? Enumerable.Empty>()); - var apiListingDocument = generator.GenerateApiListing(); - return JObject.FromObject(apiListingDocument); - } - - public ApiListing GenerateApiListing() - { - var types = _assembly.DefinedTypes -#if NETCOREAPP3_0 // Reflection does not provide a hook to enumerate forwarded types in .NET Framework. - .Concat(_assembly - .GetForwardedTypes() - .Select(type => type.GetTypeInfo())) -#endif - .Where(t => t.IsPublic || t.IsNestedPublic || t.IsNestedFamily || t.IsNestedFamORAssem); - - var document = new ApiListing - { - AssemblyIdentity = _assembly.GetName().ToString(), - SourceFilters = _filters - }; - foreach (var type in types.Where(t => !_filters.Any(filter => filter(t)))) - { - var apiListingType = GenerateTypeDescriptor(type); - document.Types.Add(apiListingType); - } - - return document; - } - - public static TypeDescriptor GenerateTypeDescriptor(TypeInfo type, IEnumerable> filters = null) - { - filters = filters ?? Enumerable.Empty>(); - var generator = new ApiListingGenerator(type.Assembly, filters); - return generator.GenerateTypeDescriptor(type); - } - - private TypeDescriptor GenerateTypeDescriptor(TypeInfo type) - { - var typeDescriptor = new TypeDescriptor - { - Source = type, - Name = TypeDescriptor.GetTypeNameFor(type), - Kind = GetTypeKind(type), - }; - if (typeDescriptor.Kind == TypeKind.Unknown) - { - throw new InvalidOperationException($"Can't determine type for {type.FullName}"); - } - - // At this point we've filtered away any non public or protected member, - // so we only need to check if something is public - typeDescriptor.Visibility = type.IsPublic || type.IsNestedPublic ? ApiElementVisibility.Public : ApiElementVisibility.Protected; - - typeDescriptor.Static = typeDescriptor.Kind == TypeKind.Class && type.IsSealed && type.IsAbstract; - - typeDescriptor.Abstract = type.IsAbstract; - - typeDescriptor.Sealed = type.IsSealed; - - if (type.BaseType != null && - type.BaseType != typeof(object) && - type.BaseType != typeof(ValueType) && - !(type.IsEnum && type.GetEnumUnderlyingType() == typeof(int))) - { - typeDescriptor.BaseType = !type.IsEnum ? - TypeDescriptor.GetTypeNameFor(type.BaseType.GetTypeInfo()) : - TypeDescriptor.GetTypeNameFor(type.GetEnumUnderlyingType().GetTypeInfo()); - } - - if (type.ImplementedInterfaces.Any()) - { - var interfaces = TypeDescriptor.GetImplementedInterfacesFor(type).ToList(); - foreach (var @interface in interfaces.Select(TypeDescriptor.GetTypeNameFor)) - { - typeDescriptor.ImplementedInterfaces.Add(@interface); - } - } - - if (type.IsGenericType) - { - var constraints = GetGenericConstraintsFor(type.GetGenericArguments().Select(t => t.GetTypeInfo()).ToArray()); - foreach (var constraint in constraints) - { - typeDescriptor.GenericParameters.Add(constraint); - } - } - - var members = type.GetMembers(SearchFlags); - - foreach (var member in members) - { - if (_filters.Any(f => f(member))) - { - continue; - } - - var memberApiListing = GenerateMemberApiListing(type, member); - if (memberApiListing != null) - { - memberApiListing.Source = member; - typeDescriptor.Members.Add(memberApiListing); - } - } - - return typeDescriptor; - } - - private static TypeKind GetTypeKind(TypeInfo type) - { - if (type.IsInterface) - { - return TypeKind.Interface; - } - - if (type.IsEnum) - { - return TypeKind.Enumeration; - } - - if (type.IsValueType) - { - return TypeKind.Struct; - } - - if (type.IsClass) - { - return TypeKind.Class; - } - - return TypeKind.Unknown; - } - - private static IEnumerable GetGenericConstraintsFor(TypeInfo[] genericArguments) - { - foreach (var typeArgument in genericArguments) - { - var constraintDescriptor = new GenericParameterDescriptor - { - Source = typeArgument - }; - if (typeArgument.IsGenericParameter) - { - if (typeArgument.BaseType != null && - typeArgument.BaseType != typeof(object) - && typeArgument.BaseType != typeof(ValueType)) - { - constraintDescriptor.BaseTypeOrInterfaces.Add(TypeDescriptor.GetTypeNameFor(typeArgument.BaseType.GetTypeInfo())); - } - - foreach (var interfaceType in TypeDescriptor.GetImplementedInterfacesFor(typeArgument)) - { - constraintDescriptor.BaseTypeOrInterfaces.Add(TypeDescriptor.GetTypeNameFor(interfaceType)); - } - - constraintDescriptor.ParameterName = typeArgument.Name; - constraintDescriptor.ParameterPosition = typeArgument.GenericParameterPosition; - constraintDescriptor.New = (typeArgument.GenericParameterAttributes & GenericParameterAttributes.DefaultConstructorConstraint) == GenericParameterAttributes.DefaultConstructorConstraint; - constraintDescriptor.Class = (typeArgument.GenericParameterAttributes & GenericParameterAttributes.ReferenceTypeConstraint) == GenericParameterAttributes.ReferenceTypeConstraint; - constraintDescriptor.Struct = (typeArgument.GenericParameterAttributes & GenericParameterAttributes.NotNullableValueTypeConstraint) == GenericParameterAttributes.NotNullableValueTypeConstraint; - } - else - { - constraintDescriptor.ParameterName = TypeDescriptor.GetTypeNameFor(typeArgument); - } - - yield return constraintDescriptor; - } - } - - public static MemberDescriptor GenerateMemberApiListing(TypeInfo type, MemberInfo member) - { - switch (member.MemberType) - { - case MemberTypes.Constructor: - var ctor = (ConstructorInfo)member; - if (!ctor.IsPublic && !ctor.IsFamily && !ctor.IsFamilyOrAssembly) - { - return null; - } - - var constructorDescriptor = new MemberDescriptor - { - Kind = MemberKind.Constructor, - Visibility = ctor.IsPublic ? ApiElementVisibility.Public : ApiElementVisibility.Protected, - - Name = MemberDescriptor.GetMemberNameFor(ctor) - }; - foreach (var parameter in ctor.GetParameters()) - { - var parameterDescriptor = GenerateParameterDescriptor(parameter); - constructorDescriptor.Parameters.Add(parameterDescriptor); - } - - return constructorDescriptor; - - case MemberTypes.Method: - var method = (MethodInfo)member; - if (!method.IsPublic && !method.IsFamily && !method.IsFamilyOrAssembly) - { - return null; - } - - var methodDescriptor = new MemberDescriptor - { - Kind = MemberKind.Method, - - Visibility = method.IsPublic ? ApiElementVisibility.Public : ApiElementVisibility.Protected - }; - if (!type.IsInterface) - { - methodDescriptor.ExplicitInterface = GetInterfaceImplementation(method, explicitImplementation: true); - methodDescriptor.ImplementedInterface = methodDescriptor.ExplicitInterface ?? GetInterfaceImplementation(method, explicitImplementation: false); - } - else - { - methodDescriptor.Visibility = null; - } - - methodDescriptor.Name = MemberDescriptor.GetMemberNameFor(method); - - if (method.IsGenericMethod) - { - var constraints = GetGenericConstraintsFor(method.GetGenericArguments().Select(t => t.GetTypeInfo()).ToArray()); - foreach (var constraint in constraints) - { - methodDescriptor.GenericParameter.Add(constraint); - } - } - - methodDescriptor.Static = method.IsStatic; - methodDescriptor.Sealed = method.IsFinal; - methodDescriptor.Virtual = !type.IsInterface && method.IsVirtual; - methodDescriptor.Override = !type.IsInterface && method.IsVirtual && !Equals(method.GetBaseDefinition(), method); - methodDescriptor.Abstract = !type.IsInterface && method.IsAbstract; - methodDescriptor.New = !method.IsAbstract && !method.IsVirtual && method.IsHideBySig && method - .DeclaringType.GetMember(method.Name) - .OfType() - .Count(m => SameSignature(m, method)) > 1; - methodDescriptor.Extension = method.IsDefined(typeof(ExtensionAttribute), false); - - foreach (var parameter in method.GetParameters()) - { - var parameterDescriptor = GenerateParameterDescriptor(parameter); - methodDescriptor.Parameters.Add(parameterDescriptor); - } - - methodDescriptor.ReturnType = TypeDescriptor.GetTypeNameFor(method.ReturnType.GetTypeInfo()); - - return methodDescriptor; - - case MemberTypes.Field: - var field = (FieldInfo)member; - if (!field.IsPublic && !field.IsFamily && !field.IsFamilyOrAssembly) - { - return null; - } - - if (type.IsEnum && !field.IsLiteral) - { - // Skip storage for enumerations. - return null; - } - - var fieldDescriptor = new MemberDescriptor - { - Visibility = field.IsPublic ? ApiElementVisibility.Public : ApiElementVisibility.Protected, - - Kind = MemberKind.Field, - Name = field.Name - }; - if (type.IsEnum || field.IsLiteral) - { - fieldDescriptor.Literal = FormatLiteralValue(field.GetRawConstantValue(), field.FieldType); - } - - if (type.IsEnum) - { - fieldDescriptor.Visibility = null; - } - else - { - fieldDescriptor.Constant = field.IsLiteral; - fieldDescriptor.Static = field.IsStatic; - fieldDescriptor.ReadOnly = field.IsInitOnly; - fieldDescriptor.ReturnType = TypeDescriptor.GetTypeNameFor(field.FieldType.GetTypeInfo()); - } - - return fieldDescriptor; - case MemberTypes.Event: - case MemberTypes.Property: - case MemberTypes.NestedType: - // All these cases are covered by the methods they implicitly define on the class - // (Properties and Events) and when we enumerate all the types in an assembly (Nested types). - return null; - - case MemberTypes.TypeInfo: - // There should not be any member passed into this method that is not a top level type. - case MemberTypes.Custom: - // We don't know about custom member types, so better throw if we find something we don't understand. - case MemberTypes.All: - throw new InvalidOperationException($"'{type.MemberType}' [{member}] is not supported."); - - default: - return null; - } - } - - public static ApiListing LoadFrom(string json, IEnumerable> oldApiListingFilters = null) - { - oldApiListingFilters = oldApiListingFilters ?? Enumerable.Empty>(); - var oldApiListing = JsonConvert.DeserializeObject(json); - foreach (var type in oldApiListing.Types.ToArray()) - { - if (oldApiListingFilters.Any(filter => filter(type))) - { - oldApiListing.Types.Remove(type); - } - - foreach (var member in type.Members.ToArray()) - { - if (oldApiListingFilters.Any(filter => filter(member))) - { - type.Members.Remove(member); - } - } - } - return oldApiListing; - } - - private static string GetInterfaceImplementation(MethodInfo method, bool explicitImplementation) - { - var typeInfo = method.DeclaringType.GetTypeInfo(); - foreach (var interfaceImplementation in method.DeclaringType.GetInterfaces()) - { - var map = typeInfo.GetRuntimeInterfaceMap(interfaceImplementation); - if (map.TargetMethods.Any(m => m.Equals(method))) - { - return !explicitImplementation || (method.IsPrivate && method.IsFinal) ? - TypeDescriptor.GetTypeNameFor(interfaceImplementation.GetTypeInfo()) : - null; - } - } - - return null; - } - - private static bool SameSignature(MethodInfo candidate, MethodInfo method) - { - if (candidate.ReturnType != method.ReturnType) - { - return false; - } - - var candidateParameters = candidate.GetParameters(); - var methodParameters = method.GetParameters(); - - if (candidateParameters.Length != methodParameters.Length) - { - return false; - } - - for (var i = 0; i < candidateParameters.Length; i++) - { - var candidateParameter = candidateParameters[i]; - var methodParameter = methodParameters[i]; - if (candidateParameter.ParameterType != methodParameter.ParameterType || - candidateParameter.HasDefaultValue != methodParameter.HasDefaultValue || - candidateParameter.IsIn != methodParameter.IsIn || - candidateParameter.IsOut != methodParameter.IsOut || - candidateParameter.IsOptional != methodParameter.IsOptional) - { - return false; - } - } - - return true; - } - - private static ParameterDescriptor GenerateParameterDescriptor(ParameterInfo parameter) - { - return new ParameterDescriptor - { - Source = parameter, - Name = parameter.Name, - Type = TypeDescriptor.GetTypeNameFor(parameter.ParameterType.GetTypeInfo()), - Direction = parameter.ParameterType.IsByRef && parameter.IsOut ? ParameterDirection.Out : - parameter.ParameterType.IsByRef && !parameter.IsOut ? ParameterDirection.Ref : - ParameterDirection.In, - DefaultValue = parameter.HasDefaultValue ? FormatLiteralValue(parameter) : null, - IsParams = parameter.GetCustomAttribute() != null - }; - } - - private static string FormatLiteralValue(ParameterInfo parameter) - { - return FormatLiteralValue(parameter.RawDefaultValue, parameter.ParameterType); - } - - private static string FormatLiteralValue(object rawDefaultValue, Type elementType) - { - if (rawDefaultValue == null) - { - var elementTypeInfo = elementType.GetTypeInfo(); - return elementTypeInfo.IsValueType ? $"default({TypeDescriptor.GetTypeNameFor(elementTypeInfo)})" : "null"; - } - - if (elementType == typeof(string)) - { - return $"\"{rawDefaultValue}\""; - } - - if (elementType == typeof(char)) - { - return $"'{rawDefaultValue}'"; - } - - if (rawDefaultValue is bool || - rawDefaultValue is byte || - rawDefaultValue is sbyte || - rawDefaultValue is short || - rawDefaultValue is ushort || - rawDefaultValue is int || - rawDefaultValue is uint || - rawDefaultValue is long || - rawDefaultValue is ulong || - rawDefaultValue is double || - rawDefaultValue is float || - rawDefaultValue is decimal) - { - return rawDefaultValue.ToString(); - } - - throw new InvalidOperationException("Unsupported default value type"); - } - } -} diff --git a/src/ApiCheck.Console/BreakingChange.cs b/src/ApiCheck.Console/BreakingChange.cs deleted file mode 100644 index dff0d9fbb..000000000 --- a/src/ApiCheck.Console/BreakingChange.cs +++ /dev/null @@ -1,51 +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 Microsoft.DotNet.PlatformAbstractions; - -namespace ApiCheck -{ - public class BreakingChange - { - public BreakingChange(string typeId, string memberId, ChangeKind kind) - { - TypeId = typeId; - MemberId = memberId; - Kind = kind; - } - - public string TypeId { get; } - public string MemberId { get; } - public ChangeKind Kind { get; } - - public override bool Equals(object obj) - { - if (ReferenceEquals(null, obj)) - { - return false; - } - - if (ReferenceEquals(this, obj)) - { - return true; - } - - return obj.GetType() == GetType() && Equals((BreakingChange)obj); - } - - private bool Equals(BreakingChange other) - { - return string.Equals(TypeId, other.TypeId) && string.Equals(MemberId, other.MemberId) && Kind == other.Kind; - } - - public override int GetHashCode() - { - var hashCodeCombiner = HashCodeCombiner.Start(); - hashCodeCombiner.Add(TypeId); - hashCodeCombiner.Add(MemberId); - hashCodeCombiner.Add(Kind); - - return hashCodeCombiner.CombinedHash; - } - } -} diff --git a/src/ApiCheck.Console/ChangeKind.cs b/src/ApiCheck.Console/ChangeKind.cs deleted file mode 100644 index 9423d0be0..000000000 --- a/src/ApiCheck.Console/ChangeKind.cs +++ /dev/null @@ -1,15 +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 Newtonsoft.Json; -using Newtonsoft.Json.Converters; - -namespace ApiCheck -{ - [JsonConverter(typeof(StringEnumConverter))] - public enum ChangeKind - { - Removal, - Addition, - } -} diff --git a/src/ApiCheck.Console/Loader/AssemblyLoader.cs b/src/ApiCheck.Console/Loader/AssemblyLoader.cs deleted file mode 100644 index 3fb87297e..000000000 --- a/src/ApiCheck.Console/Loader/AssemblyLoader.cs +++ /dev/null @@ -1,34 +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. - -#if NET46 -using System.IO; -#endif -using System.Reflection; -#if NETCOREAPP3_0 -using NuGet.ProjectModel; -using ApiCheck.NuGet; -#endif - -namespace ApiCheck -{ - public abstract class AssemblyLoader - { - public static Assembly LoadAssembly( - string assemblyPath, - string assetsJson, - string framework) - { -#if NETCOREAPP3_0 - var lockFile = new LockFileFormat().Read(assetsJson); - var graph = PackageGraph.Create(lockFile, framework); - var loader = new CoreClrAssemblyLoader(graph, assemblyPath); -#else - var assemblyDirectory = Path.GetDirectoryName(assemblyPath); - var loader = new FullFrameworkAssemblyLoader(assemblyDirectory); -#endif - - return loader.Load(assemblyPath); - } - } -} diff --git a/src/ApiCheck.Console/Loader/AssemblyNameComparer.cs b/src/ApiCheck.Console/Loader/AssemblyNameComparer.cs deleted file mode 100644 index 49b9563c7..000000000 --- a/src/ApiCheck.Console/Loader/AssemblyNameComparer.cs +++ /dev/null @@ -1,33 +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.Reflection; - -namespace ApiCheck -{ - internal class AssemblyNameComparer : IEqualityComparer - { - public static readonly IEqualityComparer OrdinalIgnoreCase = new AssemblyNameComparer(); - - public bool Equals(AssemblyName x, AssemblyName y) - { - // Ignore case because that's what Assembly.Load does. - return string.Equals(x.Name, y.Name, StringComparison.OrdinalIgnoreCase) && - string.Equals(x.CultureName ?? string.Empty, y.CultureName ?? string.Empty, StringComparison.Ordinal); - } - - public int GetHashCode(AssemblyName obj) - { - var hashCode = 0; - if (obj.Name != null) - { - hashCode ^= obj.Name.GetHashCode(); - } - - hashCode ^= (obj.CultureName ?? string.Empty).GetHashCode(); - return hashCode; - } - } -} diff --git a/src/ApiCheck.Console/Loader/CoreClrAssemblyLoader.cs b/src/ApiCheck.Console/Loader/CoreClrAssemblyLoader.cs deleted file mode 100644 index 37fb5a69b..000000000 --- a/src/ApiCheck.Console/Loader/CoreClrAssemblyLoader.cs +++ /dev/null @@ -1,131 +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. - -#if NETCOREAPP3_0 - -using System; -using System.Collections.Generic; -using System.IO; -using System.Reflection; -using System.Runtime.Loader; -using NuGet.Frameworks; -using ApiCheck.NuGet; - -namespace ApiCheck -{ - public class CoreClrAssemblyLoader - { - private readonly IDictionary _assemblyPaths; - private readonly PackageGraph _graph; - private readonly ApiCheckLoadContext _loadContext; - - public CoreClrAssemblyLoader(PackageGraph graph, string assemblyPath) - { - _graph = graph; - _assemblyPaths = new Dictionary(new AssemblyNameComparer()); - var directory = new DirectoryInfo(Path.GetDirectoryName(assemblyPath)); - if (directory.Exists) - { - foreach (var assembly in directory.EnumerateFiles("*.dll")) - { - if (TryGetAssemblyName(assembly.FullName, out var name)) - { - _assemblyPaths.Add(name, assembly.FullName); - } - } - } - - foreach (var path in graph.GetAssembliesFullPath()) - { - if (TryGetAssemblyName(path, out var name) && !_assemblyPaths.ContainsKey(name)) - { - _assemblyPaths.Add(name, path); - } - } - - _loadContext = new ApiCheckLoadContext(FindAssemblyPath); - } - - public Assembly Load(string assemblyPath) - { - return _loadContext.LoadFromAssemblyPath(assemblyPath); - } - - private bool TryGetAssemblyName(string path, out AssemblyName assemblyName) - { - assemblyName = null; - if (!File.Exists(path)) - { - // Path might be bin\placeholder\** if assembly came from a project-to-project reference. Since those - // assemblies are found in the current output directory, just ignore non-existent paths. If this path - // came from somewhere else and assembly is used, loading will fail soon enough. - return false; - } - - // From http://msdn.microsoft.com/en-us/library/ms173100.aspx and AssemblyHelper.IsAssemblyManaged(). - try - { - assemblyName = AssemblyLoadContext.GetAssemblyName(path); - return true; - } - catch (FileNotFoundException) - { - // The file cannot be found (should be redundant). - } - catch (BadImageFormatException) - { - // The file is not an assembly. - } - catch (FileLoadException) - { - // The assembly has already been loaded. - } - - return false; - } - - private string FindAssemblyPath(AssemblyName name) - { - if (_assemblyPaths.TryGetValue(name, out var path)) - { - return path; - } - - return null; - } - - private class ApiCheckLoadContext : AssemblyLoadContext - { - private readonly Func _finder; - - public ApiCheckLoadContext(Func finder) - { - _finder = finder; - } - - protected override Assembly Load(AssemblyName assemblyName) - { - try - { - var assembly = Default.LoadFromAssemblyName(assemblyName); - if (assembly != null) - { - return assembly; - } - } - catch (FileNotFoundException) - { - } - - string path = _finder(assemblyName); - if (path != null) - { - return LoadFromAssemblyPath(path); - } - - return null; - } - } - } -} -#endif diff --git a/src/ApiCheck.Console/Loader/FullFrameworkAssemblyLoader.cs b/src/ApiCheck.Console/Loader/FullFrameworkAssemblyLoader.cs deleted file mode 100644 index 0fafbe7d3..000000000 --- a/src/ApiCheck.Console/Loader/FullFrameworkAssemblyLoader.cs +++ /dev/null @@ -1,43 +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. - -#if !NETCOREAPP3_0 - -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; - -namespace ApiCheck -{ - public class FullFrameworkAssemblyLoader - { - private readonly Dictionary _resolvedDlls; - - public FullFrameworkAssemblyLoader(string probingPath) - { - var directory = new DirectoryInfo(probingPath); - _resolvedDlls = directory.EnumerateFiles("*.dll") - .ToDictionary(f => GetAssemblyName(f.FullName), f => f.FullName, new AssemblyNameComparer()); - - AppDomain.CurrentDomain.AssemblyResolve += Resolver; - } - - private AssemblyName GetAssemblyName(string assemblyPath) => AssemblyName.GetAssemblyName(assemblyPath); - - private Assembly Resolver(object sender, ResolveEventArgs args) - { - var name = new AssemblyName(args.Name); - var path = FindAssemblyPath(name); - - return path != null ? Assembly.LoadFile(path) : null; - } - - private string FindAssemblyPath(AssemblyName name) => _resolvedDlls.TryGetValue(name, out var path) ? path : null; - - public Assembly Load(string assemblyPath) => Assembly.LoadFile(assemblyPath); - } -} - -#endif diff --git a/src/ApiCheck.Console/Microsoft.AspNetCore.BuildTools.ApiCheck.nuspec b/src/ApiCheck.Console/Microsoft.AspNetCore.BuildTools.ApiCheck.nuspec deleted file mode 100644 index e141d31ec..000000000 --- a/src/ApiCheck.Console/Microsoft.AspNetCore.BuildTools.ApiCheck.nuspec +++ /dev/null @@ -1,18 +0,0 @@ - - - - $id$ - $version$ - Microsoft - Generates API baselines and detects breaking changes in APIs. - - - - - - - - - - - diff --git a/src/ApiCheck.Console/NuGet/Package.cs b/src/ApiCheck.Console/NuGet/Package.cs deleted file mode 100644 index fa4501f78..000000000 --- a/src/ApiCheck.Console/NuGet/Package.cs +++ /dev/null @@ -1,61 +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 NuGet.LibraryModel; -using NuGet.Versioning; - -namespace ApiCheck.NuGet -{ - public class Package : IEquatable - { - public Package( - string name, - string version, - string path, - string signaturePath, - IEnumerable dependencies, - IEnumerable runtimeAssemblies) - { - Name = name; - Version = version; - Path = path; - PackageHash = signaturePath; - Dependencies = dependencies; - Assemblies = runtimeAssemblies.Select(ra => new PackageAssembly(ra, GetAssemblyPath(ra))); - } - - public Package(Package package) - { - Name = package.Name; - Version = package.Version; - Path = package.Path; - PackageHash = package.PackageHash; - Dependencies = package.Dependencies; - Assemblies = package.Assemblies; - } - - public LibraryIdentity Identity => new LibraryIdentity(Name, NuGetVersion.Parse(Version), LibraryType.Package); - public string Name { get; set; } - public string Version { get; set; } - public IEnumerable Dependencies { get; set; } - public string Path { get; set; } - public string PackageHash { get; set; } - public IEnumerable Assemblies { get; set; } - - public bool Equals(Package other) => - Name.Equals(other?.Name, StringComparison.OrdinalIgnoreCase) && - Version.Equals(other?.Version, StringComparison.OrdinalIgnoreCase); - - public override bool Equals(object obj) => Equals(obj as Package); - - public override int GetHashCode() => Name.GetHashCode() ^ Version.GetHashCode(); - - public override string ToString() => $"{Name} {Version}"; - - public string GetAssemblyPath(string relativeAssemblyPath) => - System.IO.Path.Combine(Path, relativeAssemblyPath); - } -} diff --git a/src/ApiCheck.Console/NuGet/PackageAssembly.cs b/src/ApiCheck.Console/NuGet/PackageAssembly.cs deleted file mode 100644 index 317a3bdd9..000000000 --- a/src/ApiCheck.Console/NuGet/PackageAssembly.cs +++ /dev/null @@ -1,20 +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; - -namespace ApiCheck.NuGet -{ - public class PackageAssembly - { - public PackageAssembly(string relativePath, string resolvedPath) - { - RelativePath = relativePath; - ResolvedPath = resolvedPath; - } - - public string FileName => Path.GetFileName(ResolvedPath); - public string RelativePath { get; set; } - public string ResolvedPath { get; set; } - } -} diff --git a/src/ApiCheck.Console/NuGet/PackageGraph.cs b/src/ApiCheck.Console/NuGet/PackageGraph.cs deleted file mode 100644 index a06bf71e0..000000000 --- a/src/ApiCheck.Console/NuGet/PackageGraph.cs +++ /dev/null @@ -1,322 +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.IO; -using System.Linq; -using NuGet.Frameworks; -using NuGet.Packaging.Core; -using NuGet.ProjectModel; - -namespace ApiCheck.NuGet -{ - public class PackageGraph - { - private PackageGraph( - IEnumerable packageFolders, - IDictionary allPackages, - IEnumerable packages, - string targetFrameworkName) - { - PackageSources = packageFolders; - AllPackages = allPackages; - Dependencies = packages; - Framework = targetFrameworkName; - } - - public PackageGraph GetClosure(string packageId) - { - if (!AllPackages.TryGetValue(packageId, out var package)) - { - return null; - } - - var allPackages = new Dictionary(); - CollectPackages(package, allPackages); - return new PackageGraph(PackageSources, allPackages, new[] { package }, Framework); - } - - private void CollectPackages(Package package, IDictionary allPackages) - { - var remainingPackages = new Stack(); - remainingPackages.Push(package); - while (remainingPackages.Count > 0) - { - var current = remainingPackages.Pop(); - if (!allPackages.ContainsKey(current.Name)) - { - allPackages.Add(current.Name, current); - foreach (var dependency in current.Dependencies) - { - if (!allPackages.ContainsKey(dependency.Name)) - { - remainingPackages.Push(dependency); - } - } - } - } - } - - public PackageGraph WithoutPackage(string packageId) - { - var packages = new Dictionary(AllPackages, StringComparer.OrdinalIgnoreCase); - var package = packages.FirstOrDefault(p => p.Key.Equals(packageId, StringComparison.OrdinalIgnoreCase)); - if (package.Value != null) - { - var packagesToExclude = GetPackagesToExclude(package); - foreach (var exclusion in packagesToExclude) - { - packages.Remove(exclusion.Key); - } - - var newDependencies = Dependencies.ToList(); - foreach (var dependency in Dependencies) - { - if (packagesToExclude.ContainsKey(dependency.Name)) - { - newDependencies.Remove(dependency); - } - } - - foreach (var dependency in newDependencies.ToArray()) - { - var newDependency = RemovePackagesFromTransitiveDependencies(dependency, packagesToExclude); - if (!Equals(newDependency, dependency)) - { - newDependencies.Remove(dependency); - newDependencies.Add(newDependency); - } - } - - return new PackageGraph(PackageSources, packages, newDependencies, Framework); - } - - return this; - } - - private Package RemovePackagesFromTransitiveDependencies( - Package dependency, - Dictionary packagesToExclude) - { - var dependenciesModified = false; - var newDependencies = new List(); - foreach (var package in dependency.Dependencies) - { - if (!packagesToExclude.ContainsKey(package.Name)) - { - var newDependency = RemovePackagesFromTransitiveDependencies(package, packagesToExclude); - if (!Equals(newDependency, package) || dependenciesModified) - { - dependenciesModified = true; - } - newDependencies.Add(newDependency); - } - else - { - dependenciesModified = true; - } - } - - if (dependenciesModified) - { - var newPackage = new Package(dependency) - { - Dependencies = newDependencies - }; - return newPackage; - } - return dependency; - } - - private static Dictionary GetPackagesToExclude(KeyValuePair package) - { - var packagesToExclude = new Dictionary(StringComparer.OrdinalIgnoreCase); - var pendingDependencies = new Stack(); - pendingDependencies.Push(package.Value); - while (pendingDependencies.Count > 0) - { - var current = pendingDependencies.Pop(); - if (!packagesToExclude.ContainsKey(current.Name)) - { - packagesToExclude.Add(current.Name, current); - foreach (var dependency in current.Dependencies) - { - pendingDependencies.Push(dependency); - } - } - } - - return packagesToExclude; - } - - public IEnumerable Dependencies { get; set; } - - public IDictionary AllPackages { get; set; } - - public IEnumerable PackageSources { get; set; } - - public string Framework { get; set; } - - public static PackageGraph Create(LockFile lockFile, string targetFrameworkName) - { - var runtimeIdentifier = RuntimeGraph.GetCurrentRuntimeId(); - var fallbacks = RuntimeGraph.GetCompatibleRuntimes(runtimeIdentifier); - - var parsedFramework = NuGetFramework.Parse(targetFrameworkName); - var dependencyGroup = FindCompatibleDependencyGroup(lockFile, parsedFramework); - if (dependencyGroup == null) - { - return null; - } - - var chosenFramework = NuGetFramework.Parse(dependencyGroup.FrameworkName); - var potentialFrameworks = lockFile.Targets - .Where(t => t.TargetFramework.Equals(chosenFramework)); - var targetFramework = potentialFrameworks - .FirstOrDefault(t => runtimeIdentifier.Equals(t.RuntimeIdentifier, StringComparison.OrdinalIgnoreCase)); - - targetFramework = targetFramework ?? potentialFrameworks - .FirstOrDefault(t => RuntimeIsCompatible(t.RuntimeIdentifier, fallbacks)); - - targetFramework = targetFramework ?? potentialFrameworks - .FirstOrDefault(t => t.RuntimeIdentifier == null); - - var directDependencies = targetFramework - .Libraries - .Where(l => dependencyGroup.Dependencies.Any(d => d.StartsWith(l.Name, StringComparison.OrdinalIgnoreCase))) - .ToArray(); - - var allPackages = new Dictionary(StringComparer.OrdinalIgnoreCase); - - var sources = lockFile.PackageFolders.Select(p => p.Path).ToArray(); - - var packages = directDependencies - .Select(dd => CreatePackage(dd, targetFramework, lockFile.Libraries, allPackages, sources, fallbacks)) - .ToArray(); - - return new PackageGraph(sources, allPackages, packages, chosenFramework.GetShortFolderName()); - } - - private static ProjectFileDependencyGroup FindCompatibleDependencyGroup(LockFile lockFile, NuGetFramework parsedFramework) - { - return lockFile.ProjectFileDependencyGroups.FirstOrDefault(g => NuGetFramework.Parse(g.FrameworkName).Equals(parsedFramework)) ?? - lockFile.ProjectFileDependencyGroups.FirstOrDefault(g => IsCompatible(parsedFramework, NuGetFramework.Parse(g.FrameworkName))); - } - - private static bool IsCompatible(NuGetFramework reference, NuGetFramework target) - { - return DefaultCompatibilityProvider.Instance.IsCompatible(reference, target); - } - - private static bool RuntimeIsCompatible(string runtime, IEnumerable compatibleRuntimes) - { - // Technically, a null runtime is compatible. But, Create() gives preference to targets with an exact - // match and then a compatible match (this method) over targets with a null Runtime. - return compatibleRuntimes.Any(r => r.Equals(runtime, StringComparison.OrdinalIgnoreCase)); - } - - public IEnumerable GetAssembliesFullPath() => - AllPackages.SelectMany(p => p.Value.Assemblies.Select(a => a.ResolvedPath)); - - private static Package CreatePackage( - LockFileTargetLibrary dependency, - LockFileTarget targetFramework, - IList libraries, - IDictionary packageDictionary, - IEnumerable sources, - IEnumerable compatibleRuntimes) - { - var library = libraries - .First(l => string.Equals(l.Name, dependency.Name, StringComparison.OrdinalIgnoreCase) && - l.Version.Equals(dependency.Version)); - if (packageDictionary.TryGetValue(library.Name, out var package)) - { - return package; - } - - var packagePath = ResolvePackagePath(library.Name, library.Version.ToString(), sources); - var signaturePath = library.Files - .SingleOrDefault(f => f.EndsWith(".sha512", StringComparison.OrdinalIgnoreCase)); - - var dependencies = new List(); - if (dependency.Dependencies?.Count > 0) - { - foreach (var d in dependency.Dependencies) - { - if (!packageDictionary.TryGetValue(d.Id, out var dependentPackage)) - { - dependentPackage = CreatePackage( - FindLibrary(targetFramework, d), - targetFramework, - libraries, - packageDictionary, - sources, - compatibleRuntimes); - } - - dependencies.Add(dependentPackage); - } - } - - var assemblies = dependency - .RuntimeAssemblies - .Where(assembly => !assembly.Path.EndsWith("_._", StringComparison.Ordinal)) - .ToArray(); - if (assemblies.Length == 0) - { - var targetAssemblyPaths = dependency - .RuntimeTargets - .Where(target => RuntimeIsCompatible(target.Runtime, compatibleRuntimes) && - !target.Path.EndsWith("_._", StringComparison.Ordinal)); - assemblies = targetAssemblyPaths.ToArray(); - } - - var assemblyPaths = assemblies.Select(assembly => assembly.Path); - package = new Package( - library.Name, - library.Version.ToString(), - packagePath, - signaturePath, - dependencies, - assemblyPaths); - - packageDictionary.Add(package.Name, package); - - return package; - } - - private static string ResolvePath(string path, string libraryName, string version, IEnumerable sources) - { - foreach (var source in sources) - { - var fullPath = Path.Combine(source, libraryName, version, path); - if (File.Exists(fullPath)) - { - return fullPath; - } - } - - return path; - } - - private static string ResolvePackagePath(string libraryName, string version, IEnumerable sources) - { - foreach (var source in sources) - { - var fullPath = Path.Combine(source, libraryName, version); - if (Directory.Exists(fullPath)) - { - return fullPath; - } - } - - return string.Empty; - } - - private static LockFileTargetLibrary FindLibrary(LockFileTarget targetFramework, PackageDependency d) - { - return targetFramework.Libraries.First(l => d.Id.Equals(l.Name)); - } - } -} diff --git a/src/ApiCheck.Console/NuGet/RuntimeDefinition.cs b/src/ApiCheck.Console/NuGet/RuntimeDefinition.cs deleted file mode 100644 index 19882c634..000000000 --- a/src/ApiCheck.Console/NuGet/RuntimeDefinition.cs +++ /dev/null @@ -1,18 +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.Collections.Generic; - -namespace ApiCheck.NuGet -{ - public class RuntimeDefinition - { - public string Name { get; set; } - public IEnumerable Fallbacks { get; set; } - - public override string ToString() - { - return Name; - } - } -} diff --git a/src/ApiCheck.Console/NuGet/RuntimeGraph.Compatibility.cs b/src/ApiCheck.Console/NuGet/RuntimeGraph.Compatibility.cs deleted file mode 100644 index ae61c8822..000000000 --- a/src/ApiCheck.Console/NuGet/RuntimeGraph.Compatibility.cs +++ /dev/null @@ -1,814 +0,0 @@ -namespace ApiCheck.NuGet -{ - public partial class RuntimeGraph - { - private const string RuntimeCompatibility = @" -{ - ""runtimes"": { - ""base"": { - }, - ""any"": { - ""#import"": [ ""base"" ] - }, - ""win"": { - ""#import"": [ ""any"" ] - }, - ""win-x86"": { - ""#import"": [ ""win"" ] - }, - ""win-x64"": { - ""#import"": [ ""win"" ] - }, - ""win7"": { - ""#import"": [ ""win"" ] - }, - ""win7-x86"": { - ""#import"": [ ""win7"", ""win-x86"" ] - }, - ""win7-x64"": { - ""#import"": [ ""win7"", ""win-x64"" ] - }, - ""win8"": { - ""#import"": [ ""win7"" ] - }, - ""win8-x86"": { - ""#import"": [ ""win8"", ""win7-x86"" ] - }, - ""win8-x64"": { - ""#import"": [ ""win8"", ""win7-x64"" ] - }, - ""win8-arm"": { - ""#import"": [ ""win8"" ] - }, - ""win81"": { - ""#import"": [ ""win8"" ] - }, - ""win81-x86"": { - ""#import"": [ ""win81"", ""win8-x86"" ] - }, - ""win81-x64"": { - ""#import"": [ ""win81"", ""win8-x64"" ] - }, - ""win81-arm"": { - ""#import"": [ ""win81"", ""win8-arm"" ] - }, - ""win10"": { - ""#import"": [ ""win81"" ] - }, - ""win10-x86"": { - ""#import"": [ ""win10"", ""win81-x86"" ] - }, - ""win10-x64"": { - ""#import"": [ ""win10"", ""win81-x64"" ] - }, - ""win10-arm"": { - ""#import"": [ ""win10"", ""win81-arm"" ] - }, - ""win10-arm64"": { - ""#import"": [ ""win10"" ] - }, - ""aot"": { - ""#import"": [ ""any"" ] - }, - ""win-aot"": { - ""#import"": [ ""win"", ""aot"" ] - }, - ""win-x86-aot"": { - ""#import"": [ ""win-aot"", ""win-x86"" ] - }, - ""win-x64-aot"": { - ""#import"": [ ""win-aot"", ""win-x64"" ] - }, - ""win7-aot"": { - ""#import"": [ ""win-aot"", ""win7"" ] - }, - ""win7-x86-aot"": { - ""#import"": [ ""win7-aot"", ""win7-x86"" ] - }, - ""win7-x64-aot"": { - ""#import"": [ ""win7-aot"", ""win7-x64"" ] - }, - ""win8-aot"": { - ""#import"": [ ""win8"", ""win7-aot"" ] - }, - ""win8-x86-aot"": { - ""#import"": [ ""win8-aot"", ""win8-x86"", ""win7-x86-aot"" ] - }, - ""win8-x64-aot"": { - ""#import"": [ ""win8-aot"", ""win8-x64"", ""win7-x64-aot"" ] - }, - ""win8-arm-aot"": { - ""#import"": [ ""win8-aot"", ""win8-arm"" ] - }, - ""win81-aot"": { - ""#import"": [ ""win81"", ""win8-aot"" ] - }, - ""win81-x86-aot"": { - ""#import"": [ ""win81-aot"", ""win81-x86"", ""win8-x86-aot"" ] - }, - ""win81-x64-aot"": { - ""#import"": [ ""win81-aot"", ""win81-x64"", ""win8-x64-aot"" ] - }, - ""win81-arm-aot"": { - ""#import"": [ ""win81-aot"", ""win81-arm"", ""win8-arm-aot"" ] - }, - ""win10-aot"": { - ""#import"": [ ""win10"", ""win81-aot"" ] - }, - ""win10-x86-aot"": { - ""#import"": [ ""win10-aot"", ""win10-x86"", ""win81-x86-aot"" ] - }, - ""win10-x64-aot"": { - ""#import"": [ ""win10-aot"", ""win10-x64"", ""win81-x64-aot"" ] - }, - ""win10-arm-aot"": { - ""#import"": [ ""win10-aot"", ""win10-arm"", ""win81-arm-aot"" ] - }, - ""win10-arm64-aot"": { - ""#import"": [ ""win10-aot"", ""win10-arm64"" ] - }, - ""unix"": { - ""#import"": [ ""any"" ] - }, - ""unix-x64"": { - ""#import"": [ ""unix"" ] - }, - ""unix-x86"": { - ""#import"": [ ""unix"" ] - }, - ""unix-arm"": { - ""#import"": [ ""unix"" ] - }, - ""unix-armel"": { - ""#import"": [ ""unix"" ] - }, - ""unix-arm64"": { - ""#import"": [ ""unix"" ] - }, - ""osx"": { - ""#import"": [ ""unix"" ] - }, - ""osx-x64"": { - ""#import"": [ ""osx"", ""unix-x64"" ] - }, - ""osx.10.10"": { - ""#import"": [ ""osx"" ] - }, - ""osx.10.10-x64"": { - ""#import"": [ ""osx.10.10"", ""osx-x64"" ] - }, - ""osx.10.11"": { - ""#import"": [ ""osx.10.10"" ] - }, - ""osx.10.11-x64"": { - ""#import"": [ ""osx.10.11"", ""osx.10.10-x64"" ] - }, - ""osx.10.12"": { - ""#import"": [ ""osx.10.11"" ] - }, - ""osx.10.12-x64"": { - ""#import"": [ ""osx.10.12"", ""osx.10.11-x64"" ] - }, - ""linux"": { - ""#import"": [ ""unix"" ] - }, - ""linux-x64"": { - ""#import"": [ ""linux"", ""unix-x64"" ] - }, - ""linux-x86"": { - ""#import"": [ ""linux"", ""unix-x86"" ] - }, - ""linux-arm"": { - ""#import"": [ ""linux"", ""unix-arm"" ] - }, - ""linux-armel"": { - ""#import"": [ ""linux"", ""unix-armel"" ] - }, - ""linux-arm64"": { - ""#import"": [ ""linux"", ""unix-arm64"" ] - }, - ""rhel"": { - ""#import"": [ ""linux"" ] - }, - ""rhel-x64"": { - ""#import"": [ ""rhel"", ""linux-x64"" ] - }, - ""rhel.7"": { - ""#import"": [ ""rhel"" ] - }, - ""rhel.7-x64"": { - ""#import"": [ ""rhel.7"", ""rhel-x64"" ] - }, - ""rhel.7.0"": { - ""#import"": [ ""rhel.7"" ] - }, - ""rhel.7.0-x64"": { - ""#import"": [ ""rhel.7.0"", ""rhel.7-x64"" ] - }, - ""rhel.7.1"": { - ""#import"": [ ""rhel.7.0"" ] - }, - ""rhel.7.1-x64"": { - ""#import"": [ ""rhel.7.1"", ""rhel.7.0-x64"" ] - }, - ""rhel.7.2"": { - ""#import"": [ ""rhel.7.1"" ] - }, - ""rhel.7.2-x64"": { - ""#import"": [ ""rhel.7.2"", ""rhel.7.1-x64"" ] - }, - ""rhel.7.3"": { - ""#import"": [ ""rhel.7.2"" ] - }, - ""rhel.7.3-x64"": { - ""#import"": [ ""rhel.7.3"", ""rhel.7.2-x64"" ] - }, - ""rhel.7.4"": { - ""#import"": [ ""rhel.7.3"" ] - }, - ""rhel.7.4-x64"": { - ""#import"": [ ""rhel.7.4"", ""rhel.7.3-x64"" ] - }, - ""ol"": { - ""#import"": [ ""rhel"" ] - }, - ""ol-x64"": { - ""#import"": [ ""ol"", ""rhel-x64"" ] - }, - ""ol.7"": { - ""#import"": [ ""ol"", ""rhel.7"" ] - }, - ""ol.7-x64"": { - ""#import"": [ ""ol.7"", ""ol-x64"", ""rhel.7-x64"" ] - }, - ""ol.7.0"": { - ""#import"": [ ""ol.7"", ""rhel.7.0"" ] - }, - ""ol.7.0-x64"": { - ""#import"": [ ""ol.7.0"", ""ol.7-x64"", ""rhel.7.0-x64"" ] - }, - ""ol.7.1"": { - ""#import"": [ ""ol.7.0"", ""rhel.7.1"" ] - }, - ""ol.7.1-x64"": { - ""#import"": [ ""ol.7.1"", ""ol.7.0-x64"", ""rhel.7.1-x64"" ] - }, - ""ol.7.2"": { - ""#import"": [ ""ol.7.1"", ""rhel.7.2"" ] - }, - ""ol.7.2-x64"": { - ""#import"": [ ""ol.7.2"", ""ol.7.1-x64"", ""rhel.7.2-x64"" ] - }, - ""centos"": { - ""#import"": [ ""rhel"" ] - }, - ""centos-x64"": { - ""#import"": [ ""centos"", ""rhel-x64"" ] - }, - ""centos.7"": { - ""#import"": [ ""centos"", ""rhel.7"" ] - }, - ""centos.7-x64"": { - ""#import"": [ ""centos.7"", ""centos-x64"", ""rhel.7-x64"" ] - }, - ""debian"": { - ""#import"": [ ""linux"" ] - }, - ""debian-x64"": { - ""#import"": [ ""debian"", ""linux-x64"" ] - }, - ""debian-x86"": { - ""#import"": [ ""debian"", ""linux-x86"" ] - }, - ""debian-arm"": { - ""#import"": [ ""debian"", ""linux-arm"" ] - }, - ""debian-armel"": { - ""#import"": [ ""debian"", ""linux-armel"" ] - }, - ""debian-arm64"": { - ""#import"": [ ""debian"", ""linux-arm64"" ] - }, - ""debian.8"": { - ""#import"": [ ""debian"" ] - }, - ""debian.8-x64"": { - ""#import"": [ ""debian.8"", ""debian-x64"" ] - }, - ""debian.8-x86"": { - ""#import"": [ ""debian.8"", ""debian-x86"" ] - }, - ""debian.8-arm"": { - ""#import"": [ ""debian.8"", ""debian-arm"" ] - }, - ""debian.8-armel"": { - ""#import"": [ ""debian.8"", ""debian-armel"" ] - }, - ""debian.8-arm64"": { - ""#import"": [ ""debian.8"", ""debian-arm64"" ] - }, - ""tizen"": { - ""#import"": [ ""linux"" ] - }, - ""tizen-armel"": { - ""#import"": [ ""tizen"", ""linux-armel"" ] - }, - ""tizen.4.0.0-armel"": { - ""#import"": [ ""tizen.4.0.0"", ""tizen-armel"" ] - }, - ""ubuntu"": { - ""#import"": [ ""debian"" ] - }, - ""ubuntu-x64"": { - ""#import"": [ ""ubuntu"", ""debian-x64"" ] - }, - ""ubuntu-x86"": { - ""#import"": [ ""ubuntu"", ""debian-x86"" ] - }, - ""ubuntu-arm"": { - ""#import"": [ ""ubuntu"", ""debian-arm"" ] - }, - ""ubuntu.14.04"": { - ""#import"": [ ""ubuntu"" ] - }, - ""ubuntu.14.04-x64"": { - ""#import"": [ ""ubuntu.14.04"", ""ubuntu-x64"" ] - }, - ""ubuntu.14.04-x86"": { - ""#import"": [ ""ubuntu.14.04"", ""ubuntu-x86"" ] - }, - ""ubuntu.14.04-arm"": { - ""#import"": [ ""ubuntu.14.04"", ""ubuntu-arm"" ] - }, - ""ubuntu.14.10"": { - ""#import"": [ ""ubuntu"" ] - }, - ""ubuntu.14.10-x64"": { - ""#import"": [ ""ubuntu.14.10"", ""ubuntu-x64"" ] - }, - ""ubuntu.14.10-x86"": { - ""#import"": [ ""ubuntu.14.10"", ""ubuntu-x86"" ] - }, - ""ubuntu.14.10-arm"": { - ""#import"": [ ""ubuntu.14.10"", ""ubuntu-arm"" ] - }, - ""ubuntu.15.04"": { - ""#import"": [ ""ubuntu"" ] - }, - ""ubuntu.15.04-x64"": { - ""#import"": [ ""ubuntu.15.04"", ""ubuntu-x64"" ] - }, - ""ubuntu.15.04-x86"": { - ""#import"": [ ""ubuntu.15.04"", ""ubuntu-x86"" ] - }, - ""ubuntu.15.04-arm"": { - ""#import"": [ ""ubuntu.15.04"", ""ubuntu-arm"" ] - }, - ""ubuntu.15.10"": { - ""#import"": [ ""ubuntu"" ] - }, - ""ubuntu.15.10-x64"": { - ""#import"": [ ""ubuntu.15.10"", ""ubuntu-x64"" ] - }, - ""ubuntu.15.10-x86"": { - ""#import"": [ ""ubuntu.15.10"", ""ubuntu-x86"" ] - }, - ""ubuntu.15.10-arm"": { - ""#import"": [ ""ubuntu.15.10"", ""ubuntu-arm"" ] - }, - ""ubuntu.16.04"": { - ""#import"": [ ""ubuntu"" ] - }, - ""ubuntu.16.04-x64"": { - ""#import"": [ ""ubuntu.16.04"", ""ubuntu-x64"" ] - }, - ""ubuntu.16.04-x86"": { - ""#import"": [ ""ubuntu.16.04"", ""ubuntu-x86"" ] - }, - ""ubuntu.16.04-arm"": { - ""#import"": [ ""ubuntu.16.04"", ""ubuntu-arm"" ] - }, - ""ubuntu.16.10"": { - ""#import"": [ ""ubuntu"" ] - }, - ""ubuntu.16.10-x64"": { - ""#import"": [ ""ubuntu.16.10"", ""ubuntu-x64"" ] - }, - ""ubuntu.16.10-x86"": { - ""#import"": [ ""ubuntu.16.10"", ""ubuntu-x86"" ] - }, - ""ubuntu.16.10-arm"": { - ""#import"": [ ""ubuntu.16.10"", ""ubuntu-arm"" ] - }, - ""linuxmint.17"": { - ""#import"": [ ""ubuntu.14.04"" ] - }, - ""linuxmint.17-x64"": { - ""#import"": [ ""linuxmint.17"", ""ubuntu.14.04-x64"" ] - }, - ""linuxmint.17.1"": { - ""#import"": [ ""linuxmint.17"" ] - }, - ""linuxmint.17.1-x64"": { - ""#import"": [ ""linuxmint.17.1"", ""linuxmint.17-x64"" ] - }, - ""linuxmint.17.2"": { - ""#import"": [ ""linuxmint.17.1"" ] - }, - ""linuxmint.17.2-x64"": { - ""#import"": [ ""linuxmint.17.2"", ""linuxmint.17.1-x64"" ] - }, - ""linuxmint.17.3"": { - ""#import"": [ ""linuxmint.17.2"" ] - }, - ""linuxmint.17.3-x64"": { - ""#import"": [ ""linuxmint.17.3"", ""linuxmint.17.2-x64"" ] - }, - ""linuxmint.18"": { - ""#import"": [ ""ubuntu.16.04"" ] - }, - ""linuxmint.18-x64"": { - ""#import"": [ ""linuxmint.18"", ""ubuntu.16.04-x64"" ] - }, - ""fedora"": { - ""#import"": [ ""linux"" ] - }, - ""fedora-x64"": { - ""#import"": [ ""fedora"", ""linux-x64"" ] - }, - ""fedora.23"": { - ""#import"": [ ""fedora"" ] - }, - ""fedora.23-x64"": { - ""#import"": [ ""fedora.23"", ""fedora-x64"" ] - }, - ""fedora.24"": { - ""#import"": [ ""fedora"" ] - }, - ""fedora.24-x64"": { - ""#import"": [ ""fedora.24"", ""fedora-x64"" ] - }, - ""opensuse"": { - ""#import"": [ ""linux"" ] - }, - ""opensuse-x64"": { - ""#import"": [ ""opensuse"", ""linux-x64"" ] - }, - ""opensuse.13.2"": { - ""#import"": [ ""opensuse"" ] - }, - ""opensuse.13.2-x64"": { - ""#import"": [ ""opensuse.13.2"", ""opensuse-x64"" ] - }, - ""opensuse.42.1"": { - ""#import"": [ ""opensuse"" ] - }, - ""opensuse.42.1-x64"": { - ""#import"": [ ""opensuse.42.1"", ""opensuse-x64"" ] - }, - ""alpine"": { - ""#import"": [ ""linux"" ] - }, - ""alpine-x64"": { - ""#import"": [ ""alpine"", ""linux-x64"" ] - }, - ""alpine.3"": { - ""#import"": [ ""alpine"" ] - }, - ""alpine.3-x64"": { - ""#import"": [ ""alpine.3"", ""alpine-x64"" ] - }, - ""alpine.3.4.3"": { - ""#import"": [ ""alpine.3"" ] - }, - ""alpine.3.4.3-x64"": { - ""#import"": [ ""alpine.3.4.3"", ""alpine.3-x64"" ] - }, - ""corert"": { - ""#import"": [ ""any"" ] - }, - ""win-corert"": { - ""#import"": [ ""corert"", ""win"" ] - }, - ""win-x86-corert"": { - ""#import"": [ ""win-corert"", ""win-x86"" ] - }, - ""win-x64-corert"": { - ""#import"": [ ""win-corert"", ""win-x64"" ] - }, - ""win7-corert"": { - ""#import"": [ ""win-corert"", ""win7"" ] - }, - ""win7-x86-corert"": { - ""#import"": [ ""win7-corert"", ""win7-x86"" ] - }, - ""win7-x64-corert"": { - ""#import"": [ ""win7-corert"", ""win7-x64"" ] - }, - ""win8-corert"": { - ""#import"": [ ""win7-corert"", ""win8"" ] - }, - ""win8-x86-corert"": { - ""#import"": [ ""win8-corert"", ""win7-x86-corert"", ""win8-x86"" ] - }, - ""win8-x64-corert"": { - ""#import"": [ ""win8-corert"", ""win7-x64-corert"", ""win8-x64"" ] - }, - ""win8-arm-corert"": { - ""#import"": [ ""win8-corert"", ""win8-arm"" ] - }, - ""win81-corert"": { - ""#import"": [ ""win8-corert"", ""win81"" ] - }, - ""win81-x86-corert"": { - ""#import"": [ ""win81-corert"", ""win8-x86-corert"", ""win81-x86"" ] - }, - ""win81-x64-corert"": { - ""#import"": [ ""win81-corert"", ""win8-x64-corert"", ""win81-x64"" ] - }, - ""win81-arm-corert"": { - ""#import"": [ ""win81-corert"", ""win8-arm-corert"", ""win81-arm"" ] - }, - ""win10-corert"": { - ""#import"": [ ""win81-corert"", ""win10"" ] - }, - ""win10-x86-corert"": { - ""#import"": [ ""win10-corert"", ""win81-x86-corert"", ""win10-x86"" ] - }, - ""win10-x64-corert"": { - ""#import"": [ ""win10-corert"", ""win81-x64-corert"", ""win10-x64"" ] - }, - ""win10-arm-corert"": { - ""#import"": [ ""win10-corert"", ""win81-arm-corert"", ""win10-arm"" ] - }, - ""win10-arm64-corert"": { - ""#import"": [ ""win10-corert"", ""win10-arm64"" ] - }, - ""unix-corert"": { - ""#import"": [ ""corert"", ""unix"" ] - }, - ""unix-x64-corert"": { - ""#import"": [ ""unix-corert"", ""unix-x64"" ] - }, - ""unix-arm-corert"": { - ""#import"": [ ""unix-corert"", ""unix-arm"" ] - }, - ""unix-arm64-corert"": { - ""#import"": [ ""unix-corert"", ""unix-arm64"" ] - }, - ""osx-corert"": { - ""#import"": [ ""unix-corert"", ""osx"" ] - }, - ""osx-x64-corert"": { - ""#import"": [ ""osx-corert"", ""unix-x64-corert"", ""osx-x64"" ] - }, - ""osx.10.10-corert"": { - ""#import"": [ ""osx-corert"", ""osx.10.10"" ] - }, - ""osx.10.10-x64-corert"": { - ""#import"": [ ""osx.10.10-corert"", ""osx-x64-corert"", ""osx.10.10-x64"" ] - }, - ""osx.10.11-corert"": { - ""#import"": [ ""osx.10.10-corert"", ""osx.10.11"" ] - }, - ""osx.10.11-x64-corert"": { - ""#import"": [ ""osx.10.11-corert"", ""osx.10.10-x64-corert"", ""osx.10.11-x64"" ] - }, - ""osx.10.12-corert"": { - ""#import"": [ ""osx.10.11-corert"", ""osx.10.12"" ] - }, - ""osx.10.12-x64-corert"": { - ""#import"": [ ""osx.10.12-corert"", ""osx.10.11-x64-corert"", ""osx.10.12-x64"" ] - }, - ""linux-corert"": { - ""#import"": [ ""corert"", ""linux"", ""unix-corert"" ] - }, - ""linux-x64-corert"": { - ""#import"": [ ""linux-corert"", ""linux-x64"" ] - }, - ""linux-arm-corert"": { - ""#import"": [ ""linux-corert"", ""linux-arm"" ] - }, - ""linux-arm64-corert"": { - ""#import"": [ ""linux-corert"", ""linux-arm64"" ] - }, - ""rhel-corert"": { - ""#import"": [ ""corert"", ""rhel"" ] - }, - ""rhel-x64-corert"": { - ""#import"": [ ""rhel-corert"", ""linux-x64-corert"", ""rhel-x64"" ] - }, - ""rhel.7-corert"": { - ""#import"": [ ""rhel-corert"", ""rhel.7"" ] - }, - ""rhel.7-x64-corert"": { - ""#import"": [ ""rhel.7-corert"", ""rhel-x64-corert"", ""rhel.7-x64"" ] - }, - ""rhel.7.0-corert"": { - ""#import"": [ ""rhel.7-corert"", ""rhel.7.0"" ] - }, - ""rhel.7.0-x64-corert"": { - ""#import"": [ ""rhel.7.0-corert"", ""rhel.7-x64-corert"", ""rhel.7.0-x64"" ] - }, - ""rhel.7.1-corert"": { - ""#import"": [ ""rhel.7.0-corert"", ""rhel.7.1"" ] - }, - ""rhel.7.1-x64-corert"": { - ""#import"": [ ""rhel.7.1-corert"", ""rhel.7.0-x64-corert"", ""rhel.7.1-x64"" ] - }, - ""rhel.7.2-corert"": { - ""#import"": [ ""rhel.7.1-corert"", ""rhel.7.2"" ] - }, - ""rhel.7.2-x64-corert"": { - ""#import"": [ ""rhel.7.2-corert"", ""rhel.7.1-x64-corert"", ""rhel.7.2-x64"" ] - }, - ""ol-corert"": { - ""#import"": [ ""rhel-corert"", ""ol"" ] - }, - ""ol-x64-corert"": { - ""#import"": [ ""ol-corert"", ""rhel-x64-corert"", ""ol-x64"" ] - }, - ""ol.7-corert"": { - ""#import"": [ ""ol-corert"", ""ol.7"" ] - }, - ""ol.7-x64-corert"": { - ""#import"": [ ""ol.7-corert"", ""rhel.7-x64-corert"", ""ol.7-x64"" ] - }, - ""ol.7.0-corert"": { - ""#import"": [ ""ol.7-corert"", ""ol.7.0"" ] - }, - ""ol.7.0-x64-corert"": { - ""#import"": [ ""ol.7.0-corert"", ""rhel.7.0-corert"", ""ol.7.0-x64"" ] - }, - ""ol.7.1-corert"": { - ""#import"": [ ""ol.7.0-corert"", ""ol.7.1"" ] - }, - ""ol.7.1-x64-corert"": { - ""#import"": [ ""ol.7.1-corert"", ""rhel.7.1-x64-corert"", ""ol.7.1-x64"" ] - }, - ""centos-corert"": { - ""#import"": [ ""rel-corert"", ""centos"" ] - }, - ""centos-x64-corert"": { - ""#import"": [ ""centos-corert"", ""rhel-x64-corert"", ""centos-x64"" ] - }, - ""centos.7-corert"": { - ""#import"": [ ""centos-corert"", ""centos.7"" ] - }, - ""centos.7-x64-corert"": { - ""#import"": [ ""centos.7-corert"", ""centos-x64-corert"", ""centos.7-x64"" ] - }, - ""debian-corert"": { - ""#import"": [ ""linux-corert"", ""debian"" ] - }, - ""debian-x64-corert"": { - ""#import"": [ ""debian-corert"", ""linux-x64-corert"", ""debian-x64"" ] - }, - ""debian-arm-corert"": { - ""#import"": [ ""debian-corert"", ""debian-arm"" ] - }, - ""debian-arm64-corert"": { - ""#import"": [ ""debian-corert"", ""debian-arm64"" ] - }, - ""debian.8-corert"": { - ""#import"": [ ""debian-corert"", ""debian.8"" ] - }, - ""debian.8-x64-corert"": { - ""#import"": [ ""debian.8-corert"", ""debian-x64-corert"", ""debian.8-x64"" ] - }, - ""debian.8-arm-corert"": { - ""#import"": [ ""debian.8-corert"", ""debian-arm-corert"", ""debian.8-arm"" ] - }, - ""debian.8-arm64-corert"": { - ""#import"": [ ""debian.8-corert"", ""debian-arm64-corert"", ""debian.8-arm64"" ] - }, - ""ubuntu-corert"": { - ""#import"": [ ""debian-corert"", ""ubuntu"" ] - }, - ""ubuntu-x64-corert"": { - ""#import"": [ ""ubuntu-corert"", ""debian-x64-corert"", ""ubuntu-x64"" ] - }, - ""ubuntu.14.04-corert"": { - ""#import"": [ ""ubuntu-corert"", ""ubuntu.14.06"" ] - }, - ""ubuntu.14.04-x64-corert"": { - ""#import"": [ ""ubuntu.14.04-corert"", ""ubuntu-x64-corert"", ""ubuntu-14.04-x64"" ] - }, - ""ubuntu.14.10-corert"": { - ""#import"": [ ""ubuntu.14.04-corert"", ""ubuntu-14.10"" ] - }, - ""ubuntu.14.10-x64-corert"": { - ""#import"": [ ""ubuntu.14.10-corert"", ""ubuntu.14.04-x64-corert"", ""ubuntu.14.10-x64"" ] - }, - ""ubuntu.15.04-corert"": { - ""#import"": [ ""ubuntu.14.10-corert"", ""ubuntu-15.04"" ] - }, - ""ubuntu.15.04-x64-corert"": { - ""#import"": [ ""ubuntu.15.04-corert"", ""ubuntu.14.10-x64-corert"", ""ubuntu.15.04-x64"" ] - }, - ""ubuntu.15.10-corert"": { - ""#import"": [ ""ubuntu.15.04-corert"", ""ubuntu-15.10"" ] - }, - ""ubuntu.15.10-x64-corert"": { - ""#import"": [ ""ubuntu.15.10-corert"", ""ubuntu.15.04-x64-corert"", ""ubuntu.15.10-x64"" ] - }, - ""ubuntu.16.04-corert"": { - ""#import"": [ ""ubuntu.15.10-corert"", ""ubuntu-16.04"" ] - }, - ""ubuntu.16.04-x64-corert"": { - ""#import"": [ ""ubuntu.16.04-corert"", ""ubuntu.15.10-x64-corert"", ""ubuntu.16.04-x64"" ] - }, - ""ubuntu.16.10-corert"": { - ""#import"": [ ""ubuntu.16.04-corert"", ""ubuntu.16.10"" ] - }, - ""ubuntu.16.10-x64-corert"": { - ""#import"": [ ""ubuntu.16.10-corert"", ""ubuntu.16.04-x64-corert"", ""ubuntu.16.10-x64"" ] - }, - ""linuxmint.17-corert"": { - ""#import"": [ ""ubuntu.14.04-corert"", ""linuxmint.17"" ] - }, - ""linuxmint.17-x64-corert"": { - ""#import"": [ ""linuxmint.17-corert"", ""ubuntu.14.04-x64-corert"", ""linuxmint.17-x64"" ] - }, - ""linuxmint.17.1-corert"": { - ""#import"": [ ""linuxmint.17-corert"", ""linuxmint.17.1"" ] - }, - ""linuxmint.17.1-x64-corert"": { - ""#import"": [ ""linuxmint.17.1-corert"", ""linuxmint.17-x64-corert"", ""linuxmint.17.1-x64"" ] - }, - ""linuxmint.17.2-corert"": { - ""#import"": [ ""linuxmint.17.1-corert"", ""linuxmint.17.2"" ] - }, - ""linuxmint.17.2-x64-corert"": { - ""#import"": [ ""linuxmint.17.2-corert"", ""linuxmint.17.1-x64-corert"", ""linuxmint.17.2-x64"" ] - }, - ""linuxmint.17.3-corert"": { - ""#import"": [ ""linuxmint.17.2-corert"", ""linuxmint.17.3"" ] - }, - ""linuxmint.17.3-x64-corert"": { - ""#import"": [ ""linuxmint.17.3-corert"", ""linuxmint.17.2-x64-corert"", ""linuxmint.17.3-x64"" ] - }, - ""linuxmint.18-corert"": { - ""#import"": [ ""ubuntu.16.04-corert"", ""linuxmint.18"" ] - }, - ""linuxmint.18-x64-corert"": { - ""#import"": [ ""linuxmint.18-corert"", ""ubuntu.16.04-x64-corert"", ""linuxmint.18-x64"" ] - }, - ""fedora-corert"": { - ""#import"": [ ""linux-corert"", ""fedora"" ] - }, - ""fedora-x64-corert"": { - ""#import"": [ ""fedora-corert"", ""linux-x64-corert"", ""fedora-x64"" ] - }, - ""fedora.23-corert"": { - ""#import"": [ ""fedora-corert"", ""fedora.23"" ] - }, - ""fedora.23-x64-corert"": { - ""#import"": [ ""fedora.23-corert"", ""fedora-x64-corert"", ""fedora.23-x64"" ] - }, - ""fedora.24-corert"": { - ""#import"": [ ""fedora.23-corert"", ""fedora.24"" ] - }, - ""fedora.24-x64-corert"": { - ""#import"": [ ""fedora.24-corert"", ""fedora.23-x64-corert"", ""fedora.24-x64"" ] - }, - ""opensuse-corert"": { - ""#import"": [ ""linux-corert"", ""opensuse"" ] - }, - ""opensuse-x64-corert"": { - ""#import"": [ ""opensuse-corert"", ""linux-x64-corert"", ""opensuste-x64"" ] - }, - ""opensuse.13.2-corert"": { - ""#import"": [ ""opensuse-corert"", ""opensuse.13.2"" ] - }, - ""opensuse.13.2-x64-corert"": { - ""#import"": [ ""opensuse.13.2-corert"", ""opensuse-x64-corert"", ""opensuse.13.2-x64"" ] - }, - ""opensuse.42.1-corert"": { - ""#import"": [ ""opensuse.13.2-corert"", ""opensuse.42.1"" ] - }, - ""opensuse.42.1-x64-corert"": { - ""#import"": [ ""opensuse.42.1-corert"", ""opensuse.13.2-x64-corert"", ""opensuse.42.1-x64"" ] - }, - ""alpine-corert"": { - ""#import"": [ ""linux-corert"", ""alpine"" ] - }, - ""alpine-x64-corert"": { - ""#import"": [ ""alpine-corert"", ""linux-x64-corert"", ""alpine-x64"" ] - }, - ""alpine.3-corert"": { - ""#import"": [ ""alpine-corert"", ""alpine.3"" ] - }, - ""alpine.3-x64-corert"": { - ""#import"": [ ""alpine.3-corert"", ""alpine-x64-corert"", ""alpine.3-x64"" ] - }, - ""alpine.3.4.3-corert"": { - ""#import"": [ ""alpine.3-corert"", ""alpine.3.4.3"" ] - }, - ""alpine.3.4.3-x64-corert"": { - ""#import"": [ ""alpine.3.4.3-corert"", ""alpine.3-x64-corert"", ""alpine.3.4.3-x64"" ] - } - } -}"; - } -} diff --git a/src/ApiCheck.Console/NuGet/RuntimeGraph.cs b/src/ApiCheck.Console/NuGet/RuntimeGraph.cs deleted file mode 100644 index ba6faef5c..000000000 --- a/src/ApiCheck.Console/NuGet/RuntimeGraph.cs +++ /dev/null @@ -1,116 +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 Microsoft.DotNet.PlatformAbstractions; -using Newtonsoft.Json.Linq; - -namespace ApiCheck.NuGet -{ - public partial class RuntimeGraph - { - private static readonly RuntimeGraph Instance; - - static RuntimeGraph() - { - var graph = JObject.Parse(RuntimeCompatibility); - var runtimes = (IDictionary)graph["runtimes"]; - var runtimesList = runtimes.Select(kvp => new RuntimeDefinition - { - Name = kvp.Key, - Fallbacks = CreateRuntimeDefinitions((IDictionary)kvp.Value, runtimes).ToArray() - }).ToArray(); - - Instance = new RuntimeGraph(runtimesList); - } - - private static IEnumerable CreateRuntimeDefinitions( - IDictionary definition, - IDictionary runtimes) - { - if (!definition.ContainsKey("#import")) - { - return Enumerable.Empty(); - } - var fallbacks = (JArray)definition["#import"]; - return fallbacks - .Select(fr => (string)fr) - .Select(fr => - { - if (runtimes.FirstOrDefault(r => r.Key.Equals(fr)).Key == null) - { - return new RuntimeDefinition - { - Name = fr, - Fallbacks = Enumerable.Empty() - }; - } - return new RuntimeDefinition - { - Name = runtimes.First(r => r.Key.Equals(fr)).Key, - Fallbacks = CreateRuntimeDefinitions( - (IDictionary)runtimes.First(r => r.Key.Equals(fr)).Value, - runtimes).ToArray() - }; - }); - } - - private RuntimeGraph(IEnumerable runtimes) - { - Runtimes = runtimes; - } - - public IEnumerable Runtimes { get; set; } - - public static IEnumerable GetCompatibleRuntimes(string runtimeId) - { - var runtimes = new HashSet(); - var runtime = Instance.Runtimes.FirstOrDefault(r => r.Name.Equals(runtimeId)); - if (runtime != null) - { - var pendingRuntimes = new Stack(); - pendingRuntimes.Push(runtime); - while (pendingRuntimes.Count > 0) - { - var currentRuntime = pendingRuntimes.Pop(); - runtimes.Add(currentRuntime.Name); - foreach (var fallback in currentRuntime.Fallbacks) - { - pendingRuntimes.Push(fallback); - } - } - } - - return runtimes; - } - - public static string GetCurrentRuntimeId() - { - if (RuntimeEnvironment.OperatingSystemPlatform != Platform.Windows) - { - return RuntimeEnvironment.GetRuntimeIdentifier(); - } - var arch = RuntimeEnvironment.RuntimeArchitecture.ToLowerInvariant(); - if (RuntimeEnvironment.OperatingSystemVersion.StartsWith("6.1", StringComparison.Ordinal)) - { - return "win7-" + arch; - } - if (RuntimeEnvironment.OperatingSystemVersion.StartsWith("6.2", StringComparison.Ordinal)) - { - return "win8-" + arch; - } - if (RuntimeEnvironment.OperatingSystemVersion.StartsWith("6.3", StringComparison.Ordinal)) - { - return "win81-" + arch; - } - if (RuntimeEnvironment.OperatingSystemVersion.StartsWith("10.0", StringComparison.Ordinal)) - { - return "win10-" + arch; - } - - throw new InvalidOperationException("Runtime not supported"); - } - } -} diff --git a/src/ApiCheck.Console/Program.cs b/src/ApiCheck.Console/Program.cs deleted file mode 100644 index 4185a52fd..000000000 --- a/src/ApiCheck.Console/Program.cs +++ /dev/null @@ -1,337 +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.IO; -using System.Linq; -using System.Reflection; -using ApiCheck.Description; -using Microsoft.Extensions.CommandLineUtils; -using Newtonsoft.Json; - -namespace ApiCheck -{ - public class Program - { - private const int Ok = 0; - private const int Error = 1; - - public static int Main(string[] args) - { - try - { - var app = new CommandLineApplication - { - Name = "ApiCheck" - }; - - app.Command("generate", c => - { - var assemblyPathOption = c.Option("-a|--assembly", - "Path to the assembly to generate the ApiListing for", CommandOptionType.SingleValue); - var assetsJson = c.Option("-p|--project", "Path to the project.assets.json file", - CommandOptionType.SingleValue); - var framework = c.Option("-f|--framework", - "The moniker for the framework the assembly to analize was compiled against.", - CommandOptionType.SingleValue); - var noPublicInternal = c.Option("-epi|--exclude-public-internal", - "Exclude types on the .Internal namespace from the generated report", - CommandOptionType.NoValue); - var outputPath = c.Option("-o|--out", "Output path for the generated ApiListing file", - CommandOptionType.SingleValue); - - c.HelpOption("-h|--help"); - - c.OnExecute(() => OnGenerate(c, assemblyPathOption, assetsJson, framework, noPublicInternal, - outputPath)); - }); - - app.Command("compare", c => - { - var apiListingPathOption = c.Option("-b|--api-listing", - "Path to the API listing file to use as reference.", CommandOptionType.SingleValue); - var exclusionsPathOption = c.Option("-e|--exclusions", - "Path to the exclusions file for the ApiListing", CommandOptionType.SingleValue); - var assemblyPathOption = c.Option("-a|--assembly", - "Path to the assembly to generate the ApiListing for", CommandOptionType.SingleValue); - var assetsJson = c.Option("-p|--project", "Path to the project.assets.json file", - CommandOptionType.SingleValue); - var framework = c.Option("-f|--framework", - "The moniker for the framework the assembly to analize was compiled against.", - CommandOptionType.SingleValue); - var noPublicInternal = c.Option("-epi|--exclude-public-internal", - "Exclude types on the .Internal namespace from the generated report", - CommandOptionType.NoValue); - - c.HelpOption("-h|--help"); - - c.OnExecute(() => OnCompare(c, apiListingPathOption, exclusionsPathOption, assemblyPathOption, - assetsJson, framework, noPublicInternal)); - }); - - app.HelpOption("-h|--help"); - - app.OnExecute(() => - { - app.ShowHelp(); - return Ok; - }); - - return app.Execute(args); - } - catch (FileNotFoundException e) - { - Console.WriteLine(e.ToString()); - } - catch (ReflectionTypeLoadException e) - { - // ReflectionTypeLoadException does not override ToString() to include LoaderExceptions. - Console.WriteLine($"{e.GetType().FullName}: {e.Message}"); - - var hadLoaderExceptions = false; - foreach (var loaderException in e.LoaderExceptions) - { - hadLoaderExceptions = true; - Console.WriteLine($" {loaderException.GetType().FullName}: {loaderException.Message}"); - - var innerException = loaderException.InnerException; - while (innerException != null) - { - Console.WriteLine($" {innerException.GetType().FullName}: {innerException.Message}"); - innerException = innerException.InnerException; - } - - if (loaderException.InnerException != null) - { - Console.WriteLine(" --- End of inner exceptions ---"); - } - } - - if (hadLoaderExceptions) - { - Console.WriteLine(" --- End of loader exceptions ---"); - } - - var inner = e.InnerException; - while (inner != null) - { - Console.WriteLine($" {inner.GetType().FullName}: {inner.Message}"); - inner = inner.InnerException; - } - - if (e.InnerException != null) - { - Console.WriteLine(" --- End of inner exceptions ---"); - } - - Console.WriteLine(e.StackTrace); - } - - return Error; - } - - private static int OnGenerate( - CommandLineApplication command, - CommandOption assemblyPath, - CommandOption assetsJson, - CommandOption framework, - CommandOption excludeInternalNamespace, - CommandOption output) - { - if (!assemblyPath.HasValue() || - !output.HasValue() || - !assetsJson.HasValue() || - !framework.HasValue()) - { - Console.Error.WriteLine("Missing required option."); - command.ShowHelp(); - return Error; - } - - var assembly = AssemblyLoader.LoadAssembly( - assemblyPath.Value(), - assetsJson.Value(), - framework.Value()); - - var filters = new List>(); - if (excludeInternalNamespace.HasValue()) - { - filters.Add(ApiListingFilters.IsInInternalNamespace); - } - - var report = ApiListingGenerator.GenerateApiListingReport(assembly, filters); - using (var writer = new JsonTextWriter(File.CreateText(output.Value()))) - { - writer.Formatting = Formatting.Indented; - writer.Indentation = 2; - writer.IndentChar = ' '; - - report.WriteTo(writer); - } - - return Ok; - } - - private static int OnCompare( - CommandLineApplication command, - CommandOption apiListingPathOption, - CommandOption breakingChangesPathOption, - CommandOption assemblyPath, - CommandOption assetsJson, - CommandOption framework, - CommandOption excludeInternalNamespace) - { - if (!apiListingPathOption.HasValue() || - !assemblyPath.HasValue() || - !assetsJson.HasValue() || - !framework.HasValue()) - { - command.ShowHelp(); - return Error; - } - - var assembly = AssemblyLoader.LoadAssembly( - assemblyPath.Value(), - assetsJson.Value(), - framework.Value()); - - var newApiListingFilters = new List>(); - var oldApiListingFilters = new List>(); - - if (excludeInternalNamespace.HasValue()) - { - newApiListingFilters.Add(ApiListingFilters.IsInInternalNamespace); - oldApiListingFilters.Add(ApiListingFilters.IsInInternalNamespace); - } - - var oldApiListing = ApiListingGenerator.LoadFrom(File.ReadAllText(apiListingPathOption.Value()), - oldApiListingFilters); - - var generator = new ApiListingGenerator(assembly, newApiListingFilters); - var newApiListing = generator.GenerateApiListing(); - var knownBreakingChanges = (breakingChangesPathOption.HasValue() - ? JsonConvert.DeserializeObject>( - File.ReadAllText(breakingChangesPathOption.Value())) - : null) ?? new List(); - - var comparer = new ApiListingComparer(oldApiListing, newApiListing); - - var breakingChanges = comparer.GetDifferences(); - var newBreakingChanges = breakingChanges.Except(knownBreakingChanges).ToList(); - var incorrectBreakingChanges = knownBreakingChanges.Except(breakingChanges).ToList(); - - const string indent = " "; - - var breakingChangesToPrint = new List(); - - if (newBreakingChanges.Count > 0) - { - Console.WriteLine( - $"ERROR: Verifying breaking changes for framework {framework.Value()} failed."); - } - - var removedTypes = newBreakingChanges.Where(b => b.MemberId == null).OrderBy(b => b.TypeId).ToList(); - if (removedTypes.Count > 0) - { - Console.WriteLine(); - Console.WriteLine("The following types have been removed."); - Console.WriteLine(); - Console.WriteLine(string.Join(Environment.NewLine, removedTypes.Select(b => indent + b.TypeId))); - Console.WriteLine(); - } - - breakingChangesToPrint.AddRange(removedTypes); - - var removedMembers = newBreakingChanges - .Where(b => b.MemberId != null && b.Kind == ChangeKind.Removal) - .OrderBy(b => b.MemberId) - .GroupBy(b => b.TypeId) - .ToList(); - if (removedMembers.Count > 0) - { - Console.WriteLine(); - Console.WriteLine(); - Console.WriteLine("The following types have one or more members removed from them."); - Console.WriteLine(); - - foreach (var memberGrouping in removedMembers) - { - Console.WriteLine(indent + memberGrouping.Key); - Console.WriteLine(string.Join(Environment.NewLine, - memberGrouping.Select(b => indent + indent + b.MemberId).ToList())); - Console.WriteLine(); - } - } - - breakingChangesToPrint.AddRange(removedMembers.SelectMany(t => t.ToList())); - - var newMembersOnInterfaces = newBreakingChanges - .Where(b => b.MemberId != null && b.Kind == ChangeKind.Addition) - .OrderBy(b => b.MemberId) - .GroupBy(b => b.TypeId) - .ToList(); - if (newMembersOnInterfaces.Count > 0) - { - Console.WriteLine(); - Console.WriteLine(); - Console.WriteLine("The following interfaces have one or more members added to them."); - - foreach (var memberGrouping in newMembersOnInterfaces) - { - Console.WriteLine(indent + memberGrouping.Key); - Console.WriteLine(string.Join(Environment.NewLine, - memberGrouping.Select(b => indent + indent + b.MemberId).ToList())); - Console.WriteLine(); - } - } - - breakingChangesToPrint.AddRange(newMembersOnInterfaces.SelectMany(t => t.ToList())); - - foreach (var exclusion in incorrectBreakingChanges) - { - if (breakingChangesPathOption.HasValue()) - { - Console.Error.WriteLine( - $"ERROR: The following exclusion is in the exclusion file '{breakingChangesPathOption.Value()}', but is no longer necessary:"); - } - else - { - Console.Error.WriteLine( - "ERROR: The following exclusion is in the exclusion file, but is no longer necessary:"); - } - Console.WriteLine(JsonConvert.SerializeObject(exclusion, Formatting.Indented)); - Console.WriteLine(); - } - - if (breakingChangesToPrint.Any()) - { - Console.WriteLine(); - Console.WriteLine(); - Console.WriteLine("Following is the list of exclusions that either need to be added to the list of breaking changes, or the breaking changes themselves need to be reverted:"); - Console.WriteLine( - JsonConvert.SerializeObject( - breakingChangesToPrint, - Formatting.Indented, - new JsonSerializerSettings - { - NullValueHandling = NullValueHandling.Ignore - })); - Console.WriteLine(); - } - - if (newBreakingChanges.Count > 0 || incorrectBreakingChanges.Count > 0) - { - Console.WriteLine( - "The process for breaking changes is described in: https://github.com/aspnet/AspNetCore/wiki/Engineering-guidelines#breaking-changes"); - Console.WriteLine( - "The process to add an exclusion to this tool is described in: https://github.com/aspnet/BuildTools/wiki/Api-Check#apicheck-exceptions"); - Console.WriteLine(); - - return Error; - } - - return Ok; - } - } -} diff --git a/src/ApiCheck.Console/README.md b/src/ApiCheck.Console/README.md deleted file mode 100644 index 6e9559e61..000000000 --- a/src/ApiCheck.Console/README.md +++ /dev/null @@ -1,3 +0,0 @@ -Api Check -=========== -The documentation for this project can be found [here](https://github.com/aspnet/BuildTools/wiki/Api-Check). \ No newline at end of file diff --git a/src/ApiCheck.Console/build/Microsoft.AspNetCore.BuildTools.ApiCheck.props b/src/ApiCheck.Console/build/Microsoft.AspNetCore.BuildTools.ApiCheck.props deleted file mode 100644 index 705b19be6..000000000 --- a/src/ApiCheck.Console/build/Microsoft.AspNetCore.BuildTools.ApiCheck.props +++ /dev/null @@ -1,16 +0,0 @@ - - - - <_ApiCheckTaskAssembly>$(MSBuildThisFileDirectory)..\tools\netstandard2.0\Microsoft.AspNetCore.BuildTools.ApiCheck.Task.dll - - - - - diff --git a/src/ApiCheck.Task/ApiCheck.Task.csproj b/src/ApiCheck.Task/ApiCheck.Task.csproj deleted file mode 100644 index 406c5cb4f..000000000 --- a/src/ApiCheck.Task/ApiCheck.Task.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - - netstandard2.0 - false - Microsoft.AspNetCore.BuildTools.ApiCheck.Task - Microsoft.AspNetCore.BuildTools.ApiCheck.Task - - - - - - - - - - - - - diff --git a/src/ApiCheck.Task/ApiCheckGenerateTask.cs b/src/ApiCheck.Task/ApiCheckGenerateTask.cs deleted file mode 100644 index 38eebd79b..000000000 --- a/src/ApiCheck.Task/ApiCheckGenerateTask.cs +++ /dev/null @@ -1,34 +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.IO; -using Microsoft.Build.Framework; -using System.Reflection; - -namespace Microsoft.AspNetCore.BuildTools.ApiCheck.Task -{ - /// - /// An MSBuild task that acts as a shim to Microsoft.AspNetCore.BuildTools.ApiCheck.exe generate ... or - /// dotnet Microsoft.AspNetCore.BuildTools.ApiCheck.dll generate .... - /// - public class ApiCheckGenerateTask : ApiCheckTasksBase - { - protected override bool ValidateParameters() - { - if (string.IsNullOrEmpty(ApiListingPath)) - { - Log.LogError($"API listing file '{ApiListingPath}' not specified."); - return false; - } - - return base.ValidateParameters(); - } - - protected override string GenerateCommandLineCommands() - { - return GenerateCommandLineCommands("generate"); - } - } -} diff --git a/src/ApiCheck.Task/ApiCheckTask.cs b/src/ApiCheck.Task/ApiCheckTask.cs deleted file mode 100644 index db72c97f2..000000000 --- a/src/ApiCheck.Task/ApiCheckTask.cs +++ /dev/null @@ -1,53 +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.IO; -using System.Reflection; -using Microsoft.Build.Framework; - -namespace Microsoft.AspNetCore.BuildTools.ApiCheck.Task -{ - /// - /// An MSBuild task that acts as a shim to Microsoft.AspNetCore.BuildTools.ApiCheck.exe compare ... or - /// dotnet Microsoft.AspNetCore.BuildTools.ApiCheck.dll compare .... - /// - public class ApiCheckTask : ApiCheckTasksBase - { - /// - /// Path to the exclusions file that narrows , ignoring listed breaking changes. - /// - public string ExclusionsPath { get; set; } - - /// - protected override bool ValidateParameters() - { - if (string.IsNullOrEmpty(ApiListingPath) || !File.Exists(ApiListingPath)) - { - Log.LogError($"API listing file '{ApiListingPath}' not specified or does not exist."); - return false; - } - - if (!string.IsNullOrEmpty(ExclusionsPath) && !File.Exists(ExclusionsPath)) - { - Log.LogError($"Exclusions file '{ExclusionsPath}' does not exist."); - return false; - } - - return base.ValidateParameters(); - } - - /// - protected override string GenerateCommandLineCommands() - { - var arguments = GenerateCommandLineCommands("compare"); - - if (!string.IsNullOrEmpty(ExclusionsPath)) - { - arguments += $@" --exclusions ""{ExclusionsPath}"""; - } - - return arguments; - } - } -} diff --git a/src/ApiCheck.Task/ApiCheckTasksBase.cs b/src/ApiCheck.Task/ApiCheckTasksBase.cs deleted file mode 100644 index f2d905fc3..000000000 --- a/src/ApiCheck.Task/ApiCheckTasksBase.cs +++ /dev/null @@ -1,158 +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.IO; -using System.Reflection; -using System.Runtime.InteropServices; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; -using Microsoft.Extensions.CommandLineUtils; - -namespace Microsoft.AspNetCore.BuildTools.ApiCheck.Task -{ - public abstract class ApiCheckTasksBase : ToolTask - { - protected const string ApiCheckToolName = "ApiCheck"; - - public ApiCheckTasksBase() - { - // Tool does not use stderr for anything. Treat everything that appears there as an error. - LogStandardErrorAsError = true; - } - - /// - /// Path to the project.assets.json file created when building . - /// - [Required] - public string ProjectAssetsPath { get; set; } - - /// - /// Path for the API listing file. - /// - [Required] - public string ApiListingPath { get; set; } - - /// - /// Path to the assembly to consider. - /// - [Required] - public string AssemblyPath { get; set; } - - /// - /// Exclude types defined in .Internal namespaces from the comparison, ignoring breaking changes in such types. - /// - public bool ExcludePublicInternalTypes { get; set; } - - /// - /// The framework moniker for . - /// - [Required] - public string Framework { get; set; } - - /// - protected override MessageImportance StandardErrorLoggingImportance => MessageImportance.High; - - /// - protected override MessageImportance StandardOutputLoggingImportance => MessageImportance.High; - - /// - protected override string ToolName - { - get - { - if (Framework.StartsWith("net4", StringComparison.OrdinalIgnoreCase)) - { - return ApiCheckToolName + ".exe"; - } - - var exeExtension = RuntimeInformation.IsOSPlatform(OSPlatform.Windows) ? ".exe" : string.Empty; - return "dotnet" + exeExtension; - } - } - - protected override bool ValidateParameters() - { - if (string.IsNullOrEmpty(AssemblyPath) || !File.Exists(AssemblyPath)) - { - Log.LogError($"Assembly '{AssemblyPath}' not specified or does not exist."); - return false; - } - - if (string.IsNullOrEmpty(Framework)) - { - Log.LogError("Framework moniker must be specified."); - return false; - } - - if (string.IsNullOrEmpty(ProjectAssetsPath) || !File.Exists(ProjectAssetsPath)) - { - Log.LogError($"Project assets file '{ProjectAssetsPath}' not specified or does not exist."); - return false; - } - - return base.ValidateParameters(); - } - - /// - protected override string GenerateFullPathToTool() - { - // ToolExe equals ToolName by default. Assume (as base class does) any user override is in the same directory. - if (Framework.StartsWith("net4", StringComparison.OrdinalIgnoreCase)) - { - var taskAssemblyFolder = Path.GetDirectoryName(GetType().GetTypeInfo().Assembly.Location); - return Path.GetFullPath(Path.Combine(taskAssemblyFolder, "..", "net46", ToolExe)); - } - - // If muxer does not find dotnet, fall back to system PATH and hope for the best. - return DotNetMuxer.MuxerPath ?? ToolExe; - } - - /// - protected override void LogEventsFromTextOutput(string singleLine, MessageImportance messageImportance) - { - // Since tool prints out formatted list of breaking changes, - // anything that starts with Error considered an error; the rest is user information. - if (singleLine.StartsWith("Error", StringComparison.OrdinalIgnoreCase)) - { - Log.LogError(singleLine, Array.Empty()); - } - else - { - base.LogEventsFromTextOutput(singleLine, messageImportance); - } - } - - protected string GenerateCommandLineCommands(string command) - { - var arguments = string.Empty; - if (!Framework.StartsWith("net4", StringComparison.OrdinalIgnoreCase)) - { - var taskAssemblyFolder = Path.GetDirectoryName(GetType().GetTypeInfo().Assembly.Location); - var toolPath = Path.Combine(taskAssemblyFolder, "..", "netcoreapp3.0", ApiCheckToolName + ".dll"); - arguments = $@"""{Path.GetFullPath(toolPath)}"" "; - } - - arguments += command; - - if (ExcludePublicInternalTypes) - { - arguments += " --exclude-public-internal"; - } - - arguments += $@" --assembly ""{AssemblyPath}"" --framework {Framework}"; - arguments += $@" --project ""{ProjectAssetsPath}"""; - if (command == "compare") - { - arguments += $@" --api-listing ""{ApiListingPath}"""; - } - - if (command == "generate") - { - arguments += $@" --out {ApiListingPath}"; - } - - return arguments; - } - } -} diff --git a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj index 5fc7a97f2..f9857a406 100644 --- a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj +++ b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj @@ -1,5 +1,4 @@ - - + Internal.AspNetCore.Sdk @@ -32,31 +31,9 @@ - - - - - - - - - - $(ApiCheckPackageVersion) - $(MicrosoftBuildPackageVersion) - $(JsonInMSBuildVersion) - - -]]> - - - - - + $(NuspecProperties);id=$(PackageId) - $(NuspecProperties);bundledVersionFile=$(IntermediateOutputPath)BundledVersions.props - $(NuspecProperties);apicheckVersion=$(ApiCheckPackageVersion) $(NuspecProperties);config=$(Configuration) $(NuspecProperties);version=$(PackageVersion) $(NuspecProperties);description=$(Description) @@ -64,5 +41,4 @@ - diff --git a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec index dbf655e90..0080e3901 100644 --- a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec +++ b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec @@ -7,9 +7,6 @@ false $description$ $copyright$ - - - @@ -19,6 +16,5 @@ - diff --git a/src/Internal.AspNetCore.Sdk/build/ApiCheck.props b/src/Internal.AspNetCore.Sdk/build/ApiCheck.props deleted file mode 100644 index 8be250a64..000000000 --- a/src/Internal.AspNetCore.Sdk/build/ApiCheck.props +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - <_ApiCheckIsSupported Condition=" '$(OS)' != 'Windows_NT' ">false - - - <_ApiCheckIsSupported Condition=" '$(MSBuildRuntimeType)' != 'Core' ">false - - - true - - true - - - $(GenerateNuspecDependsOn);Generate-ApiCheck-Baselines - $(GenerateNuspecDependsOn);Replace-ApiCheck-Baselines - $(GenerateNuspecDependsOn);ApiCheck - - diff --git a/src/Internal.AspNetCore.Sdk/build/ApiCheck.targets b/src/Internal.AspNetCore.Sdk/build/ApiCheck.targets deleted file mode 100644 index d27f30a1d..000000000 --- a/src/Internal.AspNetCore.Sdk/build/ApiCheck.targets +++ /dev/null @@ -1,64 +0,0 @@ - - - - - <_ApiListingFileSuffix Condition=" '$(TargetFrameworkIdentifier)' == '.NETFramework' ">netframework.json - <_ApiListingFileSuffix Condition=" '$(_ApiListingFileSuffix)' == '' ">netcore.json - <_ApiListingFilePath>$(MSBuildProjectDirectory)\baseline.$(_ApiListingFileSuffix) - <_ApiListingOutputFile>$(OutputPath)\baseline.$(_ApiListingFileSuffix) - <_ApiExclusionsFilePath>$(MSBuildProjectDirectory)\breakingchanges.$(_ApiListingFileSuffix) - - - - - - - - - - <_ApiExclusionsFile Condition=" Exists('$(_ApiExclusionsFilePath)') ">$(_ApiExclusionsFilePath) - - - - - - - - <_ApiListingFile Condition=" Exists('$(_ApiListingFilePath)') ">$(_ApiListingFilePath) - <_ApiExclusionsFile Condition=" Exists('$(_ApiExclusionsFilePath)') ">$(_ApiExclusionsFilePath) - - - - - - - - diff --git a/src/Internal.AspNetCore.Sdk/build/Common.props b/src/Internal.AspNetCore.Sdk/build/Common.props index 172e9d7af..22580abdc 100644 --- a/src/Internal.AspNetCore.Sdk/build/Common.props +++ b/src/Internal.AspNetCore.Sdk/build/Common.props @@ -6,8 +6,6 @@ Usage: this should be imported once via NuGet at the top of the file. --> - - Microsoft diff --git a/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets b/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets index 0551a59c3..ed1fbe046 100644 --- a/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets +++ b/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets @@ -4,7 +4,6 @@ for use outside of Microsoft. --> - - - - - - <_TargetFrameworks Remove="@(_TargetFrameworks)" /> - <_TargetFrameworks Include="$(TargetFrameworks)" /> - - - - - - - - <_TargetFrameworks Remove="@(_TargetFrameworks)" /> - <_TargetFrameworks Include="$(TargetFrameworks)" /> - - - - - - - - <_TargetFrameworks Remove="@(_TargetFrameworks)" /> - <_TargetFrameworks Include="$(TargetFrameworks)" /> - - - - - diff --git a/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.targets b/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.targets index 4d8a26ed0..2c80eb4db 100644 --- a/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.targets +++ b/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.targets @@ -4,7 +4,6 @@ for use outside of Microsoft. --> - diff --git a/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets b/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets deleted file mode 100644 index 0ff4609aa..000000000 --- a/src/Internal.AspNetCore.Sdk/sdk/DefaultItems.targets +++ /dev/null @@ -1,25 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - - - - - - - - - - - - - - - - diff --git a/src/Internal.AspNetCore.Sdk/sdk/Sdk.props b/src/Internal.AspNetCore.Sdk/sdk/Sdk.props index 525a2b1e0..85a825239 100644 --- a/src/Internal.AspNetCore.Sdk/sdk/Sdk.props +++ b/src/Internal.AspNetCore.Sdk/sdk/Sdk.props @@ -3,20 +3,8 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) <_ReferencesInternalAspNetCoreSdk>true - - - true - - - true - - - true - - - diff --git a/src/Internal.AspNetCore.Sdk/sdk/Sdk.targets b/src/Internal.AspNetCore.Sdk/sdk/Sdk.targets index d6f742aeb..5383c9fdd 100644 --- a/src/Internal.AspNetCore.Sdk/sdk/Sdk.targets +++ b/src/Internal.AspNetCore.Sdk/sdk/Sdk.targets @@ -9,6 +9,4 @@ - - diff --git a/test.ps1 b/test.ps1 index 340e666af..ddde0d73a 100755 --- a/test.ps1 +++ b/test.ps1 @@ -38,8 +38,7 @@ $Arguments += , "/p:DotNetRestoreSources=$packageDir" foreach ($pkg in @( "Internal.AspNetCore.Sdk", - "Internal.AspNetCore.SiteExtension.Sdk", - "Microsoft.AspNetCore.BuildTools.ApiCheck")) { + "Internal.AspNetCore.SiteExtension.Sdk")) { $pkgRoot = "${env:USERPROFILE}/.nuget/packages/$pkg/$toolsVersion/" if (Test-Path $pkgRoot) { diff --git a/test/ApiCheck.Test/ApiCheck.Test.csproj b/test/ApiCheck.Test/ApiCheck.Test.csproj deleted file mode 100644 index 441e64089..000000000 --- a/test/ApiCheck.Test/ApiCheck.Test.csproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - - netcoreapp3.0 - $(TargetFrameworks);net461 - - - - - - - - - - - - - - - - diff --git a/test/ApiCheck.Test/ApiListingComparerTests.cs b/test/ApiCheck.Test/ApiListingComparerTests.cs deleted file mode 100644 index eec3c2d9f..000000000 --- a/test/ApiCheck.Test/ApiListingComparerTests.cs +++ /dev/null @@ -1,460 +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 System.Reflection; -using ApiCheck.Description; -using ApiCheckApiListing.V2; -using Scenarios; -using Xunit; - -namespace ApiCheck.Test -{ - public class ApiListingComparerTests - { - public Assembly V1Assembly => typeof(ApiCheckApiListingV1).GetTypeInfo().Assembly; - public Assembly V2Assembly => typeof(ApiCheckApiListingV2).GetTypeInfo().Assembly; - - public IEnumerable> TestFilters => new Func [] - { - ti => (ti as TypeInfo)?.Namespace?.StartsWith("ComparisonScenarios") == false - }; - -#if NETCOREAPP3_0 // Reflection does not provide a hook to enumerate forwarded types in .NET Framework. - [Fact] - public void Compare_AllowsTypeToBeForwarded() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - var typeToCheck = "public class ComparisonScenarios.TypeToBeForwarded"; - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - Assert.DoesNotContain(breakingChanges, bc => bc.TypeId == typeToCheck); - } - - [Fact] - public void Compare_DetectsChangesInForwardedType() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - var typeToCheck = "public class ComparisonScenarios.TypeToBeForwardedAndChanged"; - var getterRemoval = new BreakingChange( - typeToCheck, - "public System.String get_PropertyToBeRemoved()", - ChangeKind.Removal); - var setterRemoval = new BreakingChange( - typeToCheck, - "public System.Void set_PropertyToBeRemoved(System.String value)", - ChangeKind.Removal); - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - Assert.Equal(2, breakingChanges.Count(bc => bc.TypeId == typeToCheck)); - Assert.Contains(getterRemoval, breakingChanges); - Assert.Contains(setterRemoval, breakingChanges); - } -#endif - - [Fact] - public void Compare_Detects_ChangesInTypeVisibility_as_removal() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - var expected = new BreakingChange( - "public class ComparisonScenarios.PublicToInternalClass", - memberId: null, - kind: ChangeKind.Removal); - Assert.Contains(expected, breakingChanges); - } - - [Fact] - public void Compare_Detects_TypeRenames_as_removal() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - var expected = new BreakingChange( - "public interface ComparisonScenarios.TypeToRename", - memberId: null, - kind: ChangeKind.Removal); - Assert.Contains(expected, breakingChanges); - } - - [Fact] - public void Compare_Detects_TypeGenericAritybreakingChanges_as_removal() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - var expected = new BreakingChange( - "public struct ComparisonScenarios.StructToMakeGeneric", - memberId: null, - kind: ChangeKind.Removal); - Assert.Contains(expected, breakingChanges); - } - - [Theory] - [InlineData("public class ComparisonScenarios.ClassToRemoveFieldsFrom")] - [InlineData("public struct ComparisonScenarios.StructToRemoveFieldsFrom")] - public void Compare_DetectsAllFieldRemovals(string typeToCheck) - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - - // Oops. The NewInternalProperty addition is a breaking change; makes it impossible to subclass type in - // another assembly. - var expected = new List - { - // Changing a const's value doesn't cause a binary incompatibility but often causes problems. - new BreakingChange( - typeToCheck, - "public const System.Int32 ConstToChangeValue = 1", - ChangeKind.Removal), - // Removing a const doesn't cause a binary incompatibilty but often causes problems. - new BreakingChange( - typeToCheck, - "public const System.Int32 ConstToMakeField = 2", - ChangeKind.Removal), - // Oops. Making a field writable is not technically a breaking change. - new BreakingChange( - typeToCheck, - "public readonly System.Int32 FieldToMakeWritable", - ChangeKind.Removal), - new BreakingChange( - typeToCheck, - "public static readonly System.Int32 StaticFieldToMakeConst", - ChangeKind.Removal), - // Oops. Making a field writable is not technically a breaking change. - new BreakingChange( - typeToCheck, - "public static readonly System.Int32 StaticFieldToMakeWritable", - ChangeKind.Removal), - new BreakingChange( - typeToCheck, - "public static System.Int32 StaticFieldToMakeReadonly", - ChangeKind.Removal), - new BreakingChange( - typeToCheck, - "public System.Int32 FieldToMakeReadonly", - ChangeKind.Removal), - new BreakingChange( - typeToCheck, - "public System.Int32 FieldToRemove", - ChangeKind.Removal), - }; - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - var breakingChanginesInType = breakingChanges - .Where(change => string.Equals(change.TypeId, typeToCheck, StringComparison.Ordinal)) - .OrderBy(change => change.MemberId); - Assert.Equal(expected, breakingChanginesInType); - } - - [Fact] - public void Compare_Detects_NamespacebreakingChanges_as_removal() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - var expected = new BreakingChange( - "public class ComparisonScenarios.ClassToChangeNamespaces", - memberId: null, - kind: ChangeKind.Removal); - Assert.Contains(expected, breakingChanges); - } - - [Fact] - public void Compare_Detects_ClassBeingNested_as_removal() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - var expected = new BreakingChange( - "public class ComparisonScenarios.ClassToNest", - memberId: null, - kind: ChangeKind.Removal); - Assert.Contains(expected, breakingChanges); - } - - [Fact] - public void Compare_Detects_ClassBeingUnnested_as_removal() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - var expected = new BreakingChange( - "public class ComparisonScenarios.ClassToUnnestContainer+ClassToUnnest", - memberId: null, - kind: ChangeKind.Removal); - Assert.Contains(expected, breakingChanges); - } - - [Fact] - public void Compare_Detects_GenericTypeConstraintsBeingAdded_as_removal() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - var expected = new BreakingChange( - "public class ComparisonScenarios.GenericTypeWithConstraintsToBeAdded", - memberId: null, - kind: ChangeKind.Removal); - Assert.Contains(expected, breakingChanges); - } - - [Fact] - public void Compare_Detects_MethodParametersBeingAdded_as_removal() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - var expected = new BreakingChange( - "public class ComparisonScenarios.ClassWithMethods", - "public System.Void MethodToAddParameters()", - kind: ChangeKind.Removal); - Assert.Contains(expected, breakingChanges); - } - - [Fact] - public void Compare_DoesNotFailForTypeAddingAnInterface() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - Assert.Null(breakingChanges.FirstOrDefault( - bc => bc.TypeId == "public ComparisonScenarios.TypeWithExtraInterface")); - } - - [Fact] - public void Compare_DetectsAbstractMethodAdditions() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - var typeToCheck = "public abstract class ComparisonScenarios.AbstractClassToAddMethodsTo"; - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - var breakingChangesInType = breakingChanges - .Where(change => string.Equals(change.TypeId, typeToCheck, StringComparison.Ordinal)); - var breakingChange = Assert.Single(breakingChangesInType); - Assert.Equal(ChangeKind.Addition, breakingChange.Kind); - Assert.Equal("public abstract System.Void NewAbstractMethod()", breakingChange.MemberId); - } - - [Fact] - public void Compare_DetectsAbstractPropertyAdditions() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - var typeToCheck = "public abstract class ComparisonScenarios.AbstractClassToAddPropertiesTo"; - var expected = new List - { - new BreakingChange( - typeToCheck, - "public abstract System.Int32 get_NewAbstractProperty()", - ChangeKind.Addition), - new BreakingChange( - typeToCheck, - "public abstract System.Void set_PropertyToAddSetterTo(System.Int32 value)", - ChangeKind.Addition), - }; - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - var breakingChangesInType = breakingChanges - .Where(change => string.Equals(change.TypeId, typeToCheck, StringComparison.Ordinal)) - .OrderBy(change => change.MemberId); - Assert.Equal(expected, breakingChangesInType); - } - - [Fact] - public void Compare_DetectsNewMembersBeingAddedToAnInterface_as_addition() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - var interfaceBreakingChanges = breakingChanges - .Where( b => b.TypeId == "public interface ComparisonScenarios.IInterfaceToAddMembersTo") - .ToList(); - Assert.Single(interfaceBreakingChanges, - b => b.MemberId == "System.Int32 get_NewMember()" && b.Kind == ChangeKind.Addition); - Assert.Single(interfaceBreakingChanges, - b => b.MemberId == "System.Void set_NewMember(System.Int32 value)" && b.Kind == ChangeKind.Addition); - } - - [Fact] - public void Compare_AllowsExclusionsOnNewInterfaceMembers() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - - var knownBreakingChanges = new List - { - new BreakingChange( - "public interface ComparisonScenarios.IInterfaceToAddMembersTo", - "System.Int32 get_NewMember()", - ChangeKind.Addition), - new BreakingChange( - "public interface ComparisonScenarios.IInterfaceToAddMembersTo", - "System.Void set_NewMember(System.Int32 value)", - ChangeKind.Addition) - }; - - // Act - var breakingChanges = comparer.GetDifferences().Except(knownBreakingChanges); - - // Assert - Assert.DoesNotContain( - breakingChanges, - bc => bc.TypeId == "public interface ComparisonScenarios.IInterfaceToAddMembersTo"); - } - - [Fact] - public void Compare_DetectsNewMembersInThePresenceOfRenamedAndRemovedMembers() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - var interfaceBreakingChanges = breakingChanges - .Where( b => b.TypeId == "public interface ComparisonScenarios.IInterfaceWithMembersThatWillGetRenamedRemovedAndAdded") - .ToList(); - Assert.Single(interfaceBreakingChanges, - b => b.MemberId == "System.Void MemberToBeRenamed()" && b.Kind == ChangeKind.Removal); - Assert.Single(interfaceBreakingChanges, - b => b.MemberId == "System.Void MemberToBeRemoved()" && b.Kind == ChangeKind.Removal); - Assert.Single(interfaceBreakingChanges, - b => b.MemberId == "System.Void RenamedMember()" && b.Kind == ChangeKind.Addition); - Assert.Single(interfaceBreakingChanges, - b => b.MemberId == "System.Void AddedMember()" && b.Kind == ChangeKind.Addition); - } - - [Fact] - public void Compare_DetectsNewMembersInThePresenceOfTheSameNumberOfRemovedAndAddedMembers() - { - // Arrange - var v1ApiListing = CreateApiListingDocument(V1Assembly); - var v2ApiListing = CreateApiListingDocument(V2Assembly); - var comparer = new ApiListingComparer(v1ApiListing, v2ApiListing); - - // Act - var breakingChanges = comparer.GetDifferences(); - - // Assert - var interfaceBreakingChanges = breakingChanges - .Where(b => b.TypeId == "public interface ComparisonScenarios.IInterfaceWithSameNumberOfRemovedAndAddedMembers") - .ToList(); - Assert.Single(interfaceBreakingChanges, - b => b.MemberId == "System.Void FirstMemberToRemove()" && b.Kind == ChangeKind.Removal); - Assert.Single(interfaceBreakingChanges, - b => b.MemberId == "System.Void SecondMemberToRemove()" && b.Kind == ChangeKind.Removal); - Assert.Single(interfaceBreakingChanges, - b => b.MemberId == "System.Void ThirdMemberToRemove()" && b.Kind == ChangeKind.Removal); - Assert.Single(interfaceBreakingChanges, - b => b.MemberId == "System.Void FirstAddedMember()" && b.Kind == ChangeKind.Addition); - Assert.Single(interfaceBreakingChanges, - b => b.MemberId == "System.Void SecondAddedMember()" && b.Kind == ChangeKind.Addition); - Assert.Single(interfaceBreakingChanges, - b => b.MemberId == "System.Void ThirdAddedMember()" && b.Kind == ChangeKind.Addition); - } - - private ApiListing CreateApiListingDocument(Assembly assembly) - { - var generator = new ApiListingGenerator(assembly, TestFilters); - - return generator.GenerateApiListing(); - } - } -} diff --git a/test/ApiCheck.Test/ApiListingGenerationTests.cs b/test/ApiCheck.Test/ApiListingGenerationTests.cs deleted file mode 100644 index c9deeefe6..000000000 --- a/test/ApiCheck.Test/ApiListingGenerationTests.cs +++ /dev/null @@ -1,1258 +0,0 @@ -using System; -using System.Linq; -using System.Reflection; -using ApiCheck.Description; -using ApiCheckApiListing.V2; -using Scenarios; -using Xunit; - -namespace ApiCheck.Test -{ - public class ApiListingGenerationTests - { - public Assembly V1Assembly => typeof(ApiCheckApiListingV1).GetTypeInfo().Assembly; - public Assembly V2Assembly => typeof(ApiCheckApiListingV2).GetTypeInfo().Assembly; - - [Fact] - public void DetectsClasses() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - Assert.Single(report.Types, t => t.Id == "public class Scenarios.BasicClass"); - } - - [Fact] - public void DetectsStructs() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - Assert.Single(report.Types, t => t.Id == "public struct Scenarios.BasicStruct"); - } - - [Fact] - public void DetectsDerivedClasses() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - Assert.Single(report.Types, t => t.Id == "public class Scenarios.DerivedClass : Scenarios.BasicClass"); - } - - [Fact] - public void DetectsBasicInterface() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - Assert.Single(report.Types, t => t.Id == "public interface Scenarios.IBasicInterface"); - } - - [Fact] - public void DetectsComplexInterface() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - Assert.Single(report.Types, t => t.Id == "public interface Scenarios.IComplexInterface : Scenarios.IBasicInterface"); - } - - [Fact] - public void DetectsInterfacesThatImplicitlyImplementOtherInterfaces() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - Assert.Single(report.Types, t => t.Id == "public interface Scenarios.IMultipleLevelInterface : Scenarios.IComplexInterface"); - } - - [Fact] - public void DetectsClassImplementingInterface() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassImplementingInterface : Scenarios.IBasicInterfaceForClass"); - } - - [Fact] - public void DetectsClassDerivingClassImplementingInterface() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassDerivingClassImplementingInterface : Scenarios.ClassImplementingInterface"); - } - - [Fact] - public void ParameterlessVoidReturningMethod() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.MethodTypesClass"); - var method = Assert.Single(type.Members, m => m.Id == "public System.Void ParameterlessVoidReturningMethod()"); - } - - [Fact] - public void DetectsProtectedIntReturningMethod() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.MethodTypesClass"); - var method = Assert.Single(type.Members, m => m.Id == "protected System.Int32 ProtectedIntReturningMethod()"); - } - - [Fact] - public void ProtectedInternalStringReturningMethodWithStringParameter() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.MethodTypesClass"); - Assert.DoesNotContain(type.Members, m => m.Id == "protected internal System.String ProtectedInternalStringReturningMethodWithStringParameter(System.String stringParameter)"); - } - - [Fact] - public void PublicClassReturningMethodWithOptionalStringParameter() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.MethodTypesClass"); - var method = Assert.Single(type.Members, m => m.Id == "public Scenarios.MethodTypesClass PublicClassReturningMethodWithOptionalStringParameter(System.String defaultParameter = \"hello\")"); - } - - [Fact] - public void PrivateBoolReturningMethodWithOptionalCharParameter() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.MethodTypesClass"); - Assert.DoesNotContain(type.Members, m => m.Id == "private System.Boolean PrivateBoolReturningMethodWithOptionalCharParameter(System.Char charParameter = 'c')"); - } - - [Fact] - public void PublicDecimalReturningMethodWithAllDefaultParameterTypes() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - var parameters = string.Join(", ", - "Scenarios.MethodTypesClass methodTypes = null", - "System.String nullString = null", - @"System.String nonNullString = ""string""", - "System.Char charDefault = 'c'", - "System.Boolean boolDefault = False", - "System.Byte byteDefault = 3", - "System.SByte sbyteDefault = 5", - "System.Int16 shortDefault = 7", - "System.UInt16 ushortDefault = 9", - "System.Int32 intDefault = 11", - "System.UInt32 uintDefault = 13", - "System.Int64 longDefault = 15", - "System.UInt64 ulongDefault = 17", - "System.Double doubleDefault = 19", - "System.Single floatDefault = 21", - "System.Decimal decimalDefault = 23.0", - "System.Threading.CancellationToken cancellation = default(System.Threading.CancellationToken)"); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.MethodTypesClass"); - var method = Assert.Single(type.Members, m => m.Id == $"public System.Decimal PublicDecimalReturningMethodWithAllDefaultParameterTypes({parameters})"); - } - - [Fact] - public void DetectsVoidReturningMethodWithParamsArgument() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.MethodTypesClass"); - var method = Assert.Single(type.Members, m => m.Id == "public System.Void VoidReturningMethodWithParamsArgument(params System.String[] stringParams)"); - } - - [Fact] - public void DetectsStaticVoidReturningMethod() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.MethodTypesClass"); - var method = Assert.Single(type.Members, m => m.Id == "public static System.Void StaticVoidReturningMethod()"); - } - - [Fact] - public void DetectsPublicNestedClass() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.NestedTypesClass+PublicNestedClass"); - } - - [Fact] - public void DetectsProtectedNestedClass() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "protected class Scenarios.NestedTypesClass+ProtectedNestedClass"); - } - - [Fact] - public void DetectsProtectedInternalNestedClass() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - Assert.Single(report.Types, t => t.Id == "protected class Scenarios.NestedTypesClass+ProtectedInternalNestedClass"); - } - - [Fact] - public void DetectsInternalNestedClass() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - Assert.DoesNotContain(report.Types, t => t.Id == "internal class Scenarios.NestedTypesClass+InternalNestedClass"); - } - - [Fact] - public void DetectsPrivateNestedClass() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - Assert.DoesNotContain(report.Types, t => t.Id == "private class Scenarios.NestedTypesClass+PrivateNestedClass"); - } - - [Fact] - public void DetectsPublicNestedInterface() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public interface Scenarios.NestedTypesClass+PublicNestedInterface"); - } - - [Fact] - public void DetectsMultipleLevelsNestedClass() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.NestedTypesClass+IntermediateNestedClass+MultiLevelNestedClass"); - } - - [Fact] - public void DetectsAbstractClass() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public abstract class Scenarios.HierarchyAbstractClass"); - } - - [Fact] - public void DetectsGenericInterfaceNestedWithinGenericClass() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public interface Scenarios.GenericsAndNestedTypes+IntermediateNonGenericNestedClass+AnotherNestedGenericClass+ILeafGenericInterface"); - } - - [Fact] - public void DetectsInstantiatedNestedGenericsCorrectly() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public interface Scenarios.GenericsAndNestedTypes+IntermediateNonGenericNestedClass+AnotherNestedGenericClass+ILeafGenericInterface"); - var method = Assert.Single(type.Members, m => m.Id == "Scenarios.GenericsAndNestedTypes+IntermediateNonGenericNestedClass+AnotherNestedGenericClass+ILeafGenericInterface MultipleLevelGenericReturnType(Scenarios.GenericsAndNestedTypes+IntermediateNonGenericNestedClass intermediate, Scenarios.GenericsAndNestedTypes+IntermediateNonGenericNestedClass+AnotherNestedGenericClass another)"); - } - - [Fact] - public void DetectsAbstractVoidMethod() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public abstract class Scenarios.HierarchyAbstractClass"); - var method = Assert.Single(type.Members, m => m.Id == "public abstract System.Void AbstractVoidMethod()"); - } - - [Fact] - public void DetectsVirtualVoidMethod() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public abstract class Scenarios.HierarchyAbstractClass"); - var method = Assert.Single(type.Members, m => m.Id == "public virtual System.Void VirtualVoidMethod()"); - } - - [Fact] - public void DetectsAbstractImplementationMethod() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.HierarchyDerivedClass : Scenarios.HierarchyAbstractClass"); - var method = Assert.Single(type.Members, m => m.Id == "public override System.Void AbstractVoidMethod()"); - } - - [Fact] - public void DetectsVirtualOverrideMethod() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.HierarchyDerivedClass : Scenarios.HierarchyAbstractClass"); - var method = Assert.Single(type.Members, m => m.Id == "public override System.Void VirtualVoidMethod()"); - } - - [Fact] - public void DetectsNewMethod() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.HierarchyDerivedClass : Scenarios.HierarchyAbstractClass"); - var method = Assert.Single(type.Members, m => m.Id == "public new System.Void NonVirtualNonAbstractMethod()"); - } - - [Fact] - public void DetectsSealedClasses() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public sealed class Scenarios.SealedDerivedClass : Scenarios.HierarchyAbstractClass"); - } - - [Fact] - public void DetectsSealedAbstractImplementationMethod() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public sealed class Scenarios.SealedDerivedClass : Scenarios.HierarchyAbstractClass"); - var method = Assert.Single(type.Members, m => m.Id == "public sealed override System.Void AbstractVoidMethod()"); - } - - [Fact] - public void DetectsSealedVirtualOverrideMethod() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public sealed class Scenarios.SealedDerivedClass : Scenarios.HierarchyAbstractClass"); - var method = Assert.Single(type.Members, m => m.Id == "public sealed override System.Void VirtualVoidMethod()"); - } - - [Fact] - public void DetectsStaticClasses() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public static class Scenarios.StaticClass"); - } - - [Fact] - public void DetectsExtensionMethods() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public static class Scenarios.ExtensionMethodsClass"); - var method = Assert.Single(type.Members, m => m.Id == "public static System.String ExtensionMethod(this System.String self)"); - } - - [Fact] - public void DetectsImmediatelyImplementedInterfaces() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.AuthorizeFilter : Scenarios.IFilterFactory"); - } - - [Fact] - public void DoesNotIncludeInterfacesWhenNotExplicitlyReimplemented() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassOverridingVirtualMethodFromBaseClass : Scenarios.IntermediateSubclassNotPartiallyOverridingImplementation"); - } - - [Fact] - public void DoesNotIncludeInterfacesWhenExtendingAnotherMoreSpecificInterfaceAndNotReimplementingAnyMethod() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ConsumesAttribute : System.Attribute, Scenarios.IConsumesActionConstraint"); - } - - [Fact] - public void DetectsExplicitlyImplementedInterfaces() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ExplicitImplementationClass : Scenarios.IInterfaceForExplicitImplementation"); - Assert.DoesNotContain(type.Members, m => m.Id == "System.Void Scenarios.IInterfaceForExplicitImplementation.ExplicitImplementationMethod()"); - } - - [Fact] - public void DetectsReimplementedInterfaceExplicitly() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassDerivingClassReimplementingInterface : Scenarios.OriginalClassImplementingInterface, Scenarios.IBasicInterfaceForInterfaceReimplementation"); - Assert.DoesNotContain(type.Members, m => m.Id == "System.Void Scenarios.IBasicInterfaceForInterfaceReimplementation.A()"); - } - - [Fact] - public void DetectsReimplementedInterfaceImplicitly() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassReimplementingInterfaceFromBaseClassWithExplicitImplementedInterface : Scenarios.ExplicitlyImplementedInterfaceBaseClass, Scenarios.IBasicInterfaceForInterfaceReimplementation"); - var method = Assert.Single(type.Members, m => m.Id == "public System.Void A()"); - } - - [Fact] - public void DetectsGenericTypes() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.GenericType"); - } - - [Fact] - public void DetectsClosedGenericTypes() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClosedGenericType : Scenarios.GenericType"); - } - - [Fact] - public void DetectsMultipleGenericTypes() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public interface Scenarios.IMultipleGenericTypes"); - } - - [Fact] - public void DetectsSemiClosedGenericTypes() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.SemiClosedGenericClass : Scenarios.IMultipleGenericTypes"); - } - - [Fact] - public void DetectsClassNewGenericTypeConstraints() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public interface Scenarios.IGenericInterfaceWithConstraints where T0 : class, new()"); - } - - [Fact] - public void DetectsStructGenericTypeConstraints() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - var type = Assert.Single(report.Types, t => t.Id == "public interface Scenarios.IGenericInterfaceWithStructConstraint where T0 : struct"); - } - - [Fact] - public void DetectsGenericInterfaceWithMultipleInterfaceConstraints() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public interface Scenarios.IGenericWithMultipleTypesAndConstraints where T0 : Scenarios.BaseClassForConstraint where T1 : Scenarios.BaseClassForConstraint, Scenarios.IInterfaceForConstraint, new() where T2 : System.Collections.Generic.IDictionary, new()"); - } - - [Fact] - public void DetectsGenericClassImplementingGenericInterfaceWithMultipleInterfaceConstraints() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassImplementingGenericWithMultipleTypesAndConstraints : Scenarios.IGenericWithMultipleTypesAndConstraints where T0 : Scenarios.BaseClassForConstraint where T1 : Scenarios.BaseClassForConstraint, Scenarios.IInterfaceForConstraint, new() where T2 : System.Collections.Generic.IDictionary, new()"); - } - - [Fact] - public void DetectsGenericMethod() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.MethodTypesClass"); - var method = Assert.Single(type.Members, m => m.Id == "public T0 GenericMethod(T0 typeClassArgument)"); - } - - [Fact] - public void DetectsGenericMethodWithMultipleGenericArguments() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.MethodTypesClass"); - var method = Assert.Single(type.Members, m => m.Id == "public T0 GenericMethodWithMultipleGenericParameters(T0 typeClassArgument)"); - } - - [Fact] - public void DetectsMethodWithGenericArgumentsFromClass() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.GenericClassForGenericMethods"); - var method = Assert.Single(type.Members, m => m.Id == "public virtual System.Void MethodWithGenericArgumentsFromClass(T0 first, T1 second)"); - } - - [Fact] - public void DetectsMethodWithGenericArgumentsFromPartiallyClosedClass() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.PartiallyClosedClass : Scenarios.GenericClassForGenericMethods"); - var method = Assert.Single(type.Members, m => m.Id == "public override System.Void MethodWithGenericArgumentsFromClass(T0 first, System.String second)"); - } - - [Fact] - public void DetectsMethodWithGenericArgumentsAndConstraints() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.GenericMethodsWithConstraintsClass"); - var method = Assert.Single(type.Members, m => m.Id == "public System.Void GenericMethod(T0 argument) where T0 : class, new()"); - } - - [Fact] - public void DetectsMethodWithGenericArgumentsAndStructConstraint() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.GenericMethodsWithConstraintsClass"); - var method = Assert.Single(type.Members, m => m.Id == "public System.Void GenericMethodWithStructParameter(T0 argument) where T0 : struct"); - } - - [Fact] - public void DetectsMethodWithGenericArgumentsAndTypeAndImplementedInterfacesConstraints() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.GenericMethodsWithConstraintsClass"); - var method = Assert.Single(type.Members, m => m.Id == "public System.Void GenericMethodWithClassAndInterfacesConstraint(T0 argument) where T0 : System.Collections.ObjectModel.Collection, System.Collections.Generic.IDictionary"); - } - - [Fact] - public void DetectsPublicFields() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassWithFields"); - var member = Assert.Single(type.Members, m => m.Id == "public System.Int32 PublicField"); - } - - [Fact] - public void DetectsReadonlyFields() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassWithFields"); - var member = Assert.Single(type.Members, m => m.Id == "public readonly System.Boolean ReadonlyField"); - } - - [Fact] - public void DetectsConstantFields() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassWithFields"); - var member = Assert.Single(type.Members, m => m.Id == "public const System.Char ConstantField = 'c'"); - } - - [Fact] - public void DetectsStaticFields() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassWithFields"); - var member = Assert.Single(type.Members, m => m.Id == "public static System.String StaticField"); - } - - [Fact] - public void DetectsStaticReadonlyFields() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassWithFields"); - var member = Assert.Single(type.Members, m => m.Id == "public static readonly System.String StaticReadonlyField"); - } - - [Fact] - public void DetectsPropertiesAsMethods() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassWithPropertiesAndEvents"); - var getter = Assert.Single(type.Members, m => m.Id == "public System.String get_GetAndSetProperty()"); - var setter = Assert.Single(type.Members, m => m.Id == "public System.Void set_GetAndSetProperty(System.String value)"); - } - - [Fact] - public void DetectsEventsAsMethods() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassWithPropertiesAndEvents"); - var getter = Assert.Single(type.Members, m => m.Id == "public System.Void add_IntEvent(System.Action value)"); - var setter = Assert.Single(type.Members, m => m.Id == "public System.Void remove_IntEvent(System.Action value)"); - } - - [Fact] - public void DetectsEnumerations() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public enum Scenarios.CanonicalEnumeration"); - } - - [Fact] - public void DetectsEnumerationsValues() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public enum Scenarios.CanonicalEnumeration"); - var firstValue = Assert.Single(type.Members, m => m.Id == "FirstValue = 0"); - var secondValue = Assert.Single(type.Members, m => m.Id == "SecondValue = 1"); - } - - [Fact] - public void DetectsEnumerationsWithDifferentSizes() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public enum Scenarios.LongEnumeration : System.Int64"); - var firstValue = Assert.Single(type.Members, m => m.Id == "FirstValue = 0"); - var secondValue = Assert.Single(type.Members, m => m.Id == "ExplicitValue = 5"); - var thirdValue = Assert.Single(type.Members, m => m.Id == "ValueAfterExplicit = 6"); - } - - [Fact] - public void DetectsConstructors() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassWithConstructors"); - var firstValue = Assert.Single(type.Members, m => m.Id == "public .ctor()"); - var secondValue = Assert.Single(type.Members, m => m.Id == "public .ctor(System.Boolean parameter)"); - var thirdValue = Assert.Single(type.Members, m => m.Id == "public .ctor(System.String parameter = \"default\", params System.Int32[] values)"); - } - - [Fact] - public void DetectsExplicitConstructorWithParameters() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.ClassWithoutImplicitParameterlessConstructor"); - var secondValue = Assert.Single(type.Members, m => m.Id == "public .ctor(System.String parameter)"); - } - - [Fact] - public void DetectsMethodParameterDirections() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.MethodTypesClass"); - var secondValue = Assert.Single(type.Members, m => m.Id == "public System.Void MethodWithParametersInDifferentDirections(System.String inParameter, out System.Boolean outParameter, ref System.Int32 refParameter)"); - } - - [Fact] - public void DetectsArrayParameters() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.MethodTypesClass"); - var secondValue = Assert.Single(type.Members, m => m.Id == "public System.Void MethodWithArrayParameter(System.Linq.Expressions.Expression>[] arrayExpression)"); - } - - [Fact] - public void DetectsParametersWithGenericTypesCorrectly() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - - var type = Assert.Single(report.Types, t => t.Id == "public class Scenarios.MethodTypesClass"); - var secondValue = Assert.Single(type.Members, m => m.Id == "public static System.Boolean TryParseList(System.Collections.Generic.IList inputs, out System.Collections.Generic.IList parsedValues)"); - } - - [Fact] - public void FiltersNonPublicOrProtectedElements() - { - // Arrange - var generator = CreateGenerator(V1Assembly); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - foreach (var type in report.Types) - { - var typeVisibility = type.Visibility; - Assert.True(typeVisibility == ApiElementVisibility.Public || - typeVisibility == ApiElementVisibility.Protected); - Assert.NotNull(type.Members); - - foreach (var member in type.Members) - { - var memberVisibility = member.Visibility; - Assert.True(memberVisibility == null || - memberVisibility == ApiElementVisibility.Public || - memberVisibility == ApiElementVisibility.Protected); - } - } - } - - [Fact] - public void FiltersMembersOnTheInternalNamespace() - { - // Arrange - var generator = CreateGenerator(V1Assembly, ApiListingFilters.IsInInternalNamespace); - - // Act - var report = generator.GenerateApiListing(); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - Assert.DoesNotContain(report.Types, type => type.Name == "Scenarios.Internal.ExcludedType"); - } - - [Fact] - public void LoadFromFiltersMembersOnTheInternalNamespace() - { - // Arrange - var serialized = @"{ - ""AssemblyIdentity"": ""Test"", - ""Types"": [ - { - ""Name"": ""Scenarios.Internal.ExcludedType"" - } - ] -}"; - - // Act - var report = ApiListingGenerator.LoadFrom(serialized, new Func[] { ApiListingFilters.IsInInternalNamespace }); - - // Assert - Assert.NotNull(report); - Assert.NotNull(report.Types); - Assert.Empty(report.Types); - } - - private ApiListingGenerator CreateGenerator(Assembly assembly, params Func[] filters) - { - filters = filters ?? new Func[] { }; - return new ApiListingGenerator(assembly, filters); - } - } -} diff --git a/test/ApiCheckBaseline.V1/ApiCheckBaseline.V1.csproj b/test/ApiCheckBaseline.V1/ApiCheckBaseline.V1.csproj deleted file mode 100644 index 137c8ec9e..000000000 --- a/test/ApiCheckBaseline.V1/ApiCheckBaseline.V1.csproj +++ /dev/null @@ -1,10 +0,0 @@ - - - - - netstandard1.6;net452;netcoreapp2.1 - false - - - - diff --git a/test/ApiCheckBaseline.V1/ComparisonScenarios.cs b/test/ApiCheckBaseline.V1/ComparisonScenarios.cs deleted file mode 100644 index 47c51ca69..000000000 --- a/test/ApiCheckBaseline.V1/ComparisonScenarios.cs +++ /dev/null @@ -1,141 +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. - -// V1 -namespace ComparisonScenarios -{ - public class TypeToBeForwarded - { - public string Name { get; set; } - } - - public class TypeToBeForwardedAndChanged - { - public string Name { get; set; } - - public string PropertyToBeRemoved { get; set; } - } - - public class PublicToInternalClass - { - } - - public interface TypeToRename - { - } - - public struct StructToMakeGeneric - { - } - - public struct StructToRemoveFieldsFrom - { - public StructToRemoveFieldsFrom(int fieldToIgnore) - { - FieldToIgnore = 0; - FieldToMakeReadonly = 3; - FieldToRemove = 4; - FieldToMakeWritable = 5; - } - - internal int FieldToIgnore; - - public const int ConstToChangeValue = 1; - - public const int ConstToMakeField = 2; - - public int FieldToMakeReadonly; - - public int FieldToRemove; - - public readonly int FieldToMakeWritable; - - public static int StaticFieldToMakeReadonly = 6; - - public static readonly int StaticFieldToMakeConst = 7; - - public static readonly int StaticFieldToMakeWritable = 8; - } - - public class ClassToRemoveFieldsFrom - { - internal int FieldToIgnore = 0; - - public const int ConstToChangeValue = 1; - - public const int ConstToMakeField = 2; - - public int FieldToMakeReadonly = 3; - - public int FieldToRemove = 4; - - public readonly int FieldToMakeWritable = 5; - - public static int StaticFieldToMakeReadonly = 6; - - public static readonly int StaticFieldToMakeConst = 7; - - public static readonly int StaticFieldToMakeWritable = 8; - } - - public class ClassToChangeNamespaces - { - } - - public class ClassToNestContainer - { - } - - public class ClassToNest - { - } - - public class ClassToUnnestContainer - { - public class ClassToUnnest - { - } - } - - public class GenericTypeWithConstraintsToBeAdded - { - } - - public class ClassWithMethods - { - public void MethodToAddParameters() { } - } - - public class TypeWithExtraInterface - { - } - - public abstract class AbstractClassToAddMethodsTo - { - } - - public abstract class AbstractClassToAddPropertiesTo - { - public abstract int PropertyToAddSetterTo { get; } - } - - public interface IInterfaceToAddMembersTo - { - bool ExistingMember { get; set; } - } - - public interface IInterfaceWithMembersThatWillGetRenamedRemovedAndAdded - { - void MemberToBeRenamed(); - void MemberToBeRemoved(); - } - - public interface IInterfaceWithSameNumberOfRemovedAndAddedMembers - { - void FirstMemberToRemove(); - void SecondMemberToRemove(); - void ThirdMemberToRemove(); - void FirstUnchangedMember(); - void SecondUnchangedMember(); - } -} diff --git a/test/ApiCheckBaseline.V1/Scenarios.cs b/test/ApiCheckBaseline.V1/Scenarios.cs deleted file mode 100644 index 395a2808a..000000000 --- a/test/ApiCheckBaseline.V1/Scenarios.cs +++ /dev/null @@ -1,483 +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.Collections.ObjectModel; -using System.Linq.Expressions; -using System.Threading; - -namespace Scenarios -{ - public class ApiCheckApiListingV1 - { - } - public class BasicClass - { - } - - public class DerivedClass : BasicClass - { - } - - public struct BasicStruct - { - } - - public interface IBasicInterface - { - } - - public interface IComplexInterface : IBasicInterface - { - } - - public interface IMultipleLevelInterface : IComplexInterface - { - } - - public interface IBasicInterfaceForClass { } - - public class ClassImplementingInterface : IBasicInterfaceForClass - { - } - - public class ClassDerivingClassImplementingInterface : ClassImplementingInterface - { - } - - public class NestedTypesClass - { - public class PublicNestedClass - { - } - - protected class ProtectedNestedClass - { - } - - protected internal class ProtectedInternalNestedClass - { - } - - internal class InternalNestedClass - { - } - - private class PrivateNestedClass - { - } - - public interface PublicNestedInterface - { - } - - public class IntermediateNestedClass - { - public class MultiLevelNestedClass - { - } - } - } - - public abstract class HierarchyAbstractClass - { - public abstract void AbstractVoidMethod(); - - public virtual void VirtualVoidMethod() - { - } - - public void NonVirtualNonAbstractMethod() - { - } - } - - public class HierarchyDerivedClass : HierarchyAbstractClass - { - public override void AbstractVoidMethod() - { - } - - public override void VirtualVoidMethod() - { - } - - public new void NonVirtualNonAbstractMethod() - { - } - } - - public sealed class SealedDerivedClass : HierarchyAbstractClass - { - public sealed override void AbstractVoidMethod() - { - } - - public sealed override void VirtualVoidMethod() - { - } - } - - public static class StaticClass - { - } - - public static class ExtensionMethodsClass - { - public static string ExtensionMethod(this string self) - { - return null; - } - } - - public interface IInterfaceForExplicitImplementation - { - void ExplicitImplementationMethod(); - } - - public class ExplicitImplementationClass : IInterfaceForExplicitImplementation - { - void IInterfaceForExplicitImplementation.ExplicitImplementationMethod() - { - throw new NotImplementedException(); - } - } - - public interface IBasicInterfaceForInterfaceReimplementation - { - void A(); - } - - public class OriginalClassImplementingInterface : IBasicInterfaceForInterfaceReimplementation - { - public void A() - { - throw new NotImplementedException(); - } - } - - public class ClassDerivingClassReimplementingInterface : OriginalClassImplementingInterface, IBasicInterfaceForInterfaceReimplementation - { - void IBasicInterfaceForInterfaceReimplementation.A() - { - } - } - - public class ExplicitlyImplementedInterfaceBaseClass : IBasicInterfaceForInterfaceReimplementation - { - void IBasicInterfaceForInterfaceReimplementation.A() - { - throw new NotImplementedException(); - } - } - - public class ClassReimplementingInterfaceFromBaseClassWithExplicitImplementedInterface : ExplicitlyImplementedInterfaceBaseClass, IBasicInterfaceForInterfaceReimplementation - { - public void A() - { - } - } - - public class GenericType - { - } - - public class ClosedGenericType : GenericType - { - } - - public interface IMultipleGenericTypes - { - } - - public class SemiClosedGenericClass : IMultipleGenericTypes - { - } - - public interface IGenericInterfaceWithConstraints - where TClassNew : class, new() - { - } - - public interface IGenericInterfaceWithStructConstraint - where TStruct : struct - { - } - - public class BaseClassForConstraint - { - } - - public class DerivedClassForConstraint : BaseClassForConstraint - { - } - - public interface IInterfaceForConstraint - { - } - - public class ImplementedInterfaceForConstraint : BaseClassForConstraint, IInterfaceForConstraint - { - } - - public interface IGenericWithMultipleTypesAndConstraints - where TKey : BaseClassForConstraint - where TValue : BaseClassForConstraint, IInterfaceForConstraint, new() - where TDictionary : IDictionary, new() - { - } - - public class ClassImplementingGenericWithMultipleTypesAndConstraints : - IGenericWithMultipleTypesAndConstraints - where TKey : BaseClassForConstraint - where TValue : BaseClassForConstraint, IInterfaceForConstraint, new() - where TDictionary : IDictionary, new() - { - } - - public class MethodTypesClass - { - public void ParameterlessVoidReturningMethod() - { - } - - protected int ProtectedIntReturningMethod() - { - return 0; - } - - protected internal string ProtectedInternalStringReturningMethodWithStringParameter(string stringParameter) - { - return null; - } - - public MethodTypesClass PublicClassReturningMethodWithOptionalStringParameter(string defaultParameter = "hello") - { - return null; - } - - private bool PrivateBoolReturningMethodWithOptionalCharParameter(char charParameter = 'c') - { - return false; - } - - public decimal PublicDecimalReturningMethodWithAllDefaultParameterTypes( - MethodTypesClass methodTypes = null, - string nullString = null, - string nonNullString = "string", - char charDefault = 'c', - bool boolDefault = false, - byte byteDefault = 3, - sbyte sbyteDefault = 5, - short shortDefault = 7, - ushort ushortDefault = 9, - int intDefault = 11, - uint uintDefault = 13, - long longDefault = 15, - ulong ulongDefault = 17, - double doubleDefault = 19, - float floatDefault = 21.0f, - decimal decimalDefault = 23.0M, - CancellationToken cancellation = default(CancellationToken)) - { - return 1.0M; - } - - public void MethodWithParametersInDifferentDirections(string inParameter, out bool outParameter, ref int refParameter) - { - outParameter = false; - refParameter = 0; - } - - public void VoidReturningMethodWithParamsArgument(params string[] stringParams) - { - } - - public static void StaticVoidReturningMethod() - { - } - - public TClassType GenericMethod(TClassType typeClassArgument) - { - return default(TClassType); - } - - public TClassType GenericMethodWithMultipleGenericParameters(TClassType typeClassArgument) - { - return default(TClassType); - } - - public void MethodWithArrayParameter(Expression>[] arrayExpression) - { - } - - public static bool TryParseList(IList inputs, out IList parsedValues) - { - parsedValues = null; - return false; - } - } - - public class GenericClassForGenericMethods - { - public virtual void MethodWithGenericArgumentsFromClass(TFirst first, TSecond second) - { - } - } - - public class PartiallyClosedClass : GenericClassForGenericMethods - { - public override void MethodWithGenericArgumentsFromClass(TFirst first, string second) - { - } - } - - public class GenericMethodsWithConstraintsClass - { - public void GenericMethod(TClassNew argument) where TClassNew : class, new() - { - } - - public void GenericMethodWithStructParameter(TStruct argument) where TStruct : struct - { - } - - public void GenericMethodWithClassAndInterfacesConstraint(TExtend argument) where TExtend : Collection, IDictionary - { - } - } - - public class ClassWithFields - { - public int PublicField; - public readonly bool ReadonlyField; - public const char ConstantField = 'c'; - public static string StaticField = "Static"; - public static readonly string StaticReadonlyField = "StaticReadonly"; - } - - public class ClassWithPropertiesAndEvents - { - public string GetAndSetProperty { get; set; } - public event Action IntEvent - { - add { } - remove { } - } - } - - public enum CanonicalEnumeration - { - FirstValue, - SecondValue - } - - public enum LongEnumeration : long - { - FirstValue, - ExplicitValue = 5, - ValueAfterExplicit - } - - public class ClassWithConstructors - { - // Parameterless - public ClassWithConstructors() - { - } - - // Different visibility and a parameter - public ClassWithConstructors(bool parameter) - { - } - - public ClassWithConstructors(string parameter = "default", params int[] values) - { - } - } - - public class ClassWithoutImplicitParameterlessConstructor - { - public ClassWithoutImplicitParameterlessConstructor(string parameter) - { - } - } - - public class AuthorizeFilter : IFilterFactory - { - } - - public interface IFilterFactory : IFilterMetadata - { - } - - public interface IFilterMetadata - { - } - - public class ClassOverridingVirtualMethodFromBaseClass : IntermediateSubclassNotPartiallyOverridingImplementation - { - public override bool CanWrite(object value) => false; - } - - public class IntermediateSubclassNotPartiallyOverridingImplementation : BaseClassImplementingInterface - { - public sealed override void Write(bool value) - { - base.Write(value); - } - } - - public class BaseClassImplementingInterface : IBaseInterface - { - public virtual bool CanWrite(object value) => false; - public virtual void Write(bool value) - { - } - } - - public interface IBaseInterface - { - bool CanWrite(object value); - void Write(bool value); - } - - public class ConsumesAttribute : Attribute, IConsumesActionConstraint - { - public bool Accept() => true; - } - - public interface IConsumesActionConstraint : IActionConstraint - { - } - - public interface IActionConstraint : IFilterMetadata - { - bool Accept(); - } - - public class GenericsAndNestedTypes - { - public class IntermediateNonGenericNestedClass - { - public class AnotherNestedGenericClass - { - public interface ILeafGenericInterface - { - void GenericMethod(); - void NonGenericMethod(); - - ILeafGenericInterface MultipleLevelGenericReturnType(IntermediateNonGenericNestedClass intermediate, AnotherNestedGenericClass another); - } - } - } - } -} - -namespace Scenarios.Internal -{ - public class ExcludedType - { - } -} \ No newline at end of file diff --git a/test/ApiCheckBaseline.V2/ApiCheckBaseline.V2.csproj b/test/ApiCheckBaseline.V2/ApiCheckBaseline.V2.csproj deleted file mode 100644 index 58f5a49cc..000000000 --- a/test/ApiCheckBaseline.V2/ApiCheckBaseline.V2.csproj +++ /dev/null @@ -1,14 +0,0 @@ - - - - - netstandard1.6;net452;netcoreapp2.1 - false - - - - - - - - diff --git a/test/ApiCheckBaseline.V2/ComparisonScenarios.cs b/test/ApiCheckBaseline.V2/ComparisonScenarios.cs deleted file mode 100644 index 6e8093cd1..000000000 --- a/test/ApiCheckBaseline.V2/ComparisonScenarios.cs +++ /dev/null @@ -1,150 +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.Collections.Generic; -using System.Runtime.CompilerServices; - -// V2 -[assembly: TypeForwardedTo(typeof(ComparisonScenarios.TypeToBeForwarded))] -[assembly: TypeForwardedTo(typeof(ComparisonScenarios.TypeToBeForwardedAndChanged))] - -namespace ComparisonScenarios -{ - internal class PublicToInternalClass - { - } - - public interface TypeToRenameRenamed - { - } - - public struct StructToMakeGeneric - { - } - - public struct StructToRemoveFieldsFrom - { - public StructToRemoveFieldsFrom(int fieldToIgnore) - { - FieldToMakeReadonly = 3; - FieldToMakeWritable = 5; - } - - public const int ConstToChangeValue = 0; - - public static readonly int ConstToMakeField = 2; - - public readonly int FieldToMakeReadonly; - - public int FieldToMakeWritable; - - public static readonly int StaticFieldToMakeReadonly = 6; - - public const int StaticFieldToMakeConst = 7; - - public static int StaticFieldToMakeWritable = 8; - } - - public class ClassToRemoveFieldsFrom - { - public const int ConstToChangeValue = 0; - - public static readonly int ConstToMakeField = 2; - - public readonly int FieldToMakeReadonly = 3; - - public int FieldToMakeWritable = 5; - - public static readonly int StaticFieldToMakeReadonly = 6; - - public const int StaticFieldToMakeConst = 7; - - public static int StaticFieldToMakeWritable = 8; - } - - public class ClassToNestContainer - { - public class ClassToNest - { - } - } - - public class ClassToUnnestContainer - { - } - - public class ClassToUnnest - { - } - - public class GenericTypeWithConstraintsToBeAdded where TToConstrain : IEnumerable, new() - { - } - - public class ClassWithMethods - { - public void MethodToAddParameters(int addedParameter) { } - } - - public class TypeWithExtraInterface : IExtraInterface - { - public int Property { get; set; } - } - - public interface IExtraInterface - { - int Property { get; set; } - } - - public abstract class AbstractClassToAddMethodsTo - { - public abstract void NewAbstractMethod(); - - public virtual void NewVirtualMethod() { } - - public void NewMethod() { } - - internal abstract void NewInternalMethod(); - } - - public abstract class AbstractClassToAddPropertiesTo - { - public abstract int NewAbstractProperty { get; } - - public abstract int PropertyToAddSetterTo { get; set; } - - public int NewProperty => 0; - - public virtual int NewVirtualProperty => 0; - - internal abstract int NewInternalProperty { get; } - } - - public interface IInterfaceToAddMembersTo - { - bool ExistingMember { get; set; } - int NewMember { get; set; } - } - - public interface IInterfaceWithMembersThatWillGetRenamedRemovedAndAdded - { - void RenamedMember(); - void AddedMember(); - } - - public interface IInterfaceWithSameNumberOfRemovedAndAddedMembers - { - void FirstUnchangedMember(); - void SecondUnchangedMember(); - void FirstAddedMember(); - void SecondAddedMember(); - void ThirdAddedMember(); - } -} - -namespace ComparisonScenarios.ChangedNamespace -{ - public class ClassToChangeNamespaces - { - } -} diff --git a/test/ApiCheckBaseline.V2/Scenarios.cs b/test/ApiCheckBaseline.V2/Scenarios.cs deleted file mode 100644 index 1ffc918ad..000000000 --- a/test/ApiCheckBaseline.V2/Scenarios.cs +++ /dev/null @@ -1,9 +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. - -namespace ApiCheckApiListing.V2 -{ - public class ApiCheckApiListingV2 - { - } -} diff --git a/test/ApiCheckForwardDestination/ApiCheckForwardDestination.csproj b/test/ApiCheckForwardDestination/ApiCheckForwardDestination.csproj deleted file mode 100644 index 9e353503c..000000000 --- a/test/ApiCheckForwardDestination/ApiCheckForwardDestination.csproj +++ /dev/null @@ -1,10 +0,0 @@ - - - - - netstandard1.6;net452;netcoreapp2.1 - false - - - - diff --git a/test/ApiCheckForwardDestination/ComparisonScenarios.cs b/test/ApiCheckForwardDestination/ComparisonScenarios.cs deleted file mode 100644 index 81f050d9c..000000000 --- a/test/ApiCheckForwardDestination/ComparisonScenarios.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace ComparisonScenarios -{ - public class TypeToBeForwarded - { - public string Name { get; set; } - } - - public class TypeToBeForwardedAndChanged - { - public string Name { get; set; } - } -} diff --git a/test/KoreBuild.FunctionalTests/Utilities/RepoTestFixture.cs b/test/KoreBuild.FunctionalTests/Utilities/RepoTestFixture.cs index ea5edaff7..d9d3e5dd1 100644 --- a/test/KoreBuild.FunctionalTests/Utilities/RepoTestFixture.cs +++ b/test/KoreBuild.FunctionalTests/Utilities/RepoTestFixture.cs @@ -16,7 +16,6 @@ public class RepoTestFixture : IDisposable { "Internal.AspNetCore.Sdk", "Internal.AspNetCore.SiteExtension.Sdk", - "Microsoft.AspNetCore.BuildTools.ApiCheck", }; private static readonly string _solutionDir; From 5cffc08c5a7fe72abfb1a130a78080c8503d42d7 Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 2 May 2019 11:10:57 -0700 Subject: [PATCH 171/192] Update SDK version (#963) --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 0fa1bdc8c..863619f9f 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -2.2.102 +2.2.106 From cf46c211ec0918aad9668d8b9c69b05490d7cf98 Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 2 May 2019 11:11:02 -0700 Subject: [PATCH 172/192] Update SDK version (#962) --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index e847ca8a6..613650be2 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview4-011136 \ No newline at end of file +3.0.100-preview5-011568 \ No newline at end of file From ec244eafdc277b29813c81e19e9e9768cad8839a Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 15 May 2019 09:00:41 -0700 Subject: [PATCH 173/192] Obsolete RepositoryRoot property, replace with RepoRoot (#975) --- Directory.Build.props | 2 +- build/repo.targets | 6 +++--- build/tasks/RepoTasks.csproj | 4 ++-- docs/Logging.md | 2 +- files/KoreBuild/KoreBuild.Common.props | 12 +++++++----- files/KoreBuild/KoreBuild.Common.targets | 6 +++--- files/KoreBuild/KoreBuild.proj | 10 +++++----- files/KoreBuild/Project.Inspection.targets | 2 ++ files/KoreBuild/modules/projectbuild/module.targets | 4 ++-- files/KoreBuild/modules/sharedsources/module.props | 2 +- files/KoreBuild/modules/sharedsources/module.targets | 3 ++- .../modules/sharedsources/sharedsources.csproj | 11 ++++++----- files/KoreBuild/modules/solutionbuild/module.targets | 12 ++++++------ files/KoreBuild/scripts/KoreBuild.psm1 | 2 +- files/KoreBuild/scripts/invoke-repository-build.sh | 2 +- modules/BuildTools.Tasks/module.targets | 2 +- modules/KoreBuild.Tasks/CodeSign.props | 4 ++-- modules/KoreBuild.Tasks/module.props | 2 +- modules/KoreBuild.Tasks/module.targets | 4 ++-- modules/NuGetPackageVerifier/module.targets | 2 +- 20 files changed, 50 insertions(+), 44 deletions(-) diff --git a/Directory.Build.props b/Directory.Build.props index c601c054a..cd5dd6049 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -13,7 +13,7 @@ https://github.com/aspnet/BuildTools git - $(MSBuildThisFileDirectory) + $(MSBuildThisFileDirectory) diff --git a/build/repo.targets b/build/repo.targets index 5f90e60fa..929eb1653 100644 --- a/build/repo.targets +++ b/build/repo.targets @@ -48,7 +48,7 @@ - + @@ -61,7 +61,7 @@ - <_ModuleProjects Include="$(RepositoryRoot)modules\%(KoreBuildModule.Identity)\%(Identity).*proj"> + <_ModuleProjects Include="$(RepoRoot)modules\%(KoreBuildModule.Identity)\%(Identity).*proj"> Version=$(Version);PublishDir=$(_KoreBuildIntermediateDir)modules\%(Identity)\ @@ -75,7 +75,7 @@ - + diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index 23ea933e2..2cd67707e 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -1,5 +1,5 @@ - + netcoreapp3.0 @@ -19,5 +19,5 @@ - + diff --git a/docs/Logging.md b/docs/Logging.md index 610222c38..c81d55e14 100644 --- a/docs/Logging.md +++ b/docs/Logging.md @@ -1,7 +1,7 @@ Logging ------- -KoreBuild produces log files to $(RepositoryRoot)/artifacts/logs. The following log formats can be used: +KoreBuild produces log files to $(RepoRoot)/artifacts/logs. The following log formats can be used: ## Binary Logger diff --git a/files/KoreBuild/KoreBuild.Common.props b/files/KoreBuild/KoreBuild.Common.props index c2fa69dab..7c3efef4e 100644 --- a/files/KoreBuild/KoreBuild.Common.props +++ b/files/KoreBuild/KoreBuild.Common.props @@ -33,17 +33,19 @@ Default layout and configuration. Release Debug $(BuildProperties);Configuration=$(Configuration) - $(MSBuildStartupDirectory) - $([MSBuild]::NormalizeDirectory('$(RepositoryRoot)')) - $([MSBuild]::NormalizeDirectory('$(RepositoryRoot)'))artifacts\ + $(MSBuildStartupDirectory) + $([MSBuild]::NormalizeDirectory('$(RepoRoot)')) + + $(RepoRoot) + $([MSBuild]::NormalizeDirectory('$(RepoRoot)'))artifacts\ $(ArtifactsDir)build\ $(ArtifactsDir)logs\ - $([MSBuild]::NormalizeDirectory('$(RepositoryRoot)'))obj\ + $([MSBuild]::NormalizeDirectory('$(RepoRoot)'))obj\ $(NUGET_PACKAGES) $(USERPROFILE)\.nuget\packages\ $(HOME)\.nuget\packages\ - $(RepositoryRoot)\.nuget\packages\ + $(RepoRoot)\.nuget\packages\ $([MSBuild]::NormalizeDirectory('$(NuGetPackageRoot)')) diff --git a/files/KoreBuild/KoreBuild.Common.targets b/files/KoreBuild/KoreBuild.Common.targets index 4ce7bd2d7..56ec37890 100644 --- a/files/KoreBuild/KoreBuild.Common.targets +++ b/files/KoreBuild/KoreBuild.Common.targets @@ -19,7 +19,7 @@ after all other property imports. $(Version) $(BuildProperties);RepoVersion=$(Version);RepoPackageVersion=$(PackageVersion) - $(BuildProperties);VerifyVersion=false + $(BuildProperties);VerifyVersion=false - + - - - + + + - + diff --git a/files/KoreBuild/Project.Inspection.targets b/files/KoreBuild/Project.Inspection.targets index 2b39c7bd7..b88c67084 100644 --- a/files/KoreBuild/Project.Inspection.targets +++ b/files/KoreBuild/Project.Inspection.targets @@ -41,6 +41,7 @@ $([MSBuild]::Escape($(TargetFrameworks))) $(PackageType) $(RepositoryRoot) + $(RepoRoot) $(RepositoryUrl) $(PackageArtifactCategory) $(PackageSigningCertName) @@ -58,6 +59,7 @@ $(IncludeSource) $(PackageType) $(RepositoryRoot) + $(RepoRoot) $(RepositoryUrl) $(PackageArtifactCategory) $(PackageSigningCertName) diff --git a/files/KoreBuild/modules/projectbuild/module.targets b/files/KoreBuild/modules/projectbuild/module.targets index 9657836c8..15c23d7e3 100644 --- a/files/KoreBuild/modules/projectbuild/module.targets +++ b/files/KoreBuild/modules/projectbuild/module.targets @@ -11,7 +11,7 @@ FYI: targets, properties, and items that begin with an underscore are meant to b - + @@ -56,7 +56,7 @@ Executes /t:{Target} on all projects - + diff --git a/files/KoreBuild/modules/sharedsources/module.props b/files/KoreBuild/modules/sharedsources/module.props index a31ab89b3..207c020f7 100644 --- a/files/KoreBuild/modules/sharedsources/module.props +++ b/files/KoreBuild/modules/sharedsources/module.props @@ -1,6 +1,6 @@ - $(RepositoryRoot)shared/ + $(RepoRoot)shared/ diff --git a/files/KoreBuild/modules/sharedsources/module.targets b/files/KoreBuild/modules/sharedsources/module.targets index a7a679719..61203e8c6 100644 --- a/files/KoreBuild/modules/sharedsources/module.targets +++ b/files/KoreBuild/modules/sharedsources/module.targets @@ -3,7 +3,7 @@ Target: PackSharedSources Creates a content files package for all each directory in -that matches "$(RepositoryRoot)/shared/*.Sources". +that matches "$(RepoRoot)/shared/*.Sources". ################################################################### --> @@ -40,6 +40,7 @@ that matches "$(RepositoryRoot)/shared/*.Sources". <_SharedSourcesPackageProperties> RepositoryRoot=$(RepositoryRoot); + RepoRoot=$(RepoRoot); ImportDirectoryBuildProps=false; <_SharedSourcesPackageProperties Condition=" '$(OverridePackageOutputPath)' != 'false' "> diff --git a/files/KoreBuild/modules/sharedsources/sharedsources.csproj b/files/KoreBuild/modules/sharedsources/sharedsources.csproj index 326d3503f..cca4e3e35 100644 --- a/files/KoreBuild/modules/sharedsources/sharedsources.csproj +++ b/files/KoreBuild/modules/sharedsources/sharedsources.csproj @@ -13,23 +13,23 @@ - + - + - + true true - $(RepositoryRoot)artifacts\build + $(RepoRoot)artifacts\build netstandard1.0 false $(ProjectDirName) @@ -78,6 +78,7 @@ $(NormalizedPackageVersion) $(TargetFramework) $(RepositoryRoot) + $(RepoRoot) $(RepositoryUrl) $(PackageArtifactCategory) true diff --git a/files/KoreBuild/modules/solutionbuild/module.targets b/files/KoreBuild/modules/solutionbuild/module.targets index 1f08e1f3b..1a14e38d5 100644 --- a/files/KoreBuild/modules/solutionbuild/module.targets +++ b/files/KoreBuild/modules/solutionbuild/module.targets @@ -9,14 +9,14 @@ FYI: targets, properties, and items that begin with an underscore are meant to b - - + + - <_FunctionalTests Include="$(RepositoryRoot)test\*\*FunctionalTest*.csproj" Exclude="@(ExcludeFromTest)" /> - + <_FunctionalTests Include="$(RepoRoot)test\*\*FunctionalTest*.csproj" Exclude="@(ExcludeFromTest)" /> + - + @@ -59,7 +59,7 @@ Executes /t:{Target} on all solutions - + diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index c09ab3e20..b25b8ecfe 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -94,7 +94,7 @@ function Invoke-RepositoryBuild( /verbosity:minimal /p:KoreBuildVersion=$koreBuildVersion /p:SuppressNETCoreSdkPreviewMessage=true -/p:RepositoryRoot="$Path\\" +/p:RepoRoot="$Path\\" "$msBuildLogArgument" "$makeFileProj" "@ diff --git a/files/KoreBuild/scripts/invoke-repository-build.sh b/files/KoreBuild/scripts/invoke-repository-build.sh index 672066a45..739fed80f 100755 --- a/files/KoreBuild/scripts/invoke-repository-build.sh +++ b/files/KoreBuild/scripts/invoke-repository-build.sh @@ -94,7 +94,7 @@ cat > "$msbuild_response_file" < - + <_ResxTargets>$(MSBuildThisFileDirectory)Project.CSharp.Resx.targets diff --git a/modules/KoreBuild.Tasks/CodeSign.props b/modules/KoreBuild.Tasks/CodeSign.props index fed0d924f..382a7aee1 100644 --- a/modules/KoreBuild.Tasks/CodeSign.props +++ b/modules/KoreBuild.Tasks/CodeSign.props @@ -5,12 +5,12 @@ true - $(RepositoryRoot)build\signcheck.exclusions.txt + $(RepoRoot)build\signcheck.exclusions.txt $(ArtifactsDir) - $(RepositoryRoot) + $(RepoRoot) true diff --git a/modules/KoreBuild.Tasks/module.props b/modules/KoreBuild.Tasks/module.props index 1bc7ebbd4..ad0f5c62a 100644 --- a/modules/KoreBuild.Tasks/module.props +++ b/modules/KoreBuild.Tasks/module.props @@ -61,7 +61,7 @@ Specifies a required .NET Core SDK. Examples: - + --> $(DefaultDotNetAssetArch) diff --git a/modules/KoreBuild.Tasks/module.targets b/modules/KoreBuild.Tasks/module.targets index 3cce8d116..01c047af4 100644 --- a/modules/KoreBuild.Tasks/module.targets +++ b/modules/KoreBuild.Tasks/module.targets @@ -5,8 +5,8 @@ GetToolsets;$(PrepareDependsOn) InstallDotNet;$(RestoreDependsOn) - $(RepositoryRoot)korebuild.json - $(RepositoryRoot)build\dependencies.props + $(RepoRoot)korebuild.json + $(RepoRoot)build\dependencies.props - $(RepositoryRoot)NuGetPackageVerifier.json + $(RepoRoot)NuGetPackageVerifier.json From bbca0a3b9f3f695c7090b6490ad945e3dd6f9f05 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 30 May 2019 12:40:15 -0700 Subject: [PATCH 174/192] Add KOREBUILD_DISABLE_DOTNET_ARCH - set this to suppress including arch in the install path for dotnet on Windows --- files/KoreBuild/scripts/KoreBuild.psm1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index b25b8ecfe..93a773f36 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -166,7 +166,7 @@ function Install-Tools( $DotNetHome = Resolve-Path $DotNetHome $arch = __get_dotnet_arch - $installDir = if ($IS_WINDOWS) { Join-Path $DotNetHome $arch } else { $DotNetHome } + $installDir = if ($IS_WINDOWS -and -not $env:KOREBUILD_DISABLE_DOTNET_ARCH) { Join-Path $DotNetHome $arch } else { $DotNetHome } Write-Verbose "Installing tools to '$installDir'" if ($env:DOTNET_INSTALL_DIR -and $env:DOTNET_INSTALL_DIR -ne $installDir) { # DOTNET_INSTALL_DIR is used by dotnet-install.ps1 only, and some repos used it in their automation to isolate dotnet. @@ -323,7 +323,7 @@ function Set-KoreBuildSettings( $env:NUGET_PACKAGES = $env:NUGET_PACKAGES.TrimEnd('\') + '\' $arch = __get_dotnet_arch - $env:DOTNET_ROOT = if ($IS_WINDOWS) { Join-Path $DotNetHome $arch } else { $DotNetHome } + $env:DOTNET_ROOT = if ($IS_WINDOWS -and -not $env:KOREBUILD_DISABLE_DOTNET_ARCH) { Join-Path $DotNetHome $arch } else { $DotNetHome } $MSBuildType = 'core' $toolsets = $Null From 69c18d0f2daf8e292e49c39dde8b41265d3d644a Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 30 May 2019 15:51:15 -0700 Subject: [PATCH 175/192] Remove Internal.AspNetCore.Sdk and unused build tasks (#976) --- BuildTools.sln | 23 +- .../tasks}/GenerateSvgBadge.cs | 12 +- build/tasks/RepoTasks.csproj | 10 +- build/tasks/ZipArchive.cs | 6 - .../modules/benchmarks/module.targets | 8 +- files/KoreBuild/modules/vstest/module.targets | 6 +- .../BuildTools.Tasks/BuildTools.Tasks.csproj | 30 -- .../BuildTools.Tasks/BuildTools.Tasks.props | 10 - .../GenerateResxDesignerFiles.cs | 282 ------------------ .../GetAssemblyFileVersion.cs | 49 --- .../Project.CSharp.Resx.targets | 21 -- .../Properties/InternalsVisibleTo.cs | 6 - modules/BuildTools.Tasks/Publish.targets | 19 -- modules/BuildTools.Tasks/Run.cs | 35 --- modules/BuildTools.Tasks/RunBase.cs | 159 ---------- modules/BuildTools.Tasks/RunDotNet.cs | 30 -- .../Utilities/IndentedTextWriter.cs | 36 --- .../Utilities/TextWriterExtensions.cs | 13 - modules/BuildTools.Tasks/_._ | 0 modules/BuildTools.Tasks/module.props | 11 - modules/BuildTools.Tasks/module.targets | 28 -- modules/KoreBuild.Tasks/CodeSign.targets | 3 +- modules/KoreBuild.Tasks/InstallDotNet.cs | 2 +- .../KoreBuild.Tasks/KoreBuild.Tasks.csproj | 8 +- .../NuGetPackageVerifier.Console.csproj | 4 +- .../msbuild/NuGetPackageVerifier.Task.csproj | 4 +- .../FileHelpers.cs | 0 .../GenerateFileFromTemplate.cs | 8 +- .../Internal.AspNetCore.BuildTasks.csproj | 22 ++ .../MSBuildListSplitter.cs | 0 .../Internal.AspNetCore.BuildTasks.props | 9 + .../Internal.AspNetCore.Sdk.csproj | 44 --- .../Internal.AspNetCore.Sdk.nuspec | 20 -- src/Internal.AspNetCore.Sdk/_._ | 0 .../build/Common.props | 68 ----- .../build/Common.targets | 59 ---- .../build/GenerateAssemblyInfo.targets | 52 ---- .../build/Internal.AspNetCore.Sdk.props | 9 - .../build/Internal.AspNetCore.Sdk.targets | 16 - .../Internal.AspNetCore.Sdk.props | 18 -- .../Internal.AspNetCore.Sdk.targets | 23 -- src/Internal.AspNetCore.Sdk/sdk/Sdk.props | 10 - src/Internal.AspNetCore.Sdk/sdk/Sdk.targets | 12 - .../BuildTasks.Tests.csproj} | 6 +- .../GenerateFileFromTemplateTests.cs | 0 .../GenerateResxDesignerFilesTest.cs | 45 --- .../GetAssemblyFileVersionTest.cs | 48 --- .../Resources/Strings.Designer.cs.txt | 44 --- .../Resources/Strings.resx | 123 -------- .../Resources/sampledata.json | 11 - test/BuildTools.Tasks.Tests/RunTaskTests.cs | 26 -- .../KoreBuild.FunctionalTests.csproj | 5 +- .../KoreBuild.Tasks.Tests.csproj | 4 +- .../NuGetPackageVerifier.Tests.csproj | 4 +- 54 files changed, 64 insertions(+), 1437 deletions(-) rename {modules/BuildTools.Tasks => build/tasks}/GenerateSvgBadge.cs (92%) delete mode 100644 modules/BuildTools.Tasks/BuildTools.Tasks.csproj delete mode 100644 modules/BuildTools.Tasks/BuildTools.Tasks.props delete mode 100644 modules/BuildTools.Tasks/GenerateResxDesignerFiles.cs delete mode 100644 modules/BuildTools.Tasks/GetAssemblyFileVersion.cs delete mode 100644 modules/BuildTools.Tasks/Project.CSharp.Resx.targets delete mode 100644 modules/BuildTools.Tasks/Properties/InternalsVisibleTo.cs delete mode 100644 modules/BuildTools.Tasks/Publish.targets delete mode 100644 modules/BuildTools.Tasks/Run.cs delete mode 100644 modules/BuildTools.Tasks/RunBase.cs delete mode 100644 modules/BuildTools.Tasks/RunDotNet.cs delete mode 100644 modules/BuildTools.Tasks/Utilities/IndentedTextWriter.cs delete mode 100644 modules/BuildTools.Tasks/Utilities/TextWriterExtensions.cs delete mode 100644 modules/BuildTools.Tasks/_._ delete mode 100644 modules/BuildTools.Tasks/module.props delete mode 100644 modules/BuildTools.Tasks/module.targets rename {modules/BuildTools.Tasks/Utilities => src/Internal.AspNetCore.BuildTasks}/FileHelpers.cs (100%) rename {modules/BuildTools.Tasks => src/Internal.AspNetCore.BuildTasks}/GenerateFileFromTemplate.cs (95%) create mode 100644 src/Internal.AspNetCore.BuildTasks/Internal.AspNetCore.BuildTasks.csproj rename {shared/Utilities => src/Internal.AspNetCore.BuildTasks}/MSBuildListSplitter.cs (100%) create mode 100644 src/Internal.AspNetCore.BuildTasks/build/Internal.AspNetCore.BuildTasks.props delete mode 100644 src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj delete mode 100644 src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec delete mode 100644 src/Internal.AspNetCore.Sdk/_._ delete mode 100644 src/Internal.AspNetCore.Sdk/build/Common.props delete mode 100644 src/Internal.AspNetCore.Sdk/build/Common.targets delete mode 100644 src/Internal.AspNetCore.Sdk/build/GenerateAssemblyInfo.targets delete mode 100644 src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.props delete mode 100644 src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets delete mode 100644 src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.props delete mode 100644 src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.targets delete mode 100644 src/Internal.AspNetCore.Sdk/sdk/Sdk.props delete mode 100644 src/Internal.AspNetCore.Sdk/sdk/Sdk.targets rename test/{BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj => BuildTasks.Tests/BuildTasks.Tests.csproj} (73%) rename test/{BuildTools.Tasks.Tests => BuildTasks.Tests}/GenerateFileFromTemplateTests.cs (100%) delete mode 100644 test/BuildTools.Tasks.Tests/GenerateResxDesignerFilesTest.cs delete mode 100644 test/BuildTools.Tasks.Tests/GetAssemblyFileVersionTest.cs delete mode 100644 test/BuildTools.Tasks.Tests/Resources/Strings.Designer.cs.txt delete mode 100644 test/BuildTools.Tasks.Tests/Resources/Strings.resx delete mode 100644 test/BuildTools.Tasks.Tests/Resources/sampledata.json delete mode 100644 test/BuildTools.Tasks.Tests/RunTaskTests.cs diff --git a/BuildTools.sln b/BuildTools.sln index 0eb74a9a7..7ef78b100 100644 --- a/BuildTools.sln +++ b/BuildTools.sln @@ -40,11 +40,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetPackageVerifier.Consol EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetPackageVerifier.Task", "modules\NuGetPackageVerifier\msbuild\NuGetPackageVerifier.Task.csproj", "{EF38C1CA-8A2E-4C8E-B478-7072C0140514}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Internal.AspNetCore.Sdk", "src\Internal.AspNetCore.Sdk\Internal.AspNetCore.Sdk.csproj", "{F0E4CF2B-29B9-432B-BF27-195996CA24FD}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BuildTools.Tasks", "modules\BuildTools.Tasks\BuildTools.Tasks.csproj", "{6A631446-BBDD-4743-B576-7F9793B6BE45}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BuildTools.Tasks.Tests", "test\BuildTools.Tasks.Tests\BuildTools.Tasks.Tests.csproj", "{211858CA-6E82-4EFD-9960-8D023EEB789F}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Internal.AspNetCore.BuildTasks", "src\Internal.AspNetCore.BuildTasks\Internal.AspNetCore.BuildTasks.csproj", "{F0E4CF2B-29B9-432B-BF27-195996CA24FD}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KoreBuild.FunctionalTests", "test\KoreBuild.FunctionalTests\KoreBuild.FunctionalTests.csproj", "{D5D1BD88-1781-4448-89DD-3E62C95D3A77}" EndProject @@ -72,6 +68,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KoreBuild.Tasks.Tests", "te EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NuGetPackageVerifier.Tests", "test\NuGetPackageVerifier.Tests\NuGetPackageVerifier.Tests.csproj", "{439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BuildTasks.Tests", "test\BuildTasks.Tests\BuildTasks.Tests.csproj", "{917C539F-4A6A-4CA0-B6E5-D50F383718A6}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -90,14 +88,6 @@ Global {F0E4CF2B-29B9-432B-BF27-195996CA24FD}.Debug|Any CPU.Build.0 = Debug|Any CPU {F0E4CF2B-29B9-432B-BF27-195996CA24FD}.Release|Any CPU.ActiveCfg = Release|Any CPU {F0E4CF2B-29B9-432B-BF27-195996CA24FD}.Release|Any CPU.Build.0 = Release|Any CPU - {6A631446-BBDD-4743-B576-7F9793B6BE45}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6A631446-BBDD-4743-B576-7F9793B6BE45}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6A631446-BBDD-4743-B576-7F9793B6BE45}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6A631446-BBDD-4743-B576-7F9793B6BE45}.Release|Any CPU.Build.0 = Release|Any CPU - {211858CA-6E82-4EFD-9960-8D023EEB789F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {211858CA-6E82-4EFD-9960-8D023EEB789F}.Debug|Any CPU.Build.0 = Debug|Any CPU - {211858CA-6E82-4EFD-9960-8D023EEB789F}.Release|Any CPU.ActiveCfg = Release|Any CPU - {211858CA-6E82-4EFD-9960-8D023EEB789F}.Release|Any CPU.Build.0 = Release|Any CPU {D5D1BD88-1781-4448-89DD-3E62C95D3A77}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {D5D1BD88-1781-4448-89DD-3E62C95D3A77}.Debug|Any CPU.Build.0 = Debug|Any CPU {D5D1BD88-1781-4448-89DD-3E62C95D3A77}.Release|Any CPU.ActiveCfg = Release|Any CPU @@ -114,6 +104,10 @@ Global {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Debug|Any CPU.Build.0 = Debug|Any CPU {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Release|Any CPU.ActiveCfg = Release|Any CPU {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2}.Release|Any CPU.Build.0 = Release|Any CPU + {917C539F-4A6A-4CA0-B6E5-D50F383718A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {917C539F-4A6A-4CA0-B6E5-D50F383718A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {917C539F-4A6A-4CA0-B6E5-D50F383718A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {917C539F-4A6A-4CA0-B6E5-D50F383718A6}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -122,13 +116,12 @@ Global {657AFF5E-164E-493D-8501-8026B7C20808} = {C0E43505-F8EB-4B7F-B84D-5961F9763945} {EF38C1CA-8A2E-4C8E-B478-7072C0140514} = {C0E43505-F8EB-4B7F-B84D-5961F9763945} {F0E4CF2B-29B9-432B-BF27-195996CA24FD} = {A4F4353B-C3D2-40B0-909A-5B48A748EA76} - {6A631446-BBDD-4743-B576-7F9793B6BE45} = {BD3545FB-5520-43DF-B4F9-83BEA3A38ECA} - {211858CA-6E82-4EFD-9960-8D023EEB789F} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} {D5D1BD88-1781-4448-89DD-3E62C95D3A77} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} {020ED083-4076-4711-A52B-2F89EA884F9B} = {BD3545FB-5520-43DF-B4F9-83BEA3A38ECA} {C0E43505-F8EB-4B7F-B84D-5961F9763945} = {BD3545FB-5520-43DF-B4F9-83BEA3A38ECA} {A3A81E93-0157-406F-A43C-C163F7F781A9} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} {439CC7A3-F6E6-46B8-B6A0-05E22E558FC2} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} + {917C539F-4A6A-4CA0-B6E5-D50F383718A6} = {60A938B2-D95A-403C-AA7A-3683AD64DFA0} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {1B8809C8-A6C3-4761-BC91-B12841F49AE1} diff --git a/modules/BuildTools.Tasks/GenerateSvgBadge.cs b/build/tasks/GenerateSvgBadge.cs similarity index 92% rename from modules/BuildTools.Tasks/GenerateSvgBadge.cs rename to build/tasks/GenerateSvgBadge.cs index 14a45afbd..a755ed756 100644 --- a/modules/BuildTools.Tasks/GenerateSvgBadge.cs +++ b/build/tasks/GenerateSvgBadge.cs @@ -12,15 +12,8 @@ namespace Microsoft.AspNetCore.BuildTools /// /// Generates an SVG file badge that can be embedded into a markdown page /// -#if SDK - public class Sdk_GenerateSvgBadge : Microsoft.Build.Utilities.Task - { -#elif BuildTools public class GenerateSvgBadge : Microsoft.Build.Utilities.Task { -#else -#error This must be built either for an SDK or for BuildTools -#endif private static readonly string Template = @" @@ -76,11 +69,8 @@ public override bool Execute() Log.LogError("Color cannot be an empty string"); return false; } -#if SDK - var generator = new Sdk_GenerateFileFromTemplate() -#else + var generator = new GenerateFileFromTemplate() -#endif { BuildEngine = BuildEngine, OutputPath = OutputPath, diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index 2cd67707e..e321cc07f 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -10,13 +10,9 @@ - - - - - - - + + + diff --git a/build/tasks/ZipArchive.cs b/build/tasks/ZipArchive.cs index 7755c1eea..0be8d1753 100644 --- a/build/tasks/ZipArchive.cs +++ b/build/tasks/ZipArchive.cs @@ -12,13 +12,7 @@ namespace Microsoft.AspNetCore.BuildTools { -#if SDK - public class Sdk_ZipArchive : Task -#elif BuildTools public class ZipArchive : Task -#else -#error This must be built either for an SDK or for BuildTools -#endif { /// /// The path where the zip file should be created. diff --git a/files/KoreBuild/modules/benchmarks/module.targets b/files/KoreBuild/modules/benchmarks/module.targets index 45abe7616..e38a57a2e 100644 --- a/files/KoreBuild/modules/benchmarks/module.targets +++ b/files/KoreBuild/modules/benchmarks/module.targets @@ -30,10 +30,10 @@ Runs a quick validation on all benchmark projects. Importance="High" Condition="'@(BenchmarkAssembly)' != ''" /> - - + + diff --git a/files/KoreBuild/modules/vstest/module.targets b/files/KoreBuild/modules/vstest/module.targets index 67fde2d62..847475372 100644 --- a/files/KoreBuild/modules/vstest/module.targets +++ b/files/KoreBuild/modules/vstest/module.targets @@ -136,7 +136,7 @@ Runs the VSTest on all projects in the ProjectToBuild itemgroup. - + @@ -144,9 +144,9 @@ Runs the VSTest on all projects in the ProjectToBuild itemgroup. - + - + <_TrxFiles Include="$(TrxFileWildcard)" /> diff --git a/modules/BuildTools.Tasks/BuildTools.Tasks.csproj b/modules/BuildTools.Tasks/BuildTools.Tasks.csproj deleted file mode 100644 index 35fd0d86e..000000000 --- a/modules/BuildTools.Tasks/BuildTools.Tasks.csproj +++ /dev/null @@ -1,30 +0,0 @@ - - - - - $(DefineConstants);BuildTools - MSBuild tasks. This package is intended for Microsoft use only - netcoreapp3.0;net46 - Microsoft.AspNetCore.BuildTools - Internal.AspNetCore.BuildTools.Tasks - - - - - - - - - - - - - - - - - - - - - diff --git a/modules/BuildTools.Tasks/BuildTools.Tasks.props b/modules/BuildTools.Tasks/BuildTools.Tasks.props deleted file mode 100644 index fb3b7fd92..000000000 --- a/modules/BuildTools.Tasks/BuildTools.Tasks.props +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/modules/BuildTools.Tasks/GenerateResxDesignerFiles.cs b/modules/BuildTools.Tasks/GenerateResxDesignerFiles.cs deleted file mode 100644 index 327af76a3..000000000 --- a/modules/BuildTools.Tasks/GenerateResxDesignerFiles.cs +++ /dev/null @@ -1,282 +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.IO; -using System.Linq; -using System.Text.RegularExpressions; -using System.Xml.Linq; -using Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace Microsoft.AspNetCore.BuildTools -{ - /// - /// Generates C# for resx files. It is expected to run on all EmbeddedResource items named *.resx and after - /// the 'PrepareResourceNames' target. - /// . - /// -#if SDK - public class Sdk_GenerateResxDesignerFiles : Task -#elif BuildTools - public class GenerateResxDesignerFiles : Task -#else -#error This must be built either for an SDK or for BuildTools -#endif - { - /// - /// Expected metadata items on . - /// - private static class Metadata - { - public const string GeneratedFileName = "GeneratedFileName"; - public const string ManifestResourceName = "ManifestResourceName"; - public const string Type = "Type"; - public const string FullPath = "FullPath"; - public const string WithCulture = "WithCulture"; - } - - private static readonly Regex _namedParameterMatcher = new Regex(@"\{([a-z]\w+)\}", RegexOptions.IgnoreCase); - private static readonly Regex _numberParameterMatcher = new Regex(@"\{(\d+)\}"); - private readonly List _createdFiles = new List(); - - /// - /// - /// The resx files to be generated. - /// - /// - /// Metadata: 'GeneratedFileName' can be used to set where the C# is written. Defaults to creating a file in the same folder. - /// Metadata: 'ManifestResourceName' created by the CreateManifestResourceNames target. - /// - /// - [Required] - public ITaskItem[] ResourceFiles { get; set; } - - /// - /// An item for each generated file. - /// - [Output] - public ITaskItem[] FileWrites { get; set; } - - public override bool Execute() - { - foreach (var item in ResourceFiles) - { - var resourceName = item.GetMetadata(Metadata.ManifestResourceName); - if (string.IsNullOrEmpty(resourceName)) - { - Log.LogWarning("'{0}' was not set on {1}.", Metadata.ManifestResourceName, item.ItemSpec); - continue; - } - - if (!"Resx".Equals(item.GetMetadata(Metadata.Type), StringComparison.OrdinalIgnoreCase)) - { - Log.LogMessage(MessageImportance.High, "Skipping resource '{0}' with type '{1}", item.ItemSpec, item.GetMetadata(Metadata.Type)); - continue; - } - - if ("true".Equals(item.GetMetadata(Metadata.WithCulture), StringComparison.OrdinalIgnoreCase)) - { - Log.LogMessage(MessageImportance.High, "Skipping culture-specific resource '{0}'", item.ItemSpec); - continue; - } - - try - { - var resxFile = item.GetMetadata(Metadata.FullPath) ?? item.ItemSpec; - GenerateCsharp( - resxFile, - item.GetMetadata(Metadata.GeneratedFileName), - resourceName); - } - catch (IOException ex) - { - Log.LogError("Failed to generated C# for {0}:\n{1}", item.ItemSpec, ex.ToString()); - return false; - } - } - - FileWrites = _createdFiles.ToArray(); - - return true; - } - - private void GenerateCsharp(string resxFile, string outputFileName, string manifestName) - { - if (string.IsNullOrEmpty(outputFileName)) - { - outputFileName = Path.GetFileNameWithoutExtension(resxFile) + ".Designer.cs"; - } - - var outputFullPath = !Path.IsPathRooted(outputFileName) - ? Path.Combine(Path.GetDirectoryName(resxFile), outputFileName) - : outputFileName; - - // normalize separator - outputFullPath = Path.DirectorySeparatorChar == '\\' - ? outputFullPath.Replace('/', Path.DirectorySeparatorChar) - : outputFullPath.Replace('\\', Path.DirectorySeparatorChar); - - var resourceStrings = new List(); - if (!File.Exists(resxFile)) - { - Log.LogError("'{0}' does not exist", resxFile); - return; - } - - var xml = XDocument.Load(resxFile); - - Log.LogMessage(MessageImportance.Low, "Used '{0}' to generate '{1}'", resxFile, outputFileName); - Log.LogMessage(MessageImportance.High, "Generated {0}", outputFullPath); - - foreach (var entry in xml.Descendants("data")) - { - var name = entry.Attribute("name").Value; - var value = entry.Element("value").Value; - - var usingNamedArgs = true; - var match = _namedParameterMatcher.Matches(value); - if (match.Count == 0) - { - usingNamedArgs = false; - match = _numberParameterMatcher.Matches(value); - } - - var arguments = match.Cast() - .Select(m => m.Groups[1].Value) - .Distinct(); - if (!usingNamedArgs) - { - arguments = arguments.OrderBy(Convert.ToInt32); - } - - resourceStrings.Add( - new ResourceData - { - Name = name, - Value = value, - Arguments = arguments.ToList(), - UsingNamedArgs = usingNamedArgs - }); - } - - var resourceNamespace = manifestName.Substring(0, manifestName.LastIndexOf('.')); - var resourceTypeName = manifestName.Substring(manifestName.LastIndexOf('.') + 1); - - Directory.CreateDirectory(Path.GetDirectoryName(outputFullPath)); - - using (var stream = new FileStream(outputFullPath, FileMode.Create)) - using (var writer = new StreamWriter(stream)) - { - _createdFiles.Add(new TaskItem(outputFullPath)); - - writer.WriteLine( - $@"// -namespace {resourceNamespace} -{{ - using System.Globalization; - using System.Reflection; - using System.Resources; - - internal static class {resourceTypeName} - {{ - private static readonly ResourceManager _resourceManager - = new ResourceManager(""{manifestName}"", typeof({resourceTypeName}).GetTypeInfo().Assembly);"); - - using (var indent = writer.Indent(8)) - { - foreach (var resourceString in resourceStrings) - { - writer.WriteLine(); - RenderHeader(indent, resourceString); - RenderProperty(indent, resourceString); - - writer.WriteLine(); - RenderHeader(indent, resourceString); - RenderFormatMethod(indent, resourceString); - } - } - - writer.WriteLine(@" - private static string GetString(string name, params string[] formatterNames) - { - var value = _resourceManager.GetString(name); - - System.Diagnostics.Debug.Assert(value != null); - - if (formatterNames != null) - { - for (var i = 0; i < formatterNames.Length; i++) - { - value = value.Replace(""{"" + formatterNames[i] + ""}"", ""{"" + i + ""}""); - } - } - - return value; - } - } -}"); - - } - } - - private static void RenderHeader(TextWriter writer, ResourceData resourceString) - { - writer.WriteLine("/// "); - foreach (var line in resourceString.Value.Split(new[] { '\n' }, StringSplitOptions.None)) - { - writer.WriteLine($"/// {new XText(line)}"); - } - writer.WriteLine("/// "); - } - - private static void RenderProperty(TextWriter writer, ResourceData resourceString) - { - writer.WriteLine("internal static string {0}", resourceString.Name); - writer.WriteLine("{"); - using (var indent = writer.Indent()) - { - indent.WriteLine($@"get => GetString(""{resourceString.Name}"");"); - } - writer.WriteLine("}"); - } - - private static void RenderFormatMethod(TextWriter writer, ResourceData resourceString) - { - writer.WriteLine($"internal static string Format{resourceString.Name}({resourceString.Parameters})"); - - using (var indent = writer.Indent()) - { - if (resourceString.Arguments.Count > 0) - { - indent.WriteLine(@"=> string.Format(CultureInfo.CurrentCulture, GetString(""{0}""{1}), {2});", - resourceString.Name, - resourceString.UsingNamedArgs ? ", " + resourceString.FormatArguments : null, - resourceString.ArgumentNames); - } - else - { - indent.WriteLine($@"=> GetString(""{resourceString.Name}"");"); - } - } - } - - private class ResourceData - { - public string Name { get; set; } - public string Value { get; set; } - public List Arguments { get; set; } - - public bool UsingNamedArgs { get; set; } - - public string FormatArguments => string.Join(", ", Arguments.Select(a => "\"" + a + "\"")); - - public string ArgumentNames => string.Join(", ", Arguments.Select(GetArgName)); - - public string Parameters => string.Join(", ", Arguments.Select(a => "object " + GetArgName(a))); - - private string GetArgName(string name) => UsingNamedArgs ? name : 'p' + name; - } - } -} diff --git a/modules/BuildTools.Tasks/GetAssemblyFileVersion.cs b/modules/BuildTools.Tasks/GetAssemblyFileVersion.cs deleted file mode 100644 index 296ba6a49..000000000 --- a/modules/BuildTools.Tasks/GetAssemblyFileVersion.cs +++ /dev/null @@ -1,49 +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 Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace Microsoft.AspNetCore.BuildTools -{ -#if SDK - public class Sdk_GetAssemblyFileVersion : Task -#elif BuildTools - public class GetAssemblyFileVersion : Task -#else -#error This must be built either for an SDK or for BuildTools -#endif - { - [Required] - public string AssemblyVersion { get; set; } - - [Required] - public int AssemblyRevision { get; set; } - - [Output] - public string AssemblyFileVersion { get; set; } - - public override bool Execute() - { - if (!Version.TryParse(AssemblyVersion, out var assemblyVersionValue)) - { - Log.LogError("Invalid value '{0}' for {1}.", AssemblyVersion, nameof(AssemblyVersion)); - return false; - } - - var assemblyFileVersionValue = assemblyVersionValue; - if (assemblyFileVersionValue.Revision <= 0) - { - assemblyFileVersionValue = new Version( - assemblyFileVersionValue.Major, - assemblyFileVersionValue.Minor, - assemblyFileVersionValue.Build, - AssemblyRevision); - } - - AssemblyFileVersion = assemblyFileVersionValue.ToString(); - return true; - } - } -} diff --git a/modules/BuildTools.Tasks/Project.CSharp.Resx.targets b/modules/BuildTools.Tasks/Project.CSharp.Resx.targets deleted file mode 100644 index 5c80b1764..000000000 --- a/modules/BuildTools.Tasks/Project.CSharp.Resx.targets +++ /dev/null @@ -1,21 +0,0 @@ - - - - Resx - - - - - - diff --git a/modules/BuildTools.Tasks/Properties/InternalsVisibleTo.cs b/modules/BuildTools.Tasks/Properties/InternalsVisibleTo.cs deleted file mode 100644 index b11b4fa2c..000000000 --- a/modules/BuildTools.Tasks/Properties/InternalsVisibleTo.cs +++ /dev/null @@ -1,6 +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.Runtime.CompilerServices; - -[assembly: InternalsVisibleTo("BuildTools.Tasks.Tests")] diff --git a/modules/BuildTools.Tasks/Publish.targets b/modules/BuildTools.Tasks/Publish.targets deleted file mode 100644 index cd76193e6..000000000 --- a/modules/BuildTools.Tasks/Publish.targets +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - <_TargetFramework Remove="@(_TargetFramework)" /> - <_TargetFramework Include="$(TargetFrameworks)" /> - - - - - - - diff --git a/modules/BuildTools.Tasks/Run.cs b/modules/BuildTools.Tasks/Run.cs deleted file mode 100644 index 1b6b3da75..000000000 --- a/modules/BuildTools.Tasks/Run.cs +++ /dev/null @@ -1,35 +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 Microsoft.Build.Framework; -using Microsoft.Build.Utilities; - -namespace Microsoft.AspNetCore.BuildTools -{ - /// - /// A task that runs a process without piping output into the logger. - /// See for more arguments. - /// -#if SDK - public class Sdk_Run -#elif BuildTools - public class Run -#else -#error This must be built either for an SDK or for BuildTools -#endif - : RunBase - { - /// - /// The executable to run. Can be a file path or a command for an executable on the system PATH. - /// - [Required] - public string FileName { get; set; } - - protected override string ToolName => FileName; - - protected override string GenerateFullPathToTool() - { - return FileName; - } - } -} diff --git a/modules/BuildTools.Tasks/RunBase.cs b/modules/BuildTools.Tasks/RunBase.cs deleted file mode 100644 index ab6baeee6..000000000 --- a/modules/BuildTools.Tasks/RunBase.cs +++ /dev/null @@ -1,159 +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.IO; -using System.Linq; -using Microsoft.Build.Utilities; -using Microsoft.Build.Framework; -using Microsoft.Extensions.CommandLineUtils; - -namespace Microsoft.AspNetCore.BuildTools -{ - /// - /// A task that runs a process without piping output into the logger. - /// - public abstract class RunBase : ToolTask - { - protected RunBase() - { - // only use exit code to determine error by default. - LogStandardErrorAsError = false; - } - - private static readonly char[] EqualsArray = new[] { '=' }; - - private const int OK = 0; - - /// - /// A list of arguments to be passed to the executable. The task will escape them for spaces and quotes. - /// Cannot be used with - /// - public ITaskItem[] Arguments { get; set; } - - /// - /// The command to pass to the executable as string. - /// Cannot be used with - /// - public string Command { get; set; } - - // Additional options - /// - /// The current working directory - /// - public string WorkingDirectory { get; set; } - - /// - /// Don't fail the task if the command exits with a non-zero code - /// - public bool IgnoreExitCode { get; set; } - - /// - /// Repeat the command up to this many times if the exit code is non-zero. Defaults to 0. - /// - public int MaxRetries { get; set; } - - /// - /// Ignore standard error and warning formatting - /// - public bool IgnoreStandardErrorWarningFormat { get; set; } - - // increase the default output importance from Low to High - /// - protected override MessageImportance StandardErrorLoggingImportance => MessageImportance.High; - - /// - protected override MessageImportance StandardOutputLoggingImportance => MessageImportance.High; - - protected override bool HandleTaskExecutionErrors() - { - return IgnoreExitCode || base.HandleTaskExecutionErrors(); - } - - protected override void LogEventsFromTextOutput(string singleLine, MessageImportance messageImportance) - { - if (IgnoreStandardErrorWarningFormat) - { - Log.LogMessage(messageImportance, singleLine); - } - else - { - base.LogEventsFromTextOutput(singleLine, messageImportance); - } - } - - protected override string GetWorkingDirectory() => WorkingDirectory; - - protected override bool ValidateParameters() - { - var exe = GenerateFullPathToTool(); - - if (string.IsNullOrEmpty(exe)) - { - Log.LogError("FileName must be specified."); - return false; - } - - if (MaxRetries < 0) - { - Log.LogError("MaxRetries must be a non-negative number."); - return false; - } - - if (!string.IsNullOrEmpty(WorkingDirectory) && !Directory.Exists(WorkingDirectory)) - { - Log.LogError("WorkingDirectory does not exist: '{0}'", WorkingDirectory); - return false; - } - - // if path is not rooted, it may be a command on the system PATH - if (Path.IsPathRooted(exe) && !File.Exists(exe)) - { - Log.LogError("FileName does not exist: '{0}'", WorkingDirectory); - return false; - } - - return base.ValidateParameters(); - } - - public override bool Execute() - { - var retries = Math.Max(1, MaxRetries); - for (int i = 0; i < retries; i++) - { - if (base.Execute()) - { - return true; - } - } - - return false; - } - - protected override string GenerateCommandLineCommands() - { - var cmd = 0; - var arguments = string.Empty; - - if (Arguments != null) - { - arguments = ArgumentEscaper.EscapeAndConcatenate(Arguments.Select(i => i.ItemSpec)); - cmd++; - } - - if (!string.IsNullOrEmpty(Command)) - { - arguments = Command; - cmd++; - } - - if (cmd > 1) - { - Log.LogError("Arguments and Command cannot both be used."); - return null; - } - - return arguments; - } - } -} diff --git a/modules/BuildTools.Tasks/RunDotNet.cs b/modules/BuildTools.Tasks/RunDotNet.cs deleted file mode 100644 index 7c939e2f5..000000000 --- a/modules/BuildTools.Tasks/RunDotNet.cs +++ /dev/null @@ -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 Microsoft.Extensions.CommandLineUtils; - -namespace Microsoft.AspNetCore.BuildTools -{ - /// - /// A task that runs a dotnet command without piping output into the logger. - /// See for more arguments. - /// -#if SDK - public class Sdk_RunDotNet -#elif BuildTools - public class RunDotNet -#else -#error This must be built either for an SDK or for BuildTools -#endif - : RunBase - { - protected override string ToolName => "dotnet"; - - protected override string GenerateFullPathToTool() -#if NET46 - => "dotnet"; -#else - => DotNetMuxer.MuxerPathOrDefault(); -#endif - } -} diff --git a/modules/BuildTools.Tasks/Utilities/IndentedTextWriter.cs b/modules/BuildTools.Tasks/Utilities/IndentedTextWriter.cs deleted file mode 100644 index 064152069..000000000 --- a/modules/BuildTools.Tasks/Utilities/IndentedTextWriter.cs +++ /dev/null @@ -1,36 +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.IO; -using System.Text; - -namespace Microsoft.AspNetCore.BuildTools.Utilities -{ - internal class IndentedTextWriter : TextWriter - { - private readonly TextWriter _wrapped; - private readonly string _spaces; - - public IndentedTextWriter(TextWriter wrapped, int indentSpaces) - { - _wrapped = wrapped; - _spaces = new String(' ', indentSpaces); - } - - public override Encoding Encoding => _wrapped.Encoding; - - public override void Write(char value) - => _wrapped.Write(value); - - public override void WriteLine(string line) - { - _wrapped.Write(_spaces); - _wrapped.WriteLine(line); - } - - protected override void Dispose(bool disposing) - { - } - } -} diff --git a/modules/BuildTools.Tasks/Utilities/TextWriterExtensions.cs b/modules/BuildTools.Tasks/Utilities/TextWriterExtensions.cs deleted file mode 100644 index ba195085e..000000000 --- a/modules/BuildTools.Tasks/Utilities/TextWriterExtensions.cs +++ /dev/null @@ -1,13 +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 Microsoft.AspNetCore.BuildTools.Utilities; - -namespace System.IO -{ - internal static class TextWriterExtensions - { - public static IndentedTextWriter Indent(this TextWriter writer, int spaces = 4) - => new IndentedTextWriter(writer, spaces); - } -} diff --git a/modules/BuildTools.Tasks/_._ b/modules/BuildTools.Tasks/_._ deleted file mode 100644 index e69de29bb..000000000 diff --git a/modules/BuildTools.Tasks/module.props b/modules/BuildTools.Tasks/module.props deleted file mode 100644 index 2dc157151..000000000 --- a/modules/BuildTools.Tasks/module.props +++ /dev/null @@ -1,11 +0,0 @@ - - - - <_BuildToolsAssembly Condition="'$(MSBuildRuntimeType)' == 'core' ">$(MSBuildThisFileDirectory)netcoreapp3.0\Internal.AspNetCore.BuildTools.Tasks.dll - <_BuildToolsAssembly Condition="'$(MSBuildRuntimeType)' != 'core' ">$(MSBuildThisFileDirectory)net46\Internal.AspNetCore.BuildTools.Tasks.dll - <_BuildTasksPrefix> - - - - - diff --git a/modules/BuildTools.Tasks/module.targets b/modules/BuildTools.Tasks/module.targets deleted file mode 100644 index 2eca16a8f..000000000 --- a/modules/BuildTools.Tasks/module.targets +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - <_ResxTargets>$(MSBuildThisFileDirectory)Project.CSharp.Resx.targets - <_ResxSlnProps>$(BuildProperties) - - <_ResxSlnProps>$(_ResxSlnProps);CustomAfterMicrosoftCommonTargets=$(_ResxTargets) - <_ResxSlnProps>$(_ResxSlnProps);CustomAfterMicrosoftCommonCrossTargetingTargets=$(_ResxTargets) - - - - - - diff --git a/modules/KoreBuild.Tasks/CodeSign.targets b/modules/KoreBuild.Tasks/CodeSign.targets index d061b63c9..d11d7be3a 100644 --- a/modules/KoreBuild.Tasks/CodeSign.targets +++ b/modules/KoreBuild.Tasks/CodeSign.targets @@ -49,6 +49,7 @@ + @@ -59,7 +60,7 @@ - + diff --git a/modules/KoreBuild.Tasks/InstallDotNet.cs b/modules/KoreBuild.Tasks/InstallDotNet.cs index 4f82a83f3..68732481d 100644 --- a/modules/KoreBuild.Tasks/InstallDotNet.cs +++ b/modules/KoreBuild.Tasks/InstallDotNet.cs @@ -242,7 +242,7 @@ private string GetInstallDir(string arch) } else { - return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) + return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && Environment.GetEnvironmentVariable("KOREBUILD_DISABLE_DOTNET_ARCH") == null ? Path.Combine(DotNetHome, arch) : DotNetHome; } diff --git a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj index 12ff8c23f..d1346531e 100644 --- a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj +++ b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj @@ -1,5 +1,4 @@ - - + netstandard2.0 @@ -10,8 +9,8 @@ - - + + @@ -45,5 +44,4 @@ - diff --git a/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj b/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj index ff3307f1b..61ab9fbce 100644 --- a/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj +++ b/modules/NuGetPackageVerifier/console/NuGetPackageVerifier.Console.csproj @@ -1,5 +1,4 @@ - - + Verifies Asp.Net Core NuGet packages. @@ -19,5 +18,4 @@ - diff --git a/modules/NuGetPackageVerifier/msbuild/NuGetPackageVerifier.Task.csproj b/modules/NuGetPackageVerifier/msbuild/NuGetPackageVerifier.Task.csproj index d250d9bcd..c62d8de86 100644 --- a/modules/NuGetPackageVerifier/msbuild/NuGetPackageVerifier.Task.csproj +++ b/modules/NuGetPackageVerifier/msbuild/NuGetPackageVerifier.Task.csproj @@ -1,5 +1,4 @@ - - + netstandard2.0 @@ -16,5 +15,4 @@ - diff --git a/modules/BuildTools.Tasks/Utilities/FileHelpers.cs b/src/Internal.AspNetCore.BuildTasks/FileHelpers.cs similarity index 100% rename from modules/BuildTools.Tasks/Utilities/FileHelpers.cs rename to src/Internal.AspNetCore.BuildTasks/FileHelpers.cs diff --git a/modules/BuildTools.Tasks/GenerateFileFromTemplate.cs b/src/Internal.AspNetCore.BuildTasks/GenerateFileFromTemplate.cs similarity index 95% rename from modules/BuildTools.Tasks/GenerateFileFromTemplate.cs rename to src/Internal.AspNetCore.BuildTasks/GenerateFileFromTemplate.cs index 63f061391..059aa1426 100644 --- a/modules/BuildTools.Tasks/GenerateFileFromTemplate.cs +++ b/src/Internal.AspNetCore.BuildTasks/GenerateFileFromTemplate.cs @@ -27,13 +27,7 @@ namespace Microsoft.AspNetCore.BuildTools /// /// /// -#if SDK - public class Sdk_GenerateFileFromTemplate : Task -#elif BuildTools public class GenerateFileFromTemplate : Task -#else -#error This must be built either for an SDK or for BuildTools -#endif { /// /// The template file. @@ -76,7 +70,7 @@ public override bool Execute() return true; } - internal string Replace(string template, IDictionary values) + public string Replace(string template, IDictionary values) { var sb = new StringBuilder(); var varNameSb = new StringBuilder(); diff --git a/src/Internal.AspNetCore.BuildTasks/Internal.AspNetCore.BuildTasks.csproj b/src/Internal.AspNetCore.BuildTasks/Internal.AspNetCore.BuildTasks.csproj new file mode 100644 index 000000000..4279ac44c --- /dev/null +++ b/src/Internal.AspNetCore.BuildTasks/Internal.AspNetCore.BuildTasks.csproj @@ -0,0 +1,22 @@ + + + + netstandard2.0 + Build tasks. This package is intended for Microsoft use only. + false + false + tools\ + true + true + + + + + + + + + + + + diff --git a/shared/Utilities/MSBuildListSplitter.cs b/src/Internal.AspNetCore.BuildTasks/MSBuildListSplitter.cs similarity index 100% rename from shared/Utilities/MSBuildListSplitter.cs rename to src/Internal.AspNetCore.BuildTasks/MSBuildListSplitter.cs diff --git a/src/Internal.AspNetCore.BuildTasks/build/Internal.AspNetCore.BuildTasks.props b/src/Internal.AspNetCore.BuildTasks/build/Internal.AspNetCore.BuildTasks.props new file mode 100644 index 000000000..9c99f1b5e --- /dev/null +++ b/src/Internal.AspNetCore.BuildTasks/build/Internal.AspNetCore.BuildTasks.props @@ -0,0 +1,9 @@ + + + + <_BuildTasksAssembly>$(MSBuildThisFileDirectory)..\tools\netstandard2.0\Internal.AspNetCore.BuildTasks.dll + + + + + diff --git a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj deleted file mode 100644 index f9857a406..000000000 --- a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.csproj +++ /dev/null @@ -1,44 +0,0 @@ - - - - Internal.AspNetCore.Sdk - netcoreapp3.0;net46 - $(DefineConstants);SDK - false - Build targets and extensions to Microsoft.NET.Sdk. This package is intended for Microsoft use only. - Microsoft.AspNetCore.BuildTools - ..\..\modules\BuildTools.Tasks\ - $(MSBuildThisFileDirectory)$(MSBuildProjectName).nuspec - false - false - - - - - - - - - - - - - - - - - - - - - - - $(NuspecProperties);id=$(PackageId) - $(NuspecProperties);config=$(Configuration) - $(NuspecProperties);version=$(PackageVersion) - $(NuspecProperties);description=$(Description) - $(NuspecProperties);copyright=$(Copyright) - - - - diff --git a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec b/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec deleted file mode 100644 index 0080e3901..000000000 --- a/src/Internal.AspNetCore.Sdk/Internal.AspNetCore.Sdk.nuspec +++ /dev/null @@ -1,20 +0,0 @@ - - - - $id$ - $version$ - Microsoft - false - $description$ - $copyright$ - - - - - - - - - - - diff --git a/src/Internal.AspNetCore.Sdk/_._ b/src/Internal.AspNetCore.Sdk/_._ deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/Internal.AspNetCore.Sdk/build/Common.props b/src/Internal.AspNetCore.Sdk/build/Common.props deleted file mode 100644 index 22580abdc..000000000 --- a/src/Internal.AspNetCore.Sdk/build/Common.props +++ /dev/null @@ -1,68 +0,0 @@ - - - - - Microsoft - Microsoft Corporation. - © Microsoft Corporation. All rights reserved. - true - en-US - https://raw.githubusercontent.com/aspnet/AspNetCore/2.0.0/LICENSE.txt - https://go.microsoft.com/fwlink/?LinkID=288859 - https://asp.net - true - true - true - 7.3 - - SHA256 - - true - - - - - Microsoft400 - 3PartySHA2 - Microsoft400 - NuGet - VsixSHA2 - MicrosoftJAR - - - - - - true - - $(WarningsNotAsErrors);xUnit1004 - <_TwoDigitYear>$([MSBuild]::Subtract($([System.DateTime]::UtcNow.Year), 2000)) - <_ThreeDigitDayOfYear>$([System.DateTime]::UtcNow.DayOfYear.ToString().PadLeft(3, '0')) - $(_TwoDigitYear)$(_ThreeDigitDayOfYear) - - - - - <_Parameter1>BuildNumber - <_Parameter2>$(BuildNumber) - - - - - - true - <_BuildTasksPrefix>Sdk_ - <_BuildToolsAssemblyTfm Condition="'$(MSBuildRuntimeType)' == 'Core'">netcoreapp3.0 - <_BuildToolsAssemblyTfm Condition="'$(MSBuildRuntimeType)' != 'Core'">net46 - <_BuildToolsAssembly>$(MSBuildThisFileDirectory)..\tools\$(_BuildToolsAssemblyTfm)\Internal.AspNetCore.Sdk.dll - - - - - diff --git a/src/Internal.AspNetCore.Sdk/build/Common.targets b/src/Internal.AspNetCore.Sdk/build/Common.targets deleted file mode 100644 index 2e763b38f..000000000 --- a/src/Internal.AspNetCore.Sdk/build/Common.targets +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - $(NoWarn);NU5105 - - - - $(GenerateNuspecDependsOn);_EnsureDebugTypeIsPortable - $(TargetsForTfmSpecificBuildOutput);_EnsureDebugTypeIsPortable - - - - - - - - - - - - - - - - - - - - - <_ResxFiles Update="@(_ResxFiles)" Condition="'%(_ResxFiles.GeneratedFileName)' == ''"> - Properties\%(FileName).Designer.cs - - - - - - - - - - - diff --git a/src/Internal.AspNetCore.Sdk/build/GenerateAssemblyInfo.targets b/src/Internal.AspNetCore.Sdk/build/GenerateAssemblyInfo.targets deleted file mode 100644 index e6a37337a..000000000 --- a/src/Internal.AspNetCore.Sdk/build/GenerateAssemblyInfo.targets +++ /dev/null @@ -1,52 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - $(IntermediateOutputPath)Internal.AspNetCore.Sdk.AssemblyInfo$(DefaultLanguageSourceExtension) - true - - - - - - - - - - - - - - - - <_InternalAspNetCoreAttributes Remove="@(_InternalAspNetCoreAttributes)" /> - <_InternalAspNetCoreAttributes Include="System.Reflection.AssemblyMetadata" Condition="'$(Serviceable)'!='false'"> - <_Parameter1>Serviceable - <_Parameter2>True - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.props b/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.props deleted file mode 100644 index fe0303c43..000000000 --- a/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.props +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - diff --git a/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets b/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets deleted file mode 100644 index ed1fbe046..000000000 --- a/src/Internal.AspNetCore.Sdk/build/Internal.AspNetCore.Sdk.targets +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - diff --git a/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.props b/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.props deleted file mode 100644 index 17b7dea67..000000000 --- a/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.props +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - false - - - false - - - - - - diff --git a/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.targets b/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.targets deleted file mode 100644 index 2c80eb4db..000000000 --- a/src/Internal.AspNetCore.Sdk/buildMultiTargeting/Internal.AspNetCore.Sdk.targets +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - <_TargetFrameworks Remove="@(_TargetFrameworks)" /> - <_TargetFrameworks Include="$(TargetFrameworks)" /> - - - - - - - - - diff --git a/src/Internal.AspNetCore.Sdk/sdk/Sdk.props b/src/Internal.AspNetCore.Sdk/sdk/Sdk.props deleted file mode 100644 index 85a825239..000000000 --- a/src/Internal.AspNetCore.Sdk/sdk/Sdk.props +++ /dev/null @@ -1,10 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - <_ReferencesInternalAspNetCoreSdk>true - - - - - diff --git a/src/Internal.AspNetCore.Sdk/sdk/Sdk.targets b/src/Internal.AspNetCore.Sdk/sdk/Sdk.targets deleted file mode 100644 index 5383c9fdd..000000000 --- a/src/Internal.AspNetCore.Sdk/sdk/Sdk.targets +++ /dev/null @@ -1,12 +0,0 @@ - - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - - - - - - - diff --git a/test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj b/test/BuildTasks.Tests/BuildTasks.Tests.csproj similarity index 73% rename from test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj rename to test/BuildTasks.Tests/BuildTasks.Tests.csproj index 11354bcbc..ebb1f88d7 100644 --- a/test/BuildTools.Tasks.Tests/BuildTools.Tasks.Tests.csproj +++ b/test/BuildTasks.Tests/BuildTasks.Tests.csproj @@ -1,5 +1,4 @@ - - + netcoreapp3.0 @@ -21,8 +20,7 @@ - + - diff --git a/test/BuildTools.Tasks.Tests/GenerateFileFromTemplateTests.cs b/test/BuildTasks.Tests/GenerateFileFromTemplateTests.cs similarity index 100% rename from test/BuildTools.Tasks.Tests/GenerateFileFromTemplateTests.cs rename to test/BuildTasks.Tests/GenerateFileFromTemplateTests.cs diff --git a/test/BuildTools.Tasks.Tests/GenerateResxDesignerFilesTest.cs b/test/BuildTools.Tasks.Tests/GenerateResxDesignerFilesTest.cs deleted file mode 100644 index a2abad593..000000000 --- a/test/BuildTools.Tasks.Tests/GenerateResxDesignerFilesTest.cs +++ /dev/null @@ -1,45 +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.IO; -using Microsoft.AspNetCore.BuildTools; -using Microsoft.Build.Utilities; -using Xunit; - -namespace BuildTools.Tasks.Tests -{ - public class GenerateResxDesignerFilesTest - { - [Fact] - public void GeneratesResx() - { - var resx = Path.Combine(AppContext.BaseDirectory, "Resources", "Strings.resx"); - - var item = new TaskItem(resx); - item.SetMetadata("ManifestResourceName", "Microsoft.Extensions.Logging.Abstractions.Resource"); - item.SetMetadata("Type", "Resx"); - - var engine = new MockEngine(); - var task = new GenerateResxDesignerFiles - { - ResourceFiles = new[] { item }, - BuildEngine = engine, - }; - - var expectedFile = Path.Combine(AppContext.BaseDirectory, "Resources", "Strings.Designer.cs.txt"); - var actualFile = Path.Combine(AppContext.BaseDirectory, "Resources", "Strings.Designer.cs"); - if (File.Exists(actualFile)) - { - File.Delete(actualFile); - } - - Assert.True(task.Execute(), "Task failed"); - Assert.Empty(engine.Warnings); - - Assert.Equal(actualFile, Assert.Single(task.FileWrites).ItemSpec); - Assert.True(File.Exists(actualFile), "Actual file does not exist"); - Assert.Equal(File.ReadAllText(expectedFile), File.ReadAllText(actualFile), ignoreLineEndingDifferences: true); - } - } -} diff --git a/test/BuildTools.Tasks.Tests/GetAssemblyFileVersionTest.cs b/test/BuildTools.Tasks.Tests/GetAssemblyFileVersionTest.cs deleted file mode 100644 index c16d8aa0b..000000000 --- a/test/BuildTools.Tasks.Tests/GetAssemblyFileVersionTest.cs +++ /dev/null @@ -1,48 +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 Xunit; - -namespace Microsoft.AspNetCore.BuildTools -{ - public class GetAssemblyFileVersionTest - { - [Fact] - public void Execute_SetsAssemblyFileVersionToAssemblyVersion_IfRevisionIsSet() - { - // Arrange - var getAssemblyFileVersion = new GetAssemblyFileVersion - { - AssemblyVersion = "1.2.3.4", - AssemblyRevision = 78, - }; - - // Act - var result = getAssemblyFileVersion.Execute(); - - // Assert - Assert.True(result); - Assert.Equal("1.2.3.4", getAssemblyFileVersion.AssemblyFileVersion); - } - - [Theory] - [InlineData("1.2.3")] - [InlineData("1.2.3.0")] - public void Execute_UsesAssemblyRevision_IfRevisionIsNotSet(string assemblyVersion) - { - // Arrange - var getAssemblyFileVersion = new GetAssemblyFileVersion - { - AssemblyVersion = assemblyVersion, - AssemblyRevision = 78, - }; - - // Act - var result = getAssemblyFileVersion.Execute(); - - // Assert - Assert.True(result); - Assert.Equal("1.2.3.78", getAssemblyFileVersion.AssemblyFileVersion); - } - } -} diff --git a/test/BuildTools.Tasks.Tests/Resources/Strings.Designer.cs.txt b/test/BuildTools.Tasks.Tests/Resources/Strings.Designer.cs.txt deleted file mode 100644 index b7e25474d..000000000 --- a/test/BuildTools.Tasks.Tests/Resources/Strings.Designer.cs.txt +++ /dev/null @@ -1,44 +0,0 @@ -// -namespace Microsoft.Extensions.Logging.Abstractions -{ - using System.Globalization; - using System.Reflection; - using System.Resources; - - internal static class Resource - { - private static readonly ResourceManager _resourceManager - = new ResourceManager("Microsoft.Extensions.Logging.Abstractions.Resource", typeof(Resource).GetTypeInfo().Assembly); - - /// - /// The format string '{0}' does not have the expected number of named parameters. Expected {1} parameter(s) but found {2} parameter(s). - /// - internal static string UnexpectedNumberOfNamedParameters - { - get => GetString("UnexpectedNumberOfNamedParameters"); - } - - /// - /// The format string '{0}' does not have the expected number of named parameters. Expected {1} parameter(s) but found {2} parameter(s). - /// - internal static string FormatUnexpectedNumberOfNamedParameters(object p0, object p1, object p2) - => string.Format(CultureInfo.CurrentCulture, GetString("UnexpectedNumberOfNamedParameters"), p0, p1, p2); - - private static string GetString(string name, params string[] formatterNames) - { - var value = _resourceManager.GetString(name); - - System.Diagnostics.Debug.Assert(value != null); - - if (formatterNames != null) - { - for (var i = 0; i < formatterNames.Length; i++) - { - value = value.Replace("{" + formatterNames[i] + "}", "{" + i + "}"); - } - } - - return value; - } - } -} diff --git a/test/BuildTools.Tasks.Tests/Resources/Strings.resx b/test/BuildTools.Tasks.Tests/Resources/Strings.resx deleted file mode 100644 index 5112bed03..000000000 --- a/test/BuildTools.Tasks.Tests/Resources/Strings.resx +++ /dev/null @@ -1,123 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - The format string '{0}' does not have the expected number of named parameters. Expected {1} parameter(s) but found {2} parameter(s). - - \ No newline at end of file diff --git a/test/BuildTools.Tasks.Tests/Resources/sampledata.json b/test/BuildTools.Tasks.Tests/Resources/sampledata.json deleted file mode 100644 index c8f0b8aa7..000000000 --- a/test/BuildTools.Tasks.Tests/Resources/sampledata.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "sdk": { "version": "1.2.3" }, - "runtimes": [ - { - "version": "1.0.0-beta" - }, - { - "version": "1.0.0-alpha" - } - ] -} diff --git a/test/BuildTools.Tasks.Tests/RunTaskTests.cs b/test/BuildTools.Tasks.Tests/RunTaskTests.cs deleted file mode 100644 index 6b4761192..000000000 --- a/test/BuildTools.Tasks.Tests/RunTaskTests.cs +++ /dev/null @@ -1,26 +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.IO; -using Microsoft.AspNetCore.BuildTools; -using Xunit; - -namespace BuildTools.Tasks.Tests -{ - public class RunTaskTests - { - [Fact] - public void ExitCodeIsNonZeroIfFailedToStart() - { - var engine = new MockEngine { ContinueOnError = true }; - var task = new Run - { - FileName = "sdfkjskldfsjdflkajsdas", - BuildEngine = engine, - }; - Assert.False(task.Execute()); - Assert.NotEqual(0, task.ExitCode); - } - } -} diff --git a/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj b/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj index 533f5457d..15c5b6dab 100644 --- a/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj +++ b/test/KoreBuild.FunctionalTests/KoreBuild.FunctionalTests.csproj @@ -1,5 +1,4 @@ - - + netcoreapp3.0 @@ -28,6 +27,4 @@ - - diff --git a/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj b/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj index 2ec3473a6..316d0defb 100644 --- a/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj +++ b/test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj @@ -1,5 +1,4 @@ - - + netcoreapp3.0 @@ -28,5 +27,4 @@ - diff --git a/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj b/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj index 7f462181e..1ebeb00f4 100644 --- a/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj +++ b/test/NuGetPackageVerifier.Tests/NuGetPackageVerifier.Tests.csproj @@ -1,5 +1,4 @@ - - + netcoreapp3.0 @@ -19,5 +18,4 @@ - From 371c5c09cccfd311ea80617f1db6ae182831d5d7 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 30 May 2019 16:06:24 -0700 Subject: [PATCH 176/192] Move YAML templates (other repos shouldn't be using these anymore), and remove use of NetCoreInternal-Pool --- .azure/pipelines/ci.yml | 5 ++++- .../{templates => pipelines}/jobs/default-build.yml | 3 --- .azure/{templates => pipelines/jobs}/project-ci.yml | 11 +++-------- 3 files changed, 7 insertions(+), 12 deletions(-) rename .azure/{templates => pipelines}/jobs/default-build.yml (97%) rename .azure/{templates => pipelines/jobs}/project-ci.yml (88%) diff --git a/.azure/pipelines/ci.yml b/.azure/pipelines/ci.yml index 8ac3ac6f5..291117e82 100644 --- a/.azure/pipelines/ci.yml +++ b/.azure/pipelines/ci.yml @@ -11,8 +11,11 @@ pr: include: - '*' +variables: + BuildConfiguration: Release + jobs: -- template: ../templates/project-ci.yml +- template: jobs/project-ci.yml parameters: # Ensures the alignment of branch name and deployment params buildArgs: '/warnaserror:BUILD1001' diff --git a/.azure/templates/jobs/default-build.yml b/.azure/pipelines/jobs/default-build.yml similarity index 97% rename from .azure/templates/jobs/default-build.yml rename to .azure/pipelines/jobs/default-build.yml index 0e5b478f8..30da97589 100644 --- a/.azure/templates/jobs/default-build.yml +++ b/.azure/pipelines/jobs/default-build.yml @@ -79,9 +79,6 @@ jobs: vmImage: ubuntu-16.04 ${{ if and(eq(parameters.poolName, ''), eq(parameters.agentOs, 'Windows')) }}: vmImage: vs2017-win2016 - ${{ if ne(variables['System.TeamProject'], 'public') }}: - name: NetCoreInternal-Pool - queue: BuildPool.Windows.10.Amd64.VS2017 variables: AgentOsName: ${{ parameters.agentOs }} ASPNETCORE_TEST_LOG_MAXPATH: "200" # Keep test log file name length low enough for artifact zipping diff --git a/.azure/templates/project-ci.yml b/.azure/pipelines/jobs/project-ci.yml similarity index 88% rename from .azure/templates/project-ci.yml rename to .azure/pipelines/jobs/project-ci.yml index 8902e7046..51704ec0f 100644 --- a/.azure/templates/project-ci.yml +++ b/.azure/pipelines/jobs/project-ci.yml @@ -20,14 +20,9 @@ parameters: afterBuild: [] codeSign: false variables: {} - matrix: - Release: - BuildConfiguration: Release - Debug: - BuildConfiguration: Debug jobs: -- template: jobs/default-build.yml +- template: default-build.yml parameters: agentOs: Windows matrix: ${{ parameters.matrix }} @@ -36,7 +31,7 @@ jobs: afterBuild: ${{ parameters.afterBuild }} codeSign: ${{ parameters.codeSign }} variables: ${{ parameters.variables }} -- template: jobs/default-build.yml +- template: default-build.yml parameters: agentOs: macOS matrix: ${{ parameters.matrix }} @@ -44,7 +39,7 @@ jobs: beforeBuild: ${{ parameters.beforeBuild }} afterBuild: ${{ parameters.afterBuild }} variables: ${{ parameters.variables }} -- template: jobs/default-build.yml +- template: default-build.yml parameters: agentOs: Linux matrix: ${{ parameters.matrix }} From d5f2510c1ea3f19ee4bc9588c0b732c09ab71011 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Wed, 5 Jun 2019 13:24:52 -0700 Subject: [PATCH 177/192] Fix for installing x86 and x64 windows runtimes into the same directory --- modules/KoreBuild.Tasks/InstallDotNet.cs | 31 +++++++++++++----------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/modules/KoreBuild.Tasks/InstallDotNet.cs b/modules/KoreBuild.Tasks/InstallDotNet.cs index 68732481d..c4625d373 100644 --- a/modules/KoreBuild.Tasks/InstallDotNet.cs +++ b/modules/KoreBuild.Tasks/InstallDotNet.cs @@ -19,6 +19,7 @@ namespace KoreBuild.Tasks /// public class InstallDotNet : Microsoft.Build.Utilities.Task, ICancelableTask { + private const string DefaultArch = "x64"; public readonly CancellationTokenSource _cts = new CancellationTokenSource(); /// @@ -86,7 +87,7 @@ private async Task ExecuteAsync() arguments.AddRange(defaultArgs); var arch = string.IsNullOrEmpty(request.Arch) - ? "x64" + ? DefaultArch : request.Arch; arguments.Add("-Architecture"); arguments.Add(arch); @@ -233,19 +234,21 @@ private async Task ExecuteAsync() private string GetInstallDir(string arch) { - if (string.IsNullOrEmpty(DotNetHome)) - { - var dotnetPath = Path.GetDirectoryName(DotNetMuxer.MuxerPath); - return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) - ? Path.Combine(Path.GetDirectoryName(dotnetPath), arch) - : dotnetPath; - } - else - { - return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && Environment.GetEnvironmentVariable("KOREBUILD_DISABLE_DOTNET_ARCH") == null - ? Path.Combine(DotNetHome, arch) - : DotNetHome; - } + var dotnetPath = string.IsNullOrEmpty(DotNetHome) + ? Path.GetDirectoryName(DotNetMuxer.MuxerPath) + : DotNetHome; + + return ShouldInstallToSubfolderOfDotNetHome(arch) + ? Path.Combine(Path.GetDirectoryName(dotnetPath), arch) + : dotnetPath; + } + + private bool ShouldInstallToSubfolderOfDotNetHome(string arch) + { + // Only install to $DOTNET_HOME/x64/ on Windows + // if KOREBUILD_DISABLE_DOTNET_ARCH is undefined or arch != x64 + return RuntimeInformation.IsOSPlatform(OSPlatform.Windows) + && (Environment.GetEnvironmentVariable("KOREBUILD_DISABLE_DOTNET_ARCH") == null || !string.Equals(DefaultArch, arch, StringComparison.OrdinalIgnoreCase)); } private IEnumerable CreateAssetRequests() From 2229c5dff7ca6384e7c17148a6da1aaee161f44d Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 6 Jun 2019 09:11:39 -0700 Subject: [PATCH 178/192] Fix for x86 getting installed into the repo root folder --- modules/KoreBuild.Tasks/InstallDotNet.cs | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/modules/KoreBuild.Tasks/InstallDotNet.cs b/modules/KoreBuild.Tasks/InstallDotNet.cs index c4625d373..3c055c5ac 100644 --- a/modules/KoreBuild.Tasks/InstallDotNet.cs +++ b/modules/KoreBuild.Tasks/InstallDotNet.cs @@ -234,16 +234,20 @@ private async Task ExecuteAsync() private string GetInstallDir(string arch) { - var dotnetPath = string.IsNullOrEmpty(DotNetHome) - ? Path.GetDirectoryName(DotNetMuxer.MuxerPath) - : DotNetHome; - - return ShouldInstallToSubfolderOfDotNetHome(arch) - ? Path.Combine(Path.GetDirectoryName(dotnetPath), arch) - : dotnetPath; + var shouldInstallToSubfolder = IsDotNetArchEnabled(arch); + var muxerDir = Path.GetDirectoryName(DotNetMuxer.MuxerPath); + var dotnetRootPath = !string.IsNullOrEmpty(DotNetHome) + ? DotNetHome + : shouldInstallToSubfolder + ? Path.GetDirectoryName(muxerDir) + : muxerDir; + + return shouldInstallToSubfolder + ? Path.Combine(dotnetRootPath, arch) + : dotnetRootPath; } - private bool ShouldInstallToSubfolderOfDotNetHome(string arch) + private bool IsDotNetArchEnabled(string arch) { // Only install to $DOTNET_HOME/x64/ on Windows // if KOREBUILD_DISABLE_DOTNET_ARCH is undefined or arch != x64 From 90dce5996d7683beae755205dd012b949b8a5e07 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 10 Jun 2019 08:46:44 -0700 Subject: [PATCH 179/192] KoreBuild is obsolete (#977) --- README.md | 8 ++++++-- files/KoreBuild/KoreBuild.sh | 25 +++++++++++++++++++++++++ files/KoreBuild/scripts/KoreBuild.psm1 | 24 ++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index bff46633e..f8112ff3c 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,9 @@ -Build Tools -=========== +Build Tools [Obsolete] +====================== + +:warning: **The tools in this repo are obsolete.** You should convert to using Arcade tools. +See . + Utilities used in the build system for projects that are used with ASP.NET Core and Entity Framework Core. diff --git a/files/KoreBuild/KoreBuild.sh b/files/KoreBuild/KoreBuild.sh index 952a8b4af..b3fbfc8f4 100755 --- a/files/KoreBuild/KoreBuild.sh +++ b/files/KoreBuild/KoreBuild.sh @@ -126,8 +126,33 @@ __install_tools() { __show_version_info() { MAGENTA="\033[0;95m" + YELLOW="\033[0;33m" RESET="\033[0m" + if [ -z "${TF_BUILD:-}" ]; then + echo "##vso[task.logissue type=warning] KoreBuild has been deprecated. You should use Arcade instead now. https://github.com/dotnet/arcade" + fi + + echo -e "" + echo -e "" + echo -e "" + echo -e "${YELLOW}*****************************************${RESET}" + echo -e "${YELLOW}*****************************************${RESET}" + echo -e "${YELLOW}** **${RESET}" + echo -e "${YELLOW}** WARNING! **${RESET}" + echo -e "${YELLOW}** **${RESET}" + echo -e "${YELLOW}** KoreBuild has been deprecated. **${RESET}" + echo -e "${YELLOW}** You should use Arcade instead now. **${RESET}" + echo -e "${YELLOW}** https://github.com/dotnet/arcade **${RESET}" + echo -e "${YELLOW}** **${RESET}" + echo -e "${YELLOW}** WARNING! **${RESET}" + echo -e "${YELLOW}** **${RESET}" + echo -e "${YELLOW}*****************************************${RESET}" + echo -e "${YELLOW}*****************************************${RESET}" + echo -e "" + echo -e "" + echo -e "" + __korebuild_version="$(__get_korebuild_version)" if [[ "$__korebuild_version" != '' ]]; then echo -e "${MAGENTA}Using KoreBuild ${__korebuild_version}${RESET}" diff --git a/files/KoreBuild/scripts/KoreBuild.psm1 b/files/KoreBuild/scripts/KoreBuild.psm1 index 93a773f36..5478f0e39 100644 --- a/files/KoreBuild/scripts/KoreBuild.psm1 +++ b/files/KoreBuild/scripts/KoreBuild.psm1 @@ -572,6 +572,30 @@ function Get-KoreBuildVersion { } function __show_version_info { + if ($env:TF_BUILD) { + Write-Host "##vso[task.logissue type=warning] KoreBuild has been deprecated. You should use Arcade instead now. https://github.com/dotnet/arcade" + } + + Write-Host -f Yellow "" + Write-Host -f Yellow "" + Write-Host -f Yellow "" + Write-Host -f Yellow "*****************************************" + Write-Host -f Yellow "*****************************************" + Write-Host -f Yellow "** **" + Write-Host -f Yellow "** WARNING! **" + Write-Host -f Yellow "** **" + Write-Host -f Yellow "** KoreBuild has been deprecated. **" + Write-Host -f Yellow "** You should use Arcade instead now. **" + Write-Host -f Yellow "** https://github.com/dotnet/arcade **" + Write-Host -f Yellow "** **" + Write-Host -f Yellow "** WARNING! **" + Write-Host -f Yellow "** **" + Write-Host -f Yellow "*****************************************" + Write-Host -f Yellow "*****************************************" + Write-Host -f Yellow "" + Write-Host -f Yellow "" + Write-Host -f Yellow "" + $version = Get-KoreBuildVersion if ($version) { Write-Host -ForegroundColor Magenta "Using KoreBuild $version" From 809233f23482fea0e707ba052625bacfd99e5ef6 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Mon, 10 Jun 2019 21:09:26 -0700 Subject: [PATCH 180/192] Fix escaping when generating args for signcheck.exe (#978) --- modules/KoreBuild.Tasks/CodeSign.targets | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/KoreBuild.Tasks/CodeSign.targets b/modules/KoreBuild.Tasks/CodeSign.targets index d11d7be3a..2ea2a8399 100644 --- a/modules/KoreBuild.Tasks/CodeSign.targets +++ b/modules/KoreBuild.Tasks/CodeSign.targets @@ -60,7 +60,7 @@ - + From 803fd176f1ae147aa8af08e49e76ffda7221a4cd Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Tue, 11 Jun 2019 22:52:08 -0700 Subject: [PATCH 181/192] Update sdk.version (#979) --- files/KoreBuild/config/sdk.version | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 613650be2..8ca367932 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview5-011568 \ No newline at end of file +3.0.100-preview6-012264 From e92d27a698e3b16bbe27e797d4f395b21ffe2bdb Mon Sep 17 00:00:00 2001 From: Immo Landwerth Date: Thu, 9 Apr 2020 12:56:16 -0700 Subject: [PATCH 182/192] Link Code of Conduct (#984) --- CODE-OF-CONDUCT.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 CODE-OF-CONDUCT.md diff --git a/CODE-OF-CONDUCT.md b/CODE-OF-CONDUCT.md new file mode 100644 index 000000000..775f221c9 --- /dev/null +++ b/CODE-OF-CONDUCT.md @@ -0,0 +1,6 @@ +# Code of Conduct + +This project has adopted the code of conduct defined by the Contributor Covenant +to clarify expected behavior in our community. + +For more information, see the [.NET Foundation Code of Conduct](https://dotnetfoundation.org/code-of-conduct). From 73fd0ab373e90296adc39f4b24d201a189f955d7 Mon Sep 17 00:00:00 2001 From: John Luo Date: Fri, 19 Mar 2021 14:25:44 -0700 Subject: [PATCH 183/192] Replace 'master' with 'main' (#996) * Replace 'master' with 'main' --- .azure/pipelines/ci.yml | 2 +- .azure/pipelines/jobs/default-build.yml | 4 ++-- CONTRIBUTING.md | 2 +- README.md | 4 ++-- build/dependencies.props | 2 +- build/sources.props | 5 ++--- docs/KoreBuild.md | 4 ++-- docs/Signing.md | 2 +- files/KoreBuild/scripts/dotnet-install.ps1 | 2 +- files/KoreBuild/scripts/dotnet-install.sh | 2 +- korebuild.json | 2 +- modules/KoreBuild.Tasks/module.props | 2 +- scripts/bootstrapper/run.ps1 | 6 +++--- scripts/bootstrapper/run.sh | 2 +- testassets/RepoThatShouldFailToBuild/korebuild.json | 4 ++-- testassets/SimpleRepo/korebuild.json | 4 ++-- tools/korebuild.schema.json | 4 ++-- version.props | 2 +- 18 files changed, 27 insertions(+), 28 deletions(-) diff --git a/.azure/pipelines/ci.yml b/.azure/pipelines/ci.yml index 291117e82..48ced2c48 100644 --- a/.azure/pipelines/ci.yml +++ b/.azure/pipelines/ci.yml @@ -2,7 +2,7 @@ trigger: branches: include: - - master + - main - release/* # Trigger builds for PRs to any branch diff --git a/.azure/pipelines/jobs/default-build.yml b/.azure/pipelines/jobs/default-build.yml index 30da97589..2b6b60e10 100644 --- a/.azure/pipelines/jobs/default-build.yml +++ b/.azure/pipelines/jobs/default-build.yml @@ -68,13 +68,13 @@ jobs: maxParallel: 8 matrix: ${{ parameters.matrix }} # Map friendly OS names to the right queue - # See https://github.com/dotnet/arcade/blob/master/Documentation/ChoosingAMachinePool.md and + # See https://github.com/dotnet/arcade/blob/main/Documentation/ChoosingAMachinePool.md and # https://docs.microsoft.com/en-us/azure/devops/pipelines/agents/hosted?view=azure-devops&tabs=yaml#use-a-microsoft-hosted-agent pool: ${{ if ne(parameters.poolName, '') }}: name: ${{ parameters.poolName }} ${{ if and(eq(parameters.poolName, ''), eq(parameters.agentOs, 'macOS')) }}: - vmImage: macOS-10.13 + vmImage: macOS-10.15 ${{ if and(eq(parameters.poolName, ''), eq(parameters.agentOs, 'Linux')) }}: vmImage: ubuntu-16.04 ${{ if and(eq(parameters.poolName, ''), eq(parameters.agentOs, 'Windows')) }}: diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ac2d28d2f..3924182cb 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,4 +1,4 @@ Contributing ====== -Information on contributing to this repo is in the [Contributing Guide](https://github.com/aspnet/AspNetCore/blob/master/CONTRIBUTING.md) in the AspNetCore repo. +Information on contributing to this repo is in the [Contributing Guide](https://github.com/dotnet/aspnetcore/blob/main/CONTRIBUTING.md) in the AspNetCore repo. diff --git a/README.md b/README.md index f8112ff3c..9b6dfd484 100644 --- a/README.md +++ b/README.md @@ -17,12 +17,12 @@ See [docs/README.md](./docs/README.md). Channel | Latest Build ---------------|:--------------- -master | ![badge][master-badge] +main | ![badge][main-badge] release/2.2 | ![badge][rel-2.2-badge] release/2.1 | ![badge][rel-2.1-badge] release/2.0 | ![badge][rel-2.0-badge] -[master-badge]: https://aspnetcore.blob.core.windows.net/buildtools/korebuild/channels/master/badge.svg +[main-badge]: https://aspnetcore.blob.core.windows.net/buildtools/korebuild/channels/main/badge.svg [rel-2.2-badge]: https://aspnetcore.blob.core.windows.net/buildtools/korebuild/channels/release/2.2/badge.svg [rel-2.1-badge]: https://aspnetcore.blob.core.windows.net/buildtools/korebuild/channels/release/2.1/badge.svg [rel-2.0-badge]: https://aspnetcore.blob.core.windows.net/buildtools/korebuild/channels/release/2.0/badge.svg diff --git a/build/dependencies.props b/build/dependencies.props index 5f84433d3..6a42a3d43 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -19,7 +19,7 @@ $(DefaultDotNetAssetArch) diff --git a/scripts/bootstrapper/run.ps1 b/scripts/bootstrapper/run.ps1 index 2f892843e..b0ca082f1 100755 --- a/scripts/bootstrapper/run.ps1 +++ b/scripts/bootstrapper/run.ps1 @@ -52,8 +52,8 @@ in the file are overridden by command line parameters. Example config file: ```json { - "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/master/tools/korebuild.schema.json", - "channel": "master", + "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/main/tools/korebuild.schema.json", + "channel": "main", "toolsSource": "https://aspnetcore.blob.core.windows.net/buildtools" } ``` @@ -193,7 +193,7 @@ if (!$DotNetHome) { else { Join-Path $PSScriptRoot '.dotnet'} } -if (!$Channel) { $Channel = 'master' } +if (!$Channel) { $Channel = 'main' } if (!$ToolsSource) { $ToolsSource = 'https://aspnetcore.blob.core.windows.net/buildtools' } # Execute diff --git a/scripts/bootstrapper/run.sh b/scripts/bootstrapper/run.sh index 129b0b957..89a6442d6 100755 --- a/scripts/bootstrapper/run.sh +++ b/scripts/bootstrapper/run.sh @@ -251,7 +251,7 @@ if [ -f "$config_file" ]; then fi [ -z "${DOTNET_HOME:-}" ] && DOTNET_HOME="$HOME/.dotnet" -[ -z "$channel" ] && channel='master' +[ -z "$channel" ] && channel='main' [ -z "$tools_source" ] && tools_source='https://aspnetcore.blob.core.windows.net/buildtools' get_korebuild diff --git a/testassets/RepoThatShouldFailToBuild/korebuild.json b/testassets/RepoThatShouldFailToBuild/korebuild.json index 8a276a7f3..9217392b1 100644 --- a/testassets/RepoThatShouldFailToBuild/korebuild.json +++ b/testassets/RepoThatShouldFailToBuild/korebuild.json @@ -1,4 +1,4 @@ { - "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/master/tools/korebuild.schema.json", - "channel": "master" + "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/main/tools/korebuild.schema.json", + "channel": "main" } diff --git a/testassets/SimpleRepo/korebuild.json b/testassets/SimpleRepo/korebuild.json index 8a276a7f3..9217392b1 100644 --- a/testassets/SimpleRepo/korebuild.json +++ b/testassets/SimpleRepo/korebuild.json @@ -1,4 +1,4 @@ { - "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/master/tools/korebuild.schema.json", - "channel": "master" + "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/main/tools/korebuild.schema.json", + "channel": "main" } diff --git a/tools/korebuild.schema.json b/tools/korebuild.schema.json index 94a7015a1..932bb422b 100644 --- a/tools/korebuild.schema.json +++ b/tools/korebuild.schema.json @@ -109,9 +109,9 @@ "channel": { "description": "The channel of KoreBuild used to select a version when korebuild-lock.txt is not present.", "type": "string", - "default": "master", + "default": "main", "enum": [ - "master", + "main", "release/2.2", "release/2.1", "release/2.0" diff --git a/version.props b/version.props index 0601f1fd6..95243317c 100644 --- a/version.props +++ b/version.props @@ -1,6 +1,6 @@ - master + main 3.0.0 build t000 From 074b1d6066777c1c5d41938f8cd606a80fa5dca1 Mon Sep 17 00:00:00 2001 From: William Godbe Date: Mon, 3 Jan 2022 09:42:35 -0800 Subject: [PATCH 184/192] Fix component governance bugs (#1008) * Fix component governance bugs * Move off of expiring pools * Fixup * Try updating SDK * Update test --- .azure/pipelines/jobs/default-build.yml | 4 ++-- build/dependencies.props | 1 + files/KoreBuild/config/sdk.version | 2 +- modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj | 1 + test/KoreBuild.Tasks.Tests/InstallDotNetTests.cs | 4 ++-- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/.azure/pipelines/jobs/default-build.yml b/.azure/pipelines/jobs/default-build.yml index 2b6b60e10..91491ead2 100644 --- a/.azure/pipelines/jobs/default-build.yml +++ b/.azure/pipelines/jobs/default-build.yml @@ -76,9 +76,9 @@ jobs: ${{ if and(eq(parameters.poolName, ''), eq(parameters.agentOs, 'macOS')) }}: vmImage: macOS-10.15 ${{ if and(eq(parameters.poolName, ''), eq(parameters.agentOs, 'Linux')) }}: - vmImage: ubuntu-16.04 + vmImage: ubuntu-18.04 ${{ if and(eq(parameters.poolName, ''), eq(parameters.agentOs, 'Windows')) }}: - vmImage: vs2017-win2016 + vmImage: windows-latest variables: AgentOsName: ${{ parameters.agentOs }} ASPNETCORE_TEST_LOG_MAXPATH: "200" # Keep test log file name length low enough for artifact zipping diff --git a/build/dependencies.props b/build/dependencies.props index 6a42a3d43..d7eed501e 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -13,6 +13,7 @@ 12.0.1 4.7.0-rtm.5148 4.7.0-rtm.5148 + 4.3.4 2.2.7 2.4.1 2.4.1 diff --git a/files/KoreBuild/config/sdk.version b/files/KoreBuild/config/sdk.version index 8ca367932..6a0741321 100644 --- a/files/KoreBuild/config/sdk.version +++ b/files/KoreBuild/config/sdk.version @@ -1 +1 @@ -3.0.100-preview6-012264 +3.1.416 diff --git a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj index d1346531e..d78e96b3c 100644 --- a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj +++ b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj @@ -26,6 +26,7 @@ + diff --git a/test/KoreBuild.Tasks.Tests/InstallDotNetTests.cs b/test/KoreBuild.Tasks.Tests/InstallDotNetTests.cs index 29f364631..646753257 100644 --- a/test/KoreBuild.Tasks.Tests/InstallDotNetTests.cs +++ b/test/KoreBuild.Tasks.Tests/InstallDotNetTests.cs @@ -30,7 +30,7 @@ public void InstallsDotnetCoreRuntime() Directory.Delete(path, recursive: true); } - var request = new TaskItem("1.0.5", new Hashtable + var request = new TaskItem("2.1.21", new Hashtable { ["Runtime"] = "dotnet", ["InstallDir"] = path @@ -47,7 +47,7 @@ public void InstallsDotnetCoreRuntime() InstallScript = script, }; - var expected = Path.Combine(path, "shared", "Microsoft.NETCore.App", "1.0.5", ".version"); + var expected = Path.Combine(path, "shared", "Microsoft.NETCore.App", "2.1.21", ".version"); Assert.False(File.Exists(expected), "Test folder should have been deleted"); Assert.True(task.Execute(), "Task should pass"); From 9f74ce395fdb8f7ba704169c28f3abd38e6e8d16 Mon Sep 17 00:00:00 2001 From: William Godbe Date: Tue, 4 Jan 2022 09:01:41 -0800 Subject: [PATCH 185/192] Add System.Net.Http everywhere (#1009) --- Directory.Build.props | 1 + modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj | 1 - 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/Directory.Build.props b/Directory.Build.props index cd5dd6049..92e5bbed9 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -18,6 +18,7 @@ + diff --git a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj index d78e96b3c..d1346531e 100644 --- a/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj +++ b/modules/KoreBuild.Tasks/KoreBuild.Tasks.csproj @@ -26,7 +26,6 @@ - From 7c56df5729f27fa357aa244cf8a28044d3af273a Mon Sep 17 00:00:00 2001 From: William Godbe Date: Thu, 3 Nov 2022 13:41:27 -0700 Subject: [PATCH 186/192] Add CodeQL3000 to aspnet/buildtools pipeline (#1013) * Fix Param syntax * Fixup * Try this * Maybe this * Now this * This might work * Feedback * Feedback * Fixup --- .azure/pipelines/ci.yml | 38 ++++++++++--- .azure/pipelines/jobs/default-build.yml | 11 ++++ .azure/pipelines/jobs/project-ci.yml | 72 ++++++++++++++++--------- .config/tsaoptions.json | 12 +++++ 4 files changed, 100 insertions(+), 33 deletions(-) create mode 100644 .config/tsaoptions.json diff --git a/.azure/pipelines/ci.yml b/.azure/pipelines/ci.yml index 48ced2c48..0acbdf4a0 100644 --- a/.azure/pipelines/ci.yml +++ b/.azure/pipelines/ci.yml @@ -11,6 +11,25 @@ pr: include: - '*' +schedules: +- cron: 0 9 * * 1 + displayName: "Run CodeQL3000 weekly, Monday at 2:00 AM PDT" + branches: + include: + - release/2.1 + - main + always: true + +parameters: +# Parameters below are ignored in public builds. +# +# Choose whether to run the CodeQL3000 tasks. +# Manual builds align w/ official builds unless this parameter is true. +- name: runCodeQL3000 + default: false + displayName: Run CodeQL3000 tasks + type: boolean + variables: BuildConfiguration: Release @@ -19,11 +38,14 @@ jobs: parameters: # Ensures the alignment of branch name and deployment params buildArgs: '/warnaserror:BUILD1001' - afterBuild: - - task: PublishBuildArtifacts@1 - displayName: Upload KoreBuild artifact - condition: and(succeeded(), eq(variables['BuildConfiguration'], 'Release'), eq(variables['AgentOsName'], 'Windows'), eq(variables['system.pullrequest.isfork'], false)) - inputs: - pathtoPublish: artifacts/korebuild/ - artifactName: korebuild - artifactType: Container + ${{ if and(eq(variables['System.TeamProject'], 'internal'), or(eq(variables['Build.Reason'], 'Schedule'), and(eq(variables['Build.Reason'], 'Manual'), eq(parameters.runCodeQL3000, 'true')))) }}: + runCodeQL3000: true + ${{ else }}: + afterBuild: + - task: PublishBuildArtifacts@1 + displayName: Upload KoreBuild artifact + condition: and(succeeded(), eq(variables['BuildConfiguration'], 'Release'), eq(variables['AgentOsName'], 'Windows'), eq(variables['system.pullrequest.isfork'], false)) + inputs: + pathtoPublish: artifacts/korebuild/ + artifactName: korebuild + artifactType: Container diff --git a/.azure/pipelines/jobs/default-build.yml b/.azure/pipelines/jobs/default-build.yml index 91491ead2..2bd743e6c 100644 --- a/.azure/pipelines/jobs/default-build.yml +++ b/.azure/pipelines/jobs/default-build.yml @@ -48,6 +48,7 @@ parameters: afterBuild: [] codeSign: false variables: {} + runCodeQL3000: false dependsOn: '' # buildSteps: [] - don't define an empty object default because there is no way in template expression yet to check "if isEmpty(parameters.buildSteps)" # jobName: '' - use agentOs by default. @@ -90,6 +91,16 @@ jobs: _SignType: real ${{ if or(ne(parameters.codeSign, 'true'), ne(variables['System.TeamProject'], 'internal'), eq(variables['Build.Reason'], 'PullRequest')) }}: _SignType: '' + ${{ if eq(parameters.runCodeQL3000, 'true') }}: + # Do not let CodeQL3000 Extension gate scan frequency. + Codeql.Cadence: 0 + # Enable CodeQL3000 unconditionally so it may be run on any branch. + Codeql.Enabled: true + Codeql.SourceRoot: src + # CodeQL3000 needs this plumbed along as a variable to enable TSA. + Codeql.TSAEnabled: ${{ eq(variables['Build.Reason'], 'Schedule') }} + # Default expects tsaoptions.json under SourceRoot. + Codeql.TSAOptionsPath: '$(Build.SourcesDirectory)/.config/tsaoptions.json' ${{ insert }}: ${{ parameters.variables }} steps: - checkout: self diff --git a/.azure/pipelines/jobs/project-ci.yml b/.azure/pipelines/jobs/project-ci.yml index 51704ec0f..3b738c4c9 100644 --- a/.azure/pipelines/jobs/project-ci.yml +++ b/.azure/pipelines/jobs/project-ci.yml @@ -13,6 +13,8 @@ # The matrix of configurations to run. By default, it runs a Debug and Release build on all platforms # codeSign: boolean # This build definition is enabled for code signing. (Only applies to Windows) +# runCodeQL3000: boolean +# This build should run CodeQL3000 instead of the regular build parameters: buildArgs: '' @@ -20,30 +22,50 @@ parameters: afterBuild: [] codeSign: false variables: {} + runCodeQL3000: false jobs: -- template: default-build.yml - parameters: - agentOs: Windows - matrix: ${{ parameters.matrix }} - buildArgs: ${{ parameters.buildArgs }} - beforeBuild: ${{ parameters.beforeBuild }} - afterBuild: ${{ parameters.afterBuild }} - codeSign: ${{ parameters.codeSign }} - variables: ${{ parameters.variables }} -- template: default-build.yml - parameters: - agentOs: macOS - matrix: ${{ parameters.matrix }} - buildArgs: ${{ parameters.buildArgs }} - beforeBuild: ${{ parameters.beforeBuild }} - afterBuild: ${{ parameters.afterBuild }} - variables: ${{ parameters.variables }} -- template: default-build.yml - parameters: - agentOs: Linux - matrix: ${{ parameters.matrix }} - buildArgs: ${{ parameters.buildArgs }} - beforeBuild: ${{ parameters.beforeBuild }} - afterBuild: ${{ parameters.afterBuild }} - variables: ${{ parameters.variables }} +- ${{ if and(ne(variables['System.TeamProject'], 'public'), eq(parameters.runCodeQL3000, 'true')) }}: + - template: default-build.yml + parameters: + agentOs: Windows + matrix: ${{ parameters.matrix }} + buildArgs: ${{ parameters.buildArgs }} + beforeBuild: + - task: CodeQL3000Init@0 + displayName: CodeQL Initialize + - script: "echo ##vso[build.addbuildtag]CodeQL3000" + displayName: 'Set CI CodeQL3000 tag' + condition: ne(variables.CODEQL_DIST,'') + afterBuild: + - task: CodeQL3000Finalize@0 + displayName: CodeQL Finalize + codeSign: false + variables: ${{ parameters.variables }} + runCodeQL3000: true +- ${{ else }}: # regular build + - template: default-build.yml + parameters: + agentOs: Windows + matrix: ${{ parameters.matrix }} + buildArgs: ${{ parameters.buildArgs }} + beforeBuild: ${{ parameters.beforeBuild }} + afterBuild: ${{ parameters.afterBuild }} + codeSign: ${{ parameters.codeSign }} + variables: ${{ parameters.variables }} + - template: default-build.yml + parameters: + agentOs: macOS + matrix: ${{ parameters.matrix }} + buildArgs: ${{ parameters.buildArgs }} + beforeBuild: ${{ parameters.beforeBuild }} + afterBuild: ${{ parameters.afterBuild }} + variables: ${{ parameters.variables }} + - template: default-build.yml + parameters: + agentOs: Linux + matrix: ${{ parameters.matrix }} + buildArgs: ${{ parameters.buildArgs }} + beforeBuild: ${{ parameters.beforeBuild }} + afterBuild: ${{ parameters.afterBuild }} + variables: ${{ parameters.variables }} diff --git a/.config/tsaoptions.json b/.config/tsaoptions.json new file mode 100644 index 000000000..0128aa272 --- /dev/null +++ b/.config/tsaoptions.json @@ -0,0 +1,12 @@ +{ + "areaPath": "DevDiv\\ASP.NET Core", + "codebaseName": "Buildtools", + "instanceUrl": "https://devdiv.visualstudio.com/", + "iterationPath": "DevDiv", + "notificationAliases": [ + "aspnetcore-build@microsoft.com" + ], + "projectName": "DEVDIV", + "repositoryName": "Buildtools", + "template": "TFSDEVDIV" +} \ No newline at end of file From 0e51e9b63d5c3bb135f09269c5a1f8f85ab56040 Mon Sep 17 00:00:00 2001 From: William Godbe Date: Tue, 13 Dec 2022 15:25:45 -0800 Subject: [PATCH 187/192] update TFM to 3.1 (#1016) * update TFM to 3.1 * Fixup * net462 --- build/tasks/RepoTasks.csproj | 2 +- build/tasks/ZipArchive.cs | 2 +- files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props | 2 +- .../Utilities/DotNetMuxer.cs | 2 +- test/BuildTasks.Tests/BuildTasks.Tests.csproj | 2 +- .../KoreBuild.FunctionalTests.csproj | 2 +- test/KoreBuild.Tasks.Tests/KoreBuild.Tasks.Tests.csproj | 2 +- .../NuGetPackageVerifier.Tests.csproj | 2 +- .../src/BadConsole/BadConsole.csproj | 2 +- testassets/SimpleRepo/NuGetPackageVerifier.json | 2 +- testassets/SimpleRepo/build/tasks/RepoTasks.csproj | 2 +- .../SimpleRepo/samples/Simple.Sample/Simple.Sample.csproj | 2 +- .../SimpleRepo/src/Simple.CliTool/Simple.CliTool.csproj | 2 +- testassets/SimpleRepo/src/Simple.Lib/Simple.Lib.csproj | 2 +- testassets/SimpleRepo/test/Simple.Test/Simple.Test.csproj | 4 ++-- 15 files changed, 16 insertions(+), 16 deletions(-) diff --git a/build/tasks/RepoTasks.csproj b/build/tasks/RepoTasks.csproj index e321cc07f..d6c2750ea 100644 --- a/build/tasks/RepoTasks.csproj +++ b/build/tasks/RepoTasks.csproj @@ -2,7 +2,7 @@ - netcoreapp3.0 + netcoreapp3.1 net46 $(DefineConstants);BuildTools $(NoWarn);NU1603 diff --git a/build/tasks/ZipArchive.cs b/build/tasks/ZipArchive.cs index 0be8d1753..54102f60c 100644 --- a/build/tasks/ZipArchive.cs +++ b/build/tasks/ZipArchive.cs @@ -83,7 +83,7 @@ public override bool Execute() var entry = zip.CreateEntryFromFile(file.ItemSpec, entryName); #if NET46 -#elif NETCOREAPP3_0 || NETSTANDARD2_0 +#elif NETCOREAPP3_1 || NETSTANDARD2_0 if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { // This isn't required when creating a zip on Windows. unzip will check which diff --git a/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props b/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props index d655cb88f..933bc4bff 100644 --- a/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props +++ b/files/KoreBuild/msbuild/KoreBuild.RepoTasks.Sdk/Sdk/Sdk.props @@ -5,7 +5,7 @@ true true - + library - 12.0.1 - 4.7.0-rtm.5148 - 4.7.0-rtm.5148 + 13.0.1 + 6.0.2 + 6.0.2 4.3.4 2.2.7 2.4.1 From 45070a10177d642a895d551602ec1cdc2a6042f9 Mon Sep 17 00:00:00 2001 From: Steve Sanderson Date: Thu, 7 Dec 2023 21:51:58 +0000 Subject: [PATCH 191/192] Update dependencies (#1027) --- build/dependencies.props | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/dependencies.props b/build/dependencies.props index 5f4670562..528105dcf 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -11,8 +11,8 @@ 4.7.99 13.0.1 - 6.0.2 - 6.0.2 + 6.0.5 + 6.0.5 4.3.4 2.2.7 2.4.1 From 254c3767bce75022c24418b03bc180cc003d27e1 Mon Sep 17 00:00:00 2001 From: Andrew Casey Date: Thu, 7 Mar 2024 14:21:06 -0800 Subject: [PATCH 192/192] Bump nuget.packaging to 6.0.6 --- build/dependencies.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build/dependencies.props b/build/dependencies.props index 528105dcf..c4c3b56d4 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -11,7 +11,7 @@ 4.7.99 13.0.1 - 6.0.5 + 6.0.6 6.0.5 4.3.4 2.2.7

WE$I5{i;35l=vO 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¾*oCPU_+C(cEw)%Ovh-}&~`e7?5?4Z<; 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 z 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