Skip to content

Commit bcb80f5

Browse files
authored
Fix missing WinGet updates (issue 4545)
1 parent 043125a commit bcb80f5

File tree

1 file changed

+59
-1
lines changed

1 file changed

+59
-1
lines changed

src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -272,7 +272,7 @@ public IReadOnlyList<Package> GetAvailableUpdates_UnSafe()
272272
List<Package> packages = [];
273273
foreach (
274274
var nativePackage in TaskRecycler<IReadOnlyList<CatalogPackage>>.RunOrAttach(
275-
GetLocalWinGetPackages
275+
GetWinGetPackagesForUpdates
276276
)
277277
)
278278
{
@@ -283,6 +283,14 @@ var nativePackage in TaskRecycler<IReadOnlyList<CatalogPackage>>.RunOrAttach(
283283
continue;
284284
}
285285

286+
if (nativePackage.DefaultInstallVersion is null)
287+
{
288+
Logger.Warn(
289+
$"WinGet package {nativePackage.Id} has IsUpdateAvailable=true but DefaultInstallVersion is null, skipping"
290+
);
291+
continue;
292+
}
293+
286294
IManagerSource source;
287295
source = Manager.SourcesHelper.Factory.GetSourceOrDefault(
288296
nativePackage.DefaultInstallVersion.PackageCatalog.Info.Name
@@ -467,6 +475,56 @@ private IReadOnlyList<CatalogPackage> GetLocalWinGetPackages()
467475
return foundPackages;
468476
}
469477

478+
private IReadOnlyList<CatalogPackage> GetWinGetPackagesForUpdates()
479+
{
480+
var logger = Manager.TaskLogger.CreateNew(LoggableTaskType.OtherTask);
481+
logger.Log("OtherTask: GetWinGetPackagesForUpdates");
482+
483+
try
484+
{
485+
CreateCompositePackageCatalogOptions createCompositePackageCatalogOptions = Factory.CreateCreateCompositePackageCatalogOptions();
486+
foreach (var catalogRef in WinGetManager.GetPackageCatalogs().ToArray())
487+
{
488+
logger.Log($"Adding catalog {catalogRef.Info.Name} to composite catalog");
489+
createCompositePackageCatalogOptions.Catalogs.Add(catalogRef);
490+
}
491+
492+
createCompositePackageCatalogOptions.CompositeSearchBehavior = CompositeSearchBehavior.RemotePackagesFromAllCatalogs;
493+
var updateSearchCatalogRef = WinGetManager.CreateCompositePackageCatalog(createCompositePackageCatalogOptions);
494+
updateSearchCatalogRef.AcceptSourceAgreements = true;
495+
var connectResult = updateSearchCatalogRef.Connect();
496+
497+
if (connectResult.Status != ConnectResultStatus.Ok)
498+
{
499+
logger.Error("Failed to connect to update catalog. Aborting.");
500+
throw new InvalidOperationException("WinGet: Failed to connect to update catalog.");
501+
}
502+
503+
FindPackagesOptions findPackagesOptions = Factory.CreateFindPackagesOptions();
504+
PackageMatchFilter filter = Factory.CreatePackageMatchFilter();
505+
filter.Field = PackageMatchField.Id;
506+
filter.Option = PackageFieldMatchOption.StartsWithCaseInsensitive;
507+
filter.Value = "";
508+
findPackagesOptions.Filters.Add(filter);
509+
510+
var taskResult = connectResult.PackageCatalog.FindPackages(findPackagesOptions);
511+
List<CatalogPackage> foundPackages = [];
512+
foreach (var match in taskResult.Matches.ToArray())
513+
{
514+
if (match.CatalogPackage.InstalledVersion is not null)
515+
foundPackages.Add(match.CatalogPackage);
516+
}
517+
518+
logger.Close(0);
519+
return foundPackages;
520+
}
521+
catch
522+
{
523+
logger.Close(1);
524+
throw;
525+
}
526+
}
527+
470528
public IReadOnlyList<IManagerSource> GetSources_UnSafe()
471529
{
472530
List<ManagerSource> sources = [];

0 commit comments

Comments
 (0)