diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs index 185f39522..586fc001e 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs @@ -272,7 +272,7 @@ public IReadOnlyList GetAvailableUpdates_UnSafe() List packages = []; foreach ( var nativePackage in TaskRecycler>.RunOrAttach( - GetLocalWinGetPackages + GetWinGetPackagesForUpdates ) ) { @@ -283,6 +283,14 @@ var nativePackage in TaskRecycler>.RunOrAttach( continue; } + if (nativePackage.DefaultInstallVersion is null) + { + Logger.Warn( + $"WinGet package {nativePackage.Id} has IsUpdateAvailable=true but DefaultInstallVersion is null, skipping" + ); + continue; + } + IManagerSource source; source = Manager.SourcesHelper.Factory.GetSourceOrDefault( nativePackage.DefaultInstallVersion.PackageCatalog.Info.Name @@ -467,6 +475,56 @@ private IReadOnlyList GetLocalWinGetPackages() return foundPackages; } + private IReadOnlyList GetWinGetPackagesForUpdates() + { + var logger = Manager.TaskLogger.CreateNew(LoggableTaskType.OtherTask); + logger.Log("OtherTask: GetWinGetPackagesForUpdates"); + + try + { + CreateCompositePackageCatalogOptions createCompositePackageCatalogOptions = Factory.CreateCreateCompositePackageCatalogOptions(); + foreach (var catalogRef in WinGetManager.GetPackageCatalogs().ToArray()) + { + logger.Log($"Adding catalog {catalogRef.Info.Name} to composite catalog"); + createCompositePackageCatalogOptions.Catalogs.Add(catalogRef); + } + + createCompositePackageCatalogOptions.CompositeSearchBehavior = CompositeSearchBehavior.RemotePackagesFromAllCatalogs; + var updateSearchCatalogRef = WinGetManager.CreateCompositePackageCatalog(createCompositePackageCatalogOptions); + updateSearchCatalogRef.AcceptSourceAgreements = true; + var connectResult = updateSearchCatalogRef.Connect(); + + if (connectResult.Status != ConnectResultStatus.Ok) + { + logger.Error("Failed to connect to update catalog. Aborting."); + throw new InvalidOperationException("WinGet: Failed to connect to update catalog."); + } + + FindPackagesOptions findPackagesOptions = Factory.CreateFindPackagesOptions(); + PackageMatchFilter filter = Factory.CreatePackageMatchFilter(); + filter.Field = PackageMatchField.Id; + filter.Option = PackageFieldMatchOption.StartsWithCaseInsensitive; + filter.Value = ""; + findPackagesOptions.Filters.Add(filter); + + var taskResult = connectResult.PackageCatalog.FindPackages(findPackagesOptions); + List foundPackages = []; + foreach (var match in taskResult.Matches.ToArray()) + { + if (match.CatalogPackage.InstalledVersion is not null) + foundPackages.Add(match.CatalogPackage); + } + + logger.Close(0); + return foundPackages; + } + catch + { + logger.Close(1); + throw; + } + } + public IReadOnlyList GetSources_UnSafe() { List sources = [];