34 using std::string_view_literals::operator ""sv; |
34 using std::string_view_literals::operator ""sv; |
35 |
35 |
36 for (auto &&line: std::views::split(log, "\n"sv)) { |
36 for (auto &&line: std::views::split(log, "\n"sv)) { |
37 if (line.empty()) continue; |
37 if (line.empty()) continue; |
38 auto parts = std::views::split(line, "#"sv).begin(); |
38 auto parts = std::views::split(line, "#"sv).begin(); |
39 auto author_range = *parts; |
39 std::string author{(*parts).begin(), (*parts).end()}; |
40 std::string author{author_range.begin(), author_range.end()}; |
|
41 |
40 |
42 int year = 0; |
41 int year = 0; |
43 unsigned int month = 0, day = 0; |
42 unsigned int month = 0, day = 0; |
44 unsigned part = 0; |
43 auto date_parts = std::views::split(*++parts, "-"sv) |
45 for (auto &&date_part: std::views::split(*++parts, "-"sv)) { |
44 | std::views::transform([](auto r) { return std::string_view(r); }) |
46 std::string_view dp{date_part.begin(), date_part.end()}; |
45 | std::ranges::to<std::vector>(); |
47 int val; |
46 std::from_chars(date_parts[0].begin(), date_parts[0].end(), year); |
48 // no error handling, we trust hg and git |
47 std::from_chars(date_parts[1].begin(), date_parts[1].end(), month); |
49 std::from_chars(dp.begin(), dp.end(), val); |
48 std::from_chars(date_parts[2].begin(), date_parts[2].end(), day); |
50 switch (part++) { |
49 m_heatmap[m_current_repo][author][chrono::year_month_day{ |
51 case 0: year = val; break; |
50 chrono::year{year}, chrono::month{month}, chrono::day{day} |
52 case 1: month = val; break; |
51 }]++; |
53 default: day = val; break; |
|
54 } |
|
55 } |
|
56 m_heatmap[m_current_repo][author][chrono::year_month_day{chrono::year{year}, chrono::month{month}, chrono::day{day}}]++; |
|
57 } |
52 } |
58 } |
53 } |