diff --git a/Microsoft.DotNet.Cli.sln b/Microsoft.DotNet.Cli.sln index a5f56ff79..22d771abd 100644 --- a/Microsoft.DotNet.Cli.sln +++ b/Microsoft.DotNet.Cli.sln @@ -21,6 +21,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Dotnet.Sdk.Intern EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SdkTests", "test\SdkTests\SdkTests.csproj", "{CB1EE94E-CB83-4071-9DD0-9929AE2B7282}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "core-sdk-tasks.Tests", "test\core-sdk-tasks.Tests\core-sdk-tasks.Tests.csproj", "{658EF9BE-452C-4D31-AA24-B9E2235799A8}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -55,6 +57,10 @@ Global {CB1EE94E-CB83-4071-9DD0-9929AE2B7282}.Debug|Any CPU.Build.0 = Debug|Any CPU {CB1EE94E-CB83-4071-9DD0-9929AE2B7282}.Release|Any CPU.ActiveCfg = Release|Any CPU {CB1EE94E-CB83-4071-9DD0-9929AE2B7282}.Release|Any CPU.Build.0 = Release|Any CPU + {658EF9BE-452C-4D31-AA24-B9E2235799A8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {658EF9BE-452C-4D31-AA24-B9E2235799A8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {658EF9BE-452C-4D31-AA24-B9E2235799A8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {658EF9BE-452C-4D31-AA24-B9E2235799A8}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -66,6 +72,7 @@ Global {78E15EC1-7732-41E3-8591-934E9F583254} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7} {7EE15292-2CAD-44FA-8A1F-BAC4688A49E0} = {ED2FE3E2-F7E7-4389-8231-B65123F2076F} {CB1EE94E-CB83-4071-9DD0-9929AE2B7282} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7} + {658EF9BE-452C-4D31-AA24-B9E2235799A8} = {17735A9D-BFD9-4585-A7CB-3208CA6EA8A7} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {B526D2CE-EE2D-4AD4-93EF-1867D90FF1F5} diff --git a/src/core-sdk-tasks/CalculateTemplateVersions.cs b/src/core-sdk-tasks/CalculateTemplateVersions.cs new file mode 100644 index 000000000..55d58fd40 --- /dev/null +++ b/src/core-sdk-tasks/CalculateTemplateVersions.cs @@ -0,0 +1,80 @@ +// 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. + +using Microsoft.Build.Framework; +using Microsoft.Build.Utilities; +using NuGet.Versioning; + +namespace Microsoft.DotNet.Cli.Build +{ + public class CalculateTemplateVersions : Task + { + [Required] + public string AspNetCorePackageVersionTemplate { get; set; } + + [Required] + public string GitCommitCount { get; set; } + + [Required] + public string VersionSuffix { get; set; } + + [Output] + public string BundledTemplateMSIVersion { get; set; } + + [Output] + public string BundledTemplateInstallPath { get; set; } + + [Output] + public string BundledTemplateMajorMinorVersion { get; set; } + + private const int _patchVersionResetOffset = 1; + + public override bool Execute() + { + var result = Calculate(AspNetCorePackageVersionTemplate, GitCommitCount, VersionSuffix); + BundledTemplateMSIVersion = result.BundledTemplateMsiVersion; + BundledTemplateInstallPath = result.BundledTemplateInstallPath; + BundledTemplateMajorMinorVersion = result.BundledTemplateMajorMinorVersion; + + return true; + } + + public static + (string BundledTemplateMsiVersion, + string BundledTemplateInstallPath, + string BundledTemplateMajorMinorVersion) Calculate(string aspNetCorePackageVersionTemplate, + string gitCommitCount, string versionSuffix) + { + var aspNetCoreTemplate = NuGetVersion.Parse(aspNetCorePackageVersionTemplate); + + NuGetVersion baseMajorMinorPatch = GetBaseMajorMinorPatch(aspNetCoreTemplate); + + string bundledTemplateInstallPath = aspNetCoreTemplate.IsPrerelease + ? $"{baseMajorMinorPatch.Major}.{baseMajorMinorPatch.Minor}.{baseMajorMinorPatch.Patch}-{versionSuffix}" + : $"{baseMajorMinorPatch.Major}.{baseMajorMinorPatch.Minor}.{baseMajorMinorPatch.Patch}"; + + return ( + $"{baseMajorMinorPatch.Major}.{baseMajorMinorPatch.Minor}.{baseMajorMinorPatch.Patch}.{gitCommitCount}", + bundledTemplateInstallPath, + $"{baseMajorMinorPatch.Major}.{baseMajorMinorPatch.Minor}"); + } + + private static NuGetVersion GetBaseMajorMinorPatch(NuGetVersion aspNetCoreTemplate) + { + // due to historical bug https://github.com/dotnet/core-sdk/issues/6243 + // we need to increase patch version by one in order to "reset" existing install ComponentId + // more in the above bug's detail. + // There is no non-deterministic existing ComponentId under Major version 5. + // so only apply the patch bump when below 5 + + int basePatch = + aspNetCoreTemplate.Major < 5 + ? aspNetCoreTemplate.Patch + _patchVersionResetOffset + : aspNetCoreTemplate.Patch; + + var baseMajorMinorPatch = new NuGetVersion(aspNetCoreTemplate.Major, aspNetCoreTemplate.Minor, + basePatch); + return baseMajorMinorPatch; + } + } +} diff --git a/src/redist/targets/BuildCoreSdkTasks.targets b/src/redist/targets/BuildCoreSdkTasks.targets index 7ffb389a9..d876cb37f 100644 --- a/src/redist/targets/BuildCoreSdkTasks.targets +++ b/src/redist/targets/BuildCoreSdkTasks.targets @@ -19,6 +19,7 @@ Properties="ArtifactsDir=$(ArtifactsDir)tasks\"/> + diff --git a/src/redist/targets/BundledTemplates.targets b/src/redist/targets/BundledTemplates.targets index c24479389..709da201f 100644 --- a/src/redist/targets/BundledTemplates.targets +++ b/src/redist/targets/BundledTemplates.targets @@ -1,47 +1,38 @@ - - $(AspNetCorePackageVersionFor31Templates.IndexOf('-')) - $(AspNetCorePackageVersionFor31Templates) - $(AspNetCorePackageVersionFor31Templates.Substring(0, $(AspNetCore31VersionPreReleaseSeparator))) - $(AspNetCore31VersionMajorMinorPatchVersion).$(GitCommitCount) - $(AspNetCore31VersionMajorMinorPatchVersion) - $(BundledTemplates31InstallPath)-$(VersionSuffix) - $([MSBuild]::Add($(AspNetCore31VersionMajorMinorPatchVersion.IndexOf('.')), 1)) - $(AspNetCore31VersionMajorMinorPatchVersion.IndexOf('.', $(Templates31VersionPatchSeparatorIndex))) - $(AspNetCore31VersionMajorMinorPatchVersion.Substring(0, $(Templates31VersionPatchSeparatorIndex))) - $(AspNetCorePackageVersionFor30Templates.IndexOf('-')) - $(AspNetCorePackageVersionFor30Templates) - $(AspNetCorePackageVersionFor30Templates.Substring(0, $(AspNetCore30VersionPreReleaseSeparator))) - $(AspNetCore30VersionMajorMinorPatchVersion).$(GitCommitCount) - $(AspNetCore30VersionMajorMinorPatchVersion) - $(BundledTemplates30InstallPath)-$(VersionSuffix) - $([MSBuild]::Add($(AspNetCore30VersionMajorMinorPatchVersion.IndexOf('.')), 1)) - $(AspNetCore30VersionMajorMinorPatchVersion.IndexOf('.', $(Templates30VersionPatchSeparatorIndex))) - $(AspNetCore30VersionMajorMinorPatchVersion.Substring(0, $(Templates30VersionPatchSeparatorIndex))) + + + + + - $(AspNetCorePackageVersionFor22Templates.IndexOf('-')) - $(AspNetCorePackageVersionFor22Templates) - $(AspNetCorePackageVersionFor22Templates.Substring(0, $(AspNetCore22VersionPreReleaseSeparator))) - $(AspNetCore22VersionMajorMinorPatchVersion).$(GitCommitCount) - $(AspNetCore22VersionMajorMinorPatchVersion) - $(BundledTemplates22InstallPath)-$(VersionSuffix) - $([MSBuild]::Add($(AspNetCore22VersionMajorMinorPatchVersion.IndexOf('.')), 1)) - $(AspNetCore22VersionMajorMinorPatchVersion.IndexOf('.', $(Templates22VersionPatchSeparatorIndex))) - $(AspNetCore22VersionMajorMinorPatchVersion.Substring(0, $(Templates22VersionPatchSeparatorIndex))) + + + + + - $(AspNetCorePackageVersionFor21Templates.IndexOf('-')) - $(AspNetCorePackageVersionFor21Templates) - $(AspNetCorePackageVersionFor21Templates.Substring(0, $(AspNetCore21VersionPreReleaseSeparator))) - $(AspNetCore21VersionMajorMinorPatchVersion).$(GitCommitCount) - $(AspNetCore21VersionMajorMinorPatchVersion) - $(BundledTemplates21InstallPath)-$(VersionSuffix) - $([MSBuild]::Add($(AspNetCore21VersionMajorMinorPatchVersion.IndexOf('.')), 1)) - $(AspNetCore21VersionMajorMinorPatchVersion.IndexOf('.', $(Templates21VersionPatchSeparatorIndex))) - $(AspNetCore21VersionMajorMinorPatchVersion.Substring(0, $(Templates21VersionPatchSeparatorIndex))) - + + + + + + + + + + + diff --git a/src/redist/targets/packaging/windows/clisdk/generatemsi.ps1 b/src/redist/targets/packaging/windows/clisdk/generatemsi.ps1 index d19137f5c..3920119b3 100644 --- a/src/redist/targets/packaging/windows/clisdk/generatemsi.ps1 +++ b/src/redist/targets/packaging/windows/clisdk/generatemsi.ps1 @@ -31,7 +31,7 @@ function RunHeat # use XSLT tranform to match the file path contains "AppHostTemplate\apphost.exe" and give it the same ID all the time. $heatOutput = .\heat.exe dir `"$inputDir`" -template fragment ` - -sreg -gg ` + -sreg -ag ` -var var.DotnetSrc ` -cg InstallFiles ` -srd ` diff --git a/src/redist/targets/packaging/windows/clisdk/generatetemplatesmsi.ps1 b/src/redist/targets/packaging/windows/clisdk/generatetemplatesmsi.ps1 index a987c584c..7947d20a4 100644 --- a/src/redist/targets/packaging/windows/clisdk/generatetemplatesmsi.ps1 +++ b/src/redist/targets/packaging/windows/clisdk/generatetemplatesmsi.ps1 @@ -25,7 +25,7 @@ function RunHeat Write-Information "Running heat.." $heatOutput = .\heat.exe dir `"$inputDir`" -template fragment ` - -sreg -gg ` + -sreg -ag ` -var var.DotnetSrc ` -cg InstallFiles ` -srd ` diff --git a/test/core-sdk-tasks.Tests/CalculateTemplateVerionsTests.cs b/test/core-sdk-tasks.Tests/CalculateTemplateVerionsTests.cs new file mode 100644 index 000000000..8f25cc34e --- /dev/null +++ b/test/core-sdk-tasks.Tests/CalculateTemplateVerionsTests.cs @@ -0,0 +1,49 @@ +using FluentAssertions; +using Xunit; +using Microsoft.DotNet.Cli.Build; + +namespace EndToEnd +{ + public class CalculateTemplateVersionsTests + { + [Fact] + public void WhenAspNetCoreTemplateMajorVersionLowerthan3ItCanCalculateTemplateVersionsInStableBuilds() + { + var result = CalculateTemplateVersions.Calculate("3.1.0", "014885", "dev"); + + result.Should() + .Be(("3.1.1.014885", "3.1.1", "3.1"), + "the patch is 1 higher than aspnetTemplateVersion " + + "due to https://github.com/dotnet/core-sdk/issues/6243"); + } + + [Fact] + public void WhenAspNetCoreTemplateMajorVersionLowerthan3ItCanCalculateTemplateVersionsInNonStableBuilds() + { + var result = CalculateTemplateVersions.Calculate("3.0.0-alpha.1.20071.6", "014885", "dev"); + + result.Should() + .Be(("3.0.1.014885", "3.0.1-dev", "3.0")); + } + + [Fact] + public void WhenAspNetCoreTemplateMajorVersionHigherthan3ItCanCalculateTemplateVersionsInStableBuilds() + { + var result = CalculateTemplateVersions.Calculate("5.1.0", "014885", "dev"); + + result.Should() + .Be(("5.1.0.014885", "5.1.0", "5.1"), + "the patch align with AspNetCoreTemplateMajorVersion again, " + + "since there is no non-deterministic existing ComponentId under Major version 5."); + } + + [Fact] + public void WhenAspNetCoreTemplateMajorVersionHigherthan3ItCanCalculateTemplateVersionsInNonStableBuilds() + { + var result = CalculateTemplateVersions.Calculate("5.0.0-alpha.1.20071.6", "014885", "dev"); + + result.Should() + .Be(("5.0.0.014885", "5.0.0-dev", "5.0")); + } + } +} diff --git a/test/core-sdk-tasks.Tests/core-sdk-tasks.Tests.csproj b/test/core-sdk-tasks.Tests/core-sdk-tasks.Tests.csproj new file mode 100644 index 000000000..47b6ce517 --- /dev/null +++ b/test/core-sdk-tasks.Tests/core-sdk-tasks.Tests.csproj @@ -0,0 +1,14 @@ + + + $(CoreSdkTargetFramework);net472 + $(CoreSdkTargetFramework) + + + + + + + + + + \ No newline at end of file