diff --git a/libpkg/parser/package.cpp b/libpkg/parser/package.cpp index 9c9c87c..ca69e2b 100644 --- a/libpkg/parser/package.cpp +++ b/libpkg/parser/package.cpp @@ -1041,8 +1041,9 @@ bool PackageNameData::isVcsPackage() const PackageNameData PackageNameData::decompose(std::string_view packageName) { + static constexpr auto targetPrefixBrackets = 2; static const auto packageNameRegex - = std::regex("((lib32|mingw-w64|android-aarch64|android-x86-64|android-x86|android-armv7a-eabi|arm-none-eabi|aarch64-linux-" + = std::regex("((lib32|mingw-w64(-(ucrt|clang-x86_64|clang-aarch64))?|android-aarch64|android-x86-64|android-x86|android-armv7a-eabi|arm-none-eabi|aarch64-linux-" "gnu|static-compat|riscv64-linux|avr|psp)-)?(.*?)((-(cvs|svn|hg|darcs|bzr|git|custom|compat|static|qt\\d+|doc|cli|gui))*)"); auto data = PackageNameData{}; auto match = std::cmatch{}; @@ -1054,8 +1055,8 @@ PackageNameData PackageNameData::decompose(std::string_view packageName) regexMatch.first + offset, static_cast(regexMatch.length() - static_cast(offset))); }; data.targetPrefix = matchToStringView(match[2]); - data.actualName = matchToStringView(match[3]); - data.vcsSuffix = match[4].length() ? matchToStringView(match[4], 1) : std::string_view{}; + data.actualName = matchToStringView(match[3 + targetPrefixBrackets]); + data.vcsSuffix = match[4 + targetPrefixBrackets].length() ? matchToStringView(match[4 + targetPrefixBrackets], 1) : std::string_view{}; return data; } diff --git a/libpkg/tests/parser.cpp b/libpkg/tests/parser.cpp index 9fbbe75..b85f0a7 100644 --- a/libpkg/tests/parser.cpp +++ b/libpkg/tests/parser.cpp @@ -128,6 +128,10 @@ void ParserTests::testParsingPackageName() CPPUNIT_ASSERT_EQUAL("gcc"sv, mingwGCC.actualName); CPPUNIT_ASSERT_EQUAL("mingw-w64"sv, mingwGCC.targetPrefix); CPPUNIT_ASSERT_EQUAL(""sv, mingwGCC.vcsSuffix); + const auto mingwUcrtCppWinrt = PackageNameData::decompose("mingw-w64-ucrt-cppwinrt"); + CPPUNIT_ASSERT_EQUAL("cppwinrt"sv, mingwUcrtCppWinrt.actualName); + CPPUNIT_ASSERT_EQUAL("mingw-w64-ucrt"sv, mingwUcrtCppWinrt.targetPrefix); + CPPUNIT_ASSERT_EQUAL(""sv, mingwUcrtCppWinrt.vcsSuffix); const auto staticCompatQt6 = PackageNameData::decompose("static-compat-qt6-base"); CPPUNIT_ASSERT_EQUAL("qt6-base"sv, staticCompatQt6.actualName); CPPUNIT_ASSERT_EQUAL("static-compat"sv, staticCompatQt6.targetPrefix);