From 438cc3ed56e1e2efa8b48b9ab7a49d2d1f1b5159 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Mon, 23 Mar 2026 16:23:51 -0400 Subject: [PATCH] Handle WinGet malfunction false positives --- .../ClientHelpers/NativeWinGetHelper.cs | 112 ++++++++++++++---- .../WinGet.cs | 2 +- .../SoftwarePages/InstalledPackagesPage.cs | 3 +- 3 files changed, 89 insertions(+), 28 deletions(-) diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs index 3b963124c..185f39522 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/ClientHelpers/NativeWinGetHelper.cs @@ -276,8 +276,13 @@ var nativePackage in TaskRecycler>.RunOrAttach( ) ) { - if (nativePackage.IsUpdateAvailable) + try { + if (!nativePackage.IsUpdateAvailable) + { + continue; + } + IManagerSource source; source = Manager.SourcesHelper.Factory.GetSourceOrDefault( nativePackage.DefaultInstallVersion.PackageCatalog.Info.Name @@ -311,6 +316,10 @@ var nativePackage in TaskRecycler>.RunOrAttach( ); } } + catch (Exception ex) + { + LogSkippedPackage(logger, nativePackage, "listing available updates", ex); + } } logger.Close(0); @@ -328,41 +337,92 @@ var nativePackage in TaskRecycler>.RunOrAttach( ) ) { - IManagerSource source; - var availableVersions = nativePackage.AvailableVersions?.ToArray() ?? []; - if (availableVersions.Length > 0) + try { - var installPackage = nativePackage.GetPackageVersionInfo(availableVersions[0]); - source = Manager.SourcesHelper.Factory.GetSourceOrDefault( - installPackage.PackageCatalog.Info.Name + IManagerSource source; + var availableVersions = nativePackage.AvailableVersions?.ToArray() ?? []; + if (availableVersions.Length > 0) + { + var installPackage = nativePackage.GetPackageVersionInfo(availableVersions[0]); + source = Manager.SourcesHelper.Factory.GetSourceOrDefault( + installPackage.PackageCatalog.Info.Name + ); + } + else + { + source = Manager.GetLocalSource(nativePackage.Id); + } + + string version = nativePackage.InstalledVersion.Version; + if (version == "Unknown") + version = WinGetPkgOperationHelper.GetLastInstalledVersion(nativePackage.Id); + + logger.Log( + $"Found package {nativePackage.Name} {nativePackage.Id} on source {source.Name}" + ); + var UniGetUIPackage = new Package( + nativePackage.Name, + nativePackage.Id, + version, + source, + Manager ); + NativePackageHandler.AddPackage(UniGetUIPackage, nativePackage); + packages.Add(UniGetUIPackage); } - else + catch (Exception ex) { - source = Manager.GetLocalSource(nativePackage.Id); + LogSkippedPackage(logger, nativePackage, "listing installed packages", ex); } - - string version = nativePackage.InstalledVersion.Version; - if (version == "Unknown") - version = WinGetPkgOperationHelper.GetLastInstalledVersion(nativePackage.Id); - - logger.Log( - $"Found package {nativePackage.Name} {nativePackage.Id} on source {source.Name}" - ); - var UniGetUIPackage = new Package( - nativePackage.Name, - nativePackage.Id, - version, - source, - Manager - ); - NativePackageHandler.AddPackage(UniGetUIPackage, nativePackage); - packages.Add(UniGetUIPackage); } logger.Close(0); return packages; } + private static void LogSkippedPackage( + INativeTaskLogger logger, + CatalogPackage nativePackage, + string operation, + Exception ex + ) + { + string packageDescription = DescribePackage(nativePackage); + logger.Error($"Skipping WinGet package while {operation}: {packageDescription}"); + logger.Error(ex); + Logger.Warn( + $"Skipping WinGet package while {operation}: {packageDescription}. {ex.GetType().Name}: {ex.Message}" + ); + } + + private static string DescribePackage(CatalogPackage nativePackage) + { + try + { + string id = nativePackage.Id; + if (!string.IsNullOrWhiteSpace(id)) + { + return id; + } + } + catch + { + } + + try + { + string name = nativePackage.Name; + if (!string.IsNullOrWhiteSpace(name)) + { + return name; + } + } + catch + { + } + + return ""; + } + private IReadOnlyList GetLocalWinGetPackages() { var logger = Manager.TaskLogger.CreateNew(LoggableTaskType.OtherTask); diff --git a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs index 131e37da5..a4b724453 100644 --- a/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs +++ b/src/UniGetUI.PackageEngine.Managers.WinGet/WinGet.cs @@ -218,7 +218,7 @@ protected override IReadOnlyList GetInstalledPackages_UnSafe() try { var packages = WinGetHelper.Instance.GetInstalledPackages_UnSafe(); - NO_PACKAGES_HAVE_BEEN_LOADED = !packages.Any(); + NO_PACKAGES_HAVE_BEEN_LOADED = false; return packages; } catch (Exception) diff --git a/src/UniGetUI/Pages/SoftwarePages/InstalledPackagesPage.cs b/src/UniGetUI/Pages/SoftwarePages/InstalledPackagesPage.cs index a4c6c2a4a..10e65a0e1 100644 --- a/src/UniGetUI/Pages/SoftwarePages/InstalledPackagesPage.cs +++ b/src/UniGetUI/Pages/SoftwarePages/InstalledPackagesPage.cs @@ -324,7 +324,8 @@ protected override void WhenPackagesLoaded(ReloadReason reason) } if ( - WinGet.NO_PACKAGES_HAVE_BEEN_LOADED /* && !Settings.Get(Settings.K.DisableWinGetMalfunctionDetector)*/ + WinGet.NO_PACKAGES_HAVE_BEEN_LOADED + && !Settings.Get(Settings.K.DisableWinGetMalfunctionDetector) ) { var infoBar = MainApp.Instance.MainWindow.WinGetWarningBanner;