From bf7e349d4da6f6741ee5f4013d9c79604f5be66e Mon Sep 17 00:00:00 2001 From: ellizio Date: Fri, 26 Apr 2024 11:21:39 +0300 Subject: [PATCH] Tool versioning --- .../main/kotlin/model/rider/ProtocolModel.kt | 11 ++++++--- .../{Tracker.cs => DotnetToolsTracker.cs} | 8 +++---- .../ReSharperPlugin.ODataCliUi/PluginHost.cs | 24 +++++++++---------- .../ellizio/odatacliui/dialogs/CliDialog.kt | 6 ++++- .../odatacliui/extensions/ProtocolModelEx.kt | 5 ++++ .../odatacliui/models/CliDialogModel.kt | 4 ++-- src/rider/main/resources/UiBundle.properties | 1 + 7 files changed, 37 insertions(+), 22 deletions(-) rename src/dotnet/ReSharperPlugin.ODataCliUi/{Tracker.cs => DotnetToolsTracker.cs} (75%) create mode 100644 src/rider/main/kotlin/ru/ellizio/odatacliui/extensions/ProtocolModelEx.kt diff --git a/protocol/src/main/kotlin/model/rider/ProtocolModel.kt b/protocol/src/main/kotlin/model/rider/ProtocolModel.kt index 0e4d227..ae62091 100644 --- a/protocol/src/main/kotlin/model/rider/ProtocolModel.kt +++ b/protocol/src/main/kotlin/model/rider/ProtocolModel.kt @@ -5,9 +5,14 @@ import com.jetbrains.rider.model.nova.ide.SolutionModel @Suppress("unused") object ProtocolModel : Ext(SolutionModel.Solution) { - private val CliTool = structdef { + private val DotnetToolVersionDefinition = structdef { + field("major", PredefinedType.int) + field("minor", PredefinedType.int) + field("patch", PredefinedType.int) + } + private val DotnetToolDefinition = structdef { field("installed", PredefinedType.bool) - field("version", PredefinedType.string.nullable) + field("version", DotnetToolVersionDefinition.nullable) } private val EmbeddedResourceDefinition = structdef { @@ -16,7 +21,7 @@ object ProtocolModel : Ext(SolutionModel.Solution) { } init { - call("getODataCliTool", PredefinedType.void, CliTool) + call("getODataCliTool", PredefinedType.void, DotnetToolDefinition) call("addEmbeddedResource", EmbeddedResourceDefinition, PredefinedType.void) } } \ No newline at end of file diff --git a/src/dotnet/ReSharperPlugin.ODataCliUi/Tracker.cs b/src/dotnet/ReSharperPlugin.ODataCliUi/DotnetToolsTracker.cs similarity index 75% rename from src/dotnet/ReSharperPlugin.ODataCliUi/Tracker.cs rename to src/dotnet/ReSharperPlugin.ODataCliUi/DotnetToolsTracker.cs index d48d0c8..c3435db 100644 --- a/src/dotnet/ReSharperPlugin.ODataCliUi/Tracker.cs +++ b/src/dotnet/ReSharperPlugin.ODataCliUi/DotnetToolsTracker.cs @@ -7,15 +7,15 @@ namespace ReSharperPlugin.ODataCliUi; [SolutionComponent] -public class Tracker +public class DotnetToolsTracker { private readonly JetFastSemiReenterableRWLock _lock = new(); private readonly Lifetime _lifetime; private readonly SolutionDotnetToolsTracker _dotnetToolsTracker; - public event Action DotNetToolCacheChanged; + public event Action DotnetToolsCacheChanged; - public Tracker(Lifetime lifetime, SolutionDotnetToolsTracker dotnetToolsTracker) + public DotnetToolsTracker(Lifetime lifetime, SolutionDotnetToolsTracker dotnetToolsTracker) { _lifetime = lifetime; _dotnetToolsTracker = dotnetToolsTracker; @@ -30,7 +30,7 @@ public void Start() using var _ = _lock.UsingWriteLock(); var cache = args.New; - DotNetToolCacheChanged?.Invoke(cache); + DotnetToolsCacheChanged?.Invoke(cache); }); } } \ No newline at end of file diff --git a/src/dotnet/ReSharperPlugin.ODataCliUi/PluginHost.cs b/src/dotnet/ReSharperPlugin.ODataCliUi/PluginHost.cs index 29fc761..0b84d8e 100644 --- a/src/dotnet/ReSharperPlugin.ODataCliUi/PluginHost.cs +++ b/src/dotnet/ReSharperPlugin.ODataCliUi/PluginHost.cs @@ -16,20 +16,20 @@ namespace ReSharperPlugin.ODataCliUi; public sealed class PluginHost : IDisposable { private readonly ISolution _solution; - private readonly Tracker _tracker; + private readonly DotnetToolsTracker _dotnetToolsTracker; - private CliTool _odataCliTool; + private DotnetToolDefinition _odataCliTool; - public PluginHost(ISolution solution, Tracker tracker) + public PluginHost(ISolution solution, DotnetToolsTracker dotnetToolsTracker) { _solution = solution; var protocolModel = solution.GetProtocolSolution().GetProtocolModel(); protocolModel.GetODataCliTool.SetSync(GetODataCliTool); protocolModel.AddEmbeddedResource.SetVoidAsync(AddEmbeddedResourceAsync); - _tracker = tracker; - tracker.DotNetToolCacheChanged += OnDotNetToolCacheChanged; - tracker.Start(); + _dotnetToolsTracker = dotnetToolsTracker; + dotnetToolsTracker.DotnetToolsCacheChanged += OnDotnetToolsCacheChanged; + dotnetToolsTracker.Start(); } private Task AddEmbeddedResourceAsync(Lifetime lifetime, EmbeddedResourceDefinition definition) @@ -46,21 +46,21 @@ private Task AddEmbeddedResourceAsync(Lifetime lifetime, EmbeddedResourceDefinit return Task.CompletedTask; } - private CliTool GetODataCliTool(Lifetime lifetime, Unit unit) => _odataCliTool; + private DotnetToolDefinition GetODataCliTool(Lifetime lifetime, Unit unit) => _odataCliTool; - private void OnDotNetToolCacheChanged(DotNetToolCache cache) + private void OnDotnetToolsCacheChanged(DotNetToolCache cache) { var tool = cache.ToolGlobalCache.GetGlobalTool(Constants.MicrosoftODataCliPackageId)?.FirstOrDefault(); _odataCliTool = tool is null - ? _odataCliTool = new CliTool(false, null) - : _odataCliTool = new CliTool(true, $"Global, {tool.Version}"); + ? _odataCliTool = new DotnetToolDefinition(false, null) + : _odataCliTool = new DotnetToolDefinition(true, new DotnetToolVersionDefinition(tool.Version.Major, tool.Version.Minor, tool.Version.Patch)); } public void Dispose() { - if (_tracker is not null) + if (_dotnetToolsTracker is not null) { - _tracker.DotNetToolCacheChanged -= OnDotNetToolCacheChanged; + _dotnetToolsTracker.DotnetToolsCacheChanged -= OnDotnetToolsCacheChanged; } } } \ No newline at end of file diff --git a/src/rider/main/kotlin/ru/ellizio/odatacliui/dialogs/CliDialog.kt b/src/rider/main/kotlin/ru/ellizio/odatacliui/dialogs/CliDialog.kt index 160926f..aec07c9 100644 --- a/src/rider/main/kotlin/ru/ellizio/odatacliui/dialogs/CliDialog.kt +++ b/src/rider/main/kotlin/ru/ellizio/odatacliui/dialogs/CliDialog.kt @@ -8,6 +8,7 @@ import com.intellij.ui.dsl.builder.* import ru.ellizio.odatacliui.Constants import ru.ellizio.odatacliui.UiBundle import ru.ellizio.odatacliui.extensions.emptyText +import ru.ellizio.odatacliui.extensions.humanize import ru.ellizio.odatacliui.models.CliDialogModel import javax.swing.JComponent @@ -47,9 +48,12 @@ class CliDialog(private val model: CliDialogModel) : DialogWrapper(false) { tabbedPane.addTab(UiBundle.text("cli.tab.generation"), generationTab) tabbedPane.addTab(UiBundle.text("cli.tab.request"), requestTab) + val version = if (!model.odataCliTool.installed) UiBundle.text("cli.cli-version.label-value.not-installed") + else "${UiBundle.text("cli.cli-version.label-value.global")}, ${model.odataCliTool.version?.humanize()}" + return panel { row { - label(model.odataCliTool.version ?: UiBundle.text("cli.cli-version.label-value.not-installed")) + label(version) .label(UiBundle.text("cli.cli-version.label")) .comment(UiBundle.text("cli.cli-version.comment")) }.bottomGap(BottomGap.SMALL) diff --git a/src/rider/main/kotlin/ru/ellizio/odatacliui/extensions/ProtocolModelEx.kt b/src/rider/main/kotlin/ru/ellizio/odatacliui/extensions/ProtocolModelEx.kt new file mode 100644 index 0000000..f775fe5 --- /dev/null +++ b/src/rider/main/kotlin/ru/ellizio/odatacliui/extensions/ProtocolModelEx.kt @@ -0,0 +1,5 @@ +package ru.ellizio.odatacliui.extensions + +import com.jetbrains.rd.ide.model.DotnetToolVersionDefinition + +fun DotnetToolVersionDefinition.humanize() : String = "$major.$minor.$patch" \ No newline at end of file diff --git a/src/rider/main/kotlin/ru/ellizio/odatacliui/models/CliDialogModel.kt b/src/rider/main/kotlin/ru/ellizio/odatacliui/models/CliDialogModel.kt index c1b73af..d73ac8e 100644 --- a/src/rider/main/kotlin/ru/ellizio/odatacliui/models/CliDialogModel.kt +++ b/src/rider/main/kotlin/ru/ellizio/odatacliui/models/CliDialogModel.kt @@ -2,7 +2,7 @@ package ru.ellizio.odatacliui.models import com.intellij.execution.configurations.GeneralCommandLine import com.intellij.openapi.project.Project -import com.jetbrains.rd.ide.model.CliTool +import com.jetbrains.rd.ide.model.DotnetToolDefinition import com.jetbrains.rd.ide.model.protocolModel import com.jetbrains.rider.model.dotNetActiveRuntimeModel import ru.ellizio.odatacliui.Constants @@ -21,7 +21,7 @@ private const val CSDL_NAME = "OData ServiceCsdl.xml" class CliDialogModel(project: Project, private val actionMetadata: ActionMetadata) { val validator = CliDialogModelValidator() - val odataCliTool: CliTool + val odataCliTool: DotnetToolDefinition val dotnetCliPath: String? init { diff --git a/src/rider/main/resources/UiBundle.properties b/src/rider/main/resources/UiBundle.properties index 8008c91..cc817a3 100644 --- a/src/rider/main/resources/UiBundle.properties +++ b/src/rider/main/resources/UiBundle.properties @@ -6,6 +6,7 @@ cli.tab.generation=Generation Arguments cli.tab.request=Generation Arguments cli.cli-version.label=OData CLI Version: cli.cli-version.label-value.not-installed=Not installed +cli.cli-version.label-value.global=Global cli.cli-version.comment=Not installed? Follow instruction cli.service-name.row=Service name: cli.metadata-source.row=Metadata source: