From 1344376630a6f47b20dd37aa7f652503635329c4 Mon Sep 17 00:00:00 2001 From: SlaiAgent <294879785+huong8373tt-beep@users.noreply.github.com> Date: Thu, 8 Oct 2026 15:44:51 +0800 Subject: [PATCH 1/4] Support ARM architectures in package name normalization --- src/AppInstallerCLITests/NameNormalization.cpp | 3 +++ src/AppInstallerCommonCore/NameNormalization.cpp | 10 ++++++++++ 2 files changed, 13 insertions(+) diff --git a/src/AppInstallerCLITests/NameNormalization.cpp b/src/AppInstallerCLITests/NameNormalization.cpp index c4ab35e3fd..8faef5ed6d 100644 --- a/src/AppInstallerCLITests/NameNormalization.cpp +++ b/src/AppInstallerCLITests/NameNormalization.cpp @@ -111,6 +111,9 @@ TEST_CASE("NameNorm_Architecture", "[name_norm]") REQUIRE(normer.Normalize("Name x86", {}).Architecture() == Architecture::X86); REQUIRE(normer.Normalize("Name x86_64", {}).Architecture() == Architecture::X64); REQUIRE(normer.Normalize("Name (64 bit)", {}).Architecture() == Architecture::X64); + REQUIRE(normer.Normalize("Name arm", {}).Architecture() == Architecture::Arm); + REQUIRE(normer.Normalize("Name arm64", {}).Architecture() == Architecture::Arm64); + REQUIRE(normer.Normalize("Name aarch64", {}).Architecture() == Architecture::Arm64); REQUIRE(normer.Normalize("Name 32/64 bit", {}).Architecture() == Architecture::Unknown); REQUIRE(normer.Normalize("Fox86", {}).Architecture() == Architecture::Unknown); } diff --git a/src/AppInstallerCommonCore/NameNormalization.cpp b/src/AppInstallerCommonCore/NameNormalization.cpp index 361dfaf90e..005ac6f1a6 100644 --- a/src/AppInstallerCommonCore/NameNormalization.cpp +++ b/src/AppInstallerCommonCore/NameNormalization.cpp @@ -99,6 +99,14 @@ namespace AppInstaller::Utility { result = Architecture::X86; } + else if (Remove(ArchitectureArm64, value)) + { + result = Architecture::Arm64; + } + else if (Remove(ArchitectureArm, value)) + { + result = Architecture::Arm; + } return result; } @@ -242,6 +250,8 @@ namespace AppInstaller::Utility // Architecture Regex::Expression ArchitectureX32{ R"((?<=^|[^\p{L}\p{Nd}])(X32|X86)(?=\P{Nd}|$)(?:\sEDITION)?)", reOptions }; Regex::Expression ArchitectureX64{ R"((?<=^|[^\p{L}\p{Nd}])(X64|AMD64|X86([\p{Pd}\p{Pc}]64))(?=\P{Nd}|$)(?:\sEDITION)?)", reOptions }; + Regex::Expression ArchitectureArm64{ R"((?<=^|[^\p{L}\p{Nd}])(ARM64|AARCH64)(?=\P{Nd}|$)(?:\sEDITION)?)", reOptions }; + Regex::Expression ArchitectureArm{ R"((?<=^|[^\p{L}\p{Nd}])(ARM)(?=\P{Nd}|$)(?:\sEDITION)?)", reOptions }; Regex::Expression Architecture32Bit{ R"((?<=^|[^\p{L}\p{Nd}])(32[\p{Pd}\p{Pc}\p{Z}]?BIT)S?(?:\sEDITION)?)", reOptions }; Regex::Expression Architecture64Bit{ R"((?<=^|[^\p{L}\p{Nd}])(64[\p{Pd}\p{Pc}\p{Z}]?BIT)S?(?:\sEDITION)?)", reOptions }; Regex::Expression Architecture32Or64Bit{ R"((?<=^|[^\p{L}\p{Nd}])((64[\\\/]32|32[\\\/]64)[\p{Pd}\p{Pc}\p{Z}]?BIT)S?(?:\sEDITION)?)", reOptions }; From 79514f18b158f40d969cbed06b786ce092e9df99 Mon Sep 17 00:00:00 2001 From: SlaiAgent <294879785+huong8373tt-beep@users.noreply.github.com> Date: Fri, 9 Oct 2026 03:00:51 +0800 Subject: [PATCH 2/4] Handle ARM word boundaries in name normalization --- src/AppInstallerCLITests/NameNormalization.cpp | 3 +++ src/AppInstallerCommonCore/NameNormalization.cpp | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/AppInstallerCLITests/NameNormalization.cpp b/src/AppInstallerCLITests/NameNormalization.cpp index 8faef5ed6d..c377443466 100644 --- a/src/AppInstallerCLITests/NameNormalization.cpp +++ b/src/AppInstallerCLITests/NameNormalization.cpp @@ -112,8 +112,11 @@ TEST_CASE("NameNorm_Architecture", "[name_norm]") REQUIRE(normer.Normalize("Name x86_64", {}).Architecture() == Architecture::X64); REQUIRE(normer.Normalize("Name (64 bit)", {}).Architecture() == Architecture::X64); REQUIRE(normer.Normalize("Name arm", {}).Architecture() == Architecture::Arm); + REQUIRE(normer.Normalize("Name arm32", {}).Architecture() == Architecture::Arm); REQUIRE(normer.Normalize("Name arm64", {}).Architecture() == Architecture::Arm64); REQUIRE(normer.Normalize("Name aarch64", {}).Architecture() == Architecture::Arm64); + REQUIRE(normer.Normalize("Name armadillo", {}).Architecture() == Architecture::Unknown); + REQUIRE(normer.Normalize("Name armadillo", {}).Name() == "Name armadillo"); REQUIRE(normer.Normalize("Name 32/64 bit", {}).Architecture() == Architecture::Unknown); REQUIRE(normer.Normalize("Fox86", {}).Architecture() == Architecture::Unknown); } diff --git a/src/AppInstallerCommonCore/NameNormalization.cpp b/src/AppInstallerCommonCore/NameNormalization.cpp index 005ac6f1a6..69eeaa1670 100644 --- a/src/AppInstallerCommonCore/NameNormalization.cpp +++ b/src/AppInstallerCommonCore/NameNormalization.cpp @@ -251,7 +251,7 @@ namespace AppInstaller::Utility Regex::Expression ArchitectureX32{ R"((?<=^|[^\p{L}\p{Nd}])(X32|X86)(?=\P{Nd}|$)(?:\sEDITION)?)", reOptions }; Regex::Expression ArchitectureX64{ R"((?<=^|[^\p{L}\p{Nd}])(X64|AMD64|X86([\p{Pd}\p{Pc}]64))(?=\P{Nd}|$)(?:\sEDITION)?)", reOptions }; Regex::Expression ArchitectureArm64{ R"((?<=^|[^\p{L}\p{Nd}])(ARM64|AARCH64)(?=\P{Nd}|$)(?:\sEDITION)?)", reOptions }; - Regex::Expression ArchitectureArm{ R"((?<=^|[^\p{L}\p{Nd}])(ARM)(?=\P{Nd}|$)(?:\sEDITION)?)", reOptions }; + Regex::Expression ArchitectureArm{ R"((?<=^|[^\p{L}\p{Nd}])(ARM32(?=\P{Nd}|$)|ARM(?=[^\p{L}\p{Nd}]|$))(?:\sEDITION)?)", reOptions }; Regex::Expression Architecture32Bit{ R"((?<=^|[^\p{L}\p{Nd}])(32[\p{Pd}\p{Pc}\p{Z}]?BIT)S?(?:\sEDITION)?)", reOptions }; Regex::Expression Architecture64Bit{ R"((?<=^|[^\p{L}\p{Nd}])(64[\p{Pd}\p{Pc}\p{Z}]?BIT)S?(?:\sEDITION)?)", reOptions }; Regex::Expression Architecture32Or64Bit{ R"((?<=^|[^\p{L}\p{Nd}])((64[\\\/]32|32[\\\/]64)[\p{Pd}\p{Pc}\p{Z}]?BIT)S?(?:\sEDITION)?)", reOptions }; From 211a8b49e65d8dc93fafa23c5adb3d17d1de716d Mon Sep 17 00:00:00 2001 From: wangluoye <294879785+huong8373tt-beep@users.noreply.github.com> Date: Fri, 9 Oct 2026 14:28:01 +0800 Subject: [PATCH 3/4] Restrict ARM normalization to ARM32 Signed-off-by: wangluoye <294879785+huong8373tt-beep@users.noreply.github.com> --- src/AppInstallerCLITests/NameNormalization.cpp | 3 ++- src/AppInstallerCommonCore/NameNormalization.cpp | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/AppInstallerCLITests/NameNormalization.cpp b/src/AppInstallerCLITests/NameNormalization.cpp index c377443466..51414a2ba0 100644 --- a/src/AppInstallerCLITests/NameNormalization.cpp +++ b/src/AppInstallerCLITests/NameNormalization.cpp @@ -111,12 +111,13 @@ TEST_CASE("NameNorm_Architecture", "[name_norm]") REQUIRE(normer.Normalize("Name x86", {}).Architecture() == Architecture::X86); REQUIRE(normer.Normalize("Name x86_64", {}).Architecture() == Architecture::X64); REQUIRE(normer.Normalize("Name (64 bit)", {}).Architecture() == Architecture::X64); - REQUIRE(normer.Normalize("Name arm", {}).Architecture() == Architecture::Arm); REQUIRE(normer.Normalize("Name arm32", {}).Architecture() == Architecture::Arm); REQUIRE(normer.Normalize("Name arm64", {}).Architecture() == Architecture::Arm64); REQUIRE(normer.Normalize("Name aarch64", {}).Architecture() == Architecture::Arm64); REQUIRE(normer.Normalize("Name armadillo", {}).Architecture() == Architecture::Unknown); REQUIRE(normer.Normalize("Name armadillo", {}).Name() == "Name armadillo"); + REQUIRE(normer.Normalize("ARM Compiler (x64)", {}).Architecture() == Architecture::X64); + REQUIRE(normer.Normalize("ARM Compiler (x64)", {}).Name() == "ARMCompiler"); REQUIRE(normer.Normalize("Name 32/64 bit", {}).Architecture() == Architecture::Unknown); REQUIRE(normer.Normalize("Fox86", {}).Architecture() == Architecture::Unknown); } diff --git a/src/AppInstallerCommonCore/NameNormalization.cpp b/src/AppInstallerCommonCore/NameNormalization.cpp index 69eeaa1670..1e108bb6b8 100644 --- a/src/AppInstallerCommonCore/NameNormalization.cpp +++ b/src/AppInstallerCommonCore/NameNormalization.cpp @@ -251,7 +251,7 @@ namespace AppInstaller::Utility Regex::Expression ArchitectureX32{ R"((?<=^|[^\p{L}\p{Nd}])(X32|X86)(?=\P{Nd}|$)(?:\sEDITION)?)", reOptions }; Regex::Expression ArchitectureX64{ R"((?<=^|[^\p{L}\p{Nd}])(X64|AMD64|X86([\p{Pd}\p{Pc}]64))(?=\P{Nd}|$)(?:\sEDITION)?)", reOptions }; Regex::Expression ArchitectureArm64{ R"((?<=^|[^\p{L}\p{Nd}])(ARM64|AARCH64)(?=\P{Nd}|$)(?:\sEDITION)?)", reOptions }; - Regex::Expression ArchitectureArm{ R"((?<=^|[^\p{L}\p{Nd}])(ARM32(?=\P{Nd}|$)|ARM(?=[^\p{L}\p{Nd}]|$))(?:\sEDITION)?)", reOptions }; + Regex::Expression ArchitectureArm{ R"((?<=^|[^\p{L}\p{Nd}])(ARM32)(?=\P{Nd}|$)(?:\sEDITION)?)", reOptions }; Regex::Expression Architecture32Bit{ R"((?<=^|[^\p{L}\p{Nd}])(32[\p{Pd}\p{Pc}\p{Z}]?BIT)S?(?:\sEDITION)?)", reOptions }; Regex::Expression Architecture64Bit{ R"((?<=^|[^\p{L}\p{Nd}])(64[\p{Pd}\p{Pc}\p{Z}]?BIT)S?(?:\sEDITION)?)", reOptions }; Regex::Expression Architecture32Or64Bit{ R"((?<=^|[^\p{L}\p{Nd}])((64[\\\/]32|32[\\\/]64)[\p{Pd}\p{Pc}\p{Z}]?BIT)S?(?:\sEDITION)?)", reOptions }; From 9675a9969756b48b8d73d096a40f3b88131585d6 Mon Sep 17 00:00:00 2001 From: wangluoye <294879785+huong8373tt-beep@users.noreply.github.com> Date: Fri, 9 Oct 2026 16:16:40 +0800 Subject: [PATCH 4/4] Fix ARM normalization test expectation Signed-off-by: wangluoye <294879785+huong8373tt-beep@users.noreply.github.com> --- src/AppInstallerCLITests/NameNormalization.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/AppInstallerCLITests/NameNormalization.cpp b/src/AppInstallerCLITests/NameNormalization.cpp index 51414a2ba0..744805bda2 100644 --- a/src/AppInstallerCLITests/NameNormalization.cpp +++ b/src/AppInstallerCLITests/NameNormalization.cpp @@ -115,7 +115,7 @@ TEST_CASE("NameNorm_Architecture", "[name_norm]") REQUIRE(normer.Normalize("Name arm64", {}).Architecture() == Architecture::Arm64); REQUIRE(normer.Normalize("Name aarch64", {}).Architecture() == Architecture::Arm64); REQUIRE(normer.Normalize("Name armadillo", {}).Architecture() == Architecture::Unknown); - REQUIRE(normer.Normalize("Name armadillo", {}).Name() == "Name armadillo"); + REQUIRE(normer.Normalize("Name armadillo", {}).Name() == "Namearmadillo"); REQUIRE(normer.Normalize("ARM Compiler (x64)", {}).Architecture() == Architecture::X64); REQUIRE(normer.Normalize("ARM Compiler (x64)", {}).Name() == "ARMCompiler"); REQUIRE(normer.Normalize("Name 32/64 bit", {}).Architecture() == Architecture::Unknown);