diff --git a/scripts/update-dependencies.ps1 b/scripts/update-dependencies.ps1 index 432535461..50bd2013d 100644 --- a/scripts/update-dependencies.ps1 +++ b/scripts/update-dependencies.ps1 @@ -32,9 +32,15 @@ $env:PATH = "$env:DOTNET_INSTALL_DIR;$env:PATH" $appPath = "$PSScriptRoot\update-dependencies" -# Restore the build scripts -Write-Host "Restoring Build Script projects..." -pushd $PSScriptRoot +# Restore the build_projects +Write-Host "Restoring Microsoft.DotNet.Cli.Build.Framework..." +pushd $PSScriptRoot\..\build_projects\Microsoft.DotNet.Cli.Build.Framework +dotnet restore --infer-runtimes +if($LASTEXITCODE -ne 0) { throw "Failed to restore" } +popd + +# Restore update-dependencies +pushd $appPath dotnet restore --infer-runtimes if($LASTEXITCODE -ne 0) { throw "Failed to restore" } popd diff --git a/scripts/update-dependencies/Config.cs b/scripts/update-dependencies/Config.cs index e9fab2019..029769833 100644 --- a/scripts/update-dependencies/Config.cs +++ b/scripts/update-dependencies/Config.cs @@ -18,7 +18,7 @@ namespace Microsoft.DotNet.Scripts /// /// The following Environment Variables can optionally be specified: /// - /// COREFX_VERSION_URL - The Url to get the current CoreFx version. (ex. "https://raw.githubusercontent.com/dotnet/versions/master/build-info/dotnet/corefx/master/Latest.txt") + /// COREFX_VERSION_URL - The Url to get the current CoreFx package versions. (ex. "https://raw.githubusercontent.com/dotnet/versions/master/build-info/dotnet/corefx/release/1.0.0/Latest_Packages.txt") /// GITHUB_ORIGIN_OWNER - The owner of the GitHub fork to push the commit and create the PR from. (ex. "dotnet-bot") /// GITHUB_UPSTREAM_OWNER - The owner of the GitHub base repo to create the PR to. (ex. "dotnet") /// GITHUB_PROJECT - The repo name under the ORIGIN and UPSTREAM owners. (ex. "cli") @@ -33,7 +33,7 @@ namespace Microsoft.DotNet.Scripts private Lazy _email = new Lazy(() => GetEnvironmentVariable("GITHUB_EMAIL")); private Lazy _password = new Lazy(() => GetEnvironmentVariable("GITHUB_PASSWORD")); - private Lazy _coreFxVersionUrl = new Lazy(() => GetEnvironmentVariable("COREFX_VERSION_URL", "https://raw.githubusercontent.com/dotnet/versions/master/build-info/dotnet/corefx/master/Latest.txt")); + private Lazy _coreFxVersionUrl = new Lazy(() => GetEnvironmentVariable("COREFX_VERSION_URL", "https://raw.githubusercontent.com/dotnet/versions/master/build-info/dotnet/corefx/release/1.0.0/Latest_Packages.txt")); private Lazy _gitHubOriginOwner; private Lazy _gitHubUpstreamOwner = new Lazy(() => GetEnvironmentVariable("GITHUB_UPSTREAM_OWNER", "dotnet")); private Lazy _gitHubProject = new Lazy(() => GetEnvironmentVariable("GITHUB_PROJECT", "cli")); diff --git a/scripts/update-dependencies/DependencyInfo.cs b/scripts/update-dependencies/DependencyInfo.cs index 68cf4f45d..48b4d8f8e 100644 --- a/scripts/update-dependencies/DependencyInfo.cs +++ b/scripts/update-dependencies/DependencyInfo.cs @@ -1,15 +1,23 @@ // 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 System.Collections.Generic; +using NuGet.Versioning; + namespace Microsoft.DotNet.Scripts { public class DependencyInfo { public string Name { get; set; } - public string IdPattern { get; set; } - public string IdExclusionPattern { get; set; } + public List NewVersions { get; set; } public string NewReleaseVersion { get; set; } public bool IsUpdated { get; set; } } + + public class PackageInfo + { + public string Id { get; set; } + public NuGetVersion Version { get; set; } + } } diff --git a/scripts/update-dependencies/UpdateFilesTargets.cs b/scripts/update-dependencies/UpdateFilesTargets.cs index 1be4b5642..c4a7eefc0 100644 --- a/scripts/update-dependencies/UpdateFilesTargets.cs +++ b/scripts/update-dependencies/UpdateFilesTargets.cs @@ -8,6 +8,7 @@ using System.Linq; using System.Net.Http; using System.Text; using System.Text.RegularExpressions; +using System.Threading.Tasks; using Microsoft.DotNet.Cli.Build.Framework; using Newtonsoft.Json; using Newtonsoft.Json.Linq; @@ -28,24 +29,51 @@ namespace Microsoft.DotNet.Scripts [Target] public static BuildTargetResult GetDependencies(BuildTargetContext c) { - string coreFxLkgVersion = s_client.GetStringAsync(Config.Instance.CoreFxVersionUrl).Result; - coreFxLkgVersion = coreFxLkgVersion.Trim(); - - const string coreFxIdPattern = @"^(?i)((System\..*)|(NETStandard\.Library)|(Microsoft\.CSharp)|(Microsoft\.NETCore.*)|(Microsoft\.TargetingPack\.Private\.(CoreCLR|NETNative))|(Microsoft\.Win32\..*)|(Microsoft\.VisualBasic))$"; - const string coreFxIdExclusionPattern = @"System.CommandLine|Microsoft.NETCore.App"; - List dependencyInfos = c.GetDependencyInfos(); - dependencyInfos.Add(new DependencyInfo() - { - Name = "CoreFx", - IdPattern = coreFxIdPattern, - IdExclusionPattern = coreFxIdExclusionPattern, - NewReleaseVersion = coreFxLkgVersion - }); + + dependencyInfos.Add(CreateDependencyInfo("CoreFx", Config.Instance.CoreFxVersionUrl).Result); return c.Success(); } + private static async Task CreateDependencyInfo(string name, string packageVersionsUrl) + { + List newPackageVersions = new List(); + + using (Stream versionsStream = await s_client.GetStreamAsync(packageVersionsUrl)) + using (StreamReader reader = new StreamReader(versionsStream)) + { + string currentLine; + while ((currentLine = await reader.ReadLineAsync()) != null) + { + int spaceIndex = currentLine.IndexOf(' '); + + newPackageVersions.Add(new PackageInfo() + { + Id = currentLine.Substring(0, spaceIndex), + Version = new NuGetVersion(currentLine.Substring(spaceIndex + 1)) + }); + } + } + + string newReleaseVersion = newPackageVersions + .Where(p => p.Version.IsPrerelease) + .Select(p => p.Version.Release) + .FirstOrDefault() + ?? + // if there are no prerelease versions, just grab the first version + newPackageVersions + .Select(p => p.Version.ToNormalizedString()) + .FirstOrDefault(); + + return new DependencyInfo() + { + Name = name, + NewVersions = newPackageVersions, + NewReleaseVersion = newReleaseVersion + }; + } + [Target(nameof(ReplaceProjectJson), nameof(ReplaceCrossGen))] public static BuildTargetResult ReplaceVersions(BuildTargetContext c) => c.Success(); @@ -103,52 +131,23 @@ namespace Microsoft.DotNet.Scripts string id = dependencyProperty.Name; foreach (DependencyInfo dependencyInfo in dependencyInfos) { - if (Regex.IsMatch(id, dependencyInfo.IdPattern)) + foreach (PackageInfo packageInfo in dependencyInfo.NewVersions) { - if (string.IsNullOrEmpty(dependencyInfo.IdExclusionPattern) || !Regex.IsMatch(id, dependencyInfo.IdExclusionPattern)) + if (id == packageInfo.Id) { - string version; if (dependencyProperty.Value is JObject) { - version = dependencyProperty.Value["version"].Value(); - } - else if (dependencyProperty.Value is JValue) - { - version = dependencyProperty.Value.ToString(); + dependencyProperty.Value["version"] = packageInfo.Version.ToNormalizedString(); } else { - throw new Exception($"Invalid package project.json version {dependencyProperty}"); + dependencyProperty.Value = packageInfo.Version.ToNormalizedString(); } - VersionRange dependencyVersionRange = VersionRange.Parse(version); - NuGetVersion dependencyVersion = dependencyVersionRange.MinVersion; + // mark the DependencyInfo as updated so we can tell which dependencies were updated + dependencyInfo.IsUpdated = true; - string newReleaseVersion = dependencyInfo.NewReleaseVersion; - - if (!string.IsNullOrEmpty(dependencyVersion.Release) && dependencyVersion.Release != newReleaseVersion) - { - string newVersion = new NuGetVersion( - dependencyVersion.Major, - dependencyVersion.Minor, - dependencyVersion.Patch, - newReleaseVersion, - dependencyVersion.Metadata).ToNormalizedString(); - - if (dependencyProperty.Value is JObject) - { - dependencyProperty.Value["version"] = newVersion; - } - else - { - dependencyProperty.Value = newVersion; - } - - // mark the DependencyInfo as updated so we can tell which dependencies were updated - dependencyInfo.IsUpdated = true; - - return true; - } + return true; } } }