winget-cli

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 3efea3829041993bea51432af25b994cfa8339f3
parent edbf683f40087d978176e9a47c725c7e34a6b3d4
Author: yao-msft <50888816+yao-msft@users.noreply.github.com>
Date:   Wed, 16 Apr 2025 11:06:57 -0700

Better DefaultInstallVersion (#5389)

DefaultInstallVersion being null causes larger than expected issues. The
change proposes to return latest applicable version if exists, to
minimize duplicate installs/ upgrade failures. If no latest applicable
version, return latest available version if exists.
###### Microsoft Reviewers: [Open in
CodeFlow](https://microsoft.github.io/open-pr/?codeflow=https://github.com/microsoft/winget-cli/pull/5389)
Diffstat:
Msrc/Microsoft.Management.Deployment/CatalogPackage.cpp | 24++++++++++++++++++------
Msrc/Microsoft.Management.Deployment/CatalogPackage.h | 9++++-----
2 files changed, 22 insertions(+), 11 deletions(-)

diff --git a/src/Microsoft.Management.Deployment/CatalogPackage.cpp b/src/Microsoft.Management.Deployment/CatalogPackage.cpp @@ -67,9 +67,9 @@ namespace winrt::Microsoft::Management::Deployment::implementation return m_availableVersions.GetView(); } - void CatalogPackage::InitializeDefaultInstallVersion() + void CatalogPackage::InitializeLatestApplicableVersion() { - std::call_once(m_defaultInstallVersionOnceFlag, + std::call_once(m_latestApplicableVersionOnceFlag, [&]() { using namespace AppInstaller::Pinning; @@ -126,15 +126,27 @@ namespace winrt::Microsoft::Management::Deployment::implementation auto latestVersionImpl = winrt::make_self<wil::details::module_count_wrapper< winrt::Microsoft::Management::Deployment::implementation::PackageVersionInfo>>(); latestVersionImpl->Initialize(std::move(latestApplicableVersion)); - m_defaultInstallVersion = *latestVersionImpl; + m_latestApplicableVersion = *latestVersionImpl; } }); } Microsoft::Management::Deployment::PackageVersionInfo CatalogPackage::DefaultInstallVersion() { - InitializeDefaultInstallVersion(); - return m_defaultInstallVersion; + InitializeLatestApplicableVersion(); + + if (m_latestApplicableVersion) + { + return m_latestApplicableVersion; + } + else if (AvailableVersions().Size() > 0) + { + return GetPackageVersionInfo(AvailableVersions().GetAt(0)); + } + else + { + return nullptr; + } } Microsoft::Management::Deployment::PackageVersionInfo CatalogPackage::GetPackageVersionInfo(Microsoft::Management::Deployment::PackageVersionId const& versionKey) @@ -156,7 +168,7 @@ namespace winrt::Microsoft::Management::Deployment::implementation bool CatalogPackage::IsUpdateAvailable() { - InitializeDefaultInstallVersion(); + InitializeLatestApplicableVersion(); return m_updateAvailable; } diff --git a/src/Microsoft.Management.Deployment/CatalogPackage.h b/src/Microsoft.Management.Deployment/CatalogPackage.h @@ -38,12 +38,12 @@ namespace winrt::Microsoft::Management::Deployment::implementation bool m_updateAvailable = false; Windows::Foundation::Collections::IVector<winrt::Microsoft::Management::Deployment::PackageVersionId> m_availableVersions{ winrt::single_threaded_vector<winrt::Microsoft::Management::Deployment::PackageVersionId>() }; winrt::Microsoft::Management::Deployment::PackageVersionInfo m_installedVersion{ nullptr }; - winrt::Microsoft::Management::Deployment::PackageVersionInfo m_defaultInstallVersion{ nullptr }; + winrt::Microsoft::Management::Deployment::PackageVersionInfo m_latestApplicableVersion{ nullptr }; std::once_flag m_installedVersionOnceFlag; std::once_flag m_availableVersionsOnceFlag; - std::once_flag m_defaultInstallVersionOnceFlag; + std::once_flag m_latestApplicableVersionOnceFlag; - void InitializeDefaultInstallVersion(); + void InitializeLatestApplicableVersion(); #endif }; -}- \ No newline at end of file +}