diff --git a/VERSION b/VERSION index fcd1e22..4bf7ee7 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.0.13-beta +0.0.14-beta diff --git a/apps.Tests/Components/JetBrainsPluginScannerTests.cs b/apps.Tests/Components/JetBrainsPluginScannerTests.cs index 9236a7b..5550047 100644 --- a/apps.Tests/Components/JetBrainsPluginScannerTests.cs +++ b/apps.Tests/Components/JetBrainsPluginScannerTests.cs @@ -1,4 +1,6 @@ using System.Net; +using System.Runtime.InteropServices; +using System.Text.Json; using apps.Components.JetBrains; using apps.Tests.Fakes; @@ -102,6 +104,50 @@ await Assert.That(() => JetBrainsPluginScanner.ParsePluginXml("not xml <")) .Throws(); } + [Test] + [Arguments(OS.MacOS, Architecture.Arm64, "macOS", "ARM64")] + [Arguments(OS.MacOS, Architecture.X64, "macOS", "X86_64")] + [Arguments(OS.Windows, Architecture.Arm64, "Windows", "ARM64")] + [Arguments(OS.Windows, Architecture.X64, "Windows", "X86_64")] + [Arguments(OS.Windows, Architecture.X86, "Windows", "X86")] + [Arguments(OS.Windows, Architecture.Arm, "Windows", "ARM32")] + [Arguments(OS.Windows, Architecture.Armv6, "Windows", "ARM32")] + [Arguments(OS.None, Architecture.Wasm, "Other", "OTHER")] + public async Task CreateCompatibleUpdateRequest_MapsMarketplacePlatform( + OS operatingSystem, + Architecture architecture, + string expectedOs, + string expectedArchitecture) + { + var request = JetBrainsPluginScanner.CreateCompatibleUpdateRequest( + "RD-262.9437.287", + ["com.intellij.platform.daemon"], + operatingSystem, + architecture); + + await Assert.That(request.Os).IsEqualTo(expectedOs); + await Assert.That(request.Arch).IsEqualTo(expectedArchitecture); + } + + [Test] + public async Task CreateCompatibleUpdateRequest_SerializesPlatformFilters() + { + var request = JetBrainsPluginScanner.CreateCompatibleUpdateRequest( + "RD-262.9437.287", + ["com.intellij.platform.daemon"], + OS.MacOS, + Architecture.Arm64); + + var json = JsonSerializer.Serialize(request, JetBrainsJsonContext.Default.JetBrainsCompatibleUpdateRequest); + using var document = JsonDocument.Parse(json); + var root = document.RootElement; + + await Assert.That(root.GetProperty("build").GetString()).IsEqualTo("RD-262.9437.287"); + await Assert.That(root.GetProperty("pluginXMLIds")[0].GetString()).IsEqualTo("com.intellij.platform.daemon"); + await Assert.That(root.GetProperty("os").GetString()).IsEqualTo("macOS"); + await Assert.That(root.GetProperty("arch").GetString()).IsEqualTo("ARM64"); + } + [Test] public async Task CheckAsync_NumericId_WhenRepoHasNewerVersion_SetsLatestAndUpdateAvailable() { diff --git a/apps.Tests/apps.Tests.csproj b/apps.Tests/apps.Tests.csproj index fa3c606..c5c65b0 100644 --- a/apps.Tests/apps.Tests.csproj +++ b/apps.Tests/apps.Tests.csproj @@ -12,7 +12,7 @@ - + diff --git a/apps/CheckOrchestrator.cs b/apps/CheckOrchestrator.cs index c55f4b0..b9bd04f 100644 --- a/apps/CheckOrchestrator.cs +++ b/apps/CheckOrchestrator.cs @@ -74,8 +74,9 @@ public sealed class CheckOrchestrator(IEnumerable scanners, LiveProgre { await timerTask.ConfigureAwait(false); } - catch (OperationCanceledException) + catch (OperationCanceledException) when (timerCts.IsCancellationRequested) { + logger.LogDebug("Check progress timer cancelled"); } var updates = checkedApps.Count(c => c.HasUpdate); diff --git a/apps/Components/JetBrains/JetBrainsJsonContext.cs b/apps/Components/JetBrains/JetBrainsJsonContext.cs index ad26787..23ed490 100644 --- a/apps/Components/JetBrains/JetBrainsJsonContext.cs +++ b/apps/Components/JetBrains/JetBrainsJsonContext.cs @@ -23,6 +23,12 @@ internal sealed class JetBrainsCompatibleUpdateRequest [JsonPropertyName("pluginXMLIds")] public required string[] PluginXmlIds { get; init; } + + [JsonPropertyName("os")] + public required string Os { get; init; } + + [JsonPropertyName("arch")] + public required string Arch { get; init; } } /// diff --git a/apps/Components/JetBrains/JetBrainsPluginScanner.cs b/apps/Components/JetBrains/JetBrainsPluginScanner.cs index 7511122..8d2c3aa 100644 --- a/apps/Components/JetBrains/JetBrainsPluginScanner.cs +++ b/apps/Components/JetBrains/JetBrainsPluginScanner.cs @@ -1,6 +1,7 @@ using System.IO.Compression; using System.Net.Http.Json; using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; using System.Threading.Channels; using System.Xml; @@ -184,7 +185,11 @@ public async IAsyncEnumerable ScanAsync([EnumeratorCancellation] try { using var client = httpClientFactory.CreateClient("jetbrains"); - var request = new JetBrainsCompatibleUpdateRequest { Build = build, PluginXmlIds = xmlIds! }; + var request = CreateCompatibleUpdateRequest( + build, + xmlIds!, + GetCurrentOperatingSystem(), + RuntimeInformation.ProcessArchitecture); using var content = JsonContent.Create(request, JetBrainsJsonContext.Default.JetBrainsCompatibleUpdateRequest); using var response = await client.PostAsync("/api/search/compatibleUpdates", content, cancellationToken).ConfigureAwait(false); response.EnsureSuccessStatusCode(); @@ -443,4 +448,44 @@ internal static (string? Id, string? Name, string? Version, string? DisplayId)? return (id, name, version, displayId); } + + internal static JetBrainsCompatibleUpdateRequest CreateCompatibleUpdateRequest( + string build, + string[] pluginXmlIds, + OS operatingSystem, + Architecture architecture) => + new() + { + Build = build, + PluginXmlIds = pluginXmlIds, + Os = operatingSystem switch + { + OS.MacOS => "macOS", + OS.Windows => "Windows", + _ => "Other" + }, + Arch = architecture switch + { + Architecture.X86 => "X86", + Architecture.X64 => "X86_64", + Architecture.Arm or Architecture.Armv6 => "ARM32", + Architecture.Arm64 => "ARM64", + _ => "OTHER" + } + }; + + private static OS GetCurrentOperatingSystem() + { + if (OperatingSystem.IsMacOS()) + { + return OS.MacOS; + } + + if (OperatingSystem.IsWindows()) + { + return OS.Windows; + } + + return OS.None; + } } \ No newline at end of file diff --git a/apps/ScanOrchestrator.cs b/apps/ScanOrchestrator.cs index 753e342..7b2503c 100644 --- a/apps/ScanOrchestrator.cs +++ b/apps/ScanOrchestrator.cs @@ -72,8 +72,9 @@ public async Task> ScanAsync(AppKind? kind, Ca { await timerTask.ConfigureAwait(false); } - catch (OperationCanceledException) + catch (OperationCanceledException) when (timerCts.IsCancellationRequested) { + logger.LogDebug("Scan progress timer cancelled"); } // Count sub-apps too (e.g. a Homebrew cask channel of a scanned bundle): they are diff --git a/apps/apps.csproj b/apps/apps.csproj index 947fee3..b1a41d5 100644 --- a/apps/apps.csproj +++ b/apps/apps.csproj @@ -3,6 +3,7 @@ Exe net10.0 + 10.0.11 apps enable enable @@ -35,16 +36,16 @@ - - - - + + + + - - + +