--- a/src/heatmap.cpp Fri Feb 06 18:44:47 2026 +0100 +++ b/src/heatmap.cpp Wed Feb 25 21:13:55 2026 +0100 @@ -37,16 +37,17 @@ for (auto line: std::views::split(log, "\n"sv)) { if (line.empty()) continue; - // find all delimiters + // split the line by delimiter const auto line_view = std::string_view{line}; - 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); + auto parts = std::views::split(line_view, '#') + | std::views::transform([](auto r) { return std::string_view(r); }) + | std::ranges::to<std::vector>(); - std::string author{settings.map_author(line_view.substr(0, pos_delim1))}; - std::string_view date_view{line_view.substr(pos_delim1+1, pos_delim2 - pos_delim1 - 1)}; - std::string_view tags_view{line_view.substr(pos_delim2+1, pos_delim3 - pos_delim2 - 1)}; - std::string_view summary_view{line_view.substr(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]}; int year = 0; unsigned int month = 0, day = 0; @@ -60,10 +61,10 @@ m_heatmap[repo_key][author][chrono::year_month_day{ chrono::year{year}, chrono::month{month}, chrono::day{day} }]; - summaries[m_current_repo].emplace_back(summary_view); + summaries[m_current_repo].emplace_back(hash_view, summary_view); // special case: if the (only) tag is "tip", we do not add it if (!tags_view.empty() && tags_view != "tip") { - tags[m_current_repo].emplace_back(tags_view); + tags[m_current_repo].emplace_back(hash_view, tags_view); } } } @@ -82,10 +83,10 @@ } for (auto &&[reponame, tags]: commits.tags) { if (tags.empty()) continue; - std::string tag_list = tags.at(0); + std::string tag_list = tags.at(0).message; for (unsigned i = 1; i < tags.size(); ++i) { tag_list.append(", "); - tag_list.append(tags.at(i)); + tag_list.append(tags.at(i).message); } cs.tags_with_date[reponame].emplace_back( std::format("{} on {}-{:02}-{:02}",