diff --git a/installer/PowerToysSetupVNext/CmdPal.wxs b/installer/PowerToysSetupVNext/CmdPal.wxs index f05a1f2f35..b6b80127c2 100644 --- a/installer/PowerToysSetupVNext/CmdPal.wxs +++ b/installer/PowerToysSetupVNext/CmdPal.wxs @@ -18,6 +18,7 @@ + diff --git a/src/common/utils/package.h b/src/common/utils/package.h index 138f3b8e5b..58961f93ac 100644 --- a/src/common/utils/package.h +++ b/src/common/utils/package.h @@ -2,6 +2,7 @@ #include +#include #include #include #include @@ -337,6 +338,30 @@ namespace package } } } + + // Sort by package version in descending order (newest first) + std::sort(matchedFiles.begin(), matchedFiles.end(), [](const std::wstring& a, const std::wstring& b) { + std::wstring nameA, nameB; + PACKAGE_VERSION versionA{}, versionB{}; + + bool gotA = GetPackageNameAndVersionFromAppx(a, nameA, versionA); + bool gotB = GetPackageNameAndVersionFromAppx(b, nameB, versionB); + + // Files that failed to parse go to the end + if (!gotA) + return false; + if (!gotB) + return true; + + // Compare versions: Major, Minor, Build, Revision (descending) + if (versionA.Major != versionB.Major) + return versionA.Major > versionB.Major; + if (versionA.Minor != versionB.Minor) + return versionA.Minor > versionB.Minor; + if (versionA.Build != versionB.Build) + return versionA.Build > versionB.Build; + return versionA.Revision > versionB.Revision; + }); } catch (const std::exception& ex) {