diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/Helpers/WinGetPkgOperationHelper.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/Helpers/WinGetPkgOperationHelper.cs index 44080f66b6..0a03038542 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/Helpers/WinGetPkgOperationHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/Helpers/WinGetPkgOperationHelper.cs @@ -28,15 +28,19 @@ public static string GetIdNamePiece(IPackage package) private static string GetSelectorPiece(IPackage package) { - if ( - package.OverridenOptions.WinGet_UseLocalIdentifier - && GetFallbackIdentifier(package) is { } localIdentifier - ) + if (GetSelectedLocalIdentifier(package) is { } localIdentifier) return $"--id {Selector(localIdentifier, "local identifier")} --exact"; return GetIdNamePiece(package); } + private static string? GetSelectedLocalIdentifier(IPackage package) => + package.OverridenOptions.WinGet_UseLocalIdentifier ? GetFallbackIdentifier(package) : null; + + private static bool DropsArchAndScope(IPackage package) => + package.OverridenOptions.WinGet_DropArchAndScope + || GetSelectedLocalIdentifier(package) is not null; + private static bool OperationIsBrokered(IPackage package) => Settings.Get(Settings.K.UseAgentBroker) && !package.Source.IsVirtualManager; @@ -66,7 +70,7 @@ public WinGetPkgOperationHelper(WinGet manager) internal static string? GetEffectiveScope(IPackage package, InstallOptions options) { - if (package.OverridenOptions.WinGet_DropArchAndScope) + if (DropsArchAndScope(package)) return null; return (package.OverridenOptions.Scope ?? options.InstallationScope) switch @@ -94,7 +98,7 @@ public WinGetPkgOperationHelper(WinGet manager) bool forUpdate = false ) { - if (package.OverridenOptions.WinGet_DropArchAndScope) + if (DropsArchAndScope(package)) return null; string architecture = diff --git a/src/UniGetUI.PackageEngine.Tests/WinGetManagerTests.cs b/src/UniGetUI.PackageEngine.Tests/WinGetManagerTests.cs index 96cfe3d1d3..29c113224f 100644 --- a/src/UniGetUI.PackageEngine.Tests/WinGetManagerTests.cs +++ b/src/UniGetUI.PackageEngine.Tests/WinGetManagerTests.cs @@ -1929,6 +1929,58 @@ public void WinGetUpdateRetriesWithTheLocalIdentifierWhenNoInstalledPackageMatch Assert.Contains("--exact", retryAttempt); } + [Fact] + public void WinGetLocalIdentifierRetryDropsTheScopeAndArchitectureThatHidTheInstalledEntry() + { + const string fanControlLocalIdentifier = + @"ARP\Machine\X86\{141A88F8-31AC-49EA-B428-2BE8C19DED83}_is1"; + var manager = new WinGet(); + SetCliToolKind(manager, WinGetCliToolKind.SystemWinGet); + var package = new PackageBuilder() + .WithManager(manager) + .WithId("Rem0o.FanControl") + .WithVersion("251") + .WithNewVersion("268") + .Build(); + NativePackageHandler.AddLocalIdentifier(package, fanControlLocalIdentifier); + static InstallOptions UserScopeX64() => + new() { InstallationScope = PackageScope.User, Architecture = Architecture.x64 }; + + var firstAttempt = manager.OperationHelper.GetParameters( + package, + UserScopeX64(), + OperationType.Update + ); + Assert.Contains("--scope", firstAttempt); + Assert.Contains("--architecture", firstAttempt); + + var veredict = manager.OperationHelper.GetResult( + package, + OperationType.Update, + [], + unchecked((int)0x8A150014) + ); + OperationAssert.HasVeredict(veredict, OperationVeredict.AutoRetry); + + var retryAttempt = manager.OperationHelper.GetParameters( + package, + UserScopeX64(), + OperationType.Update + ); + Assert.Contains($"\"{fanControlLocalIdentifier}\"", retryAttempt); + Assert.DoesNotContain("--scope", retryAttempt); + Assert.DoesNotContain("--architecture", retryAttempt); + + var manualCommand = manager.OperationHelper.GetStandaloneParameters( + package, + UserScopeX64(), + OperationType.Update + ); + Assert.Contains($"\"{fanControlLocalIdentifier}\"", manualCommand); + Assert.DoesNotContain("--scope", manualCommand); + Assert.DoesNotContain("--architecture", manualCommand); + } + [Fact] public void WinGetUninstallRetriesWithTheLocalIdentifierWhenNoInstalledPackageMatches() {