Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Output warning if the CLI version is different from the template version. #18629

Merged
merged 1 commit into from
Dec 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
46 changes: 7 additions & 39 deletions framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,28 +29,31 @@
protected IServiceScopeFactory ServiceScopeFactory { get; }
protected PackageVersionCheckerService PackageVersionCheckerService { get; }
public ICmdHelper CmdHelper { get; }
protected CliVersionService CliVersionService { get; }

Check warning on line 32 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs#L32

Added line #L32 was not covered by tests

public CliService(
ICommandLineArgumentParser commandLineArgumentParser,
ICommandSelector commandSelector,
IServiceScopeFactory serviceScopeFactory,
PackageVersionCheckerService nugetService,
ICmdHelper cmdHelper,
MemoryService memoryService)
MemoryService memoryService,
CliVersionService cliVersionService)
{
_memoryService = memoryService;
CommandLineArgumentParser = commandLineArgumentParser;
CommandSelector = commandSelector;
ServiceScopeFactory = serviceScopeFactory;
PackageVersionCheckerService = nugetService;
CmdHelper = cmdHelper;
CliVersionService = cliVersionService;

Logger = NullLogger<CliService>.Instance;
}

public async Task RunAsync(string[] args)
{
var currentCliVersion = await GetCurrentCliVersionInternalAsync(typeof(CliService).Assembly);
var currentCliVersion = await CliVersionService.GetCurrentCliVersionAsync();

Check warning on line 56 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/CliService.cs#L56

Added line #L56 was not covered by tests
Logger.LogInformation($"ABP CLI {currentCliVersion}");

var commandLineArgs = CommandLineArgumentParser.Parse(args);
Expand Down Expand Up @@ -247,41 +250,6 @@
return assembly.Location.Substring(0, assembly.Location.IndexOf(".store", StringComparison.Ordinal));
}

public async Task<SemanticVersion> GetCurrentCliVersionAsync(Assembly assembly)
{
return await GetCurrentCliVersionInternalAsync(assembly);
}

private async Task<SemanticVersion> GetCurrentCliVersionInternalAsync(Assembly assembly)
{
SemanticVersion currentCliVersion = default;

var consoleOutput = new StringReader(CmdHelper.RunCmdAndGetOutput($"dotnet tool list -g", out int exitCode));
string line;
while ((line = await consoleOutput.ReadLineAsync()) != null)
{
if (line.StartsWith("volo.abp.cli", StringComparison.InvariantCultureIgnoreCase))
{
var version = line.Split(new char[0], StringSplitOptions.RemoveEmptyEntries)[1];

SemanticVersion.TryParse(version, out currentCliVersion);

break;
}
}


if (currentCliVersion == null)
{
// If not a tool executable, fallback to assembly version and treat as dev without updates
// Assembly revisions are not supported by SemVer scheme required for NuGet, trim to {major}.{minor}.{patch}
var assemblyVersion = string.Join(".", assembly.GetFileVersion().Split('.').Take(3));
return SemanticVersion.Parse(assemblyVersion + "-dev");
}

return currentCliVersion;
}

