Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package hyprutils for openSUSE:Factory checked in at 2026-10-28 17:54:45 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/hyprutils (Old) and /work/SRC/openSUSE:Factory/.hyprutils.new.2252680 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "hyprutils" Wed Oct 28 17:54:45 2026 rev:16 rq:1393447 version:0.14.3 Changes: -------- --- /work/SRC/openSUSE:Factory/hyprutils/hyprutils.changes 2026-09-11 18:05:34.673484765 +0200 +++ /work/SRC/openSUSE:Factory/.hyprutils.new.2252680/hyprutils.changes 2026-10-28 17:54:45.749708660 +0100 @@ -1,0 +2,7 @@ +Sat Oct 24 09:40:19 UTC 2026 - Nassim Lhadj <[email protected]> + +- Update to version 0.14.3: + * i18n: support LC_MESSAGES + * string/utf8: init utf8 header + +------------------------------------------------------------------- Old: ---- hyprutils-0.14.2.tar.xz New: ---- hyprutils-0.14.3.tar.xz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ hyprutils.spec ++++++ --- /var/tmp/diff_new_pack.DquT5P/_old 2026-10-28 17:54:46.470738865 +0100 +++ /var/tmp/diff_new_pack.DquT5P/_new 2026-10-28 17:54:46.472738949 +0100 @@ -20,7 +20,7 @@ %define sover 13 Name: hyprutils -Version: 0.14.2 +Version: 0.14.3 Release: 0 Summary: Utilities used across the Hypr* ecosystem License: BSD-3-Clause ++++++ hyprutils-0.14.2.tar.xz -> hyprutils-0.14.3.tar.xz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hyprutils-0.14.2/VERSION new/hyprutils-0.14.3/VERSION --- old/hyprutils-0.14.2/VERSION 2026-09-05 16:51:23.000000000 +0200 +++ new/hyprutils-0.14.3/VERSION 2026-10-22 14:50:40.000000000 +0200 @@ -1 +1 @@ -0.14.2 +0.14.3 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hyprutils-0.14.2/include/hyprutils/string/UTF8.hpp new/hyprutils-0.14.3/include/hyprutils/string/UTF8.hpp --- old/hyprutils-0.14.2/include/hyprutils/string/UTF8.hpp 1970-01-01 01:00:00.000000000 +0100 +++ new/hyprutils-0.14.3/include/hyprutils/string/UTF8.hpp 2026-10-22 14:50:40.000000000 +0200 @@ -0,0 +1,17 @@ +#pragma once + +#include <string> +#include <string_view> + +namespace Hyprutils::String::UTF8 { + size_t codepointLen(const std::string_view sv); + size_t codepointLenBefore(const std::string& s, size_t offset); + size_t length(const std::string&); + size_t offsetToUTF8Len(const std::string&, size_t offset); + size_t utf8ToOffset(const std::string&, size_t utf8); + std::string substr(const std::string&, size_t start, size_t len = std::string::npos); + size_t findFirstOf(const std::string&, const std::string ch, size_t offset = 0); + size_t findLastOf(const std::string&, const std::string ch, size_t offset = std::string::npos); + size_t findFirstNotOf(const std::string&, const std::string ch, size_t offset = 0); + size_t findLastNotOf(const std::string&, const std::string ch, size_t offset = std::string::npos); +}; diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hyprutils-0.14.2/src/i18n/I18nLocale.cpp new/hyprutils-0.14.3/src/i18n/I18nLocale.cpp --- old/hyprutils-0.14.2/src/i18n/I18nLocale.cpp 2026-09-05 16:51:23.000000000 +0200 +++ new/hyprutils-0.14.3/src/i18n/I18nLocale.cpp 2026-10-22 14:50:40.000000000 +0200 @@ -16,11 +16,13 @@ if (locale == "*") return "en_US"; - if (locale.contains('=')) - locale = locale.substr(locale.find('=') + 1); + if (size_t pos = locale.find("LC_MESSAGES="); pos != std::string::npos) + locale = locale.substr(pos + 12); + else if (size_t pos = locale.find('='); pos != std::string::npos) + locale = locale.substr(pos + 1); - if (locale.contains('.')) - locale = locale.substr(0, locale.find('.')); + if (size_t pos = locale.find('.'); pos != std::string::npos) + locale = locale.substr(0, pos); return locale; } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hyprutils-0.14.2/src/string/UTF8.cpp new/hyprutils-0.14.3/src/string/UTF8.cpp --- old/hyprutils-0.14.2/src/string/UTF8.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/hyprutils-0.14.3/src/string/UTF8.cpp 2026-10-22 14:50:40.000000000 +0200 @@ -0,0 +1,163 @@ +#include <hyprutils/string/UTF8.hpp> +#include <string_view> + +using namespace Hyprutils::String::UTF8; +using namespace Hyprutils::String; +using namespace Hyprutils; + +size_t UTF8::codepointLen(const std::string_view sv) { + size_t len = 1; + while (len < sv.size()) { + if (((*(&sv[0] + len)) & 0xC0) == 0x80) { + len++; + continue; + } + + break; + } + + return len; +} + +size_t UTF8::codepointLenBefore(const std::string& s, size_t offset) { + const auto initialOffset = offset; + while (true) { + if (offset == 0) + return 0; + offset--; + if ((s[offset] & 0xC0) != 0x80) + break; + } + return initialOffset - offset; +} + +size_t UTF8::length(const std::string& s) { + if (s.empty()) + return 0; + + const char* c = s.c_str(); + size_t len = 0; + auto endp = s.c_str() + s.length(); + while (c < endp) { + c += codepointLen({c, (endp - c)}); + len++; + } + return len; +} + +/// Converts a byte index to a codepoint index. +size_t UTF8::offsetToUTF8Len(const std::string& s, size_t offset) { + if (s.empty()) + return 0; + + const char* c = s.c_str(); + size_t len = 0; + auto endp = std::min(s.c_str() + s.length(), s.c_str() + offset); + while (c < endp) { + c += codepointLen({c, (endp - c)}); + len++; + } + return len; +} + +/// Converts a codepoint index to a byte index. +size_t UTF8::utf8ToOffset(const std::string& s, size_t utf8) { + if (s.empty()) + return 0; + + const char* c = s.c_str(); + size_t len = 0; + auto endp = s.c_str() + s.length(); + while (c < endp) { + if (len >= utf8) + return c - s.c_str(); + + c += codepointLen({c, (endp - c)}); + len++; + } + return s.size(); +} + +std::string UTF8::substr(const std::string& s, size_t start, size_t length) { + if (s.empty() || length == 0) + return ""; + + bool started = false; + size_t byteStart = 0, byteEnd = std::string::npos; + + const char* c = s.c_str(); + size_t len = 0; + auto endp = s.c_str() + s.length(); + while (c < endp) { + if (len >= start && !started) { + started = true; + byteStart = c - s.c_str(); + + if (length == std::string::npos) + break; + + len = 0; + } + + c += codepointLen({c, endp - c}); + + len++; + + if (len >= length && started) { + byteEnd = c - s.c_str(); + break; + } + } + + if (len == 0 || !started) + return ""; + + if (byteEnd == std::string::npos) + return s.substr(byteStart); + + return s.substr(byteStart, byteEnd - byteStart); +} + +size_t UTF8::findFirstOf(const std::string& s, const std::string ch, size_t offset) { + while (offset < s.length()) { + const auto c = s.data() + offset; + const auto cpLen = codepointLen({c, s.length() - offset}); + if (std::string_view{c, cpLen} == ch) + return offset; + offset += cpLen; + } + return std::string::npos; +} + +size_t UTF8::findLastOf(const std::string& s, const std::string ch, size_t offset) { + offset = std::min(offset, s.length()); + while (offset > 0) { + const auto cpLen = codepointLenBefore(s, offset); + offset -= cpLen; + if (std::string_view{&s[offset], cpLen} == ch) + return offset; + } + return std::string::npos; +} + +size_t UTF8::findFirstNotOf(const std::string& s, const std::string ch, size_t offset) { + while (offset < s.length()) { + const auto c = s.data() + offset; + const auto cpLen = codepointLen({c, s.length() - offset}); + if (std::string_view{c, cpLen} != ch) + return offset; + offset += cpLen; + } + return std::string::npos; +} + +size_t UTF8::findLastNotOf(const std::string& s, const std::string ch, size_t offset) { + offset = std::min(offset, s.length()); + while (offset > 0) { + const auto cpLen = codepointLenBefore(s, offset); + offset -= cpLen; + if (std::string_view{&s[offset], cpLen} != ch) + return offset; + } + return std::string::npos; +} diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hyprutils-0.14.2/tests/string/UTF8.cpp new/hyprutils-0.14.3/tests/string/UTF8.cpp --- old/hyprutils-0.14.2/tests/string/UTF8.cpp 1970-01-01 01:00:00.000000000 +0100 +++ new/hyprutils-0.14.3/tests/string/UTF8.cpp 2026-10-22 14:50:40.000000000 +0200 @@ -0,0 +1,121 @@ +#include <hyprutils/string/UTF8.hpp> + +#include <gtest/gtest.h> + +using namespace Hyprutils::String; + +TEST(UTF8, codepointLen) { + const auto str = std::string("δΈ hello π§βπΎ"); + EXPECT_EQ(UTF8::codepointLen({&str[0], str.length()}), 3); + EXPECT_EQ(UTF8::codepointLen({&str[3], str.length() - 3}), 1); + EXPECT_EQ(UTF8::codepointLen({&str[10], str.length() - 10}), 4); +} + +TEST(UTF8, codepointLenBefore) { + const auto str = std::string("δΈ hello π§βπΎ"); + EXPECT_EQ(UTF8::codepointLenBefore(str, 0), 0); + EXPECT_EQ(UTF8::codepointLenBefore(str, 3), 3); + EXPECT_EQ(UTF8::codepointLenBefore(str, 10), 1); + EXPECT_EQ(UTF8::codepointLenBefore(str, 14), 4); +} + +TEST(UTF8, length) { + EXPECT_EQ(UTF8::length(""), 0); + EXPECT_EQ(UTF8::length("Hello"), 5); + EXPECT_EQ(UTF8::length("δΈη"), 2); + EXPECT_EQ(UTF8::length("δΈηisι ·θ"), 6); +} + +TEST(UTF8, substr) { + EXPECT_EQ(UTF8::substr("", 0, 0), ""); + EXPECT_EQ(UTF8::substr("ζ»", 1), ""); + EXPECT_EQ(UTF8::substr("ζ»", 0, 0), ""); + EXPECT_EQ(UTF8::substr("Hello", 0, 3), "Hel"); + EXPECT_EQ(UTF8::substr("δΈη", 1, 1), "η"); + EXPECT_EQ(UTF8::substr("δΈηisι ·θ", 1), "ηisι ·θ"); + EXPECT_EQ(UTF8::substr("γγ€γγΌγ©γ³γ", 1, 2), "γ€γ"); +} + +TEST(UTF8, utf8ToOffset) { + EXPECT_EQ(UTF8::utf8ToOffset("", 0), 0); + EXPECT_EQ(UTF8::utf8ToOffset("Hello", 20000), 5); + EXPECT_EQ(UTF8::utf8ToOffset("Hello", 3), 3); + EXPECT_EQ(UTF8::utf8ToOffset("ιι ιι", 3), 9); + EXPECT_EQ(UTF8::utf8ToOffset("aιι ιι", 3), 7); +} + +TEST(UTF8, offsetToUTF8Len) { + EXPECT_EQ(UTF8::offsetToUTF8Len("", 0), 0); + EXPECT_EQ(UTF8::offsetToUTF8Len("Hello", 3), 3); + EXPECT_EQ(UTF8::offsetToUTF8Len("ιι ιι", 3), 1); + EXPECT_EQ(UTF8::offsetToUTF8Len("aιι ιι", 4), 2); + EXPECT_EQ(UTF8::offsetToUTF8Len("ιaι ", 1), 1); +} + +TEST(UTF8, findFirstOf) { + // weird values + EXPECT_EQ(UTF8::findFirstOf("", ""), std::string::npos); + EXPECT_EQ(UTF8::findFirstOf("", "aba"), std::string::npos); + EXPECT_EQ(UTF8::findFirstOf("", "aba", 1000), std::string::npos); + EXPECT_EQ(UTF8::findFirstOf("aba", ""), std::string::npos); + EXPECT_EQ(UTF8::findFirstOf("aba", "", 1000), std::string::npos); + EXPECT_EQ(UTF8::findFirstOf("aba", "a", 1000), std::string::npos); + + const auto str = "is π§βπΎ the same as π§πΎ?"; + EXPECT_EQ(UTF8::findFirstOf(str, "i", 2), std::string::npos); + EXPECT_EQ(UTF8::findFirstOf(str, "I"), std::string::npos); + EXPECT_EQ(UTF8::findFirstOf(str, "i"), 0); + EXPECT_EQ(UTF8::findFirstOf(str, "?"), 35); + EXPECT_EQ(UTF8::findFirstOf(str, "π§"), 3); +} + +TEST(UTF8, findLastOf) { + // weird values + EXPECT_EQ(UTF8::findLastOf("", ""), std::string::npos); + EXPECT_EQ(UTF8::findLastOf("", "aba"), std::string::npos); + EXPECT_EQ(UTF8::findLastOf("", "aba", 1000), std::string::npos); + EXPECT_EQ(UTF8::findLastOf("aba", ""), std::string::npos); + EXPECT_EQ(UTF8::findLastOf("aba", "", 1000), std::string::npos); + EXPECT_EQ(UTF8::findLastOf("aba", "a", 1000), 2); + + const auto str = "is π§βπΎ the same as π§πΎ?"; + EXPECT_EQ(UTF8::findLastOf(str, "i", 2), 0); + EXPECT_EQ(UTF8::findLastOf(str, "I"), std::string::npos); + EXPECT_EQ(UTF8::findLastOf(str, "i"), 0); + EXPECT_EQ(UTF8::findLastOf(str, "?"), 35); + EXPECT_EQ(UTF8::findLastOf(str, "π§"), 27); +} + +TEST(UTF8, findFirstNotOf) { + // weird values + EXPECT_EQ(UTF8::findFirstNotOf("", ""), std::string::npos); + EXPECT_EQ(UTF8::findFirstNotOf("", "aba"), std::string::npos); + EXPECT_EQ(UTF8::findFirstNotOf("", "aba", 1000), std::string::npos); + EXPECT_EQ(UTF8::findFirstNotOf("aba", "", 1000), std::string::npos); + EXPECT_EQ(UTF8::findFirstNotOf("aba", "a", 1000), std::string::npos); + + EXPECT_EQ(UTF8::findFirstNotOf("aba", ""), 0); + EXPECT_EQ(UTF8::findFirstNotOf("is?", "i", 2), 2); + EXPECT_EQ(UTF8::findFirstNotOf("is?", "i"), 1); + EXPECT_EQ(UTF8::findFirstNotOf("is?", "?", 2), std::string::npos); + EXPECT_EQ(UTF8::findFirstNotOf("is?", "?"), 0); + EXPECT_EQ(UTF8::findFirstNotOf("bbbbb", "b"), std::string::npos); + EXPECT_EQ(UTF8::findFirstNotOf("π§π§πΎπΎπ§", "π§"), 8); +} + +TEST(UTF8, findLastNotOf) { + // weird values + EXPECT_EQ(UTF8::findLastNotOf("", ""), std::string::npos); + EXPECT_EQ(UTF8::findLastNotOf("", "aba"), std::string::npos); + EXPECT_EQ(UTF8::findLastNotOf("", "aba", 1000), std::string::npos); + EXPECT_EQ(UTF8::findLastNotOf("aba", "", 1000), 2); + EXPECT_EQ(UTF8::findLastNotOf("aba", "a", 1000), 1); + + EXPECT_EQ(UTF8::findLastNotOf("aba", ""), 2); + EXPECT_EQ(UTF8::findLastNotOf("is?", "i", 3), 2); + EXPECT_EQ(UTF8::findLastNotOf("is?", "i"), 2); + EXPECT_EQ(UTF8::findLastNotOf("is?", "?", 2), 1); + EXPECT_EQ(UTF8::findLastNotOf("is?", "?"), 1); + EXPECT_EQ(UTF8::findLastNotOf("bbbbb", "b"), std::string::npos); + EXPECT_EQ(UTF8::findLastNotOf("π§π§πΎπΎπ§", "π§"), 12); +} ++++++ hyprutils.obsinfo ++++++ --- /var/tmp/diff_new_pack.DquT5P/_old 2026-10-28 17:54:46.731749800 +0100 +++ /var/tmp/diff_new_pack.DquT5P/_new 2026-10-28 17:54:46.740750177 +0100 @@ -1,5 +1,5 @@ name: hyprutils -version: 0.14.2 -mtime: 1788619883 -commit: a21e87b878e72ee5dfd375899e8b2ad0d0c4c0e1 +version: 0.14.3 +mtime: 1792673440 +commit: 0d13d5a624eb093b600d1b2cbe448fb613c86424
