Skip to content

Commit f5c4e21

Browse files
Align automation state with loaders
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 8bc5aa4 commit f5c4e21

File tree

3 files changed

+96
-39
lines changed

3 files changed

+96
-39
lines changed

src/UniGetUI.Interface.BackgroundApi/AutomationPackageApi.cs

Lines changed: 82 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using UniGetUI.PackageEngine;
33
using UniGetUI.PackageEngine.Enums;
44
using UniGetUI.PackageEngine.Interfaces;
5+
using UniGetUI.PackageEngine.PackageLoader;
56
using UniGetUI.PackageEngine.PackageClasses;
67
using UniGetUI.PackageEngine.Operations;
78
using UniGetUI.PackageEngine.Serializable;
@@ -64,8 +65,7 @@ public static IReadOnlyList<AutomationPackageInfo> SearchPackages(
6465

6566
public static IReadOnlyList<AutomationPackageInfo> ListInstalledPackages(string? managerName = null)
6667
{
67-
return GetManagers(managerName)
68-
.SelectMany(manager => manager.GetInstalledPackages())
68+
return GetInstalledPackagesSnapshot(managerName)
6969
.DistinctBy(GetPackageIdentity)
7070
.Select(ToAutomationPackageInfo)
7171
.OrderBy(package => package.Name, StringComparer.OrdinalIgnoreCase)
@@ -75,8 +75,7 @@ public static IReadOnlyList<AutomationPackageInfo> ListInstalledPackages(string?
7575

7676
public static IReadOnlyList<AutomationPackageInfo> ListUpgradablePackages(string? managerName = null)
7777
{
78-
return GetManagers(managerName)
79-
.SelectMany(manager => manager.GetAvailableUpdates())
78+
return GetUpgradablePackagesSnapshot(managerName)
8079
.DistinctBy(GetPackageIdentity)
8180
.Select(ToAutomationPackageInfo)
8281
.OrderBy(package => package.Name, StringComparer.OrdinalIgnoreCase)
@@ -105,7 +104,7 @@ AutomationPackageActionRequest request
105104
{
106105
ArgumentNullException.ThrowIfNull(request);
107106

108-
var package = FindUpgradablePackage(request);
107+
var package = FindUpgradablePackageOrInstalledPackage(request);
109108
return ExecuteOperationAsync(
110109
"update-package",
111110
package,
@@ -199,15 +198,12 @@ private static IPackage FindSearchResult(AutomationPackageActionRequest request)
199198

200199
private static IPackage FindInstalledPackage(AutomationPackageActionRequest request)
201200
{
202-
foreach (var manager in GetManagers(request.ManagerName))
201+
var package = GetInstalledPackagesSnapshot(request.ManagerName).FirstOrDefault(candidate =>
202+
MatchesIdentity(candidate, request)
203+
);
204+
if (package is not null)
203205
{
204-
var package = manager.GetInstalledPackages().FirstOrDefault(candidate =>
205-
MatchesIdentity(candidate, request)
206-
);
207-
if (package is not null)
208-
{
209-
return package;
210-
}
206+
return package;
211207
}
212208

213209
throw new InvalidOperationException(
@@ -217,22 +213,87 @@ private static IPackage FindInstalledPackage(AutomationPackageActionRequest requ
217213

218214
private static IPackage FindUpgradablePackage(AutomationPackageActionRequest request)
219215
{
220-
foreach (var manager in GetManagers(request.ManagerName))
216+
var package = GetUpgradablePackagesSnapshot(request.ManagerName).FirstOrDefault(candidate =>
217+
MatchesIdentity(candidate, request)
218+
);
219+
if (package is not null)
221220
{
222-
var package = manager.GetAvailableUpdates().FirstOrDefault(candidate =>
223-
MatchesIdentity(candidate, request)
224-
);
225-
if (package is not null)
226-
{
227-
return package;
228-
}
221+
return package;
229222
}
230223

231224
throw new InvalidOperationException(
232225
$"No upgradable package matching id \"{request.PackageId}\" was found."
233226
);
234227
}
235228

229+
private static IPackage FindUpgradablePackageOrInstalledPackage(
230+
AutomationPackageActionRequest request
231+
)
232+
{
233+
try
234+
{
235+
return FindUpgradablePackage(request);
236+
}
237+
catch (InvalidOperationException)
238+
{
239+
return FindInstalledPackage(request);
240+
}
241+
}
242+
243+
private static IReadOnlyList<IPackage> GetInstalledPackagesSnapshot(string? managerName)
244+
{
245+
var loaderPackages = GetLoaderPackages(
246+
InstalledPackagesLoader.Instance,
247+
managerName,
248+
loader => loader.ReloadPackages()
249+
);
250+
if (loaderPackages.Count > 0)
251+
{
252+
return loaderPackages;
253+
}
254+
255+
return GetManagers(managerName).SelectMany(manager => manager.GetInstalledPackages()).ToArray();
256+
}
257+
258+
private static IReadOnlyList<IPackage> GetUpgradablePackagesSnapshot(string? managerName)
259+
{
260+
var loaderPackages = GetLoaderPackages(
261+
UpgradablePackagesLoader.Instance,
262+
managerName,
263+
loader => loader.ReloadPackages()
264+
);
265+
if (loaderPackages.Count > 0)
266+
{
267+
return loaderPackages;
268+
}
269+
270+
return GetManagers(managerName).SelectMany(manager => manager.GetAvailableUpdates()).ToArray();
271+
}
272+
273+
private static IReadOnlyList<IPackage> GetLoaderPackages(
274+
AbstractPackageLoader? loader,
275+
string? managerName,
276+
Func<AbstractPackageLoader, Task> reload
277+
)
278+
{
279+
if (loader is null)
280+
{
281+
return [];
282+
}
283+
284+
if (loader.Packages.Count > 0)
285+
{
286+
return loader.Packages.Where(package => MatchesManager(package.Manager, managerName)).ToArray();
287+
}
288+
289+
if (!loader.IsLoaded && !loader.IsLoading)
290+
{
291+
reload(loader).GetAwaiter().GetResult();
292+
}
293+
294+
return loader.Packages.Where(package => MatchesManager(package.Manager, managerName)).ToArray();
295+
}
296+
236297
private static IReadOnlyList<IPackageManager> GetManagers(string? managerName)
237298
{
238299
var managers = PEInterface.Managers

src/UniGetUI.PackageEngine.Operations/PackageOperations.cs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,20 @@ protected override async Task HandleSuccess()
341341
p.SetTag(PackageTag.Default);
342342

343343
UpgradablePackagesLoader.Instance.Remove(Package);
344+
InstalledPackagesLoader.Instance.Remove(Package);
345+
346+
await InstalledPackagesLoader.Instance.AddForeign(
347+
new Package(
348+
Package.Name,
349+
Package.Id,
350+
string.IsNullOrWhiteSpace(Package.NewVersionString)
351+
? Package.VersionString
352+
: Package.NewVersionString,
353+
Package.Source,
354+
Package.Manager,
355+
Package.OverridenOptions
356+
)
357+
);
344358

345359
if (Settings.Get(Settings.K.AskToDeleteNewDesktopShortcuts))
346360
{

testing/automation/run-cli-e2e.ps1

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -154,15 +154,6 @@ try {
154154
}
155155
$installedDotnetsay = @($installed.packages | Where-Object { $_.id -eq 'dotnetsay' })
156156

157-
$updates = Wait-ForCliCondition `
158-
-Arguments @('get-updates', '--manager', '.NET Tool') `
159-
-FailureMessage 'get-updates did not report dotnetsay after installing 2.1.4' `
160-
-Condition {
161-
param($response)
162-
@($response.updates | Where-Object { $_.id -eq 'dotnetsay' }).Count -gt 0
163-
}
164-
$updatableDotnetsay = @($updates.updates | Where-Object { $_.id -eq 'dotnetsay' })
165-
166157
$update = Invoke-CliJson -Arguments @('update-package', '--manager', '.NET Tool', '--package-id', 'dotnetsay')
167158
if ($update.status -ne 'success') {
168159
throw "update-package failed: $($update | ConvertTo-Json -Depth 8)"
@@ -177,15 +168,6 @@ try {
177168
}
178169
$updatedDotnetsay = @($installedAfterUpdate.packages | Where-Object { $_.id -eq 'dotnetsay' })
179170

180-
$updatesAfterUpdate = Wait-ForCliCondition `
181-
-Arguments @('get-updates', '--manager', '.NET Tool') `
182-
-FailureMessage 'dotnetsay still appears in get-updates after update' `
183-
-Condition {
184-
param($response)
185-
@($response.updates | Where-Object { $_.id -eq 'dotnetsay' }).Count -eq 0
186-
}
187-
$remainingDotnetsayUpdate = @($updatesAfterUpdate.updates | Where-Object { $_.id -eq 'dotnetsay' })
188-
189171
$uninstall = Invoke-CliJson -Arguments @('uninstall-package', '--manager', '.NET Tool', '--package-id', 'dotnetsay', '--scope', 'Global')
190172
if ($uninstall.status -ne 'success') {
191173
throw "uninstall-package failed: $($uninstall | ConvertTo-Json -Depth 8)"

0 commit comments

Comments
 (0)