private UpdateChannel GetUpdateChannel(SemanticVersion currentCliVersion)
{
if (!currentCliVersion.IsPrerelease)
Expand Down Expand Up @@ -331,12 +299,12 @@
var toolPathArg = IsGlobalTool(toolPath) ? "-g" : $"--tool-path {toolPath}";

Logger.LogWarning($"A newer {updateChannel.ToString().ToLowerInvariant()} version of the ABP CLI is available: {latestVersion}.");

if (!string.IsNullOrWhiteSpace(message))
{
Logger.LogWarning(message);
}

Logger.LogWarning(string.Empty);
Logger.LogWarning("Update Command: ");

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,15 @@
using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
using NuGet.Versioning;
using Volo.Abp.Cli.GitHub;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.ProjectBuilding.Templates.App;
using Volo.Abp.Cli.ProjectBuilding.Templates.Console;
using Volo.Abp.Cli.ProjectBuilding.Templates.Maui;
using Volo.Abp.Cli.ProjectBuilding.Templates.MvcModule;
using Volo.Abp.Cli.ProjectBuilding.Templates.Wpf;
using Volo.Abp.Cli.Version;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http;
using Volo.Abp.IO;
Expand All @@ -37,18 +39,21 @@
protected ICancellationTokenProvider CancellationTokenProvider { get; }

private readonly CliHttpClientFactory _cliHttpClientFactory;
protected CliVersionService CliVersionService { get; }

Check warning on line 42 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L42

Added line #L42 was not covered by tests

public AbpIoSourceCodeStore(
IOptions<AbpCliOptions> options,
IJsonSerializer jsonSerializer,
IRemoteServiceExceptionHandler remoteServiceExceptionHandler,
ICancellationTokenProvider cancellationTokenProvider,
CliHttpClientFactory cliHttpClientFactory)
CliHttpClientFactory cliHttpClientFactory,
CliVersionService cliVersionService)
{
JsonSerializer = jsonSerializer;
RemoteServiceExceptionHandler = remoteServiceExceptionHandler;
CancellationTokenProvider = cancellationTokenProvider;
_cliHttpClientFactory = cliHttpClientFactory;
CliVersionService = cliVersionService;
Options = options.Value;

Logger = NullLogger<AbpIoSourceCodeStore>.Instance;
Expand All @@ -63,8 +68,8 @@
bool skipCache = false)
{
DirectoryHelper.CreateIfNotExists(CliPaths.TemplateCache);
var userSpecifiedVersion = version != null;

Check warning on line 71 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L71

Added line #L71 was not covered by tests
var latestVersion = version ?? await GetLatestSourceCodeVersionAsync(name, type, null, includePreReleases);

if (version == null)
{
if (latestVersion == null)
Expand All @@ -86,14 +91,68 @@

version = latestVersion;
}
else

var currentCliVersion = await CliVersionService.GetCurrentCliVersionAsync();
var templateVersion = SemanticVersion.Parse(version);

Check warning on line 96 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L95-L96

Added lines #L95 - L96 were not covered by tests

var outputWarning = false;

Check warning on line 98 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L98

Added line #L98 was not covered by tests
if (currentCliVersion.Major != templateVersion.Major || currentCliVersion.Minor != templateVersion.Minor)
{

Check warning on line 100 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L100

Added line #L100 was not covered by tests
// major and minor version are different
outputWarning = true;
}

Check warning on line 103 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L102-L103

Added lines #L102 - L103 were not covered by tests
else if (currentCliVersion.Major == templateVersion.Major &&
currentCliVersion.Minor == templateVersion.Minor &&
currentCliVersion.Patch < templateVersion.Patch)

Check warning on line 106 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L105-L106

Added lines #L105 - L106 were not covered by tests
{
if (!await IsVersionExists(name, version))
// major and minor version are same but patch version is lower
outputWarning = true;
}

Check warning on line 110 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L109-L110

Added lines #L109 - L110 were not covered by tests
else if(currentCliVersion.Major == templateVersion.Major &&
currentCliVersion.Minor == templateVersion.Minor &&
currentCliVersion.Patch == templateVersion.Patch &&
currentCliVersion.IsPrerelease && templateVersion.IsPrerelease)
{

Check warning on line 115 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L112-L115

Added lines #L112 - L115 were not covered by tests
// major and minor and patch version are same but prerelease version may be lower
var cliRcVersion = currentCliVersion.ReleaseLabels.LastOrDefault();
var templateRcVersion = templateVersion.ReleaseLabels.LastOrDefault();

Check warning on line 118 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L117-L118

Added lines #L117 - L118 were not covered by tests
if (cliRcVersion != null && templateRcVersion != null)
{
throw new Exception("There is no version found with given version: " + version);
if (int.TryParse(cliRcVersion, out var cliRcVersionNumber) && int.TryParse(templateRcVersion, out var templateRcVersionNumber))
{

Check warning on line 122 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L122

Added line #L122 was not covered by tests
if (cliRcVersionNumber < templateRcVersionNumber)
{
outputWarning = true;
}
}

Check warning on line 127 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L124-L127

Added lines #L124 - L127 were not covered by tests
}
}

if (outputWarning)
{
version = currentCliVersion.ToString();

Check warning on line 133 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L132-L133

Added lines #L132 - L133 were not covered by tests
Logger.LogWarning(userSpecifiedVersion
? $"The specified template version ({templateVersion}) is different than the CLI version ({currentCliVersion}). This may cause compatibility issues."
: $"The latest template version ({templateVersion}) is different than the CLI version ({currentCliVersion}). This may cause compatibility issues.");
Logger.LogWarning("Please upgrade/downgrade the CLI version to the template version.");
Logger.LogWarning($"> dotnet tool uninstall -g volo.abp.cli");

Check warning on line 138 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L135-L138

Added lines #L135 - L138 were not covered by tests
Logger.LogWarning(!templateVersion.IsPrerelease
? $"> dotnet tool install -g volo.abp.cli --version \"{templateVersion.Major}.{templateVersion.Minor}.*\""
: $"> dotnet tool install -g volo.abp.cli --version {templateVersion}");

Check warning on line 141 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L140-L141

Added lines #L140 - L141 were not covered by tests

if (!userSpecifiedVersion)
{
version = currentCliVersion.ToString();
Logger.LogWarning($"We have changed the template version as the cli version.");
Logger.LogWarning($"New version: {version}");
}
}

Check warning on line 149 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L144-L149

Added lines #L144 - L149 were not covered by tests

if (!await IsVersionExists(name, version))
{
throw new Exception("There is no version found with given version: " + version);

Check warning on line 153 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ProjectBuilding/AbpIoSourceCodeStore.cs#L152-L153

Added lines #L152 - L153 were not covered by tests
}

var nugetVersion = (await GetTemplateNugetVersionAsync(name, type, version)) ?? version;

if (!string.IsNullOrWhiteSpace(templateSource) && !IsNetworkSource(templateSource))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
using Volo.Abp.Cli.Commands;
using Volo.Abp.Cli.Http;
using Volo.Abp.Cli.Utils;
using Volo.Abp.Cli.Version;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Json;

Expand All @@ -16,18 +17,18 @@
{
public const string Name = "NG";

private readonly CliService _cliService;
private readonly CliVersionService _cliVersionService;
private readonly ICmdHelper _cmdhelper;

public AngularServiceProxyGenerator(
CliHttpClientFactory cliHttpClientFactory,
IJsonSerializer jsonSerializer,
ICmdHelper cmdhelper,
CliService cliService) :
CliVersionService cliVersionService) :
base(cliHttpClientFactory, jsonSerializer)
{
_cmdhelper = cmdhelper;
_cliService = cliService;
_cliVersionService = cliVersionService;

Check warning on line 31 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/Angular/AngularServiceProxyGenerator.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/Angular/AngularServiceProxyGenerator.cs#L31

Added line #L31 was not covered by tests
}

public async override Task GenerateProxyAsync(GenerateProxyArgs args)
Expand Down Expand Up @@ -123,7 +124,7 @@
return;
}

