Tue, 25 Feb 2025 18:46:17 +0100
add total commits counters
fixes #605
5 | 1 | /* Copyright 2025 Mike Becker. All rights reserved. |
2 | * | |
3 | * Redistribution and use in source and binary forms, with or without | |
4 | * modification, are permitted provided that the following conditions are met: | |
5 | * | |
6 | * 1. Redistributions of source code must retain the above copyright | |
7 | * notice, this list of conditions and the following disclaimer. | |
8 | * | |
9 | * 2. Redistributions in binary form must reproduce the above copyright | |
10 | * notice, this list of conditions and the following disclaimer in the | |
11 | * documentation and/or other materials provided with the distribution. | |
12 | * | |
13 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" | |
14 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | |
15 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | |
16 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE | |
17 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | |
18 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR | |
19 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER | |
20 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, | |
21 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
22 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
23 | */ | |
24 | ||
25 | #include "heatmap.h" | |
26 | ||
27 | #include <charconv> | |
28 | #include <ranges> | |
29 | #include <chrono> | |
30 | ||
31 | namespace chrono = std::chrono; | |
32 | ||
16 | 33 | void fm::heatmap::add(const fm::settings &settings, const std::string &log) { |
5 | 34 | using std::string_view_literals::operator ""sv; |
35 | ||
36 | for (auto &&line: std::views::split(log, "\n"sv)) { | |
37 | if (line.empty()) continue; | |
38 | auto parts = std::views::split(line, "#"sv).begin(); | |
16 | 39 | std::string author{settings.map_author({(*parts).begin(), (*parts).end()})}; |
5 | 40 | |
41 | int year = 0; | |
42 | unsigned int month = 0, day = 0; | |
10
bf159cf9f4b6
improve heatmap::add() by using C++23 ranges-v3
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
43 | auto date_parts = std::views::split(*++parts, "-"sv) |
bf159cf9f4b6
improve heatmap::add() by using C++23 ranges-v3
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
44 | | std::views::transform([](auto r) { return std::string_view(r); }) |
bf159cf9f4b6
improve heatmap::add() by using C++23 ranges-v3
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
45 | | std::ranges::to<std::vector>(); |
bf159cf9f4b6
improve heatmap::add() by using C++23 ranges-v3
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
46 | std::from_chars(date_parts[0].begin(), date_parts[0].end(), year); |
bf159cf9f4b6
improve heatmap::add() by using C++23 ranges-v3
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
47 | std::from_chars(date_parts[1].begin(), date_parts[1].end(), month); |
bf159cf9f4b6
improve heatmap::add() by using C++23 ranges-v3
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
48 | std::from_chars(date_parts[2].begin(), date_parts[2].end(), day); |
bf159cf9f4b6
improve heatmap::add() by using C++23 ranges-v3
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
49 | m_heatmap[m_current_repo][author][chrono::year_month_day{ |
bf159cf9f4b6
improve heatmap::add() by using C++23 ranges-v3
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
50 | chrono::year{year}, chrono::month{month}, chrono::day{day} |
bf159cf9f4b6
improve heatmap::add() by using C++23 ranges-v3
Mike Becker <universe@uap-core.de>
parents:
5
diff
changeset
|
51 | }]++; |
5 | 52 | } |
53 | } | |
44
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
54 | |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
55 | std::array<unsigned int, 12> fm::heatmap::commits_per_month( |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
56 | const std::string& repo, |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
57 | const std::string& author, |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
58 | chrono::year year |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
59 | ) const { |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
60 | std::array<unsigned int, 12> result{}; |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
61 | for (auto&& [ymd, commits] : m_heatmap.at(repo).at(author)) { |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
62 | if (ymd.year() != year) continue; |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
63 | result[static_cast<unsigned int>(ymd.month())-1] += commits; |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
64 | } |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
65 | return result; |
de22ded6d50a
add total commits counters
Mike Becker <universe@uap-core.de>
parents:
16
diff
changeset
|
66 | } |