22using UniGetUI . PackageEngine ;
33using UniGetUI . PackageEngine . Enums ;
44using UniGetUI . PackageEngine . Interfaces ;
5+ using UniGetUI . PackageEngine . PackageLoader ;
56using UniGetUI . PackageEngine . PackageClasses ;
67using UniGetUI . PackageEngine . Operations ;
78using 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
0 commit comments