Skip to content

Commit 2f1659f

Browse files
authored
Drop scope and architecture when retrying WinGet with the local identifier (#5579)
1 parent 9ef1b4c commit 2f1659f

2 files changed

Lines changed: 62 additions & 6 deletions

File tree

‎src/UniGetUI.PackageEngine.Managers.WinGet/Helpers/WinGetPkgOperationHelper.cs‎

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,19 @@ public static string GetIdNamePiece(IPackage package)
2828

2929
private static string GetSelectorPiece(IPackage package)
3030
{
31-
if (
32-
package.OverridenOptions.WinGet_UseLocalIdentifier
33-
&& GetFallbackIdentifier(package) is { } localIdentifier
34-
)
31+
if (GetSelectedLocalIdentifier(package) is { } localIdentifier)
3532
return $"--id {Selector(localIdentifier, "local identifier")} --exact";
3633

3734
return GetIdNamePiece(package);
3835
}
3936

37+
private static string? GetSelectedLocalIdentifier(IPackage package) =>
38+
package.OverridenOptions.WinGet_UseLocalIdentifier ? GetFallbackIdentifier(package) : null;
39+
40+
private static bool DropsArchAndScope(IPackage package) =>
41+
package.OverridenOptions.WinGet_DropArchAndScope
42+
|| GetSelectedLocalIdentifier(package) is not null;
43+
4044
private static bool OperationIsBrokered(IPackage package) =>
4145
Settings.Get(Settings.K.UseAgentBroker) && !package.Source.IsVirtualManager;
4246

@@ -66,7 +70,7 @@ public WinGetPkgOperationHelper(WinGet manager)
6670

6771
internal static string? GetEffectiveScope(IPackage package, InstallOptions options)
6872
{
69-
if (package.OverridenOptions.WinGet_DropArchAndScope)
73+
if (DropsArchAndScope(package))
7074
return null;
7175

7276
return (package.OverridenOptions.Scope ?? options.InstallationScope) switch
@@ -94,7 +98,7 @@ public WinGetPkgOperationHelper(WinGet manager)
9498
bool forUpdate = false
9599
)
96100
{
97-
if (package.OverridenOptions.WinGet_DropArchAndScope)
101+
if (DropsArchAndScope(package))
98102
return null;
99103

100104
string architecture =

‎src/UniGetUI.PackageEngine.Tests/WinGetManagerTests.cs‎

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1929,6 +1929,58 @@ public void WinGetUpdateRetriesWithTheLocalIdentifierWhenNoInstalledPackageMatch
19291929
Assert.Contains("--exact", retryAttempt);
19301930
}
19311931

1932+
[Fact]
1933+
public void WinGetLocalIdentifierRetryDropsTheScopeAndArchitectureThatHidTheInstalledEntry()
1934+
{
1935+
const string fanControlLocalIdentifier =
1936+
@"ARP\Machine\X86\{141A88F8-31AC-49EA-B428-2BE8C19DED83}_is1";
1937+
var manager = new WinGet();
1938+
SetCliToolKind(manager, WinGetCliToolKind.SystemWinGet);
1939+
var package = new PackageBuilder()
1940+
.WithManager(manager)
1941+
.WithId("Rem0o.FanControl")
1942+
.WithVersion("251")
1943+
.WithNewVersion("268")
1944+
.Build();
1945+
NativePackageHandler.AddLocalIdentifier(package, fanControlLocalIdentifier);
1946+
static InstallOptions UserScopeX64() =>
1947+
new() { InstallationScope = PackageScope.User, Architecture = Architecture.x64 };
1948+
1949+
var firstAttempt = manager.OperationHelper.GetParameters(
1950+
package,
1951+
UserScopeX64(),
1952+
OperationType.Update
1953+
);
1954+
Assert.Contains("--scope", firstAttempt);
1955+
Assert.Contains("--architecture", firstAttempt);
1956+
1957+
var veredict = manager.OperationHelper.GetResult(
1958+
package,
1959+
OperationType.Update,
1960+
[],
1961+
unchecked((int)0x8A150014)
1962+
);
1963+
OperationAssert.HasVeredict(veredict, OperationVeredict.AutoRetry);
1964+
1965+
var retryAttempt = manager.OperationHelper.GetParameters(
1966+
package,
1967+
UserScopeX64(),
1968+
OperationType.Update
1969+
);
1970+
Assert.Contains($"\"{fanControlLocalIdentifier}\"", retryAttempt);
1971+
Assert.DoesNotContain("--scope", retryAttempt);
1972+
Assert.DoesNotContain("--architecture", retryAttempt);
1973+
1974+
var manualCommand = manager.OperationHelper.GetStandaloneParameters(
1975+
package,
1976+
UserScopeX64(),
1977+
OperationType.Update
1978+
);
1979+
Assert.Contains($"\"{fanControlLocalIdentifier}\"", manualCommand);
1980+
Assert.DoesNotContain("--scope", manualCommand);
1981+
Assert.DoesNotContain("--architecture", manualCommand);
1982+
}
1983+
19321984
[Fact]
19331985
public void WinGetUninstallRetriesWithTheLocalIdentifierWhenNoInstalledPackageMatches()
19341986
{

0 commit comments

Comments
 (0)