fix regression: incorrectly splitting at # within commit message

Wed, 25 Feb 2026 22:32:55 +0100

author
Mike Becker <universe@uap-core.de>
date
Wed, 25 Feb 2026 22:32:55 +0100
changeset 77
43a1ba0e11e3
parent 76
110a234a3260
child 78
5177d8af5536

fix regression: incorrectly splitting at # within commit message

relates to #807

src/heatmap.cpp file | annotate | diff | comparison | revisions
--- a/src/heatmap.cpp	Wed Feb 25 21:13:55 2026 +0100
+++ b/src/heatmap.cpp	Wed Feb 25 22:32:55 2026 +0100
@@ -38,16 +38,18 @@
         if (line.empty()) continue;
 
         // split the line by delimiter
+        // this needs to be so crappy, because C++ split does not have a max-split parameter
         const auto line_view = std::string_view{line};
-        auto parts = std::views::split(line_view, '#')
-                     | std::views::transform([](auto r) { return std::string_view(r); })
-                     | std::ranges::to<std::vector>();
+        const auto pos_delim1 = line_view.find('#', 0);
+        const auto pos_delim2 = line_view.find('#', pos_delim1 + 1);
+        const auto pos_delim3 = line_view.find('#', pos_delim2 + 1);
+        const auto pos_delim4 = line_view.find('#', pos_delim3 + 1);
 
-        std::string_view hash_view{parts[0]};
-        std::string author{settings.map_author(parts[1])};
-        std::string_view date_view{parts[2]};
-        std::string_view tags_view{parts[3]};
-        std::string_view summary_view{parts[4]};
+        std::string_view hash_view{line_view.substr(0, pos_delim1)};
+        std::string author{line_view.substr(pos_delim1+1, pos_delim2 - pos_delim1 - 1)};
+        std::string_view date_view{line_view.substr(pos_delim2+1, pos_delim3 - pos_delim2 - 1)};
+        std::string_view tags_view{line_view.substr(pos_delim3+1, pos_delim4 - pos_delim3 - 1)};
+        std::string_view summary_view{line_view.substr(pos_delim4+1)};
 
         int year = 0;
         unsigned int month = 0, day = 0;

mercurial