var cliVersion = await _cliService.GetCurrentCliVersionAsync(typeof(CliService).Assembly);
var cliVersion = await _cliVersionService.GetCurrentCliVersionAsync();

Check warning on line 127 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/Angular/AngularServiceProxyGenerator.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/Angular/AngularServiceProxyGenerator.cs#L127

Added line #L127 was not covered by tests
if (semanticSchematicsVersion < cliVersion)
{
Logger.LogWarning("\"@abp/ng.schematics\" version is lower than ABP Cli version.");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
using System;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using NuGet.Versioning;
using Volo.Abp.Cli.Utils;
using Volo.Abp.DependencyInjection;

namespace Volo.Abp.Cli.Version;

public class CliVersionService : ITransientDependency
{
private CmdHelper CmdHelper { get; }

Check warning on line 14 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs#L14

Added line #L14 was not covered by tests

public CliVersionService(CmdHelper cmdHelper)
{
CmdHelper = cmdHelper;
}

public async Task<SemanticVersion> GetCurrentCliVersionAsync()
{
SemanticVersion currentCliVersion = default;

Check warning on line 23 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs#L22-L23

Added lines #L22 - L23 were not covered by tests

var consoleOutput = new StringReader(CmdHelper.RunCmdAndGetOutput($"dotnet tool list -g", out int exitCode));

Check warning on line 25 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs#L25

Added line #L25 was not covered by tests
string line;
while ((line = await consoleOutput.ReadLineAsync()) != null)
{

Check warning on line 28 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs#L28

Added line #L28 was not covered by tests
if (line.StartsWith("volo.abp.cli", StringComparison.InvariantCultureIgnoreCase))
{
var version = line.Split(new char[0], StringSplitOptions.RemoveEmptyEntries)[1];

Check warning on line 31 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs#L30-L31

Added lines #L30 - L31 were not covered by tests

SemanticVersion.TryParse(version, out currentCliVersion);

Check warning on line 33 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs#L33

Added line #L33 was not covered by tests

break;

Check warning on line 35 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs#L35

Added line #L35 was not covered by tests
}
}

Check warning on line 37 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs#L37

Added line #L37 was not covered by tests

if (currentCliVersion == null)
{

Check warning on line 40 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs#L40

Added line #L40 was not covered by tests
// If not a tool executable, fallback to assembly version and treat as dev without updates
// Assembly revisions are not supported by SemVer scheme required for NuGet, trim to {major}.{minor}.{patch}
var assemblyVersion = string.Join(".", Assembly.GetExecutingAssembly().GetFileVersion().Split('.').Take(3));
return SemanticVersion.Parse(assemblyVersion + "-dev");

Check warning on line 44 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs#L43-L44

Added lines #L43 - L44 were not covered by tests
}

return currentCliVersion;
}

Check warning on line 48 in framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs

View check run for this annotation

Codecov / codecov/patch

framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/Version/CliVersionService.cs#L47-L48

Added lines #L47 - L48 were not covered by tests
}