From 5a15994e5d769224f4c6e5dbb3b4bf5603e6e76e Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Thu, 23 Feb 2023 11:03:50 +0300 Subject: [PATCH 1/6] Get latest stable version from a new endpoint --- .../Volo/Abp/Cli/AbpCliCoreModule.cs | 5 ++ .../Volo/Abp/Cli/CliConsts.cs | 2 + .../Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs | 2 + .../Volo/Abp/Cli/Http/CliHttpClientFactory.cs | 4 +- .../Volo/Abp/Cli/NuGet/NuGetService.cs | 62 ++++++++++++++----- latest-version.json | 3 + 6 files changed, 60 insertions(+), 18 deletions(-) create mode 100644 latest-version.json diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs index bf2bd71fc0..53d23cb508 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/AbpCliCoreModule.cs @@ -29,6 +29,11 @@ public class AbpCliCoreModule : AbpModule context.Services.AddHttpClient(CliConsts.HttpClientName) .ConfigurePrimaryHttpMessageHandler(() => new CliHttpClientHandler()); + context.Services.AddHttpClient(CliConsts.GithubHttpClientName, client => + { + client.DefaultRequestHeaders.UserAgent.ParseAdd("MyAgent/1.0"); + }); + Encoding.RegisterProvider(CodePagesEncodingProvider.Instance); Configure(options => diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliConsts.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliConsts.cs index 1c0cd3ace4..93cd5f3f98 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliConsts.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliConsts.cs @@ -10,6 +10,8 @@ public static class CliConsts public const string HttpClientName = "AbpHttpClient"; + public const string GithubHttpClientName = "GithubHttpClient"; + public const string LogoutUrl = CliUrls.WwwAbpIo + "api/license/logout"; public const string LicenseCodePlaceHolder = @""; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs index 4c1351ffba..ae54752746 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs @@ -8,6 +8,8 @@ public static class CliUrls public const string WwwAbpIo = WwwAbpIoProduction; public const string AccountAbpIo = AccountAbpIoProduction; public const string NuGetRootPath = NuGetRootPathProduction; + public const string LatestVersionCheckFullPath = + "https://raw.githubusercontent.com/abpframework/abp/dev/latest-version.json"; public const string WwwAbpIoProduction = "https://abp.io/"; public const string AccountAbpIoProduction = "https://account.abp.io/"; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientFactory.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientFactory.cs index 1d21dd7be5..32ba3e1d06 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientFactory.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientFactory.cs @@ -20,9 +20,9 @@ public class CliHttpClientFactory : ISingletonDependency _cancellationTokenProvider = cancellationTokenProvider; } - public HttpClient CreateClient(bool needsAuthentication = true, TimeSpan? timeout = null) + public HttpClient CreateClient(string clientName = null, bool needsAuthentication = true, TimeSpan? timeout = null) { - var httpClient = _clientFactory.CreateClient(CliConsts.HttpClientName); + var httpClient = _clientFactory.CreateClient(clientName ?? CliConsts.HttpClientName); httpClient.Timeout = timeout ?? DefaultTimeout; if (needsAuthentication) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs index 8800d0f05a..b3c72bea4b 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs @@ -3,6 +3,7 @@ using Newtonsoft.Json; using NuGet.Versioning; using System.Collections.Generic; using System.Linq; +using System.Net; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; @@ -60,24 +61,26 @@ public class NuGetService : ITransientDependency public async Task GetLatestVersionOrNullAsync(string packageId, bool includeNightly = false, bool includeReleaseCandidates = false) { - var versionList = await GetPackageVersionListAsync(packageId, includeNightly); + if (!includeNightly && !includeReleaseCandidates) + { + var version = await GetLatestStableVersionOrNullAsync(); + if (string.IsNullOrWhiteSpace(version)) + { + return null; + } + return SemanticVersion.TryParse(version, out var semanticVersion) ? semanticVersion : null; + } + + var versionList = await GetPackageVersionListAsync(packageId, includeNightly); if (versionList == null) { return null; } List versions; - - if (!includeNightly && !includeReleaseCandidates) - { - versions = versionList - .Select(SemanticVersion.Parse) - .OrderByDescending(v => v, new VersionComparer()).ToList(); - - versions = versions.Where(x => !x.IsPrerelease).ToList(); - } - else if (!includeNightly && includeReleaseCandidates) + + if (!includeNightly && includeReleaseCandidates) { versions = versionList .Where(v => !v.Contains("-preview")) @@ -148,15 +151,13 @@ public class NuGetService : ITransientDependency logger: Logger )) { - if (responseMessage.StatusCode == System.Net.HttpStatusCode.NotFound) + if (responseMessage.StatusCode == HttpStatusCode.NotFound) { //the package doesn't exist... return null; } - else - { - await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage); - } + + await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage); var responseContent = await responseMessage.Content.ReadAsStringAsync(); return JsonSerializer.Deserialize(responseContent).Versions; @@ -183,9 +184,38 @@ public class NuGetService : ITransientDependency return CliUrls.GetNuGetPackageInfoUrl(_apiKeyResult.ApiKey, packageId); } + private async Task GetLatestStableVersionOrNullAsync() + { + try + { + var client = _cliHttpClientFactory.CreateClient(clientName: CliConsts.GithubHttpClientName, needsAuthentication: false); + + using (var responseMessage = await client.GetHttpResponseMessageWithRetryAsync( + CliUrls.LatestVersionCheckFullPath, + cancellationToken: CancellationTokenProvider.Token, + logger: Logger + )) + { + await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage); + + var content = await responseMessage.Content.ReadAsStringAsync(); + return JsonSerializer.Deserialize(content).Version; + } + } + catch + { + return null; + } + } + public class NuGetVersionResultDto { [JsonProperty("versions")] public List Versions { get; set; } } + + public class LatestVersionResultDto + { + public string Version { get; set; } + } } diff --git a/latest-version.json b/latest-version.json new file mode 100644 index 0000000000..6a970e7e88 --- /dev/null +++ b/latest-version.json @@ -0,0 +1,3 @@ +{ + "version": "7.0.2" +} \ No newline at end of file From 88c6f0b1ddf55df37426e3f81bafb0483aba3b57 Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Thu, 23 Feb 2023 11:33:12 +0300 Subject: [PATCH 2/6] Update CliHttpClientFactory.cs --- .../Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientFactory.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientFactory.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientFactory.cs index 32ba3e1d06..546a2f020c 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientFactory.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Http/CliHttpClientFactory.cs @@ -20,7 +20,7 @@ public class CliHttpClientFactory : ISingletonDependency _cancellationTokenProvider = cancellationTokenProvider; } - public HttpClient CreateClient(string clientName = null, bool needsAuthentication = true, TimeSpan? timeout = null) + public HttpClient CreateClient(bool needsAuthentication = true, TimeSpan? timeout = null, string clientName = null) { var httpClient = _clientFactory.CreateClient(clientName ?? CliConsts.HttpClientName); httpClient.Timeout = timeout ?? DefaultTimeout; From 8d2ba514a68e74feb7971609e5b2d700015594a5 Mon Sep 17 00:00:00 2001 From: Ebicoglu Date: Thu, 23 Feb 2023 16:51:39 +0300 Subject: [PATCH 3/6] Update CliService.cs --- .../Volo/Abp/Cli/CliService.cs | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs index 0b302520aa..967d310bae 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs @@ -61,6 +61,7 @@ public class CliService : ITransientDependency await CheckCliVersionAsync(currentCliVersion); } #endif + try { if (commandLineArgs.IsCommand("prompt")) @@ -175,7 +176,7 @@ public class CliService : ITransientDependency { return; } - + var assembly = typeof(CliService).Assembly; var toolPath = GetToolPath(assembly); var updateChannel = GetUpdateChannel(currentCliVersion); @@ -200,13 +201,17 @@ public class CliService : ITransientDependency { try { - var latestTime = await _memoryService.GetAsync(CliConsts.MemoryKeys.LatestCliVersionCheckDate); - - if (latestTime != null && DateTime.Now - DateTime.Parse(latestTime, CultureInfo.InvariantCulture) < TimeSpan.FromDays(1)) + var latestTimeAsString = await _memoryService.GetAsync(CliConsts.MemoryKeys.LatestCliVersionCheckDate); + if (DateTime.TryParse(latestTimeAsString, + System.Globalization.CultureInfo.InvariantCulture, + System.Globalization.DateTimeStyles.None, out var latestTimeParsed)) { - return false; + if (DateTime.Now.Subtract(latestTimeParsed).TotalDays < 1) + { + return false; + } } - + await _memoryService.SetAsync(CliConsts.MemoryKeys.LatestCliVersionCheckDate, DateTime.Now.ToString(CultureInfo.InvariantCulture)); return true; From 17755a0724e633b55d413a479b160a77aaffe902 Mon Sep 17 00:00:00 2001 From: Ebicoglu Date: Thu, 23 Feb 2023 16:53:59 +0300 Subject: [PATCH 4/6] Update CliService.cs --- .../src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs index 967d310bae..4c5406130a 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs @@ -177,12 +177,12 @@ public class CliService : ITransientDependency return; } - var assembly = typeof(CliService).Assembly; - var toolPath = GetToolPath(assembly); - var updateChannel = GetUpdateChannel(currentCliVersion); - try { + var assembly = typeof(CliService).Assembly; + var toolPath = GetToolPath(assembly); + var updateChannel = GetUpdateChannel(currentCliVersion); + var latestVersion = await GetLatestVersion(updateChannel); if (latestVersion != null && latestVersion > currentCliVersion) @@ -192,8 +192,7 @@ public class CliService : ITransientDependency } catch (Exception e) { - Logger.LogWarning("Unable to retrieve the latest version"); - Logger.LogWarning(e.Message); + Logger.LogWarning("Unable to retrieve the latest version: " + e.Message); } } From 1e21e0f756f60fda1865b2323403323641f85400 Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Thu, 23 Feb 2023 17:46:48 +0300 Subject: [PATCH 5/6] Refactoring #15783 --- .../Volo/Abp/Cli/CliService.cs | 30 ++++++++------- .../Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs | 2 +- .../Volo/Abp/Cli/Commands/CliCommand.cs | 12 +++--- .../Volo/Abp/Cli/Commands/SuiteCommand.cs | 12 +++--- .../VoloNugetPackagesVersionUpdater.cs | 38 ++++++++++--------- .../{NuGet => Version}/CommercialPackages.cs | 2 +- .../Volo/Abp/Cli/Version/LatestVersionInfo.cs | 16 ++++++++ .../PackageVersionCheckerService.cs} | 34 +++++++++++------ latest-version.json | 3 -- latest-versions.json | 8 ++++ 10 files changed, 98 insertions(+), 59 deletions(-) rename framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/{NuGet => Version}/CommercialPackages.cs (95%) create mode 100644 framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/LatestVersionInfo.cs rename framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/{NuGet/NuGetService.cs => Version/PackageVersionCheckerService.cs} (84%) delete mode 100644 latest-version.json create mode 100644 latest-versions.json diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs index 4c5406130a..618c8c2608 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs @@ -13,7 +13,7 @@ using System.Threading.Tasks; using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Commands; using Volo.Abp.Cli.Memory; -using Volo.Abp.Cli.NuGet; +using Volo.Abp.Cli.Version; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; using Volo.Abp.IO; @@ -27,14 +27,14 @@ public class CliService : ITransientDependency protected ICommandLineArgumentParser CommandLineArgumentParser { get; } protected ICommandSelector CommandSelector { get; } protected IServiceScopeFactory ServiceScopeFactory { get; } - protected NuGetService NuGetService { get; } + protected PackageVersionCheckerService PackageVersionCheckerService { get; } public ICmdHelper CmdHelper { get; } public CliService( ICommandLineArgumentParser commandLineArgumentParser, ICommandSelector commandSelector, IServiceScopeFactory serviceScopeFactory, - NuGetService nugetService, + PackageVersionCheckerService nugetService, ICmdHelper cmdHelper, MemoryService memoryService) { @@ -42,7 +42,7 @@ public class CliService : ITransientDependency CommandLineArgumentParser = commandLineArgumentParser; CommandSelector = commandSelector; ServiceScopeFactory = serviceScopeFactory; - NuGetService = nugetService; + PackageVersionCheckerService = nugetService; CmdHelper = cmdHelper; Logger = NullLogger.Instance; @@ -183,11 +183,10 @@ public class CliService : ITransientDependency var toolPath = GetToolPath(assembly); var updateChannel = GetUpdateChannel(currentCliVersion); - var latestVersion = await GetLatestVersion(updateChannel); - - if (latestVersion != null && latestVersion > currentCliVersion) + var latestVersionInfo = await GetLatestVersion(updateChannel); + if (latestVersionInfo != null && latestVersionInfo.Version > currentCliVersion) { - LogNewVersionInfo(updateChannel, latestVersion, toolPath); + LogNewVersionInfo(updateChannel, latestVersionInfo.Version, toolPath, latestVersionInfo.Message); } } catch (Exception e) @@ -286,18 +285,18 @@ public class CliService : ITransientDependency return UpdateChannel.Prerelease; } - private async Task GetLatestVersion(UpdateChannel updateChannel) + private async Task GetLatestVersion(UpdateChannel updateChannel) { switch (updateChannel) { case UpdateChannel.Stable: - return await NuGetService.GetLatestVersionOrNullAsync("Volo.Abp.Cli"); + return await PackageVersionCheckerService.GetLatestVersionOrNullAsync("Volo.Abp.Cli"); case UpdateChannel.Prerelease: - return await NuGetService.GetLatestVersionOrNullAsync("Volo.Abp.Cli", includeReleaseCandidates: true); + return await PackageVersionCheckerService.GetLatestVersionOrNullAsync("Volo.Abp.Cli", includeReleaseCandidates: true); case UpdateChannel.Nightly: - return await NuGetService.GetLatestVersionOrNullAsync("Volo.Abp.Cli", includeNightly: true); + return await PackageVersionCheckerService.GetLatestVersionOrNullAsync("Volo.Abp.Cli", includeNightly: true); default: return default; @@ -310,7 +309,7 @@ public class CliService : ITransientDependency return globalPaths.Select(Environment.ExpandEnvironmentVariables).Contains(toolPath); } - private void LogNewVersionInfo(UpdateChannel updateChannel, SemanticVersion latestVersion, string toolPath) + private void LogNewVersionInfo(UpdateChannel updateChannel, SemanticVersion latestVersion, string toolPath, string message = null) { var toolPathArg = IsGlobalTool(toolPath) ? "-g" : $"--tool-path {toolPath}"; @@ -338,6 +337,11 @@ public class CliService : ITransientDependency throw new ArgumentOutOfRangeException(nameof(updateChannel), updateChannel, null); } + if (!string.IsNullOrWhiteSpace(message)) + { + Logger.LogWarning(message); + } + Logger.LogWarning(string.Empty); } diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs index ae54752746..83ae5a9f73 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliUrls.cs @@ -9,7 +9,7 @@ public static class CliUrls public const string AccountAbpIo = AccountAbpIoProduction; public const string NuGetRootPath = NuGetRootPathProduction; public const string LatestVersionCheckFullPath = - "https://raw.githubusercontent.com/abpframework/abp/dev/latest-version.json"; + "https://raw.githubusercontent.com/abpframework/abp/dev/latest-versions.json"; public const string WwwAbpIoProduction = "https://abp.io/"; public const string AccountAbpIoProduction = "https://account.abp.io/"; diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CliCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CliCommand.cs index 7a6926ecdd..108d664f3a 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CliCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/CliCommand.cs @@ -5,7 +5,7 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Commands.Services; -using Volo.Abp.Cli.NuGet; +using Volo.Abp.Cli.Version; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; @@ -18,14 +18,14 @@ public class CliCommand : IConsoleCommand, ITransientDependency private const string CliPackageName = "Volo.Abp.Cli"; private readonly ICmdHelper _cmdHelper; - private readonly NuGetService _nuGetService; + private readonly PackageVersionCheckerService _packageVersionCheckerService; private readonly AbpNuGetIndexUrlService _nuGetIndexUrlService; public ILogger Logger { get; set; } - public CliCommand(ICmdHelper cmdHelper, NuGetService nuGetService, AbpNuGetIndexUrlService nuGetIndexUrlService) + public CliCommand(ICmdHelper cmdHelper, PackageVersionCheckerService packageVersionCheckerService, AbpNuGetIndexUrlService nuGetIndexUrlService) { _cmdHelper = cmdHelper; - _nuGetService = nuGetService; + _packageVersionCheckerService = packageVersionCheckerService; _nuGetIndexUrlService = nuGetIndexUrlService; Logger = NullLogger.Instance; @@ -104,13 +104,13 @@ public class CliCommand : IConsoleCommand, ITransientDependency private async Task GetLatestPreviewVersion() { - var latestPreviewVersion = await _nuGetService + var latestPreviewVersionInfo = await _packageVersionCheckerService .GetLatestVersionOrNullAsync( packageId: CliPackageName, includeReleaseCandidates: true ); - return latestPreviewVersion.IsPrerelease ? latestPreviewVersion.ToString() : null; + return latestPreviewVersionInfo.Version.IsPrerelease ? latestPreviewVersionInfo.Version.ToString() : null; } private void ShowCliManualUpdateCommand() diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs index 73198c93bc..83c21d4773 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Commands/SuiteCommand.cs @@ -17,7 +17,7 @@ using Volo.Abp.Cli.Args; using Volo.Abp.Cli.Auth; using Volo.Abp.Cli.Commands.Services; using Volo.Abp.Cli.Http; -using Volo.Abp.Cli.NuGet; +using Volo.Abp.Cli.Version; using Volo.Abp.Cli.Utils; using Volo.Abp.DependencyInjection; using Volo.Abp.Http; @@ -32,7 +32,7 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency public ICmdHelper CmdHelper { get; } private readonly AbpNuGetIndexUrlService _nuGetIndexUrlService; - private readonly NuGetService _nuGetService; + private readonly PackageVersionCheckerService _packageVersionCheckerService; private readonly AuthService _authService; private readonly CliHttpClientFactory _cliHttpClientFactory; private const string SuitePackageName = "Volo.Abp.Suite"; @@ -42,14 +42,14 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency public SuiteCommand( AbpNuGetIndexUrlService nuGetIndexUrlService, - NuGetService nuGetService, + PackageVersionCheckerService packageVersionCheckerService, ICmdHelper cmdHelper, AuthService authService, CliHttpClientFactory cliHttpClientFactory) { CmdHelper = cmdHelper; _nuGetIndexUrlService = nuGetIndexUrlService; - _nuGetService = nuGetService; + _packageVersionCheckerService = packageVersionCheckerService; _authService = authService; _cliHttpClientFactory = cliHttpClientFactory; Logger = NullLogger.Instance; @@ -393,13 +393,13 @@ public class SuiteCommand : IConsoleCommand, ITransientDependency private async Task GetLatestPreviewVersion() { - var latestPreviewVersion = await _nuGetService + var latestPreviewVersionInfo = await _packageVersionCheckerService .GetLatestVersionOrNullAsync( packageId: SuitePackageName, includeReleaseCandidates: true ); - return latestPreviewVersion.IsPrerelease ? latestPreviewVersion.ToString() : null; + return latestPreviewVersionInfo.Version.IsPrerelease ? latestPreviewVersionInfo.Version.ToString() : null; } private void ShowSuiteManualUpdateCommand() diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs index 336594b130..5818959ec7 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectModification/VoloNugetPackagesVersionUpdater.cs @@ -5,7 +5,7 @@ using System.IO; using System.Linq; using System.Threading.Tasks; using System.Xml; -using Volo.Abp.Cli.NuGet; +using Volo.Abp.Cli.Version; using Volo.Abp.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; @@ -15,14 +15,14 @@ namespace Volo.Abp.Cli.ProjectModification; public class VoloNugetPackagesVersionUpdater : ITransientDependency { - private readonly NuGetService _nuGetService; + private readonly PackageVersionCheckerService _packageVersionCheckerService; private readonly MyGetPackageListFinder _myGetPackageListFinder; public ILogger Logger { get; set; } public static Encoding DefaultEncoding = Encoding.UTF8; - public VoloNugetPackagesVersionUpdater(NuGetService nuGetService, MyGetPackageListFinder myGetPackageListFinder) + public VoloNugetPackagesVersionUpdater(PackageVersionCheckerService packageVersionCheckerService, MyGetPackageListFinder myGetPackageListFinder) { - _nuGetService = nuGetService; + _packageVersionCheckerService = packageVersionCheckerService; _myGetPackageListFinder = myGetPackageListFinder; Logger = NullLogger.Instance; } @@ -37,8 +37,8 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency } else { - var latestVersionFromNuget = await _nuGetService.GetLatestVersionOrNullAsync("Volo.Abp.Core", includeReleaseCandidates: includeReleaseCandidates); - var latestReleaseCandidateVersionFromNuget = await _nuGetService.GetLatestVersionOrNullAsync("Volo.Abp.Core", includeReleaseCandidates: true); + var latestVersionInfo = await _packageVersionCheckerService.GetLatestVersionOrNullAsync("Volo.Abp.Core", includeReleaseCandidates: includeReleaseCandidates); + var latestReleaseCandidateVersionInfo = await _packageVersionCheckerService.GetLatestVersionOrNullAsync("Volo.Abp.Core", includeReleaseCandidates: true); var latestVersionFromMyGet = await GetLatestVersionFromMyGet("Volo.Abp.Core"); async Task UpdateAsync(string filePath) @@ -53,8 +53,8 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency includePreviews, includeReleaseCandidates, switchToStable, - latestVersionFromNuget, - latestReleaseCandidateVersionFromNuget, + latestVersionInfo.Version, + latestReleaseCandidateVersionInfo.Version, latestVersionFromMyGet, version); @@ -81,8 +81,8 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency } else { - var latestVersionFromNuget = await _nuGetService.GetLatestVersionOrNullAsync("Volo.Abp.Core"); - var latestReleaseCandidateVersionFromNuget = await _nuGetService.GetLatestVersionOrNullAsync("Volo.Abp.Core", includeReleaseCandidates: true); + var latestVersionInfo = await _packageVersionCheckerService.GetLatestVersionOrNullAsync("Volo.Abp.Core"); + var latestReleaseCandidateVersionInfo = await _packageVersionCheckerService.GetLatestVersionOrNullAsync("Volo.Abp.Core", includeReleaseCandidates: true); var latestVersionFromMyGet = await GetLatestVersionFromMyGet("Volo.Abp.Core"); using (var fs = File.Open(projectPath, FileMode.Open, FileAccess.ReadWrite, FileShare.None)) @@ -95,8 +95,8 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency includeNightlyPreviews, includeReleaseCandidates, switchToStable, - latestVersionFromNuget, - latestReleaseCandidateVersionFromNuget, + latestVersionInfo.Version, + latestReleaseCandidateVersionInfo.Version, latestVersionFromMyGet, version); @@ -137,11 +137,11 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency protected virtual async Task SpecifiedVersionExists(string version, string packageId) { - var versionList = await _nuGetService.GetPackageVersionListAsync(packageId); + var versionList = await _packageVersionCheckerService.GetPackageVersionListAsync(packageId); if (versionList.All(v => !v.Equals(version, StringComparison.OrdinalIgnoreCase))) { - versionList = await _nuGetService.GetPackageVersionListAsync(packageId, true); + versionList = await _packageVersionCheckerService.GetPackageVersionListAsync(packageId, true); } return versionList.Any(v => v.Equals(version, StringComparison.OrdinalIgnoreCase)); @@ -240,13 +240,15 @@ public class VoloNugetPackagesVersionUpdater : ITransientDependency SemanticVersion latestVersion; if (currentSemanticVersion.IsPrerelease && !switchToStable) { - latestVersion = latestNugetReleaseCandidateVersion == null || isLeptonXPackage ? - await _nuGetService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: true) : latestNugetReleaseCandidateVersion; + latestVersion = latestNugetReleaseCandidateVersion == null || isLeptonXPackage + ? (await _packageVersionCheckerService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: true))?.Version + : latestNugetReleaseCandidateVersion; } else { - latestVersion = latestNugetVersion == null || isLeptonXPackage ? - await _nuGetService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: includeReleaseCandidates) : latestNugetVersion; + latestVersion = latestNugetVersion == null || isLeptonXPackage + ? (await _packageVersionCheckerService.GetLatestVersionOrNullAsync(packageId, includeReleaseCandidates: includeReleaseCandidates))?.Version + : latestNugetVersion; } if (latestVersion != null && (currentSemanticVersion < latestVersion || (currentSemanticVersion.IsPrerelease && switchToStable))) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/CommercialPackages.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CommercialPackages.cs similarity index 95% rename from framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/CommercialPackages.cs rename to framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CommercialPackages.cs index 096fe9f314..e99eddb499 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/CommercialPackages.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CommercialPackages.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; using System.Text; -namespace Volo.Abp.Cli.NuGet; +namespace Volo.Abp.Cli.Version; internal static class CommercialPackages { diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/LatestVersionInfo.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/LatestVersionInfo.cs new file mode 100644 index 0000000000..e586e0df11 --- /dev/null +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/LatestVersionInfo.cs @@ -0,0 +1,16 @@ +using NuGet.Versioning; + +namespace Volo.Abp.Cli.Version; + +public class LatestVersionInfo +{ + public SemanticVersion Version { get; } + + public string Message { get; } + + public LatestVersionInfo(SemanticVersion version, string message = null) + { + Version = version; + Message = message; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs similarity index 84% rename from framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs rename to framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs index b3c72bea4b..c005ff7b2a 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/NuGet/NuGetService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/PackageVersionCheckerService.cs @@ -15,9 +15,9 @@ using Volo.Abp.DependencyInjection; using Volo.Abp.Json; using Volo.Abp.Threading; -namespace Volo.Abp.Cli.NuGet; +namespace Volo.Abp.Cli.Version; -public class NuGetService : ITransientDependency +public class PackageVersionCheckerService : ITransientDependency { public ILogger Logger { get; set; } protected IJsonSerializer JsonSerializer { get; } @@ -27,7 +27,7 @@ public class NuGetService : ITransientDependency private readonly CliHttpClientFactory _cliHttpClientFactory; private DeveloperApiKeyResult _apiKeyResult; - public NuGetService( + public PackageVersionCheckerService( IJsonSerializer jsonSerializer, IRemoteServiceExceptionHandler remoteServiceExceptionHandler, ICancellationTokenProvider cancellationTokenProvider, @@ -59,17 +59,19 @@ public class NuGetService : ITransientDependency return versionList.Contains(version); } - public async Task GetLatestVersionOrNullAsync(string packageId, bool includeNightly = false, bool includeReleaseCandidates = false) + public async Task GetLatestVersionOrNullAsync(string packageId, bool includeNightly = false, bool includeReleaseCandidates = false) { if (!includeNightly && !includeReleaseCandidates) { - var version = await GetLatestStableVersionOrNullAsync(); - if (string.IsNullOrWhiteSpace(version)) + var latestStableVersionResult = await GetLatestStableVersionOrNullAsync(); + if (latestStableVersionResult == null) { return null; } - return SemanticVersion.TryParse(version, out var semanticVersion) ? semanticVersion : null; + return SemanticVersion.TryParse(latestStableVersionResult.Version, out var semanticVersion) + ? new LatestVersionInfo(semanticVersion, latestStableVersionResult.Message) + : null; } var versionList = await GetPackageVersionListAsync(packageId, includeNightly); @@ -94,7 +96,9 @@ public class NuGetService : ITransientDependency .OrderByDescending(v => v, new VersionComparer()).ToList(); } - return versions.Any() ? versions.Max() : null; + return versions.Any() + ? new LatestVersionInfo(versions.Max()) + : null; } @@ -184,7 +188,7 @@ public class NuGetService : ITransientDependency return CliUrls.GetNuGetPackageInfoUrl(_apiKeyResult.ApiKey, packageId); } - private async Task GetLatestStableVersionOrNullAsync() + private async Task GetLatestStableVersionOrNullAsync() { try { @@ -199,7 +203,9 @@ public class NuGetService : ITransientDependency await RemoteServiceExceptionHandler.EnsureSuccessfulHttpResponseAsync(responseMessage); var content = await responseMessage.Content.ReadAsStringAsync(); - return JsonSerializer.Deserialize(content).Version; + var result = JsonSerializer.Deserialize>(content); + + return result.FirstOrDefault(x => x.Type.ToLowerInvariant() == "stable"); } } catch @@ -214,8 +220,14 @@ public class NuGetService : ITransientDependency public List Versions { get; set; } } - public class LatestVersionResultDto + public class LatestStableVersionResult { public string Version { get; set; } + + public DateTime? ReleaseDate { get; set; } + + public string Type { get; set; } + + public string Message { get; set; } } } diff --git a/latest-version.json b/latest-version.json deleted file mode 100644 index 6a970e7e88..0000000000 --- a/latest-version.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "version": "7.0.2" -} \ No newline at end of file diff --git a/latest-versions.json b/latest-versions.json new file mode 100644 index 0000000000..afd4f0f8a4 --- /dev/null +++ b/latest-versions.json @@ -0,0 +1,8 @@ +[ + { + "version": "7.0.2", + "releaseDate": "", + "type": "stable", + "message": "" + } +] \ No newline at end of file From 2f8fec529fca8d458ea13cc9bd614aceb4a07cba Mon Sep 17 00:00:00 2001 From: Engincan VESKE <43685404+EngincanV@users.noreply.github.com> Date: Thu, 23 Feb 2023 17:56:39 +0300 Subject: [PATCH 6/6] Update CliService.cs --- .../src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs index 618c8c2608..3ab75da1c0 100644 --- a/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs +++ b/framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs @@ -314,6 +314,12 @@ public class CliService : ITransientDependency var toolPathArg = IsGlobalTool(toolPath) ? "-g" : $"--tool-path {toolPath}"; Logger.LogWarning($"ABP CLI has a newer {updateChannel.ToString().ToLowerInvariant()} version {latestVersion}, please update to get the latest features and fixes."); + + if (!string.IsNullOrWhiteSpace(message)) + { + Logger.LogWarning(message); + } + Logger.LogWarning(string.Empty); Logger.LogWarning("Update Command: "); @@ -337,11 +343,6 @@ public class CliService : ITransientDependency throw new ArgumentOutOfRangeException(nameof(updateChannel), updateChannel, null); } - if (!string.IsNullOrWhiteSpace(message)) - { - Logger.LogWarning(message); - } - Logger.LogWarning(string.Empty); }